About


The Infinity Animations mod patches Baldur's Gate II: Throne of Bhaal engine to support additional creature and character animations (referred to as 'animation slots'). Thus, it acts as a central hub, usable by anyone who would like to add animation entries to the game without being bogged down by issues of mod conflicts and incompatibilities

This guide is intended for modders who wish to make their mods compatible with Infinity Animations. Is is organized using a tutorial approach, in which you are guided through each step of accomplishing particular modding tasks without breaking compatibility.


Infinity Animations: Note for modders > AboutBACK TO TOP

ANIMATE.ids file


In a perfect world, Infinity Animations would be installed at the very top of an installation as a data base that would be usable by anyone who would like to add new animation entries to the game or use them in a mod. Unfortunately, since it was designed a long time after the first mega-mods generation that were overwriting game files, in particular to resolve animation conflicts and restore standard animations that mega-mods have overwritten; it needs to be installed after those mega-mods, at least until their authors will update them to benefit from Infinity Animations content...

While waiting for this marvelous day, here is the perfect way to make sure that the new animations you are going to use or install won't cause any incompatibility issues with other mods.


The first thing to do is to check that you have the right ANIMATE.ids file. Unfortunately, this is not as easy as it sounds. 🙁


Indeed, many mods modify, or even worse, overwrite the existing ANIMATE.ids file. As a result, a umber rock may end up with a cyclops or a goblin animation. It's rather messy, isn't it?

Another perverse effect of successive modifications of the ANIMATE.ids file is the stacking of identical animations listed with a different name or/and index. These new entries are not only redundant and useless, but they can cause serious or critical glitches during installation of mods that use the IDS_OF_SYMBOL (animate ~animation name~) command to ensure their compatibility with both classic and EE games.

That is why you have to follow instructions below if you want to use animations not present in the basic games:

1. Install Infinity Animations main component before your mod. It harmonizes ANIMATE.ids file to make it usable by all mods and all games.

2. Never overwrite ANIMATE.ids file.

3. Rather use the procedure described in the following chapters to add your new animations.

⚠️ Note that these instructions are also available for ANISND.ids file.


Infinity Animations: Note for modders > ANIMATE.ids fileBACK TO TOP

Claiming and Adding new Animation slots (classic game)


If you'd like to add your own animation to the game, please take the time to read and follow the guidelines outlined in the Adding an Animation Entry section of the IA Reference Picker documentation. The process is very simple and should not take more than a few minutes. If everyone (that includes you) can stick to these guidelines, moderation or approval of claims will not be required.

If you've read and understood these guidelines and feel your claim qualifies, read on in the next section.


Infinity Animations: Note for modders > Claiming and Adding new Animation slots (classic game)BACK TO TOP

Adding new Animation slots in EE Games


Adding new animations in EE games is a little bit easier than the process described above. And most importantly, it does not require Infinity Animations to be installed. 😉


⚠️ If your mod is also designed to be installed in a classic game, start by registering your animation with the IA Reference Picker tool as described in the section above.




1. Choose the appropriate animation slot type

At this point you should be absolutely certain of the type of slot you need for your animation. Consult the Animations reference chart if in doubt.

Once your bam files are built, go to next step.




2. Implement your slot in the game

The easiest way is to use the procedure developed to install Infinity Animations in a EE game. To do this, you will need the following functions libraries:

INCLUDE ~%MOD_FOLDER%/lib/a7_functions.tpa~
INCLUDE ~%MOD_FOLDER%/lib/gw_functions_ee.tpa~

with

  • a7_functions.tpa: Argent77's functions library to install new animations slots into ANIMATE.ids (big thanks to him!)
  • gw_functions_ee.tpa: list of macros and functions dealing with installing animation slots in EE games.
  • gw_ee_compat_arrays.tph: library of arrays used to add and install new creature animations (slots, bam, wav files...).

How does it work?

It is pretty simple. IA WeiDU function GW_FIND_FREE_ANIM_SLOT looks for the first available animation slot matching a given animation type, defined in "GW_anim_slots_ee" array.

  ► Function GW_FIND_FREE_ANIM_SLOT (defined in gw_functions_ee.tpa library) and GW_anim_slots_ee array (defined in gw_ee_compat_arrays.tph library):

/* ================================================================================================================================================ *
 *  FUNCTION GW_FIND_FREE_ANIM_SLOT : LOOKS for the first available animation slot matching a given animation type.                                 *
 *                                    RECHERCHE le premier slot d'animation disponible selon le format de l'animation.                              *
 * ------------------------------------------------------------------------------------------------------------------------------------------------ *
 *  Returns the first available creature animation slot in the range matching its type defined by %GWFormatAnim%.                                   *
 *  Original function courtesy of Argent77 - Modified by Gwendolyne to make Infinity Animations installation compatible with EE games.              *
 * ------------------------------------------------------------------------------------------------------------------------------------------------ *
 *  INT_VAR GWSlotFound  = Used internally to stop the function when a slot is found (DON'T MODIFY IT!).                                            *
 *  STR_VAR GWFormatAnim = A slots range defined in GW_anim_slots_ee array (built in gw_ee_compat_arrays.tph).                                      *
 *                         Each slots range is defined with the lowest and highest available creature animation slots matching its animation type.  *
 *                         The array also defines how many slots to skip after each iteration, starting from the lowest one.                        *
 *  RET slot             = Free animation slot found. Returns -1 if none found.                                                                     *
 * ================================================================================================================================================ */

DEFINE_ACTION_FUNCTION ~GW_FIND_FREE_ANIM_SLOT~
    INT_VAR GWSlotFound  = 0
    STR_VAR GWFormatAnim = ""
    RET     slot
BEGIN

    ACTION_IF ("%GWFormatAnim%" STR_CMP "") BEGIN

        ACTION_PHP_EACH GW_anim_slots_ee AS slots => GW_slot BEGIN

           ACTION_IF (GWSlotFound = 0) BEGIN

                ACTION_IF ("%slots_0%" STR_EQ "%GWFormatAnim%") OR ("%GW_slot%" STR_EQ "%GWFormatAnim%") BEGIN

                    OUTER_SET GW_slotMin = %slots_1%
                    OUTER_SET GW_slotMax = %slots_4%
                    ACTION_IF (%slots_3% > 0) BEGIN
                        OUTER_SET GW_iter = (GW_slotMax - GW_slotMin) / %slots_3%
                        // Looping through iterations between GW_slotMin and GW_slotMax
                        OUTER_FOR (i = 0 ; i <= GW_iter ; ++i) BEGIN
                            ACTION_IF (GWSlotFound = 0) BEGIN
                                OUTER_SET slotMin = GW_slotMin + (i * %slots_3%)
                                OUTER_SET slotMax = slotMin + %slots_2%
                                LAF ~FIND_FREE_ANIM_SLOT~ INT_VAR slotMin slotMax RET slot END
                                ACTION_IF ("%slot%" >= 0) BEGIN
                                    OUTER_SET GWSlotFound = 1
                                END
                            END
                        END // of Looping through iterations between GW_slotMin and GW_slotMax
                    END ELSE BEGIN
                        ACTION_IF (GWSlotFound = 0) BEGIN
                            LAF ~FIND_FREE_ANIM_SLOT~ INT_VAR slotMin = GW_slotMin slotMax = GW_slotMax RET slot END
                            ACTION_IF ("%slot%" >= 0) BEGIN
                                OUTER_SET GWSlotFound = 1
                            END
                        END
                    END

                END // ACTION_IF ("%slots_0%" STR_EQ "%GWFormatAnim%") OR ("%GW_slot%" STR_EQ "%GWFormatAnim%")

            END     // of ACTION_IF (GWSlotFound = 0)

        END         // of ACTION_PHP_EACH

    END             // of ACTION_IF ("%GWFormatAnim%" STR_CMP "")

