Aller au contenu


J'ai Voulu Me La Jouer Ia Radiant...


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

#1 Bunk

Bunk

    Super Méga Black Knight of the very Dark Death


Posté 09 octobre 2005 - 09:13

Désolé pour le titre quelque peu ronflant. Voici ce que j'ai voulu faire :

Un script qui donne un peu de vie à ma ville. Il devait positionner un PNJ dans un lieu avec un comportement et une tenue en fonction de l'heure. Voici un exemple du script en question :

Begin AAJR_script_tarduk

if ( GameHour >= 7 ) 
	if ( GameHour = 19 )
	   if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 0 )
		   AAJR_tarduk->AddItem, "common_shirt_03", 1
		   PositionCell 169959 236314 1237 0 "Praganal"
		   AIWander 1024 20 50 20 20 20
		endif
	 endif 
endif

if ( GameHour >= 19 ) 
	if ( GameHour < 7 )
		if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 1 )
		   AAJR_tarduk->RemoveItem, "common_shirt_03", 1
		   PositionCell 254 190 -80 205 "Praganal, maison de Tarduk Bon-enfant"
		   AIWander 0 0 0 0
		 endif
	 endif 
endif

End

Ca ne marche pas, le PNJ reste dans sa maison sans changer de tenue.

Mon autre option serait d'utiliser plusieurs exemplaires du même personnage avec des Enable/Disable en fonction de l'heure. Mais je crains que ça ne soit encore plus casse-tête (surtout si le joueur tue un clone et que les autres continuent leur train-train quotidien).

Si une âme généreuse voulait bien me conseiller sur ce problème, elle gagnerait... euh... toute ma reconnaissance. Merci.
Très loin de chez moi la s'maine
Je ne poste que le week-en'

#2 Yr d'Uab

Yr d'Uab

Posté 09 octobre 2005 - 09:40

Begin AAJR_script_tarduk

if ( GameHour >= 7 )
   if ( GameHour = 19 ) [color=#FF6600]seulement à 19h ??? Je suppose que c'est <= 19 ?[/color]
	  if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 0 ) 
		 AAJR_tarduk->AddItem, "common_shirt_03", 1
		 PositionCell 169959 236314 1237 0 "Praganal"
		 AIWander 1024 20 50 20 20 20
	  endif
   endif
endif

if ( GameHour >= 19 )
   if ( GameHour < 7 ) [color=#FF6600]Jamais valide : il ne peut pas être moins de 7h et plus de 19 h ![/color]
	  if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 1 )
		AAJR_tarduk->RemoveItem, "common_shirt_03", 1
		PositionCell 254 190 -80 205 "Praganal, maison de Tarduk Bon-enfant"
		AIWander 0 0 0 0
	  endif
   endif
endif

End

Je te propose donc :

Begin AAJR_script_tarduk

if ( GameHour < 7 )

	  if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 1 )
		AAJR_tarduk->RemoveItem, "common_shirt_03", 1
	 endif

	  PositionCell 254 190 -80 205 "Praganal, maison de Tarduk Bon-enfant"
	  AIWander 0 0 0 0

elseif ( GameHour >= 7 )
   if ( GameHour <= 19 )

	  if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 0 )
		AAJR_tarduk->AddItem, "common_shirt_03", 1
	 endif

	  PositionCell 169959 236314 1237 0 "Praganal"
	  AIWander 1024 20 50 20 20 20

   elseif ( GameHour > 19 )

	  if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 1 )
		AAJR_tarduk->RemoveItem, "common_shirt_03", 1
	 endif

	  PositionCell 254 190 -80 205 "Praganal, maison de Tarduk Bon-enfant"
	  AIWander 0 0 0 0
   endif

endif

End

YR

[EDIT] Qu'est ce qu'il faut faire pour qu'il garde les espaces et les couleurs dans le CODE ? [/EDIT]

Modifié par Yr d'Uab, 09 octobre 2005 - 10:05.

Je n'ai rien à voir avec votons.info, mais je le conseille à tous les électeurs potentiels.
---
"Se sent obligé de répondre par des mp en 4 points et 2 conclusions,
le tout engoncé dans un style académique des plus barbants."

#3 Bunk

Bunk

    Super Méga Black Knight of the very Dark Death


Posté 09 octobre 2005 - 11:02

