Oyez, oyez !

Les résultats du vote sur les meilleurs RPG de tous les temps sont désormais dévoilés dans ce message !

Merci à toutes et à tous pour votre participation !

N'hésitez pas à aller commenter, ajouter des jeux auxquels vous n'auriez pas pensé...

[DIAMANT] Programmation (WeiDU et autres)

Pourquoi les Ordres de Paladins ne comportent-ils que des hommes ? Et si tout ceci n'était qu'une fable racontée par les mâles pour dissimuler la vérité ? Ce mod tente de rétablir la vérité, du moins SA vérité...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne

[DIAMANT] Programmation (WeiDU et autres)

.

Message par Freddy_Gwendo »

Programmation.



Cette rubrique est dédiée aux divers problèmes de programmation rencontrés (WeiDU, bat...).


Réglé :

  • Réassigner des N° de cartes dans le fichier Wed via WeiDU : [POST=280838]ici[/POST].
  • Modifier automatiquement la position des frames dans un fichier .bam avec WeiDU : [POST=302865]ici[/POST] et [POST=303060]un script là[/POST].


En cours :

  • Intégration de Infinity Animations dans le setup.tp2.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Je suis en train de passer en revue mes 300 et quelques cartes. Certaines ne bougeront pas, quelques-unes seront à modifier, d'autres à refaire, et une grosse vingtaine à créer !
Pour l'instant, elles sont numérotées GW0001, GW0002.... Mais je souhaite en modifier l'ordre.
Est-il possible de les renommer en utilisant WeiDU pour modifier les champs Tileset (0x0024) du fichier .wed et Wed (0x0008) du fichier .are ?

Je l'ai déjà fait pour le champ Script (0x0094) du fichier .are, mais je ne sais pas si ça fonctionne dans ce cas.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

Tu parles de renommer, le terme est peut-être confus. Je suppose que tu as renommé tous les fichiers (ARE, WED, TIS, script) et que tu veux pouvoir éviter d'ouvrir le fichier ARE pour changer les noms à l'intérieur. Dans ce cas, tu peux le faire pour tout, pas uniquement pour les scripts.
COPY ~mod/areas/GWxxxx.ARE~ ~override~
WRITE_ASCII 0x008 ~GWxxxx~ #8
WRITE_ASCII 0x094 ~GWxxxx~ #8

Pour le fichier TIS, il faut modifier le fichier WED. Mais la structure du fichier suppose qu'il puisse y avoir plusieurs overlays, et c'est un overlay qui pointe sur un fichier TIS. Aussi le code n'est pas aussi simple. Il faut lire l'offset de départ des overlays pour calculer l'adresse à modifier. Si tu n'as qu'un seul overlay ou si tous pointent sur le même fichier TIS, tu peux ensuite forcer le nom du fichier TIS par un WRITE_ASCII avec une adresse calculée.
Ce qui donnerait un truc comme ça (non testé) :

Code : Tout sélectionner

COPY ~mod/areas/GWxxxx.WED~ ~override~
  PATCH_IF ("%SOURCE_SIZE%" > "0x4c") BEGIN // Au moins Header + Secondary Header + 1 Overlay
    READ_LONG 0x008 ~nombreoverlays~
    READ_LONG 0x010 ~offsetoverlays~
    WHILE ("%nombreoverlays%" > 0) BEGIN
      // 0x18 = taille d'un overlay, 0x04 offset pour atteindre "Name of tileset" dans la structure Overlay 
      WRITE_ASCII  ("%offsetoverlays%" + ("%nombreoverlays%" - 1) * 0x18 + 0x04) ~GWxxxx~ #8
      SET "nombreoverlays" = ("%nombreoverlays%" - 1)
    END
  END
  BUT_ONLY_IF_IT_CHANGES
Si tu n'as qu'un seul Overlay et qu'il est placé juste après le Header, le calcul peut donner le 0x24 dont tu parlais.
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Merci.
En fait :

  • N'étant pas responsable de la BCE, l'inflation ne me fait pas peur et le nombre de mes cartes a considérablement augmenté !
  • Du coup, dorénavant, tu peux passer de la zone GW0029 à la zone GW0159 par exemple.
  • Dans un souci de cohérence de programmation (notamment des scripts relatifs aux cartes), ça devient un peu pénible à gérer au niveau des variables.
    Tous les scripts concernant les cartes sont générés de cette manière : GWxxxxYY avec GWxxxx correspondant à la carte et YY au type de script (Me = gestion des messages d'information disponibles à la souris et des éventuelles variables qu'ils contrôlent. PO ou TP = script de téléportation par un portail. DG = "forçage" de dialogues. Etc...). Sans compter le script de base de la carte GWxxxx.bcs.
Bref, lorsque je modifie le nom d'une carte, il faut que je modifie le nom de tas de fichiers et de variables : dans l'exemple précédent, GW0159 devient GW0030. Du coup, GW0030 et les suivantes sont aussi modifiées...

Renommer les fichiers est assez simple, pour peu que l'on prenne son temps et qu'on le gère dans un autre répertoire pour éviter les "erreurs d'étourderies".
Changer toutes les occurences GW0159 en GW0030 dans les scripts et dans le fichier GW0029.are est aussi très simple.

En revanche, ma question concernait essentiellement le fichier wed dont la structure est bien différente.

En l'état, j'ai le choix entre deux possibilités :

  1. Ouvrir mes cartes dans IETME et les sauvegarder sous un autre nom.
  2. Utiliser une procédure automatique via WeiDU, vérifier le résultat, puis copier-coller l'ensemble des fichiers des cartes concernés dans le répertoire source.
Si la solution 1 semble la plus simple, elle n'est pas aussi évidente qu'il n'y paraît.
En effet, elle est parfaite lorsque la structure de la carte est simple (c-a-d avec un fichier tis basique : un seul overlay et pas de portes). En revanche, pour peu que tu insères des overlays et des portes, alors tu as de grandes chances pour que DLTCEP et IETME s'emmêlent les pinceaux. Et comme DLTCEP est l'outil le plus pratique pour gérer les portes et toutes les composantes des cartes (triggers, spawns, conteners....), ça peut rapidement devenir "buggy".
D'ailleurs, lorsque tu ouvres dans DLTCEP une carte sauvegardée dans IETME, il semble que DLTCEP réorganise un petit peu le fichier wed. Je ne sais pas pourquoi, comment, et encore moins le pourquoi du comment, mais c'est systématique.

Bref. C'est la raison pour laquelle je préfère conserver mes cartes actuelles qui fonctionnent.

Après vérification sur plusieurs cartes - et je ne pense pas que ça soit différent sur les autres -, le premier overlay est celui de la carte (GWxxxx), les autres concernent des fichiers de Tileset (WTLAVA et consort). Comme ces derniers ne sont pas à modifier, je pense que je peux me contenter de modifier le 0x24.

Exemple d'une carte comprenant 2 overlays et plusieurs portes :
► Afficher le texte
Je testerai donc ton code avec plusieurs types de cartes (portes, sans portes, 1, 2, 3, 4 overlays) lorsque j'en aurai terminé avec mes modifs et te tiendrai au courant.

Merci.

PS : Plus j'avance dans la vérification-modification des différents aspects du mod, plus je m'aperçois que WeiDU a considérablement évolué depuis la version 185 (celle que j'avais utilisée à l'époque). Je pense donc que cette rubrique va surchauffer au fil du temps !
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

Je t'incite à faire attention lorsque tu utilises des offsets de patchs qui ne sont pas dans la structure fixe du début du fichier. En effet, si DLTCEP décide de réagencer le contenu, c'est parce que tous les éditeurs n'enregistrent pas forcément les données dans le même ordre dès lors qu'elles sont enregistrées à partir d'un offset indiqué dans la partie header.
Le 0x24 entre justement dans cette catégorie. Il y a un offset "Overlay" qui indique effectivement que les overlays commencent à 0x20, mais ce n'est pas une garantie de c'est toujours comme ça, même si un éditeur donné devrait être homogène dans sa façon de travailler.
Tu peux aisément compléter le code pour vérifier que tu ne toucheras que les overlays possédant un tileset propre à ton mod (code pas davantage testé) :

Code : Tout sélectionner