END                 // of DEFINE_ACTION_FUNCTION

/* =========================================================================================== *
 *  ARRAY GW_anim_slots_ee : DEFINES available slots ranges matching each animation type.      *
 * ------------------------------------------------------------------------------------------- *
 *  Used by function GW_FIND_FREE_ANIM_SLOT to install new animation slots in EE games.        *
 * ------------------------------------------------------------------------------------------- *
 *  1st value = animation type.                                                                *
 *  2nd value = lowest available creature animation slot for this animation type.              *
 *  3rd value = how many slots to search inside each step.                                     *
 *  4th value = how many slots to skip after each iteration, starting from the lowest one.     *
 *  5th value = highest available creature animation slot for this animation type.             *
 *  6th value = specific range to customize where to install new slots.                        *
 * ------------------------------------------------------------------------------------------- *
 *  Use: to install a BG1 SIMPLE MONSTER animation, you can                                    *
 *   - Either choose the general 1st value label: BG1SM.                                       *
 *   - Or choose a specific range: 1SM7100 will look for the first free available slot from    *
 *     0x7110 to 0x7200, reading 2 slots every 0x10 step (0x7110, 0x7111, 0x7120, 0x7121...).  *
 * =========================================================================================== */



When a slot is found, it is converted into hex value (function TO_HEX_NUMBER) to append ANIMATE.ids file. This value is stored into $GWNewIni(~%GWNewAnim%~) array used to rename its relative .ini files.




What better than an example to transcribe this code in the tp2 installer? 😉

/* --------------------------------------------------------- *
 *  BGII SPLIT (EE: monster, split_bams=1): 0x7300 - 0x7f00  *
 * --------------------------------------------------------- */

ACTION_FOR_EACH GWNewAnim IN ~DAO~ ~DAO_LEGS~ ~EFREETI_LEGS~ ~JANNI~ ~JANNI_LEGS~ ~MARID~ ~MARID_LEGS~ BEGIN
    SILENT
    LAF ~GW_FIND_FREE_ANIM_SLOT~ STR_VAR GWFormatAnim = BG2SPLIT RET slot END
    ACTION_IF (slot < 0) BEGIN
        WARN @1141  // ~!!! WARNING : No free creature animation slot found for %GWNewAnim% !!!~
    END ELSE BEGIN
        LAF ~TO_HEX_NUMBER~ INT_VAR value = slot minDigits = 4 RET hexNumber END
        APPEND ~animate.ids~ ~0x%hexNumber% %GWNewAnim%~ UNLESS ~%GWNewAnim%~
        OUTER_SPRINT $GWNewIni(~%GWNewAnim%~) EVAL "%hexNumber%"
        CLEAR_IDS_MAP
    END
END

/* -------------------------------------------- *
 *  IWD (EE monster_icewind): 0xe000 --> 0xefff *
 * -------------------------------------------- */

ACTION_FOR_EACH GWNewAnim IN ~BOVINE_AXE_THING~ BEGIN
    SILENT
    // 1. First, we try to install it closer to 0xe070 MINOTAUR
    LAF ~FIND_FREE_ANIM_SLOT~ INT_VAR slotMin = 0xe070 slotMax = 0xe080 RET slot END
    // 2. If no free slot found, we install it in the first free available slot
    ACTION_IF (slot < 0) BEGIN
        LAF ~GW_FIND_FREE_ANIM_SLOT~ STR_VAR GWFormatAnim = IWD RET slot END
        ACTION_IF (slot < 0) BEGIN
        WARN @1141  // ~!!! WARNING : No free creature animation slot found for %GWNewAnim% !!!~
        END
    END
    ACTION_IF (slot > 0) BEGIN
        LAF ~TO_HEX_NUMBER~ INT_VAR value = slot minDigits = 4 RET hexNumber END
        APPEND ~animate.ids~ ~0x%hexNumber% %GWNewAnim%~ UNLESS ~%GWNewAnim%~
        OUTER_SPRINT $GWNewIni(~%GWNewAnim%~) EVAL "%hexNumber%"
        CLEAR_IDS_MAP
    END
END

ACTION_FOR_EACH GWNewAnim IN ~MARILITH_DARK~ BEGIN
    SILENT
    // 1. First, we try to install it closer to 0xe090 MARILITH
    LAF ~FIND_FREE_ANIM_SLOT~ INT_VAR slotMin = 0xe090 slotMax = 0xe0a0 RET slot END
    // 2. If no free slot found, we install it in the first free available slot
    ACTION_IF (slot < 0) BEGIN
        LAF ~GW_FIND_FREE_ANIM_SLOT~ STR_VAR GWFormatAnim = IWD RET slot END
        ACTION_IF (slot < 0) BEGIN
            WARN @1141
        END
    END
    ACTION_IF (slot > 0) BEGIN
        LAF ~TO_HEX_NUMBER~ INT_VAR value = slot minDigits = 4 RET hexNumber END
        APPEND ~animate.ids~ ~0x%hexNumber% %GWNewAnim%~ UNLESS ~%GWNewAnim%~
        OUTER_SPRINT $GWNewIni(~%GWNewAnim%~) EVAL "%hexNumber%"
        CLEAR_IDS_MAP
    END
END

ACTION_FOR_EACH GWNewAnim IN ~BEETLE_BOMBARDIER_NWN~ BEGIN
    SILENT
    // 1. First, we try to install it closer to 0xe220 BEETLE_BOMBARDIER
    LAF ~FIND_FREE_ANIM_SLOT~ INT_VAR slotMin = 0xe220 slotMax = 0xe230 RET slot END
    // 2. If no free slot found, we install it in the first free available slot
    ACTION_IF (slot < 0) BEGIN
        LAF ~GW_FIND_FREE_ANIM_SLOT~ STR_VAR GWFormatAnim = IWD RET slot END
        ACTION_IF (slot < 0) BEGIN
            WARN @1141
        END
    END
    ACTION_IF (slot > 0) BEGIN
        LAF ~TO_HEX_NUMBER~ INT_VAR value = slot minDigits = 4 RET hexNumber END
        APPEND ~animate.ids~ ~0x%hexNumber% %GWNewAnim%~ UNLESS ~%GWNewAnim%~
        OUTER_SPRINT $GWNewIni(~%GWNewAnim%~) EVAL "%hexNumber%"
        CLEAR_IDS_MAP
    END
END 




