Jump to content

Spell Slot Fixes


Recommended Posts

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 arrows

COPY_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

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

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

Archived

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

×
×
  • Create New...