COPY ~mod/areas/GWxxxx.WED~ ~override~
  PATCH_IF ("%SOURCE_SIZE%" > "0x4c") THEN BEGIN // Au moins Header + Secondary Header + 1 Overlay
    READ_LONG 0x008 ~nombreoverlays~
    READ_LONG 0x010 ~offsetoverlays~
    WHILE ("%nombreoverlays%" > 0) BEGIN
      READ_ASCII ("%offsetoverlays%" + ("%nombreoverlays%" - 1) * 0x18 + 0x04) ~tileset~
      // Remplace seulement si le tileset suivait la forme GWxxxx
      PATCH_IF ("%tileset%" STRING_MATCHES_REGEXP "GW[0-9]+[A-Z]*") = 0 THEN BEGIN  // GW, suivi d'au moins 1 chiffre, et éventuellement de lettres
        // 0x18 = taille d'un overlay, 0x04 offset pour atteindre "Name of tileset" dans la structure Overlay 
        WRITE_ASCII  ("%offsetoverlays%" + ("%nombreoverlays%" - 1) * 0x18 + 0x04) ~GWxxxx~ #8
      END
      SET "nombreoverlays" = ("%nombreoverlays%" - 1)
    END
  END
  BUT_ONLY_IF_IT_CHANGES
Au fait, dans le code précédent il manquait un THEN avant le BEGIN de PATCH_IF.

WeiDU a considérablement évolué depuis la version 185, en effet. Les macros, fonctions et les nombreuses commandes complexes introduites facilitent désormais la manipulation des structures les plus complexes. Il est tout à fait possible qu'il y ait des façons moins "old school" de faire ce que j'ai écrit ci-dessus.
Si la taille de l'exécutable n'est pas presque 10 fois plus importante qu'à l'époque, c'est parce que le programme est désormais compressé. C'est d'ailleurs l'usage de cette compression qui provoque les faux positifs des antivirus vis à vis du setup-xxx.exe de certains mods.
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

WeiDU a considérablement évolué depuis la version 185, en effet. Les macros, fonctions et les nombreuses commandes complexes introduites facilitent désormais la manipulation des structures les plus complexes. Il est tout à fait possible qu'il y ait des façons moins "old school" de faire ce que j'ai écrit ci-dessus.
Si la taille de l'exécutable n'est pas presque 10 fois plus importante qu'à l'époque, c'est parce que le programme est désormais compressé. C'est d'ailleurs l'usage de cette compression qui provoque les faux positifs des antivirus vis à vis du setup-xxx.exe de certains mods.
Sans compter les librairies : quel bonheur de pouvoir alléger le tp2 de centaines de lignes de codes (modif. des ids et compagnie), de s'épargner la longue liste des COPY *.itm et *.cre SAY NAME et cie, et de ne se concentrer que sur les opérations plus complexes...

Quant aux méthodes "old school", si elles fonctionnent, pourquoi s'en priver ? Après tout, n'est-ce pas dans les vieilles marmittes qu'on ... ?
Au fait, dans le code précédent il manquait un THEN avant le BEGIN de PATCH_IF.
J'avais remarqué car même si je ne suis pas programmateur, il me reste encore quelques notions sur les boucles IF THEN ELSE...

Cependant, je vais me documenter sur l'hexa que je n'ai jamais pratiqué. Jusqu'à présent, je me contentai d'aller lire la structure des fichiers avec un plug-in pour TotalCommander pour savoir quel offset sélectionner, puis de le modifier à partir de la docu d'IESDP sur les structures de fichiers afin de savoir quel WRITE utiliser (ASCII plutôt simple, LONG, SHORT et BYTE plus compliqués mais finalement assez logiques avec l'expérience). Bref, je n'ai aucun pb pour modifier les offsets si je les prends un par un. En revanche, pour les utiliser dans des boucles et des conditions (je pense notamment au renseignement de certaines variables dans des fichiers de sorts), là je vais devoir bosser.

C'est une chose d'étudier les tp2 des mods déjà existant, c'en est une autre de tout comprendre !
Et je ne parle même pas des procédures d'ajout automatique de headers ou d'effets dans ces mêmes fichiers !

D'ailleurs, je pense que je te solliciterai à nouveau dans un autre épisode quand je m'attaquerai à la vérification de mes sorts...
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

:thank_you: Encore un grand merci à Isaya, le script fonctionne nickel : quel gain de temps !
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Avant que je ne me tape tous les readme des mods dispo, quelqu'un aurait-il la liste des mods (ou au moins quelques-uns) qui implantent Infinity Animations comme composant ? J'en ai besoin pour implanter mes nouvelles animations.

Et puis, si le codage a déjà été fait, ça me ferait gagner du temps et surtout m'éviterait des galères inévitables et imprévisibles...

Merci d'avance...
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Salomon Kane
Loup effrayant
Messages : 742
Enregistré le : sam. 12 juil. 2008, 11:28
Statut : Hors ligne
.

Message par Salomon Kane »

Liste des Mods & Slots d'Animations Utilisées
Infinity Animation

la liste des mods (ou au moins quelques-uns) qui implantent Infinity Animations comme composant ?
Tiens mon Gwendo, j'avais ça sous la main, et en cherchant des infos sur les limites du Moteur j'en ai trouvé un autre recemment ... :


Animation Changes in Baldur’s Gate mods, and Infinity Animation codes.

http://www.arksark.org/blog/guides/anim ... gate-mods/

Autre Source :
http://www.regula.ws/files/KD/ANIMATION_ID.htm

Source :
Merci à deratiseur :
http://weiducommando.forumsactifs.com/t625-anim-rajouter-une-animation-de-creature#8846P.S :
Listes peut être à actualiser, mais ça donne un ordre d'idée ...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Merci pour ces listes mais elles concernent les compatibilités des animations entre mods. Je les avais déjà sous une autre forme.

Cela dit, j'ai trouvé mon bonheur dans le Packmule et dans Vecna qui installent Infinity Animations comme pré-requis.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Je souhaite laisser le choix à l'utilisateur d'installer tout ou partie de 12 animations de créatures (en fait 4 groupes de 3).

En utilisant les sous-composants, j'ai codé ceci qui fonctionne (j'ai indiqué la signification des variables @nn pour plus de clarté) :

Code : Tout sélectionner

BEGIN @21 = ~Installer tous les Magiciens Doom Knights specialistes~ 
SUBCOMPONENT @20 = ~Magiciens Doom Knights~

Liste de commandes...


BEGIN @22 = ~Installer les Magiciens Doom Knights avec aura de Froid~ 
SUBCOMPONENT @20 = ~Magiciens Doom Knights~

PRINT @32 = ~Quels magiciens Doom Knights souhaitez-vous installer ?

1. Installer tous les magiciens Doom Knights avec aura de Froid.
2. Installer Uniquement le Magicien Doom Knight avec auras de Froid et de Feu.
3. Installer Uniquement le Magicien Doom Knight avec auras de Froid et de Poison.
4. Installer Uniquement le Magicien Doom Knight avec aura de Froid et aura malefique.

VEUILLEZ TAPER 1, 2, 3 ou 4.~


ACTION_READLN MageFd
OUTER_WHILE !(IS_AN_INT %MageFd%) || (%MageFd% > 4) || (%MageFd% < 1) BEGIN
 PRINT @32
 ACTION_READLN MageFd
END

ACTION_IF (%MageFd% = 1) THEN BEGIN
APPEND ~animate.ids~ ~0x52E0 DOOM_KNIGHT_MAGE_COLD_FIRE_D2~ UNLESS ~^0x52[Ee]0~
APPEND ~anisnd.ids~ ~0x52E0 µGH      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_COLD_FIRE_D2~ UNLESS ~^0x52[Ee]0~
APPEND ~animate.ids~ ~0x52E1 DOOM_KNIGHT_MAGE_COLD_POISON_D2~ UNLESS ~^0x52[Ee]1~
APPEND ~anisnd.ids~ ~0x52E1 µGI      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_COLD_POISON_D2~ UNLESS ~^0x52[Ee]1~
APPEND ~animate.ids~ ~0x52E2 DOOM_KNIGHT_MAGE_COLD_UNHOLY_D2~ UNLESS ~^0x52[Ee]2~
APPEND ~anisnd.ids~ ~0x52E2 µGJ      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_COLD_UNHOLY_D2~ UNLESS ~^0x52[Ee]2~
COPY ~GWTest02/UM/MGKFdFeu~ ~override~
COPY ~GWTest02/UM/MGKFdPsn~ ~override~
COPY ~GWTest02/UM/MGKFdUnh~ ~override~
END

ACTION_IF (%MageFd% = 2) THEN BEGIN
APPEND ~animate.ids~ ~0x52E0 DOOM_KNIGHT_MAGE_COLD_FIRE_D2~ UNLESS ~^0x52[Ee]0~
APPEND ~anisnd.ids~ ~0x52E0 µGH      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_COLD_FIRE_D2~ UNLESS ~^0x52[Ee]0~
COPY ~GWTest02/UM/MGKFdFeu~ ~override~
END

ACTION_IF (%MageFd% = 3) THEN BEGIN
APPEND ~animate.ids~ ~0x52E1 DOOM_KNIGHT_MAGE_COLD_POISON_D2~ UNLESS ~^0x52[Ee]1~
APPEND ~anisnd.ids~ ~0x52E1 µGI      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_COLD_POISON_D2~ UNLESS ~^0x52[Ee]1~
COPY ~GWTest02/UM/MGKFdPsn~ ~override~
END

