Jump to content

Project: Immunity Effect "clusters"


Recommended Posts

Inspired by the IMoD discussion, I finally went through items looking for level drain immunities and whether they were missing their complementary 'disable string effects' opcodes.

 

// disables "level drained" strings from showing in items with level drain immunity
// disables "level drained" strings from showing in items with level drain immunity
COPY_EXISTING ~ABAZRING.ITM~ ~override~
             ~BAZPATRG.ITM~ ~override~
             ~BHAALHP1.ITM~ ~override~
             ~BHAALIMM.ITM~ ~override~
             ~CHALSLAY.ITM~ ~override~
             ~CHWRAITH.ITM~ ~override~
             ~DEMOGORG.ITM~ ~override~
             ~DEVA.ITM~     ~override~
             ~FINMEL01.ITM~ ~override~
             ~FSSPIR.ITM~   ~override~
             ~GORCHR.ITM~   ~override~
             ~GORFIRG.ITM~  ~override~
             ~GORJELFU.ITM~ ~override~
             ~GORJELGR.ITM~ ~override~
             ~GORMISTI.ITM~ ~override~
             ~HAMM10.ITM~   ~override~
             ~HAMM11.ITM~   ~override~
             ~HOLDRING.ITM~ ~override~
             ~HSLAYWPN.ITM~ ~override~
             ~IMMCLOUD.ITM~ ~override~
             ~IMOENHP1.ITM~ ~override~
             ~INNOC.ITM~    ~override~
             ~INVULNER.ITM~ ~override~
             ~JONHP1.ITM~   ~override~
             ~JWSUPER.ITM~  ~override~
             ~KILLSW01.ITM~ ~override~
             ~MEL01.ITM~    ~override~
             ~MINHP1.ITM~   ~override~
             ~OBJRING.ITM~  ~override~
             ~PALRING.ITM~  ~override~
             ~RAVAG03.ITM~  ~override~
             ~RING94.ITM~   ~override~
             ~RING95.ITM~   ~override~
             ~RING97.ITM~   ~override~
             ~RING98.ITM~   ~override~
             ~RING99.ITM~   ~override~
             ~ROSSRING.ITM~ ~override~
             ~SENGUA04.ITM~ ~override~
             ~SHALT01.ITM~  ~override~
             ~SLAYERWP.ITM~ ~override~
             ~STALKER.ITM~  ~override~
             ~SUREHP1.ITM~  ~override~
             ~SW1H61.ITM~   ~override~
             ~SW1H69.ITM~   ~override~
             ~TELSLAV2.ITM~ ~override~
             ~TSTATUE.ITM~  ~override~
             ~VAMPREG.ITM~  ~override~
             ~VAMPREG1.ITM~ ~override~
             ~VAMPREG2.ITM~ ~override~
 PATCH_IF (SOURCE_SIZE > 0x71) THEN BEGIN // protects against invalid files
   READ_LONG   0x64 "abil_off"
   READ_SHORT  0x68 "abil_num"
   READ_LONG   0x6a "fx_off"
   READ_SHORT  0x70 "fx_num"
   SET "new_fx" = 0
   SET "new_fx_1" = 0
   SET "new_fx_2" = 0
   SET "new_fx_3" = 0
   SET "new_fx_4" = 0
   SET "new_fx_5" = 0
   SET "new_fx_6" = 0
   SET "new_fx_7" = 0
   SET "trigger" = 0
   FOR (index = 0; index < fx_num; index = index + 1) BEGIN
     READ_SHORT ("%fx_off%" +        ("%index%" * 0x30)) "opcode"
     READ_LONG  ("%fx_off%" + 0x04 + ("%index%" * 0x30)) "string"
     READ_LONG  ("%fx_off%" + 0x08 + ("%index%" * 0x30)) "immune"
     PATCH_IF (("%opcode%" = 101) AND ("%immune%" = 216)) BEGIN // level drain immunity
       SET "trigger" = 1
       READ_ASCII ("%fx_off%" +        ("%index%" * 0x30)) "template" (0x30)
     END ELSE
     PATCH_IF (("%opcode%" = 267) AND ("%string%" = 41495)) BEGIN // disable string 41495
       SET "new_fx_1" = 1
     END ELSE
     PATCH_IF (("%opcode%" = 267) AND ("%string%" = 40968)) BEGIN // disable string 40968
       SET "new_fx_2" = 1
     END ELSE
     PATCH_IF (("%opcode%" = 267) AND ("%string%" = 40969)) BEGIN // disable string 40969
       SET "new_fx_3" = 1
     END ELSE
     PATCH_IF (("%opcode%" = 267) AND ("%string%" = 40979)) BEGIN // disable string 40979
       SET "new_fx_4" = 1
     END ELSE
     PATCH_IF (("%opcode%" = 267) AND ("%string%" = 41616)) BEGIN // disable string 41616
       SET "new_fx_5" = 1
     END ELSE
     PATCH_IF (("%opcode%" = 169) AND ("%immune%" = 59)) BEGIN // prevent level drain icon
       SET "new_fx_6" = 1
     END
     PATCH_IF (("%opcode%" = 142) AND ("%immune%" = 90)) BEGIN // display NPP icon
       SET "new_fx_7" = 1
     END
   END
   PATCH_IF ("%trigger%" = 1) BEGIN
     PATCH_IF ("%new_fx_1%" = 0) BEGIN
       INSERT_BYTES            ("%fx_off%"       ) 0x30
         WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
         WRITE_SHORT           ("%fx_off%"       ) 267          // disable string
         WRITE_LONG            ("%fx_off%" + 0x04) 41495        // strref
       SET "new_fx" = ("%new_fx%" + 1)
     END
     PATCH_IF ("%new_fx_2%" = 0) BEGIN
       INSERT_BYTES            ("%fx_off%"       ) 0x30
         WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
         WRITE_SHORT           ("%fx_off%"       ) 267          // disable string
         WRITE_LONG            ("%fx_off%" + 0x04) 40968        // strref
       SET "new_fx" = ("%new_fx%" + 1)
     END
     PATCH_IF ("%new_fx_3%" = 0) BEGIN
       INSERT_BYTES            ("%fx_off%"       ) 0x30
         WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
         WRITE_SHORT           ("%fx_off%"       ) 267          // disable string
         WRITE_LONG            ("%fx_off%" + 0x04) 40969        // strref
       SET "new_fx" = ("%new_fx%" + 1)
     END
     PATCH_IF ("%new_fx_4%" = 0) BEGIN
       INSERT_BYTES            ("%fx_off%"       ) 0x30
         WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
         WRITE_SHORT           ("%fx_off%"       ) 267          // disable string
         WRITE_LONG            ("%fx_off%" + 0x04) 40979        // strref
       SET "new_fx" = ("%new_fx%" + 1)
     END
     PATCH_IF ("%new_fx_5%" = 0) BEGIN
       INSERT_BYTES            ("%fx_off%"       ) 0x30
         WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
         WRITE_SHORT           ("%fx_off%"       ) 267          // disable string
         WRITE_LONG            ("%fx_off%" + 0x04) 41616        // strref
       SET "new_fx" = ("%new_fx%" + 1)
     END
     PATCH_IF ("%new_fx_6%" = 0) BEGIN
       INSERT_BYTES            ("%fx_off%"       ) 0x30
         WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
         WRITE_SHORT           ("%fx_off%"       ) 169          // prevent portrait icon
         WRITE_LONG            ("%fx_off%" + 0x08) 53           // level drain
       SET "new_fx" = ("%new_fx%" + 1)
     END
     PATCH_IF ("%new_fx_7%" = 0) BEGIN
       INSERT_BYTES            ("%fx_off%"       ) 0x30
         WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
         WRITE_SHORT           ("%fx_off%"       ) 142          // display portrait icon
         WRITE_LONG            ("%fx_off%" + 0x08) 90           // NPP
       SET "new_fx" = ("%new_fx%" + 1)
     END
     WHILE (("%abil_num%" > 0) AND ("%new_fx%" > 0)) BEGIN // if abilities are present, need to adjust their effects index
       SET "abil_num" = ("%abil_num%" - 1)
       READ_SHORT  ("%abil_off%" + 0x20 + ("%abil_num%" * 0x38)) "abil_fx_idx"
       WRITE_SHORT ("%abil_off%" + 0x20 + ("%abil_num%" * 0x38)) ("%abil_fx_idx%" + "%new_fx%")
     END
     WRITE_SHORT  0x70 ("%fx_num%" + "%new_fx%")
   END
 END
 BUT_ONLY_IF_IT_CHANGES

 