If you don't know how to set up the .INI file defining the parameters with which the engine will display your animation, please see the next chapter. Otherwise, next step is installing all files related to your animation(s), as explained in this chapter.


Infinity Animations: Note for modders > Adding new Animation slots in EE GamesBACK TO TOP

Ini files Description


All settings relative to the way the engine displays creature animations in-game are stores in .INI files (one for each animation slot) whose names are the same as the animation slot ID (for example 1100.ini for the slot 0x1100).

  ► 1100.ini :

// MTAN tanarri

[general]
animation_type=1000
move_scale=8
ellipse=32
color_blood=47
color_chunks=255
sound_freq=8
personal_space=5
cast_frame=4

[monster_quadrant]
caster=1
extend_direction=1
extend_direction_test=9
false_color=0
path_smooth=0
quadrants=4
resref=MTAN

[sounds]
attack=tanar04,blank,blank
attack_frame=0,0,0
awake=
awake_frame=0
cast=
cast_frame=0
conjure=
conjure_frame=0
damage=tanar06
damage_frame=0
die=tanar07a
die_frame=0
head_turn=
head_turn_frame=0
ready=
ready_frame=0
shoot=
shoot_frame=0
twitch=
twitch_frame=0
walk=
walk_frame=0
attack_slash=tanar03,blank,blank
attack_slash_frame=0,0,0
attack_backslash=tanar03,blank,blank
attack_backslash_frame=0,0,0
attack_jab=tanar04,blank,blank
attack_jab_frame=0,0,0
emerge=
emerge_frame=0
hide=
hide_frame=0
sleep=
sleep_frame=0
battle_cry=tanar01a,tanar02a
battle_cry_frame=0,0
selection=tanar01a
selection_frame=0
fall=fal_03b
fall_frame=0 



Each .INI file contains three sections, described below: [general], [animation] and [sounds] sections.




[general]General animation settings


This section lists all global settings needed to display the animation, regardless of its type. Most are common to all available animation types. However, a few are restricted to specific animation types.


Variable Description Available values
animation_type As its name suggests, this is the animation type that will be displayed by the engine.

Below are their matching type names in IA for classic games:
  • 1000 = BGI MONSTER LONG 4 PARTS without extend directions, BGII SPLIT 4 PARTS (0x13nn slots).
  • 1100 = BGI MONSTER LONG 4 PARTS with extend directions.
  • 1200 = DRAGON 9 PARTS.
  • 2000 = BGI SIMPLE CASTER BOW, BGI SIMPLE CASTER SWORD and BGI SIMPLE CASTER.
  • 3000 = ANKHEG.
  • 5000 = CHARACTER BGII and CHARACTER BGI.
  • 6000 = CHARACTER BGII and CHARACTER BGI.
  • 7000 = BG1 SIMPLE MONSTER, BGII SPLIT and BGII UNSPLIT EXT.
  • 8000 = BGI SIMP. MONST (paletted).
  • 9000 = BGI MONSTER LONG (paletted).
  • a000 = BGI MONSTER LONG
  • e000 = IWD.
4 digits

0000 = effect
1000 = monster_quadrant, multi_new, monster_multi
2000 = monster_layered_spell
3000 = monster_ankheg
4000 = town_static
5000 = character
6000 = character, character_old
7000 = monster_old, monster
8000 = monster_layered
9000 = monster_large
a000 = monster_large16
b000 = ambient_static
c000 = ambient
d000 = flying
e000 = monster_icewind
move_scale Animation base movement speed. Default speed for humanoid creatures is 9.
Note: PST:EE uses floating point notation.
Integer or Float
ellipse Creature selection circle radius. Default size for humanoid creatures is 16. Integer
color_blood Just what it means. 😉
However, blood always uses the left-most color of each Color palette lookup index, so most of them end up being indistinguishable in-game.
Most of the good ones for blood are in the 45-60 and 115-150 ranges.
Any integer from 0 to 255
color_chunks Color gradient index for the associated chunk animation.
Whether the animation can chunk or not (used for example in EFFECT_EXPLODINGDEATH).
Any integer from 0 to 255

0 = Yes [default]
255 = No (such as trolls)
sound_freq Sounds frequency (specifies the delay between creature sounds). Most of animations are set in under 10. Any integer from 0 to 255
sound_death Specifies the sound file played when the creature dies.
Note: does not seem to be used.
String
personal_space Controls how creatures interact with the game world and can move through passages and doorways. It is measured in search map units.
Most are 3 (humanoid creatures), dragons are 13.
Any integer from 0 to 255
cast_frame Specifies the sound delay (in animation frames) for casting animations. Integer
brightest Blending mode (passed directly to the renderer).

1. If brightest=1 and multiply_blend=0, the following blending mode is performed
  • srcFactor = GL_ONE_MINUS_DST_COLOR
  • destFactor = GL_ONE
2. If brightest=1 and multiply_blend=1, the following blending mode is performed
  • srcFactor = GL_SRC_COLOR
  • destFactor = GL_ONE
Boolean:

0 = No [default]
1 = Yes
multiply_blend Blending mode (passed directly to the renderer).

1. If multiply_blend=1 and brightest=0, the following blending mode is performed
  • srcFactor = GL_DST_COLOR
  • destFactor = GL_ONE
2. If multiply_blend=1 and brightest=1, the following blending mode is performed
  • srcFactor = GL_SRC_COLOR
  • destFactor = GL_ONE
Note: often used with a glow_layer bam files set.
Boolean:

0 = No [default]
1 = Yes
light_source Whether certain tinting effects (e.g. environmental lighting such as day/night, weather or shadows) affect the creature animation. Boolean:

0 = No [default]
1 = Yes
new_palette Refers to a BMP file with an external palette that modifies the animation BAM files colors.
For example, MWLF_WI.BMP palette overwrites the MWLF bam files palettes to display winter wolf animation.
String
height_offset Used to calculate the top of the bounding box for certain effects, such as the health bar, blood splatter, etc.
Note: seems to be only used in BG:EE and SoD games...
Integer
combat_round_0
combat_round_1
combat_round_2
combat_round_3
combat_round_4
A pseudo-image (BMP file) which defines attack pattern (how attack animation sequences are triggered within a combat round). String
glow_layer Refers to a BAM prefix acting as an additional background layer for glowing sprites (used by deva and planetars animations).

Note: This option is currently defined in the wrong INI section. To be effective it should be defined in the [monster] section of type 7000 animations.
In addition, it looks like it hasn't been fully implemented and doesn't seem to be applied to the weapon overlay. And it doesn't work correctly with unsplit animation schemes (split_bams=0).
String
walk_sound The sound clip series used to play the default creature walking sound. String




[Specific animation]Specific animation type settings


This section lists all settings related to the animation type. Replace Specific animation in square brackets with the animation type name matching the animation_type variable.


Variable Description Available values
armor_max_code

(character and character_old animations only)
Maximum armor level a character can equip.

It's basically set to 4 for all the characters except for the monk who has it set to 1.
1 = No Armor
2 = Leather / Studded leather
3 = Chain Mail / Robe
4 = Plate
caster