ACTION_IF (%MageFd% = 4) THEN BEGIN
APPEND ~animate.ids~ ~0x52E2 DOOM_KNIGHT_MAGE_COLD_UNHOLY_D2~ UNLESS ~^0x52[Ee]2~
APPEND ~anisnd.ids~ ~0x52E2 µGJ      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_COLD_UNHOLY_D2~ UNLESS ~^0x52[Ee]2~
COPY ~GWTest02/UM/MGKFdUnh~ ~override~
END


BEGIN @23 = ~Installer les Magiciens Doom Knights avec aura de Feu~ 
SUBCOMPONENT @20 = ~Magiciens Doom Knight~

PRINT @33 = ~Quels magiciens Doom Knights souhaitez-vous installer ?

1. Installer tous les magiciens Doom Knights avec aura de Feu.
2. Installer Uniquement le Magicien Doom Knight avec auras de Feu et de Froid.
3. Installer Uniquement le Magicien Doom Knight avec auras de Feu et de Poison.
4. Installer Uniquement le Magicien Doom Knight avec aura de Feu et aura malefique.

VEUILLEZ TAPER 1, 2, 3 ou 4.~

ACTION_READLN MageFeu
OUTER_WHILE !(IS_AN_INT %MageFeu%) || (%MageFd% > 4) || (%MageFeu% < 1) BEGIN
 PRINT @33
 ACTION_READLN MageFeu
END

ACTION_IF (%MageFeu% = 1) THEN BEGIN
APPEND ~animate.ids~ ~0x52E3 DOOM_KNIGHT_MAGE_FIRE_COLD_D2~ UNLESS ~^0x52[Ee]3~
APPEND ~anisnd.ids~ ~0x52E3 µGK      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_FIRE_COLD_D2~ UNLESS ~^0x52[Ee]3~
APPEND ~animate.ids~ ~0x52E4 DOOM_KNIGHT_MAGE_FIRE_POISON_D2~ UNLESS ~^0x52[Ee]4~
APPEND ~anisnd.ids~ ~0x52E4 µGL      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_FIRE_POISON_D2~ UNLESS ~^0x52[Ee]4~
APPEND ~animate.ids~ ~0x52E5 DOOM_KNIGHT_MAGE_FIRE_UNHOLY_D2~ UNLESS ~^0x52[Ee]5~
APPEND ~anisnd.ids~ ~0x52E5 µGM      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_FIRE_UNHOLY_D2~ UNLESS ~^0x52[Ee]5~
COPY ~GWTest02/UM/MGKFeuFd~ ~override~
COPY ~GWTest02/UM/MGKFeuPsn~ ~override~
COPY ~GWTest02/UM/MGKFeuUnh~ ~override~
END

ACTION_IF (%MageFeu% = 2) THEN BEGIN
COPY ~GWTest02/UM/MGKFeuFd~ ~override~
APPEND ~animate.ids~ ~0x52E3 DOOM_KNIGHT_MAGE_FIRE_COLD_D2~ UNLESS ~^0x52[Ee]3~
APPEND ~anisnd.ids~ ~0x52E3 µGK      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_FIRE_COLD_D2~ UNLESS ~^0x52[Ee]3~
END

ACTION_IF (%MageFeu% = 3) THEN BEGIN
APPEND ~animate.ids~ ~0x52E4 DOOM_KNIGHT_MAGE_FIRE_POISON_D2~ UNLESS ~^0x52[Ee]4~
APPEND ~anisnd.ids~ ~0x52E4 µGL      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_FIRE_POISON_D2~ UNLESS ~^0x52[Ee]4~
COPY ~GWTest02/UM/MGKFeuPsn~ ~override~
END

ACTION_IF (%MageFeu% = 4) THEN BEGIN
APPEND ~animate.ids~ ~0x52E5 DOOM_KNIGHT_MAGE_FIRE_UNHOLY_D2~ UNLESS ~^0x52[Ee]5~
APPEND ~anisnd.ids~ ~0x52E5 µGM      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_FIRE_UNHOLY_D2~ UNLESS ~^0x52[Ee]5~
COPY ~GWTest02/UM/MGKFeuUnh~ ~override~
END


BEGIN @24 = ~Installer les Magiciens Doom Knights avec aura de Poison~ 
SUBCOMPONENT @20 = ~Magiciens Doom Knight~

PRINT @34 = ~Quels magiciens Doom Knights souhaitez-vous installer ?

1. Installer tous les magiciens Doom Knights avec aura de Poison.
2. Installer Uniquement le Magicien Doom Knight avec auras de Poison et de Froid.
3. Installer Uniquement le Magicien Doom Knight avec auras de Poison et de Feu.
4. Installer Uniquement le Magicien Doom Knight avec aura de Poison et aura malefique.

VEUILLEZ TAPER 1, 2, 3 ou 4.~

ACTION_READLN MagePsn
OUTER_WHILE !(IS_AN_INT %MagePsn%) || (%MagePsn% > 4) || (%MagePsn% < 1) BEGIN
 PRINT @34
 ACTION_READLN MagePsn
END

ACTION_IF (%MagePsn% = 1) THEN BEGIN
APPEND ~animate.ids~ ~0x52E6 DOOM_KNIGHT_MAGE_POISON_COLD_D2~ UNLESS ~^0x52[Ee]6~
APPEND ~anisnd.ids~ ~0x52E6 µGN      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_POISON_COLD_D2~ UNLESS ~^0x52[Ee]6~
APPEND ~animate.ids~ ~0x52E7 DOOM_KNIGHT_MAGE_POISON_FIRE_D2~ UNLESS ~^0x52[Ee]7~
APPEND ~anisnd.ids~ ~0x52E7 µGO      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_POISON_FIRE_D2~ UNLESS ~^0x52[Ee]7~
APPEND ~animate.ids~ ~0x52E8 DOOM_KNIGHT_MAGE_POISON_UNHOLY_D~ UNLESS ~^0x52[Ee]8~
APPEND ~anisnd.ids~ ~0x52E8 µGP      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_POISON_UNHOLY_D~ UNLESS ~^0x52[Ee]8~
COPY ~GWTest02/UM/MGKPsnFd~ ~override~
COPY ~GWTest02/UM/MGKPsnFeu~ ~override~
COPY ~GWTest02/UM/MGKPsnUnh~ ~override~
END

ACTION_IF (%MagePsn% = 2) THEN BEGIN
APPEND ~animate.ids~ ~0x52E6 DOOM_KNIGHT_MAGE_POISON_COLD_D2~ UNLESS ~^0x52[Ee]6~
APPEND ~anisnd.ids~ ~0x52E6 µGN      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_POISON_COLD_D2~ UNLESS ~^0x52[Ee]6~
COPY ~GWTest02/UM/MGKPsnFd~ ~override~
END

ACTION_IF (%MagePsn% = 3) THEN BEGIN
APPEND ~animate.ids~ ~0x52E7 DOOM_KNIGHT_MAGE_POISON_FIRE_D2~ UNLESS ~^0x52[Ee]7~
APPEND ~anisnd.ids~ ~0x52E7 µGO      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_POISON_FIRE_D2~ UNLESS ~^0x52[Ee]7~
COPY ~GWTest02/UM/MGKPsnFeu~ ~override~
END

ACTION_IF (%MagePsn% = 4) THEN BEGIN
APPEND ~animate.ids~ ~0x52E8 DOOM_KNIGHT_MAGE_POISON_UNHOLY_D~ UNLESS ~^0x52[Ee]8~
APPEND ~anisnd.ids~ ~0x52E8 µGP      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_POISON_UNHOLY_D~ UNLESS ~^0x52[Ee]8~
COPY ~GWTest02/UM/MGKPsnUnh~ ~override~
END



BEGIN @25 = ~Installer les Magiciens Doom Knights avec aura malefique~ 
SUBCOMPONENT @20 = ~Magiciens Doom Knight~

PRINT @35 = ~Quels magiciens Doom Knights souhaitez-vous installer ?

1. Installer tous les magiciens Doom Knights avec aura malefique.
2. Installer Uniquement le Magicien Doom Knight avec aura malefique et aura de Froid.
3. Installer Uniquement le Magicien Doom Knight avec aura malefique et aura de Feu.
4. Installer Uniquement le Magicien Doom Knight avec aura malefique et aura de Poison.

VEUILLEZ TAPER 1, 2, 3 ou 4.~

ACTION_READLN MageUnh
OUTER_WHILE !(IS_AN_INT %MageUnh%) || (%MageUnh% > 4) || (%MageUnh% < 1) BEGIN
 PRINT @35
 ACTION_READLN MageUnh
