Page 1 sur 1

[SCRIPT] Assister à un duel

Posté : ven. 20 nov. 2015, 23:56
par Cocrane
Le groupe du charname pourra assister à des duels.

Dans ce cas, je désire qu'il:
- qu'il regarde bien sagement le combat.
- que le combat s'arrête à un certain niveau de blessure (test via HPPercentLT)
- que le commentaire de la foule varie selon l'adversaire qui prend le dessus. ( affichage via Displaystringhead)
- que selon l'issue du combat, l'annonce du résultat et de ses conséquences puisse varier.

Je pensais utiliser une CUTSCENE mais je n'obtiens pas le résultat souhaité:
- le combat se termine lorsqu'il y a un mort et ma CUTSCENE est toujours active.
> les blocs des scripts liés au test du combat et de la santé des duellistes qu'ils soient dans le fichier baf CUTSCENE ou dans l'AREA ou des combattants n'interviennent pas pour stopper le combat.

Je ne suis pas sur finalement que la cutscene soit la solution à utiliser.

En plan B, je pense désactiver les PNJ via DEACTIVATE ou les mettre dans un état de paralysie sans afficher l'icone.

Quel est votre point de vue?

Posté : sam. 21 nov. 2015, 01:16
par Freddy_Gwendo
As-tu utilisé l'action ClearAllActions() ?

Si oui, elle désactive les scripts des créatures... :gign:

Posté : sam. 21 nov. 2015, 12:13
par Cocrane
Je ne comprends pas le rapport.

Le but est que les PNJ soient spectateurs.

Posté : sam. 21 nov. 2015, 18:28
par Freddy_Gwendo
Cocrane a écrit :Le groupe du charname pourra assister à des duels.

Dans ce cas, je désire qu'il:
- qu'il regarde bien sagement le combat.
- que le combat s'arrête à un certain niveau de blessure (test via HPPercentLT)
- que le commentaire de la foule varie selon l'adversaire qui prend le dessus. ( affichage via Displaystringhead)
- que selon l'issue du combat, l'annonce du résultat et de ses conséquences puisse varier.

Je pensais utiliser une CUTSCENE mais je n'obtiens pas le résultat souhaité:
- le combat se termine lorsqu'il y a un mort et ma CUTSCENE est toujours active.
> les blocs des scripts liés au test du combat et de la santé des duellistes qu'ils soient dans le fichier baf CUTSCENE ou dans l'AREA ou des combattants n'interviennent pas pour stopper le combat.

Je ne suis pas sur finalement que la cutscene soit la solution à utiliser.

En plan B, je pense désactiver les PNJ via DEACTIVATE ou les mettre dans un état de paralysie sans afficher l'icone.

Quel est votre point de vue?
La fonction ClearAllAction() désactive les scripts hors cutscene, d'où la possibilité de ne pas prendre en compte les tests sur les PV.

Posté : sam. 21 nov. 2015, 18:37
par Kev
As tu essayé d'arrêter la cutscene avec un dialogue? ActionOverride("credlg",StartDialogueNoSet("credlg2")) à la place de EndCutSceneMode()?
Tu peux aussi essayé de faire plusieurs scènes en une seule, par exemple:

IF
True()
THEN
RESPONSE#100
CutSceneID("cre1")
Attack("cre2")
END

IF
True()
THEN
RESPONSE#100
CutSceneID("cre2")
Attack("cre1")
END

IF
HPPercentLT("cre1",30)
THEN
RESPONSE#100
CutSceneID("cre1")
StartCutScene("next1")

IF
HPPercentLT("cre2",30)
THEN
RESPONSE#100
CutSceneID("cre2")
StartCutScene("next2")

//dans le script de la cutscene "next1"

IF
True()
THEN
RESPONSE #100
CutSceneID("cre1")
ActionOverride("cre2",StartDialogueNoSet("cre1"))

//dans le script de la cutscene "next2"

IF
True()
THEN
RESPONSE #100
CutSceneID("cre2")
ActionOverride("cre1",StartDialogueNoSet("cre2"))

Ce genre de passe-passe a tendance à marcher pour moi.

Edit: il y'a aussi ce que Freddy dit sur ClearAllAction(). Personellement, j'ai tendance à ne pas m'en servir dans la cutscene elle même.

Posté : dim. 22 nov. 2015, 17:48
par Cocrane
J'ai l'impression qu'on ne se comprend pas.

