Page 1 sur 1

[WeiDU] Comment utiliser un fichier ini pour définir des variables alphanumériques ?

Posté : mer. 29 mars 2017, 16:12
par Freddy_Gwendo
Je voudrais simplifier l'installation de mon mod, notamment zapper certains ACTION_READLN en utilisant des variables définies dans un fichier .ini.

D'après ce que j'ai vu, il est assez facile d'aller rechercher des valeurs numériques en vérifiant par exemple l'existence d'une ligne ma_variable=0 ou ma_variable=1.
En revanche, je suis complètement perdu sur la manière de vérifier une valeur alphanumérique.

En l'occurrence, je voudrais :

1. Lancer ACTION_READLN si unicorn_name="unknown", puis écrire unicorn_name="nom de ma licorne" dans le fichier ini.
2. Sinon, lire la variable unicorn_name (ex : unicorn_name="nom de ma licorne") pour l'intégrer dans mes traitements.

Et je suis un poil coincé. Des idées ?

Posté : mer. 29 mars 2017, 21:48
par Isaya
Peux-tu citer un mod qui le fait afin d'avoir un exemple, s'il te plaît ? Parce c'est du chinois pour moi.

Posté : jeu. 30 mars 2017, 10:39
par Freddy_Gwendo
Plusieurs mods utilisent des fichiers ini propres ou installés par d'autres mods, notamment BGT, Spellpack, Item et spell revision, ou stratagems.

Exemple d'utilisation par BGT :

Code : Tout sélectionner

///////////////////////////////////////////////////////
// journal, sound, and [] update of bg1.tra
///////////////////////////////////////////////////////

OUTER_SET tra_updated = 0

ACTION_IF FILE_EXISTS ~bgt/install/%LANGUAGE%/bg1.tra~ BEGIN
  COPY ~bgt/install/%LANGUAGE%/bg1.tra~ ~bgt/install/%LANGUAGE%/bg1.tra~
    PATCH_INCLUDE ~bgt/include/tra_update.tpp~
    PATCH_IF ("%LANGUAGE%" STRING_EQUAL ~english~) BEGIN
      PATCH_IF NOT (FILE_EXISTS "TobEx_ini/TobExVer.txt") OR
               NOT (FILE_EXISTS "TobEx_ini/TobExTweak.ini") OR
               NOT ([color="#FFFF00"]FILE_CONTAINS "TobEx_ini/TobExTweak.ini" "Engine :D isable Force Inventory Pause=1[/color]")
      BEGIN
        PATCH_INCLUDE ~bgt/include/tra_mod_eng.tpp~
      END
    END
    SET tra_updated = 1

  LOAD_TRA ~bgt/install/%LANGUAGE%/bg1.tra~
END
Exemple d'utilisation par Spellpack :

Code : Tout sélectionner

// Updating Chant .vvc files if 3D acceleration is enabled, so it blends into the background more
ACTION_IF ([color="#FFFF00"]FILE_CONTAINS ~baldur.ini~ ~3D Acceleration=1~[/color]) BEGIN
	COPY_EXISTING ~ICBLESAI.vvc~ ~override~
                      ~SPBLESHI.vvc~ ~override~
                      ~LC_CURSE.vvc~ ~override~
		READ_BYTE   0x18 display_flags1
                WRITE_BYTE  0x18 (display_flags1 BAND 0b11110111) // Disables 3D blend
                READ_BYTE   0x19 display_flags2
                WRITE_BYTE  0x19 (display_flags2 BOR 0b00000010)  // Enables this nice-looking blend
                READ_BYTE   0x1a colour_flags1
                WRITE_BYTE  0x1a (colour_flags1 BOR 0b00100000)   // Enables "own brightness"
	BUT_ONLY_IF_IT_CHANGES
END
Et fichier ini utilisé par Item revision ;

Code : Tout sélectionner