END

ACTION_IF (%MageUnh% = 1) THEN BEGIN
APPEND ~animate.ids~ ~0x52E9 DOOM_KNIGHT_MAGE_UNHOLY_COLD_D2~ UNLESS ~^0x52[Ee]9~
APPEND ~anisnd.ids~ ~0x52E9 µGQ      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_UNHOLY_COLD_D2~ UNLESS ~^0x52[Ee]9~
APPEND ~animate.ids~ ~0x52EA DOOM_KNIGHT_MAGE_UNHOLY_FIRE_D2~ UNLESS ~^0x52[Ee][Aa]~
APPEND ~anisnd.ids~ ~0x52EA µGR      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_UNHOLY_FIRE_D2~ UNLESS ~^0x52[Ee][Aa]~
APPEND ~animate.ids~ ~0x52EB DOOM_KNIGHT_MAGE_UNHOLY_POISON_D~ UNLESS ~^0x52[Ee][Bb]~
APPEND ~anisnd.ids~ ~0x52EB µGS      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_UNHOLY_POISON_D~ UNLESS ~^0x52[Ee][Bb]~
COPY ~GWTest02/UM/MGKUnhFd~ ~override~
COPY ~GWTest02/UM/MGKUnhFeu~ ~override~
COPY ~GWTest02/UM/MGKUnhPsn~ ~override~
END

ACTION_IF (%MageUnh% = 2) THEN BEGIN
APPEND ~animate.ids~ ~0x52E9 DOOM_KNIGHT_MAGE_UNHOLY_COLD_D2~ UNLESS ~^0x52[Ee]9~
APPEND ~anisnd.ids~ ~0x52E9 µGQ      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_UNHOLY_COLD_D2~ UNLESS ~^0x52[Ee]9~
COPY ~GWTest02/UM/MGKUnhFd~ ~override~
END

ACTION_IF (%MageUnh% = 3) THEN BEGIN
APPEND ~animate.ids~ ~0x52EA DOOM_KNIGHT_MAGE_UNHOLY_FIRE_D2~ UNLESS ~^0x52[Ee][Aa]~
APPEND ~anisnd.ids~ ~0x52EA µGR      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_UNHOLY_FIRE_D2~ UNLESS ~^0x52[Ee][Aa]~
COPY ~GWTest02/UM/MGKUnhFeu~ ~override~
END

ACTION_IF (%MageUnh% = 4) THEN BEGIN
APPEND ~animate.ids~ ~0x52EB DOOM_KNIGHT_MAGE_UNHOLY_POISON_D~ UNLESS ~^0x52[Ee][Bb]~
APPEND ~anisnd.ids~ ~0x52EB µGS      CGAMEANIMATIONTYPE_DOOM_KNIGHT_MAGE_UNHOLY_POISON_D~ UNLESS ~^0x52[Ee][Bb]~
COPY ~GWTest02/UM/MGKUnhPsn~ ~override~
END
Malheureusement, ce code limite l'installation à un seul groupe de créatures : si on installe les magiciens à aura de froid, on ne peut pas installer les magiciens à aura de feu, etc...
Or je voudrais rendre possible l'installation par exemple des mages COLD-FIRE, POISON-UNHOLY et FIRE-POISON.

D'après la doc WeiDU, il est impossible d'inclure des sous-composants à l'intérieur de sous-composants.
A moins de prévoir tous les cas possibles (combinaison de 12 : l'enfer !), je ne vois pas comment m'en tirer si ce n'est écrire 12 composants différents (un pour chaque animation), ce qui ne me plaît pas du tout car trop lourd.

Quelqu'un aurait-il une suggestion ?
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Pour régler la question précédente, j'ai opté pour une autre arborescence des composants à installer. :)


Mais maintenant, dans la série des questions à 1.000.000 €, je crains d'avoir touché le gros lot ! :help:

Je souhaiterais modifier automatiquement la position verticale de toutes les frames de plusieurs fichiers .bam de 10 pixels (+10).

Comme je suis loin d'être le pro de l'hexa, quelqu'un aurait-il une idée ? :$
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

Je suppose que tu veux modifier la valeur de "Frame center Y coordinate".

Voici un code qui effectue la mise à jour de "Frame center y coordinate" dans toutes les frames qui ont une taille suffisante pour accepter ce décalage.

Code : Tout sélectionner

BACKUP ~bamtestfreddy/backup~
AUTHOR ~Isaya~

BEGIN ~Decalage Y BAM~

COPY_EXISTING ~MLICG11.BAM~ ~override~
  // Code repris de BAMBatcher pour décompresser les BAMC
  READ_ASCII 0x0 sg (4) //Signature
  PATCH_IF (~%sg%~ STRING_EQUAL_CASE ~BAMC~ = 1) BEGIN
    READ_LONG 0x8 dl //Uncompressed data length
    DECOMPRESS_REPLACE_FILE 0xc (SOURCE_SIZE - 0xc) dl
    sz = dl
  END ELSE BEGIN
    sz = SOURCE_SIZE
  END
  READ_SHORT 0x08 nbFrames

  SET decalageY = 10
  // Lecture des frames
  // inspiré du tutorial 9.24 de la doc WeiDU
  // 1er param : position de l'offset dans l'en-tête
  // 2ème param : taille du champ offset (en général 4)
  // 3ème param : position du champ "nombre" dans l'en-tête
  // 4ème param : taille du champ "nombre"
  // 5ème et 6ème param : utiles seulement en présence de table d'index
  // 7ème param : taille du bloc du tableau (ici Frame Entry, donc 12 = 0x0c)
  GET_OFFSET_ARRAY frame_array 0x0c 4 0x08 2 0 0 0x0c
  PHP_EACH frame_array AS int => frame_off BEGIN
    READ_SHORT (frame_off + 0x02) frameHeight
    READ_SHORT (frame_off + 0x06) frameYcenter		// Frame center Y coordinate, offset 6 dans la structure Frame Entry
    PATCH_IF frameYcenter >= %decalageY%	// protection contre valeur négative à la fin
      BEGIN
        SET frameYcenter -= %decalageY%
        WRITE_SHORT (frame_off + 0x06) frameYcenter
      END
    ELSE
      BEGIN
        PATCH_PRINT ~Decalage impossible pour %SOURCE_RES% dans une frame~
      END
/* Si le décalage est vers le bas, il faut utiliser ce code
    PATCH_IF frameYcenter < %frameHeight% - %decalageY%	// protection contre valeur supérieure à la hauteur à la fin
      BEGIN
        SET frameYcenter += %decalageY%
        WRITE_SHORT (frame_off + 0x06) frameYcenter
      END
    ELSE
      BEGIN
        PATCH_PRINT ~Decalage impossible pour %SOURCE_RES% dans une frame~
      END
*/
  END // PHP_EACH

  // Pour compresser le BAM produit, tu trouveras du code dans le chapitre 10 de la doc WeiDU.

BUT_ONLY_IF_IT_CHANGES
J'ai testé le code avec le BAM indiqué dans le code. Near Infinity et BAM Workshop l'affichent toujours après modification. La modification n'est pas visible quand on joue les animations, mais ça doit tenir à la façon dont les éditeurs les affichent. Néanmoins BAM Workshop montre bien que les valeurs de "Vertical" ont été réduites de 10 (je n'ai vérifié que quelques frames cependant).

A la fin, le BAM n'est pour l'instant pas compressé. Il y a du code dans le chapitre 10 de la documentation qui montre comment faire. Je n'ai pas essayé.
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Un ÉNORME MERCI pour ce code ! :thank_you:

Je le testerai ce soir et te tiendrai au courant. Je me voyais mal modifier à la main 20 fichiers.bam par créature, le tout pour une dizaine de créatures !
J'ai jeté l'éponge après avoir modifié les séries de trois animations... :$


Juste deux précisions :
  1. Pourquoi effectuer un test sur les valeurs négatives alors que certaines frames de certains fichiers .bam ont des valeurs de position négatives ? Je pense notamment aux animations splittées...
  2. Pendant qu'on y est, aurais-tu sous la main les offsets pour les coordonnées horizontales ? Au cas où je tombe sur ce genre de modifs : avec les animations Arcanum, c'est en effet l'enfer. Je dois non seulement entrer les positions à la main (les tailles des frames sont variables, d'où des coordonnées différentes), mais souvent les modifier après un premier test in-game car il semble que leur pivot ne se situe pas au même niveau que dans BG2. Résultat des courses, les créatures ne se tiennent pas toujours au milieu de leur cercle de sélection.
Quant à la compression, je passe par DLTCEP après une dernière vérif. du fichier.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

Freddy_Gwendo a écrit :Un ÉNORME MERCI pour ce code ! :thank_you:

Je le testerai ce soir et te tiendrai au courant. Je me voyais mal modifier à la main 20 fichiers.bam par créature, le tout pour une dizaine de créatures !
J'ai jeté l'éponge après avoir modifié les séries de trois animations... :$
Il n'y a pas de quoi.
Freddy_Gwendo a écrit :Pourquoi effectuer un test sur les valeurs négatives alors que certaines frames de certains fichiers .bam ont des valeurs de position négatives ? Je pense notamment aux animations splittées...
Un petit excès de spécification : en constatant la présence de frames de taille probablement faible voire nulle (celles qui semblent ne rien donner dans Near Infinity), j'ai cru que mettre une valeur négative ou au-delà de la hauteur risquait de faire planter. Tu peux donc retirer le contrôle.
J'ignorais que c'était le moyen d'afficher les animations splittées.
Freddy_Gwendo a écrit :Pendant qu'on y est, aurais-tu sous la main les offsets pour les coordonnées horizontales ?
Facile : 0x00 et 0x04. Cf le format BAM.
Un intérêt de GET_OFFSET_ARRAY + PHP_EACH est qu'ils rendent un peu plus lisible le code de manipulation de la structure du tableau.
Freddy_Gwendo a écrit :Je dois non seulement entrer les positions à la main (les tailles des frames sont variables, d'où des coordonnées différentes), mais souvent les modifier après un premier test in-game car il semble que leur pivot ne se situe pas au même niveau que dans BG2. Résultat des courses, les créatures ne se tiennent pas toujours au milieu de leur cercle de sélection.
Si je comprends bien, il y a un risque que tu ne puisses pas appliquer un offet identique pour toutes les frames d'un BAM. Dans ce cas, bonjour la galère !
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Isaya a écrit :Un petit excès de spécification : en constatant la présence de frames de taille probablement faible voire nulle (celles qui semblent ne rien donner dans Near Infinity), j'ai cru que mettre une valeur négative ou au-delà de la hauteur risquait de faire planter. Tu peux donc retirer le contrôle.
J'ignorais que c'était le moyen d'afficher les animations splittées.
J'expliquerai tout ça dans la partie "Animations splittées" du Tuto sur les bams : en gros quand tu découpes une bam en 4 parties, les deux parties de droite se retrouvent avec des positions horizontales négatives (calculées par rapport à la position des deux parties de gauche). De plus, tout dépend des valeurs des positions de départ des images > 256x256 pixels.

Pour remonter une animation, il faut augmenter la valeur Y, pour la décaler sur la droite, il faut diminuer la valeur X. Donc on peut rapidement se retrouver avec des valeurs négatives surtout si on n'a pas pris la peine de travailler sur des images à canevas identique...

Si je comprends bien, il y a un risque que tu ne puisses pas appliquer un offet identique pour toutes les frames d'un BAM. Dans ce cas, bonjour la galère !
Ça va être le cas pour des animations dont certaines séquences devront être décalées plus ou moins à gauche ou à droite. Mais j'utiliserai la commande "Merge" de DLTCEP pour fusionner les séquences des bams modifiées dans les bams originales : ça se fait en une seconde. Puis je n'aurai plus qu'à supprimer les mauvaises séquences et les réorganiser : comme ça concerne uniquement les formats IWD, ça ira vite (5+3 séquences).

D'où ma déception de ne pas voir Beamdog pondre de nouveaux outils de développement graphique...
Sans WeiDU (et toi ;) ), j'étais bon pour des journées de boulot plutôt fastidieux et prise de tête.


Encore merci.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Comme promis, voici un rapport d'évaluation de la procédure d'Isaya.


ÇA FONCTIONNE PARFAITEMENT !