(monster_layered and monster_quadrant animations only)
Whether A2 and A3 sequences are (also) used as CA and SP (overridden if weapon overlays are defined) or not.
monster_quadrant type: whether A3 sequence is used as CA.
Boolean:

0 = No [default]
1 = Yes
can_lie_down Whether the creature animation displays frames when it falls down when dead/unconscious (Used by Death and Sleep animations).
Note: Doesn't appear to be related to animation display.
Quote from Bubb: "When a creature is being created and normally 'gets up' (like in summons), determines whether it immediately assigns to its self-reporting list, or LIST_BACK (when can_lie_down=1). I didn't see a direct link to animation sequences, but maybe I missed some connection."
Boolean:

0 = No [default]
1 = Yes
detected_by_infravision Whether a red tint is applied to the creature animation when detected by infravision.
For example, undead creatures are not detected by infravision.
Boolean:

0 = No [default]
1 = Yes
double_blit Unknown effect: Possibly a performance setting in the original games.

Note: Apparently unused (only used by 0x6400 drizzt) and unimplemented, but should probably always be set to 0.
Boolean:

0 = No [default]
1 = Yes
mirror Whether eastern directions are calculated by the engine or not.

Note: Apparently unused (only used by 0x3001 neothelid), but should probably always be set to 0 (eastern directions are available in xxxxE BAM files).
Boolean:

0 = No [default]
1 = Yes
extend_direction

(monster_quadrant and monster_ankheg animations only)
Whether the bam files need mirrored directions.
By default ('No'), the engine automatically mirrors directions (draws eastern directions). Otherwise eastern directions are available as xxxxE BAM files.
monster_ankheg type: Number of available directions per animation sequence (e.g. 5 for ankhegs).
Boolean:

0 = No [default]
1 = Yes
extend_direction_test

(monster_quadrant animations only)
The number of western directions needed in each set of BAM files if eastern directions are to be calculated by the engine.
Quote from Bubb: "When sprite mirroring is enabled / direction is being extended, determines how many valid directions the base vidcell holds."
9 (when set) or 8 (neothelid)
false_color Whether animation uses palette replacement of individual color ranges (see color fields in CRE resource or color-related opcodes) or not. Boolean:

0 = No [default]
1 = Yes
invulnerable Indicates whether creature is un-killable by default (e.g. child animations). Boolean:

0 = No [default]
1 = Yes
list_type

(ambient animations only)
Used internally by the engine to apply special behavior to the creature.
2 means "flying" (such as bats): not detected by infravision, WK transformed to SC, many hardcoded exceptions (including polymorph, pathfinding, etc.).
Integer [0,1,2]
path_smooth Defines how pathfinding is calculated.

Note that path_smooth=1 is not well documented (probably uses as many angles as directions available).
Boolean:

0 = uses only 45 degrees angles (S, SW, W, NW, N,...)
1 = uses arbitrary angles
quadrants The number of segments the animation frames have been split into. Integer
equip_helmet

(character and character_old animations only)
Whether helmet overlays are drawn or not. Boolean:

0 = No [default]
1 = Yes
height_code

(character and character_old animations only)
Weapons animation overlays BAM prefix ("WQL", "WQM", "WQN", "WQS", "WPL", "WPM" or "WPS").
Fallback option if height_code_helmet or height_code_shield are not defined
String
height_code_helmet

(character and character_old animations only)
Same as above, but for the helmets animation overlays. String
height_code_shield

(character animation animations only)
Same as above, but for the shields animation overlays.
Note: WQH does not seem to exist...
String
resref Animation base name, i.e BAM files prefix (MDEM, MTRO...).
Note for character animation type: It can be overridden by animations with class-specific suffix if available (resref_armor_base and resref_armor_specific).
String
shadow

(effect and character_old animations only)
  • effect: specifies a separate shadow BAM resref.
  • character_old: changes default shadow from "CSHD" to what is provided. The Drizzt and Sarevok animations use hardcoded resref ("CSHD" and "SSHD" respectively).
String
split_bams Whether the BAM files are split or not.

Note: if split_bams=0, animations are packed in G1-G2 BAM files.
Boolean:

0 = No [default]
1 = Yes (animations are spread over various subfiles)
translucent Whether animation is semi-transparent or not. Boolean:

0 = No [default]
1 = Yes
resref_weapon1

(monster_layered and monster_layered_spell animations only)
Which one-handed weapon animation overlay (BAM suffix) to use. String (MS, S1, SS)
resref_weapon2

(monster_layered and monster_layered_spell animations only)
Which two-handed weapon animation overlay (BAM suffix) to use. String (BW, HB)
dual_attack

(monster_layered_spell animations only)
When set: SEQ_SHOOT transforms into SEQ_READY, and A3 has a chance to use A1 instead. Boolean:

0 = No [default]
1 = Yes
weapon_left_hand

(monster_icewind animations only)
Propagated, but apparently unused (or unimplemented?) in EE games. Boolean:

0 = No [default]
1 = Yes
resref_paperdoll BAM files prefix for inventory paperdoll graphics (CHMC, CHMF...).
Scheme: [resref_paperdoll][armor_level]INV.BAM
String
resref_armor_base

(character and character_old animations only)
This is the 4th character that replaces the last character of the resref animation filename prefix for shared character animations.

'B' for cleric and fighter, 'M' for monk, 'T' for thief, 'W' for wizard.
single character
resref_armor_specific

(character and character_old animations only)
This is the 4th character that replaces the last character of the resref animation filename prefix for class-specific character animations.
Used when the armor code is equal to armor_max_code.
Usually it is the same character as resref_armor_base, except for clerics and fighters that share the same resref value.
While equipped with armors lighter than plate, they use the same animation files; but when they equip a plate, their animation are different.
In this case, a human cleric male and a human fighter male will use the same CHMB prefix BAM files series when equipped with the three first armor levels (no armor, leather and chain), but when equipped with a plate, the cleric will use the CHMC bam series and the fighter the CHMF series.
'C' for cleric, 'F' for fighter, 'M' for monk, 'T' for thief, 'W' for wizard.
single character
hide_weapons

(character_old animations only)
Used by animations without height_code variable; i.e. their weapons animations are part of their main animation (resref BAM files). [0x6400 UDRZ drizzt, 0x6401 UELM elminster and 0x6404 USAR sarevok]

0: draw separate weapon overlay - 1: do not draw weapon overlays
Boolean:

0 = No [default]
1 = Yes
palette1

(monster and monster_multi animations only)
Refers to a BMP file, a palette replacement for xxxxG1 (unsplit) or xxxxG1x (split) BAM files.
Note: usually the same as new_palette resref.
String
palette2

(monster and monster_multi animations only)
Refers to a BMP file, a replacement for xxxxG2 (unsplit) or xxxxG2x (split) BAM files.
Note: usually named with same pattern as the same as palette1; i.e. if palette1 is MPAL_CL1, then palette2 is MPAL_CL2.
String
palette3

(monster_multi animations only)
Refers to a BMP file, a replacement for xxxxG3 (unsplit) or xxxxG3x (split) BAM files.