Je veux déclencher un combat où:
- le groupe n'intervient pas
- la réaction de la foule varie selon le déroulement du combat
- la fin est programmée lorsqu' un combattant atteint un certain degré de blessure.

J'ai pensé au cutscène pour mettre le groupe de coté. Mais mon duel lorsque je le teste, se transforme en un combat à mort que je ne veux pas. Le test de blessure n'est pas pris en compte, qu'il soit dans le code du BAF de la custcène ou dans l'AREA ou le BAF d'un des deux CRE combattants.

Donc je ne vois pas l'utilité d'un CLEARALLACTIONS.

1-Déclenchement de la CUTSCENE via un dialogue
IF ~~ THEN BEGIN 0
SAY @1 /* ~Kurgan seigneur de la hache de la maison d'Ulbrock accepte le duel d'Altair d'Argol.

Une blessure grave et le duel est remporté. Le vainqueur partira avec une hache et une épée!

Le peuple de Baldur en est témoin. Faites place le duel va commencer!~ */

IF ~~ THEN
REPLY @2 /* ~(ne rien dire)~ */
DO ~SETGLOBAL("DUEL_ALTAIR_KURGAN","GLOBAL",2)
StartCutSceneMode()
StartCutScene("CSALTA1")~ // Cutscene duel Altair vs Kurgan
EXIT

IF ~~ THEN
REPLY @3 /* ~Je suis le Protecteur de Baldur et il n'y aura pas de duel! Dispersez vous!~ */
GOTO 1

IF ~~ THEN
REPLY @4 /* ~Je suis le Protecteur de Baldur et je défie en duel le vainqueur.~ */
DO ~SETGLOBAL("DUEL_ALTAIR_Protecteur","GLOBAL",1)
SETGLOBAL("DUEL_ALTAIR_KURGAN","GLOBAL",2)
StartCutSceneMode()
StartCutScene("CSALTA1")~ // Cutscene duel Altair vs Kurgan
EXIT
END
"



2- Contenu du fichier CUSTCENE CSALTA1.BAF
"
IF
True()
THEN
RESPONSE #100
CutSceneId("KURGAP")
wait(1)
FadeTOColor([20.0],0)
Wait(1)
// placement de la foule et du groupe Charname
Wait(1)
MultiPlayerSync()
Wait(1)
FadeFromColor([20.0],0)