J'ajouterai cependant les précisions suivantes :
  • La première partie du code descend l'animation sur l'axe vertical, la seconde la remonte. Je pense qu'on ne s'était pas compris, mais ce n'est pas très grave puisque le script fonctionne dans les deux cas.
  • Afin de mieux gérer les fichiers, j'ai rajouté deux répertoires "In" et "Out" dans le répertoire de test, puis j'ai remplacé le COPY_EXISTING par un simple COPY. Ce qui évite d'écraser les fichiers et permet de mieux maîtriser les modifications.
  • Enfin, j'ai supprimé les lignes de contrôle sur la hauteur des frames et les valeurs négatives car ça n'a pas loupé : sur une animation de mort dont la taille des frames est très variable (échelle de 1 à 5, d'où un grand écart entre les différentes valeurs des positions verticales), les contrôles empêchaient de modifier la position de nombreuses frames. Une fois les contrôles supprimés, les modifications ont été parfaitement réalisées.
CONCLUSION : en moins d'une seconde, le script d'Isaya modifie automatiquement une demi-douzaine de fichiers .bam composés chacun de 100 à 200 frames. :up:


>> LE BONHEUR TOTAL qui m'a fait gagner deux ou trois jours de boulot ! :i-m_so_happy:

Je le recommande vivement.

Une fois de plus, tu as assuré comme une bête, Isaya ! :superman:
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

J'ai encore modifié le code en utilisant des librairies :

Code : Tout sélectionner

BACKUP ~BamRepos/backup~
AUTHOR ~Isaya et modifie par Freddy_Gwendo~


// DECALAGE VERTICAL

BEGIN ~Decalage vertical - Y BAM~
SUBCOMPONENT ~Decalage position des bam~

PRINT ~Choisissez le mode de decalage :

1. Vers le bas.
2. Vers le haut.

VEUILLEZ TAPER 1 ou 2.~

ACTION_READLN Vertical
OUTER_WHILE !(IS_AN_INT %Vertical%) || (%Vertical% > 2) || (%Vertical% < 1) BEGIN
PRINT ~Choisissez le mode de decalage :

1. Vers le bas.
2. Vers le haut.

VEUILLEZ TAPER 1 ou 2.~
 ACTION_READLN Vertical
END


/* SAISIE DE LA VALEUR DU DECALAGE */

PRINT ~Les frames seront toutes decalees sur l'axe vertical du meme nombre de pixels.


ENTREZ la valeur du decalage que vous souhaitez realiser.

ATTENTION : N'entrez surtout pas de valeur negative.

VALEUR = 

~

 ACTION_READLN decalageY
 OUTER_WHILE !(IS_AN_INT %decalageY%) || (%decalageY% < 0) || (%decalageY% > 200) BEGIN
  PRINT ~Les frames seront toutes decalees sur l'axe vertical du meme nombre de pixels.


ENTREZ la valeur du decalage que vous souhaitez realiser.

ATTENTION : N'entrez surtout pas de valeur negative.

VALEUR = 

~

  ACTION_READLN decalageY
 END


ACTION_IF (%Vertical% = 1) THEN BEGIN

INCLUDE ~BamRepos/lib/VertBas.gwe~
END


ACTION_IF (%Vertical% = 2) THEN BEGIN
INCLUDE ~BamRepos/lib/VertHaut.gwe~
END



// DECALAGE HORIZONTAL

BEGIN ~Decalage horizontal - X BAM~
SUBCOMPONENT ~Decalage position des bam~


PRINT ~Choisissez le mode de decalage horizontal :

1. Vers la droite.
2. Vers la gauche.

VEUILLEZ TAPER 1 ou 2.~

ACTION_READLN Horizontal
OUTER_WHILE !(IS_AN_INT %Horizontal%) || (%Horizontal% > 2) || (%Horizontal% < 1) BEGIN
PRINT ~Choisissez le mode de decalage horizontal :

1. Vers la droite.
2. Vers la gauche.

VEUILLEZ TAPER 1 ou 2.~
 ACTION_READLN Horizontal
END


/* SAISIE DE LA VALEUR DU DECALAGE */

PRINT ~Les frames seront toutes decalees sur l'axe horizontal du meme nombre de pixels.


ENTREZ la valeur du decalage que vous souhaitez realiser.

ATTENTION : N'entrez surtout pas de valeur negative.

VALEUR = 

~

 ACTION_READLN decalageX
 OUTER_WHILE !(IS_AN_INT %decalageX%) || (%decalageX% < 0) || (%decalageX% > 200) BEGIN
  PRINT ~Les frames seront toutes decalees sur l'axe horizontal du meme nombre de pixels.


ENTREZ la valeur du decalage que vous souhaitez realiser.

ATTENTION : N'entrez surtout pas de valeur negative.

VALEUR = 

~
  ACTION_READLN decalageX
 END



ACTION_IF (%Horizontal% = 1) THEN BEGIN
INCLUDE ~BamRepos/lib/HorizDte.gwe~
END


ACTION_IF (%Horizontal% = 2) THEN BEGIN
INCLUDE ~BamRepos/lib/HorizGche.gwe~
END




// DECALAGE HORIZONTAL ET VERTICAL

BEGIN ~Decalage horizontal et vertical - X et Y BAM~
SUBCOMPONENT ~Decalage position des bam~

PRINT ~Choisissez le mode de decalage vertical :

1. Vers le bas.
2. Vers le haut.

VEUILLEZ TAPER 1 ou 2.~

ACTION_READLN Vertical
OUTER_WHILE !(IS_AN_INT %Vertical%) || (%Vertical% > 2) || (%Vertical% < 1) BEGIN
PRINT ~Choisissez le mode de decalage vertical :

1. Vers le bas.
2. Vers le haut.

VEUILLEZ TAPER 1 ou 2.~
 ACTION_READLN Vertical
END


PRINT ~Les frames seront toutes decalees verticalement du meme nombre de pixels.


ENTREZ la valeur du decalage que vous souhaitez realiser.

ATTENTION : N'entrez surtout pas de valeur negative.

VALEUR = 

~

 ACTION_READLN decalageY
 OUTER_WHILE !(IS_AN_INT %decalageY%) || (%decalageY% < 0) || (%decalageY% > 200) BEGIN
  PRINT ~Les frames seront toutes decalees verticalement du meme nombre de pixels.


ENTREZ la valeur du decalage que vous souhaitez realiser.

ATTENTION : N'entrez surtout pas de valeur negative.

VALEUR = 

~
  ACTION_READLN decalageY
 END




PRINT ~Choisissez le mode de decalage horizontal :

1. Vers la droite.
2. Vers la gauche.

VEUILLEZ TAPER 1 ou 2.~

ACTION_READLN Horizontal
OUTER_WHILE !(IS_AN_INT %Horizontal%) || (%Horizontal% > 2) || (%Horizontal% < 1) BEGIN
PRINT ~Choisissez le mode de decalage horizontal :

1. Vers la droite.
2. Vers la gauche.

VEUILLEZ TAPER 1 ou 2.~
 ACTION_READLN Horizontal
END


PRINT ~Les frames seront toutes decalees horizontalament du meme nombre de pixels.


ENTREZ la valeur du decalage que vous souhaitez realiser.

ATTENTION : N'entrez surtout pas de valeur negative.

VALEUR = 

~

 ACTION_READLN decalageX
 OUTER_WHILE !(IS_AN_INT %decalageX%) || (%decalageX% < 0) || (%decalageX% > 200) BEGIN
  PRINT ~Les frames seront toutes decalees horizontalament du meme nombre de pixels.


ENTREZ la valeur du decalage que vous souhaitez realiser.

ATTENTION : N'entrez surtout pas de valeur negative.

~
  ACTION_READLN decalageX
 END


ACTION_IF (%Vertical% = 1) THEN BEGIN
INCLUDE ~BamRepos/lib/VertBas.gwe~

  ACTION_IF (%Horizontal% = 1) THEN BEGIN
    INCLUDE ~BamRepos/lib/HorizDte2.gwe~
    END ELSE
      ACTION_IF (%Horizontal% = 2) THEN BEGIN
        INCLUDE ~BamRepos/lib/HorizGche2.gwe~
  END
END


ACTION_IF (%Vertical% = 2) THEN BEGIN
INCLUDE ~BamRepos/lib/VertHaut.gwe~

  ACTION_IF (%Horizontal% = 1) THEN BEGIN
    INCLUDE ~BamRepos/lib/HorizDte2.gwe~
    END ELSE
      ACTION_IF (%Horizontal% = 2) THEN BEGIN
        INCLUDE ~BamRepos/lib/HorizGche2.gwe~
  END
END

Il est certainement perfectible, mais il fonctionne parfaitement en l'état. :)

Pour les ceusses intéressés, je le communique en pièces jointes.
Pour l'exe, il suffit de faire une copie de WeiDU.exe et de la renommer Setup-BamRepos.exe".

Dernière chose : évitez de l'installer dans un répertoire de jeu mais plutôt dans un clône dédié au développement, ça évitera de surcharger inutilement le WeiDU.log... ;)
Fichiers joints
GWBamRepos.7z
(1.81 Kio) Téléchargé 155 fois
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Je suis en train de customiser mes cartes selon le langage d'installation. Pour voir le résultat, je vous renvoie à cet échange sur Spellhold avec notamment des captures d'écran illustrant le résultat.

Le but du jeu est simple :

Le fond de carte (.tis) contient des textes en français. Selon la langue d'installation choisie, certains fichiers .bam comprenant les textes traduits sont activés pour recouvrir les textes français.

Pour effectuer mes tests, je me suis contenté de modifier un par un certains offsets du fichier GW0008.are dans le composant final "Customisation des cartes" qui vous laisse le choix entre :

1. Utiliser les fonds de cartes français.
2. Utiliser des fonds de cartes traduits en anglais.
3. Utiliser les fonds de cartes traduits en allemand.
4. Utiliser les fonds de cartes traduits en espagnol.
5. Utiliser les fonds de cartes traduits en italien.

Ça fonctionne parfaitement, mais je me vois mal écrire cette procédure pour des dizaines de cartes !


Ce que je voudrais, c'est une procédure automatique qui serait déclenchée par le choix de la langue d'installation - lancée soit automatiquement à partir du choix de langue, soit par un dernier composant comme indiqué plus haut (ce qui me paraît plus pertinent : après tout, certains joueurs étrangers peuvent aussi apprécier "l'exotisme" du français !) :
  1. Elle concernerait tous les fichiers GWnnnn.are.
  2. Elle ne s'appliquerait qu'aux labels d'animations nommés Text[XX][nn] avec [XX] correspondant à la langue [DE (Deutsch), US (Anglais), IT (Italien), SP (Spanish)] et [nn] à l'indexation des fichiers bam (de 01 à 99, ça devrait le faire !).
  3. Pour chacun de ces labels, elle irait modifier le champ "Flags" en 00001045 : de non visible, l'animation devient ainsi visible sur la carte et recouvre les textes français.

Et là, je dois avouer que mes compétences en matière de programmation atteignent dangereusement leurs limites. :$

Exemple des variables d'une animation :

Code : Tout sélectionner

3098h Animation #9         
  3098h Label        TextSP                          
  30b8h Position     [0a00.0a20]
  30bch Schedule     00ffffff
  30c0h BAM          GW0008SP
  30c8h Cycle        0000
  30cah Frame        0000
  30cch Flags        00001044
  30d0h UNKNOWN      00000000
  30d4h UNKNOWN      00000000
  30d8h Palette              
  30e0h UNKNOWN      00000000

Selon IEDSP, je me doute que je dois :
  • Jouer avec 0x00ac 4 (dword) Count of animations et 0x00b0 4 (dword) Offset to animation pour déterminer le début des boucles,
  • Jongler avec 0x0000 32 (char array) Name et 0x0028 8 (resref) Animation resref (BAM) pour tester l'emplacement des chaînes "GWText[XX][nn] concernées par la modif,
  • puis avec 0x0034 4 (dword) Flags pour déterminer l'emplacement de l'offset à modifier.
Mais je suis vraiment perdu. :wacko: :help:


Si une bonne âme pouvait me donner un coup de main, je lui en serai infiniment reconnaissant.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Bon, bon, comme ça me gonflait, j'ai contourné le problème. ;)

Et j'ai utilisé une fonction de WeiDU : pourquoi se compliquer la tâche quand le père WeiDU fait tout le boulot pour vous ?

Bref, après avoir demandé dans quelle langue bénéficier des affichages customisés, je lance ceci dans le setup.tp2 (exemple sur une seule carte) :

Code : Tout sélectionner

[color="#0000FF"]COPY[/color] ~DIAMANT\Cartes\GW0008.are~ ~[color="#00FF00"]override[/color]~
  [color="#990066"]PATCH_IF[/color] SOURCE_SIZE > [color="#FF0000"]0x28f[/color] [color="#0000FF"]BEGIN[/color]
    [color="#00FFFF"]LPF fj_are_structure[/color] // C'est la fameuse commande.
      INT_VAR
      fj_loc_x          = [color="#FF0000"]2560[/color]
      fj_loc_y          = [color="#FF0000"]2592[/color]
      fj_flags          = [color="#FF0000"]0b00000000000000000001000001000101[/color] // variable recopiée dans NI et correspondant aux "flags"
      STR_VAR
      fj_structure_type = animation
      fj_name           = TextSP // Nom de l'animation
      fj_bam_resref     = GW0008SP // Fichier bam utilisé
    [color="#990066"]END
  END
BUT_ONLY[/color]
Résultat : dans ce cas, c'est la version espagnole du fichier bam qui est affichée à l'écran.
Ça m'évite de saisir les animations des 4 langues et de modifier leurs "flags" par code, ce que je ne suis pas parvenu à faire de manière automatique, de toute façon.

Mais j'ai testé et ça fonctionne parfaitement. ^^
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Comment ajouter un string dans une fonction ?

Voici un exemple de patch qui fonctionne très bien :

Code : Tout sélectionner

COPY ~Diamant/GWFood.itm~ ~override/GWFrt04.itm~ SAY NAME1 @8470007 SAY NAME2 @8470007 SAY DESC @8470008 // Ananas
	WRITE_LONG 0x34 7	WRITE_ASCII 0x3a ~GWFRT04~ #8	WRITE_ASCII 0x44 ~GWFRT04G~ #8	WRITE_LONG 0x4c 3	WRITE_ASCII 0x58 ~GWFRT04D~ #8
	WRITE_ASCII 0x76 ~GWFRT04~ #8	WRITE_SHORT 0x94 12	WRITE_LONG 0xae 3	SAY 0x10e @8470991	WRITE_LONG 0x19e 51
	WRITE_LONG 0x1ce 180	WRITE_LONG 0x1fe 8	WRITE_LONG 0x22e 3	WRITE_LONG 0x25e 87

	LPF ADD_ITEM_EFFECT INT_VAR opcode = 98 target = 1 parameter1 = 6 parameter2 = 3 resist_dispel = 2 duration = 60 probability1 = 20 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 142 target = 1 parameter2 = 87 resist_dispel = 2 duration = 60 probability1 = 20 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 139 target = 1 timing = 4 parameter1 = 11006 resist_dispel = 2 duration = 1 probability1 = 20 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 174 target = 1 timing = 4 resist_dispel = 2 duration = 1 probability1 = 20 STR_VAR resource = EFF_P04 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 174 target = 1 timing = 4 resist_dispel = 2 duration = 60 probability1 = 20 STR_VAR resource = EFF_E01 END
Je souhaiterais rajouter la ligne suivante

Code : Tout sélectionner

	LPF ADD_ITEM_EFFECT INT_VAR opcode = 139 target = 1 timing = 4 resist_dispel = 2 duration = 60 probability1 = 20 END
avec parameter1 = @4337

Mais ça ne fonctionne pas, la fonction attendant un nombre.

Pour l'instant, je règle le problème en rajoutant un SAY 0x__ @4337 pour remplacer la variable parameter1 après l'insertion de la fonction, mais ça ne me plaît pas.
Quelqu'un aurait-il une astuce pour le faire de manière automatique ?
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
deratiseur
Golem de fer
Messages : 3698
Enregistré le : mer. 05 déc. 2007, 18:35
Localisation : Gap, Hautes alpes
Statut : Hors ligne
.

Message par deratiseur »

Patchage en batch du string, je l'ai cherché longtemps, celui là aussi, et sans succés. Malheureusement Zranoff (l'empereur du code) ne donnant plus de nouvelles, les meilleurs en code weidu restent sur G3 et SHS :-/
Le standard téléphonique est en rade : l'atelier du Deratiseur ne répondra plus à aucune demande personnalisée.
Bosse sur : Interplan v9, Derat's Kri'Binn, Todd : KOPP2.