However, due to a buggy implementation they are basically defunct. Falls back to the [general] section new_palette value + number of animation group (e.g. the Green Dragon palette resref "MDR1_GR" implies that palette resrefs MDR1_GR1, MDR1_GR2, MDR1_GR3, MDR1_GR4 and MDR1_GR5 are used).
String
palette4

(monster_multi animations only)
Refers to a BMP file, a replacement for xxxxG4 (unsplit) or xxxxG4x (split) BAM files.

However, due to a buggy implementation they are basically defunct. Falls back to the [general] section new_palette value + number of animation group (e.g. the Green Dragon palette resref "MDR1_GR" implies that palette resrefs MDR1_GR1, MDR1_GR2, MDR1_GR3, MDR1_GR4 and MDR1_GR5 are used).
String
palette5

(monster_multi animations only)
Refers to a BMP file, a replacement for xxxxG5 (unsplit) or xxxxG5x (split) BAM files.

However, due to a buggy implementation they are basically defunct. Falls back to the [general] section new_palette value + number of animation group (e.g. the Green Dragon palette resref "MDR1_GR" implies that palette resrefs MDR1_GR1, MDR1_GR2, MDR1_GR3, MDR1_GR4 and MDR1_GR5 are used).
String
palletized

(effect animations only)
Appears not to be implemented. Boolean:

0 = No [default]
1 = Yes
alt_palette

(effect animations only)
Seems to specify a replacement palette for the effect animation. String
random_render

(effect animations only)
Indicates whether to select a random cycle at spawn or not. Boolean:

0 = No [default]
1 = Yes
delta_z

(effect animations only)
Determines how fast certain hardcoded effects move on the (fake) z-axis. Integer




[sounds]Sound clips settings


Unlike classic games, EE games don't store sounds assigned to a given animation in a .2DA file, but in its .INI file.

⚠️ Please note that all animations Mxxx.2DA files are not used by the EE engine.


You can use one of the existing ones (e.g. 1100.INI) as a template:

[sounds]
attack=tanar04,blank,blank
attack_frame=0,0,0
awake=
awake_frame=0
cast=
cast_frame=0
conjure=
conjure_frame=0
damage=tanar06
damage_frame=0
die=tanar07a
die_frame=0
head_turn=
head_turn_frame=0
ready=
ready_frame=0
shoot=
shoot_frame=0
twitch=
twitch_frame=0
walk=
walk_frame=0
attack_slash=tanar03,blank,blank
attack_slash_frame=0,0,0
attack_backslash=tanar03,blank,blank
attack_backslash_frame=0,0,0
attack_jab=tanar04,blank,blank
attack_jab_frame=0,0,0
emerge=
emerge_frame=0
hide=
hide_frame=0
sleep=
sleep_frame=0
battle_cry=tanar01a,tanar02a
battle_cry_frame=0,0
selection=tanar01a
selection_frame=0
fall=fal_03b
fall_frame=0 




Next step is installing all files related to your animation(s).


Infinity Animations: Note for modders > ini files descriptionBACK TO TOP

Installing new animations in games


1. Copying new animations to the game

To do this, you are strongly recommended to store the animation .bam files in a separate directory, for example 📁 bam/cre, in which you create a subdirectory for each animation, which you copy to the 📁 override folder:

ACTION_FOR_EACH animation IN ~animation1~ ~animation2~ ~animation3~ ... BEGIN

    ACTION_BASH_FOR ~%MOD_FOLDER%/bam/cre/%animation%~ ~^.+\.bam$~ BEGIN

        // We copy only the files we do need.
        ACTION_IF NOT FILE_EXISTS_IN_GAME ~%BASH_FOR_FILE%~ BEGIN
            ACTION_TO_LOWER %BASH_FOR_FILE%
            COPY_LARGE ~%BASH_FOR_FILESPEC%~ ~override/%BASH_FOR_FILE%~
        END

    END

END 




2. Installing 2da files (classic games) or ini files defining general sprite values and soundsets (EE games)

If you want to provide a classic-EE games compatibility, it is better to store .2da and .ini files in two separate folders, for example 📁 2da/cre and 📁 ini.

⚠️ Note for EE games: Since the animation slot ID is unknown before its installation, and may depend on other animations installed by other mods before yours, here is a little trick that makes it easy to install .ini files. Assign to your animation.ini file the name of the animation registered in the ANIMATE.IDS file. For example dao.ini, dao_legs.ini, animation1.ini, animation2.ini... 😉




Then copy the .2da files into the override (classic game):

COPY ~%MOD_FOLDER%/2da/cre~ ~override~ 




As for .ini files (EE games), borrow the code written for Infinity Animations that uses the hex value defined with the ANIMATE.IDS appending process to automatically copy the corresponding .ini file with the right animation ID [$GWNewIni(~%GWNewAnim%~)].

ACTION_BASH_FOR ~%MOD_FOLDER%/ini~ ~^.+\.ini$~ BEGIN

    OUTER_SPRINT inifile EVAL "%BASH_FOR_RES%"
    ACTION_TO_UPPER inifile

    // Gives each new .ini file its right name (its animation slot index)
    ACTION_IF VARIABLE_IS_SET $GWNewIni(~%inifile%~) BEGIN
        SILENT
        OUTER_SPRINT GW_nv_ini $GWNewIni(~%inifile%~)
        COPY ~%BASH_FOR_FILESPEC%~ ~override/%GW_nv_ini%.ini~
        PRINT @1121  // ~  ==> Animation %inifile%.ini file installed as 0x%GW_nv_ini%.ini~
    END ELSE BEGIN
        PRINT @1122  // ~  ==> Animation %inifile%.ini file not installed.~
    END

END 




Congratulations, you have just claimed an animation entry, and installed a new creature animation! 🥂


On top of that, a mod template summarizing the whole procedure, which you can integrate into your code, is the "icing on the cake": You will find it in the 📁 documentation/mymod folder. 😝


Infinity Animations: Note for modders > Installing new animations in gamesBACK TO TOP

Using new animation slots


👎 Old school way: forget it!

Your new animation being installed, you just have to use it. To do this, you must assign it to a .CRE file, i.e. fill its animation field (0x28) with the value of the new animation slot.

To illustrate this, let's create a bald eagle as an animal companion for a ranger. Before the release of the Enhanced Edition games, it was very simple, by installing the creature like this:

COPY ~%MOD_FOLDER%/cre/mycre.cre~ ~override~
    WRITE_LONG 0x28 0x535D  // Animation ID (GW_BALD_EAGLE)
BUT_ONLY 

Et voilĂ  !


Well, almost...

Why? Because, as explained in the above sections, new animations don't fill the same slots in original games as in EE games. This code would inevitably produce a CTD in a EE game. 😖

To install this creature in a EE game, you would have had to use the following code:

COPY ~%MOD_FOLDER%/cre/mycre.cre~ ~override~
    WRITE_LONG 0x28 0xE001  // Animation ID (GW_BALD_EAGLE)
BUT_ONLY 


And again, this code would only work on your own installation: If another player had installed a mod adding a new IWD animation before yours, your eagle animation would have been installed in slot 0xE002 and your creature would be given the 0xE001 other mod's animation. 😩