Merci.

Il y a de l'amélioration.

- Si je rentre dans sa maison du PNJ de nuit, il a changé de tenue.
- Il faut que je rentre une fois dans la maison de jour pour qu'il apparaisse dans la rue (je pense que ça ne peut pas marcher autrement).

Mais :

- Dans la rue, le PNJ ne se déplace pas. Il reste sur place avec les épaules agitées de soubresauts. Si j'ouvre la console ou appuie sur Echap, il s'élève à 30 cm du sol (?).
- Si je me repose dans la cellule où se trouve le PNJ (pour voir si il change de place et de tenue) c'est le retour sous Windows.

Je me demande si je ferais pas mieux de renoncer à ce script...
Très loin de chez moi la s'maine
Je ne poste que le week-en'

#4 Yr d'Uab

Yr d'Uab

Posté 09 octobre 2005 - 11:30

Citation

AIWander 1024 20 50 20 20 20

Cà doit venir de là.

Essaye un :

AIWander, 1024, 0, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0

Ce qui fera bouger ton NPC sur une distance de 1024 tout le temps, et il regardera autour, regardera derrière, se grattera la tête, essuyera ses vêtemnets ou ses épaules, et se frottera les mains, tout çà avec 20% de chances...

Si tu veux adapter cela, je te cite le Morro Scripting for Dummies (en anglais, désolé...) :

Citation

AiWander, Range, Duration, Time, [Idle2], [Idle3], ...[Idle9], [Reset]

Where Range = The range, in game units, that the NPC will wander in from its
  current location.
Duration = Time (in hours?) that the NPC will wander (0 indicates infinite)
Time = Possibly the start time for the wandering to occur (0 may indicate
  no start time).
[Idle2]... = Optional parameters, that give the chance of the NPC to perform the
  following idle movements:
Idle2:  Looking around
Idle3:  Looking behind
Idle4:  Scratching head
Idle5:  Shifting clothing or armor on shoulder
Idle6:  Rubbing hands together and showing wares
Idle7:  Looking at fingers and looking around furtively
Idle8:  Deep thought
Idle9:  Reaching for weapon

A+
Yr

Modifié par Yr d'Uab, 09 octobre 2005 - 11:31.

Je n'ai rien à voir avec votons.info, mais je le conseille à tous les électeurs potentiels.
---
"Se sent obligé de répondre par des mp en 4 points et 2 conclusions,
le tout engoncé dans un style académique des plus barbants."

#5 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 09 octobre 2005 - 12:07

Citation

if ( GameHour < 7 )

if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 1 )
AAJR_tarduk->RemoveItem, "common_shirt_03", 1
endif

PositionCell 254 190 -80 205 "Praganal, maison de Tarduk Bon-enfant"
AIWander 0 0 0 0

elseif ( GameHour >= 7 )
if ( GameHour <= 19 )

if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 0 )
AAJR_tarduk->AddItem, "common_shirt_03", 1
endif

PositionCell 169959 236314 1237 0 "Praganal"
AIWander 1024 20 50 20 20 20

elseif ( GameHour > 19 )

if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 1 )
AAJR_tarduk->RemoveItem, "common_shirt_03", 1
endif

PositionCell 254 190 -80 205 "Praganal, maison de Tarduk Bon-enfant"
AIWander 0 0 0 0
endif

endif

End

Il faut mettre des DoOnce partout pour n'exécuter les positioncell qu'une fois sinon ces commandes sont constamment appelées d'où le bug du perso dans la rue; en prime on a souvent une sorte d'overflow qui crashe le jeu.

#6 Bunk

Bunk

    Super Méga Black Knight of the very Dark Death


Posté 09 octobre 2005 - 12:38

Yr d'Uab :

J'ai modifié l'AI Wander comme cité mais le résultat reste identique. Merci quand même.


Nerwal :

Je pensais que l'heure suffisait et que je pouvais me passer de DoOnce. Le souci, c'est que je vois mal comment les disposer pour que le script tourne quand même en boucle. Merci quand même aussi.


Je crois que je vais opter pour les clones. Il me reste à trouver une astuce de script pour que si l'un d'entre eux meurt, les autres soient "disablés" definitivement. Ce qui m'ennuie, c'est la barre de persuasion qui variera selon le clone rencontré. Mais comme il s'agit de PNJs d'ambiance, peut être que ça sera tolérable...
Très loin de chez moi la s'maine
Je ne poste que le week-en'