Mes mods sont tous sur Mediafire et Github
Et leurs descriptions sont ici.
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Effectivement, d'autant plus que de nouveaux prennent la relève, comme Argent77 qui a découvert le format VEF et développé le module de création et d'édition pour NI.
Il m'a déjà confirmé qu'il était possible de travailler sur des variables globales et locales négatives dans les scripts.

Si je n'ai pas de réponse, je poserai la question de ce patch sur G3 ce week-end. Ce serait bien le diable si un moddeur n'avait pas déjà passé un peu de temps là-dessus...
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Après quelques heures de galère, j'ai fini par trouver une solution "bâtarde". Bâtarde dans le sens où elle ne fonctionne que pour des objets ne disposant pas d'effets d'équipement et seulement d'effets dans les headers.

Code : Tout sélectionner

COPY ~override/GWFood.itm~ ~override/GWFrt04.itm~ SAY NAME1 @8470007 SAY NAME2 @8470007 SAY DESC @8470008 // Ananas
	WRITE_LONG 0x34 7	WRITE_ASCII 0x3a ~GWFRT04~ #8	WRITE_ASCII 0x44 ~GWFRT04G~ #8	WRITE_LONG 0x4c 3
	WRITE_ASCII 0x58 ~GWFRT04D~ #8	WRITE_ASCII 0x76 ~GWFRT04~ #8	WRITE_SHORT 0x94 12	WRITE_LONG 0xae 3	SAY 0x10e @8470991
	WRITE_LONG 0x19e 51	WRITE_LONG 0x1ce 180	WRITE_LONG 0x1fe 8	WRITE_LONG 0x22e 3	WRITE_LONG 0x25e 87
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 98 target = 1 parameter1 = 6 parameter2 = 3 resist_dispel = 2 duration = 60 probability1 = 20 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 142 target = 1 parameter2 = 87 resist_dispel = 2 duration = 60 probability1 = 20 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 139 target = 1 timing = 4 parameter1 = 11006 resist_dispel = 2 duration = 1 probability1 = 20 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 174 target = 1 timing = 4 resist_dispel = 2 duration = 1 probability1 = 20 STR_VAR resource = EFF_P04 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 174 target = 1 timing = 4 resist_dispel = 2 duration = 60 probability1 = 20 STR_VAR resource = EFF_E01 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 139 target = 1 timing = 4 resist_dispel = 2 duration = 60 probability1 = 20 END
Je rajoute ceci après :

Code : Tout sélectionner

	READ_LONG   0x6a "fx_off"
	READ_LONG   0x64 "abil_off"
	READ_SHORT  0x68 "abil_num"
	FOR (index1 = 0 ; index1 < abil_num ; ++index1) BEGIN // looks through headers
	READ_SHORT (abil_off + 0x1e + index1) abil_fx_num
		FOR (index2 = 0 ; index2 < abil_fx_num ; index2 = index2 +1) BEGIN
		READ_SHORT (abil_off + 0x38 + (index2 * 0x30)) opcode
			PATCH_IF ((opcode = 139)) BEGIN
				READ_BYTE (abil_off + 0x38 + 0x0c + (index2 * 0x30)) timing        
            				PATCH_IF (timing = 4) BEGIN
					READ_LONG (abil_off + 0x38 + 0x0e + (index2 * 0x30)) duration
						PATCH_IF (duration = 60) THEN BEGIN
						SAY (abil_off + 0x38 + 0x04 + (index2 * 0x30)) @4337
						END
				END
			END
		END
	END
	BUT_ONLY
qui liste les effets et va inscrire le string @4337 dans le champ parameter1 pour les effets Text: Display String [139] à lancement différé après 60 s.

Il ne me reste plus qu'à modifier les paramètres selon les objets.

Si ça peut aider quelqu'un... ;)


Par ailleurs, je ne me rappelais plus que cet effet affiche le texte dans la fenêtre et pas au dessus du perso. A moins qu'il existe une option que j'ai loupée... :(
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

Pour éviter ton code monstrueux, tu dois pouvoir recourir à une astuce qui oblige à faire l'opération en deux temps :
  • créer l'objet de base, sans tous les effets, en lui donnant comme nom le texte que tu veux à terme ajouter dans les effets
  • copier l'objet sur lui-même et dans le patch tel que tu le fais, lire d'abord le STRREF du nom pour récupérer le numéro du texte, un nombre, que tu pourras alors passer à ta fonction
Non testé, mais ça pourrait s'écrire comme ça (pas sûr pour la syntaxe de COPY_EXISTING) :

Code : Tout sélectionner

COPY ~override/GWFood.itm~ ~override/GWFrt04.itm~
  SAY NAME1 @4337

COPY_EXISTING ~override/GWFrt04.itm~ ~override~
  READ_LONG NAME1 strrefnom
  SAY NAME1 @8470007 SAY NAME2 @8470007 SAY DESC @8470008 // Ananas
  ...
  LPF ADD_ITEM_EFFECT INT_VAR opcode = 139 target = 1 timing = 4 resist_dispel = 2 duration = 60 probability1 = 20 parameter1 = %strrefnom% END
Sachant qu'avec un objet tu disposes de 4 textes faciles à manipuler (2 noms et 2 descriptions) si jamais il te faut plusieurs textes.
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Ça, ça me plaît ! :)

Depuis le début, je cherche effectivement un moyen d'obtenir parameter1 = %strrefnom%.

J'avais essayé de définir la variable %% avec @4337 avant de lancer LFP, mais ça ne fonctionnait pas.

Ça va considérablement simplifier mon tph appliqué à une centaine d'objets du module "nourriture", même si ça suppose de rajouter autant de COPY.

Merci pour cette simplification ! :)