So, how to provide perfect compatibility? It is very simple! 😛




👍 New way: 100% safe and compatible with both original and EE games

Use the WeiDU IDS_OF_SYMBOL command which will automatically look up the index of an animation slot in the ANIMATE.IDS file.

Moreover, it has the advantage of not requiring the use of IF GAME_IS ~~ BEGIN conditions.


Thus, the following code will fill mycre.cre with 0x535D animation slot in a classic game and the slot defined by GW_FIND_FREE_ANIM_SLOT function in a EE game:

COPY ~%MOD_FOLDER%/cre/mycre.cre~ ~override~
    WRITE_LONG 0x28 IDS_OF_SYMBOL (animate ~GW_BALD_EAGLE~)  // Animation ID (GW_BALD_EAGLE) : original 0x535D - EE 0xE001
BUT_ONLY 

This is the simplest and most convenient method used by Infinity Animations mod to be easily installed on all BG based games.


Infinity Animations: Note for modders > Using new animation slotsBACK TO TOP

Updating old mods


As explained in the mod's readme, in a perfect world, Infinity Animations would be installed as a central hub that would be usable by anyone who would like to add animation entries to the game without being bogged down by issues of mod conflicts and incompatibilities.

Unfortunately, since it was designed a long time after the first mega-mods generation that were overwriting game files, in particular to resolve animation conflicts and restore standard animations that mega-mods have overwritten; it needs to be installed after those mega-mods, at least until their authors will update them to benefit from Infinity Animations content...

While waiting for the wonderful day when Infinity Animations will be able to devote itself to its first vocation and not have to solve mods compatibility issues and conflicts, here are a few tips to adapt your mod to the new AI version. Don't worry, it is not very complicated if you are not the author of a mega-mod!




Avoid bad practices

First of all, let's make a detailed assessment of the bad practices that Infinity Animations is striving to correct and that should be avoided at any cost.

The following points should be avoided if you do not want to suffer the wrath of other modders, and players who will not hesitate to point out that your mod ruins their installation:

  • 1. Do not install Infinity Animations if it is not detected.
    Some mods automatically install the pre-requisite mods they need to work properly. While this isn't a problem with TobEx, it can be problematic with mods like Infinity Animations, which will be once again actively maintained. If you want to be definitively convinced, please read the literature about the difficulty of making 1PP v4.2.0 cohabit with Item and Spell Revisions which install by default a few components of 1PP v3.

  • 2. Don't use any "biffing" routines.
    This practice was common in the early 2000s, as it allowed to bypass the small capacities of hard disks and avoided lags. However, it is no longer necessary today, because the Generalized Biffing mod allows the gamers to biff the content of their override folder for improved performance, which means the files are converted into the BIF file format and moved into the data folder. Moreover, biffing mod files may, in some cases, cause malfunctions. So avoid doing it!

  • 3. Never overwrite existing animation slots with your own ones.
    As a result, a umber rock may end up with a cyclops or a goblin animation. It's rather messy, isn't it?

  • 4. Never overwrite ANIMATE.ids file.
    And above all, DO NOT DUPLICATE identical animations listed with a different name and/or index.



1.Make sure Infinity Animations is installed.


This allows you to :

  • Ensure your mod will be compatible with all games by harmonizing their animation slots.
  • Install creatures using missing animations in EE games without having to check that their .bam, .ini and .wav files are not missing.
  • Avoid overloading your mod with dozens (or even hundreds) of useless .bam files.
  • Enjoy all the animations, original, specific to Infinity Animations or shared by modders, without having to install them.

You just have to insert in your tp2 the following line as a prerequisite to install your mod:

REQUIRE_PREDICATE MOD_IS_INSTALLED ~infinityanimations.tp2~ (ID_OF_LABEL ~infinityanimations.tp2~ ~infinity_animations_main~) @ nn
with
@nn   = This mod requires Infinity Animations main component.~ 

Note : this code est much more 'robust' than the one usually used before, which was MOD_IS_INSTALLED ~infinityanimations.tp2~ ~0~.




2.Simplify the installation process of the mod.


Take advantage of the update of your mod to simplify its installation process.




2.a. Remove all "biffing" routines.

This concerns almost exclusively mega-mods. The procedure is underway for most of the mods published at SHS to make them compatible with the new version of Infinity Animations.




2.b.Remove any duplicated animation slot entry.

Stacking identical animation slots listed with a different name or/and index is not only useless, but can cause serious or critical glitches during installation of mods that use the IDS_OF_SYMBOL (animate ~animation name~) command to ensure their compatibility with both classic and EE games.

This is the reason why all unnecessary duplication of slots should be removed from tp2, such as the following mods, taken randomly:

BP mod
APPEND ~animate.ids~ ~0xE010 IC_ETTIN~             UNLESS ~0xE010~
APPEND ~animate.ids~ ~0xE040 IC_HISTACHII~         UNLESS ~0xE040~
APPEND ~animate.ids~ ~0xE060 IC_LICH~              UNLESS ~0xE060~
APPEND ~animate.ids~ ~0xE090 IC_MERILITH~          UNLESS ~0xE090~
APPEND ~animate.ids~ ~0xE0A0 IC_ICE_TROLL~         UNLESS ~0xE0A0~
APPEND ~animate.ids~ ~0xE0C0 IC_SNOW_TROLL~        UNLESS ~0xE0C0~
APPEND ~animate.ids~ ~0xE0D0 IC_UMBERHULK~         UNLESS ~0xE0D0~
APPEND ~animate.ids~ ~0xE0E0 IC_CORNUGONSKI~       UNLESS ~0xE0E0~
APPEND ~animate.ids~ ~0xE0F0 IC_ICE_GOLEM~         UNLESS ~0xE0F0~
APPEND ~animate.ids~ ~0xE0F1 IC_GLAB~              UNLESS ~0xE0F1~
APPEND ~animate.ids~ ~0xE0F2 IC_WAILING_VIRGIN~    UNLESS ~0xE0F2~
APPEND ~animate.ids~ ~0xE200 IC_BEETLE_COPPER~     UNLESS ~0xE200~
APPEND ~animate.ids~ ~0xE210 IC_BEETLE_FIRE~       UNLESS ~0xE210~
APPEND ~animate.ids~ ~0xE220 IC_BEETLE_BLACK~      UNLESS ~0xE220~
APPEND ~animate.ids~ ~0xE230 IC_BEETLE_RHINOCEROS~ UNLESS ~0xE230~
APPEND ~animate.ids~ ~0xE300 IC_GHOST~             UNLESS ~0xE300~
APPEND ~animate.ids~ ~0xE310 IC_GHOUL~             UNLESS ~0xE310~
APPEND ~animate.ids~ ~0xE320 IC_GHAST~             UNLESS ~0xE320~
APPEND ~animate.ids~ ~0xE510 IC_LIZARDMAN2~        UNLESS ~0xE510~
APPEND ~animate.ids~ ~0xEA10 IC_SHADE~             UNLESS ~0xEA10~
APPEND ~animate.ids~ ~0xEA20 IC_SHADE2~            UNLESS ~0xEA20~
APPEND ~animate.ids~ ~0xEE00 IC_ZOMBIE~            UNLESS ~0xEE00~
APPEND ~animate.ids~ ~0xEE10 IC_ZOMBIE2~           UNLESS ~0xEE10~

