PATCH_IF SOURCE_SIZE > 0x71 BEGIN SPRINT t-src ~%SOURCE_FILE%~ PATCH_IF FILE_EXISTS_IN_GAME ~ar0104a.are~ BEGIN //PST hz = 0x100 //Header size END ELSE BEGIN //BG series hz = 0x72 END PATCH_IF !(~%t-src%~ STRING_MATCHES_REGEXP ~^.+\.spl~) BEGIN hs = 0x28 //Extended header size READ_STRREF 0x8 ~n1~ //Name END ELSE BEGIN PATCH_IF !(~%t-src%~ STRING_MATCHES_REGEXP ~^.+\.itm~) BEGIN hs = 0x38 READ_STRREF 0xc ~n1~ //Name END END PATCH_IF ((~%n1%~ STRING_EQUAL_CASE ~~ = 1) OR (~%n1%~ STRING_EQUAL_CASE ~~ = 1)) BEGIN SPRINT n1 ~%@25%~ END READ_LONG 0x64 hf //Header offset READ_SHORT 0x68 hc //Header count READ_LONG 0x6a fb //Feature block offset READ_SHORT 0x70 cn //Casting feature block count PATCH_IF ((hf > fb) AND (hc > 1)) BEGIN READ_ASCII hf ~eh~ ELSE ~fail~ (hs * hc) PATCH_IF (~%eh%~ STRING_EQUAL ~fail~) BEGIN WHILE ((~%eh%~ STRING_EQUAL ~fail~) AND (hc > 0)) BEGIN READ_ASCII hf ~eh~ ELSE ~fail~ (hs * hc) hc -= 1 END END DELETE_BYTES hf (hs * hc) hf = hz WRITE_LONG 0x64 hf WRITE_SHORT 0x68 hc fb = (hz + (hs * hc)) WRITE_LONG 0x6a fb PATCH_IF !(~%eh%~ STRING_EQUAL ~fail~) BEGIN PATCH_PRINT ~%@26% %t-src% (%n1%).~ INSERT_BYTES hf (hs * hc) WRITE_EVALUATED_ASCII hf ~%eh%~ END END ELSE BEGIN PATCH_IF ((hf != hz) AND (hc = 0)) BEGIN hf = hz WRITE_LONG 0x64 hf END END FOR (i1 = 0x00; i1 < (hs * hc); i1 += hs) BEGIN WRITE_SHORT (hf + i1 + 0x20) cn READ_SHORT (hf + i1 + 0x1e) cx cn += cx END PATCH_IF (SOURCE_SIZE > (hz + (hs * hc) + (0x30 * cn))) BEGIN DELETE_BYTES (hz + (hs * hc) + (0x30 * cn)) (SOURCE_SIZE - (hz + (hs * hc) + (0x30 * cn))) END dt = 0 //Delta FOR (i1 = 0; i1 < hc; i1 += 1) BEGIN //Cycle through headers READ_SHORT (hs * i1 + hf + 0x1e) fc //Effect count READ_SHORT (hs * i1 + hf + 0x20) fs //Effect offset fs += dt x1 = 0 //1st EFF x2 = 0 //2nd EFF x3 = 0 //3rd EFF WRITE_SHORT (hs * i1 + hf + 0x20) fs FOR (i2 = fs; i2 < (fs + fc); i2 += 1) BEGIN //Cycle through effects READ_SHORT (i2 * 0x30 + fb) pc //Opcode READ_LONG (i2 * 0x30 + fb + 4) p1 //Parameter 1 READ_LONG (i2 * 0x30 + fb + 8) p2 //Parameter 2 READ_BYTE (i2 * 0x30 + fb + 0xc) tm //Timing mode READ_LONG (i2 * 0x30 + fb + 0xe) dr //Duration READ_BYTE (i2 * 0x30 + fb + 0x12) b1 //Probability 1 PATCH_IF b1 > 100 BEGIN WRITE_BYTE (i2 * 0x30 + fb + 0x12) 100 END READ_SLONG (i2 * 0x30 + fb + 0x20) ds //Die sides PATCH_IF ((ds > 100) OR (ds < 0)) BEGIN WRITE_LONG (i2 * 0x30 + fb + 0x20) 0 END READ_ASCII (i2 * 0x30 + fb + 0x14) ~rf~ //ResRef //Protection effects PATCH_IF ((x1 = 0) AND (pt = 1) AND (pc = 101) AND ((p2 = 13) OR (p2 = 238))) OR ((x1 = 0) AND (pt = 2) AND (pc = 101) AND (p2 = 211)) OR ((x1 = 0) AND (pt = 2) AND (pc = 206) AND (~%rf%~ STRING_EQUAL_CASE ~spwi910~ = 1)) OR ((x1 = 0) AND (bt = 1) AND (pc = 206) AND (~%rf%~ STRING_EQUAL_CASE ~tb#impri~ = 1)) OR ((x1 = 0) AND (pt = 3) AND (pc = 101) AND ((p2 = 13) OR (p2 = 134))) OR ((x1 = 0) AND (bt = 2) AND (pc = 206) AND (~%rf%~ STRING_EQUAL_CASE ~tb#petri~ = 1)) BEGIN PATCH_PRINT ~%@21% p5drop%pt%.spl %@22% %t-src% (%n1%) %@24% %i1%.~ READ_ASCII (i2 * 0x30 + fb) ~bn~ (0x30) //Clone effect INSERT_BYTES ((i2 + 1) * 0x30 + fb) 0x30 //Insert new effect WRITE_EVALUATED_ASCII ((i2 + 1) * 0x30 + fb) ~%bn%~ WRITE_SHORT ((i2 + 1) * 0x30 + fb) 206 //Opcode (Protection from spell) WRITE_LONG ((i2 + 1) * 0x30 + fb + 4) ~-1~ //Parameter 1 (StrRef) WRITE_LONG ((i2 + 1) * 0x30 + fb + 8) 0 //Parameter 2 WRITE_EVALUATED_ASCII ((i2 + 1) * 0x30 + fb + 0x14) ~p5drop%pt%~ #8 //ResRef dt += 1 i2 += 1 fc += 1 x1 = 1 WRITE_SHORT (hs * i1 + hf + 0x1e) fc //Update effect count //Opcode 238 = Disintegrate, 211 = Imprisonment, 134 = Petrification END ELSE PATCH_IF ((x2 = 0) AND (pt = 1) AND (((pc = 13) AND (p2 = 512)) OR (pc = 238))) OR ((x2 = 0) AND (pt = 2) AND (pc = 211)) OR ((x2 = 0) AND (pt = 2) AND (pc = 213) AND (~%SOURCE_RES%~ STRING_EQUAL_CASE ~spwi910~ = 1)) OR ((x2 = 0) AND (bt = 1) AND (pc = 213) AND (~%SOURCE_RES%~ STRING_EQUAL_CASE ~tb#impri~ = 1)) OR ((x2 = 0) AND (pt = 3) AND (((pc = 13) AND ((p2 = 16) OR (p2 = 64))) OR (pc = 134))) OR ((x2 = 0) AND (bt = 2) AND (pc = 45) AND (~%SOURCE_RES%~ STRING_EQUAL_CASE ~tb#petri~ = 1)) BEGIN PATCH_PRINT ~%@23% p5drop%pt%.spl %@22% %t-src% (%n1%) %@24% %i1%.~ PATCH_IF (pc != 13) AND (pc != 238) AND (p1 != 0) BEGIN p1 = 0 //Parameter 1 WRITE_LONG (i2 * 0x30 + fb + 4) 0 END PATCH_IF (pc != 13) AND (pc != 238) AND (p2 != 0) BEGIN p2 = 0 //Parameter 2 WRITE_LONG (i2 * 0x30 + fb + 8) 0 END READ_ASCII (i2 * 0x30 + fb) ~bn~ (0x30) //Clone effect INSERT_BYTES ((i2 + 1) * 0x30 + fb) 0x30 //Insert new effect WRITE_EVALUATED_ASCII ((i2 + 1) * 0x30 + fb) ~%bn%~ WRITE_SHORT ((i2 + 1) * 0x30 + fb) 177 //Opcode (Use EFF file) PATCH_IF (pc = 13) AND (p1 != 0) BEGIN WRITE_LONG ((i2 + 1) * 0x30 + fb + 4) 0 //Parameter 1 END PATCH_IF (p2 > 8) OR (p2 < 2) BEGIN WRITE_LONG ((i2 + 1) * 0x30 + fb + 8) 2 //Parameter 2 END WRITE_BYTE ((i2 + 1) * 0x30 + fb + 0xc) 1 //Timing mode (Instantaneous) WRITE_LONG ((i2 + 1) * 0x30 + fb + 0xe) 0 //Duration WRITE_EVALUATED_ASCII ((i2 + 1) * 0x30 + fb + 0x14) ~p5drop%pt%~ #8 //ResRef PATCH_IF tm != 4 BEGIN WRITE_BYTE (i2 * 0x30 + fb + 0xc) 4 //Timing mode (Delayed) WRITE_LONG (i2 * 0x30 + fb + 0xe) 1 //Delay END dt += 1 i2 += 1 fc += 1 x2 = 1 WRITE_SHORT (hs * i1 + hf + 0x1e) fc //Update effect count END ELSE PATCH_IF (pc = 177) OR (pc = 283) BEGIN //Use EFF file (as curse) READ_ASCII (i2 * 0x30 + fb + 0x14) ~fn~ //EFF file fp = ~-1~ PATCH_IF (~%ft%~ STRING_CONTAINS_REGEXP ~ 1 %fn%~ = 0) BEGIN fp = 1 END ELSE PATCH_IF (~%ft%~ STRING_CONTAINS_REGEXP ~ 2 %fn%~ = 0) BEGIN fp = 2 END PATCH_IF (x3 = 0) AND (fp != ~-1~) BEGIN gc += 1 //Increase global effect count SPRINT zr ~~ PATCH_IF gc < 100 BEGIN SPRINT zr ~0~ END PATCH_IF gc < 10 BEGIN SPRINT zr ~00~ END SPRINT ~nf~ ~p5eff%zr%%gc%~ //New EFF INNER_ACTION BEGIN ACTION_IF FILE_EXISTS_IN_GAME ~%fn%.eff~ BEGIN COPY_EXISTING ~%fn%.eff~ ~override~ PATCH_IF SOURCE_SIZE > 0x10f BEGIN READ_ASCII 0 ~fl~ (SOURCE_SIZE) //Clone EFF END BUT_ONLY_IF_IT_CHANGES END COPY ~p5tweaks/eff/p5empty.eff~ ~override/%nf%.eff~ PATCH_IF fp = 1 BEGIN PATCH_PRINT ~%@23% %nf%.eff %@22% %t-src% (%n1%).~ WRITE_EVALUATED_ASCII 0 ~%fl%~ WRITE_LONG 0x10 146 //Opcode (Cast spell) WRITE_LONG 0x20 1 //Parameter 2 (Cast instantly) WRITE_BYTE 0x24 1 //Timing mode (Permanent) WRITE_LONG hs 0 //Duration WRITE_EVALUATED_ASCII 0x30 ~p5drop%pt%~ #8 //ResRef END ELSE BEGIN PATCH_PRINT ~%@21% %nf%.eff %@22% %t-src% (%n1%).~ WRITE_EVALUATED_ASCII 0 ~%fl%~ WRITE_LONG 0x10 206 //Opcode (Protection from spell) WRITE_LONG 0x1c ~-1~ //Parameter 1 (StrRef) WRITE_EVALUATED_ASCII 0x30 ~p5drop%pt%~ #8 //ResRef END END READ_ASCII (i2 * 0x30 + fb) ~bn~ (0x30) //Clone effect INSERT_BYTES ((i2 + 1) * 0x30 + fb) 0x30 //Insert new effect WRITE_EVALUATED_ASCII ((i2 + 1) * 0x30 + fb) ~%bn%~ WRITE_EVALUATED_ASCII ((i2 + 1) * 0x30 + fb + 0x14) ~%nf%~ #8 //New EFF dt += 1 i2 += 1 fc += 1 x3 += 1 WRITE_SHORT (hs * i1 + hf + 0x1e) fc //Update effect count END END END END END