// déclenchement du combat entre Kurgan et Altair: fin lorsqu'il y a un blessé grave
ActionOverride("ALTAIP",Attack("KURGAP")
ActionOverride("KURGAP",Attack("ALTAIP")
END
"

3- Script testant l'état de Kurgan (par exemple)
"
// Si DUEL ALTAIR vs KURGAN: Duel gagné par Altair
IF
GLOBAL("DUEL_ALTAIR_KURGAN","GLOBAL",2) // Duel commencé
HPPercentLT("KURGAP",50) // Points de vie inférieur à 50%
THEN
RESPONSE #100
SETGLOBAL("DUEL_ALTAIR_KURGAN","GLOBAL",3) // Duel gagné par Altair

EndCutSceneMode() // Arrêt du duel
CLEARALLACTIONS()

ACTIONOVERRIDE("SILVIP",StartDialogueNoSet(PROTAGONIST))
END
"
Ce script n'intervient pas alors que Kurgan est blessé gravement.

Posté : sam. 28 nov. 2015, 10:14
par Isaya
A ma connaissance, les "cutscene" coupent complètement la gestion normale des scripts. Leur forme d'écriture-même ne respecte pas la forme normale et leur prise en compte par le moteur ne respectent pas le principe général des scripts (bloc exécuté de manière séquentielle, alors qu'ils le sont en parallèle dans les cutscene). C'est pour cela que tu peux faire agir plusieurs acteurs d'un script en parallèle, alors que le bloc principal n'est pas achevé.
Ces scènes sont toujours intégralement scriptées. Tout est réalisé par des enchainements dans le premier IF du script. La conséquence directe est que tu ne peux pas introduire le moindre test permettant de récupérer une variable t'informant que le combat est terminé et que c'est untel qui l'a remporté.
Si tu veux introduire un élément aléatoire sur l'issue du combat, il te faudra créer deux scènes, selon qui l'emporte, et créer un troisième script, qui va lancer la scène, en faisant un tirage aléatoire pour décider qui va gagner puis lancer la scène correspondante.

Posté : sam. 28 nov. 2015, 11:20
par Cocrane
Oui, j'ai finalement noté que me mod custcène changeait les règles de gestion des scripts. Je pense que si je tiens à traiter des issues différentes comme le proposait Kev aussi, il va falloir lancer plusieurs cutscènes successives.

J'ai noté des mots clés dans le IEDSP:
"
338 SetCutSceneLite(I:BOOL*BOOLEAN)
338 CutAllowScripts(I:BOOL*BOOLEAN)
338 SetCursorState(I:BOOL*BOOLEAN)
This action starts a cutscene. Player control is removed, though all scripts keep running. Note that actions already in the action list are not cleared without an explicit call to ClearAllActions. The example script is from are0507.bcs.
"

Ca donne l'impression que l'on peut activer les scripts pendant une cutscène. Je n'ai pas noté d'exemples dans les mods que je t"ai téléchargé.

Posté : sam. 28 nov. 2015, 11:40
par Freddy_Gwendo
De mémoire, j'ai utilisé 338 SetCutSceneLite(I:BOOL*BOOLEAN) dans un vieux script et ça fonctionnait parfaitement.
Je ne l'ai pas encore retrouvé, raison pour laquelle je ne t'ai pas mentionné cette commande. Avec un exemple, c'est toujours mieux. ;)

Posté : sam. 28 nov. 2015, 16:56
par Isaya
Cocrane a écrit :Je n'ai pas noté d'exemples dans les mods que je t"ai téléchargé.
Pas besoin de chercher des mods. Tu as des exemples dans Throne of Bhaal, en particulier, semble-t-il, dans la Tour de Garde, lorsque tu guides le guerrier dans une sorte d'aventure dont vous êtes le héros.

Posté : sam. 28 nov. 2015, 23:32
par Cocrane
J'ai DL tous les fichiers CUT*.BCS disponibles via BGT qui contiennent des cutscènes.

J'ai trouvé aucun des 3 mots clés possibles. J'en déduis que leur utilisation se fait en dehors du .BAF du CUTSCENE.

Le soucis c'est que ma dernière partie date. La tour de garde ce n'est pas l'extension BG1?

En gros, si quelqu'un a une piste.

Je vais essayer de faire un test sans.

Posté : dim. 29 nov. 2015, 00:08
par Cocrane
"
...
IF ~~ THEN
REPLY @2 /* ~(ne rien dire)~ */
DO ~SETGLOBAL("DUEL_ALTAIR_KURGAN","GLOBAL",2)
StartCutSceneMode()
CutAllowScripts(0)
StartCutScene("CSALTA1")~ // Cutscene duel Altair vs Kurgan
EXIT
...
"

Le dialogue fonctionne sans CutAllowScripts(0). Sinon j'ai un plantage à la compiliation:
"
[CutAllowScripts] not found in ACTION.IDS
WARNING: cannot verify action ~SETGLOBAL("DUEL_ALTAIR_KURGAN","GLOBAL",2)
StartCutSceneMode()
CutAllowScripts(0)
StartCutScene("CSALTA1")~: Parsing.Parse_error
"

Je suppose que mon installation BGT est incomplète.

Posté : dim. 29 nov. 2015, 04:55
par Freddy_Gwendo
La séquence à laquelle fait référence Isaya est gérée par un dialogue qui te permet de choisir les actions de ton guerrier éthéré. Je l'ai étudié il y a très, très longtemps... Et je m'en étais inspiré pour pondre le script que j'ai mentionné.
Je l'avais abandonné pour des raisons de scénar, mais il doit se trouver quelque part dans mes très anciennes sauvegardes. Dès que je mets la main dessus, je te le poste.


Quant au tien, utilise SetCutSceneLite(I:BOOL*BOOLEAN), ça fonctionne. Je n'ai jamais rencontré CutAllowScripts().

Dernière chose, vérifie que le fichier ACTION.ids contient bien la ligne SetCutSceneLite(I:BOOL*BOOLEAN). ;)

Posté : dim. 29 nov. 2015, 10:35
par Isaya
Toutes les cutscene ne se trouvent pas dans un script nommé CUTxxxx.BCS, les scripts peuvent porter d'autres noms. Il te suffit de faire une recherche de texte dans tous les fichiers BCS à partir de Near Infinity pour les identifier (Search, Text Search, BCS).
Commence par ouvrir le fichier ACTION.IDS de ToB patché, il contient SetCursorState(I:BOOL*BOOLEAN) et SetCutSceneLite(I:BOOL*BOOLEAN) pour la valeur 338. Utilise un des deux noms pour chercher, cela suffira.
Les scripts auxquels je faisais référence sont SCUT01.BCS et SCUT14.BCS. L'action sert aussi à l'affichage des biographies à la fin de ToB, mais je ne vois pas bien ce que cela pourrait apporter comme information pour ton usage.

