Aller au contenu


Un Script Pour Générer Des Objets Aleatoirement


  • Veuillez vous connecter pour répondre
16 réponses à ce sujet

#1 yukimura

yukimura

Posté 29 décembre 2005 - 12:47

Voila apres un superbe trip msn avec quelques personnes, l'idée nous est venu de le mettre en forme.
Nous avons le model mais pas le scripts qui va avec!^^

L'idée sera donc d'avoir un placard a balais qui genere des objets aleatoirement. Des qu'on l'ouvre, un objet apparait dans notre inventaire mais ne reste que quelques minutes.

ces objets peuvent allez de la cuillere ou de l'oeuf de kawa à la plus grosse épée du jeu!

Alors si l'un des scripteur voit comment faire ou veux bien nous aider nous en serions ravi!


merci a vous et bonne journée
"Sacré Hubert, toujours le mot pour rire !"
http://independentgeeks.wordpress.com/

#2 Angora

Angora

    Danse avec les bugs


Posté 29 décembre 2005 - 13:27

S'il faut que l'objet disparaisse, c'est beaucoup plus compliqué. Il faudra deux scripts et une variable short globale.


global short Truc

Begin ScriptArmoire
short objet

if ( OnActivate )
  if ( Truc != 0 )
	 messagebox "Il vous reste un objet incongru, vous ne pouvez pas en avoir un autre !"
	 return
  endif
  set objet to ( 1 + Random100 / 25 )
  set Truc to objet
  startscript ScriptRetireObjet
  if ( objet == 1 )
	 messagebox "Vous trouvez un objet débile dans l'armoire."
	 player->additem "objet débile" 1
   elseif ( objet == 2 )
	 messagebox "Vous trouvez un objet idiot dans l'armoire."
	 player->additem "objet idiot" 1
   elseif ( objet == 3 )
	 messagebox "Vous trouvez un objet stupide dans l'armoire."
	 player->additem "objet stupide" 1
   elseif ( objet == 4 )
	 messagebox "Vous trouvez un objet inutile dans l'armoire."
	 player->additem "objet inutile" 1
   endif
endif

End

Begin ScriptRetireObjet

float timer
short retrait

if ( MenuMode == 1 )
   return
endif

set timer to ( timer + GetSecondsPassed )

if ( timer > 300 ); délais de 5 minutes...
   set retrait to 1
endif

if ( retrait == 1 )
   if ( Truc == 1 )
	  if ( player->getItemCount "objet débile" > 0 )
		 player->removeItem "objet débile" 1
		 set retrait to 2
	  endif
   elseif ( Truc == 2 )
	  if ( player->getItemCount "objet idiot" > 0 )
		 player->removeItem "objet idiot" 1
		 set retrait to 2
	  endif
   elseif ( Truc == 3 )
	  if ( player->getItemCount "objet stupide" > 0 )
		 player->removeItem "objet stupide" 1
		 set retrait to 2
	  endif
   elseif ( Truc == 4 )
	  if ( player->getItemCount "objet inutile" > 0 )
		 player->removeItem "objet inutile" 1
		 set retrait to 2
	  endif
   endif
endif

if ( retrait == 2 )
   set Truc to 0
   set retrait to 0
   stopscript ScriptRetireObjet
endif

End

Voilà. Comme on peut le constater, c'est super pénible à faire pour plein d'objets différents (et on atteint vite la limite de taille des scripts).

Modifié par Angora, 29 décembre 2005 - 13:27.

Le saviez-vous ?

En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.

#3 yukimura

yukimura

Posté 29 décembre 2005 - 13:44

Merci beaucoup Angora!! (je te fait confiance car j'y comprend rien!^^)
"Sacré Hubert, toujours le mot pour rire !"
http://independentgeeks.wordpress.com/

#4 Angora

Angora

    Danse avec les bugs


Posté 29 décembre 2005 - 14:57

En gros, le premier script donne un objet et lance le second. Le second est là pour faire disparaitre l'objet. Si le joueur pose l'objet (ou le vend, etc.), le second script continue de tourner jusqu'à ce qu'il puisse enfin faire disparaitre notre objet.

Quand l'objet a finalement disparu, le second script efface la "dette" et s'arrête tout seul.

Pour le premier, j'ai utilisé quatre objets pour l'exemple, c'est pour ça que Random100 est divisé par 25. Pour en avoir plus, il faut diviser par moins. Par exemple, par 20 pour cinq objets, par 10 pour dix objets, par 5 pour vingt objets, etc.

La variable globale est utilisée pour se souvenir de quel objet fut donné, et donc lequel doit disparaître. Quand elle vaut zéro, c'est que le PJ n'a pas ou plus de "dette" et peut obtenir un nouvel objet.

Tiens, j'ai oublié de remettre timer à zéro... Faut le faire dans la partie "if ( retrait == 2 )"...
Le saviez-vous ?

En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.

#5 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 29 décembre 2005 - 15:03

Heu... on ne peut pas utiliser des leveled items pour diminuer un peu la taille des scripts ?  ;)

#6 Angora

Angora

    Danse avec les bugs


Posté 29 décembre 2005 - 16:03

