Aller au contenu


[résolu] Détecter Une Chute Critique


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

#1 Mordicus

Mordicus

    Philippe Risoli & Muppets show


Posté 27 décembre 2005 - 04:16

Quelle commande permettra de détecter la chute critique du PJ ? (chute avec perte de points de vie, généralement accompagnée d'une animation spécifique)

J'aimerais remplacer le son de la chute (avec blessure, qui, par défaut, semble être le même son qu'un coup reçu) par un autre. Pour cela, il faudrait que je puisse anticiper le moment d'une chute critique.

Merci
(Ultra)VGM récalcitrant et moddeur allergique aux jeux vidéo.

#2 MysticalShadow

MysticalShadow

Posté 27 décembre 2005 - 14:51

Je ne crois pas que ce soit faisable directement.
On pourrait peut être détecter la chute en relevant la position sur l'axe Z du Player constemment toutes les 0,X secondes, et du son et de la réduction de vie/son de blessure joué. Assez lourd au final.

#3 Angora

Angora

    Danse avec les bugs


Posté 27 décembre 2005 - 16:11

Et puis, un script qui joue sur la détection du son ne serait pas très utile pour faire un script qui remplacerait ce son pas un autre...
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.

#4 Mordicus

Mordicus

    Philippe Risoli & Muppets show


Posté 27 décembre 2005 - 16:32

Voir le messageAngora, le 27.12.2005 à 16:11, dit :

Et puis, un script qui joue sur la détection du son ne serait pas très utile pour faire un script qui remplacerait ce son pas un autre...
Je ne suis pas sûr de te comprendre, mais disons que ce serait utilse dans la mesure où un script permettrait de faire la différence entre le son d'un coup reçu, et une chute... Si on ne peut faire cette différence, autrement que par le son, c'est embêtant (car c'est le même son). Pourtant le TESCS a un son prévu pour les chutes, mais on ne l'entend pas... Je suppose que Bethesda a laissé tombé un truc prévu au départ.

Ca m'étonne qu'il soit impossible de détecter une chute critique... puisque, quand ça se produit, c'est suivi par une animation bien particulière... N'y a-t-il pas moyen de détecter ces deux conditions : retomber sur le sol + dégâts ? (puisque c'est ce qui se produit lorsqu'on chute de trop haut)... ? non ?
(Ultra)VGM récalcitrant et moddeur allergique aux jeux vidéo.

#5 Angora

Angora

    Danse avec les bugs


Posté 27 décembre 2005 - 16:54

Et est-il possible de détecter les animations ?
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.

#6 MysticalShadow

MysticalShadow

Posté 27 décembre 2005 - 18:04

Je n'ai pas vu de fonction Get dans la liste qui le permettrait, malheureusement.

On peut en effet détecter le moment où il retombe sur le sol et se blesse, mais cela nécessitera un script global qui tourne en permanence, ainsi que plusieurs expérimentations.

#7 Mordicus

Mordicus

    Philippe Risoli & Muppets show


Posté 27 décembre 2005 - 22:03

Merci pour tes réponses Mysticalshadow.

Comme j'ai déjà un script global qui tourne dans mon mod, je pense que rajouter quelques lignes ne changera pas grand chose... Peux-tu me donner un exemple de script pour détecter une chute critique (en fonction de la position de joueur et des dégâts subis, par exemple) ?  J'ai envie d'expérimenter. :cry:

Merci.
(Ultra)VGM récalcitrant et moddeur allergique aux jeux vidéo.

#8 MysticalShadow

MysticalShadow

Posté 28 décembre 2005 - 12:16

BEGIN Script Detection_Chute_sur_BESTIOLE

float PJPosZ_encours
float PJPosZ_prev
float distance_mini_chute


if ( MenuMode == 1 )
	Return
endif

; si lévitation, on ne fait rien.
;
if ( Player->GetEffect "sEffectLevitate" == 1 )
	Return
endif



Set PJPosZ_encours to ( Player->GetPos, Z )

; Si le PJ se prend un coup, et qu'il est en train de tomber, on considère que c'est une chute critique.
;
if ( Player->GetSoundPlaying "Son_Coup_Pris" == 1 ); regarader sous TESCS l'ID du son.
	if ( ( PJPosZ_prev - PJPosZ_encours ) >= 30 ); valeur prise au hasard, il faudrait faire des tests.
		PlaySound "TON_SON_DE_CHUTE"; mets l'ID de ton son.
	endif
endif

Set PJPosZ_prev to PJPosZ_encours


END

Ce script n'est pas encore très lourd, mais il comporte quelques problèmes. J'en appelle aux autres scripteurs/modeurs:
- Si le joueur pousse le son de blessure au cours de sa chute, ton son sera déclenché.
- Est-ce que les changements de positions du PJ, à chaque changement de frame, prennent en compte la différence de temps entre la frame et la précédente? Si oui, si ca lag, si PJ descend à pied une montagne de forte pente, et si il pousse le son de blessure, il se peut que le script déclenche ton son de chute.


Ensuite, me vient une interrogation: à quel moment une chute est-elle considérée comme critique? A partir d'une certaine vitesse de chute, ou d'une certaine distance?
Si c'est la vitesse, alors il y a 2 choses:
- L'acrobatie n'est pas gérée. Il faudrait tester la valeur pour une acrobatie minimale, ou voir si il y a proportionnalité. Gérer l'acrobatie permettrait d'affiner les tests.
- Il ne gère pas l'effet Chute ralentie. Là, il faudrait tester si la chute est critique à la même vitesse (au moins) que sans l'effet magique..Si non, tester si cette vitesse minimale critique est proportionnelle à la magnitude de l'effet magique, où qu'il y est une fonction TESCS-able associée.
Si c'est la distance, impossible de gérer l'effet Chute ralentie et l'Acrobatie avec ce script. Il faudrait en faire un autre plus compliqué, qui détecterait et mémoriserait l'altitude initiale et celle finale d'une chute. Mais ca ouvrirait une optique intéressante: déclencher un son genre "Aaaaaaaahhhh!" quand la chute devient trop longue.

Modifié par MysticalShadow, 28 décembre 2005 - 12:20.


#9 Mordicus

Mordicus

    Philippe Risoli & Muppets show


Posté 31 décembre 2005 - 12:44

J'avais posté la même question sur le forum anglais du TESCS, et un scripteur m'a fait deux propositions de scripts, malheureusement, aucun ne fonctionne vraiment. Lorsque je fais une mauvaise chute, j'entends toujours le son "damage health" (le même quand on reçoit un coup, et non le nouveau son que je voudrais utiliser).

Voici les deux scripts (apparemment avec quelques oublis)... Le premier s'inspire de celui de MysticalShadow en ajoutant une variable temps (j'ignore pourquoi):