#7 Yr d'Uab

Yr d'Uab

Posté 09 octobre 2005 - 14:00

On sait qu'on va passer de <7 à >7<19 puis à >19.

Si on met UneFois à 0 pour <7, puis à 1 entre 7 et 19 puis à 2 pour >19, çà devrait marcher. Sauf si on se repose plus de 12 heures dans la Cell où se trouve le NPC. Dans ce cas, j'imagine que le UneFois ne sera plus à la bonne valeur par rapport à l'heure voulue ?!?

Begin AAJR_script_tarduk

if ( GameHour < 7 )

if ( UneFois == 0 )

if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 1 )
AAJR_tarduk->RemoveItem, "common_shirt_03", 1
endif

PositionCell 254 190 -80 205 "Praganal, maison de Tarduk Bon-enfant"
AIWander 0 0 0 0

set UneFois to 1

endif

elseif ( GameHour >= 7 )
if ( GameHour <= 19 )

if ( UneFois == 1 )

if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 0 )
AAJR_tarduk->AddItem, "common_shirt_03", 1
endif

PositionCell 169959 236314 1237 0 "Praganal"
AIWander 1024 20 50 20 20 20

set UneFois to 2

endif


elseif ( GameHour > 19 )

if ( UneFois == 2 )

if ( AAJR_tarduk->GetItemCount, "common_shirt_03" == 1 )
AAJR_tarduk->RemoveItem, "common_shirt_03", 1
endif

PositionCell 254 190 -80 205 "Praganal, maison de Tarduk Bon-enfant"
AIWander 0 0 0 0
endif

set UneFois to 0

endif

endif

End

Sinon, mettre des "clones", comme tu dis, avec un script par NPC qui enable/disable quand il faut. Plus long à mettre en oeuvre, mais çà marche.

A+
Yr
Je n'ai rien à voir avec votons.info, mais je le conseille à tous les électeurs potentiels.
---
"Se sent obligé de répondre par des mp en 4 points et 2 conclusions,
le tout engoncé dans un style académique des plus barbants."

#8 Bunk

Bunk

    Super Méga Black Knight of the very Dark Death


Posté 09 octobre 2005 - 15:33

Voir le messageYr d, le 09.10.2005 à 15:00, dit :

On sait qu'on va passer de <7 à >7<19 puis à >19.

Si on met UneFois à 0 pour <7, puis à 1 entre 7 et 19 puis à 2 pour >19, çà devrait marcher. Sauf si on se repose plus de 12 heures dans la Cell où se trouve le NPC. Dans ce cas, j'imagine que le UneFois ne sera plus à la bonne valeur par rapport à l'heure voulue ?!?

Hem... Morro plante assez comme ça. Autant ne pas en rajouter  :grin: Je planche sur les clones. Merci pour tout.
Très loin de chez moi la s'maine
Je ne poste que le week-en'

#9 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 09 octobre 2005 - 15:50

Ce genre de script ne peut pas marcher en local car un script local n'est activé que si le joueur se trouve dans la même cell ( en fait, une cell chargée, donc on compte les cells adjacentes en extérieur, mais le problème reste le même pour un passage intérieur/extérieur) que le porteur du script. Il faut donc écrire un script global et utiliser un activateur placé dans la rue et dans la maison qui lancera ce script global.
Un exemple testé (pour des questions de tests il utilise Caldéra et un PNJ au hasard, il faudra adapter)

Begin Schedule

short DoOnce
short UneFois

if (MenuMode == 1)
return
endif

if ( GetPCCell "Caldéra" == 0 )
stopscript Schedule
endif

if ( GameHour > 7 )
if ( GameHour < 19 )

if ( DoOnce == 0 )

if ( "a smuggler boss"->GetItemCount, "frostmirror robe" == 0 )
"a smuggler boss"->AddItem, "frostmirror robe", 1
endif
"a smuggler boss"->PositionCell -10366 18683 1364 174 "Caldéra"
"a smuggler boss"->AIWander,  128, 0, 0, 60, 30, 10, 0, 0, 0, 0, 0, 0
set DoOnce to 1
set UneFois to 0

endif

else