Petit malin. :) Comment tu fais après pour savoir quel est l'objet à faire disparaître ?

Evidemment, ce serait beaucoup plus simple de tout simplement faire ceci dans le script de l'armoire :
If ( OnActivate == 1 )
   Additem "random_pos" 1
   Activate
EndIf

(Ou encore mieux, on créé une nouvelle liste à niveau, armoire_superrandom, dans laquelle on met un exemplaire de chaque autre liste à niveau... Le n'importe quoi est garanti !)

Mais deux problèmes. Le premier c'est que si le joueur fait "Tout prendre", ça ne marche plus. (Bon, on peut contourner le problème en faisant Player->AddItem au lieu de AddItem et Activate, mais c'est moins joli.)

Le second c'est qu'il est strictement impossible de savoir quel est l'objet créé pour pouvoir ensuite le supprimer. C'est pour ça que je disait ça :

Voir le messageAngora, le 29.12.2005 à 13:27, dit :

S'il faut que l'objet disparaisse, c'est beaucoup plus compliqué.

:grin:
Le saviez-vous ?

En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.

#7 yukimura

yukimura

Posté 29 décembre 2005 - 16:10

:grin:  enfin bon les scripts c'est pas fait pour moi!^^

Euh sinon la question a deux pieces d'or : "ou qu'cest qu'on les met ces scripts?"

Le premier sur l'armoir je suppose mais le deuxieme??
"Sacré Hubert, toujours le mot pour rire !"
http://independentgeeks.wordpress.com/

#8 a3jv

a3jv

    ... à 4 je reviens.


Posté 29 décembre 2005 - 17:19

Le second est un sript global qui n'est attaché à aucun objet mais lancé par une commande dans un dialogue ou a la fin du premier script. Mais bien sûr il faut compléter les scripts, tu ne peux les utiliser sans les transformer ne serais-ce que pour mettre les véritables ID.
En bref, si j'étais toi, j'abandonnerai l'idée pour diverses raisons. Notamment le fait qu'il faudrait créer une ID spéciale pour chaque objet pouvant apparaitre pour éviter que le joueur perde aussi un objet identique qu'il aurait dans son inventaire.
C'est toi qui voit si c'est très important pour ton mod ou si tu peux t'en passer.

Modifié par a3jv, 29 décembre 2005 - 17:20.

Les choses n'ont que l'importance ou la valeur qu'on leur donne.

#9 Angora

Angora

    Danse avec les bugs


Posté 29 décembre 2005 - 17:47

Voir le messagea3jv, le 29.12.2005 à 17:19, dit :

Notamment le fait qu'il faudrait créer une ID spéciale pour chaque objet pouvant apparaitre pour éviter que le joueur perde aussi un objet identique qu'il aurait dans son inventaire.

Non, ça c'est pas grave. Le joueur porte cinq oeufs de Kwama, il en gagne un nouveau, cinq minutes après il en perd un, était-ce egg-zactement le même ? Aucune importance !
Le saviez-vous ?

En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.

#10 MysticalShadow

MysticalShadow

Posté 29 décembre 2005 - 18:00

En plus, il y a un contournement possible: si le joeur lâche l'objet 5 seconde avec la fin des 5 minutes, et le reprends après les 5 minutes, l'objet ne disparaîtra pas.

Il paraît donc plus simple de créer des IDs nouvelles pour tes objets, et de leur adjoindre à toutes ce script: (Tribuanl recquis)
BEGIN ScriptObjetsQuiDisparaissent_local

float timer
short compteur_suppr

if ( MenuMode == 1 )	; capital, puisque l'on utilise un timer
	Return
endif


if ( compteur_suppr >= 1 )
	Set compteur_suppr to ( compteur_suppr + 1 )
	
	if ( compteur_suppr >= 15 )
		Set compteur_suppr to 0
		SetDelete, 1
	endif

	Return
endif


Set timer to ( timer + GetSecondsPassed )

if ( timer >= 300 )
	Disable
	MessageBox "L'objet invoqué a été rappellé."
	Set timer to 0
	Set compteur_suppr to 1	; lance la suppression propre de cet objet
	Set PLACARD_ACTIVE to 0	; on peut prendre un nouvel objet
endif


END

Il faut aussi que tu crées une variable globale, que dans le script j'ai appellé pour l'exemple PLACARD_ACTIVE. Quand elle est à 1, le PJ a sur lui un des objets donnés par ton placard magique.
Et tu colles au placard ce script (pardon Angora de reprendre quelque peu le tiens  :grin: )
BEGIN ScriptArmoire_local

short objet

if ( OnActivate == 0 )
	Return
endif

if ( PLACARD_ACTIVE == 1 )
	MessageBox "Il vous reste un objet incongru, vous ne pouvez pas en avoir un autre !"
	Return
endif


Set PLACARD_ACTIVE to 1
Set objet to ( 1 + Random100 / 25 )

if ( objet == 1 )
	MessageBox "Vous trouvez un objet débile dans l'armoire."
	Player->AddItem "objet débile" 1
elseif ( objet == 2 )
	MessageBox "Vous trouvez un objet idiot dans l'armoire."
	Player->AddItem "objet idiot" 1