Begin Fall_Test

short PJPosZ_encours
short PJPosZ_prev
short Distance
float Timer

if ( MenuMode == 1 )
   Return
endif

if ( ( player->GetEffect "sEffectLevitate" ) == 1 )
   Return
endif

if ( Timer < 0.2 )
   Set Timer to ( Timer + GetSecondsPassed )
   Return
endif
Set Timer to 0

Set PJPosZ_encours to ( player->GetPos, Z )

if ( ( player->GetSoundPlaying "Health Damage" ) == 1 )
   Set Distance to ( PJPosZ_prev - PJPosZ_encours )
   PlaySound "NOUVEAU SON"
   Set AcrobaticsSkill to ( player->GetAcrobatics )
   MessageBox "You fell g% units. Your Acrobatics are g%." Distance AcrobaticsSkill
endif

Set PJPosZ_prev to PJPosZ_encours

End Fall_Test

Apparemment, le scripteur a oublié une ligne "short AcrobaticsSkill" que j'ai rajoutée (sinon j'avais un message d'erreur en sauvegardant le script)

Le second, plus long :

Begin Script_Detection_Chute

short PJPosZ_counter
short PJPosZ_encours
short PJPosZ_prev1
short PJPosZ_prev2
short PJPosZ_prev3
short PJPosZ_prev4
short PJPosZ_prev5
short PJPosZ_prev6
short PJPosZ_prev7
short PJPosZ_prev8
short PJPosZ_prev9
short PJPosZ_prev10
short PJPosZ_prev11
short PJPosZ_prev12
short PJPosZ_prev13
short PJPosZ_prev14
short PJPosZ_prev15
short PJPosZ_prev16
short PJPosZ_prev17
short PJPosZ_prev18
short PJPosZ_prev19
short PJPosZ_prev20
short Health_prev
short Distance

if ( MenuMode == 1 )
   Return
endif

if ( PJPosZ_counter == 0 )
   Set Distance to prev1 - PJPosZ_encours
   Set PJPosZ_prev1 to PJPosZ_encours
elseif ( PJPosZ_counter == 1 )
   Set Distance to prev2 - PJPosZ_encours
   Set PJPosZ_prev2 to PJPosZ_encours
elseif ( PJPosZ_counter == 2 )
   Set Distance to prev3 - PJPosZ_encours
   Set PJPosZ_prev3 to PJPosZ_encours
elseif ( PJPosZ_counter == 3 )
   Set Distance to prev4 - PJPosZ_encours
   Set PJPosZ_prev4 to PJPosZ_encours
elseif ( PJPosZ_counter == 4 )
   Set Distance to prev5 - PJPosZ_encours
   Set PJPosZ_prev5 to PJPosZ_encours
elseif ( PJPosZ_counter == 5 )
   Set Distance to prev6 - PJPosZ_encours
   Set PJPosZ_prev6 to PJPosZ_encours
elseif ( PJPosZ_counter == 6 )
   Set Distance to prev7 - PJPosZ_encours
   Set PJPosZ_prev7 to PJPosZ_encours
elseif ( PJPosZ_counter == 7 )
   Set Distance to prev8 - PJPosZ_encours
   Set PJPosZ_prev8 to PJPosZ_encours