Drizzt Saga mod
APPEND ~ANIMATE.IDS~ ~0xE0E0 IC_CORNUGONSKI~

Hanna NPC mod
APPEND ~ANIMATE.IDS~ ~0xE060 IC_LICH~

Improved Anvil mod
APPEND ~animate.ids~ ~0xE0F0 IC_ICE_GOLEM~ UNLESS ~\bIC_ICE_GOLEM\b~

Knight Kits mod
APPEND ~ANIMATE.IDS~ ~0xE040 IC_HISTACHII~ UNLESS ~0xE040 IC_HISTACHII~

TDD mod
APPEND ~ANIMATE.IDS~ ~0xE250 IC_GOLEM_IRON~  UNLESS ~0xE250~
APPEND ~ANIMATE.IDS~ ~0xE24F IC_GIANT_FROST~ UNLESS ~0xE24F~
APPEND ~ANIMATE.IDS~ ~0xE000 IC_CYCLOPS~     UNLESS ~0xE000~ 

To illustrate this, here are the duplicated animation slots of the animate.ids file installed by the Big World Fixpack which gathers all the slots created by a mega-installation:

  ► Big World Fixpack animate.ids :

...
0x1300 DEMIGORGON
0x1300 DEMOGORGON
...
0x7701 REVEANT
0x7701 REVENANT
...
0x7F09 SAHAUGIN
0x7F09 SAHUAGIN
...
0x7F23 SAHAUGIN_LARGE
0x7F23 SAHUAGIN_LARGE
...
0x7F2C AMISH_SOLDIER
0x7F2C AMNISH_SOLDIER
...
0x7F3A HULA_WIZARD
0x7F3A IRENICUS_ROBED
...
0x7F3F YAGA-SHURA
0x7F3F GIANT_YAGA-SHURA
...
0xE010 IC_ETTIN
0xE010 ETTIN
...
0xE050 IC_LICHBLACK
0xE050 LICH_BLACK
0xE060 IC_LICH
0xE060 LICH_WHITE
0xE070 IC_MINOTAUR
0xE070 MINOTAUR
0xE080 IC_MUMMY
0xE080 MUMMY
0xE090 IC_MERILITH
0xE090 MARILITH
0xE0A0 IC_ICE_TROLL
0xE0A0 ICE_TROLL
0xE0A0 TROLL_ICE
0xE0B0 IC_TROLL1
0xE0B0 TROLL_BLUE
0xE0C0 IC_SNOW_TROLL
0xE0C0 SNOW_TROLL
0xE0C0 TROLL_SNOW
0xE0D0 IC_UMBERHULK
0xE0D0 UMBER_HULK_ELDER
0xE0D0 UMBERHULK_IWD
0xE0E0 CORNUGON
0xE0E0 IC_CORNUGONSKI
0xE0F0 IC_ICE_GOLEM
0xE0F0 ICE_GOLEM
0xE0F0 GOLEM_ICE
0xE0F1 IC_GLAB
0xE0F1 GLABREZU
0xE0F2 IC_WAILING_VIRGIN
0xE0F2 WAILING_VIRGIN
0xE200 BEETLE
0xE200 BEETLE_BORING
0xE200 BEETLE_COPPER
0xE200 IC_BEETLE_COPPER
0xE210 BEETLE_FIRE
0xE210 IC_BEETLE_FIRE
0xE220 BEETLE_BLACK
0xE220 BEETLE_BOMBARDIER
0xE220 IC_BEETLE_BLACK
0xE230 BEETLE_RHINOCEROS
0xE230 IC_BEETLE_RHINOCEROS
...
0xE300 GHOST
0xE300 GHOST_IWD
0xE300 IC_GHOST
0xE310 GHOUL_GREATER
0xE310 GHOUL_IWD
0xE310 IC_GHOUL
0xE320 GHAST_GREATER
0xE320 GHAST_IWD
0xE320 IC_GHAST
0xE400 GOBLIN_AXE
0xE400 IC_GOBLIN_AXE
0xE410 GOBLIN_BOW
0xE410 IC_GOBLIN_BOW
0xE420 GOBLIN_ELITE_AXE
0xE420 GOBLINELITE_AXE 
0xE420 IC_GOBLINELITE_AXE
0xE430 GOBLIN_ELITE_BOW
0xE430 GOBLINELITE_BOW
0xE430 IC_GOBLINELITE_BOW
...
0xE500 LIZARDMAN_BROWN
0xE500 IC_LIZARDCASTER1
0xE500 LIZARD_MAN_ELITE
0xE510 LIZARD_MAN
0xE510 IC_LIZARDMAN2
0xE510 LIZARDMAN_GREEN
0xE520 LIZARD_KING
0xE520 LIZARD_MAN_KING
0xE520 IC_LIZARDCASTER3
0xE600 MYCONID
0xE600 IC_MYCONID
0xE600 MYCONID_RED
0xE610 MYCONID2
0xE610 IC_MYCONID2
0xE610 MYCONID_BLUE
0xE700 OROG
0xE700 OROG1
0xE700 IC_OROG1
0xE710 OROG2
0xE710 IC_OROG2
0xE710 OROG_ELITE
0xE720 OROG3
0xE720 IC_OROG3
0xE720 OROG_CHIEFTAIN
0xE800 ORC_MELEE
0xE800 ORC_MELEE1
0xE800 IC_ORC_MELEE1
0xE810 ORC_RANGE
0xE810 ORC_RANGE2
0xE810 IC_ORC_RANGE2
0xE820 ORC_MELEE3
0xE820 IC_ORC_MELEE3
0xE820 ORC_ELITE_MELEE
0xE830 ORC_RANGE4
0xE830 IC_ORC_RANGE4
0xE830 ORC_ELITE_RANGE
0xE840 ORC_SHAMAN
0xE840 IC_ORC_SHAMAN
0xE900 SALAMANDER
0xE900 IC_SALAMANDER
0xE900 SALAMANDER_FIRE
0xE910 SALAMANDER2
0xE910 IC_SALAMANDER2
0xE910 SALAMANDER_FROST
0xEA00 SHROOM
0xEA00 IC_SHROOM
0xEA00 SHRIEKER
0xEA10 IC_SHADE
0xEA10 GHOST_SHADOW
0xEA10 SHADOW_SMALL
0xEA10 SHADOW_SMALL_IWD
0xEA20 GHOST_SHADE
0xEA20 IC_SHADE2
0xEA20 SHADOW_LARGE
0xEA20 SHADOW_LARGE_IWD
0xEB00 SKELETON0
0xEB00 IC_SKELETON0
0xEB00 SKELETON_MONSTER
0xEB10 SKELETONA 
0xEB10 IC_SKELETONA
0xEB10 SKELETON_WARRIOR
0xEB20 SKELETONB
0xEB20 IC_SKELETONB
0xEB20 SKELETON_FIEND
0xEC00 WIGHT
0xEC00 WIGHT_GRAY
0xEC00 IC_WIGHT
0xEC10 WIGHT_GREEN
0xEC10 WIGHT_LESSER
0xEC10 IC_WIGHT2
0xEC20 WIGHT_GREATER
0xEC20 WIGHT_YELLOW
0xEC20 IC_WIGHT3
0xED00 YUAN-TI
0xED00 YUANTI
0xED00 IC_YUANTI
0xED10 YUANTI2
0xED10 IC_YUANTI2
0xED10 YUAN-TI_ELITE
0xED20 YUANTI3
0xED20 IC_YUANTI3
0xED20 YUAN-TI_PRIEST
0xEE00 ZOMBIE_LESSER
0xEE00 ZOMBIE_YELLOW
0xEE00 ZOMBIE_YELLOW_IWD
0xEE00 IC_ZOMBIE
0xEE10 ZOMBIE_BLUE
0xEE10 ZOMBIE_BLUE_IWD
0xEE10 ZOMBIE_GREATER
0xEE10 IC_ZOMBIE2
0xEF10 ELEMENTAL_WATER
0xEF10 WATER_WEIRD
0xEF10 IC_WATER_WIERD126 