Cette galère m'aura au moins permis de me plonger - enfin - dans la gestion des offsets et dans l'hexa : je déteste ça, mais il fallait bien s'y mettre un jour !
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Premières batteries de tests effectuées : ta technique fonctionne parfaitement ! ^^

Avec COPY_EXISTING ~GWFrt04.itm~.

Par ailleurs, comme tu l'avais pressenti, certains objets auront des effets aléatoires et la possibilité de jongler avec les 4 "valeurs" des textes me permet de régler facilement l'écriture des différents opcodes #139. ;)

Merci encore...
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

Le patch avec WeiDU fonctionne donc parfaitement.
En revanche, j'ai un petit souci qui apparaît de manière aléatoire.

Exemple :

Code : Tout sélectionner

COPY ~override/GWFood.itm~ ~override/GWFrt16.itm~	SAY NAME1 @7100002	SAY NAME2 @7100003
COPY ~override/GWFrt16.itm~ ~override/GWFrt16.itm~
	READ_LONG 0x08 strrefnom1
	READ_LONG 0x0c strrefnom2
	SAY NAME1 @8470039	SAY NAME2 @8470039	SAY DESC @8470041	SAY UNIDENTIFIED_DESC @8470040 // Fraises*Marquisettes
	WRITE_LONG 0x34 2	WRITE_ASCII 0x3a ~GWFRT16~ #8	WRITE_SHORT 0x42 50	WRITE_ASCII 0x44 ~GWFRT16G~ #8	WRITE_ASCII 0x58 ~GWFRT16D~ #8
	WRITE_ASCII 0x76 ~GWFRT16~ #8	SAY 0x10e @7000001	WRITE_LONG 0x19e 72	WRITE_LONG 0x1ce 180	WRITE_LONG 0x1fe 13	WRITE_LONG 0x22e 6	WRITE_LONG 0x25e 59
// Immunité aux maladies
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 139 target = 1 timing = 1 parameter1 = %strrefnom1% power = 255 resist_dispel = 2 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 206 target = 1 power = 255 resist_dispel = 2 duration = 300 STR_VAR resource = rr#dpdis END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 206 target = 1 power = 255 resist_dispel = 2 duration = 300 STR_VAR resource = fl#csdis END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 206 target = 1 power = 255 resist_dispel = 2 duration = 300 6 STR_VAR resource = fl#glor2 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 206 target = 1 power = 255 resist_dispel = 2 duration = 300 STR_VAR resource = fl#mum END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 206 target = 1 power = 255 resist_dispel = 2 duration = 300 STR_VAR resource = fl#gmum END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 206 target = 1 power = 255 resist_dispel = 2 duration = 300 STR_VAR resource = fl#zomsd END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 101 target = 1 parameter2 = 78 power = 255 resist_dispel = 2 duration = 300 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 169 target = 1 parameter2 = 7 power = 255 resist_dispel = 2 duration = 300 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 267 target = 1 parameter1 = 39752 power = 255 resist_dispel = 2 duration = 300 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 267 target = 1 parameter1 = 54337 power = 255 resist_dispel = 2 duration = 300 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 139 target = 1 timing = 4 parameter1 = %strrefnom2% power = 255 resist_dispel = 2 duration = 300 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 174 target = 1 timing = 4 power = 255 resist_dispel = 2 duration = 300 STR_VAR resource = EFF_E01 END
avec :
@7000001 = ~Croque, croque...~
@7100002 = ~Protection contre les maladies~
@7100003 = ~Fin de protection contre les maladies~

@8470039 = ~Marquisette~
@8470040 = ~Cette variété de fraises plus petites est cultivée dans le sud du Royaume de Diamant Éternel.

De forme plus allongée et davantage colorée, elle se conserve beaucoup moins et ne supporte pas les transports, ce qui explique pourquoi seuls les habitant du Royaume en aient jamais goûté.
Cependant sa saveur, plus proche de la fraise des bois, est considérée comme plus "authentique" que celle de la fraise commune. Sa chair extrêmement savoureuse, son goût plus sucré et son parfum très prononcé, exceptionnel et intense, en font en effet l'un des fruits les appréciés du Royaume.

Les herboristes utilisent ses feuilles en médecine, mais personne n'a jamais su dire pourquoi, ni dans quel but...~
@8470041 = ~Cette variété de fraises plus petites est cultivée dans le sud du Royaume de Diamant Éternel.

De forme plus allongée et davantage colorée, elle se conserve beaucoup moins et ne supporte pas les transports, ce qui explique pourquoi seuls les habitant du Royaume en aient jamais goûté.
Cependant sa saveur, plus proche de la fraise des bois, est considérée comme plus "authentique" que celle de la fraise commune. Sa chair extrêmement savoureuse, son goût plus sucré et son parfum très prononcé, exceptionnel et intense, en font en effet l'un des fruits les appréciés du Royaume.

Les herboristes utilisent ses feuilles en médecine pour fabriquer des potions de soins. Encore faut-il en connaître la recette.

PARAMÈTRES :

Spécial :
- Soignent 1 point de dégâts par poignée mangée.
- Immunisent contre les maladies pendant 1 heure.~
Les deux derniers effets

Code : Tout sélectionner

	LPF ADD_ITEM_EFFECT INT_VAR opcode = 139 target = 1 timing = 4 parameter1 = %strrefnom2% power = 255 resist_dispel = 2 duration = 300 END
	LPF ADD_ITEM_EFFECT INT_VAR opcode = 174 target = 1 timing = 4 power = 255 resist_dispel = 2 duration = 300 STR_VAR resource = EFF_E01 END
ne sont pas joués.

Pourtant, je suis allé vérifier dans une sauvegarde et ils sont parfaitement présents dans le fichier du perso concerné.

Ce qui est d'autant plus étrange que j'ai utilisé des fonctions équivalentes pour d'autres objets et que ça marche pour eux !

Si quelqu'un avait une idée de la c...... dans le potage...


Je joins l'objet patché en pièces jointes.
Fichiers joints
GWFrt16.itm
(1.24 Kio) Téléchargé 282 fois
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Avatar du membre
Isaya
Adepte de Grondemarteau
Planaire
Messages : 6990
Enregistré le : mar. 22 juil. 2003, 21:03
Localisation : Plaisir
Contact :
Statut : Hors ligne
.

Message par Isaya »

J'ai essayé l'objet, j'ai bien obtenu le texte associé à l'effet se déclenchant au bout de 300 s. Je n'ai pas essayé plusieurs fois, c'est trop long d'attendre aussi longtemps. :p J'ai eu la flemme de reprendre toutes les durées pour les réduire.

Est-ce que tous tes objets ont autant d'effets ?
Dans tes tests, as-tu provoqué une grosse accumulation d'effets sur le personnage au même moment ?
Se pourrait-il que le jeu sature quand un personnage a trop d'effets en cours ?
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
Avatar du membre
Freddy_Gwendo
Adepte de Grondemarteau
Orbe ancien
Messages : 5877
Enregistré le : sam. 23 avr. 2011, 00:26
Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
Statut : Hors ligne
.

Message par Freddy_Gwendo »

En fait comme je l'ai dit, ce dysfonctionnement apparaît de manière aléatoire : les mêmes effets fonctionnent sur un objet et pas sur un autre, ou bien fonctionnent parfois - ou pas - sur un même objet.

Pour mes tests, j'utilise une partie issue du tout début du donjon d'Irenicus (Charname, Jaheira et Minsc avec Imoen à qui j'ai enlevé son ceinturon). Donc à priori, ils ne disposent pas de matos générant des effets enregistrés, exceptée ma cavalière (effets liés à son kit).

C'est étrange : je viens de refaire les tests et comme toi, ça a fonctionné les 3 premières fois. Mais pas les deux suivantes. Et c'est indépendant du perso utilisé.
Par ailleurs, j'ai réduit aussi la durée à 30 s pour faciliter le test : j'obtiens à peu près les mêmes pourcentages d'échec.

Bon, je vais laisser ça comme ça pour l'instant en attendant de trouver une cause logique : le souci se produit pour 4 objets sur les 50 premiers que j'ai codés : je les mets de côté et je verrai plus tard. L'essentiel, c'est que les effets soient opérants et tant pis si je n'ai pas le message de fin : la plupart des sorts ou objets de BG2 ne les indiquent pas. Je trouvais cet affichage plus "RP".

Quant aux nombres d'effets d'immunité, c'est dû aux composants d'aTweaks qui a extériorisé les capacités de certains monstres. Ce que j'avais fait moi-même pour mes morts-vivants et mes dragons bien avant sa sortie... Du coup, je suis obligé de remetrre à niveau bon nombre d'objets proposant des immunités ou des protections. Encore du boulot que je croyais ne pas avoir à mettre à jour... :(
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Répondre

Retourner vers « Menace sur le Royaume de Diamant Éternel »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 0 invité