BACKUP ~nythrunfix/backup~ AUTHOR ~nythrun@gibberlings.net~ BEGIN ~Nythrun's Broken Cre/Itm/Spl Fix~ INSTALL_BY_DEFAULT DEFINE_PATCH_MACRO ~enforce_cre_order~ BEGIN PATCH_IF ((SOURCE_SIZE > 0x02d3) AND !(~%SOURCE_RES%~ STRING_EQUAL_CASE ~charbase~)) THEN BEGIN READ_BYTE 0x0033 "eff" READ_LONG 0x02a0 "kso" READ_LONG 0x02a4 "ksc" READ_LONG 0x02a8 "smo" READ_LONG 0x02ac "smc" READ_LONG 0x02b0 "mso" READ_LONG 0x02b4 "msc" READ_LONG 0x02b8 "iso" READ_LONG 0x02bc "ilo" READ_LONG 0x02c0 "ilc" READ_LONG 0x02c4 "elo" READ_LONG 0x02c8 "elc" READ_ASCII "kso" ~ks~ ELSE ~fail~ (0x0c * "ksc") READ_ASCII "smo" ~sm~ ELSE ~fail~ (0x10 * "smc") READ_ASCII "mso" ~ms~ ELSE ~fail~ (0x0c * "msc") READ_ASCII "iso" ~is~ ELSE ~fail~ (0x50) READ_ASCII "ilo" ~il~ ELSE ~fail~ (0x14 * "ilc") READ_ASCII "elo" ~el~ ELSE ~fail~ ("elc" * (0x30 + ((("eff" & 0x01) = 0x01) ? 0xd8 : 0x00))) DELETE_BYTES 0x02d4 (SOURCE_SIZE - 0x02d4) SET "off" = 0x02d4 WRITE_LONG 0x02a0 "off" PATCH_IF !(~%ks%~ STRING_EQUAL ~fail~) THEN BEGIN INSERT_BYTES "off" (0x0c * "ksc") WRITE_ASCIIE "off" ~%ks%~ END ELSE BEGIN SET "ksc" = 0x00 WRITE_LONG 0x02a4 "ksc" END SET "off" += (0x0c * "ksc") WRITE_LONG 0x02a8 "off" INSERT_BYTES "off" (0x10 * 0x11) PATCH_IF ((~%sm%~ STR_CMP ~fail~) AND (smc = 0x11)) THEN BEGIN WRITE_ASCIIE "off" ~%sm%~ END ELSE BEGIN SET "smc" = 0x11 WRITE_LONG 0x2ac "smc" FOR ("i1" = 0x00; "i1" < 0x07; "i1" += 0x01) BEGIN WRITE_SHORT ("off" + (i1 * 0x10)) "i1" END FOR ("i1" = 0x00; "i1" < 0x09; "i1" += 0x01) BEGIN WRITE_SHORT ("off" + ("i1" * 0x10) + 0x070) "i1" WRITE_SHORT ("off" + ("i1" * 0x10) + 0x076) 0x01 END WRITE_SHORT ("off" + 0x106) 0x02 END SET "off" += (0x10 * "smc") WRITE_LONG 0x02b0 "off" PATCH_IF !(~%ms%~ STRING_EQUAL ~fail~) THEN BEGIN INSERT_BYTES "off" (0x0c * "msc") WRITE_ASCIIE "off" ~%ms%~ END ELSE BEGIN SET "msc" = 0x00 WRITE_LONG 0x02b4 "msc" END SET "off" += (0x0c * "msc") WRITE_LONG 0x02c4 "off" PATCH_IF !(~%el%~ STRING_EQUAL ~fail~) THEN BEGIN INSERT_BYTES "off" ("elc" * (0x30 + ((("eff" & 0x01) = 0x01) ? 0xd8 : 0x00))) WRITE_ASCIIE "off" ~%el%~ END ELSE BEGIN SET "elc" = 0x00 WRITE_LONG 0x02c8 "elc" END SET "off" += ("elc" * (0x30 + ((("eff" & 0x01) = 0x01) ? 0xd8 : 0x00))) WRITE_LONG 0x02bc "off" PATCH_IF !(~%il%~ STRING_EQUAL ~fail~) THEN BEGIN INSERT_BYTES "off" (0x14 * "ilc") WRITE_ASCIIE "off" ~%il%~ END ELSE BEGIN SET "ilc" = 0x00 WRITE_LONG 0x02c0 "ilc" END SET "off" += (0x14 * "ilc") WRITE_LONG 0x02b8 "off" INSERT_BYTES "off" 0x50 PATCH_IF !(~%is%~ STRING_EQUAL ~fail~) THEN BEGIN WRITE_ASCIIE "off" ~%is%~ END ELSE BEGIN FOR ("i1" = 0x00; "i1" < 0x4c; "i1" += 0x02) BEGIN WRITE_SHORT ("off" + "i1") 0xffff END END SET SOURCE_SIZE = ("off" + 0x50) END END DEFINE_PATCH_MACRO ~use_v2_eff~ BEGIN PATCH_IF ((SOURCE_SIZE > 0x02d3) AND !(~%SOURCE_RES%~ STRING_EQUAL_CASE ~charbase~)) THEN BEGIN READ_BYTE 0x0033 "eff_type" WRITE_BYTE 0x0033 0x1 PATCH_IF (("eff_type" & 0x1) = 0x0) THEN BEGIN READ_LONG 0x02c8 "elc" PATCH_IF ("elc" > 0x0) THEN BEGIN READ_LONG 0x02c4 "elo" READ_ASCII "elo" ~efx~ (0x30 * "elc") PATCH_FOR_EACH "off1" IN 0x02a0 0x02a8 0x02b0 0x02b8 0x02bc BEGIN READ_LONG "off1" "off2" WRITE_LONG "off1" (("off2" > "elo") ? ("off2" + ("elc" * (0x108 - 0x30))) : ("off2" < 0x2d4 ? 0x2d4 : "off2")) END DELETE_BYTES "elo" (0x030 * "elc") INSERT_BYTES "elo" (0x108 * "elc") SPRINT ~rfx~ ~~ INNER_PATCH ~%efx%~ BEGIN FOR ("i1" = 0x0; "i1" < "elc"; "i1" += 0x1) BEGIN SET SOURCE_SIZE += 0xd8 READ_SHORT (("i1" * 0x30) + 0x00) "opcode" READ_BYTE (("i1" * 0x30) + 0x02) "target" READ_BYTE (("i1" * 0x30) + 0x03) "power" READ_LONG (("i1" * 0x30) + 0x04) "parameter1" READ_LONG (("i1" * 0x30) + 0x08) "parameter2" READ_BYTE (("i1" * 0x30) + 0x0c) "timing_mode" READ_BYTE (("i1" * 0x30) + 0x0d) "dispellability" READ_LONG (("i1" * 0x30) + 0x0e) "duration" READ_BYTE (("i1" * 0x30) + 0x12) "probability1" READ_BYTE (("i1" * 0x30) + 0x13) "probability2" READ_ASCII (("i1" * 0x30) + 0x14) ~resref~ INNER_PATCH_SAVE ~rfx~ ~%rfx%~ BEGIN INSERT_BYTES (("i1" * 0x108) + 0x00) 0x110 WRITE_LONG (("i1" * 0x108) + 0x10) "opcode" WRITE_LONG (("i1" * 0x108) + 0x14) "target" WRITE_LONG (("i1" * 0x108) + 0x18) "power" WRITE_LONG (("i1" * 0x108) + 0x1c) "parameter1" WRITE_LONG (("i1" * 0x108) + 0x20) "parameter2" WRITE_BYTE (("i1" * 0x108) + 0x24) "timing_mode" WRITE_LONG (("i1" * 0x108) + 0x28) "duration" WRITE_SHORT (("i1" * 0x108) + 0x2c) "probability1" WRITE_SHORT (("i1" * 0x108) + 0x2e) "probability2" WRITE_ASCIIE (("i1" * 0x108) + 0x30) ~%resref%~ WRITE_BYTE (("i1" * 0x108) + 0x5c) "dispellability" WRITE_LONG (("i1" * 0x108) + 0x80) (` 0x0) WRITE_LONG (("i1" * 0x108) + 0x84) (` 0x0) WRITE_LONG (("i1" * 0x108) + 0x88) (` 0x0) WRITE_LONG (("i1" * 0x108) + 0x8c) (` 0x0) WRITE_LONG (("i1" * 0x108) + 0xa4) (` 0x0) DELETE_BYTES (("i1" * 0x108) + 0x08) 0x8 END END END WRITE_ASCIIE "elo" ~%rfx%~ END END END END DEFINE_PATCH_MACRO ~reindex_spell_or_item_extra_effects~ BEGIN PATCH_IF (SOURCE_SIZE > 0x71) THEN BEGIN PATCH_IF !(~%SOURCE_FILE%~ STRING_MATCHES_REGEXP ~^.+\.spl~) THEN BEGIN SET "hs" = 0x28 END ELSE PATCH_IF !(~%SOURCE_FILE%~ STRING_MATCHES_REGEXP ~^.+\.itm~) THEN BEGIN SET "hs" = 0x38 END READ_LONG 0x64 "ho" READ_SHORT 0x68 "hc" READ_LONG 0x6a "eo" READ_SHORT 0x70 "ei" PATCH_IF (("ho" > "eo") AND ("hc" > 0x01)) THEN BEGIN READ_ASCII "ho" ~eh~ ELSE ~fail~ ("hs" * "hc") PATCH_IF (~%eh%~ STRING_EQUAL ~fail~) THEN BEGIN WHILE ((~%eh%~ STRING_EQUAL ~fail~) AND ("hc" > 0x00)) BEGIN READ_ASCII "ho" ~eh~ ELSE ~fail~ ("hs" * "hc") SET "hc" -= 0x01 END END DELETE_BYTES "ho" ("hs" * "hc") SET "ho" = 0x72 WRITE_LONG 0x64 "ho" WRITE_SHORT 0x68 "hc" PATCH_IF !(~%eh%~ STRING_EQUAL ~fail~) THEN BEGIN INSERT_BYTES "ho" ("hs" * "hc") WRITE_ASCIIE "ho" ~%eh%~ END END ELSE PATCH_IF (("ho" != 0x72) AND ("hc" = 0x00)) THEN BEGIN SET "ho" = 0x72 WRITE_LONG 0x64 "ho" END FOR ("i1" = 0x00; "i1" < ("hs" * "hc"); "i1" += "hs") BEGIN WRITE_SHORT ("ho" + "i1" + 0x20) "ei" READ_SHORT ("ho" + "i1" + 0x1e) "ec" SET "ei" += "ec" END PATCH_IF (SOURCE_SIZE > (0x72 + ("hs" * "hc") + (0x30 * "ei"))) THEN BEGIN DELETE_BYTES (0x72 + ("hs" * "hc") + (0x30 * "ei")) (SOURCE_SIZE - (0x72 + ("hs" * "hc") + (0x30 * "ei"))) END END END COPY_EXISTING_REGEXP GLOB ~^.+\.cre$~ ~override~ LAUNCH_PATCH_MACRO ~enforce_cre_order~ LAUNCH_PATCH_MACRO ~use_v2_eff~ BUT_ONLY_IF_IT_CHANGES COPY_EXISTING_REGEXP GLOB ~^.+\.itm$~ ~override~ LAUNCH_PATCH_MACRO ~reindex_spell_or_item_extra_effects~ BUT_ONLY_IF_IT_CHANGES COPY_EXISTING_REGEXP GLOB ~^.+\.spl$~ ~override~ LAUNCH_PATCH_MACRO ~reindex_spell_or_item_extra_effects~ BUT_ONLY_IF_IT_CHANGES