CamDawg Posted March 5, 2005 Share Posted March 5, 2005 OK, finally recoded the various creatures with missing spells and slots. In some cases this is swatting a fly with a sledge hammer, as I essentially delete the existing known spell block and then rebuild it from scratch. I did Edwin first, for whom this is necessary, and then moved on the creature files that needed lesser adjustment and kept the same methodology. The bugs fixed: Edwin's creature file has an extra spell at every level since the devs added one for his specialist class, not accounting for the fact that the engine would add it. Since he'll be getting an extra slot as soon as he joins the party, he has one additional memorized spell per level. I need to test this works. Haer15 has no spells. At all. Minsc is missing all his spells as well in every SoA incarnation. Minsc7 shouldn't have any, but the rest should. Nalia8 and Nalia9 should have one less level 5 spell; Nalia13 has an extra memorized spell. Be warned, this is long and ugly. // edwin spell slot fix// this is long and ugly. Edwin has one additional slot per level; so we remove all// of his memorized mage spells and rebuild the section completely. The same methodology// is also used to rebuild haer15, minsc8,9,10,12 and nalia8,9.COPY_EXISTING ~edwin7.cre~ ~override~ ~edwin9.cre~ ~override~ ~edwin11.cre~ ~override~ ~edwin12.cre~ ~override~ ~edwin13.cre~ ~override~ ~edwin15.cre~ ~override~ PATCH_IF (SOURCE_SIZE > 0x2d3) THEN BEGIN // protects against invalid files READ_LONG 0x18 "xp" READ_BYTE 0x234 "level" READ_LONG 0x2a0 "known_off" READ_LONG 0x2a8 "mem_info" READ_LONG 0x2b0 "mem_off" READ_LONG 0x2b4 "mem_num" READ_LONG 0x2b8 "slot_off" READ_LONG 0x2bc "item_off" READ_LONG 0x2c4 "fx_off" READ_LONG ("%mem_info%" + 0x08 + (7 * 0x10)) "idx_start" READ_LONG ("%mem_info%" + 0x08 + (16 * 0x10)) "idx_end" DELETE_BYTES ("%mem_off%" + (0x0c * "%idx_start%")) (("%idx_end%" - "%idx_start%") * 0x0c) SET "delta" = 0 // level 1 SET "lev1" = 5 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi120~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi112~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi119~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi112~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi104~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi102~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi101~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 6) PATCH_IF ("%level%" > 12) BEGIN SET "lev1" = ("%lev1%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi106~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi119~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (7 * 0x10)) "%lev1%" WRITE_SHORT ("%mem_info%" + 0x04 + (7 * 0x10)) "%lev1%" WRITE_SHORT ("%mem_info%" + 0x0c + (7 * 0x10)) ("%lev1%" + 1) //level 2 fixes SET "lev2" = 4 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi220~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi215~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi212~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi211~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi205~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 5) PATCH_IF ("%level%" > 10) BEGIN SET "lev2" = ("%lev2%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi201~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi211~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END PATCH_IF ("%level%" > 12) BEGIN SET "lev2" = ("%lev2%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi217~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi205~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (8 * 0x10)) "%lev2%" WRITE_SHORT ("%mem_info%" + 0x04 + (8 * 0x10)) "%lev2%" WRITE_LONG ("%mem_info%" + 0x08 + (8 * 0x10)) (("%idx_start%" + "%delta%") - ("%lev2%" + 1)) WRITE_SHORT ("%mem_info%" + 0x0c + (8 * 0x10)) ("%lev2%" + 1) //level 3 fixes SET "lev3" = 4 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi314~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi309~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi305~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi304~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi303~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 5) PATCH_IF ("%level%" > 10) BEGIN SET "lev3" = ("%lev3%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi302~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END PATCH_IF ("%level%" > 12) BEGIN SET "lev3" = ("%lev3%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi308~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi305~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (9 * 0x10)) "%lev3%" WRITE_SHORT ("%mem_info%" + 0x04 + (9 * 0x10)) "%lev3%" WRITE_LONG ("%mem_info%" + 0x08 + (9 * 0x10)) (("%idx_start%" + "%delta%") - ("%lev3%" + 1)) WRITE_SHORT ("%mem_info%" + 0x0c + (9 * 0x10)) ("%lev3%" + 1) //level 4 fixes SET "lev4" = 3 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi416~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi407~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi406~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi403~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 4) PATCH_IF ("%level%" > 10) BEGIN SET "lev4" = ("%lev4%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi408~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi406~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END PATCH_IF ("%level%" > 11) BEGIN SET "lev4" = ("%lev4%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi405~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi407~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (10 * 0x10)) "%lev4%" WRITE_SHORT ("%mem_info%" + 0x04 + (10 * 0x10)) "%lev4%" WRITE_LONG ("%mem_info%" + 0x08 + (10 * 0x10)) (("%idx_start%" + "%delta%") - ("%lev4%" + 1)) WRITE_SHORT ("%mem_info%" + 0x0c + (10 * 0x10)) ("%lev4%" + 1) //level 5 fixes SET "lev5" = 2 PATCH_IF ("%level%" > 10) BEGIN SET "lev5" = ("%lev5%" + 2) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi521~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi516~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 2) END PATCH_IF ("%level%" > 11) BEGIN SET "lev5" = ("%lev5%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi520~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi522~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi505~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi504~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 3) WRITE_SHORT ("%mem_info%" + 0x02 + (11 * 0x10)) "%lev5%" WRITE_SHORT ("%mem_info%" + 0x04 + (11 * 0x10)) "%lev5%" WRITE_LONG ("%mem_info%" + 0x08 + (11 * 0x10)) (("%idx_start%" + "%delta%") - ("%lev5%" + 1)) WRITE_SHORT ("%mem_info%" + 0x0c + (11 * 0x10)) ("%lev5%" + 1) //level 6 fixes SET "lev6" = 0 PATCH_IF ("%level%" > 11) BEGIN SET "lev6" = ("%lev6%" + 2) // not an error INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi619~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi612~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi601~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 3) END PATCH_IF ("%level%" > 12) BEGIN SET "lev6" = ("%lev6%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi605~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (12 * 0x10)) "%lev6%" WRITE_SHORT ("%mem_info%" + 0x04 + (12 * 0x10)) "%lev6%" PATCH_IF ("%lev6%" > 0) BEGIN WRITE_LONG ("%mem_info%" + 0x08 + (12 * 0x10)) (("%idx_start%" + "%delta%") - ("%lev6%" + 1)) WRITE_SHORT ("%mem_info%" + 0x0c + (12 * 0x10)) ("%lev6%" + 1) END ELSE BEGIN WRITE_LONG ("%mem_info%" + 0x08 + (12 * 0x10)) ("%idx_start%" + "%delta%") WRITE_SHORT ("%mem_info%" + 0x0c + (12 * 0x10)) 0 END // wrapping up; correcting indexes for remaining wizard spells and innates SET "loops" = 0 WHILE ("%loops%" < 3) BEGIN SET "loops" = ("%loops%" + 1) WRITE_SHORT ("%mem_info%" + 0x02 + (("%loops%" + 12) * 0x10)) 0 WRITE_SHORT ("%mem_info%" + 0x04 + (("%loops%" + 12) * 0x10)) 0 WRITE_LONG ("%mem_info%" + 0x08 + (("%loops%" + 12) * 0x10)) ("%idx_start%" + "%delta%") WRITE_SHORT ("%mem_info%" + 0x0c + (("%loops%" + 12) * 0x10)) 0 END WRITE_LONG ("%mem_info%" + 0x08 + (16 * 0x10)) ("%idx_start%" + "%delta%") // final wrapup; correct # of memorized spells and offsets WRITE_LONG 0x2b4 (("%idx_start%" + "%delta%" + "%mem_num%") - "%idx_end%") SET "offset_delta" = ((("%delta%" + "%idx_start%") - "%idx_end%") * 0x0c) PATCH_IF ("%known_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2a0 ("%known_off%" + "%offset_delta%") END PATCH_IF ("%slot_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2b8 ("%slot_off%" + "%offset_delta%") END PATCH_IF ("%item_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2bc ("%item_off%" + "%offset_delta%") END PATCH_IF ("%fx_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2c4 ("%fx_off%" + "%offset_delta%") END END // haer15 is fixed in two phases, mainly because I don't know the exact timing of when// ADD_KNOWN_SPELL updates the offsets. This also fixes his PP score.COPY_EXISTING ~haer15.cre~ ~override~ WRITE_BYTE 0x6A 50 //pickpocketing ADD_KNOWN_SPELL ~spwi106~ #0 ~wizard~ ADD_KNOWN_SPELL ~spwi112~ #0 ~wizard~ ADD_KNOWN_SPELL ~spwi113~ #0 ~wizard~ ADD_KNOWN_SPELL ~spwi116~ #0 ~wizard~ ADD_KNOWN_SPELL ~spwi201~ #1 ~wizard~ ADD_KNOWN_SPELL ~spwi206~ #1 ~wizard~ ADD_KNOWN_SPELL ~spwi209~ #1 ~wizard~ ADD_KNOWN_SPELL ~spwi212~ #1 ~wizard~ ADD_KNOWN_SPELL ~spwi303~ #2 ~wizard~ ADD_KNOWN_SPELL ~spwi305~ #2 ~wizard~ ADD_KNOWN_SPELL ~spwi312~ #2 ~wizard~ ADD_KNOWN_SPELL ~spwi401~ #3 ~wizard~ ADD_KNOWN_SPELL ~spwi406~ #3 ~wizard~ ADD_KNOWN_SPELL ~spwi408~ #3 ~wizard~ ADD_KNOWN_SPELL ~spwi508~ #4 ~wizard~ ADD_KNOWN_SPELL ~spwi510~ #4 ~wizard~ // second bit of haer15 fixes. this takes care of memorized spells.COPY_EXISTING ~haer15.cre~ ~override~ READ_LONG 0x2a0 "known_off" READ_LONG 0x2a8 "mem_info" READ_LONG 0x2b0 "mem_off" READ_LONG 0x2b4 "mem_num" READ_LONG 0x2b8 "slot_off" READ_LONG 0x2bc "item_off" READ_LONG 0x2c4 "fx_off" READ_LONG ("%mem_info%" + 0x08 + (7 * 0x10)) "idx_start" READ_LONG ("%mem_info%" + 0x08 + (16 * 0x10)) "idx_end" DELETE_BYTES ("%mem_off%" + (0x0c * "%idx_start%")) (("%idx_end%" - "%idx_start%") * 0x0c) SET "delta" = 0 // level 1 SET "lev1" = 3 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi113~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi112~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi106~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 3) WRITE_SHORT ("%mem_info%" + 0x02 + (7 * 0x10)) "%lev1%" WRITE_SHORT ("%mem_info%" + 0x04 + (7 * 0x10)) "%lev1%" WRITE_SHORT ("%mem_info%" + 0x0c + (7 * 0x10)) "%lev1%" //level 2 fixes SET "lev2" = 3 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi209~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi206~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi201~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 3) WRITE_SHORT ("%mem_info%" + 0x02 + (8 * 0x10)) "%lev2%" WRITE_SHORT ("%mem_info%" + 0x04 + (8 * 0x10)) "%lev2%" WRITE_LONG ("%mem_info%" + 0x08 + (8 * 0x10)) (("%idx_start%" + "%delta%") - "%lev2%") WRITE_SHORT ("%mem_info%" + 0x0c + (8 * 0x10)) "%lev2%" //level 3 fixes SET "lev3" = 3 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi312~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi305~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi303~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 3) WRITE_SHORT ("%mem_info%" + 0x02 + (9 * 0x10)) "%lev3%" WRITE_SHORT ("%mem_info%" + 0x04 + (9 * 0x10)) "%lev3%" WRITE_LONG ("%mem_info%" + 0x08 + (9 * 0x10)) (("%idx_start%" + "%delta%") - "%lev3%") WRITE_SHORT ("%mem_info%" + 0x0c + (9 * 0x10)) "%lev3%" //level 4 fixes SET "lev4" = 3 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi408~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi406~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi401~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 3) WRITE_SHORT ("%mem_info%" + 0x02 + (10 * 0x10)) "%lev4%" WRITE_SHORT ("%mem_info%" + 0x04 + (10 * 0x10)) "%lev4%" WRITE_LONG ("%mem_info%" + 0x08 + (10 * 0x10)) (("%idx_start%" + "%delta%") - "%lev4%") WRITE_SHORT ("%mem_info%" + 0x0c + (10 * 0x10)) "%lev4%" //level 5 fixes SET "lev5" = 2 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi510~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi508~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 2) WRITE_SHORT ("%mem_info%" + 0x02 + (11 * 0x10)) "%lev5%" WRITE_SHORT ("%mem_info%" + 0x04 + (11 * 0x10)) "%lev5%" WRITE_LONG ("%mem_info%" + 0x08 + (11 * 0x10)) (("%idx_start%" + "%delta%") - "%lev5%") WRITE_SHORT ("%mem_info%" + 0x0c + (11 * 0x10)) "%lev5%" // wrapping up; correcting indexes for remaining wizard spells and innates SET "loops" = 0 WHILE ("%loops%" < 4) BEGIN SET "loops" = ("%loops%" + 1) WRITE_SHORT ("%mem_info%" + 0x02 + (("%loops%" + 11) * 0x10)) 0 WRITE_SHORT ("%mem_info%" + 0x04 + (("%loops%" + 11) * 0x10)) 0 WRITE_LONG ("%mem_info%" + 0x08 + (("%loops%" + 11) * 0x10)) ("%idx_start%" + "%delta%") WRITE_SHORT ("%mem_info%" + 0x0c + (("%loops%" + 11) * 0x10)) 0 END WRITE_LONG ("%mem_info%" + 0x08 + (16 * 0x10)) ("%idx_start%" + "%delta%") // final wrapup; correct # of memorized spells and offsets WRITE_LONG 0x2b4 (("%idx_start%" + "%delta%" + "%mem_num%") - "%idx_end%") SET "offset_delta" = ((("%delta%" + "%idx_start%") - "%idx_end%") * 0x0c) PATCH_IF ("%known_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2a0 ("%known_off%" + "%offset_delta%") END PATCH_IF ("%slot_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2b8 ("%slot_off%" + "%offset_delta%") END PATCH_IF ("%item_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2bc ("%item_off%" + "%offset_delta%") END PATCH_IF ("%fx_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2c4 ("%fx_off%" + "%offset_delta%") END // more heinous spell slot fixes; nalia8 and nalia9 have one extra fifth// level spell, nalia13 one extra 6th level spell and 0 arrowsCOPY_EXISTING ~nalia8.cre~ ~override~ ~nalia10.cre~ ~override~ ~nalia13.cre~ ~override~ READ_BYTE 0x234 "level" READ_LONG 0x2a0 "known_off" READ_LONG 0x2a8 "mem_info" READ_LONG 0x2b0 "mem_off" READ_LONG 0x2b4 "mem_num" READ_LONG 0x2b8 "slot_off" READ_LONG 0x2bc "item_off" READ_LONG 0x2c0 "item_num" READ_LONG 0x2c4 "fx_off" // first let's get the arrows out of the way WHILE ("%item_num%" > 0) BEGIN SET "item_num" = ("%item_num%" - 1) READ_ASCII ("%item_off%" + (0x14 * "%item_num%")) "itemname" PATCH_IF ("arow01" STRING_COMPARE_CASE "%itemname%" = 0) BEGIN WRITE_SHORT ("%item_off%" + 0x0a + (0x14 * "%item_num%")) 20 // quantity END END READ_LONG ("%mem_info%" + 0x08 + (7 * 0x10)) "idx_start" READ_LONG ("%mem_info%" + 0x08 + (16 * 0x10)) "idx_end" DELETE_BYTES ("%mem_off%" + (0x0c * "%idx_start%")) (("%idx_end%" - "%idx_start%") * 0x0c) SET "delta" = 0 // level 1 SET "lev1" = 4 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi118~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi115~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi110~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi105~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 4) WRITE_SHORT ("%mem_info%" + 0x02 + (7 * 0x10)) "%lev1%" WRITE_SHORT ("%mem_info%" + 0x04 + (7 * 0x10)) "%lev1%" WRITE_SHORT ("%mem_info%" + 0x0c + (7 * 0x10)) "%lev1%" //level 2 fixes SET "lev2" = 3 PATCH_IF ("%level%" > 10) BEGIN SET "lev2" = ("%lev2%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi211~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi215~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi214~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi212~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 3) WRITE_SHORT ("%mem_info%" + 0x02 + (8 * 0x10)) "%lev2%" WRITE_SHORT ("%mem_info%" + 0x04 + (8 * 0x10)) "%lev2%" WRITE_LONG ("%mem_info%" + 0x08 + (8 * 0x10)) (("%idx_start%" + "%delta%") - "%lev2%") WRITE_SHORT ("%mem_info%" + 0x0c + (8 * 0x10)) "%lev2%" //level 3 fixes SET "lev3" = 3 PATCH_IF ("%level%" > 10) BEGIN SET "lev3" = ("%lev3%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi305~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi312~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi308~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi306~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 3) WRITE_SHORT ("%mem_info%" + 0x02 + (9 * 0x10)) "%lev3%" WRITE_SHORT ("%mem_info%" + 0x04 + (9 * 0x10)) "%lev3%" WRITE_LONG ("%mem_info%" + 0x08 + (9 * 0x10)) (("%idx_start%" + "%delta%") - "%lev3%") WRITE_SHORT ("%mem_info%" + 0x0c + (9 * 0x10)) "%lev3%" //level 4 fixes SET "lev4" = 2 PATCH_IF ("%level%" > 10) BEGIN SET "lev4" = ("%lev4%" + 2) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi403~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi415~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 2) END INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi416~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi408~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 2) WRITE_SHORT ("%mem_info%" + 0x02 + (10 * 0x10)) "%lev4%" WRITE_SHORT ("%mem_info%" + 0x04 + (10 * 0x10)) "%lev4%" WRITE_LONG ("%mem_info%" + 0x08 + (10 * 0x10)) (("%idx_start%" + "%delta%") - "%lev4%") WRITE_SHORT ("%mem_info%" + 0x0c + (10 * 0x10)) "%lev4%" //level 5 fixes SET "lev5" = 1 PATCH_IF ("%level%" > 10) BEGIN SET "lev5" = ("%lev5%" + 3) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi508~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi506~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi502~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 3) END INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi505~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) WRITE_SHORT ("%mem_info%" + 0x02 + (11 * 0x10)) "%lev5%" WRITE_SHORT ("%mem_info%" + 0x04 + (11 * 0x10)) "%lev5%" WRITE_LONG ("%mem_info%" + 0x08 + (11 * 0x10)) (("%idx_start%" + "%delta%") - "%lev5%") WRITE_SHORT ("%mem_info%" + 0x0c + (11 * 0x10)) "%lev5%" // wrapping up; correcting indexes for remaining wizard spells and innates SET "loops" = 0 WHILE ("%loops%" < 4) BEGIN SET "loops" = ("%loops%" + 1) WRITE_SHORT ("%mem_info%" + 0x02 + (("%loops%" + 11) * 0x10)) 0 WRITE_SHORT ("%mem_info%" + 0x04 + (("%loops%" + 11) * 0x10)) 0 WRITE_LONG ("%mem_info%" + 0x08 + (("%loops%" + 11) * 0x10)) ("%idx_start%" + "%delta%") WRITE_SHORT ("%mem_info%" + 0x0c + (("%loops%" + 11) * 0x10)) 0 END WRITE_LONG ("%mem_info%" + 0x08 + (16 * 0x10)) ("%idx_start%" + "%delta%") // final wrapup; correct # of memorized spells and offsets WRITE_LONG 0x2b4 (("%idx_start%" + "%delta%" + "%mem_num%") - "%idx_end%") SET "offset_delta" = ((("%delta%" + "%idx_start%") - "%idx_end%") * 0x0c) PATCH_IF ("%known_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2a0 ("%known_off%" + "%offset_delta%") END PATCH_IF ("%slot_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2b8 ("%slot_off%" + "%offset_delta%") END PATCH_IF ("%item_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2bc ("%item_off%" + "%offset_delta%") END PATCH_IF ("%fx_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2c4 ("%fx_off%" + "%offset_delta%") END// Minsc is another two parter; first we use ADD_KNOWN_SPELL to// fill his spellbook. Next patch deals with memorized spells. COPY_EXISTING ~minsc8.cre~ ~override~ ~minsc9.cre~ ~override~ ~minsc10.cre~ ~override~ ~minsc12.cre~ ~override~ READ_BYTE 0x234 "level" ADD_KNOWN_SPELL ~sppr101~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr103~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr104~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr105~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr110~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr111~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr113~ #0 ~priest~ PATCH_IF ("%level%" > 9) BEGIN ADD_KNOWN_SPELL ~sppr202~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr204~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr205~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr206~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr207~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr209~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr210~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr212~ #1 ~priest~ END PATCH_IF (& Link to comment
Andyr Posted March 6, 2005 Share Posted March 6, 2005 It does look like the code is longer than the thread post limit, though. Link to comment
CamDawg Posted March 6, 2005 Author Share Posted March 6, 2005 Oh yeah, Minsc stuff was cut off. It's reposted, along with a similar fix for Valygar--he's also missing his spells and whatnot. // Minsc is another two parter; first we use ADD_KNOWN_SPELL to // fill his spellbook. Next patch deals with memorized spells. COPY_EXISTING ~minsc8.cre~ ~override~ ~minsc9.cre~ ~override~ ~minsc10.cre~ ~override~ ~minsc12.cre~ ~override~ READ_BYTE 0x234 "level" ADD_KNOWN_SPELL ~sppr101~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr103~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr104~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr105~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr110~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr111~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr113~ #0 ~priest~ PATCH_IF ("%level%" > 9) BEGIN ADD_KNOWN_SPELL ~sppr202~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr204~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr205~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr206~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr207~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr209~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr210~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr212~ #1 ~priest~ END PATCH_IF ("%level%" > 11) BEGIN ADD_KNOWN_SPELL ~sppr302~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr303~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr305~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr306~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr309~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr310~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr311~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr312~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr315~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr317~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr319~ #2 ~priest~ END BUT_ONLY_IF_IT_CHANGES // second half of Minsc fixes; this fixes known spells COPY_EXISTING ~minsc8.cre~ ~override~ ~minsc9.cre~ ~override~ ~minsc10.cre~ ~override~ ~minsc12.cre~ ~override~ READ_BYTE 0x234 "level" READ_LONG 0x2a0 "known_off" READ_LONG 0x2a8 "mem_info" READ_LONG 0x2b0 "mem_off" READ_LONG 0x2b4 "mem_num" READ_LONG 0x2b8 "slot_off" READ_LONG 0x2bc "item_off" READ_LONG 0x2c4 "fx_off" READ_LONG ("%mem_info%" + 0x08 ) "idx_start" READ_LONG ("%mem_info%" + 0x08 + (16 * 0x10)) "idx_end" DELETE_BYTES ("%mem_off%" + (0x0c * "%idx_start%")) (("%idx_end%" - "%idx_start%") * 0x0c) SET "delta" = 0 // level 1 SET "lev1" = 1 PATCH_IF ("%level%" > 8) BEGIN SET "lev1" = ("%lev1%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~sppr103~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~sppr104~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) WRITE_SHORT ("%mem_info%" + 0x02) "%lev1%" WRITE_SHORT ("%mem_info%" + 0x04) "%lev1%" WRITE_SHORT ("%mem_info%" + 0x0c) "%lev1%" //level 2 fixes SET "lev2" = 0 PATCH_IF ("%level%" > 9) BEGIN SET "lev2" = ("%lev2%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~sppr202~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END PATCH_IF ("%level%" > 11) BEGIN SET "lev2" = ("%lev2%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~sppr204~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (1 * 0x10)) "%lev2%" WRITE_SHORT ("%mem_info%" + 0x04 + (1 * 0x10)) "%lev2%" WRITE_LONG ("%mem_info%" + 0x08 + (1 * 0x10)) (("%idx_start%" + "%delta%") - "%lev2%") WRITE_SHORT ("%mem_info%" + 0x0c + (1 * 0x10)) "%lev2%" //level 3 fixes SET "lev3" = 0 PATCH_IF ("%level%" > 11) BEGIN SET "lev3" = ("%lev3%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~sppr315~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (2 * 0x10)) "%lev3%" WRITE_SHORT ("%mem_info%" + 0x04 + (2 * 0x10)) "%lev3%" WRITE_LONG ("%mem_info%" + 0x08 + (2 * 0x10)) (("%idx_start%" + "%delta%") - "%lev3%") WRITE_SHORT ("%mem_info%" + 0x0c + (2 * 0x10)) "%lev3%" // wrapping up; correcting indexes for remaining spells SET "loops" = 0 WHILE ("%loops%" < 13) BEGIN SET "loops" = ("%loops%" + 1) WRITE_SHORT ("%mem_info%" + 0x02 + (("%loops%" + 2) * 0x10)) 0 WRITE_SHORT ("%mem_info%" + 0x04 + (("%loops%" + 2) * 0x10)) 0 WRITE_LONG ("%mem_info%" + 0x08 + (("%loops%" + 2) * 0x10)) ("%idx_start%" + "%delta%") WRITE_SHORT ("%mem_info%" + 0x0c + (("%loops%" + 2) * 0x10)) 0 END WRITE_LONG ("%mem_info%" + 0x08 + (16 * 0x10)) ("%idx_start%" + "%delta%") // final wrapup; correct # of memorized spells and offsets WRITE_LONG 0x2b4 (("%idx_start%" + "%delta%" + "%mem_num%") - "%idx_end%") SET "offset_delta" = ((("%delta%" + "%idx_start%") - "%idx_end%") * 0x0c) PATCH_IF ("%known_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2a0 ("%known_off%" + "%offset_delta%") END PATCH_IF ("%slot_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2b8 ("%slot_off%" + "%offset_delta%") END PATCH_IF ("%item_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2bc ("%item_off%" + "%offset_delta%") END PATCH_IF ("%fx_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2c4 ("%fx_off%" + "%offset_delta%") END // Valygar is another two parter; first we use ADD_KNOWN_SPELL to // fill his spellbook. Next patch deals with memorized spells. COPY_EXISTING ~valyg8.cre~ ~override~ ~valyg9.cre~ ~override~ ~valyg11.cre~ ~override~ ~valyg12.cre~ ~override~ ~valyg14.cre~ ~override~ PATCH_IF (SOURCE_SIZE > 0x2d3) THEN BEGIN // protects against invalid files READ_BYTE 0x234 "level" ADD_KNOWN_SPELL ~sppr101~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr103~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr104~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr105~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr110~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr111~ #0 ~priest~ ADD_KNOWN_SPELL ~sppr113~ #0 ~priest~ PATCH_IF ("%level%" > 9) BEGIN ADD_KNOWN_SPELL ~sppr202~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr204~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr205~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr206~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr207~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr209~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr210~ #1 ~priest~ ADD_KNOWN_SPELL ~sppr212~ #1 ~priest~ END PATCH_IF ("%level%" > 11) BEGIN ADD_KNOWN_SPELL ~sppr302~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr303~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr305~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr306~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr309~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr310~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr311~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr312~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr315~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr317~ #2 ~priest~ ADD_KNOWN_SPELL ~sppr319~ #2 ~priest~ ADD_KNOWN_SPELL ~spra301~ #2 ~priest~ ADD_KNOWN_SPELL ~spra302~ #2 ~priest~ ADD_KNOWN_SPELL ~spra303~ #2 ~priest~ END END BUT_ONLY_IF_IT_CHANGES // second half of Valygar fixes; this fixes known spells COPY_EXISTING ~valyg8.cre~ ~override~ ~valyg9.cre~ ~override~ ~valyg11.cre~ ~override~ ~valyg12.cre~ ~override~ ~valyg14.cre~ ~override~ PATCH_IF (SOURCE_SIZE > 0x2d3) THEN BEGIN // protects against invalid files READ_BYTE 0x234 "level" READ_LONG 0x2a0 "known_off" READ_LONG 0x2a8 "mem_info" READ_LONG 0x2b0 "mem_off" READ_LONG 0x2b4 "mem_num" READ_LONG 0x2b8 "slot_off" READ_LONG 0x2bc "item_off" READ_LONG 0x2c4 "fx_off" READ_LONG ("%mem_info%" + 0x08 ) "idx_start" READ_LONG ("%mem_info%" + 0x08 + (16 * 0x10)) "idx_end" DELETE_BYTES ("%mem_off%" + (0x0c * "%idx_start%")) (("%idx_end%" - "%idx_start%") * 0x0c) SET "delta" = 0 // level 1 SET "lev1" = 1 PATCH_IF ("%level%" > 8) BEGIN SET "lev1" = ("%lev1%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~sppr113~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~sppr103~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) WRITE_SHORT ("%mem_info%" + 0x02) "%lev1%" WRITE_SHORT ("%mem_info%" + 0x04) "%lev1%" WRITE_SHORT ("%mem_info%" + 0x0c) "%lev1%" //level 2 fixes SET "lev2" = 0 PATCH_IF ("%level%" > 9) BEGIN SET "lev2" = ("%lev2%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~sppr204~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END PATCH_IF ("%level%" > 11) BEGIN SET "lev2" = ("%lev2%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~sppr202~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (1 * 0x10)) "%lev2%" WRITE_SHORT ("%mem_info%" + 0x04 + (1 * 0x10)) "%lev2%" WRITE_LONG ("%mem_info%" + 0x08 + (1 * 0x10)) (("%idx_start%" + "%delta%") - "%lev2%") WRITE_SHORT ("%mem_info%" + 0x0c + (1 * 0x10)) "%lev2%" //level 3 fixes SET "lev3" = 0 PATCH_IF ("%level%" > 11) BEGIN SET "lev3" = ("%lev3%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~sppr315~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (2 * 0x10)) "%lev3%" WRITE_SHORT ("%mem_info%" + 0x04 + (2 * 0x10)) "%lev3%" WRITE_LONG ("%mem_info%" + 0x08 + (2 * 0x10)) (("%idx_start%" + "%delta%") - "%lev3%") WRITE_SHORT ("%mem_info%" + 0x0c + (2 * 0x10)) "%lev3%" // wrapping up; correcting indexes for remaining spells SET "loops" = 0 WHILE ("%loops%" < 13) BEGIN SET "loops" = ("%loops%" + 1) WRITE_SHORT ("%mem_info%" + 0x02 + (("%loops%" + 2) * 0x10)) 0 WRITE_SHORT ("%mem_info%" + 0x04 + (("%loops%" + 2) * 0x10)) 0 WRITE_LONG ("%mem_info%" + 0x08 + (("%loops%" + 2) * 0x10)) ("%idx_start%" + "%delta%") WRITE_SHORT ("%mem_info%" + 0x0c + (("%loops%" + 2) * 0x10)) 0 END WRITE_LONG ("%mem_info%" + 0x08 + (16 * 0x10)) ("%idx_start%" + "%delta%") // final wrapup; correct # of memorized spells and offsets WRITE_LONG 0x2b4 (("%idx_start%" + "%delta%" + "%mem_num%") - "%idx_end%") SET "offset_delta" = ((("%delta%" + "%idx_start%") - "%idx_end%") * 0x0c) PATCH_IF ("%known_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2a0 ("%known_off%" + "%offset_delta%") END PATCH_IF ("%slot_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2b8 ("%slot_off%" + "%offset_delta%") END PATCH_IF ("%item_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2bc ("%item_off%" + "%offset_delta%") END PATCH_IF ("%fx_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2c4 ("%fx_off%" + "%offset_delta%") END END Link to comment
CamDawg Posted March 28, 2005 Author Share Posted March 28, 2005 Included in alpha 3. One change not mentioned here is that Nalia13 has a stack of arrows with only 1 in it, as opposed to every other version where the stack is 20. I've also bumped up Edwin's memorized count beyond his spell slots by two to account for his specialist bonus and amulet. This ensures he has a full memorized spellbook upon joining. In a lot of places you'll see the XP checked before writing a new spell to memory. Edwin's ToB version has a larger known spell base so I don't have to double up memorized spells, as I was shooting for diversity instead of, say, 12 magic missiles. // edwin spell slot fix // this is long and ugly. Edwin has one additional slot per level; so we remove all // of his memorized mage spells and rebuild the section completely. The same methodology // is also used to rebuild haer15, minsc8,9,10,12 and nalia8,9,13 and valyg8,9,11,12,13,16. COPY_EXISTING ~edwin7.cre~ ~override~ ~edwin9.cre~ ~override~ ~edwin11.cre~ ~override~ ~edwin12.cre~ ~override~ ~edwin13.cre~ ~override~ ~edwin15.cre~ ~override~ PATCH_IF (SOURCE_SIZE > 0x2d3) THEN BEGIN // protects against invalid files READ_LONG 0x18 "xp" READ_BYTE 0x234 "level" READ_LONG 0x2a0 "known_off" READ_LONG 0x2a8 "mem_info" READ_LONG 0x2b0 "mem_off" READ_LONG 0x2b4 "mem_num" READ_LONG 0x2b8 "slot_off" READ_LONG 0x2bc "item_off" READ_LONG 0x2c4 "fx_off" READ_LONG ("%mem_info%" + 0x08 + (7 * 0x10)) "idx_start" READ_LONG ("%mem_info%" + 0x08 + (16 * 0x10)) "idx_end" DELETE_BYTES ("%mem_off%" + (0x0c * "%idx_start%")) (("%idx_end%" - "%idx_start%") * 0x0c) SET "delta" = 0 // level 1 SET "lev1" = 5 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi120~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi119~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi119~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi112~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi112~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi104~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi102~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi101~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 7) PATCH_IF ("%level%" > 12) BEGIN SET "lev1" = ("%lev1%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi106~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi102~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (7 * 0x10)) "%lev1%" WRITE_SHORT ("%mem_info%" + 0x04 + (7 * 0x10)) "%lev1%" WRITE_SHORT ("%mem_info%" + 0x0c + (7 * 0x10)) ("%lev1%" + 2) //level 2 fixes SET "lev2" = 4 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi201~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi211~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi220~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi215~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi212~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi211~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi205~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 6) PATCH_IF ("%level%" > 10) BEGIN SET "lev2" = ("%lev2%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi217~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi205~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END PATCH_IF ("%level%" > 12) BEGIN SET "lev2" = ("%lev2%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi209~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi220~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (8 * 0x10)) "%lev2%" WRITE_SHORT ("%mem_info%" + 0x04 + (8 * 0x10)) "%lev2%" WRITE_LONG ("%mem_info%" + 0x08 + (8 * 0x10)) (("%idx_start%" + "%delta%") - ("%lev2%" + 2)) WRITE_SHORT ("%mem_info%" + 0x0c + (8 * 0x10)) ("%lev2%" + 2) //level 3 fixes SET "lev3" = 4 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi314~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi309~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi305~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi304~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi303~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi302~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 6) PATCH_IF ("%level%" > 10) BEGIN SET "lev3" = ("%lev3%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi308~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi305~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END PATCH_IF ("%level%" > 12) BEGIN SET "lev3" = ("%lev3%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi307~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi304~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (9 * 0x10)) "%lev3%" WRITE_SHORT ("%mem_info%" + 0x04 + (9 * 0x10)) "%lev3%" WRITE_LONG ("%mem_info%" + 0x08 + (9 * 0x10)) (("%idx_start%" + "%delta%") - ("%lev3%" + 2)) WRITE_SHORT ("%mem_info%" + 0x0c + (9 * 0x10)) ("%lev3%" + 2) //level 4 fixes SET "lev4" = 3 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi408~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi406~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi416~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi407~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi406~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi403~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 5) PATCH_IF ("%level%" > 10) BEGIN SET "lev4" = ("%lev4%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi405~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi407~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END PATCH_IF ("%level%" > 11) BEGIN SET "lev4" = ("%lev4%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c PATCH_IF ("%xp%" > 1200000) BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi401~ END ELSE BEGIN WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi403~ END WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (10 * 0x10)) "%lev4%" WRITE_SHORT ("%mem_info%" + 0x04 + (10 * 0x10)) "%lev4%" WRITE_LONG ("%mem_info%" + 0x08 + (10 * 0x10)) (("%idx_start%" + "%delta%") - ("%lev4%" + 2)) WRITE_SHORT ("%mem_info%" + 0x0c + (10 * 0x10)) ("%lev4%" + 2) //level 5 fixes SET "lev5" = 2 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi522~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi516~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi505~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi504~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 4) PATCH_IF ("%level%" > 10) BEGIN SET "lev5" = ("%lev5%" + 2) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi521~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi520~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 2) END PATCH_IF ("%level%" > 11) BEGIN SET "lev5" = ("%lev5%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi502~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (11 * 0x10)) "%lev5%" WRITE_SHORT ("%mem_info%" + 0x04 + (11 * 0x10)) "%lev5%" WRITE_LONG ("%mem_info%" + 0x08 + (11 * 0x10)) (("%idx_start%" + "%delta%") - ("%lev5%" + 2)) WRITE_SHORT ("%mem_info%" + 0x0c + (11 * 0x10)) ("%lev5%" + 2) //level 6 fixes SET "lev6" = 0 PATCH_IF ("%level%" > 11) BEGIN SET "lev6" = ("%lev6%" + 2) // not an error INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi619~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi612~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi605~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi601~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 4) END PATCH_IF ("%level%" > 12) BEGIN SET "lev6" = ("%lev6%" + 1) INSERT_BYTES ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) 0x0c WRITE_ASCII ("%mem_off%" + (0x0c * ("%delta%" + "%idx_start%"))) ~spwi620~ WRITE_SHORT ("%mem_off%" + 0x08 + (0x0c * ("%delta%" + "%idx_start%"))) 1 SET "delta" = ("%delta%" + 1) END WRITE_SHORT ("%mem_info%" + 0x02 + (12 * 0x10)) "%lev6%" WRITE_SHORT ("%mem_info%" + 0x04 + (12 * 0x10)) "%lev6%" PATCH_IF ("%lev6%" > 0) BEGIN WRITE_LONG ("%mem_info%" + 0x08 + (12 * 0x10)) (("%idx_start%" + "%delta%") - ("%lev6%" + 2)) WRITE_SHORT ("%mem_info%" + 0x0c + (12 * 0x10)) ("%lev6%" + 2) END ELSE BEGIN WRITE_LONG ("%mem_info%" + 0x08 + (12 * 0x10)) ("%idx_start%" + "%delta%") WRITE_SHORT ("%mem_info%" + 0x0c + (12 * 0x10)) 0 END // wrapping up; correcting indexes for remaining wizard spells and innates SET "loops" = 0 WHILE ("%loops%" < 3) BEGIN SET "loops" = ("%loops%" + 1) WRITE_SHORT ("%mem_info%" + 0x02 + (("%loops%" + 12) * 0x10)) 0 WRITE_SHORT ("%mem_info%" + 0x04 + (("%loops%" + 12) * 0x10)) 0 WRITE_LONG ("%mem_info%" + 0x08 + (("%loops%" + 12) * 0x10)) ("%idx_start%" + "%delta%") WRITE_SHORT ("%mem_info%" + 0x0c + (("%loops%" + 12) * 0x10)) 0 END WRITE_LONG ("%mem_info%" + 0x08 + (16 * 0x10)) ("%idx_start%" + "%delta%") // final wrapup; correct # of memorized spells and offsets WRITE_LONG 0x2b4 (("%idx_start%" + "%delta%" + "%mem_num%") - "%idx_end%") SET "offset_delta" = ((("%delta%" + "%idx_start%") - "%idx_end%") * 0x0c) PATCH_IF ("%known_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2a0 ("%known_off%" + "%offset_delta%") END PATCH_IF ("%slot_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2b8 ("%slot_off%" + "%offset_delta%") END PATCH_IF ("%item_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2bc ("%item_off%" + "%offset_delta%") END PATCH_IF ("%fx_off%" >= "%mem_off%") BEGIN WRITE_LONG 0x2c4 ("%fx_off%" + "%offset_delta%") END END Link to comment
Recommended Posts
Archived
This topic is now archived and is closed to further replies.