// Main Component               
install_tobex                   = 1 // installs ToBEx; automatically skipped if ToBEx is already installed and up to date or it's not a non-EE ToB game
install_sensible_lore           = 1 // balances lore gains so classes other than bard have a better chance of identifying items
install_ioun_stone_animations   = 1 // new ioun stone animations by WoRm
install_item_reallocation       = 1 // removes two items from bonus merchant and equips them on enemies, matching SCS behaviour

// Store Revisions              
install_masterwork_weapons      = 0 // +1 weapons are changed to masterwork; outdated - mostly functional, but not recommended (use SCS component instead)
                                
// Revised Armor                
armor_dexterity_penalty         = 1 // adds dexterity penalties to armor
armor_speed_factor_penalty      = 1 // ditto for attack speed factor
armor_physical_resistance       = 1 // adds physical resistance bonus
armor_ac_modifiers              = 1 // modifies AC bonuses vs different weapon types (slashing, piercing etc.)
                                
// Spellcasting in Armor        
armor_casting_speed_clerics     = 0 // divine spellcasters will be affected as well ("Casting Speed Penalties for Arcane Casters" subcomponent only)
armor_free_casting              = 0 // cheat version, will override other options and enable unrestricted spellcasting in armor (either subcomponent)
bards_armor_spell_penalties	  = 0 // Bards get the normal penalties to casting when using any armor lighter than chain mail
                                
// Weapon Changes               
halberds_can_slash_too          = 0 // adds a slashing mode to halberds
flails_have_extended_range      = 0 // extends flails' range to 2
dnd_3e_scimitars                = 0 // sets scimitars' damage to 1d6 (from 1d8) and add +5% critical chance

// Revised Backstabbing
add_backstabbing_penalties 	  = 1 // gives backstab penalties to certain weapons, overridden by "Penalties with Thief-only Weapons" if chosen.
En fait, ce que je veux, c'est inclure un certain nombre de variables de configuration dans le fichier .ini, notamment les noms d'une licorne et d'un destrier.

unicorn_name = "unknown"
warhorse_name = "unknown"

Lors de l'installation, si unicorn_name est "unknown", je lance la procédure READLN afin que l'utilisateur choisisse un nom pour sa licorne. Sinon, j'utilise le nom saisi dans le fichier ini.

En phase de développement, ça m'éviterait des saisies pénibles lors de mes installations quotidiennes après chaque modif. Pour y remédier, je déclare pour l'instant une variable à l'installation (OUTER_SPRINT unicorn_name), mais comme la prochaine génération de WeiDU gérera les fichiers ini, j'ai décidé de rayer définitivement ce point de ma ToDO list.

De plus, les utilisateurs avertis pourront modifier directement le fichier ini avant l'installation.

Posté : ven. 14 sept. 2018, 18:06
par Freddy_Gwendo
Un an et demi plus tard, le problème est réglé. ;)

Voici comment lire le fichier ini suivant :

Code : Tout sélectionner

;101_ia.tph traified
; Use 1pp or IWD style female dwarf paperdolls?
; 1 = IWD - 2 = 1pp
1pp_Fdwarf=2

;104_core.tph traified
; Do you want to include SoA style loading screens for ToB?
; 1 =  Yes. - 2 = Keep loading screens unchanged.
1PP_gui=1

; Install updated fonts? (may cause issues with languages using different font .BAMs)
; 1 = Yes - 2 = Keep fonts unchanged
1pp_updated_fonts=1

; Use mixed case labels?
; 1 = Yes - 2 = No
1pp_labels=1

; Softer Spell Effects
; WARNING: This component will only work properly with 3D support enabled (alpha blending). Installing this component on BG2 in software rendering mode IS NOT A GOOD IDEA.
; 1 = Yes, install - 2 = No, cancel installation
1pp_softer_spell_effects=1

; Install IWD-style Agannazar's Scorcher or alternate style?
; 1 = IWD style - 2 = BGII alternate
1pp_agannazar_scorcher=2

