Jump to content

argent77

Modders
  • Posts

    1,597
  • Joined

Posts posted by argent77

  1. Your mod doesn't replace any spells, but adds your own spell to the spell selection screen that coincidentally uses the same description as PfE. Since the spell is not properly configured for a priest spell it will cause some issues in the game itself.

    Just removing the ADD_SPELL line from your mod should be enough. From your last comment I assume you're using one of the Spell() script actions to cast it. I would suggest to use the SpellRES() version instead. It has the advantage that it doesn't need to be added to SPELL.IDS.

    EDIT: I need help here: How can a spell which file is called T1M2HALF.SPL and added to the game via
    ADD_SPELL ~override/T1M2HALF.spl~ 1 1 T1M2HALF

    then be called sppr117 in the game?

    Spells added to SPELL.IDS (via ADD_SPELL) are using a fixed naming scheme to be recognized by the spell selection screen: SP<TYPE><LEVEL><ID> (e.g. SP PR 1 17). The ID is simply generated from the next free slot for the requested spell level which happens to be 17 in a clean BG:EE game.

  2. Ok, it's definitely combination of 2 mods - BG1RE and Improved Shamanic Dance. Installation with RE only is fine, and with ISD alone is fine too.

     

    Argent77 's ISD adds new spell: "Add spell "Shamanic Pact", adds the new level 6 spell "Shamanic Pact" to the shaman's spellbook. It allows the caster to resurrect a target as spirit after its death and control it for a limited amount of time.

     

    Not sure if it's based on PfE, but looks like both mods share some variables.Jastey, it might be not RE after all.

    The issue of having a spell called "Wisdom has been raised by 1 permanently" is caused by BG1RE alone. Improved Shamanic Dance has nothing to do with it.

     

    Poking a bit around the BG1RE code it looks like that it's installed by the component "The Messenger 2: Rain or Snow or Gloom of Night" via ADD_SPELL as "sppr117.spl" in my game. ADD_SPELL should only be used for spells that should appear in the spell selection screen at character generation or level up. The spell in question sounds more like a quest reward. It also contains several incorrectly set fields which will probably apply some weird or unexpected behavior, including availability for druids and shamans.

     

    Removing ADD_SPELL from the installation script should fix this issue.

     

  3. You're right. There is a (patch-only) SPRINTF command available which supports %s, %d and %x format specifiers. However, the command doesn't properly convert negative values into hexadecimal format, always prefixes the result with "0x" and you can't specify minimum number of digits, which forces me to do a lot of editing either way for my purposes.

  4. The majority of my own functions and macros are too specific to be of (general) use. But there is a small number of functions that might be helpful.

     

    TO_HEX_NUMBER:

    A decimal to hexadecimal number converter. May be useful when dealing with IDS or INI files.

     

     

    /**
     * Patch function. Converts any decimal number into a hexadecimal number.
     * INT_VAR value      The decimal number to convert.
     * INT_VAR minDigits  Minimum number of digits for the returned hex value. (default: 1)
     * INT_VAR prefix     A flag that indicates whether the returned number will be prefixed with "0x". (default: 0)
     * RET hexNumber      The converted hexadecimal number as string.
     */
    DEFINE_PATCH_FUNCTION TO_HEX_NUMBER
    INT_VAR
      value     = 0
      minDigits = 1
      prefix    = 0
    RET
      hexNumber
    BEGIN
      SET minDigits = (minDigits < 1) ? 1 : minDigits
      SET minDigits = (minDigits > 8) ? 8 : minDigits
      TEXT_SPRINT hexNumber ~~
      PATCH_DEFINE_ARRAY digit BEGIN ~0~ ~1~ ~2~ ~3~ ~4~ ~5~ ~6~ ~7~ ~8~ ~9~ ~a~ ~b~ ~c~ ~d~ ~e~ ~f~ END
    
      PATCH_IF (value < 0) BEGIN
        SET signed = 1
        SET value = 0 - value
      END ELSE BEGIN
        SET signed = 0
      END
    
      WHILE (value != 0) BEGIN
        SET curDigit = value BAND 0xf
        SET value = value BLSR 4
        TEXT_SPRINT hexDigit $EVAL digit(~%curDigit%~)
        TEXT_SPRINT hexNumber ~%hexDigit%%hexNumber%~
      END
    
      WHILE (STRING_LENGTH ~%hexNumber%~ < minDigits) BEGIN
        TEXT_SPRINT hexNumber ~0%hexNumber%~
      END
    
      PATCH_IF (prefix) BEGIN
        TEXT_SPRINT hexNumber ~0x%hexNumber%~
      END
    
      PATCH_IF (signed) BEGIN
        TEXT_SPRINT hexNumber ~-%hexNumber%~
      END
    END
    
    // Action version of TO_HEX_NUMBER
    DEFINE_ACTION_FUNCTION TO_HEX_NUMBER
    INT_VAR
      value     = 0
      minDigits = 1
      prefix    = 0
    RET
      hexNumber
    BEGIN
      OUTER_PATCH ~~ BEGIN
        LPF TO_HEX_NUMBER INT_VAR value = value minDigits = minDigits prefix = prefix RET hexNumber END
      END
    END
    

     

    FIND_FREE_ANIM_SLOT:

    This function attempts to find a free creature animation slot in a given range, so that it can be used to install custom creature animations. I'm using it quite extensively in my Golem Construction mod (example code). This function requires EE games patched to v1.4 or higher. It also makes use of the function TO_HEX_NUMBER mentioned above.

     

     

    // Internally used: Animation slots reserved by vanilla or mod-added game creatures (in hexadecimal format)
    // Mods with fixed animation slots that are currently considered:
    // - Bearwalker + extended Werebear animation
    // - Pack Mule
    OUTER_TEXT_SPRINT animationSlots ~"0410" "1000" "1003" "1004" "1100" "1101" "1102" "1103" "1104" "1105" "1200" "1201" "1202" "1203" "1204" "1205" "1206" "1207" "1208" "1300" "2000" "2100" "2200" "2300" "3000" "3001" "4000" "4001" "4002" "4010" "4012" "4100" "4101" "4102" "4110" "4112" "4200" "4300" "4400" "4410" "4500" "4600" "4700" "4710" "4800" "5000" "5001" "5002" "5003" "5010" "5011" "5012" "5013" "5100" "5101" "5102" "5103" "5110" "5111" "5112" "5113" "5200" "5201" "5202" "5210" "5211" "5212" "5300" "5301" "5302" "5303" "5310" "5311" "5312" "5313" "6000" "6001" "6002" "6003" "6004" "6005" "6010" "6011" "6012" "6013" "6014" "6015" "6100" "6101" "6102" "6103" "6104" "6105" "6110" "6111" "6112" "6113" "6114" "6115" "6200" "6201" "6202" "6204" "6205" "6210" "6211" "6212" "6214" "6215" "6300" "6301" "6302" "6303" "6304" "6305" "6310" "6311" "6312" "6313" "6314" "6315" "6400" "6401" "6402" "6403" "6404" "6405" "6406" "6500" "6510" "6621" "7000" "7001" "7100" "7101" "7200" "7201" "7202" "7203" "7300" "7301" "7302" "7310" "7311" "7312" "7313" "7314" "7320" "7321" "7400" "7401" "7402" "7500" "7501" "7600" "7601" "7602" "7603" "7604" "7700" "7701" "7702" "7703" "7800" "7801" "7802" "7900" "7901" "7902" "7903" "7904" "7a00" "7a01" "7a02" "7a03" "7a04" "7b00" "7b01" "7b02" "7b03" "7b04" "7b05" "7b06" "7c00" "7c01" "7d00" "7d01" "7d02" "7d03" "7d04" "7d05" "7d06" "7d07" "7d08" "7e00" "7e01" "7f00" "7f01" "7f02" "7f03" "7f04" "7f05" "7f06" "7f07" "7f08" "7f09" "7f0a" "7f0b" "7f0c" "7f0d" "7f0e" "7f0f" "7f10" "7f11" "7f12" "7f13" "7f14" "7f15" "7f16" "7f17" "7f18" "7f19" "7f20" "7f21" "7f22" "7f23" "7f24" "7f27" "7f28" "7f29" "7f2a" "7f2b" "7f2c" "7f2d" "7f2e" "7f2f" "7f30" "7f31" "7f32" "7f33" "7f34" "7f35" "7f36" "7f37" "7f38" "7f39" "7f3a" "7f3b" "7f3c" "7f3d" "7f3e" "7f3f" "7f40" "7f41" "7f42" "7f43" "7f44" "7f45" "7f46" "7f47" "7f48" "7f49" "7f4a" "7f4b" "7f4c" "7f4d" "7f4e" "7f4f" "7f50" "7f51" "7f52" "7f53" "7f54" "7f55" "7f56" "7f57" "7f58" "7f59" "7f5a" "7f5b" "7f5c" "7f5d" "7f5e" "7f5f" "7f60" "7f61" "7f62" "8000" "8100" "8200" "9000" "a000" "a100" "a200" "a201" "a202" "b000" "b100" "b200" "b210" "b300" "b310" "b400" "b410" "b500" "b510" "b600" "b610" "b700" "c000" "c100" "c200" "c300" "c400" "c500" "c600" "c610" "c700" "c710" "c800" "c810" "c900" "c910" "ca00" "ca10" "cb00" "cc00" "cc01" "cc02" "cc04" "d000" "d100" "d200" "d300" "d400" "e000" "e010" "e020" "e040" "e050" "e060" "e070" "e080" "e090" "e0a0" "e0b0" "e0c0" "e0d0" "e0e0" "e0f0" "e0f1" "e0f2" "e200" "e210" "e220" "e230" "e240" "e241" "e242" "e243" "e244" "e245" "e246" "e247" "e248" "e249" "e24a" "e24b" "e24c" "e24d" "e24e" "e24f" "e250" "e251" "e252" "e253" "e254" "e255" "e256" "e257" "e258" "e259" "e25a" "e25b" "e25c" "e25d" "e25e" "e25f" "e260" "e261" "e262" "e263" "e264" "e265" "e266" "e267" "e26a" "e26b" "e26d" "e26e" "e26f" "e270" "e271" "e272" "e273" "e274" "e276" "e279" "e27d" "e27e" "e27f" "e280" "e281" "e282" "e283" "e288" "e289" "e28a" "e28b" "e28c" "e28d" "e28e" "e28f" "e290" "e291" "e292" "e293" "e294" "e300" "e310" "e320" "e330" "e400" "e410" "e420" "e430" "e440" "e441" "e442" "e443" "e444" "e500" "e510" "e520" "e600" "e610" "e6fe" "e700" "e710" "e720" "e800" "e810" "e820" "e830" "e840" "e900" "e910" "ea00" "ea10" "ea20" "eb00" "eb10" "eb20" "ec00" "ec10" "ec20" "ed00" "ed10" "ed20" "ee00" "ee10" "ef10" "f000" "f001" "f002" "f003" "f004" "f005" "f006" "f007" "f008" "f009" "f00a" "f00b" "f00c" "f00d" "f00e" "f00f" "f010" "f011" "f012" "f013" "f014" "f015" "f016" "f017" "f018" "f019" "f01a" "f01b" "f01c" "f01d" "f01e" "f01f" "f020" "f021" "f022" "f023" "f024" "f025" "f026" "f027" "f028" "f029" "f02a" "f02b" "f02c" "f02d" "f02e" "f02f" "f030" "f031" "f032" "f033" "f034" "f035" "f036" "f037" "f038" "f039" "f03a" "f03b" "f03c" "f03d" "f03e" "f03f" "f040" "f041" "f042" "f043" "f044" "f045" "f046" "f047" "f048" "f049" "f04a" "f04b" "f04c" "f04d" "f04e" "f04f" "f050" "f051" "f052" "f053" "f054" "f055" "f056" "f057" "f058" "f059" "f05a" "f05b" "f05c" "f05d" "f05e" "f05f" "f060" "f061" "f062" "f100" "f101" "f22e" "f80e"~
    
    /**
     * Patch function. Returns the first free creature animation slot in the range defined by slotMin and slotMax.
     * INT_VAR slotMin    Lowest available creature animation slot for the animation, inclusive. (Default: 0)
     * INT_VAR slotMax    Highest available creature animation slot for the animation, exclusive.
     *                    (Default: highest value for slot type indicated by "slotMin")
     * INT_VAR slotSteps  How many slots to skip after each iteration, starting from slotMin.
     *                    Setting this parameter is useful if compatible animation slots are always 
     *                    a fixed distance apart (e.g. at a distance of 0x10 each). (Default: 1)
     * RET slot           A free animation slot. Returns -1 if none are found in the given range.
     */
    DEFINE_PATCH_FUNCTION FIND_FREE_ANIM_SLOT
    INT_VAR
      slotMin   = 0
      slotMax   = (slotMin BAND 0xf000) + 0x1000
      slotSteps = 1
    RET
      slot
    BEGIN
      SET slot = "-1"
      SET slotSteps = (slotSteps < 1) ? 1 : slotSteps
      SET slotMin = (slotMin < 0) ? 0 : slotMin
      SET slotMax = (slotMax < 0) ? 0 : slotMax
      PATCH_IF (slotMax < slotMin) BEGIN
        SET tmp = slotMin
        SET slotMin = slotMax
        SET slotMax = tmp
      END
    
      INNER_PATCH ~%animationSlots%~ BEGIN
        FOR (idx = slotMin; idx < slotMax; idx += slotSteps) BEGIN
          LOOKUP_IDS_SYMBOL_OF_INT name ~animate~ idx
          PATCH_IF (~%name%~ STR_EQ ~%idx%~) BEGIN
            LPF TO_HEX_NUMBER INT_VAR value = idx minDigits = 4 RET hexNumber END
            PATCH_IF (NOT FILE_EXISTS_IN_GAME ~%hexNumber%.ini~ AND 
                      ~%slotList%~ STRING_CONTAINS_REGEXP ~"%hexNumber%"~ != 0) BEGIN
              SET slot = idx
              SET idx = slotMax
            END
          END
        END
      END
    END
    
    // Action version of FIND_FREE_ANIM_SLOT
    DEFINE_ACTION_FUNCTION FIND_FREE_ANIM_SLOT
    INT_VAR
      slotMin   = 0
      slotMax   = (slotMin BAND 0xf000) + 0x1000
      slotSteps = 1
    RET
      slot
    BEGIN
      OUTER_PATCH ~~ BEGIN
        LPF FIND_FREE_ANIM_SLOT
        INT_VAR
          slotMin = slotMin
          slotMax = slotMax
          slotSteps = slotSteps
        RET
          slot
        END
      END
    END
    

     

  5. You haven't mentioned whether the mod is for the classic games or the Enhanced Editions. In the latter case TIS files are much smaller (several kb instead of MB) and can easily be modified with WeiDU. File format is described in more detail in this post. It's just a matter of adding one or more tile data blocks and providing a small PVRZ file with the new graphics.

    Theoretically it would also work for the classic games if you don't mind converting the TIS to the new EE format with tile2ee, making your changes and converting it back (with the same tool).

  6. Odd though that party members return to their proper animation(though still recolored), while others revert to the Human Cleric.

    It's not limited to party members, but all creatures with humanoid creatures animations (xxx_LOW animations are restored as non-LOW animations). Monster animations appear to be restored as human clerics though.

  7. I've noticed that setting parameter 2 of opcode 32 (Raise Dead) to nonzero allows you to raise even creatures that died an exploding death. However, the opcode appears to be hardcoded to change the creature animation to a human cleric. It would be perfect for my purposes if there were a way to prevent the animation change.

  8. I've tried increasing personal space with opcode 342 (Override Creature Data) without success. I don't know how to increase selection circle size via opcode (but it would probably look weird to have a goblin running around with a dragon-sized selection circle all of a sudden).

    If nothing else works I have probably no choice but to adjust the spell description and live with this restriction.

  9. It's a bit more complicated in my case. The spell I'm working on is also using opcode 232 (Cast Spell on Condition) with condition = "Target dies" to trigger some kind of "resurrection" spell as soon as the affected creature dies. However, resurrection doesn't work when a creature dies an exploding death, so I have to somehow prevent this type of death. (Btw, scripts are out of the question.)

  10. I found an issue in EET which severely weakens the Shaman class. The script BDSHUNSU.BCS which governs the general behavior of all summoned spirits checks for a number of items equipped by the summoner in BGEE/SoD and applies their respective spell effects. However, the BG2EE version does not contain any of these checks.

     

    Since EET uses the BG2EE version of the script, items which empower the spirits will be ineffective. (Although I would rather blame Beamdog for providing a simplified script even though some of the items are still available in BG2EE as well.)

  11. I found another issue of BG1 strrefs not adapted to EET. This time in SoD's BD0010.BCS:

    // in EET:
    DisplayStringHead("Angry Flaming Fist 1",9989)  // Why did you not turn to one of them instead of Shar?
    DisplayStringHead("Angry Refugee 4",18402)  // Valygar is dead, but his body has been destroyed. I cannot do as you ask.
    
    // in SoD:
    DisplayStringHead("Angry Flaming Fist 1",9989)  // Nooo! Stay back!
    DisplayStringHead("Angry Refugee 4",18402)  // No one will help me... No one will help...
    

    Tested in EET 1.0 RC 8.6.

  12. I haven't read all the posts in this topic, so I don't know if this has already been reported.

    I noticed that some of the spell variants not available to the player recursively call themselves in an endless loop which can even grind the EEs to a halt eventually (tested SR v4 Beta 14).

    The following spells (and most likely more) are affected:
    - SPCRYO01.SPL (Cone of Cold)
    - SPWISH24.SPL (Meteor Swarm) <- may freeze the game
    - SPWISH32.SPL (Abi-Dalzim's Horrid Wilting)

  13. Regarding your view on Demogorgon's combat script, I'd like to suggest another option how to deal with items dropped by the demon on death.

    I have played a bit with the script action DropInventory(). It will drop all regular (i.e. droppable) items from the creature's inventory to the ground as it would be automatically done if the creature died normally. Would you consider adding it to the dying sequence in SCS?

    However, I don't know if there are any mods out there which add droppable items to Demogorgon that are not meant to be dropped (since he never properly dies in an unmodded game). Someone more knowledgeable about (BWS) mega mod installations can probably say more about it.

×
×
  • Create New...