elseif ( PJPosZ_counter == 8 )
   Set Distance to prev9 - PJPosZ_encours
   Set PJPosZ_prev9 to PJPosZ_encours
elseif ( PJPosZ_counter == 9 )
   Set Distance to prev10 - PJPosZ_encours
   Set PJPosZ_prev10 to PJPosZ_encours
elseif ( PJPosZ_counter == 10 )
   Set Distance to prev11 - PJPosZ_encours
   Set PJPosZ_prev11 to PJPosZ_encours
elseif ( PJPosZ_counter == 11 )
   Set Distance to prev12 - PJPosZ_encours
   Set PJPosZ_prev12 to PJPosZ_encours
elseif ( PJPosZ_counter == 12 )
   Set Distance to prev13 - PJPosZ_encours
   Set PJPosZ_prev13 to PJPosZ_encours
elseif ( PJPosZ_counter == 13 )
   Set Distance to prev14 - PJPosZ_encours
   Set PJPosZ_prev14 to PJPosZ_encours
elseif ( PJPosZ_counter == 14 )
   Set Distance to prev15 - PJPosZ_encours
   Set PJPosZ_prev15 to PJPosZ_encours
elseif ( PJPosZ_counter == 15 )
   Set Distance to prev16 - PJPosZ_encours
   Set PJPosZ_prev16 to PJPosZ_encours
elseif ( PJPosZ_counter == 16 )
   Set Distance to prev17 - PJPosZ_encours
   Set PJPosZ_prev17 to PJPosZ_encours
elseif ( PJPosZ_counter == 17 )
   Set Distance to prev18 - PJPosZ_encours
   Set PJPosZ_prev18 to PJPosZ_encours
elseif ( PJPosZ_counter == 18 )
   Set Distance to prev19 - PJPosZ_encours
   Set PJPosZ_prev19 to PJPosZ_encours
elseif ( PJPosZ_counter == 19 )
   Set Distance to prev20 - PJPosZ_encours
   Set PJPosZ_prev20 to PJPosZ_encours
   Set PJPosZ_counter to -1
endif
Set PJPosZ_encours to ( player->GetPos, Z )
Set PJPosZ_counter to ( PJPosZ_counter + 1 )

if ( ( player->GetEffect "sEffectLevitate" ) == 1 )
elseif ( ( player->GetHealth ) < Health_prev )
   if ( Distance >= 30 ); this value can be changed.
	   PlaySound "NEW_SOUND_FOR_CRITICAL_FALL".
	   MessageBox "Now you should hear the sound."
   endif
   MessageBox "You fell g% units." Distance
endif

Set Health_prev to ( Player->GetHealth )

End Script_Detection_Chute

Apparemment là aussi il y a une erreur lorsque je sauvegarde:
"Set Distance to prev1 - PJPosZ_encours"
Je pense qu'il s'agit d'une erreur de syntaxe et j'ai rectifié en :
"Set Distance to PJPosZ_prev1 - PJPosZ_encours" (et pour toutes les lignes suivantes)

Malheureusement, ça ne fonctionne toujours pas. Ce qui m'étonne, c'est que le scripteur n'a pas recours aux commandes GetSoundPlaying, Stopsound et Playsound, pour remplacer le son par défaut... dès lors je ne vois pas trop comment ces scripts peuvent parvenir au résultat escompté.

Est-ce que qqun voit un moyen de faire fonctionner l'un de ces scripts (ou celui de MysticalShadow) à partir de ça ?

Merci.
(Ultra)VGM récalcitrant et moddeur allergique aux jeux vidéo.

#10 Angora

Angora

    Danse avec les bugs


Posté 31 décembre 2005 - 14:33

Désolé, je n'apporte pas de solutions... Mais une proposition de te mettre encore plus de boulot sur le dos ! ;)

Voilà, si tu corriges les sons pour les dégâts hors-coups (comme la chute), alors, à moins que ce ne soit déjà fait, il faudrait aussi faire quelque chose pour la lave (et les utilisations de HurtStandingActor/HurtCollidingActor). Ça m'a toujours interloqué d'entendre "Baf ! Baf ! Baf !" quand quelqu'un se noie dans un lac de lave... ;)
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.

#11 MysticalShadow

MysticalShadow

Posté 31 décembre 2005 - 16:36

@Angora: Très bonne idée pour la lave! Il suffit juste de corriger le script "lava" sous TESCS...Mais il faudrait un son approprié. En vois-tu un qui pourrait convenir?

@Mordicus: On ne peut malheureusement pas arrêter le son de la blessure. En effet, StopSound n'arrête que les sons joués en boucle (via PlayLoopSound). On ne peut donc faire qu'une superposition des 2 sons.
Le 2e script que t'a proposé le scripteur talenteux, il ne me paraît pas fameux. J'ai eu la même idée, confrontée au même problème: trop de tests, donc torp de performances bouffées pour un événement qui n'arrive pas souvent.
D'ailleurs il a semblé concevoir ses scripts pour que tu puisses expérimenter, et faire part de tes résultats pour rendre le script fonctionnel...car il va falloir faire plusieurs tests si l'on souhaite faire quelquechose d'efficace.
Mais déjà, il faudrait savoir si la chute du PJ s'accélère dans le temps, et si il y a un seuil de durée à partir duquel la vitesse ne croît plus.