elseif ( objet == 3 )
	MessageBox "Vous trouvez un objet stupide dans l'armoire."
	Player->AddItem "objet stupide" 1
elseif ( objet == 4 )
	MessageBox "Vous trouvez un objet inutile dans l'armoire."
	Player->AddItem "objet inutile" 1
endif


END


En tout cas, si les leveled lists acceptent des objets persos scriptés, tu devrais pouvoir les utiliser.

#11 Angora

Angora

    Danse avec les bugs


Posté 29 décembre 2005 - 18:34

Voir le messageMysticalShadow, le 29.12.2005 à 18:00, dit :

En plus, il y a un contournement possible: si le joeur lâche l'objet 5 seconde avec la fin des 5 minutes, et le reprends après les 5 minutes, l'objet ne disparaîtra pas.

Non, normalement, pas avec les scripts que j'ai proposés.

Le script de retrait d'objet va, une fois le temps écoulé, à chaque frame, vérifier si le PJ possède l'objet à retirer, et sinon remettre ça à la frame prochaine. Ce n'est qu'une fois l'objet "rendu" qu'il va s'arrêter, et ce même si ça fait 15 ans que le script attend. :grin:
Le saviez-vous ?

En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.

#12 yukimura

yukimura

Posté 29 décembre 2005 - 21:42

euh je suis un peu perdu la!^^ Faut que je prenne lequel?  :grin:  

Merci encore pour votre aide!
"Sacré Hubert, toujours le mot pour rire !"
http://independentgeeks.wordpress.com/

#13 Angora

Angora

    Danse avec les bugs


Posté 29 décembre 2005 - 22:15

Le mien. :grin:

Mais n'oublie pas de le modifier pour changer les IDs des objets, etc.
Le saviez-vous ?

En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.

#14 MysticalShadow

MysticalShadow

Posté 29 décembre 2005 - 23:04

Le mien si tu veux utiliser des Leveled items.
Je ne vois pas de raison pour laquelle ca ne marcherait pas, mais peut être qu'il faudrait faire 1 test.

#15 yukimura

yukimura

Posté 30 décembre 2005 - 02:29

ah!!! ca marche super bien!! En plus je viens de comprendre un peu mieux comment marchais les scripts!^^ Merci a tout les deux!

Modifié par yukimura, 01 janvier 2006 - 23:42.

"Sacré Hubert, toujours le mot pour rire !"
http://independentgeeks.wordpress.com/

#16 yukimura

yukimura

Posté 01 janvier 2006 - 23:43

euh en fait ca marche pas totalement bien!^^ Car le timer ne se met pas en route et je peux prendre plusieurs objets... pourtant j'ai tout fait normalement...
"Sacré Hubert, toujours le mot pour rire !"
http://independentgeeks.wordpress.com/

#17 Angora

Angora

    Danse avec les bugs


Posté 02 janvier 2006 - 00:05

Essaie ça, alors.

global short Truc

Begin ScriptArmoire

if ( OnActivate )
  if ( Truc != 0 )
	 messagebox "Il vous reste un objet incongru, vous ne pouvez pas en avoir un autre !"
	 return
  endif
  set Truc to ( 1 + Random100 )
  set Truc to  ( Truc / 25 )
  startscript ScriptRetireObjet
  if ( Truc == 1 )
	 messagebox "Vous trouvez un objet débile dans l'armoire."
	 player->additem "objet débile" 1
   elseif ( Truc == 2 )
	 messagebox "Vous trouvez un objet idiot dans l'armoire."
	 player->additem "objet idiot" 1
   elseif ( Truc == 3 )
	 messagebox "Vous trouvez un objet stupide dans l'armoire."
	 player->additem "objet stupide" 1
   elseif ( Truc == 4 )
	 messagebox "Vous trouvez un objet inutile dans l'armoire."
	 player->additem "objet inutile" 1
   endif
endif

End

Begin ScriptRetireObjet

float timer
short retrait

if ( MenuMode == 1 )
   return
endif

set timer to ( timer + GetSecondsPassed )

if ( timer > 300 ); délais de 5 minutes...
   set retrait to 1
   set timer to 0
endif

if ( retrait == 1 )
   if ( Truc == 1 )
	  if ( player->getItemCount "objet débile" > 0 )
		 player->removeItem "objet débile" 1
		 set retrait to 2
	  endif
   elseif ( Truc == 2 )
	  if ( player->getItemCount "objet idiot" > 0 )
		 player->removeItem "objet idiot" 1
		 set retrait to 2
	  endif
   elseif ( Truc == 3 )
	  if ( player->getItemCount "objet stupide" > 0 )
		 player->removeItem "objet stupide" 1
		 set retrait to 2
	  endif
   elseif ( Truc == 4 )
	  if ( player->getItemCount "objet inutile" > 0 )
		 player->removeItem "objet inutile" 1
		 set retrait to 2
	  endif
   endif
endif

if ( retrait == 2 )
   set Truc to 0
   set retrait to 0
   stopscript ScriptRetireObjet
endif

End

Le saviez-vous ?

En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.




0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)