if ( UneFois == 0 )

if ( "a smuggler boss"->GetItemCount, "frostmirror robe" == 1 )
"a smuggler boss"->RemoveItem, "frostmirror robe", 1
endif

"a smuggler boss"->PositionCell 72 -115 -117 172 "Caldéra, maison de Nédhélas"
"a smuggler boss"->AIWander 0 0 0
set DoOnce to 0
set UneFois to 1
endif

endif

else
if ( UneFois == 0 )

if ( "a smuggler boss"->GetItemCount, "frostmirror robe" == 1 )
"a smuggler boss"->RemoveItem, "frostmirror robe", 1
endif

"a smuggler boss"->PositionCell 72 -115 -117 172 "Caldéra, maison de Nédhélas"
"a smuggler boss"->AIWander 0 0 0
set DoOnce to 0
set UneFois to 1
endif

endif

End

et le script de l'activator de la rue :
Begin activ_schedule

if ( MenuMode == 1 )
return
endif

if ( ScriptRunning, "Schedule" == 0 )
startscript "Schedule"
endif

end

Sinon le système des clones est peut-être plus simple et possède certains avantages (moins de script, possibilité de changer l'inventaire dès le début ou même changer de coupe de cheveux) mais il a aussi ses inconvénients...

Modifié par Nerwal, 09 octobre 2005 - 16:01.


#10 Bunk

Bunk

    Super Méga Black Knight of the very Dark Death


Posté 09 octobre 2005 - 16:38

Merci Nerwal, je vais essayer ton script.

Cependant, j'ai testé avec deux clones et il n'y a plus qu'un inconvénient mineur : le cadavre clignotant. Je m'explique. Si on tue un des clones, son ou ses homologues sont placés dans une cellule auquel le joueur n'aura jamais accès (nommée "Theatre" dans le script ci-dessous). Jusque là pas de problème. Par contre, le cadavre, lui, reste toujours soumis au script. Donc, en fonction de l'heure, il est présent ou non.

J'ai tenté, avec OnDeath, de le rendre présent définitivement une fois mort mais ça ne marche pas. Le script tourne toujours.

Ca ne tient plus que du détail mais si quelqu'un a la solution, ça serait chic de sa part de me dire comment résoudre ce dernier problème.

Le script ci-dessous est un de ceux attribué à un clone. Entre les deux, seuls les noms, les horaires et la "cible de la mort" changent (_J pour le clone de jour et _N pour celui de nuit).


Begin AAJR_script_tarduk_J

if ( GameHour >= 7 )
	if ( GameHour <= 19 )
		if ( GetDisabled == 1 )
			if ( OnDeath==0 )
				Enable
			endif
		endif
	endif
endif

if ( GameHour > 19 )
	if ( GetDisabled == 0 )
		if ( OnDeath==0 )
			Disable
		endif
	endif
elseif ( GameHour < 7 )
	if ( GetDisabled == 0 )
		if ( OnDeath==0 )
			Disable
		endif
	endif
endif

if ( OnDeath==1 )
	AAJR_tarduk_N->PositionCell 0 0 0 90 "Theatre"
	Enable
endif

End

Très loin de chez moi la s'maine
Je ne poste que le week-en'

#11 Yr d'Uab

Yr d'Uab

Posté 09 octobre 2005 - 17:37

J'adore le terme de "cadavre clignotant"  :grin:

Pour y remédier, la solution est un setdelete 1 (avec Trib), ou alors, pour Morro seul, un PositionCell "poubelle", avec "poubelle" une cell intérieure faite pour çà : mettre tous les objets inutiles du jeu...

Donc sur ton test de OnDeath, tu envoies le cadavre vers ta poubelle et c'est réglé !

Je suis clair ?

A+
Yr
Je n'ai rien à voir avec votons.info, mais je le conseille à tous les électeurs potentiels.
---
"Se sent obligé de répondre par des mp en 4 points et 2 conclusions,
le tout engoncé dans un style académique des plus barbants."

#12 Bunk

Bunk

    Super Méga Black Knight of the very Dark Death


Posté 09 octobre 2005 - 18:12

Parfaitement clair, merci pour tout  :grin:

Je crois que ce coup-ci, ça va marcher comme je veux.
Très loin de chez moi la s'maine
Je ne poste que le week-en'




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

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