#12 Mordicus

Mordicus

    Philippe Risoli & Muppets show


Posté 01 janvier 2006 - 23:56

Voir le messageAngora, le 31.12.2005 à 14:33, dit :

Voilà, si tu corriges les sons pour les dégâts hors-coups (comme la chute), alors, à moins que ce ne soit déjà fait, il faudrait aussi faire quelque chose pour la lave (et les utilisations de HurtStandingActor/HurtCollidingActor). Ça m'a toujours interloqué d'entendre "Baf ! Baf ! Baf !" quand quelqu'un se noie dans un lac de lave... :pilote:
Je veux bien essayer, très volontiers, mais le problème reste entier: il est apparemment impossible de remplacer purement et simplement le son "damage health"... Comme le dit MysticalShadow, il semble qu'il soit seulement possible de superposer deux sons. Par exemple: Damage Health + un son de chute.

Voir le messageMysticalShadow, le 31.12.2005 à 16:36, dit :

@Angora: Très bonne idée pour la lave! Il suffit juste de corriger le script "lava" sous TESCS...Mais il faudrait un son approprié. En vois-tu un qui pourrait convenir?
Si c'est simple, donne moi juste le script et je me charge du son :|

Citation

On ne peut malheureusement pas arrêter le son de la blessure. En effet, StopSound n'arrête que les sons joués en boucle (via PlayLoopSound). On ne peut donc faire qu'une superposition des 2 sons.
En effet, je viens de m'en rendre compte en réalisant, après maint essais, un script qui remplace le bruit des armes (weapons swish) en fonction de leur type (dague, bâton, hache, etc.). Le son par défaut n'est pas stoppé (malgré la commande STOPSOUND), et il est seulement suivi du nouveau son, ce qui ne rend pas bien (ce n'est pas un superposition réelle, mais plutôt les deux sons qui sont joués l'un après l'autre). J'en déduis que la cause est perdue...

Dans le cas de la chute, en revanche, la son de "Damage health" immédiatement suivi d'un son de chute, ça peut rendre pas mal... Il faut que je procède à des essais. Mais je n'ai toujours pas de script qui fonctionne. :)

Citation

Le 2e script que t'a proposé le scripteur talenteux, il ne me paraît pas fameux. J'ai eu la même idée, confrontée au même problème: trop de tests, donc torp de performances bouffées pour un événement qui n'arrive pas souvent.
Oui je suis d'accord. Je regarde pour l'instant tout ce que je peux remplacer à peu de frais. Je préfère directement remplacer des sons existants, en ajouter, plutôt que d'en remplacer par des scripts globaux... du moins, il faut voir si le jeu en vaut la chandelle. Si dans le cas de la chute, ou de celui de la lave, on peut avoir un script simple, il me semble que ça vaut le coup.

Voici encore deux scripts que je cherche à faire (si quelqu'un peut aider):

- un script qui détecte quand le PJ marche sur du bois (par exemple, le petit pont en bois de Seyda Nihyn), pour changer le bruit des pas dans ce cas là.

- un script qui arrête la musique d'exploration et de combats (en jouant un mp3 silencieux), lorsque les sons "haunted" et "Spirit voices" (bruits d'ambiance toujours présents dans les tombes) sont actifs... en partant, par exemple, de:
 if ( GetSoundPlaying "haunted" == 1 ) 
StreamMusic "silence.mp3" 
etc...
(De façon à ce que, dès que le joueur sortira de la tombe, la musique habituelle reprenne.)

J'ai fait un script tout bête qui ne marche pas.  :)

Modifié par Mordicus, 01 janvier 2006 - 23:57.

(Ultra)VGM récalcitrant et moddeur allergique aux jeux vidéo.

#13 Mordicus

Mordicus

    Philippe Risoli & Muppets show


Posté 08 janvier 2006 - 21:37

Finalement c'est bien possible, et ça marche très bien :P

Grâce un gros coup de pouce de l'ami Abot, voici le script pour ceux que ça pourrait intéresser:

begin Detection_Chute

float PJPosZ_encours
float PJPosZ_prev

if ( MenuMode == 1 )
  Return
endif

if ( Player->GetEffect sEffectLevitate == 1 )
  Return
endif

Set PJPosZ_encours to ( Player->GetPos, Z )

if ( Player->GetSoundPlaying "Health Damage" == 1 )
  set PJPosZ_encours to ( PJPosZ_prev - PJPosZ_encours )
  MessageBox "delta Z per frame %f" PJPosZ_encours; cette ligne sert seulement au débuggage.
  if ( PJPosZ_encours >= 30 ); cette valeur peut être modifiée.
	  player->StopSound "Health Damage"
	  player->PlaySound3D "Body Fall Large"; mettre l'ID du nouveau son désiré.
  endif