I ran it first through a ~^.+\.itm$~ regexp to generate the smaller list of files that actually need a'patchin'. As you can see, I wrote it in a generalized fashion so I could turn to the next project: doing the same for other immunities.

 

What effects should always be present with a Hold immunity? Confusion? Charm? Etc., etc.

Link to comment

And the creature version.

 

COPY_EXISTING ~DEVAEVIL.CRE~ ~override~
             ~DEVAGOOD.CRE~ ~override~
             ~DEVAST01.CRE~ ~override~
             ~DEVMON01.CRE~ ~override~
             ~FAMCAT25.CRE~ ~override~
             ~FAMDUS25.CRE~ ~override~
             ~FAMFAI25.CRE~ ~override~
             ~FAMFER25.CRE~ ~override~
             ~FAMIMP25.CRE~ ~override~
             ~FAMPSD25.CRE~ ~override~
             ~FAMQUA25.CRE~ ~override~
             ~FAMRAB25.CRE~ ~override~
             ~FANGEL01.CRE~ ~override~
             ~FINSOL01.CRE~ ~override~
             ~FINSOL04.CRE~ ~override~
             ~PLANET01.CRE~ ~override~
             ~PLANEVIL.CRE~ ~override~
             ~PLANGOOD.CRE~ ~override~
             ~PLANWISH.CRE~ ~override~
             ~PPGUY01.CRE~  ~override~
             ~SOLAR.CRE~    ~override~
             ~SOLAR01.CRE~  ~override~
             ~VVARKAN.CRE~  ~override~
             ~VVCAT.CRE~    ~override~
             ~VVRYOKOI.CRE~ ~override~
 PATCH_IF (SOURCE_SIZE > 0x2d3) THEN BEGIN // protects against invalid files
   READ_BYTE   0x33  "fx_type"
   READ_LONG   0x2a0 "known_off"
   READ_LONG   0x2a8 "meminfo_off"
   READ_LONG   0x2b0 "mem_off"
   READ_LONG   0x2b8 "slot_off"
   READ_LONG   0x2bc "itm_off"
   READ_LONG   0x2c4 "fx_off"
   READ_SHORT  0x2c8 "fx_num"
   SET "new_fx" = 0
   SET "new_fx_1" = 0
   SET "new_fx_2" = 0
   SET "new_fx_3" = 0
   SET "new_fx_4" = 0
   SET "new_fx_5" = 0
   SET "new_fx_6" = 0
   SET "new_fx_7" = 0
   SET "trigger" = 0
   PATCH_IF ("%fx_type%" = 1) BEGIN
     FOR (index = 0; index < fx_num; index = index + 1) BEGIN
       READ_LONG  ("%fx_off%" + 0x08 + ("%index%" * 0x108)) "opcode"
       READ_LONG  ("%fx_off%" + 0x14 + ("%index%" * 0x108)) "string"
       READ_LONG  ("%fx_off%" + 0x18 + ("%index%" * 0x108)) "immune"
       PATCH_IF (("%opcode%" = 101) AND ("%immune%" = 216)) BEGIN // level drain immunity
         SET "trigger" = 1
         READ_ASCII ("%fx_off%" +        ("%index%" * 0x108)) "template" (0x108)
       END ELSE
       PATCH_IF (("%opcode%" = 267) AND ("%string%" = 41495)) BEGIN // disable string 41495
         SET "new_fx_1" = 1
       END ELSE
       PATCH_IF (("%opcode%" = 267) AND ("%string%" = 40968)) BEGIN // disable string 40968
         SET "new_fx_2" = 1
       END ELSE
       PATCH_IF (("%opcode%" = 267) AND ("%string%" = 40969)) BEGIN // disable string 40969
         SET "new_fx_3" = 1
       END ELSE
       PATCH_IF (("%opcode%" = 267) AND ("%string%" = 40979)) BEGIN // disable string 40979
         SET "new_fx_4" = 1
       END ELSE
       PATCH_IF (("%opcode%" = 267) AND ("%string%" = 41616)) BEGIN // disable string 41616
         SET "new_fx_5" = 1
       END ELSE
       PATCH_IF (("%opcode%" = 169) AND ("%immune%" = 59)) BEGIN // prevent level drain icon
         SET "new_fx_6" = 1
       END
       PATCH_IF (("%opcode%" = 142) AND ("%immune%" = 90)) BEGIN // display NPP icon
         SET "new_fx_7" = 1
       END
     END
     PATCH_IF ("%trigger%" = 1) BEGIN
       PATCH_IF ("%new_fx_1%" = 0) BEGIN
         INSERT_BYTES            ("%fx_off%"       ) 0x108
           WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
           WRITE_LONG            ("%fx_off%" + 0x08) 267          // disable string
           WRITE_LONG            ("%fx_off%" + 0x14) 41495        // strref
         SET "new_fx" = ("%new_fx%" + 1)
       END
       PATCH_IF ("%new_fx_2%" = 0) BEGIN
         INSERT_BYTES            ("%fx_off%"       ) 0x108
           WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
           WRITE_LONG            ("%fx_off%" + 0x08) 267          // disable string
           WRITE_LONG            ("%fx_off%" + 0x14) 40968        // strref
         SET "new_fx" = ("%new_fx%" + 1)
       END
       PATCH_IF ("%new_fx_3%" = 0) BEGIN
         INSERT_BYTES            ("%fx_off%"       ) 0x108
           WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
           WRITE_LONG            ("%fx_off%" + 0x08) 267          // disable string
           WRITE_LONG            ("%fx_off%" + 0x14) 40969        // strref
         SET "new_fx" = ("%new_fx%" + 1)
       END
       PATCH_IF ("%new_fx_4%" = 0) BEGIN
         INSERT_BYTES            ("%fx_off%"       ) 0x108
           WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
           WRITE_LONG            ("%fx_off%" + 0x08) 267          // disable string
           WRITE_LONG            ("%fx_off%" + 0x14) 40979        // strref
         SET "new_fx" = ("%new_fx%" + 1)
       END
       PATCH_IF ("%new_fx_5%" = 0) BEGIN
         INSERT_BYTES            ("%fx_off%"       ) 0x108
           WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
           WRITE_LONG            ("%fx_off%" + 0x08) 267          // disable string
           WRITE_LONG            ("%fx_off%" + 0x14) 41616        // strref
         SET "new_fx" = ("%new_fx%" + 1)
       END
       PATCH_IF ("%new_fx_6%" = 0) BEGIN
         INSERT_BYTES            ("%fx_off%"       ) 0x108
           WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
           WRITE_LONG            ("%fx_off%" + 0x08) 169          // disable portrait icon
           WRITE_LONG            ("%fx_off%" + 0x18) 53           // level drain
         SET "new_fx" = ("%new_fx%" + 1)
       END
       PATCH_IF ("%new_fx_7%" = 0) BEGIN
         INSERT_BYTES            ("%fx_off%"       ) 0x108
           WRITE_EVALUATED_ASCII ("%fx_off%"       ) "%template%" // clones immunity effect
           WRITE_LONG            ("%fx_off%" + 0x08) 142          // display icon
           WRITE_LONG            ("%fx_off%" + 0x18) 90           // NPP
         SET "new_fx" = ("%new_fx%" + 1)
       END
       WRITE_LONG  0x2c8 ("%fx_num%" + "%new_fx%")
       PATCH_IF ("%fx_off%" < "%known_off%") BEGIN
         WRITE_LONG 0x2a0 ("%known_off%" + (0x108 * "%new_fx%"))
       END
       PATCH_IF ("%fx_off%" < "%meminfo_off%") BEGIN
         WRITE_LONG 0x2a8 ("%meminfo_off%" + (0x108 * "%new_fx%"))
       END
       PATCH_IF ("%fx_off%" < "%mem_off%") BEGIN
         WRITE_LONG 0x2b0 ("%mem_off%" + (0x108 * "%new_fx%"))
       END
       PATCH_IF ("%fx_off%" < "%slot_off%") BEGIN
         WRITE_LONG 0x2b8 ("%slot_off%" + (0x108 * "%new_fx%"))
       END
       PATCH_IF ("%fx_off%" < "%itm_off%") BEGIN
         WRITE_LONG 0x2bc ("%itm_off%" + (0x108 * "%new_fx%"))
       END
     END
   END
 END
 BUT_ONLY_IF_IT_CHANGES

Link to comment

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...