Page 1 sur 2
[DIAMANT] Programmation (WeiDU et autres)
Posté : sam. 19 nov. 2011, 00:08
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.
Réassigner des N° de cartes dans le fichier Wed via WeiDU
Posté : sam. 19 nov. 2011, 00:10
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.
Posté : sam. 19 nov. 2011, 11:40
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.
Posté : sam. 19 nov. 2011, 13:49
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 :
- Ouvrir mes cartes dans IETME et les sauvegarder sous un autre nom.
- 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
000000h Signature WED V1.3
000008h Overlays 00000005
00000ch Doors 0000000b
000010h Overlay offs 00000020
000014h Sec. header 00000098
000018h Door offset 000000ac
00001ch Door cell of 0000bd54
000020h Overlay 0
000020h Width 0050
000022h Height 003c
000024h Tileset GW0288
00002ch UNKNOWN 00000000
000030h Tilemap offs 000001ca
000034h Lookup offse 0000be54
000038h Overlay 1
000038h Width 0001
00003ah Height 0001
00003ch Tileset WTLAVA
000044h UNKNOWN 00000000
000048h Tilemap offs 0000bd4a
00004ch Lookup offse 0000e3d4
000050h Overlay 2
000050h Width 0000
000052h Height 0000
000054h Tileset
00005ch UNKNOWN 00000000
000060h Tilemap offs 0000bd54
000064h Lookup offse 0000e3ec
000068h Overlay 3
000068h Width 0000
00006ah Height 0000
00006ch Tileset
000074h UNKNOWN 00000000
000078h Tilemap offs 0000bd54
00007ch Lookup offse 0000e3ec
000080h Overlay 4
000080h Width 0000
000082h Height 0000
000084h Tileset
00008ch UNKNOWN 00000000
000090h Tilemap offs 0000bd54
000094h Lookup offse 0000e3ec
000098h Sec. header
000098h Wall poly. c 000000c6
00009ch Polygon offs 0000e4ec
0000a0h Vertices off 0000f694
0000a4h Wallgroup of 0000e3ec
0000a8h Poly. lookup 0000f40a
0000ach Door 1
0000ach Door ID PONT
0000b4h Closed 0001
0000b6h DTC index 0000
0000b8h DTC count 001f
0000bah Open poly. c 0001
0000bch Closed poly. 0001
0000beh Open poly. o 0000f2d8
0000c2h Closed poly. 0000f2ea
0000c6h Door 2
0000c6h Door ID DOOR01
0000ceh Closed 0001
0000d0h DTC index 001f
0000d2h DTC count 0012
0000d4h Open poly. c 0002
0000d6h Closed poly. 0001
0000d8h Open poly. o 0000f2fc
0000dch Closed poly. 0000f320
0000e0h Door 3
0000e0h Door ID DOOR02
0000e8h Closed 0001
0000eah DTC index 0031
0000ech DTC count 0004
0000eeh Open poly. c 0002
0000f0h Closed poly. 0001
0000f2h Open poly. o 0000f332
0000f6h Closed poly. 0000f356
0000fah Door 4
0000fah Door ID DOOR03
000102h Closed 0001
000104h DTC index 0035
000106h DTC count 0004
000108h Open poly. c 0002
00010ah Closed poly. 0001
00010ch Open poly. o 0000f368
000110h Closed poly. 0000f38c
000114h Door 5
000114h Door ID SECRET2
00011ch Closed 0001
00011eh DTC index 0039
000120h DTC count 0003
000122h Open poly. c 0000
000124h Closed poly. 0001
000126h Open poly. o 0000f39e
00012ah Closed poly. 0000f39e
00012eh Door 6
00012eh Door ID MUR1
000136h Closed 0001
000138h DTC index 003c
00013ah DTC count 000a
00013ch Open poly. c 0000
00013eh Closed poly. 0000
000140h Open poly. o 0000f3b0
000144h Closed poly. 0000f3b0
000148h Door 7
000148h Door ID MUR2
000150h Closed 0001
000152h DTC index 0046
000154h DTC count 0009
000156h Open poly. c 0000
000158h Closed poly. 0000
00015ah Open poly. o 0000f3b0
00015eh Closed poly. 0000f3b0
000162h Door 8
000162h Door ID TOMBES
00016ah Closed 0001
00016ch DTC index 004f
00016eh DTC count 000e
000170h Open poly. c 0000
000172h Closed poly. 0002
000174h Open poly. o 0000f3b0
000178h Closed poly. 0000f3b0
00017ch Door 9
00017ch Door ID SECRET1
000184h Closed 0001
000186h DTC index 005d
000188h DTC count 0008
00018ah Open poly. c 0001
00018ch Closed poly. 0000
00018eh Open poly. o 0000f3d4
000192h Closed poly. 0000f3e6
000196h Door 10
000196h Door ID TOTEM
00019eh Closed 0001
0001a0h DTC index 0065
0001a2h DTC count 0006
0001a4h Open poly. c 0001
0001a6h Closed poly. 0000
0001a8h Open poly. o 0000f3e6
0001ach Closed poly. 0000f3f8
0001b0h Door 11
0001b0h Door ID PUIT
0001b8h Closed 0001
0001bah DTC index 006b
0001bch DTC count 0015
0001beh Open poly. c 0001
0001c0h Closed poly. 0000
0001c2h Open poly. o 0000f3f8
0001c6h Closed poly. 0000f40a
0001cah Tilemap 0
0001cah Start index 0000
0001cch Tile count 0001
0001ceh Secondary ti ffff
0001d0h Overlay flag 00000000
0001d4h Tilemap 1
0001d4h Start index 0001
0001d6h Tile count 0001
0001d8h Secondary ti ffff
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 !
Posté : sam. 19 nov. 2011, 22:13
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.
Posté : dim. 20 nov. 2011, 21:57
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...
Réassigner des N° de cartes dans le fichier Wed via WeiDU
Posté : jeu. 12 janv. 2012, 18:06
par Freddy_Gwendo
Encore un grand merci à Isaya, le script fonctionne nickel : quel gain de temps !
Intégration de Infinity Animations dans le setup.tp2
Posté : ven. 13 juil. 2012, 06:33
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...
Posté : ven. 13 juil. 2012, 08:07
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 ...
Posté : ven. 13 juil. 2012, 09:23
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.
Choix de plusieurs installations via tp2
Posté : mer. 02 janv. 2013, 05:30
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 ?
Comment modifier avec WeiDU la position des frames dans un fichier .bam ?
Posté : dim. 13 janv. 2013, 09:09
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 !
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 ?
Posté : dim. 13 janv. 2013, 13:16
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é.
Posté : dim. 13 janv. 2013, 16:16
par Freddy_Gwendo
Un
ÉNORME MERCI pour ce code !
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 :
- 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...
- 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.
Posté : dim. 13 janv. 2013, 17:35
par Isaya
Freddy_Gwendo a écrit :Un ÉNORME MERCI pour ce code !
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 !
Posté : dim. 13 janv. 2013, 18:15
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.
Modifier la position des frames dans un fichier .bam avec WeiDU
Posté : lun. 14 janv. 2013, 17:31
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.
>>
LE BONHEUR TOTAL qui m'a fait gagner deux ou trois jours de boulot !
Je le recommande vivement.
Une fois de plus, tu as assuré comme une bête, Isaya !
Modifier la position des frames dans un fichier .bam avec WeiDU
Posté : mer. 16 janv. 2013, 11:46
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...
Modifier dans .are les "flags" de toutes les animations identiques (même fichier bam)
Posté : ven. 22 mars 2013, 07:16
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 !) :
- Elle concernerait tous les fichiers GWnnnn.are.
- 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 !).
- 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.
Si une bonne âme pouvait me donner un coup de main, je lui en serai infiniment reconnaissant.
Posté : ven. 10 mai 2013, 15:13
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.
Posté : jeu. 27 juin 2013, 22:47
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 ?
Posté : ven. 28 juin 2013, 04:36
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 :-/
Posté : ven. 28 juin 2013, 10:05
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...
Posté : ven. 28 juin 2013, 18:39
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...
Posté : ven. 28 juin 2013, 21:15
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.
Posté : ven. 28 juin 2013, 21:36
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 !
Posté : sam. 29 juin 2013, 17:15
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...
Posté : lun. 01 juil. 2013, 17:05
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.
Posté : lun. 01 juil. 2013, 23:08
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.
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 ?
Posté : lun. 01 juil. 2013, 23:43
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...