endif

Set PJPosZ_prev to PJPosZ_encours

End

Sinon, pour changer le bruit des dégâts causés par la lave, voici le script d'origine:

begin lava

if ( menumode == 1 )
	return
endif

if ( CellChanged == 0 )
	if ( GetSoundPlaying "lava layer" == 0 )
		PlayLoopSound3DVP "lava layer", 1.0, 1.0
	endif
endif

HurtStandingActor, 20.0	;20 pts of damage a sec

end lava

C'est évidemment la dernière ligne qu'il faudrait changer, afin qu'un son de brûlure puisse être joué. Est-ce que quelqu'un voit comment remplacer "HurtStandingActor, 20.0" par une formule équivalente permettant de causer des dégâts et de jouer un son sur mesure  :green:
(Ultra)VGM récalcitrant et moddeur allergique aux jeux vidéo.

#14 Angora

Angora

    Danse avec les bugs


Posté 09 janvier 2006 - 10:58

A priori, pas possible simplement.

Mais on pourrait peut-être faire ça :

if ( GetStandingPC == 1 )
   if ( timer >= 1 )
	  Player->ModCurrentHealth -20
	  set timer to 0
   endif
   player->PlaySound3D "ça crame"; pour le choix du son, je te laisse te débrouiller :)
elseif ( GetStandingActor == 1 )
   HurtStandingActor 20
   PlaySound3D "ça crame" 
endif

Inconvénient : si le joueur et un autre acteur sont sur la même plaque de lave, l'autre acteur ne subit aucun dégâts.
Alternative, on utilise endif suivi de if au lieu de elseif, mais alors dans un tel cas le joueur se prend doubles dégâts.
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.

#15 MysticalShadow

MysticalShadow

Posté 11 janvier 2006 - 21:54

@Angora: je ne comprends pas pourquoi il faut remplacer le HurtStandingActor par un émule dont l'application est réservée au PJ.
Ceci me paraît simple:

begin lava

if ( menumode == 1 )
	return
endif

if ( CellChanged == 0 )
	if ( GetSoundPlaying "lava layer" == 0 )
		PlayLoopSound3DVP "lava layer", 1.0, 1.0
	endif
endif

HurtStandingActor, 20.0  ;20 pts of damage a sec

if ( GetStandingPC == 0 )
	Return
endif

Set timer to ( timer + GetSecondsPassed )

if ( timer >= 1 )
	PlaySound3D "ça crame"
	Set timer to 0
endif

end lava
Il y a un piège?

@Mordicus: Il y a une petite bourde dans le script que tu proposes. Mieux vaut remplacer ceci:

Citation

set PJPosZ_encours to ( PJPosZ_prev - PJPosZ_encours )
  MessageBox "delta Z per frame %f" PJPosZ_encours; cette ligne sert seulement au débuggage.
  if ( PJPosZ_encours >= 30 ); cette valeur peut être modifiée.
Par ca:
  set PJPosZ_prev to ( PJPosZ_prev - PJPosZ_encours )
  MessageBox "delta Z per frame %f" PJPosZ_prev; cette ligne sert seulement au débuggage.
  if ( PJPosZ_prev >= 30 ); cette valeur peut être modifiée.
Sinon, ce qui m'intrigue, c'est que le "30" soit la bonne valeur. La messagebox te donne une valeur proche de 30?

Modifié par MysticalShadow, 12 janvier 2006 - 07:22.


#16 Mordicus

Mordicus

    Philippe Risoli & Muppets show


Posté 11 janvier 2006 - 22:55

Voilà où j'en suis, c'est assez complexe...

Pour la lave:
- avec le script d'Angora, rien ne se passe quand je marche sur la lave. Pas de dégâts, et pas de son.
- avec ton script Mystical, le TESCS renvoie une erreur et ne semble pas comprendre la commande GetStandingPJ.

Pour les chutes critiques, il y a en fait un problème dans le script que j'ai présenté plus haut, qui n'est pas réglé. C'est que lorsqu'on reçoit des dégâts importants (+ de 30) dans un combat, le son "damage health" est aussi remplacé par le son de la chute.