Fortunately, from now on, Infinity Animations main component cleans up this file and allows to install mods on a sound basis. But damn i! Coding a patch to fix this regression was a real pain... 😡
So, please be nice and don't corrupt this file with unnecessary slots additions and duplications.




2.c. Install only necessary .bam and sound files.

As of version 6.0.0, Infinity automatically installs new animations as well as missing animations (especially in EE games), unless players have modified infinityanimations-config-default.ini file.

In addition, Infinity Animations now automatically installs creatures sound clips accordingly to the game language localization whenever relevant.

Thus, in theory, it is no longer necessary to provide these files in your mod.

However, if, for safety, you decide to keep the installation procedure of these files in case they do not exist in a classic game, do not hesitate to use the function libraries described below.




3.Use Infinity Animations functions libraries.


To ensure the most perfect compatibility with classic and EE games, I have written many libraries of functions and macros that allow to install IA components according to the games specificities. For example, the beetle bombardier sound clips have different prefixes in classic games (t-bmb) and in EE games (mbbm); the harpy animation use different slots in IA (0x5269) and in EE games (0xe252). In addition, its bam files prefixes are also not the same: 3BS in IA and MHAR in EE.

Do not hesitate to use these libraries or to be inspired by them to install your new animations.

INCLUDE ~%MOD_FOLDER%/lib/a7_functions.tpa~
INCLUDE ~%MOD_FOLDER%/lib/ps_recursive_copy.tpa~
INCLUDE ~%MOD_FOLDER%/lib/gw_functions_ee.tpa~

with

  • a7_functions.tpa: Argent77's functions library to install new animation slots into ANIMATE.ids (big thanks to him!)
  • ps_recursive_copy.tpa: Sam's functions library to recursively search files into a parent directory, then copy them to a destination directory. Adapted and modified by Gwendolyne to identify existing localized sound files and install all necessary files (animations and sounds) from 📁 archives/subfolders to 📁 override folder (gw_find_sounds_folder, gw_update_sound_clips and gw_update_content fonctions, gw_install_archives and gw_install_modders_content macros).
  • gw_functions_ee.tpa: list of macros and functions dealing with installing animation slots in EE games.
  • gw_ee_compat_arrays.tph: library of arrays used to add and install new creature animations (slots, bam, wav files...).



For support or questions, please visit the mod forum.


Infinity Animations: Note for modders > Updating old modsBACK TO TOP

Version Changelog (core component only)


Version 6.0.0  (March, 2021)
  • Modified animations name-spaces, now compatible with non-Western code pages (got rid of the the .exe patch routine forcing a code page change and rebooting if a non-Western code page was detected), and fixed duplicate usage of dragon type slots (XDR3, XDR6). 😉
  • Added native EE compatibility: changed lines of code to provide EE compatibility whenever possible, in particular the animations names have been harmonized.
  • Updated IA Reference Picker tool (can now be translated) and updated its documentation.
  • Added French translation (Gwendolyne).
  • Uploaded mod to official Spellhold Studios GitHub mirror account.


Version Beta 5  (May 12, 2010)
  • Changed the .exe patch so that it forces a code page change and reboots if a non-Western code page is detected.
  • Updated the .exe patch so that it recognises BG1 thief avatars.
  • Cloned missing animation tables from the unmodded game.
  • Added other missing animation tables to base 📁 /content folder.
  • Adding missing minotaur and water weird sounds.
  • Disabled problematic stacked animations from chitin.key.
  • Added creature sounds where relevant (major update here).
  • Fixed a minor READ_BYTE glitch in creature patching.
  • Made it certain so that subcomponents can't be installed if the main component is not installed (to prevent crashes).
  • Added night hags to the "Distinctive Fiends" component.
  • Added ghoul queens to the "Distinctive Undead" component.
  • Added white-haired Ellesime to the "More IWD2 Animations" component.
  • Added lagoon creature to the "More IWD2 Animations" component.
  • Deprecated tieflings from the cambion/alu-fiend components in favor of the "More PS:T Animations" component.
  • Corrected skeleton warriors appearing as verbeegs glitch.
  • Added Amel animation to the "More NWN Animations" component (if NTotSC is installed).
  • Added "Humanoid Animation Fixes" component.
  • Added "Moinesse's Avatars for IA" component.
  • Added "More PS:T Animations" component.
  • Added "BG1 Character Animations for Saved Games" component.
  • Added "Saved Games Animations Fixer component".
  • Traified the entire freaking mod by hand for translators (thanks for nothing, WeiDU! 😝)


Version Beta 4  (February 7, 2010)
  • Added "BG1 Character Animations for NPCs" component.
  • Added "BG1 Character Animations for Exported PCs" component.
  • Changed fiend patching to accommodate scripting.


Version Beta 3  (February 1, 2010)
  • Fixed _LOW animation corrections causing areas crashing on load.
  • Fixed scripts and dialogues that Polymorph to _LOW animations.
  • Fixed code glitch preventing installation of optional components.
  • Added option to install sounds in "Svirfneblins Animations" component.
  • Added "Fix Area Creature References".
  • Added revised salamander sound tables (MSAL and MSA2 slots).
  • Enhanced compatibility with aTweaks.
  • Enhanced creature animation patches for fiends and orc shamans.


Version Beta 2  (January 23, 2010)
  • Added installer support for non-ANSI system locales.


Version WeiDU Beta 1  (January 11, 2010)
  • First WeiDU release.
  • All affected mod and vanilla creatures patched.
  • Optional components added.


Version r.10010043
  • Fixed a bug with Icewind Dale animation slots in Baldur's Gate II.


Version r.09102252 (update)
  • Updated documentation and Reference Picker.
  • Added alternate stylesheet. 😉


Version r.09102252
  • Initial release.


Infinity Animations: Note for modders > Version Changelog (core component only)BACK TO TOP