Posté : dim. 29 nov. 2015, 10:36
par Cocrane
Le message WEIDU est cohérant. Le mot clé est manquant dans le fichier ACTION.IDS.

De même pour SetCutSceneLite(I:BOOL*BOOLEAN). J'ai 324 mots clés dans le fichier et il se termine par:

322 FakeEffectExpiryCheck(O:Object*,I:Ticks*)
323 CreateCreatureImpassableAllowOverlap(S:NewObject*,P:Location*,I:Face*)
324 SetBeenInPartyFlags()

Posté : dim. 29 nov. 2015, 11:45
par Freddy_Gwendo
Bizarre, bizarre...
Questions stupides :

1. As-tu installé ToB ?
2. As-tu installé le BG2 Fixpack ?

Il me semble que tu as déjà eu des problèmes identiques avec des compteurs gtimes qui n'existaient pas dans ton installation.

Sinon, rajoute ce code au début de ton tp2 :

Code : Tout sélectionner

APPEND ~ACTION.IDS~ ~338 SetCutSceneLite(I:BOOL*BOOLEAN)~
             UNLESS ~338 SetCutSceneLite(I:BOOL\*BOOLEAN)~

Édit :


Quant à la ligne WARNING: cannot verify action ~SETGLOBAL("DUEL_ALTAIR_KURGAN","GLOBAL",2)

Fais attention à la casse des commandes : les dialogues préfèrent SetGlobal. Utilise la bonne casse des actions, ça t'évitera des désagréments.

Posté : dim. 29 nov. 2015, 16:20
par Cocrane
Je pense que dans ma dernière installation BGT, je n'ai pas installé le FIXPACK.

Comment rattraper le coup de manière exhaustive sans mettre le bazar dans l'installation?

Ok pour la casse, j'ignorai que c'était problématique pour le contenu d'un DO.

Par contre, j'avais noté que 'do' en minuscule faisait râler WEIDU. ^^

Posté : dim. 29 nov. 2015, 16:50
par Freddy_Gwendo
Cocrane a écrit :Je pense que dans ma dernière installation BGT, je n'ai pas installé le FIXPACK.

Comment rattraper le coup de manière exhaustive sans mettre le bazar dans l'installation?
Va dans le répertoire lib du Fixpack et consulte les fichiers ids_xxxx.tph et tob2soa.tph.
Copie ceux qui t'intéressent dans un sous-répertoire lib de ton mod, puis lance le nombre de commandes INCLUDE nécessaires au début de ton tp2 :

INCLUDE ~TonMod/lib/nom_du_fichier.tph~

Comme ça, tu bénéficieras des fichiers ids patchés. ;)

Posté : dim. 29 nov. 2015, 20:13
par Isaya
Cocrane a écrit :Je pense que dans ma dernière installation BGT, je n'ai pas installé le FIXPACK.
Cela n'a strictement rien à voir. Comme je l'ai déjà écrit, ces actions apparaissent dans une installation de base de ToB + patch. L'installation du fixpack ne modifie le fichier que pour ajouter plusieurs lignes à la fin (352 à 358 et une variante de 147).

Le contenu que tu évoques (les 3 dernières lignes) correspond à un BG II sans ToB. Je dirais que tu as une installation bien pourrie dans ces conditions. Si tu as d'une façon ou d'une autre écrasé ce fichier IDS, peut-être d'autres ont-ils aussi souffert. Je pense que tu aurais plus qu'intérêt à réinstaller proprement.
Les fichiers que Freddy te conseille d'utiliser ne corrigeront en rien ton fichier ACTION.IDS pour les actions manquantes par rapport au patch officiel, en particulier celles que tu cherches à utiliser.

Le fixpack corrige des choses par rapport au patch officiel. Il ne corrigera pas ton installation incorrecte vis à vis du patch officiel.

Posté : dim. 29 nov. 2015, 21:58
par Cocrane
Au moins les choses sont claires, j'ai une installation de merde voir un brun "pourrie" et il est urgent que je fasse une réinstallation. ^^