Voici quel était le script (j'y ai rajouté deux conditions pour que le son varie en fonction de la gravité de la chute):

begin Detection_Chute

float PJPosZ_encours
float PJPosZ_prev

if ( MenuMode == 1 )
  Return
endif

if ( Player->GetEffect sEffectLevitate == 1 )
  Return
endif

Set PJPosZ_encours to ( Player->GetPos, Z )

if ( Player->GetSoundPlaying "Health Damage" == 1 )
  set PJPosZ_encours to ( PJPosZ_prev - PJPosZ_encours )
  MessageBox "delta Z per frame %f" PJPosZ_encours
	 if ( PJPosZ_encours >= 30 )
		   player->StopSound "Health Damage"
		   if ( PJPosZ_encours >= 90 )
			   player->PlaySound3D "Critical Fall"
		   endif
		   if ( PJPosZ_encours >= 60 )
			   player->PlaySound3D "WolfHit2"
		   endif
		endif	
   endif

end detection_chute

Ce script marche très bien pour le son des chutes, mais en combat le son "health damage' est remplacé par "critical fall". 8)

Suite à cela, Abot m'a donné un second script à essayer:

begin Detection_Chute

float PJPosZ_encours
float PJPosZ_prev

if ( MenuMode == 1 )
 Return
endif

if ( Player->GetEffect sEffectLevitate == 1 )
 Return
endif

Set PJPosZ_encours to ( Player->GetPos, Z )

; everything in a line to the right of a; is a comment

if ( Player->GetSoundPlaying "Health Damage" == 1 )
 set PJPosZ_encours to ( PJPosZ_prev - PJPosZ_encours )

; next line is for debugging only
 MessageBox "delta Z per frame %f" PJPosZ_encours

; next line means: if, and only if, PJPosZ_encours >= 30 do the next block ( block = next indented lines )
 if ( PJPosZ_encours >= 30 ); change sound only if falling speed is high enough
   player->StopSound "Health Damage"; first thing, stop the sound if falling speed is high enough
   
; next if/elseif will choose the 1 sound to play instead. notice how
; the indentation helps understanding block start/end
   if ( PJPosZ_encours >= 90 )
	 player->PlaySound3D "Critical Fall"

; next line means: if - and only if - previous if condition is false ( PJPosZ_encours < 90 ) do the next block
   elseif ( PJPosZ_encours >= 60 )
	 player->PlaySound3D "WolfHit2"

; next line means: if ( PJPosZ_encours < 60 ) do the next block
   else
	 player->PlaySound3D "Body Fall Medium"
   endif; end of if ( PJPosZ_encours >= 90 ) block
 endif; end of if ( PJPosZ_encours >= 30 ) block
endif; end of if ( Player->GetSoundPlaying... block

Set PJPosZ_prev to PJPosZ_encours

End Detection_Chute

Ce second script résoud 1 problème (plus de son de chute pendan les combats), mais il a deux autres problèmes:
- on n'entend plus la différence de son selon la gravité de la chute (c'est toujours le même son, alors que ça marchait dans le script précédent)
- pendant les combats, tout se passe bien, sauf, quand on est sous l'eau (combat avec un poisson carnacier, par exemple) ou quand on marche sur la lave (justement  :grin: ): dans ces deux cas le son des dégâts (damage health) est remplacé par le son de la chute...  :lol:

Je suis bloqué ici. Si vous avez une idée...  :?

EDIT:

Citation

Sinon, ce qui m'intrigue, c'est que le "30" soit la bonne valeur. La messagebox te donne une valeur proche de 30?
C'est une valeur choisie arbitrairement... pour l'instant, après de multiples tests in-game, je trouve que c'est pas mal. Ca rend les chutes un peu plus réaliste. Pour les valeurs de la message box, j'ai déjà oublié, il faut que je regarde à nouveau. Pour l'instant, j'essaie surtout de faire marcher le script. Ensuite, si besoin, j'adapterai les valeurs.

Modifié par Mordicus, 11 janvier 2006 - 22:59.

(Ultra)VGM récalcitrant et moddeur allergique aux jeux vidéo.

#17 MysticalShadow

MysticalShadow

Posté 12 janvier 2006 - 07:28

Ah la la, je manque de pratique. J'ai édité le script: GetStandingPJ doit être remplacé par GetStandingPC.

Je continue de penser que tes bugs sont dûs à cette ligne:
 set PJPosZ_encours to ( PJPosZ_prev - PJPosZ_encours )
IL ne faut pas utilier la variable PJPoszZ_encours, car à la fin du script il y a cette entrée:
Set PJPosZ_prev to PJPosZ_encours
Mieux vaut utiliser l'autre variable. Voilà ce que ca donne:

Spoiler


#18 Angora

Angora

    Danse avec les bugs


Posté 12 janvier 2006 - 10:48

Voir le messageMysticalShadow, le 11.01.2006 à 21:54, dit :

@Angora: je ne comprends pas pourquoi il faut remplacer le HurtStandingActor par un émule dont l'application est réservée au PJ.

Parce que le son de dégâts entrainé par HurtStandingActor est celui qu'on ne veut plus entendre.

Dans le bout de script proposé, on utilise HurtStandingActor pour blesser les autres créatures, puisqu'il n'y a pas moyen de faire autrement, et en partant du principe que le son sera moins fort que pour le joueur.

Voir le messageMordicus, le 11.01.2006 à 22:55, dit :

avec le script d'Angora, rien ne se passe quand je marche sur la lave. Pas de dégâts, et pas de son.

Tu n'as pas oublié de mettre un set timer to ( timer + GetSecondsPassed ) avant, par hasard ?
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.

#19 Mordicus

Mordicus

    Philippe Risoli & Muppets show


Posté 12 janvier 2006 - 11:48

- Pour la lave, rien ne se passe non plus avec le script de MysticalShaodw (ni dégâts, ni son)

- Par contre, pour les chutes, ça à l'air de fonctionner très bien (y compris sous l'eau). Mais je dois faire encore quelques essais pour être sûr que tout est parfait. :ph34r:

Il y a juste un "endif" en trop à la fin du script.

Citation

Tu n'as pas oublié de mettre un set timer to ( timer + GetSecondsPassed ) avant, par hasard ?
C'est possible, il faut que je retourne voir ça, je repose ensuite... :rolleyes:

Et merci pour votre aide!
(Ultra)VGM récalcitrant et moddeur allergique aux jeux vidéo.

#20 Fandorn Delavie

Fandorn Delavie

    Défilé de mods


Posté 12 janvier 2006 - 19:56

Ce script là permet de detecter quand on se fait mal en tombant :
begin _s_detection_chute

short IsJumping
float CurrentLife


if ( GetPCJumping )
	MessageBox "Ahhh"
	Set IsJumping to 1
	Set CurrentLife to ( player->GetHealth )
else
	if ( IsJumping == 1 )
		Set IsJumping to 0
		if ( player->GetHealth != CurrentLife )	
			MessageBox "Aie ! ca fait mal"
		else
			MessageBox "Même pas mal d'abbord;)"
		endif
	endif
endif

end

Seuls problemes :
- Il est tribunal requis
- Il ne marche que si le joueur se fait mal apres avoir sauter avec le bouton [saut]. Il ne detecte donc pas si tu tombes d'une falaise en marchant ;)

Avantages :
- Il fait la difference entre le faite de de faire frapper pendant le saut et au moment de la chute :green:
Modules bêta sur True Morrowind en attendant d'être sur wiwiland... Deja des millions de téléchargements :)

#21 Mordicus

Mordicus

    Philippe Risoli & Muppets show


Posté 12 janvier 2006 - 20:57

Bon reprenons:

Pour la lave: le script marche maintenant (j'ai aussi ajouté un "float timer") mais le son est joué de façon répétée et saccadée (il est répété plusieurs fois de suite sans être joué en entier). Il doit y avoir un réglage à faire au niveau du timer, pour que le son ne soit pas rejoué avant quelques secondes (le temps que le son se termine).

Spoiler

Question accessoire: il aurait été bien qu'avec ce nouveau son (quand il marchera...) que je puisse rajouter l'effet "lueurs rouges" (celui que l'on peut voir lorsqu'on se noye, le bord de l'écran devant alors rouge et clignotant, comme pour simuler l'agonie...). Est-ce que c'est scriptable ?

Pour le script de détection de chute: ben non, finalement ça ne marche toujours pas. Il y a toujours deux problèmes:
- celui d'arriver à jouer un son différent en fonction de la gravité de la chute (ce problème pourrait être réglé en n'utilisant qu'un seul son pour les chutes critiques) - j'ai soit toujours le même son, soit les trois sons à la fois. :green:
- celui de faire la différence entre les coups reçu et les chutes (un script précédent fourni par Abot semblait fonctionner, mais pas dans certains cas: sous l'eau, sur la lave, etc.). A chaque fois que je reçois des coups et que le son de la chute est joué, le débuggage indique "Z = 0.0000 frame". Je ne sais pas trop bien comment intérpréter ça. Les chutes dans l'eau font aussi des dégâts, ce qui n'est pas normal je pense...

@ Fandorn : merci, ça peut-être intéressant. Mais il faudrait pour l'instant que j'arrive à différencier correctement un chute (involontaire) d'un coup... Le script d'Abot y arrivait presque, sauf dans des cas particuliers.

Pour la nécessité d'avoir le Tribunal installé, j'ai déjà besoin de recourrir à un start script pour autre chose, donc ce sera nécessaire de toute façon...  :D

--------------------

Question un peu à part: Est-ce qu'il serait possible de faire un script détectant le niveau d'un ennemi/monstre qui attaque et de le comparer à celui du joueur ?
(Ultra)VGM récalcitrant et moddeur allergique aux jeux vidéo.

#22 Angora

Angora

    Danse avec les bugs


Posté 12 janvier 2006 - 21:35

Voir le messageMordicus, le 12.01.2006 à 20:57, dit :

Pour la lave: le script marche maintenant (j'ai aussi ajouté un "float timer") mais le son est joué de façon répétée et saccadée (il est répété plusieurs fois de suite sans être joué en entier). Il doit y avoir un réglage à faire au niveau du timer, pour que le son ne soit pas rejoué avant quelques secondes (le temps que le son se termine).

Il faut alors mettre un deuxième timer et régler selon la durée du son de brûlure. On va dire que ce son dure trois secondes pour l'exemple :

begin lava

float timer
float timer2

if ( menumode == 1 )
	return
endif

if ( GetStandingPC == 1 )
   if ( timer >= 1 )
	  Player->ModCurrentHealth -20
	  set timer to 0
   endif
   if ( timer2 >= 3 )
	  set timer2 to 0
   endif
   if ( timer2 == 0 )
	  player->PlaySound3D "brulure"; pour le choix du son, je te laisse te débrouiller :)
   endif
elseif ( GetStandingActor == 1 )
   HurtStandingActor 20
   if ( timer2 >= 3 )
	  set timer2 to 0
   endif
   if ( timer2 == 0 )
	  PlaySound3D "brulure"
   endif
else
   set timer to 0
   set timer2 to 0
   return
endif

set timer to ( timer + GetSecondsPassed )
set timer2 to ( timer2 + GetSecondsPassed )

end lava

Au menu, insertion de timer2 pour le son et déplacement de la mise à jour de la variable à après pour que timer2 soit égal à 0 quand le joueur ou quelqu'un d'autre vient de mettre le pied sur la lave.

Voir le messageMordicus, le 12.01.2006 à 20:57, dit :

Question accessoire: il aurait été bien qu'avec ce nouveau son (quand il marchera...) que je puisse rajouter l'effet "lueurs rouges" (celui que l'on peut voir lorsqu'on se noye, le bord de l'écran devant alors rouge et clignotant, comme pour simuler l'agonie...). Est-ce que c'est scriptable ?

Pas à ma connaissance.

Voir le messageMordicus, le 12.01.2006 à 20:57, dit :

Question un peu à part: Est-ce qu'il serait possible de faire un script détectant le niveau d'un ennemi/monstre qui attaque et de le comparer à celui du joueur ?

Hélas, non. Pas moyen de travailler sur des références ou des pointeurs...

Bon, en pratique, si c'est possible. Mais au lieu de faire un script global, il faut faire des script locaux collés sur chaque ennemi ou monstre. Ce qui implique donc de modifier des tas de scripts préexistants pour rajouter la portion de code concernée. L'horreur.

Modifié par Angora, 12 janvier 2006 - 21:36.

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.

#23 MysticalShadow

MysticalShadow

Posté 12 janvier 2006 - 21:46

Je ne comprends même pas pourquoi le script d'Abo pouvait marcher, à cause de l'erreur de variable. Son premier script comporte quelques petites erreurs. Je pense que ceci devrait être plus efficace:

BEGIN Detection_Chute

float PJPosZ_encours
float PJPosZ_prev
float chute

if ( MenuMode == 1 )
	Return
endif

if ( Player->GetEffect sEffectLevitate == 1 )
	Return
endif


Set PJPosZ_encours to ( Player->GetPos, Z )

if ( chute > 0 )		; test pour savoir si on est blessé lors de l'aterrissage.
	if ( ( PJPosZ_prev - PJPosZ_encours ) <= 5 )
		if ( GetInterior == 0 )			, tests poru savoir si le PJ chute dans de l'eau.
			if ( PJPosZ_encours < 0 )
				Set chute to 0
			endif
		else
			if ( PJPosZ_encours <= GetWaterLevel )
				Set chute to 0
			endif
		endif
		if ( chute >= 90 )
			Player->PlaySound3D "Critical Fall"
		elseif ( chute >= 60 )
			Player->PlaySound3D "WolfHit2"
		elseif ( chute >= 30 )
			player->PlaySound3D "Body Fall Medium"
		endif
	endif

	Set chute to 0
endif

if ( Player->GetSoundPlaying "Health Damage" == 1 )
	Set chute to ( PJPosZ_prev - PJPosZ_encours )
	MessageBox "delta Z per frame %f" chute 
endif

Set PJPosZ_prev to PJPosZ_encours

END
Il devrait différencier les coups pris des blessures de l'atterissage, mais le bruit de la blessure n'est pas arrêté.
Reste à trouver un moyen de détecter le fait que le PJ soit dans l'eau. Il y a-t-il une fonction adéquate?

Quant au script lava, j'ai oublié de déclarer la variable float timer, désolé. :green: De toute facon mon script n'empêchait pas le bruit de blessure d'être joué, et ce n'est pas ce qui est souhaité.

Modifié par MysticalShadow, 14 janvier 2006 - 18:08.


#24 Fandorn Delavie

Fandorn Delavie

    Défilé de mods


Posté 12 janvier 2006 - 21:54

Il est seulement possible de detecter le fait d'etre sous l'eau en cell exterieur.

A l'interieur l'axe Z est faussé

Si Dehors & Z<0 alors on est sous l'eau

sinon y'a un truc mais je ne suis pas sur !

quand on tombe sous l'eau, on n'a pas le temps de prendre sa respiration ( a verifier )
donc on se noie ... et un son special est jouer.
Modules bêta sur True Morrowind en attendant d'être sur wiwiland... Deja des millions de téléchargements :)

#25 MysticalShadow

MysticalShadow

Posté 12 janvier 2006 - 21:56

Merci de l'info! En intérieur, on pourrait peut être utiliser la fonction GetWaterLevel, mais est-ce qu'il se peut que le PJ fasse une chute en dessous du niveau de l'eau? (si il y a des aquariums ou autres plans aquatiques du genre).




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

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