;Entrez le nom de votre licorne
licorn_name=bla bla

Code tp2:

Code : Tout sélectionner

ALWAYS

	OUTER_SPRINT configuration-default EVAL "%MOD_FOLDER%/configuration-default.ini" // default configuration file to read initial variable values
	OUTER_SPRINT configuration EVAL "%MOD_FOLDER%/configuration.ini" // user created file, not included inside mod archive, if exist it will overwrite variable values from default configuration file

	DEFINE_ACTION_MACRO GW_BUILD_INI_ARRAY BEGIN
	   OUTER_TEXT_SPRINT $GW_ini_contents(~%label%~) ~%value%~
	END

	DEFINE_PATCH_FUNCTION ~GW_READ_INI_VARIABLE~
	   INT_VAR start_offset = 0
	   RET start_offset
	        end_offset	
	   RET_ARRAY GW_ini_contents
	BEGIN

	   SET offset = start_offset
	   PATCH_IF (offset < 0) BEGIN SET offset = 0 END
	   PATCH_IF (offset > BUFFER_LENGTH) BEGIN SET offset = BUFFER_LENGTH END
	   SET start_offset = "-1"
	   SET end_offset = "-1"

	   SET ofsStart = INDEX_BUFFER(~[0-9a-zA-Z]~ offset)
	   PATCH_IF (ofsStart >= 0) BEGIN
	      SET ofsValue = INDEX_BUFFER(~=~ ofsStart)
	      PATCH_IF (ofsValue >= 0) BEGIN
		READ_ASCII (ofsStart) label (ofsValue - ofsStart)
		TO_LOWER label
		SET ofsEnd = INDEX_BUFFER(~[%WNL%]~ ofsValue)
		PATCH_IF (ofsEnd >= 0) BEGIN
		   READ_ASCII (ofsValue + 1) value (ofsEnd - ofsValue -1)	
		   SET start_offset = ofsStart
		   SET end_offset = ofsEnd
		   INNER_ACTION BEGIN LAM GW_BUILD_INI_ARRAY END
		END
	      END
	   END
	END

	DEFINE_ACTION_FUNCTION GW_READ_CONFIG
	   STR_VAR GW_filename = ""
	   RET_ARRAY GW_ini_contents
	BEGIN

	   COPY - ~%GW_filename%.ini~ ~override~ // COPY - means no actual changes to the file
	      INSERT_BYTES SOURCE_SIZE (STRING_LENGTH ~%WNL%~)
 	      WRITE_ASCIIE SOURCE_SIZE ~%WNL%~
	      REPLACE_TEXTUALLY ";.*" ""
	      REPLACE_TEXTUALLY "#.*" ""
	      COUNT_REGEXP_INSTANCES CASE_SENSITIVE ~=~ GWnbvariables
	      start_offset = 0
	      FOR (i = 0 ; i < GWnbvariables ; ++i) BEGIN
		LPF ~GW_READ_INI_VARIABLE~ INT_VAR start_offset RET end_offset RET_ARRAY GW_ini_contents END
		start_offset = end_offset
	      END

	END
 
	PRINT "%configuration-default%"
	LAF GW_READ_CONFIG STR_VAR GW_filename = EVAL "%configuration-default%" RET_ARRAY GW_array = GW_ini_contents END
	ACTION_IF FILE_EXISTS ~%configuration%~ THEN BEGIN
 	   PRINT "%configuration%"
 	   LAF GW_READ_CONFIG STR_VAR GW_filename = EVAL "%configuration%" RET_ARRAY GW_array = GW_ini_contents END
	END

END


BEGIN @1 DESIGNATED 100 LABEL "Main"

ACTION_PHP_EACH GW_array AS label => value BEGIN
   OUTER_SPRINT EVAL "%label%" "%value%"
   PRINT "VARIABLE %label% = %value%"
END
Ce code fera sans doute partie du prochain utilitaire d'installation automatique des mods.