///////////////////////////////////////////////////////////////////////////////////////////////////////// //BEGIN Macros ///////////////////////////////////////////////////////////////////////////////////////////////////////// // Returns the game's user directory (USER_DIRECTORY) in the right encoding for use with filesystem functions. DEFINE_ACTION_FUNCTION GET_USER_DIRECTORY STR_VAR temp_directory = EVAL ~%MOD_FOLDER%/temp~ // where to store temporary data RET user_directory // path to the game's user directory BEGIN ACTION_IF (~%WEIDU_OS%~ STR_EQ ~win32~) BEGIN // On Windows the path string must be correctly encoded <<<<<<<< .../get_doc_path.bat @echo off for /f "tokens=3,*" %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Personal') do set DOC_DIR=%%a for /f "delims=" %%a in ('echo %DOC_DIR%') do echo %%a>"${temp_directory}\documents_path.txt" >>>>>>>> MKDIR ~%temp_directory%~ COPY + ~.../get_doc_path.bat~ ~%temp_directory%/get_doc_path.bat~ // Replacing ${xxx} placeholders in batch file with content of %xxx%. // This is needed as regular %xxx% variables have already a special meaning in batch files. REPLACE_EVALUATE ~\${\([^}]+\)}~ BEGIN SPRINT path_var EVAL ~%%MATCH1%%~ INNER_PATCH_SAVE path_var ~%path_var%~ BEGIN REPLACE_TEXTUALLY ~/~ ~\\~ END END ~%path_var%~ AT_NOW ~%temp_directory%/get_doc_path.bat~ DELETE ~%temp_directory%/get_doc_path.bat~ // getting Documents directory COPY + ~%temp_directory%/documents_path.txt~ ~%temp_directory%/documents_path.txt~ REPLACE_TEXTUALLY ~[%WNL%]+~ ~~ READ_ASCII 0 doc_dir (BUFFER_LENGTH) DELETE ~%temp_directory%/documents_path.txt~ // getting game folder name // OUTER_SPRINT game_folder ~Baldur's Gate II - Enhanced Edition~ // COPY ~engine.lua~ ~engine.lua~ // READ_ASCII 0 content (BUFFER_LENGTH) // INNER_PATCH ~%content%~ BEGIN // REPLACE_EVALUATE ~engine_name[ %TAB%]*=[ %TAB%]*"\([^"]+\)"~ BEGIN // SPRINT game_folder ~%MATCH1%~ // END ~%MATCH0%~ // END // BUT_ONLY IF_EXISTS // assembling user directory OUTER_SPRINT user_directory ~%doc_dir%\Baldur's Gate II - Enhanced Edition~ END ELSE BEGIN // using WeiDU variable directly on non-Windows systems OUTER_SPRINT user_directory ~%USER_DIRECTORY%~ END END DEFINE_ACTION_FUNCTION GET_SYSTEM_ARCH RET SYSTEM_ARCH BEGIN ACTION_MATCH "%WEIDU_OS%" WITH win32 BEGIN /*<<<<<<<< .../arch_var.bat @echo OFF reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS=32BIT || set OS=64BIT if %OS%==32BIT goto 32BIT if %OS%==64BIT goto 64BIT :32BIT SET arch_var=x86 goto OUT :64BIT SET arch_var=amd64 :OUT echo %arch_var% >arch_var.txt >>>>>>>>*/ <<<<<<<< .../arch_var.bat @echo off if /i "%PROCESSOR_ARCHITECTURE%"=="AMD64" goto AMD64 if /i "%PROCESSOR_ARCHITEW6432%"=="AMD64" goto AMD64 SET arch_var=x86 goto OUT :AMD64 SET arch_var=amd64 :OUT echo %arch_var% >arch_var.txt >>>>>>>> COPY + ~.../arch_var.bat~ ~arch_var.bat~ AT_NOW ~call arch_var.bat~ ACTION_IF (FILE_CONTAINS_EVALUATED (~arch_var.txt~ ~amd64~)) BEGIN OUTER_SPRINT SYSTEM_ARCH ~amd64~ END ELSE BEGIN OUTER_SPRINT SYSTEM_ARCH ~x86~ END DELETE + ~arch_var.txt~ ~arch_var.bat~ END osx unix BEGIN OUTER_SPRINT SYSTEM_ARCH ~x86~ AT_NOW ~echo $(uname -m) >arch_var.txt~ ACTION_IF (FILE_CONTAINS_EVALUATED (~arch_var.txt~ ~x86_64~)) BEGIN OUTER_SPRINT SYSTEM_ARCH ~amd64~ END ELSE BEGIN OUTER_SPRINT SYSTEM_ARCH ~x86~ END DELETE + ~arch_var.txt~ END DEFAULT END ACTION_IF (~%SYSTEM_ARCH%~ STRING_EQUAL ~~) BEGIN OUTER_SPRINT SYSTEM_ARCH ~%WEIDU_ARCH%~ END END DEFINE_PATCH_FUNCTION ~EET_spellbooks~ INT_VAR cheat = 0 //1 means Cleric/Ranger gains Druid spells up to level 7 STR_VAR spell_name = "" RET log BEGIN READ_LONG 0x244 kit ELSE 0 READ_BYTE 0x273 class ELSE 0 READ_LONG 0x2a4 known ELSE 0 //known > 0 excludes inquisitors SET level_cleric = 0 SET level_druid = 0 SET is_cleric = 0 SET is_druid = 0 SET is_mage = 0 SET check = 0 SET remove_spell = 0 SET cleric_max = 7 SET druid_max = 7 SET add_spell = 1 SET already_known = 0 SET already_memorised = 0 SPRINT log ~~ PATCH_IF (class = 3) OR (class = 15) BEGIN // Trueclass cleric, Cleric/Thief READ_BYTE 0x234 level_cleric SET is_cleric = 1 SET check = 1 END ELSE PATCH_IF (class = 14) BEGIN //Cleric/Mage READ_BYTE 0x234 level_cleric SET is_cleric = 1 SET is_mage = 1 SET check = 1 END ELSE PATCH_IF (class = 6) AND (known > 0) BEGIN // Paladin excludes inquisitors READ_BYTE 0x234 level_cleric INNER_ACTION BEGIN COPY_EXISTING - ~MXSPLPAL.2DA~ ~.../MXSPLPAL.2da~ COUNT_2DA_COLS "cntcol" SET cleric_max = cntcol - 1 COUNT_2DA_ROWS cntcol "cntrow" FOR (cnt = 0; cnt < cntrow; cnt = cnt + 1) BEGIN READ_2DA_ENTRY cnt 1 cntcol "entry" PATCH_IF (entry > 0) BEGIN READ_2DA_ENTRY cnt 0 cntcol "start_lvl" SET cnt = cntrow END END END PATCH_IF (start_lvl > 1) BEGIN SET level_cleric = level_cleric - (start_lvl - 1) // normally Paladin spells start at level 9 END SET is_cleric = 1 SET check = 1 END ELSE PATCH_IF (class = 8) BEGIN // Fighter/Cleric READ_BYTE 0x235 level_cleric SET is_cleric = 1 SET check = 1 END ELSE PATCH_IF (class = 11) BEGIN // Trueclass Druid READ_BYTE 0x234 level_druid SET is_druid = 1 SET check = 1 END ELSE PATCH_IF (class = 12) BEGIN // Trueclass Ranger READ_BYTE 0x234 level_druid INNER_ACTION BEGIN COPY_EXISTING - ~MXSPLDRU.2DA~ ~.../MXSPLDRU.2DA~ COUNT_2DA_COLS "cntcol" SET druid_max = cntcol - 1 COUNT_2DA_ROWS cntcol "cntrow" FOR (cnt = 0; cnt < cntrow; cnt = cnt + 1) BEGIN READ_2DA_ENTRY cnt 1 cntcol "entry" PATCH_IF (entry > 0) BEGIN READ_2DA_ENTRY cnt 0 cntcol "start_lvl" SET cnt = cntrow END END END PATCH_IF (start_lvl > 1) BEGIN SET level_druid = level_druid - (start_lvl - 1) // normally Ranger spells start at level 8 END SET is_druid = 1 SET check = 1 END ELSE PATCH_IF (class = 16) BEGIN // Fighter/Druid READ_BYTE 0x235 level_druid SET is_druid = 1 SET check = 1 END ELSE PATCH_IF (class = 17) BEGIN // Figher/Mage/Cleric READ_BYTE 0x236 level_cleric SET is_cleric = 1 SET is_mage = 1 SET check = 1 END ELSE PATCH_IF (class = 18) BEGIN // Cleric/Ranger READ_BYTE 0x234 level_cleric READ_BYTE 0x235 level_druid INNER_ACTION BEGIN COPY_EXISTING - ~MXSPLDRU.2DA~ ~.../MXSPLDRU.2DA~ COUNT_2DA_COLS "cntcol" PATCH_IF (cheat = 0) BEGIN SET druid_max = cntcol - 1 END COUNT_2DA_ROWS cntcol "cntrow" FOR (cnt = 0; cnt < cntrow; cnt = cnt + 1) BEGIN READ_2DA_ENTRY cnt 1 cntcol "entry" PATCH_IF (entry > 0) BEGIN READ_2DA_ENTRY cnt 0 cntcol "start_lvl" SET cnt = cntrow END END END PATCH_IF (start_lvl > 1) BEGIN SET level_druid = level_druid - (start_lvl - 1) // normally Ranger spells start at level 8 END SET is_cleric = 1 SET is_druid = 1 SET check = 1 END ELSE PATCH_IF (class = 202) BEGIN //Mage, Sorcerer (including single class, kits, multi-class, and dual-class) SET is_mage = 1 SET check = 1 END ELSE PATCH_IF (class = 206) BEGIN //Bard (including single class, kits, multi-class, and dual-class) SET is_mage = 1 SET check = 1 END ELSE PATCH_IF (class = 5) BEGIN //Bard (though only single class & kits) SET is_mage = 1 SET check = 1 END ELSE PATCH_IF (class = 19) BEGIN //Trueclass sorcerer SET is_mage = 1 SET check = 1 END ELSE PATCH_IF (class = 7) BEGIN //Fighter/Mage SET is_mage = 1 SET check = 1 END ELSE PATCH_IF (class = 10) BEGIN //Fighter/Mage/Thief SET is_mage = 1 SET check = 1 END ELSE PATCH_IF (class = 13) BEGIN //Mage/Thief SET is_mage = 1 SET check = 1 END ELSE PATCH_IF (class = 1) BEGIN //Mage, Sorcerer (though only single class & kits) SET is_mage = 1 SET check = 1 END PATCH_IF (check = 1) BEGIN READ_BYTE 0x27b align // used for various restriction checks below INNER_ACTION BEGIN LAF RES_NUM_OF_SPELL_NAME STR_VAR spell_name = EVAL ~%spell_name%~ RET spell_res spell_num END COPY_EXISTING ~%spell_res%.spl~ ~override~ READ_LONG 0x1e "flags" PATCH_IF (is_cleric = 1) OR (is_druid = 1) BEGIN PATCH_IF (~%flags%~ BAND BIT0) BEGIN //Exclude Chaotic priests PATCH_IF (align = 49) OR (align = 50) OR (align = 51) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT1) BEGIN //Exclude Evil priests PATCH_IF (align = 19) OR (align = 35) OR (align = 51) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT2) BEGIN //Exclude Good priests PATCH_IF (align = 17) OR (align = 33) OR (align = 49) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT3) BEGIN //Exclude Lawful Neutral, Neutral, Chaotic Neutral priests PATCH_IF (align = 18) OR (align = 34) OR (align = 50) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT4) BEGIN //Exclude Lawful priests PATCH_IF (align = 17) OR (align = 18) OR (align = 19) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT5) BEGIN //Exclude Neutral Good, Neutral, Neutral Evil priests PATCH_IF (align = 33) OR (align = 34) OR (align = 35) BEGIN SET remove_spell = 1 END END END PATCH_IF (is_mage = 1) BEGIN PATCH_IF (~%flags%~ BAND BIT6) BEGIN //Exclude Abjurers PATCH_IF (kit = 0x00400000) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT7) BEGIN //Exclude Conjurers PATCH_IF (kit = 0x00800000) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT8) BEGIN //Exclude Diviners PATCH_IF (kit = 0x01000000) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT9) BEGIN //Exclude Enchanters PATCH_IF (kit = 0x02000000) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT10) BEGIN //Exclude Illusionists PATCH_IF (kit = 0x04000000) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT11) BEGIN //Exclude Invokers PATCH_IF (kit = 0x08000000) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT12) BEGIN //Exclude Necromancers PATCH_IF (kit = 0x10000000) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT13) BEGIN //Exclude Transmuters PATCH_IF (kit = 0x20000000) BEGIN SET remove_spell = 1 END END PATCH_IF (~%flags%~ BAND BIT14) BEGIN //Wild Magic (exclude Generalists) PATCH_IF (kit = 0) OR (kit = 0x00000040) BEGIN SET remove_spell = 1 END END END PATCH_IF (~%flags%~ BAND BIT30) BEGIN //Exclude Cleric/Paladin PATCH_IF (is_cleric = 1) BEGIN PATCH_IF (is_druid = 1) AND (~%flags%~ BAND BIT31) BEGIN SET remove_spell = 1 END ELSE BEGIN SET remove_spell = 1 END END END PATCH_IF (~%flags%~ BAND BIT31) BEGIN //Exclude Druid/Ranger PATCH_IF (is_druid = 1) BEGIN PATCH_IF (is_cleric = 1) AND (~%flags%~ BAND BIT30) BEGIN SET remove_spell = 1 END ELSE BEGIN SET remove_spell = 1 END END END BUT_ONLY END //Known Spells READ_LONG 0x2a0 "kspell_off" READ_SHORT 0x2a4 "kspell_cnt" FOR (cnt=0; cnt<"%kspell_cnt%"; cnt=cnt+1) BEGIN READ_ASCII ("%kspell_off%"+0xc*cnt) "known_spl" PATCH_IF (~%known_spl%~ STR_EQ ~%spell_res%~) BEGIN SET already_known = 1 SET cnt = kspell_cnt END END //Memorised Spells READ_LONG 0x2b0 "mspell_off" READ_SHORT 0x2b4 "mspell_cnt" FOR (cnt=0; cnt<"%mspell_cnt%"; cnt=cnt+1) BEGIN READ_ASCII ("%mspell_off%"+0xc*cnt) "mem_spl" PATCH_IF (~%mem_spl%~ STR_EQ ~%spell_res%~) BEGIN SET already_memorised = 1 SET cnt = mspell_cnt END END PATCH_IF (remove_spell = 1) BEGIN PATCH_IF (already_known = 1) BEGIN SPRINT log ~%log%removing known spell: %spell_name% (%spell_res%)%LNL%~ REMOVE_KNOWN_SPELL ~%spell_res%~ END PATCH_IF (already_memorised = 1) BEGIN REMOVE_MEMORIZED_SPELL ~%spell_res%~ END END ELSE PATCH_IF (already_known = 0) BEGIN INNER_PATCH_SAVE spell_level ~%spell_res%~ BEGIN REPLACE_TEXTUALLY ~^SPPR\([1-9]\)[0-9][0-9]$~ ~\1~ END PATCH_IF (IS_AN_INT ~%spell_level%~) BEGIN PATCH_IF (cleric_max >= spell_level) BEGIN PATCH_IF (level_cleric > 0) AND (spell_level = 1) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #0 ~priest~ SET add_spell = 0 END ELSE PATCH_IF (level_cleric > 2) AND (spell_level = 2) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #1 ~priest~ SET add_spell = 0 END ELSE PATCH_IF (level_cleric > 4) AND (spell_level = 3) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #2 ~priest~ SET add_spell = 0 END ELSE PATCH_IF (level_cleric > 6) AND (spell_level = 4) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #3 ~priest~ SET add_spell = 0 END ELSE PATCH_IF (level_cleric > 8) AND (spell_level = 5) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #4 ~priest~ SET add_spell = 0 END ELSE PATCH_IF (level_cleric > 10) AND (spell_level = 6) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #5 ~priest~ SET add_spell = 0 END ELSE PATCH_IF (level_cleric > 13) AND (spell_level = 7) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #6 ~priest~ SET add_spell = 0 END END PATCH_IF (add_spell = 1) AND (druid_max >= spell_level) BEGIN PATCH_IF (level_druid > 0) AND (spell_level = 1) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #0 ~priest~ END ELSE PATCH_IF (level_druid > 2) AND (spell_level = 2) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #1 ~priest~ END ELSE PATCH_IF (level_druid > 4) AND (spell_level = 3) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #2 ~priest~ END ELSE PATCH_IF (level_druid > 6) AND (spell_level = 4) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #3 ~priest~ END ELSE PATCH_IF (level_druid > 8) AND (spell_level = 5) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #4 ~priest~ END ELSE PATCH_IF (level_druid > 10) AND (spell_level = 6) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #5 ~priest~ END ELSE PATCH_IF (level_druid > 13) AND (spell_level = 7) BEGIN SPRINT log ~%log%adding known spell: %spell_name% (%spell_res%)%LNL%~ ADD_KNOWN_SPELL ~%spell_res%~ #6 ~priest~ END END END END END END ///////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE_ACTION_MACRO ~bash_log~ BEGIN //whenever this macro is invoked, it moves the contents of %MOD_FOLDER%/temp/bash.debug to the real log. LOCAL_SET ln=0 LOCAL_SPRINT log ~~ ACTION_IF (FILE_EXISTS ~%temp_dir%/bash.debug~) AND (NOT FILE_SIZE ~%temp_dir%/bash.debug~ 0) BEGIN //don't do this if no log is available now. COPY + ~%temp_dir%/bash.debug~ ~%temp_dir%~ ln=BUFFER_LENGTH READ_ASCII 0 log (ln) DELETE_BYTES 0 ln PATCH_LOG ~%log%~ SPRINT log ~~ END END ///////////////////////////////////////////////////////////////////////////////////////////////////////// //Dumps the areas and links of a .wmp file to textual data DEFINE_PATCH_FUNCTION dump_wmp INT_VAR tra_read = 0 move_x = 0 move_y = 0 compare_bams = 0 skip_areas = 0 skip_links = 0 skip_strings = 0 STR_VAR 2da_links_array = "" icons_array = "" output_areas = EVAL "%SOURCE_RES%_areas.2da" output_links = EVAL "%SOURCE_RES%_links.2da" output_strings = EVAL "%SOURCE_RES%_trans.tra" BEGIN SPRINT tilde "~" SPRINT quote ~"~ SPRINT area_string "SHORT_NAME CONTENT LONG_NAME FLAGS BAM_ANIM X_POS Y_POS NAME TOOLTIP LOAD_IM%LNL%" SPRINT link_string "SRC_AREA SRC_NWSE TARGET_ARE ENTRY_NAME TRV_TIME DEF_ENTRY ENC1 ENC2 ENC3 ENC4 ENC5 ENC_PROB%LNL%" SPRINT trans_string "" SPRINT area_log "" READ_LONG 0x8 wmap_cnt READ_LONG 0xc wmap_off FOR (cnt=0; cnt<"%wmap_cnt%"; cnt=cnt+1) BEGIN READ_LONG ("%wmap_off%"+0xb8*cnt+0x20) na READ_LONG ("%wmap_off%"+0xb8*cnt+0x24) ao READ_LONG ("%wmap_off%"+0xb8*cnt+0x28) lo FOR (i=0;i icon BEGIN PATCH_IF (~%area%~ STR_EQ ~%compare%~) BEGIN SPRINT area_log ~%area_log% %area%~ PATCH_PRINT ~%area% wmp icon patching: %bam% -> %icon%~ SET bam = icon END END PATCH_IF (compare_bams = 1) BEGIN PHP_EACH ~%icons_array%~ AS compare => icon BEGIN PATCH_IF (~%bam%~ STR_EQ ~%compare_1%~) AND (~%area_log%~ STRING_CONTAINS_REGEXP ~%area%~) BEGIN SPRINT area_log ~%area_log% %area%~ PATCH_PRINT ~%area% wmp icon patching: %bam% -> %icon%~ SET bam = icon END END END READ_LONG ao + 0xf0*i + 0x38 xcor SET xcor = xcor + move_x READ_LONG ao + 0xf0*i + 0x3c ycor SET ycor = ycor + move_y //READ_ASCII ao + 0xf0*i + 0x48 load SPRINT load N READ_LONG ao + 0xf0*i + 0x40 name READ_LONG ao + 0xf0*i + 0x44 tool PATCH_IF (tra_read = 0) BEGIN PATCH_IF (name < 0) BEGIN SPRINT name ~~ SPRINT tool ~~ END ELSE BEGIN READ_STRREF ao + 0xf0*i + 0x40 name READ_STRREF ao + 0xf0*i + 0x44 tool END END ELSE BEGIN PATCH_IF (name > 0) BEGIN LPF EET_strref INT_VAR str = name RET str END GET_STRREF str name END ELSE BEGIN SPRINT name ~~ END PATCH_IF (tool > 0) BEGIN LPF EET_strref INT_VAR str = tool RET str END GET_STRREF str tool END ELSE BEGIN SPRINT tool ~~ END END SET doOnce = 0 PATCH_FOR_EACH var IN name tool BEGIN SPRINT content EVAL "%%var%%" PATCH_IF ("%content%" STR_EQ "") BEGIN SPRINT EVAL "%var%" N END ELSE BEGIN INNER_PATCH_SAVE content "%content%" BEGIN REPLACE_TEXTUALLY " " "###" END PATCH_IF (doOnce = 0) BEGIN SPRINT trans_string "%trans_string%@%area% = %quote%%content%%quote%%LNL%" SET doOnce = 1 END SPRINT EVAL "%var%" "@%area%" END END SPRINT area_string "%area_string%%area% %area% %area% %flags% %bam% %xcor% %ycor% %name% %tool% %load%%LNL%" PATCH_FOR_EACH j IN 0 3 2 1 BEGIN READ_LONG ao + 0xf0*i + 0x50 + 0x8*j li READ_LONG ao + 0xf0*i + 0x54 + 0x8*j nl FOR (k=0;k file BEGIN COPY_EXISTING - ~%file%.2da~ ~.../%file%.2da~ PRETTY_PRINT_2DA REPLACE_TEXTUALLY ~\*~ ~N~ REPLACE_EVALUATE CASE_INSENSITIVE ~^[0-9]+[ ]+\([A-Za-z0-9#_-]+\)+[ ]+\([0-9]+\)[ ]+\([A-Za-z0-9#_-]+\)[ ]+\([0-9]+\)[ ]+\([0-9]+\)[ ]+\([A-Za-z0-9#_-]+\)[ ]+\([A-Za-z0-9#_-]+\)[ ]+\([A-Za-z0-9#_-]+\)[ ]+\([A-Za-z0-9#_-]+\)[ ]+\([A-Za-z0-9#_-]+\)[ ]+\([0-3N]+\)$~ BEGIN PATCH_IF (~%MATCH11%~ STR_EQ ~N~) BEGIN //from source area SPRINT nesw ~E~ PATCH_IF (("%link_string%" STRING_CONTAINS_REGEXP "%source% %nesw% %MATCH1% %MATCH3% %MATCH4% %MATCH2% %MATCH6% %MATCH7% %MATCH8% %MATCH9% %MATCH10% %MATCH5%")=0) BEGIN PATCH_PRINT ~Skipping duplicated link: %source% %nesw% %MATCH1% %MATCH3% %MATCH4% %MATCH2% %MATCH6% %MATCH7% %MATCH8% %MATCH9% %MATCH10% %MATCH5%~ END ELSE BEGIN SPRINT link_string "%link_string%%source% %nesw% %MATCH1% %MATCH3% %MATCH4% %MATCH2% %MATCH6% %MATCH7% %MATCH8% %MATCH9% %MATCH10% %MATCH5%%LNL%" END END ELSE BEGIN //to source area INNER_PATCH_SAVE nesw "%MATCH11%" BEGIN REPLACE_TEXTUALLY 0 N REPLACE_TEXTUALLY 1 W REPLACE_TEXTUALLY 2 S REPLACE_TEXTUALLY 3 E END PATCH_IF (("%link_string%" STRING_CONTAINS_REGEXP "%MATCH1% %nesw% %source% %MATCH3%")=0) BEGIN PATCH_PRINT ~Skipping duplicated link: %MATCH1% %nesw% %source% %MATCH3% %MATCH4% %MATCH2% %MATCH6% %MATCH7% %MATCH8% %MATCH9% %MATCH10% %MATCH5%~ END ELSE BEGIN SPRINT link_string "%link_string%%MATCH1% %nesw% %source% %MATCH3% %MATCH4% %MATCH2% %MATCH6% %MATCH7% %MATCH8% %MATCH9% %MATCH10% %MATCH5%%LNL%" END END END ~~ END <<<<<<<< ...blank >>>>>>>> ACTION_IF (skip_areas = 0) BEGIN COPY + ~...blank~ ~%output_areas%~ INSERT_BYTES 0 STRING_LENGTH "%area_string%" WRITE_ASCIIE 0 "%area_string%" PRETTY_PRINT_2DA REPLACE_TEXTUALLY ~^[ ]+~ ~~ END ACTION_IF (skip_links = 0) BEGIN COPY + ~...blank~ ~%output_links%~ INSERT_BYTES 0 STRING_LENGTH "%link_string%" WRITE_ASCIIE 0 "%link_string%" PRETTY_PRINT_2DA REPLACE_TEXTUALLY ~^[ ]+~ ~~ END ACTION_IF (skip_strings = 0) BEGIN COPY + ~...blank~ ~%output_strings%~ INSERT_BYTES 0 STRING_LENGTH "%trans_string%" WRITE_ASCIIE 0 "%trans_string%" END END END ///////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE_PATCH_MACRO read_area_array_from_2da BEGIN LOCAL_SPRINT fl#r2en_area "" LOCAL_SET i = 0 LOCAL_SPRINT area "" LOCAL_SPRINT short "" LOCAL_SPRINT long "" LOCAL_SET flags = 0 LOCAL_SET bam = 0 LOCAL_SET x_cor = 0 LOCAL_SET y_cor = 0 LOCAL_SPRINT name "" LOCAL_SPRINT tool "" LOCAL_SPRINT load "" LOCAL_SPRINT var "" LOCAL_SPRINT cmp "" LOCAL_SPRINT array "" READ_2DA_ENTRIES_NOW fl#r2en_area 10 FOR (i=0;i i AND id = id2 BEGIN SET $fl#patches("%id%") = 1 READ_2DA_ENTRY_FORMER r2en_patches j 0 source READ_2DA_ENTRY_FORMER r2en_patches j 1 nesw READ_2DA_ENTRY_FORMER r2en_patches j 2 target READ_2DA_ENTRY_FORMER r2en_patches j 3 entry READ_2DA_ENTRY_FORMER r2en_patches j 4 dist READ_2DA_ENTRY_FORMER r2en_patches j 5 def_entry READ_2DA_ENTRY_FORMER r2en_patches j 6 enc1 READ_2DA_ENTRY_FORMER r2en_patches j 7 enc2 READ_2DA_ENTRY_FORMER r2en_patches j 8 enc3 READ_2DA_ENTRY_FORMER r2en_patches j 9 enc4 READ_2DA_ENTRY_FORMER r2en_patches j 10 enc5 READ_2DA_ENTRY_FORMER r2en_patches j 11 enc_prob TO_LOWER source TO_LOWER nesw TO_LOWER target PATCH_IF "%source%" STRING_COMPARE_CASE SRC_AREA AND "%target%" STRING_COMPARE_CASE TARGET_ARE BEGIN j = $j_array("%nesw%") PATCH_IF VARIABLE_IS_SET $EVAL "fl#INDEX_%j%"("%source%" "%target%") BEGIN SPRINT $fl#ENTRY("%source%" "%j%" "%target%") "%entry%" SET $fl#TIME("%source%" "%j%" "%target%") = dist SET $fl#DEF("%source%" "%j%" "%target%") = def_entry PATCH_FOR_EACH var IN enc1 enc2 enc3 enc4 enc5 BEGIN SPRINT cmp EVAL "%%var%%" SPRINT array "%var%" TO_UPPER array PATCH_IF "%cmp%" STRING_COMPARE_CASE N BEGIN SPRINT $EVAL "fl#%array%"("%source%" "%j%" "%target%") "%cmp%" END END SET $fl#PROB("%source%" "%j%" "%target%") = enc_prob END END j = r2en_patches END END END END END ///////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE_ACTION_MACRO merge_in_translations BEGIN LOCAL_SPRINT array "" LOCAL_SPRINT area "" LOCAL_SPRINT result "" //Swap the tra references for the associated string ACTION_FOR_EACH array IN fl#NAME fl#TOOL BEGIN ACTION_PHP_EACH "%array%" AS area => result BEGIN ACTION_IF VARIABLE_IS_SET $fl#TRANS("%result%") BEGIN OUTER_SPRINT $EVAL "%array%"("%area%") $fl#TRANS("%result%") END END END //If there are tra references for which there was no data provided, null the array value ACTION_FOR_EACH array IN fl#NAME fl#TOOL BEGIN ACTION_PHP_EACH "%array%" AS area => result BEGIN ACTION_IF "%result%" STRING_MATCHES_REGEXP "^@.*" = 0 BEGIN OUTER_SPRINT $EVAL "%array%"("%area%") "" END END END END ///////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE_PATCH_FUNCTION fix_table BEGIN REPLACE_TEXTUALLY EVALUATE_REGEXP ~\([0-9]+\)\(SHORT_NAME\)~ ~\1%LNL%%LNL%\2~ REPLACE_TEXTUALLY EVALUATE_REGEXP ~\([0-9]+\)\(//\)~ ~\1%LNL%%LNL%\2~ REPLACE_TEXTUALLY EVALUATE_REGEXP ~\([0-9]+\)\(SRC_AREA\)~ ~\1%LNL%%LNL%\2~ REPLACE_TEXTUALLY EVALUATE_REGEXP ~~~~~\("\|~\|%\)\(@\)~~~~~ ~~~~~\1%LNL%%LNL%\2~~~~~ //"~ REPLACE_TEXTUALLY EVALUATE_REGEXP ~~~~~\("\|~\|%\)\(//\)~~~~~ ~~~~~\1%LNL%%LNL%\2~~~~~ //"~ END ///////////////////////////////////////////////////////////////////////////////////////////////////////// //fixes issues with glitched water overlays, code by argent77 DEFINE_ACTION_FUNCTION FIX_WATER INT_VAR numTilesToFix = 0 // number of tile indices to fix // $tilesToFix(0), ... contain tile indices to fix STR_VAR wed = ~~ tis = ~~ BEGIN ACTION_IF (numTilesToFix > 0) BEGIN // Setting required secondary tile indices COPY + ~%wed%~ ~%wed%~ SET ofsOverlay = LONG_AT 0x10 SET ofsTileMap = LONG_AT (ofsOverlay + 0x10) //READ_ASCII (ofsOverlay + 0x04) tisFile (8) NULL INNER_ACTION BEGIN // adding dummy tiles to TIS COPY + ~%tis%~ ~%tis%~ READ_LONG 0x08 numTiles WRITE_LONG 0x08 (numTiles + numTilesToFix) READ_LONG 0x0c sizeTile READ_LONG 0x10 ofsTiles FOR (idx = 0 curOfs = ofsTiles + (numTiles * sizeTile); idx < numTilesToFix; idx += 1 curOfs += sizeTile) BEGIN // adding new "black" tile INSERT_BYTES curOfs sizeTile WRITE_LONG curOfs "-1" END END // updating secondary tile indices FOR (idx = 0; idx < numTilesToFix; idx += 1) BEGIN PATCH_IF (VARIABLE_IS_SET $EVAL tilesToFix(~%idx%~)) BEGIN SET tileIndex = $EVAL tilesToFix(~%idx%~) SET ofsTile = ofsTileMap + (tileIndex * 10) WRITE_SHORT (ofsTile + 4) (numTiles + idx) END END END END ///////////////////////////////////////////////////////////////////////////////////////////////////////// //vars: array, src_dir_1, dest_dir, del_pvrz, SOURCE_EXT, reserve_index_start, reserve_index_cnt DEFINE_PATCH_MACRO ~EET_install_pvrz~ BEGIN READ_LONG 0x10 "blocks_cnt" PATCH_IF (~%SOURCE_EXT%~ STR_EQ ~bam~) BEGIN READ_LONG 0x1c "blocks_off" END ELSE BEGIN //mos READ_LONG 0x14 "blocks_off" END FOR (cnt=0; cnt<"%blocks_cnt%"; cnt=cnt+1) BEGIN READ_LONG ("%blocks_off%"+0x1c*cnt+0x0) "original_base_index" //PATCH_PRINT ~cnt = %cnt%, original_base_index = %original_base_index%~ PATCH_IF (VARIABLE_IS_SET $EVAL ~%array%~(~%original_base_index%~)) BEGIN TEXT_SPRINT new_base_index $EVAL ~%array%~(~%original_base_index%~) WRITE_LONG ("%blocks_off%"+0x1c*cnt+0x0) "new_base_index" END ELSE BEGIN SET new_base_index = reserve_index_start + reserve_index_cnt //variables already set via prep_PVRZ.tph SET reserve_index_cnt = reserve_index_cnt + 1 //PATCH_PRINT ~%array% = %original_base_index% => %new_base_index%~ SPRINT $EVAL "%array%"("%original_base_index%") "%new_base_index%" WRITE_LONG ("%blocks_off%"+0x1c*cnt+0x0) "new_base_index" PATCH_FOR_EACH index IN original_base_index new_base_index BEGIN SET value = EVAL ~%index%~ PATCH_IF (value < 10) BEGIN SPRINT EVAL ~%index%~ ~000%value%~ END ELSE PATCH_IF (value < 100) BEGIN SPRINT EVAL ~%index%~ ~00%value%~ END ELSE PATCH_IF (value < 1000) BEGIN SPRINT EVAL ~%index%~ ~0%value%~ END ELSE BEGIN SPRINT EVAL ~%index%~ ~%value%~ END END INNER_ACTION BEGIN //LAF ~INSTALL_PVRZ~ INT_VAR original_base_index new_base_index STR_VAR source_file = EVAL ~%src_dir_1%/mos%pvrz_name%.pvrz~ target_folder = EVAL ~%dest_dir%~ END COPY_LARGE + ~%src_dir_1%/mos%original_base_index%.pvrz~ ~%dest_dir%/mos%new_base_index%.pvrz~ ACTION_IF del_pvrz = 1 BEGIN DELETE + ~%src_dir_1%/mos%original_base_index%.pvrz~ END END END END END ///////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE_ACTION_FUNCTION ~EET_strref~ INT_VAR str = 0 min = 1 max = 2999999 add = 0 STR_VAR array = ~~ RET str BEGIN ACTION_IF (str >= min) AND (str <= max) BEGIN ACTION_IF (VARIABLE_IS_SET $EVAL ~%array%~(~%str%~)) BEGIN OUTER_TEXT_SPRINT str $EVAL ~%array%~(~%str%~) END ELSE BEGIN OUTER_SET str = str + add END END ELSE ACTION_IF str != 0 BEGIN OUTER_SET str = ~-1~ END END DEFINE_PATCH_FUNCTION ~EET_strref~ INT_VAR str = 0 min = 1 max = 2999999 add = 0 STR_VAR array = ~~ RET str BEGIN PATCH_IF (str >= min) AND (str <= max) BEGIN PATCH_IF (VARIABLE_IS_SET $EVAL ~%array%~(~%str%~)) BEGIN TEXT_SPRINT str $EVAL ~%array%~(~%str%~) END ELSE BEGIN SET str = str + add END END ELSE PATCH_IF str != 0 BEGIN SET str = ~-1~ END END DEFINE_PATCH_MACRO ~EET_PCU_off_strref~ BEGIN READ_LONG off "source" LPF EET_strref INT_VAR str = source add = strrefAdd STR_VAR array = ~remapped_tra~ RET dest = str END PATCH_IF (source != dest) BEGIN SET updated = 1 WRITE_LONG off "%dest%" //SPRINT str ~Patching %SOURCE_FILESPEC%: TRA = %source% => %dest% -~ //SPRINTF str ~%s %x~ ("%str%" off) //PATCH_PRINT ~%str%~ END END DEFINE_PATCH_MACRO ~EET_PCU_off_mus~ BEGIN READ_LONG off "source" PATCH_IF ("%source%" > 0) AND (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_mus~(~%source%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_mus~(~%source%~) PATCH_IF (NOT IS_AN_INT dest) BEGIN PATCH_WARN ~WARNING EET_PCU_off_mus: missing %source%~ END ELSE PATCH_IF (source != dest) BEGIN SET updated = 1 WRITE_LONG off "%dest%" SPRINT str ~Patching %SOURCE_FILESPEC%: MUSIC = %source% => %dest% -~ SPRINTF str ~%s %x~ ("%str%" off) PATCH_IF (source > 0) AND (dest = 0) BEGIN //PATCH_WARN ~WARNING: %str%~ PATCH_PRINT ~ATTENTION: %str%~ END ELSE BEGIN PATCH_PRINT ~%str%~ END END END END DEFINE_PATCH_MACRO ~EET_PCU_off_long~ BEGIN READ_LONG off "source" PATCH_IF ("%source%" > 0) AND (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source%~) PATCH_IF (NOT IS_AN_INT dest) BEGIN PATCH_WARN ~WARNING EET_PCU_off_long: missing %source%~ END ELSE PATCH_IF (source != dest) BEGIN SET updated = 1 WRITE_LONG off "%dest%" SPRINT str ~Patching %SOURCE_FILESPEC%: %res% = %source% => %dest% -~ SPRINTF str ~%s %x~ ("%str%" off) PATCH_PRINT ~%str%~ END END END DEFINE_PATCH_MACRO ~EET_PCU_off_short~ BEGIN READ_SHORT off "source" PATCH_IF ("%source%" > 0) AND (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source%~) PATCH_IF (NOT IS_AN_INT dest) BEGIN PATCH_WARN ~WARNING EET_PCU_off_short: missing %source%~ END ELSE PATCH_IF (source != dest) BEGIN SET updated = 1 WRITE_SHORT off "%dest%" SPRINT str ~Patching %SOURCE_FILESPEC%: %res% = %source% => %dest% -~ SPRINTF str ~%s %x~ ("%str%" off) PATCH_PRINT ~%str%~ END END END DEFINE_PATCH_MACRO ~EET_PCU_off_byte~ BEGIN READ_BYTE off "source" PATCH_IF ("%source%" > 0) AND (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source%~) PATCH_IF (NOT IS_AN_INT dest) BEGIN PATCH_WARN ~WARNING EET_PCU_off_byte: missing %source%~ END ELSE PATCH_IF (source != dest) BEGIN SET updated = 1 WRITE_BYTE off "%dest%" SPRINT str ~Patching %SOURCE_FILESPEC%: %res% = %source% => %dest% -~ SPRINTF str ~%s %x~ ("%str%" off) PATCH_PRINT ~%str%~ END END END DEFINE_PATCH_MACRO ~EET_PCU_off_ipro~ BEGIN PATCH_IF ~%read_len%~ STR_EQ ~s~ BEGIN READ_SHORT off "source" END ELSE PATCH_IF ~%read_len%~ STR_EQ ~l~ BEGIN READ_LONG off "source" END SET source = source - sub PATCH_IF ("%source%" > 0) AND (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_ipro~(~%source%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_ipro~(~%source%~) PATCH_IF (NOT IS_AN_INT dest) BEGIN PATCH_WARN ~WARNING EET_PCU_off_ipro: missing %source%~ END ELSE PATCH_IF (source != dest) BEGIN SET updated = 1 PATCH_IF ~%read_len%~ STR_EQ ~s~ BEGIN WRITE_SHORT off "%dest%" END ELSE PATCH_IF ~%read_len%~ STR_EQ ~l~ BEGIN WRITE_LONG off "%dest%" END SPRINT str ~Patching %SOURCE_FILESPEC%: IDS PROJECTILE = %source% => %dest% -~ SPRINTF str ~%s %x~ ("%str%" off) PATCH_PRINT ~%str%~ END END SPRINT read_len ~~ SET sub = 0 END DEFINE_PATCH_MACRO ~EET_PCU_off_kit~ BEGIN PATCH_IF ~%read_len%~ STR_EQ ~s~ BEGIN SET short = 0 READ_SHORT off ~source~ END ELSE PATCH_IF ~%read_len%~ STR_EQ ~l~ BEGIN READ_SHORT off ~short~ READ_SHORT (off+0x2) ~source~ END PATCH_IF ("%short%" = 0) AND (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_kit~(~%source%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_kit~(~%source%~) PATCH_IF (NOT IS_AN_INT dest) BEGIN PATCH_WARN ~WARNING EET_PCU_off_kit: missing %source%~ END ELSE PATCH_IF (source != dest) BEGIN SET updated = 1 PATCH_IF ~%read_len%~ STR_EQ ~s~ BEGIN WRITE_SHORT off ~%dest%~ END ELSE PATCH_IF ~%read_len%~ STR_EQ ~l~ BEGIN WRITE_SHORT off 0 WRITE_SHORT (off+0x2) ~%dest%~ END SPRINT str ~Patching %SOURCE_FILESPEC%: KIT = %source% => %dest% -~ SPRINTF str ~%s %x~ ("%str%" off) PATCH_PRINT ~%str%~ END END END DEFINE_PATCH_MACRO ~EET_PCU_off_res~ BEGIN READ_ASCII off "source" (8) NULL TO_UPPER source PATCH_IF (NOT ~%source%~ STR_EQ ~~) AND (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source%~) SET updated = 1 WRITE_ASCIIE off "%dest%" #8 SPRINT str ~Patching %SOURCE_FILESPEC%: %res% = %source% => %dest% -~ SPRINTF str ~%s %x~ ("%str%" off) PATCH_PRINT ~%str%~ END END DEFINE_PATCH_MACRO ~EET_PCU_off_32~ BEGIN READ_ASCII off "source" (32) NULL TO_UPPER source PATCH_IF (NOT ~%source%~ STR_EQ ~~) AND (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source%~) SET updated = 1 WRITE_ASCIIE off "%dest%" #32 SPRINT str ~Patching %SOURCE_FILESPEC%: %res% = %source% => %dest% -~ SPRINTF str ~%s %x~ ("%str%" off) PATCH_PRINT ~%str%~ END END DEFINE_PATCH_MACRO ~EET_PCU_off_8675~ BEGIN READ_ASCII off "source" (8) NULL TO_UPPER source PATCH_IF (NOT ~%source%~ STR_EQ ~~) BEGIN READ_ASCII off "source6" (6) NULL TO_UPPER source6 READ_ASCII off "source7" (7) NULL TO_UPPER source7 READ_ASCII off "source5" (5) NULL TO_UPPER source5 PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source%~) SET updated = 1 WRITE_ASCIIE off "%dest%" SPRINT str ~Patching %SOURCE_FILESPEC%: %res% = %source% => %dest% -~ SPRINTF str ~%s %x~ ("%str%" off) PATCH_PRINT ~%str%~ END ELSE PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source6%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source6%~) SET updated = 1 WRITE_ASCIIE off "%dest%" SPRINT str ~Patching %SOURCE_FILESPEC%: %res% = %source6% => %dest% -~ SPRINTF str ~%s %x~ ("%str%" off) PATCH_PRINT ~%str%~ END ELSE PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source7%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source7%~) SET updated = 1 WRITE_ASCIIE off "%dest%" SPRINT str ~Patching %SOURCE_FILESPEC%: %res% = %source7% => %dest% -~ SPRINTF str ~%s %x~ ("%str%" off) PATCH_PRINT ~%str%~ END ELSE PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source5%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source5%~) SET updated = 1 WRITE_ASCIIE off "%dest%" SPRINT str ~Patching %SOURCE_FILESPEC%: %res% = %source5% => %dest% -~ SPRINTF str ~%s %x~ ("%str%" off) PATCH_PRINT ~%str%~ END END END DEFINE_PATCH_MACRO ~EET_PCU_migrate_soundslots~ BEGIN READ_LONG off "source" SET absoff = off - cre_struct_off WRITE_LONG dest "%source%" // always needs to be done to ensure voiding ACTION4-ACTION7 audio slots after migration PATCH_IF ("%source%" > 0) BEGIN TEXT_SPRINT soundslot EVAL $migrated_soundslots(~%absoff%~) SET updated = 1 SPRINT str ~Patching %SOURCE_FILESPEC% soundslot: %soundslot%~ SPRINTF str ~%s = %x => %x~ ("%str%" off dest) PATCH_PRINT ~%str%~ END END ///////////////////////////////////////////////////////////////////////////////////////////////////////// ACTION_DEFINE_ASSOCIATIVE_ARRAY EET_cmd_list BEGIN //ACTION.IDS "ACTIONOVERRIDE" => "_dv1_" //ActionOverride "ACTIVATE" => "_dv1_" //Activate "ADDEXPERIENCEPARTYGLOBAL" => "_var1_are2_" //AddexperiencePartyGlobal "ADDGLOBALS" => "_var1_var2_" //AddGlobals "ADDJOURNALENTRY" => "_tra1_" //AddJournalEntry "ADDMAPNOTE" => "_tra2_" //AddMapNote "ADDMAPNOTECOLOR" => "_tra2_" //AddMapNoteColor "ADDSPECIALABILITY" => "_spl1_" //AddSpecialAbility "ADDSTOREITEM" => "_sto1_itm2_" //AddStoreItem "ADDWORLDMAPAREAFLAG" => "_are1_" //AddWorldmapAreaFlag "ADDXPOBJECT" => "_dv1_" //AddXPObject "ADDXPWORTH" => "_dv1_" //AddXPWorth "ADDXPWORTHONCE" => "_dv1_" //AddXPWorthOnce "AMBIENTACTIVATE" => "_dv1_" //AmbientActivate "APPLYDAMAGE" => "_dv1_" //ApplyDamage "APPLYDAMAGEPERCENT" => "_dv1_" //ApplyDamagePercent "APPLYSPELL" => "_dv1_splName2_splRes2_" //ApplySpell "APPLYSPELLRES" => "_spl1_dv2_" //ApplySpellRES "ATTACHTRANSITIONTODOOR" => "_door2_" //AttachTransitionToDoor "ATTACK" => "_dv1_" //Attack "ATTACKNOSOUND" => "_dv1_" //AttackNoSound "ATTACKONEROUND" => "_dv1_" //AttackOneRound "ATTACKREEVALUATE" => "_dv1_" //AttackReevaluate "BACKSTAB" => "_dv1_" //BackStab "BASHDOOR" => "_door1_" //BashDoor "BITSET" => "_var1_" //BitSet "BITCLEAR" => "_var1_" //BitClear "CALLLIGHTNING" => "_dv1_" //CallLightning "CALM" => "_dv1_" //Calm "CHANGEAISCRIPT" => "_bcs1_" //ChangeAIScript "CHANGEAITYPE" => "_dv1_" //ChangeAIType "CHANGEALIGNMENT" => "_dv1_" //ChangeAlignment "CHANGEANIMATION" => "_cre1_" //ChangeAnimation "CHANGEANIMATIONNOEFFECT" => "_cre1_" //ChangeAnimationNoEffect "CHANGECLASS" => "_dv1_class2_" //ChangeClass "CHANGEENEMYALLY" => "_dv1_" //ChangeEnemyAlly "CHANGEGENDER" => "_dv1_" //ChangeGender "CHANGEGENERAL" => "_dv1_" //ChangeGeneral "CHANGERACE" => "_dv1_race2_" //ChangeRace "CHANGESPECIFICS" => "_dv1_spec2_" //ChangeSpecifics "CHANGESTAT" => "_dv1_stat2_" //ChangeStat "CHANGESTOREMARKUP" => "_sto1_" //ChangeStoreMarkup "CLEARACTIONS" => "_dv1_" //ClearActions "CLOSEDOOR" => "_door1_" //CloseDoor "COPYGROUNDPILESTO" => "_are1_" //CopyGroundPilesTo "CREATECREATURE" => "_cre1_" //CreateCreature "CREATECREATUREATLOCATION" => "_var1_are2_cre3_" //CreateCreatureAtLocation "CREATECREATURECOPYPOINT" => "_cre1_dv2_" //CreateCreatureCopyPoint "CREATECREATUREDOOR" => "_cre1_" //CreateCreatureDoor "CREATECREATUREEFFECT" => "_cre1_bam2_" //CreateCreatureEffect "CREATECREATUREIMPASSABLE" => "_cre1_" //CreateCreatureImpassable "CREATECREATUREIMPASSABLEALLOWOVERLAP" => "_cre1_" //CreateCreatureImpassableAllowOverlap "CREATECREATUREIMPASSABLEALLOWOVERLAPEFFECT" => "_cre1_bam2_" //CreateCreatureImpassableAllowOverlapEffect "CREATECREATUREIMPASSABLEEFFECT" => "_cre1_bam2_" //CreateCreatureImpassableEffect "CREATECREATUREOBJECT" => "_cre1_dv2_door2_" //CreateCreatureObject "CREATECREATUREOBJECTCOPY" => "_cre1_dv2_door2_" //CreateCreatureObjectCopy "CREATECREATUREOBJECTCOPYEFFECT" => "_cre1_bam2_dv3_" //CreateCreatureObjectCopyEffect "CREATECREATUREOBJECTDOOR" => "_cre1_dv2_door2_" //CreateCreatureObjectDoor "CREATECREATUREOBJECTEFFECT" => "_cre1_bam2_dv3_" //CreateCreatureObjectEffect "CREATECREATUREOBJECTOFFSCREEN" => "_cre1_dv2_door2_" //CreateCreatureObjectOffScreen "CREATECREATUREOBJECTOFFSET" => "_cre1_dv2_door2_" //CreateCreatureObjectOffset "CREATECREATUREOFFSCREEN" => "_cre1_" //CreateCreatureOffScreen "CREATEITEM" => "_itm1_" //CreateItem "CREATEITEMGLOBAL" => "_var1_are2_itm3_" //CreateItemGlobal "CREATEVISUALEFFECT" => "_bam1_" //CreateVisualEffect "CREATEVISUALEFFECTOBJECT" => "_bam1_dv2_" //CreateVisualEffectObject "CUTSCENEID" => "_dv1_" //CutSceneId "DEACTIVATE" => "_dv1_" //Deactivate "DEATHMATCHPOSITIONAREA" => "_are1_" //DeathMatchPositionArea "DEATHMATCHPOSITIONGLOBAL" => "_are1_" //DeathMatchPositionGlobal "DEATHMATCHPOSITIONLOCAL" => "_are1_" //DeathMatchPositionLocal "DESTROYITEM" => "_itm1_" //DestroyItem "DETECTSECRETDOOR" => "_door1_" //DetectSecretDoor "DIALOG" => "_dv1_" //Dialog "DIALOGFORCEINTERRUPT" => "_dv1_" //DialogForceInterrupt "DIALOGUE" => "_dv1_" //Dialogue "DIALOGUEFORCEINTERRUPT" => "_dv1_" //DialogueForceInterrupt "DISABLEAI" => "_dv1_" //DisableAI "DISPLAYSTRING" => "_dv1_tra2_" //DisplayString "DISPLAYSTRINGHEAD" => "_dv1_tra2_" //DisplayStringHead "DISPLAYSTRINGHEADDEAD" => "_dv1_tra2_" //DisplayStringHeadDead "DISPLAYSTRINGHEADNOLOG" => "_dv1_tra2_" //DisplayStringHeadNoLog "DISPLAYSTRINGHEADOWNER" => "_itm1_tra2_" //DisplayStringHeadOwner "DISPLAYSTRINGNONAME" => "_dv1_tra2_" //DisplayStringNoName "DISPLAYSTRINGNONAMEDLG" => "_dv1_tra2_" //DisplayStringNoNameDlg "DISPLAYSTRINGNONAMEHEAD" => "_dv1_tra2_" //DisplayStringNoNameHead "DISPLAYSTRINGPOINT" => "_tra2_" //DisplayStringPoint "DISPLAYSTRINGPOINTLOG" => "_tra2_" //DisplayStringPointLog "DISPLAYSTRINGWAIT" => "_dv1_tra2_" //DisplayStringWait "DROPITEM" => "_itm1_" //DropItem "EQUIPITEM" => "_itm1_" //EquipItem "EQUIPITEMEX" => "_itm1_" //EquipItemEx "ERASEJOURNALENTRY" => "_tra1_" //EraseJournalEntry "ESCAPEAREAMOVE" => "_are1_" //EscapeAreaMove "ESCAPEAREAOBJECT" => "_door1_" //EscapeAreaObject "ESCAPEAREAOBJECTMOVE" => "_are1_door2_" //EscapeAreaObjectMove "FACEOBJECT" => "_dv1_door1_" //FaceObject "FAKEEFFECTEXPIRYCHECK" => "_dv1_" //FakeEffectExpiryCheck "FOLLOWOBJECTFORMATION" => "_dv1_" //FollowObjectFormation "FORCERANDOMENCOUNTER" => "_are1_" //ForceRandomEncounter "FORCERANDOMENCOUNTERENTRY" => "_are1_" //ForceRandomEncounterEntry "FORCESPELL" => "_dv1_splName2_splRes2_" //ForceSpell "FORCESPELLPOINT" => "_splName2_splRes2_" //ForceSpellPoint "FORCESPELLPOINTRANGE" => "_splName2_splRes2_" //ForceSpellPointRange "FORCESPELLPOINTRANGERES" => "_spl1_" //ForceSpellPointRangeRES "FORCESPELLPOINTRES" => "_spl1_" //ForceSpellPointRES "FORCESPELLRANGE" => "_dv1_splName2_splRes2_" //ForceSpellRange "FORCESPELLRANGERES" => "_spl1_dv2_" //ForceSpellRangeRES "FORCESPELLRES" => "_spl1_dv2_" //ForceSpellRES "FORMATION" => "_dv1_" //Formation "GAMEOVER" => "_tra1_" //GameOver "GETITEM" => "_itm1_dv2_" //GetItem "GIVEITEM" => "_itm1_dv2_" //GiveItem "GIVEITEMCREATE" => "_itm1_dv2_" //GiveItemCreate "GIVEOBJECTGOLDGLOBAL" => "_var1_are2_dv3_" //GiveObjectGoldGlobal "GIVEORDER" => "_dv1_" //GiveOrder "GIVEPARTYGOLDGLOBAL" => "_var1_" //GivePartyGoldGlobal "GROUPATTACK" => "_dv1_" //GroupAttack "HIDEAREAONMAP" => "_are1_" //HideAreaOnMap "INCREMENTCHAPTER" => "_2da1_" //IncrementChapter "INCREMENTGLOBAL" => "_var1_are2_" //IncrementGlobal "INCREMENTGLOBALONCE" => "_var1_are2_var3_are4_" //IncrementGlobalOnce "INCREMENTGLOBALONCEEX" => "_var1_var2_" //IncrementGlobalOnceEx "INTERACT" => "_dv1_" //Interact "JUMPTOOBJECT" => "_dv1_door1_" //JumpToObject "KILL" => "_dv1_" //Kill "LAYHANDS" => "_dv1_" //LayHands "LEAVEAREA" => "_are1_" //LeaveArea "LEAVEAREALUA" => "_are1_" //LeaveAreaLUA "LEAVEAREALUAENTRY" => "_are1_exit2_" //LeaveAreaLUAEntry "LEAVEAREALUAPANIC" => "_are1_" //LeaveAreaLUAPanic "LEAVEAREALUAPANICENTRY" => "_are1_exit2_" //LeaveAreaLUAPanicEntry "LOCK" => "_dv1_door1_" //Lock "MORALEDEC" => "_dv1_" //MoraleDec "MORALEINC" => "_dv1_" //MoraleInc "MORALESET" => "_dv1_" //MoraleSet "MOVEBETWEENAREAS" => "_are1_" //MoveBetweenAreas "MOVEBETWEENAREASEFFECT" => "_are1_bam2_" //MoveBetweenAreasEffect "MOVEGLOBAL" => "_are1_dv2_" //MoveGlobal "MOVEGLOBALOBJECT" => "_dv1_dv2_" //MoveGlobalObject "MOVEGLOBALOBJECTOFFSCREEN" => "_dv1_dv2_" //MoveGlobalObjectOffScreen "MOVEGLOBALSTO" => "_are1_are2_" //MoveGlobalsTo "MOVETOOBJECT" => "_dv1_door1_" //MoveToObject "MOVETOOBJECTFOLLOW" => "_dv1_door1_" //MoveToObjectFollow "MOVETOOBJECTNOINTERRUPT" => "_dv1_door1_" //MoveToObjectNoInterrupt "MOVETOOBJECTOFFSET" => "_dv1_door1_" //MoveToObjectOffset "MOVETOSAVEDLOCATION" => "_var1_are2_" //MoveToSavedLocation "MOVETOSAVEDLOCATIONN" => "_var1_are2_" //MoveToSavedLocationn "MOVEVIEWOBJECT" => "_dv1_door1_" //MoveViewObject "OPENDOOR" => "_door1_" //OpenDoor "PICKLOCK" => "_door1_" //PickLock "PICKPOCKETS" => "_dv1_" //PickPockets "PICKUPITEM" => "_itm1_" //PickUpItem "PLAYERDIALOG" => "_dv1_" //PlayerDialog "PLAYERDIALOGUE" => "_dv1_" //PlayerDialogue "PLAYSONG" => "_mus1_" //PlaySong "PLAYSOUND" => "_wav1_" //PlaySound "PLAYSOUNDNOTRANGED" => "_wav1_" //PlaySoundNotRanged "PLAYSOUNDTHROUGHVOICE" => "_wav1_" //PlaySoundThroughVoice "POLYMORPH" => "_anim1_" //Polymorph "POLYMORPHCOPY" => "_dv1_" //PolymorphCopy "POLYMORPHCOPYBASE" => "_dv1_" //PolymorphCopyBase "PROTECTOBJECT" => "_dv1_door1_" //ProtectObject "REALLYFORCESPELL" => "_dv1_splName2_splRes2_" //ReallyForceSpell "REALLYFORCESPELLDEAD" => "_dv1_splName2_splRes2_" //ReallyForceSpellDead "REALLYFORCESPELLDEADRES" => "_spl1_dv2_" //ReallyForceSpellDeadRES "REALLYFORCESPELLPOINT" => "_splName2_splRes2_" //ReallyForceSpellPoint "REALLYFORCESPELLPOINTRES" => "_spl1_" //ReallyForceSpellPointRES "REALLYFORCESPELLRES" => "_spl1_dv2_" //ReallyForceSpellRES "REALSETGLOBALTIMER" => "_var1_are2_" //RealSetGlobalTimer "REMOVEMAPNOTE" => "_tra2_" //RemoveMapNote "REMOVESPELL" => "_splName1_splRes1_" //RemoveSpell "REMOVESPELLRES" => "_spl1_" //RemoveSpellRES "REMOVESTOREITEM" => "_sto1_itm2_" //RemoveStoreItem "REMOVEWORLDMAPAREAFLAG" => "_are1_" //RemoveWorldmapAreaFlag "REVEALAREAONMAP" => "_are1_" //RevealAreaOnMap "RUNAWAYFROM" => "_dv1_" //RunAwayFrom "RUNAWAYFROMNOINTERRUPT" => "_dv1_" //RunAwayFromNoInterrupt "RUNAWAYFROMNOINTERRUPTNOLEAVEAREA" => "_dv1_" //RunAwayFromNoInterruptNoLeaveArea "RUNAWAYFROMNOLEAVEAREA" => "_dv1_" //RunAwayFromNoLeaveArea "SAVELOCATION" => "_are1_var2_" //SaveLocation "SAVEGAME" => "_save1_" //SaveGame "SAVEOBJECTLOCATION" => "_are1_var2_dv3_" //SaveObjectLocation "SETAREASCRIPT" => "_bcs1_" //SetAreaScript "SETDIALOG" => "_dlg1_" //SetDialog "SETDIALOGUE" => "_dlg1_" //SetDialogue "SETENCOUNTERPROBABILITY" => "_are1_are2_" //SetEncounterProbability "SETGABBER" => "_dv1_" //SetGabber "SETGLOBAL" => "_var1_are2_chapter3_" //SetGlobal "SETGLOBALRANDOM" => "_var1_are2_" //SetGlobalRandom "SETGLOBALRANDOMPLUS" => "_var1_are2_" //SetGlobalRandomPlus "SETGLOBALTIMER" => "_var1_are2_" //SetGlobalTimer "SETGLOBALTIMERRANDOM" => "_var1_are2_" //SetGlobalTimerRandom "SETITEMFLAGS" => "_itm1_" //SetItemFlags "SETMASTERAREA" => "_are1_" //SetMasterArea "SETMUSIC" => "_musName2_mus2_" //SetMusic "SETNAME" => "_tra1_" //SetName "SETPLAYERSOUND" => "_dv1_tra2_" //SetPlayerSound "SETQUESTDONE" => "_tra1_" //SetQuestDone "SETTOKEN" => "_tra2_" //SetToken "SETTOKENGLOBAL" => "_var1_are2_" //SetTokenGlobal "SETTOKENOBJECT" => "_dv2_" //SetTokenObject "SETUPWISHOBJECT" => "_dv1_" //SetupWishObject "SETWORLDMAP" => "_wmp1_" //SetWorldmap "SG" => "_var1_chapter2_" //SG "SPELL" => "_dv1_splName2_splRes2_" //Spell "SPELLNODEC" => "_dv1_splName2_splRes2_" //SpellNoDec "SPELLNODECRES" => "_spl1_dv2_" //SpellNoDecRES "SPELLPOINT" => "_splName2_splRes2_" //SpellPoint "SPELLPOINTNODEC" => "_splName2_splRes2_" //SpellPointNoDec "SPELLPOINTNODECRES" => "_spl1_" //SpellPointNoDecRES "SPELLPOINTRES" => "_spl1_" //SpellPointRES "SPELLRES" => "_spl1_dv2_" //SpellRES "STARTCUTSCENE" => "_bcs1_" //StartCutScene "STARTCUTSCENEEX" => "_bcs1_" //StartCutSceneEx "STARTDIALOG" => "_dlg1_dv2_" //StartDialog "STARTDIALOGINTERRUPT" => "_dlg1_dv2_" //StartDialogInterrupt "STARTDIALOGNONAME" => "_dlg1_dv2_" //StartDialogNoName "STARTDIALOGNOSET" => "_dv1_" //StartDialogNoSet "STARTDIALOGNOSETINTERRUPT" => "_dv1_" //StartDialogNoSetInterrupt "STARTDIALOGOVERRIDE" => "_dlg1_dv2_" //StartDialogOverride "STARTDIALOGOVERRIDEINTERRUPT" => "_dlg1_dv2_" //StartDialogOverrideInterrupt "STARTDIALOGUE" => "_dlg1_dv2_" //StartDialogue "STARTDIALOGUEINTERRUPT" => "_dlg1_dv2_" //StartDialogueInterrupt "STARTDIALOGUENOSET" => "_dv1_" //StartDialogueNoSet "STARTDIALOGUENOSETINTERRUPT" => "_dv1_" //StartDialogueNoSetInterrupt "STARTMOVIE" => "_mve1_" //StartMovie "STARTSTORE" => "_sto1_dv2_" //StartStore "STATICPALETTE" => "_bmp1_dv2_" //StaticPalette "STATICSEQUENCE" => "_dv1_" //StaticSequence "STATICSTART" => "_dv1_" //StaticStart "STATICSTOP" => "_dv1_" //StaticStop "TAKECREATUREITEMS" => "_dv1_" //TakeCreatureItems "TAKEITEMLISTPARTY" => "_2da1_" //TakeItemListParty "TAKEITEMLISTPARTYNUM" => "_2da1_" //TakeItemListPartyNum "TAKEITEMREPLACE" => "_itm1_itm2_dv3_" //TakeItemReplace "TAKEOBJECTGOLDGLOBAL" => "_var1_are2_dv3_" //TakeObjectGoldGlobal "TAKEPARTYITEM" => "_itm1_" //TakePartyItem "TAKEPARTYITEMALL" => "_itm1_" //TakePartyItemAll "TAKEPARTYITEMNUM" => "_itm1_" //TakePartyItemNum "TAKEPARTYITEMRANGE" => "_itm1_" //TakePartyItemRange "TEXTSCREEN" => "_2da1_" //TextScreen "TRANSFORMITEM" => "_itm1_itm2_" //TransformItem "TRIGGERWALKTO" => "_dv1_" //TriggerWalkTo "UNLOCK" => "_door1_" //Unlock "USEITEM" => "_itm1_dv2_" //UseItem "USEITEMPOINT" => "_itm1_" //UseItemPoint "USEITEMSLOT" => "_dv1_" //UseItemSlot "USEITEMSLOTABILITY" => "_dv1_" //UseItemSlotAbility "VERBALCONSTANT" => "_dv1_" //VerbalConstant "VERBALCONSTANTHEAD" => "_dv1_" //VerbalConstantHead "XEQUIPITEM" => "_itm1_dv2_" //XEquipItem //TRIGGER.IDS "ACQUIRED" => "_itm1_" //Acquired "ALIGNMENT" => "_dv1_" //Alignment "ALLEGIANCE" => "_dv1_" //Allegiance "AREACHECK" => "_are1_" //AreaCheck "AREACHECKOBJECT" => "_are1_dv2_door2_" //AreaCheckObject "ATTACKEDBY" => "_dv1_" //AttackedBy "BEENINPARTY" => "_dv1_" //BeenInParty "BITCHECK" => "_var1_are2_" //BitCheck "CANTURN" => "_dv1_" //CanTurn "CHARNAME" => "_dv1_dv2_" //CharName "CHECKITEMSLOT" => "_dv1_itm2_" //CheckItemSlot "CHECKSPELLSTATE" => "_dv1_splState2_" //CheckSpellState "CHECKSTAT" => "_dv1_stat3_" //CheckStat "CHECKSTATGT" => "_dv1_stat3_" //CheckStatGT "CHECKSTATLT" => "_dv1_stat3_" //CheckStatLT "CLASS" => "_dv1_class2_" //Class "CLASSLEVEL" => "_dv1_" //ClassLevel "CLASSLEVELGT" => "_dv1_" //ClassLevelGT "CLASSLEVELLT" => "_dv1_" //ClassLevelLT "CLICKED" => "_dv1_" //Clicked "CLOSED" => "_dv1_" //Closed "CONTAINS" => "_itm1_" //Contains "CURRENTAMMO" => "_itm1_dv2_" //CurrentAmmo "DEAD" => "_dv1_" //Dead "DETECT" => "_dv1_door1_" //Detect "DETECTED" => "_dv1_" //Detected "DIED" => "_dv1_" //Died "DISARMED" => "_dv1_" //Disarmed "DISARMFAILED" => "_dv1_" //DisarmFailed "ENTERED" => "_dv1_" //Entered "EXISTS" => "_dv1_" //Exists "EXTENDEDSTATECHECK" => "_dv1_" //ExtendedStateCheck "FALLENPALADIN" => "_dv1_" //FallenPaladin "FALLENRANGER" => "_dv1_" //FallenRanger "G" => "_var1_chapter2_" //G "GENDER" => "_dv1_" //Gender "GENERAL" => "_dv1_" //General "GGT" => "_var1_chapter2_" //GGT "GLOBAL" => "_var1_are2_chapter3_" //Global "GLOBALGT" => "_var1_are2_chapter3_" //GlobalGT "GLOBALLT" => "_var1_are2_chapter3_" //GlobalLT "GLOBALSEQUAL" => "_var1_var2_" //GlobalsEqual "GLOBALSGT" => "_var1_var2_" //GlobalsGT "GLOBALSLT" => "_var1_var2_" //GlobalsLT "GLOBALTIMEREXACT" => "_var1_are2_" //GlobalTimerExact "GLOBALTIMEREXPIRED" => "_var1_are2_" //GlobalTimerExpired "GLOBALTIMERNOTEXPIRED" => "_var1_are2_" //GlobalTimerNotExpired "GLT" => "_var1_chapter2_" //GLT "HAPPINESS" => "_dv1_" //Happiness "HAPPINESSGT" => "_dv1_" //HappinessGT "HAPPINESSLT" => "_dv1_" //HappinessLT "HASBOUNCEEFFECTS" => "_dv1_" //HasBounceEffects "HASIMMUNITYEFFECTS" => "_dv1_" //HasImmunityEffects "HASITEM" => "_itm1_dv2_" //HasItem "HASITEMCATEGORY" => "_dv1_" //HasItemCategory "HASITEMEQUIPED" => "_itm1_dv2_" //HasItemEquiped "HASITEMEQUIPEDREAL" => "_itm1_dv2_" //HasItemEquipedReal "HASITEMSLOT" => "_dv1_" //HasItemSlot "HASITEMTYPE" => "_dv1_" //HasItemType "HASWEAPONEQUIPED" => "_dv1_" //HasWeaponEquiped "HAVEKNOWNSPELL" => "_splName1_splRes1_" //HaveKnownSpell "HAVEKNOWNSPELLRES" => "_spl1_" //HaveKnownSpellRES "HAVESPELL" => "_splName1_splRes1_" //HaveSpell "HAVESPELLPARTY" => "_splName1_" //HaveSpellParty "HAVESPELLRES" => "_spl1_" //HaveSpellRES "HEARD" => "_dv1_" //Heard "HELP" => "_dv1_" //Help "HITBY" => "_dv1_" //HitBy "HP" => "_dv1_" //HP "HPGT" => "_dv1_" //HPGT "HPLT" => "_dv1_" //HPLT "HPPERCENT" => "_dv1_" //HPPercent "HPPERCENTGT" => "_dv1_" //HPPercentGT "HPPERCENTLT" => "_dv1_" //HPPercentLT "IFVALIDFORPARTYDIALOG" => "_dv1_" //IfValidForPartyDialog "IFVALIDFORPARTYDIALOGUE" => "_dv1_" //IfValidForPartyDialogue "IMMUNETOSPELLLEVEL" => "_dv1_" //ImmuneToSpellLevel "INACTIVEAREA" => "_dv1_door1_" //InActiveArea "INLINE" => "_dv1_dv2_" //InLine "INMYAREA" => "_dv1_door1_" //InMyArea "INMYGROUP" => "_dv1_" //InMyGroup "INPARTY" => "_dv1_" //InParty "INPARTYALLOWDEAD" => "_dv1_" //InPartyAllowDead "INPARTYSLOT" => "_dv1_" //InPartySlot "INTERACTINGWITH" => "_dv1_" //InteractingWith "INVENTORYFULL" => "_dv1_" //InventoryFull "INWEAPONRANGE" => "_dv1_" //InWeaponRange "ISACTIVE" => "_dv1_" //IsActive "ISFORCEDRANDOMENCOUNTERACTIVE" => "_are1_" //IsForcedRandomEncounterActive "ISGABBER" => "_dv1_" //IsGabber "ISOVERME" => "_dv1_" //IsOverMe "ISVALIDFORPARTYDIALOG" => "_dv1_" //IsValidForPartyDialog "ISVALIDFORPARTYDIALOGUE" => "_dv1_" //IsValidForPartyDialogue "ISWEAPONRANGED" => "_dv1_" //IsWeaponRanged "JOINS" => "_dv1_" //Joins "KILLED" => "_dv1_" //Killed "KIT" => "_dv1_" //Kit "LEAVES" => "_dv1_" //Leaves "LEVEL" => "_dv1_" //Level "LEVELGT" => "_dv1_" //LevelGT "LEVELLT" => "_dv1_" //LevelLT "LOCALSEQUAL" => "_var1_var2_" //LocalsEqual "LOCALSGT" => "_var1_var2_" //LocalsGT "LOCALSLT" => "_var1_var2_" //LocalsLT "LOS" => "_dv1_" //LOS "MODALSTATEOBJECT" => "_dv1_" //ModalStateObject "MORALE" => "_dv1_" //Morale "MORALEGT" => "_dv1_" //MoraleGT "MORALELT" => "_dv1_" //MoraleLT "NAME" => "_dv1_dv2_" //Name "NEARLOCATION" => "_dv1_" //NearLocation "NEARSAVEDLOCATION" => "_dv1_var2_" //NearSavedLocation "NEXTTRIGGEROBJECT" => "_dv1_" //NextTriggerObject "NOTSTATECHECK" => "_dv1_" //NotStateCheck "NUMCREATURE" => "_dv1_" //NumCreature "NUMCREATUREGT" => "_dv1_" //NumCreatureGT "NUMCREATURELT" => "_dv1_" //NumCreatureLT "NUMCREATUREVSPARTY" => "_dv1_" //NumCreatureVsParty "NUMCREATUREVSPARTYGT" => "_dv1_" //NumCreatureVsPartyGT "NUMCREATUREVSPARTYLT" => "_dv1_" //NumCreatureVsPartyLT "NUMDEAD" => "_dv1_" //NumDead "NUMDEADGT" => "_dv1_" //NumDeadGT "NUMDEADLT" => "_dv1_" //NumDeadLT "NUMITEMS" => "_itm1_dv2_" //NumItems "NUMITEMSGT" => "_itm1_dv2_" //NumItemsGT "NUMITEMSLT" => "_itm1_dv2_" //NumItemsLT "NUMITEMSPARTY" => "_itm1_" //NumItemsParty "NUMITEMSPARTYGT" => "_itm1_" //NumItemsPartyGT "NUMITEMSPARTYLT" => "_itm1_" //NumItemsPartyLT "OBJECTACTIONLISTEMPTY" => "_dv1_door1_" //ObjectActionListEmpty "ONSCREEN" => "_dv1_door1_" //OnScreen "OPENED" => "_dv1_" //Opened "OPENSTATE" => "_door1_" //OpenState "ORIGINALCLASS" => "_dv1_class2_" //OriginalClass "PARTYHASITEM" => "_itm1_" //PartyHasItem "PARTYHASITEMIDENTIFIED" => "_itm1_" //PartyHasItemIdentified "PARTYMEMBERDIED" => "_dv1_" //PartyMemberDied "PERSONALSPACEDISTANCE" => "_dv1_door1_" //PersonalSpaceDistance "PICKLOCKFAILED" => "_dv1_door1_" //PickLockFailed "PICKPOCKETFAILED" => "_dv1_" //PickPocketFailed "PROFICIENCY" => "_dv1_" //Proficiency "PROFICIENCYGT" => "_dv1_" //ProficiencyGT "PROFICIENCYLT" => "_dv1_" //ProficiencyLT "RACE" => "_dv1_race2_" //Race "RANGE" => "_dv1_" //Range "REACTION" => "_dv1_" //Reaction "REACTIONGT" => "_dv1_" //ReactionGT "REACTIONLT" => "_dv1_" //ReactionLT "REALGLOBALTIMEREXACT" => "_var1_are2_" //RealGlobalTimerExact "REALGLOBALTIMEREXPIRED" => "_var1_are2_" //RealGlobalTimerExpired "REALGLOBALTIMERNOTEXPIRED" => "_var1_are2_" //RealGlobalTimerNotExpired "RECEIVEDORDER" => "_dv1_" //ReceivedOrder "REPUTATION" => "_dv1_" //Reputation "REPUTATIONGT" => "_dv1_" //ReputationGT "REPUTATIONLT" => "_dv1_" //ReputationLT "RESET" => "_dv1_" //Reset "SAID" => "_dv1_" //Said "SECRETDOORDETECTED" => "_door1_" //SecretDoorDetected "SEE" => "_dv1_door1_" //See "SPECIFICS" => "_dv1_spec2_" //Specifics "SPELLCAST" => "_dv1_splName2_splRes2_" //SpellCast "SPELLCASTINNATE" => "_dv1_splName2_splRes2_" //SpellCastInnate "SPELLCASTINNATERES" => "_spl1_dv2_" //SpellCastInnateRES "SPELLCASTONME" => "_dv1_splName2_splRes2_" //SpellCastOnMe "SPELLCASTONMERES" => "_spl1_dv2_" //SpellCastOnMeRES "SPELLCASTPRIEST" => "_dv1_splName2_splRes2_" //SpellCastPriest "SPELLCASTPRIESTRES" => "_spl1_dv2_" //SpellCastPriestRES "SPELLCASTRES" => "_spl1_dv2_" //SpellCastRES "STATECHECK" => "_dv1_" //StateCheck "STEALFAILED" => "_dv1_" //StealFailed "SUMMONED" => "_dv1_" //Summoned "SWITCH" => "_var1_are2_" //Switch "TARGETUNREACHABLE" => "_dv1_door1_" //TargetUnreachable "TRAPTRIGGERED" => "_dv1_" //TrapTriggered "TRIGGEROVERRIDE" => "_dv1_" //TriggerOverride "TURNEDBY" => "_dv1_" //TurnedBy "UNLOCKED" => "_dv1_" //Unlocked "UNUSABLE" => "_itm1_" //Unusable "WEAPONCANDAMAGE" => "_dv1_" //WeaponCanDamage "WEAPONEFFECTIVEVS" => "_dv1_" //WeaponEffectiveVs "XP" => "_dv1_" //XP "XPGT" => "_dv1_" //XPGT "XPLT" => "_dv1_" //XPLT END //generate array for each command stored in EET_cmd_list array ACTION_PHP_EACH EET_cmd_list AS cmd => res_type BEGIN OUTER_PATCH_SAVE res_type ~%res_type%~ BEGIN SET cnt = 0 REPLACE_EVALUATE CASE_INSENSITIVE ~_\(2*[A-Z]+\)\([0-9]\)~ BEGIN SET cnt = cnt + 1 SPRINT $EVAL ~array_%cmd%~("%cnt%" "%MATCH2%") "%MATCH1%" END ~~ END END DEFINE_PATCH_MACRO ~EET_PCU_match~ BEGIN REPLACE_EVALUATE ~\("[^"%LNL%%WNL%]+"\)~ BEGIN INNER_PATCH_SAVE MATCH1 ~%MATCH1%~ BEGIN REPLACE_TEXTUALLY ~ ~ ~#space#~ END END ~%MATCH1%~ REPLACE_TEXTUALLY ~\(ActionOverride([^,]+\),\([^%WNL%%LNL%%MNL%%TAB% ]+\)))~ ~\1) #comma# \2) #bracket#~ REPLACE_TEXTUALLY ~\(TriggerOverride([^,]+\),\([^%WNL%%LNL%%MNL%%TAB% ]+\)))~ ~\1) #comma# \2) #bracket#~ REPLACE_EVALUATE CASE_INSENSITIVE ~\([%WNL%%LNL%%MNL%%TAB% %tilde%%quote%!]\)\([A-Z]+\)(\([^%WNL%%LNL%%MNL%%TAB% ]+\))~ BEGIN //loop through all commands SPRINT init ~%MATCH1%~ //matched SPRINT cmd ~%MATCH2%~ //matched command name SPRINT cmd_case ~%cmd%~ TO_UPPER cmd_case //uppercased command name SPRINT arg ~%MATCH3%~ //matched arguments PATCH_IF (VARIABLE_IS_SET $EET_cmd_list(~%cmd_case%~)) BEGIN //only if command array exists SET cnt = 0 SPRINT array EVAL ~array_%cmd_case%~ INNER_PATCH_SAVE arg ~%arg%~ BEGIN SET splRes = 0 SET chapterUp = 0 REPLACE_EVALUATE CASE_INSENSITIVE ~\([^,]+\)~ BEGIN //loop through all arguments within command SPRINT source ~%MATCH1%~ //matched argument SET cnt = cnt + 1 //argument column PHP_EACH ~%array%~ AS col => res BEGIN PATCH_IF (col_1 = cnt) BEGIN PATCH_IF (~%res%~ STR_EQ ~tra~) AND (IS_AN_INT source) BEGIN LPF EET_strref INT_VAR str = source add = strrefAdd RET str END PATCH_IF source != str BEGIN SET source = str SET updated = 1 END END ELSE BEGIN SET resref = 0 PATCH_IF ((~%source%~ STRING_CONTAINS_REGEXP ~^"[^"]+"$~)=0) BEGIN //remove quotes if resref INNER_PATCH_SAVE source ~%source%~ BEGIN REPLACE_TEXTUALLY ~^"\([^"]+\)"$~ ~\1~ SET resref = 1 END END SPRINT source_case ~%source%~ TO_UPPER source_case //uppercased matched argument PATCH_IF (~%res%~ STR_EQ ~var~) AND (~%source%~ STR_EQ ~CHAPTER~) BEGIN SET chapterUp = 1 //enabled chapter replacing in next loop END PATCH_IF (~%res%~ STR_EQ ~door~) OR (~%res%~ STR_EQ ~exit~) BEGIN INNER_PATCH_SAVE source6 ~%source_case%~ BEGIN REPLACE_TEXTUALLY ~^\(.?.?.?.?.?.?\).*~ ~\1~ END INNER_PATCH_SAVE source7 ~%source_case%~ BEGIN REPLACE_TEXTUALLY ~^\(.?.?.?.?.?.?.?\).*~ ~\1~ END INNER_PATCH_SAVE source5 ~%source_case%~ BEGIN REPLACE_TEXTUALLY ~^\(.?.?.?.?.?\).*~ ~\1~ END PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source_case%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source_case%~) SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %cmd% - %source_case% => %dest% - %res%~ SPRINT source ~%dest%~ END ELSE PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source6%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source6%~) SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %cmd% - %source6% => %dest% - %res%~ INNER_PATCH_SAVE source ~%source%~ BEGIN REPLACE_TEXTUALLY ~^%source6%~ ~%dest%~ END END ELSE PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source7%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source7%~) SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %cmd% - %source7% => %dest% - %res%~ INNER_PATCH_SAVE source ~%source%~ BEGIN REPLACE_TEXTUALLY ~^%source7%~ ~%dest%~ END END ELSE PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source5%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source5%~) SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %cmd% - %source5% => %dest% - %res%~ INNER_PATCH_SAVE source ~%source%~ BEGIN REPLACE_TEXTUALLY ~^%source5%~ ~%dest%~ END END END ELSE PATCH_IF (~%res%~ STR_EQ ~dv~) AND ((~%source%~ STRING_CONTAINS_REGEXP ~\[[A-Z0-9]+\.[A-Z0-9]+\.~)=0) BEGIN INNER_PATCH_SAVE source ~%source%~ BEGIN // EnemyAlly<-General<-Race<-Class<-Specifics REPLACE_EVALUATE CASE_INSENSITIVE ~\(\[[A-Z0-9_]+\.[A-Z0-9_]+\.\)\([A-Z0-9_]*\)\(\.?\)\([A-Z0-9_]*\)\(\.?\)\([A-Z0-9_]*\)~ BEGIN PATCH_IF (~%MATCH2%~ STR_CMP ~~) AND (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_race~(~%MATCH2%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_race~(~%MATCH2%~) SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %cmd% - %MATCH2% => %dest% - race~ SPRINT MATCH2 ~%dest%~ END PATCH_IF (~%MATCH4%~ STR_CMP ~~) AND (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_class~(~%MATCH4%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_class~(~%MATCH4%~) SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %cmd% - %MATCH4% => %dest% - class~ SPRINT MATCH4 ~%dest%~ END PATCH_IF (~%MATCH6%~ STR_CMP ~~) AND (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_spec~(~%MATCH6%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_spec~(~%MATCH6%~) SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %cmd% - %MATCH6% => %dest% - spec~ SPRINT MATCH6 ~%dest%~ END END ~%MATCH1%%MATCH2%%MATCH3%%MATCH4%%MATCH5%%MATCH6%~ END END ELSE PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source_case%~)) AND ((NOT ~%res%~ STR_EQ ~chapter~) OR (chapterUp = 1)) BEGIN //replace text using array corresponding to resref type TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source_case%~) SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %cmd% - %source% => %dest% - %res%~ SPRINT source ~%dest%~ PATCH_IF (~%res%~ STR_EQ ~splRes~) BEGIN SET splRes = 1 SET resref = 1 END END PATCH_IF (resref = 1) BEGIN //restore quotation if needed SPRINT source ~"%source%"~ END END END END END ~%source%~ PATCH_IF (splRes = 1) BEGIN REPLACE_TEXTUALLY ~\([^,]+\),\([^,]+\)~ ~\2,\1~ SPRINT cmd ~%cmd%RES~ END END END END ~%init%%cmd%(%arg%)~ REPLACE_TEXTUALLY ~) #comma# \([^ ]+\) #bracket#~ ~,\1)~ REPLACE_TEXTUALLY ~#space#~ ~ ~ END ///////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE_PATCH_MACRO ~EET_PCU_outer_res~ BEGIN SPRINT source ~%match%~ TO_UPPER source PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source%~)) BEGIN TEXT_SPRINT match $EVAL ~%remappedPrefix%_%res%~(~%source%~) PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %match% - %res%~ SET updated = 1 END END DEFINE_PATCH_MACRO ~EET_PCU_outer_8675~ BEGIN SPRINT source ~%match%~ TO_UPPER source INNER_PATCH_SAVE source6 ~%source%~ BEGIN REPLACE_TEXTUALLY ~^\(.?.?.?.?.?.?\).*~ ~\1~ END INNER_PATCH_SAVE source7 ~%source%~ BEGIN REPLACE_TEXTUALLY ~^\(.?.?.?.?.?.?.?\).*~ ~\1~ END INNER_PATCH_SAVE source5 ~%source%~ BEGIN REPLACE_TEXTUALLY ~^\(.?.?.?.?.?\).*~ ~\1~ END PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source%~) SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - %res%~ SPRINT match ~%dest%~ END ELSE PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source6%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source6%~) SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source6% => %dest% - %res%~ INNER_PATCH_SAVE match ~%match%~ BEGIN REPLACE_TEXTUALLY ~^%source6%~ ~%dest%~ END END ELSE PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source7%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source7%~) SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source7% => %dest% - %res%~ INNER_PATCH_SAVE match ~%match%~ BEGIN REPLACE_TEXTUALLY ~^%source7%~ ~%dest%~ END END ELSE PATCH_IF (VARIABLE_IS_SET $EVAL ~%remappedPrefix%_%res%~(~%source5%~)) BEGIN TEXT_SPRINT dest $EVAL ~%remappedPrefix%_%res%~(~%source5%~) SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source5% => %dest% - %res%~ INNER_PATCH_SAVE match ~%match%~ BEGIN REPLACE_TEXTUALLY ~^%source5%~ ~%dest%~ END END END ///////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE_PATCH_MACRO ~EET_PCU_effects~ BEGIN PATCH_IF ("%fx_type%" = 25) //Poison OR ("%fx_type%" = 39) //Sleep OR ("%fx_type%" = 78) //Disease OR ("%fx_type%" = 98) //Regeneration OR ("%fx_type%" = 213) //Maze OR ("%fx_type%" = 218) //Stoneskin effect OR ("%fx_type%" = 272) //Use EFF file on condition BEGIN SET off = special SPRINT res ~icon~ LPM EET_PCU_off_long END PATCH_IF ("%fx_type%" = 53) //Animation change OR ("%fx_type%" = 135) //Polymorph BEGIN SET off = param1 SPRINT res ~anim~ LPM EET_PCU_off_long END PATCH_IF ("%fx_type%" = 55) //Slay OR ("%fx_type%" = 100) //Protection from creature type OR ("%fx_type%" = 109) //Paralyze OR ("%fx_type%" = 175) //Hold creature OR ("%fx_type%" = 177) //Use EFF file OR ("%fx_type%" = 178) //THAC0 vs. type bonus OR ("%fx_type%" = 179) //Damage vs. type bonus OR ("%fx_type%" = 185) //Hold creature 2 OR ("%fx_type%" = 219) //Attack roll penalty OR ("%fx_type%" = 238) //Disintegrate OR ("%fx_type%" = 283) //Use EFF file as curse OR ("%fx_type%" = 319) //Restrict item OR ("%fx_type%" = 344) //Enchantment vs. creature type BEGIN READ_LONG param2 "ids_file" PATCH_IF (ids_file = 4) BEGIN //Race.ids SET off = param1 SPRINT res ~race~ LPM EET_PCU_off_long END ELSE PATCH_IF (ids_file = 5) BEGIN //Class.ids SET off = param1 SPRINT res ~class~ LPM EET_PCU_off_long END ELSE PATCH_IF (ids_file = 6) BEGIN //Specific.ids SET off = param1 SPRINT res ~spec~ LPM EET_PCU_off_long END ELSE PATCH_IF (ids_file = 9) BEGIN //Kit.ids SET off = param1 SPRINT read_len ~l~ LPM EET_PCU_off_kit END END PATCH_IF ("%fx_type%" = 67) BEGIN //Summon creature SET off = resource1 SPRINT res ~cre~ LPM EET_PCU_off_res PATCH_IF ver = 2 BEGIN SET off = resource2 SPRINT res ~bam~ LPM EET_PCU_off_res END END PATCH_IF ("%fx_type%" = 68) //Unsummon creature OR ("%fx_type%" = 153) //Sanctuary OR ("%fx_type%" = 154) //Entangle overlay OR ("%fx_type%" = 155) //Minor globe overlay OR ("%fx_type%" = 156) //Protection from normal missiles overlay OR ("%fx_type%" = 157) //Web effect OR ("%fx_type%" = 158) //Grease overlay OR ("%fx_type%" = 215) //Play visual effect OR ("%fx_type%" = 296) //Immunity to specific animation OR ("%fx_type%" = 336) //Seven eyes overlay OR ("%fx_type%" = 368) //Effect from Opcode 375 OR ("%fx_type%" = 369) //Play BAM file (single/dual) OR ("%fx_type%" = 370) //Play BAM file OR ("%fx_type%" = 371) //Play BAM file 2 OR ("%fx_type%" = 372) //Play BAM file 3 OR ("%fx_type%" = 373) //Play BAM file 4 BEGIN SET off = resource1 SPRINT res ~bam~ LPM EET_PCU_off_res END PATCH_IF ("%fx_type%" = 72) BEGIN //Change AI type READ_LONG param2 "ids_file" PATCH_IF (ids_file = 2) BEGIN //Race.ids SET off = param1 SPRINT res ~race~ LPM EET_PCU_off_long END ELSE PATCH_IF (ids_file = 3) BEGIN //Class.ids SET off = param1 SPRINT res ~class~ LPM EET_PCU_off_long END ELSE PATCH_IF (ids_file = 4) BEGIN //Specific.ids SET off = param1 SPRINT res ~spec~ LPM EET_PCU_off_long END END PATCH_IF ("%fx_type%" = 82) BEGIN //Set AI script SET off = resource1 SPRINT res ~bcs~ LPM EET_PCU_off_res END PATCH_IF ("%fx_type%" = 83) //Immunity to projectile OR ("%fx_type%" = 197) //Physical mirror OR ("%fx_type%" = 327) //Show visual effect OR ("%fx_type%" = 339) //Alter visual animation effect BEGIN SET off = param2 SPRINT read_len ~l~ SET sub = 1 LPM EET_PCU_off_ipro END PATCH_IF ("%fx_type%" = 103) //Change name OR ("%fx_type%" = 139) //Display string OR ("%fx_type%" = 180) //Disallow item OR ("%fx_type%" = 183) //Use EFF file while on type OR ("%fx_type%" = 206) //Protection from spell OR ("%fx_type%" = 253) //Set automap note OR ("%fx_type%" = 254) //Remove automap note OR ("%fx_type%" = 290) //Change title OR ("%fx_type%" = 338) //Disable rest or save BEGIN SET off = param1 LPM EET_PCU_off_strref END PATCH_IF ("%fx_type%" = 107) BEGIN //Change portrait SET off = resource1 SPRINT res ~bmp~ LPM EET_PCU_off_res END PATCH_IF ("%fx_type%" = 111) //Create weapon OR ("%fx_type%" = 112) //Remove item OR ("%fx_type%" = 123) //Remove inventory item OR ("%fx_type%" = 143) //Create item in slot OR ("%fx_type%" = 180) //Disallow item BEGIN SET off = resource1 SPRINT res ~itm~ LPM EET_PCU_off_res END PATCH_IF ("%fx_type%" = 122) //Create inventory item OR ("%fx_type%" = 255) //Create item (days) BEGIN SET off = resource1 SPRINT res ~itm~ LPM EET_PCU_off_res PATCH_IF ver = 2 BEGIN SET off = resource2 SPRINT res ~itm~ LPM EET_PCU_off_res SET off = resource3 SPRINT res ~itm~ LPM EET_PCU_off_res END END PATCH_IF ("%fx_type%" = 127) BEGIN //Summon monsters SET off = resource1 SPRINT res ~2da~ LPM EET_PCU_off_res PATCH_IF ver = 2 BEGIN SET off = resource2 SPRINT res ~bam~ LPM EET_PCU_off_res END END PATCH_IF ("%fx_type%" = 135) //Polymorph OR ("%fx_type%" = 151) //Replace self OR ("%fx_type%" = 168) //Remove creature BEGIN SET off = resource1 SPRINT res ~cre~ LPM EET_PCU_off_res END PATCH_IF ("%fx_type%" = 140) BEGIN //Casting glow SET off = param1 SPRINT read_len ~l~ SET sub = 1 LPM EET_PCU_off_ipro END PATCH_IF ("%fx_type%" = 142) //Display portrait icon OR ("%fx_type%" = 169) //Prevent portrait icon OR ("%fx_type%" = 240) //Remove portrait icon BEGIN SET off = param2 SPRINT res ~icon~ LPM EET_PCU_off_long END PATCH_IF ("%fx_type%" = 146) //Cast spell OR ("%fx_type%" = 147) //Learn spell OR ("%fx_type%" = 148) //Cast spell at point OR ("%fx_type%" = 171) //Give innate ability OR ("%fx_type%" = 172) //Remove spell OR ("%fx_type%" = 200) //Spell turning OR ("%fx_type%" = 201) //Spell turning OR ("%fx_type%" = 206) //Protection from spell OR ("%fx_type%" = 207) //Reflect specified spell OR ("%fx_type%" = 223) //Spell school deflection OR ("%fx_type%" = 226) //Spell type deflection OR ("%fx_type%" = 227) //Spell school turning OR ("%fx_type%" = 228) //Spell type turning OR ("%fx_type%" = 232) //Cast spell on condition OR ("%fx_type%" = 251) //Change bard song OR ("%fx_type%" = 252) //Set trap OR ("%fx_type%" = 259) //Spell trap OR ("%fx_type%" = 266) //Remove protection from spell OR ("%fx_type%" = 313) //High-level ability OR ("%fx_type%" = 326) //Apply effects list OR ("%fx_type%" = 333) //Static charge OR ("%fx_type%" = 335) //Seven eyes OR ("%fx_type%" = 340) //Backstab hit effect OR ("%fx_type%" = 341) //Critical hit effect OR ("%fx_type%" = 361) //Cast spell on critical miss OR ("%fx_type%" = 366) //Apply spell on movement BEGIN SET off = resource1 SPRINT res ~spl~ LPM EET_PCU_off_res END PATCH_IF ("%fx_type%" = 152) BEGIN //Play movie SET off = resource1 SPRINT res ~mve~ LPM EET_PCU_off_res END PATCH_IF ("%fx_type%" = 174) BEGIN //Play sound SET off = resource1 SPRINT res ~wav~ LPM EET_PCU_off_res END PATCH_IF ("%fx_type%" = 177) //Use EFF file OR ("%fx_type%" = 183) //Use EFF file while on type OR ("%fx_type%" = 248) //Melee hit effect OR ("%fx_type%" = 249) //Ranged hit effect OR ("%fx_type%" = 272) //Use EFF file on condition OR ("%fx_type%" = 283) //Use EFF file as curse BEGIN SET off = resource1 SPRINT res ~eff~ LPM EET_PCU_off_res END PATCH_IF ("%fx_type%" = 181) //Disallow item type OR ("%fx_type%" = 324) //Immunity to spell and message BEGIN SET off = special LPM EET_PCU_off_strref END PATCH_IF ("%fx_type%" = 186) BEGIN //Move creature SET off = resource1 SPRINT res ~are~ LPM EET_PCU_off_res END PATCH_IF ("%fx_type%" = 267) BEGIN //Disable display string SET off = param1 LPM EET_PCU_off_strref PATCH_IF (NOT ~%headerType%~ STR_EQ ~~) AND (ddsClonning = 1) BEGIN SET clone_update = 1 PATCH_IF (VARIABLE_IS_SET $arrayDDS_del("%dest%" "%headerType%")) BEGIN SET del_cnt = $arrayDDS_del("%dest%" "%headerType%") + 1 DEFINE_ASSOCIATIVE_ARRAY arrayDDS_del BEGIN ~%dest%~ , ~%headerType%~ => ~%del_cnt%~ END END ELSE BEGIN DEFINE_ASSOCIATIVE_ARRAY arrayDDS_del BEGIN ~%dest%~ , ~%headerType%~ => 0 END PATCH_IF (VARIABLE_IS_SET $arrayDDS_list("%dest%")) BEGIN DEFINE_ASSOCIATIVE_ARRAY arrayDDS_clone BEGIN ~%dest%~ => ~~ END END END END END PATCH_IF ("%fx_type%" = 187) //Set local variable OR ("%fx_type%" = 265) //Set global variable OR ("%fx_type%" = 309) //Set local variable BEGIN PATCH_IF ver = 1 BEGIN SET off = resource1 SPRINT res ~var~ LPM EET_PCU_off_res END ELSE BEGIN READ_ASCII resource1 "var1" (8) NULL READ_ASCII resource2 "var2" (8) NULL READ_ASCII resource3 "var3" (8) NULL SPRINT match ~%var1%%var2%%var3%~ SPRINT res ~var~ LPM EET_PCU_outer_res PATCH_IF (NOT ~%match%~ STR_EQ ~%var1%%var2%%var3%~) BEGIN SET length = STRING_LENGTH ~%match%~ SPRINT var1 ~~ SPRINT var2 ~~ SPRINT var3 ~~ PATCH_IF length <= 8 BEGIN SPRINT var1 ~%match%~ END ELSE PATCH_IF length = 9 BEGIN INNER_PATCH_SAVE var1 ~%match%~ BEGIN REPLACE_TEXTUALLY ~.$~ ~~ END INNER_PATCH_SAVE var2 ~%match%~ BEGIN REPLACE_TEXTUALLY ~^........~ ~~ END END ELSE PATCH_IF length = 10 BEGIN INNER_PATCH_SAVE var1 ~%match%~ BEGIN REPLACE_TEXTUALLY ~..$~ ~~ END INNER_PATCH_SAVE var2 ~%match%~ BEGIN REPLACE_TEXTUALLY ~^........~ ~~ END END ELSE PATCH_IF length = 11 BEGIN INNER_PATCH_SAVE var1 ~%match%~ BEGIN REPLACE_TEXTUALLY ~...$~ ~~ END INNER_PATCH_SAVE var2 ~%match%~ BEGIN REPLACE_TEXTUALLY ~^........~ ~~ END END ELSE PATCH_IF length = 12 BEGIN INNER_PATCH_SAVE var1 ~%match%~ BEGIN REPLACE_TEXTUALLY ~....$~ ~~ END INNER_PATCH_SAVE var2 ~%match%~ BEGIN REPLACE_TEXTUALLY ~^........~ ~~ END END ELSE PATCH_IF length = 13 BEGIN INNER_PATCH_SAVE var1 ~%match%~ BEGIN REPLACE_TEXTUALLY ~.....$~ ~~ END INNER_PATCH_SAVE var2 ~%match%~ BEGIN REPLACE_TEXTUALLY ~^........~ ~~ END END ELSE PATCH_IF length = 14 BEGIN INNER_PATCH_SAVE var1 ~%match%~ BEGIN REPLACE_TEXTUALLY ~......$~ ~~ END INNER_PATCH_SAVE var2 ~%match%~ BEGIN REPLACE_TEXTUALLY ~^........~ ~~ END END ELSE PATCH_IF length = 15 BEGIN INNER_PATCH_SAVE var1 ~%match%~ BEGIN REPLACE_TEXTUALLY ~.......$~ ~~ END INNER_PATCH_SAVE var2 ~%match%~ BEGIN REPLACE_TEXTUALLY ~^........~ ~~ END END ELSE PATCH_IF length = 16 BEGIN INNER_PATCH_SAVE var1 ~%match%~ BEGIN REPLACE_TEXTUALLY ~........$~ ~~ END INNER_PATCH_SAVE var2 ~%match%~ BEGIN REPLACE_TEXTUALLY ~^........~ ~~ END END ELSE PATCH_IF (length >= 17) AND (length <= 24) BEGIN INNER_PATCH_SAVE var1 ~%match%~ BEGIN REPLACE_TEXTUALLY ~........$~ ~~ END INNER_PATCH_SAVE var2 ~%match%~ BEGIN REPLACE_TEXTUALLY ~^........\(........\).+$~ ~\1~ END INNER_PATCH_SAVE var3 ~%match%~ BEGIN REPLACE_TEXTUALLY ~^................~ ~~ END END WRITE_ASCIIE resource1 ~%var1%~ #8 WRITE_ASCIIE resource2 ~%var2%~ #8 WRITE_ASCIIE resource3 ~%var3%~ #8 END END END PATCH_IF ("%fx_type%" = 214) //Select spell OR ("%fx_type%" = 273) //Zone of sweet air BEGIN SET off = resource1 SPRINT res ~2da~ LPM EET_PCU_off_res END PATCH_IF ("%fx_type%" = 232) BEGIN //Cast spell on condition READ_LONG param2 "condition" PATCH_IF (condition = 21) BEGIN //Target's spell state is 'Special' SET off = special SPRINT res ~splState~ LPM EET_PCU_off_long END END PATCH_IF ("%fx_type%" = 233) BEGIN //Modify proficiencies SET off = param2 SPRINT res ~stat~ LPM EET_PCU_off_long END PATCH_IF ("%fx_type%" = 256) BEGIN //Spell sequencer SET off = resource1 SPRINT res ~spl~ LPM EET_PCU_off_res PATCH_IF ver = 2 BEGIN SET off = resource2 SPRINT res ~spl~ LPM EET_PCU_off_res SET off = resource3 SPRINT res ~spl~ LPM EET_PCU_off_res END END PATCH_IF ("%fx_type%" = 258) //Activate spell sequencer OR ("%fx_type%" = 260) //Activate spell sequencer at point OR ("%fx_type%" = 318) //Protection from spell OR ("%fx_type%" = 321) //Remove effects by resource OR ("%fx_type%" = 324) //Immunity to spell and message BEGIN READ_ASCII resource1 "source" (8) NULL SET off = resource1 SPRINT res ~itm~ LPM EET_PCU_off_res READ_ASCII resource1 "dest" (8) NULL PATCH_IF ~%source%~ STRING_EQUAL_CASE ~%dest%~ BEGIN SET off = resource1 SPRINT res ~spl~ LPM EET_PCU_off_res END END PATCH_IF ("%fx_type%" = 290) BEGIN //Change title SET off = special SPRINT res ~class~ LPM EET_PCU_off_long END PATCH_IF ("%fx_type%" = 318) //Protection from spell OR ("%fx_type%" = 324) //Immunity to spell and message OR ("%fx_type%" = 326) //Apply effects list BEGIN SET off = param2 SPRINT res ~splProt~ LPM EET_PCU_off_long READ_LONG param2 "ids_file" PATCH_IF (ids_file = 76) OR (ids_file = 110) OR (ids_file = 111) BEGIN //Splstate.ids SET off = param1 SPRINT res ~splState~ LPM EET_PCU_off_long END ELSE PATCH_IF (ids_file = 104) OR (ids_file = 114) BEGIN //Race.ids SET off = param1 SPRINT res ~race~ LPM EET_PCU_off_long END ELSE PATCH_IF (ids_file = 105) OR (ids_file = 115) BEGIN //Class.ids SET off = param1 SPRINT res ~class~ LPM EET_PCU_off_long END ELSE PATCH_IF (ids_file = 106) OR (ids_file = 116) BEGIN //Specific.ids SET off = param1 SPRINT res ~spec~ LPM EET_PCU_off_long END ELSE PATCH_IF (ids_file = 109) BEGIN //Kit.ids SET off = param1 SPRINT read_len ~l~ LPM EET_PCU_off_kit END END PATCH_IF ("%fx_type%" = 319) BEGIN //Restrict item READ_LONG param2 "ids_target" PATCH_IF (ids_target = 10) BEGIN //Actor's name SET off = param1 LPM EET_PCU_off_strref END ELSE PATCH_IF (ids_target = 11) BEGIN //Actor's script name SET off = resource1 SPRINT res ~dv~ LPM EET_PCU_off_res END SET off = special LPM EET_PCU_off_strref END PATCH_IF ("%fx_type%" = 328) BEGIN //Set spell state READ_LONG special "mode" PATCH_IF (mode = 1) BEGIN SET off = param2 SPRINT res ~splState~ LPM EET_PCU_off_long END END PATCH_IF ("%fx_type%" = 330) BEGIN //Float text SET off = param1 LPM EET_PCU_off_strref PATCH_IF ver = 2 BEGIN READ_LONG param2 "display_type" PATCH_IF (display_type = 1) BEGIN //Cynicism SET off = param3 LPM EET_PCU_off_strref END END END PATCH_IF ("%fx_type%" = 331) BEGIN //Summon creatures 2 SET off = resource1 SPRINT res ~2da~ LPM EET_PCU_off_res PATCH_IF ver = 2 BEGIN SET off = resource2 SPRINT res ~bam~ LPM EET_PCU_off_res SET off = resource3 SPRINT res ~bam~ LPM EET_PCU_off_res END SET off = param2 SPRINT res ~sum~ LPM EET_PCU_off_long END PATCH_IF ("%fx_type%" = 401) BEGIN //Set extended stat (EEex) SET off = special SPRINT res ~stat~ LPM EET_PCU_off_long END END DEFINE_PATCH_MACRO ~EET_clone_update~ BEGIN //Delete duplicated strings in opcode 267 PHP_EACH arrayDDS_del AS var => del_cnt BEGIN //var = strref; var_1 = headerType PATCH_IF del_cnt > 0 BEGIN PATCH_IF IS_AN_INT var_1 BEGIN //ability effects PATCH_PRINT ~DELETE_EFFECT: strref = %var%; headerType = %var_1%; del_cnt = %del_cnt%~ LPF ~DELETE_EFFECT~ INT_VAR check_globals = 0 check_headers = 1 header = var_1 multi_match = del_cnt verbose = 1 match_opcode = 267 match_parameter1 = var END END ELSE BEGIN //global effects PATCH_PRINT ~DELETE_EFFECT: strref = %var%; headerType = %var_1%; del_cnt = %del_cnt%~ LPF ~DELETE_EFFECT~ INT_VAR check_globals = 1 check_headers = 0 multi_match = del_cnt verbose = 1 match_opcode = 267 match_parameter1 = var END END END END //Clone missing strings for opcode 267 PHP_EACH arrayDDS_clone AS var => ~~ BEGIN SPRINT param1_array EVAL ~arrayDDS_%var%~ PHP_EACH ~%param1_array%~ AS param1 => ~~ BEGIN PATCH_IF (NOT VARIABLE_IS_SET $arrayDDS_clone("%param1%")) BEGIN PATCH_PRINT ~CLONE_EFFECT: match_parameter1 = %var%; parameter1 = %param1%~ LPF ~CLONE_EFFECT~ INT_VAR verbose = 1 match_opcode = 267 match_parameter1 = var parameter1 = param1 END DEFINE_ASSOCIATIVE_ARRAY arrayDDS_clone BEGIN ~%param1%~ => ~~ END END END END END ///////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE_PATCH_FUNCTION EET_PCU_core //INT_VAR // strrefAdd = 0 // ddsClonning = 0 // traifyDLG = 1 //STR_VAR // remappedPrefix = ~remapped~ RET updated ext_check BEGIN SET updated = 0 READ_ASCII 0x0 "filetype" ELSE ~Ignoring 0 byte file~ ///////////////////////////////////////////////////////////////////////////////////////////////////// //ARE patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// PATCH_IF ("%filetype%" STR_EQ "AREAV1.0") AND (SOURCE_SIZE > 0x11b) BEGIN //PATCH_PRINT ~Patching area version 1.0 file %SOURCE_FILESPEC%...~ //0x8 WED resref SET off = 0x8 SPRINT res ~are~ LPM EET_PCU_off_res //wed //0x18 north ARE resref SET off = 0x18 SPRINT res ~are~ LPM EET_PCU_off_res //0x24 east ARE resref SET off = 0x24 SPRINT res ~are~ LPM EET_PCU_off_res //0x30 south ARE resref SET off = 0x30 SPRINT res ~are~ LPM EET_PCU_off_res //0x3c west ARE resref SET off = 0x3c SPRINT res ~are~ LPM EET_PCU_off_res //0x94 BCS resref SET off = 0x94 SPRINT res ~bcs~ LPM EET_PCU_off_res //////// //Actors //////// READ_LONG 0x54 "actors_off" READ_SHORT 0x58 "actors_cnt" FOR (cnt=0; cnt<"%actors_cnt%"; cnt=cnt+1) BEGIN READ_LONG ("%actors_off%"+0x110*cnt+0x28) "actors_flags" //0x0 Death Variable PATCH_IF (~%actors_flags%~ BAND BIT3) BEGIN //Override script name SET off = ("%actors_off%"+0x110*cnt+0x0) SPRINT res ~dv~ LPM EET_PCU_off_32 END //0x30 area-specific creature animation SET off = ("%actors_off%"+0x110*cnt+0x30) SPRINT res ~anim~ LPM EET_PCU_off_long //0x48 area-specific creature DLG resref SET off = ("%actors_off%"+0x110*cnt+0x48) SPRINT res ~dlg~ LPM EET_PCU_off_res //0x50 area-specific creature override BCS resref SET off = ("%actors_off%"+0x110*cnt+0x50) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x58 area-specific creature class BCS resref SET off = ("%actors_off%"+0x110*cnt+0x58) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x60 area-specific creature race BCS resref SET off = ("%actors_off%"+0x110*cnt+0x60) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x68 area-specific creature general BCS resref SET off = ("%actors_off%"+0x110*cnt+0x68) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x70 area-specific creature default BCS resref SET off = ("%actors_off%"+0x110*cnt+0x70) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x78 area-specific creature specific BCS resref SET off = ("%actors_off%"+0x110*cnt+0x78) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x80 CRE resref SET off = ("%actors_off%"+0x110*cnt+0x80) SPRINT res ~cre~ LPM EET_PCU_off_res //////////////////////////////////// //CRE structure (embedded CRE files) //////////////////////////////////// READ_LONG ("%actors_off%"+0x110*cnt+0x8c) "actors_emb_size" PATCH_IF (~%actors_flags%~ BAND BIT0) BEGIN END ELSE PATCH_IF (actors_emb_size = 0) BEGIN //SET actors_flags = actors_flags + BIT0 //WRITE_LONG ("%actors_off%"+0x110*cnt+0x28) "%actors_flags%" END ELSE BEGIN //CRE attached READ_LONG ("%actors_off%"+0x110*cnt+0x88) "actors_emb_off" PATCH_IF (actors_emb_off != 0) BEGIN //0x8 Long name SET off = ("%actors_emb_off%"+0x8) LPM EET_PCU_off_strref //0xc Short name (tooltip) SET off = ("%actors_emb_off%"+0xc) LPM EET_PCU_off_strref //0x28 animation ID SET off = ("%actors_emb_off%"+0x28) SPRINT res ~anim~ LPM EET_PCU_off_long //0x34 small portrait BMP resref SET off = ("%actors_emb_off%"+0x34) SPRINT res ~bmp~ LPM EET_PCU_off_res //0x3c large portrait BMP resref SET off = ("%actors_emb_off%"+0x3c) SPRINT res ~bmp~ LPM EET_PCU_off_res //0xa4 sound-set FOR (cnt2=0; cnt2<99; cnt2=cnt2+1) BEGIN SET off = ("%actors_emb_off%"+0xa4+0x4*cnt2) LPM EET_PCU_off_strref END //0x241 racial enemy number SET off = ("%actors_emb_off%"+0x241) SPRINT res ~race~ LPM EET_PCU_off_byte //0x244 kit internal number SET off = ("%actors_emb_off%"+0x244) SPRINT read_len ~l~ LPM EET_PCU_off_kit //0x248 override BCS resref SET off = ("%actors_emb_off%"+0x248) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x250 class BCS resref SET off = ("%actors_emb_off%"+0x250) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x258 race BCS resref SET off = ("%actors_emb_off%"+0x258) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x260 general BCS resref SET off = ("%actors_emb_off%"+0x260) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x268 default BCS resref SET off = ("%actors_emb_off%"+0x268) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x272 Race number SET off = ("%actors_emb_off%"+0x272) SPRINT res ~race~ LPM EET_PCU_off_byte //0x273 Class number SET off = ("%actors_emb_off%"+0x273) SPRINT res ~class~ LPM EET_PCU_off_byte //0x274 Specific number SET off = ("%actors_emb_off%"+0x274) SPRINT res ~spec~ LPM EET_PCU_off_byte //0x280 Death Variable SET off = ("%actors_emb_off%"+0x280) SPRINT res ~dv~ LPM EET_PCU_off_32 //0x2cc DLG resref SET off = ("%actors_emb_off%"+0x2cc) SPRINT res ~dlg~ LPM EET_PCU_off_res ////////////// //Known Spells ////////////// READ_LONG ("%actors_emb_off%"+0x2a0) "kspell_off" READ_SHORT ("%actors_emb_off%"+0x2a4) "kspell_cnt" FOR (cnt2=0; cnt2<"%kspell_cnt%"; cnt2=cnt2+1) BEGIN //0x0 SPL resref SET off = ("%actors_emb_off%"+"%kspell_off%"+0xc*cnt2) SPRINT res ~spl~ LPM EET_PCU_off_res END ////////////////// //Memorised Spells ////////////////// READ_LONG ("%actors_emb_off%"+0x2b0) "mspell_off" READ_SHORT ("%actors_emb_off%"+0x2b4) "mspell_cnt" FOR (cnt2=0; cnt2<"%mspell_cnt%"; cnt2=cnt2+1) BEGIN //0x0 SPL resref SET off = ("%actors_emb_off%"+"%mspell_off%"+0xc*cnt2) SPRINT res ~spl~ LPM EET_PCU_off_res END /////// //Items /////// READ_LONG ("%actors_emb_off%"+0x2bc) "item_off" READ_SHORT ("%actors_emb_off%"+0x2c0) "item_cnt" FOR (cnt2=0; cnt2<"%item_cnt%"; cnt2=cnt2+1) BEGIN //0x0 ITM resref SET off = ("%actors_emb_off%"+"%item_off%"+0x14*cnt2) SPRINT res ~itm~ LPM EET_PCU_off_res END ///////// //Effects ///////// READ_LONG ("%actors_emb_off%"+0x2c4) "fx_off" READ_LONG ("%actors_emb_off%"+0x2c8) "fx_cnt" READ_BYTE ("%actors_emb_off%"+0x33) "eff_ver" FOR (cnt2=0; cnt2<"%fx_cnt%"; cnt2=cnt2+1) BEGIN PATCH_IF (eff_ver = 0) BEGIN //EFF v1 READ_SHORT ("%actors_emb_off%"+"%fx_off%"+0x30*cnt2) "fx_type" SET param1 = ("%actors_emb_off%"+"%fx_off%"+0x30*cnt2+0x4) SET param2 = ("%actors_emb_off%"+"%fx_off%"+0x30*cnt2+0x8) SET resource1 = ("%actors_emb_off%"+"%fx_off%"+0x30*cnt2+0x14) SET special = ("%actors_emb_off%"+"%fx_off%"+0x30*cnt2+0x2c) SET ver = 1 SPRINT headerType ~~ LPM EET_PCU_effects END ELSE BEGIN //EFF v2 READ_LONG ("%actors_emb_off%"+"%fx_off%"+0x108*cnt2+0x8) "fx_type" SET param1 = ("%actors_emb_off%"+"%fx_off%"+0x108*cnt2+0x14) SET param2 = ("%actors_emb_off%"+"%fx_off%"+0x108*cnt2+0x18) SET resource1 = ("%actors_emb_off%"+"%fx_off%"+0x108*cnt2+0x28) SET special = ("%actors_emb_off%"+"%fx_off%"+0x108*cnt2+0x40) SET param3 = ("%actors_emb_off%"+"%fx_off%"+0x108*cnt2+0x58) SET resource2 = ("%actors_emb_off%"+"%fx_off%"+0x108*cnt2+0x68) SET resource3 = ("%actors_emb_off%"+"%fx_off%"+0x108*cnt2+0x70) SET ver = 2 SPRINT headerType ~~ LPM EET_PCU_effects //0x8c source spell SPL resref SET off = ("%actors_emb_off%"+"%fx_off%"+0x108*cnt2+0x8c) SPRINT res ~spl~ LPM EET_PCU_off_res //0x98 impact projectile SET off = ("%actors_emb_off%"+"%fx_off%"+0x108*cnt2+0x98) SPRINT read_len ~l~ SET sub = 1 LPM EET_PCU_off_ipro END END END END END /////////////////////////////////////// //Info points, trigger points, and exit /////////////////////////////////////// READ_LONG 0x5c "info_off" READ_SHORT 0x5a "info_cnt" FOR (cnt=0; cnt<"%info_cnt%"; cnt=cnt+1) BEGIN //0x0 trigger name (may contains area numbers for doors) SET off = ("%info_off%"+0xc4*cnt) SPRINT res ~door~ LPM EET_PCU_off_8675 //0x38 destination ARE resref SET off = ("%info_off%"+0xc4*cnt+0x38) SPRINT res ~are~ LPM EET_PCU_off_res //0x40 entrance name in destination area (for travel regions) SET off = ("%info_off%"+0xc4*cnt+0x40) SPRINT res ~exit~ LPM EET_PCU_off_8675 //0x64 information text (for info points) SET off = ("%info_off%"+0xc4*cnt+0x64) LPM EET_PCU_off_strref //0x7c region BCS resref SET off = ("%info_off%"+0xc4*cnt+0x7c) SPRINT res ~bcs~ LPM EET_PCU_off_res //0xb8 speaker name SET off = ("%info_off%"+0xc4*cnt+0xb8) LPM EET_PCU_off_strref //0xbc trigger DLG resref for prox triggers SET off = ("%info_off%"+0xc4*cnt+0xbc) SPRINT res ~dlg~ LPM EET_PCU_off_res END /////////// //Entrances /////////// READ_LONG 0x68 "entry_off" READ_LONG 0x6c "entry_cnt" FOR (cnt=0; cnt<"%entry_cnt%"; cnt=cnt+1) BEGIN //0x0 entrance name (contains area numbers) SET off = ("%entry_off%"+0x68*cnt) SPRINT res ~exit~ LPM EET_PCU_off_8675 END ////////////// //Spawn points ////////////// READ_LONG 0x60 "spawn_off" READ_LONG 0x64 "spawn_cnt" FOR (cnt=0; cnt<"%spawn_cnt%"; cnt=cnt+1) BEGIN //0x24 spawn CRE resref 1 //0x2c spawn CRE resref 2 //0x34 spawn CRE resref 3 //0x3c spawn CRE resref 4 //0x44 spawn CRE resref 5 //0x4c spawn CRE resref 6 //0x54 spawn CRE resref 7 //0x5c spawn CRE resref 8 //0x64 spawn CRE resref 9 //0x6c spawn CRE resref 10 FOR (j=0; j<10; j=j+1) BEGIN SET off = ("%spawn_off%"+0xc8*cnt+0x24+0x8*j) SPRINT res ~cre~ LPM EET_PCU_off_res END END //////////// //Containers //////////// READ_LONG 0x70 "contain_off" READ_SHORT 0x74 "contain_cnt" FOR (cnt=0; cnt<"%contain_cnt%"; cnt=cnt+1) BEGIN //0x48 trap BCS resref SET off = ("%contain_off%"+0xc0*cnt+0x48) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x58 creature CRE resref SET off = ("%contain_off%"+0xc0*cnt+0x58) SPRINT res ~cre~ LPM EET_PCU_off_res //0x78 key ITM resref SET off = ("%contain_off%"+0xc0*cnt+0x78) SPRINT res ~itm~ LPM EET_PCU_off_res //0x84 lockpick string SET off = ("%contain_off%"+0xc0*cnt+0x84) LPM EET_PCU_off_strref END ///////////////// //Container Items ///////////////// READ_LONG 0x78 "citem_off" READ_SHORT 0x76 "citem_cnt" FOR (cnt=0; cnt<"%citem_cnt%"; cnt=cnt+1) BEGIN //0x0 ITM resref SET off = ("%citem_off%"+0x14*cnt) SPRINT res ~itm~ LPM EET_PCU_off_res END ////////// //Ambients ////////// READ_LONG 0x84 "ambient_off" READ_SHORT 0x82 "ambient_cnt" FOR (cnt=0; cnt<"%ambient_cnt%"; cnt=cnt+1) BEGIN //0x30 ambient WAV resref 1 //0x38 ambient WAV resref 2 //0x40 ambient WAV resref 3 //0x48 ambient WAV resref 4 //0x50 ambient WAV resref 5 //0x58 ambient WAV resref 6 //0x60 ambient WAV resref 7 //0x68 ambient WAV resref 8 //0x70 ambient WAV resref 9 //0x78 ambient WAV resref 10 FOR (j=0; j<10; j=j+1) BEGIN SET off = ("%ambient_off%"+0xd4*cnt+0x30+0x8*j) SPRINT res ~wav~ LPM EET_PCU_off_res END END /////////// //Variables /////////// READ_LONG 0x88 "var_off" READ_LONG 0x8c "var_cnt" FOR (cnt=0; cnt<"%var_cnt%"; cnt=cnt+1) BEGIN //0x0 variable name SET off = ("%var_off%"+0x54*cnt) SPRINT res ~var~ LPM EET_PCU_off_32 END /////// //Doors /////// READ_LONG 0xa8 "door_off" READ_LONG 0xa4 "door_cnt" FOR (cnt=0; cnt<"%door_cnt%"; cnt=cnt+1) BEGIN //0x58 door open WAV resref SET off = ("%door_off%"+0xc8*cnt+0x58) SPRINT res ~wav~ LPM EET_PCU_off_res //0x60 door close WAV resref SET off = ("%door_off%"+0xc8*cnt+0x60) SPRINT res ~wav~ LPM EET_PCU_off_res //0x78 key ITM resref SET off = ("%door_off%"+0xc8*cnt+0x78) SPRINT res ~itm~ LPM EET_PCU_off_res //0x80 open BCS resref SET off = ("%door_off%"+0xc8*cnt+0x80) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x98 lockpick string SET off = ("%door_off%"+0xc8*cnt+0x98) LPM EET_PCU_off_strref //0xb4 lockpick string SET off = ("%door_off%"+0xc8*cnt+0xb4) LPM EET_PCU_off_strref //0xb8 open DLG resref SET off = ("%door_off%"+0xc8*cnt+0xb8) SPRINT res ~dlg~ LPM EET_PCU_off_res END //////////// //Animations //////////// READ_LONG 0xb0 "anim_off" READ_LONG 0xac "anim_cnt" FOR (cnt=0; cnt<"%anim_cnt%"; cnt=cnt+1) BEGIN //0x28 BAM resref SET off = ("%anim_off%"+0x4c*cnt+0x28) SPRINT res ~bam~ LPM EET_PCU_off_res END /////////////// //Automap notes /////////////// READ_LONG 0xc4 "note_off" READ_LONG 0xc8 "note_cnt" FOR (cnt=0; cnt<"%note_cnt%"; cnt=cnt+1) BEGIN //0x4 note text SET off = ("%note_off%"+0x34*cnt+0x4) LPM EET_PCU_off_strref END ////////////////// //Projectile traps ////////////////// READ_LONG 0xcc "pro_off" READ_LONG 0xd0 "pro_cnt" FOR (cnt=0; cnt<"%pro_cnt%"; cnt=cnt+1) BEGIN //0x0 projectile resref SET off = ("%pro_off%"+0x1c*cnt) SPRINT res ~pro~ LPM EET_PCU_off_res //0xe projectile animation (missile.ids) SET off = ("%pro_off%"+0x1c*cnt+0xe) SPRINT read_len ~s~ SET sub = 0 LPM EET_PCU_off_ipro //////////////////////////////////// //PRO structure (embedded PRO files) //////////////////////////////////// READ_LONG ("%pro_off%"+0x1c*cnt+0x8) "pro_emb_off" READ_SHORT ("%pro_off%"+0x1c*cnt+0xc) "pro_emb_size" PATCH_IF (pro_emb_off != 0) BEGIN //0x10 fire sound WAV resref SET off = ("%pro_emb_off%"+0x10) SPRINT res ~wav~ LPM EET_PCU_off_res //0x18 impact sound WAV resref SET off = ("%pro_emb_off%"+0x18) SPRINT res ~wav~ LPM EET_PCU_off_res //0x20 source animation VVC/BAM resref SET off = ("%pro_emb_off%"+0x20) SPRINT res ~bam~ LPM EET_PCU_off_res //0x30 string SET off = ("%pro_emb_off%"+0x30) LPM EET_PCU_off_strref //0x44 default spell SPL resref SET off = ("%pro_emb_off%"+0x44) SPRINT res ~spl~ LPM EET_PCU_off_res //0x4c success spell SPL resref SET off = ("%pro_emb_off%"+0x4c) SPRINT res ~spl~ LPM EET_PCU_off_res ///////////////// //Projectile info ///////////////// //0x104 projectile animation BAM resref SET off = ("%pro_emb_off%"+0x104) SPRINT res ~bam~ LPM EET_PCU_off_res //0x10c shadow animation BAM resref SET off = ("%pro_emb_off%"+0x10c) SPRINT res ~bam~ LPM EET_PCU_off_res //0x11c palette BMP resref SET off = ("%pro_emb_off%"+0x11c) SPRINT res ~bmp~ LPM EET_PCU_off_res //0x136 traveling animation 1 BAM resref SET off = ("%pro_emb_off%"+0x136) SPRINT res ~bam~ LPM EET_PCU_off_res //0x13e traveling animation 2 BAM resref SET off = ("%pro_emb_off%"+0x13e) SPRINT res ~bam~ LPM EET_PCU_off_res //0x146 traveling animation 3 BAM resref SET off = ("%pro_emb_off%"+0x146) SPRINT res ~bam~ LPM EET_PCU_off_res /////////// //Area info /////////// PATCH_IF (pro_emb_size >= 768) BEGIN //0x208 explosion sound WAV resref SET off = ("%pro_emb_off%"+0x208) SPRINT res ~wav~ LPM EET_PCU_off_res //0x214 secondary projectile PRO resref SET off = ("%pro_emb_off%"+0x214) SPRINT res ~pro~ LPM EET_PCU_off_res //0x21a explosion projectile PRO resref SET off = ("%pro_emb_off%"+0x21a) SPRINT res ~pro~ LPM EET_PCU_off_res //0x21c explosion animation VVC/BAM resref SET off = ("%pro_emb_off%"+0x21c) SPRINT res ~bam~ LPM EET_PCU_off_res //0x228 speed animation VVC/BAM resref SET off = ("%pro_emb_off%"+0x228) SPRINT res ~bam~ LPM EET_PCU_off_res //0x230 ring animation VVC/BAM resref SET off = ("%pro_emb_off%"+0x230) SPRINT res ~bam~ LPM EET_PCU_off_res //0x238 area sound WAV resref SET off = ("%pro_emb_off%"+0x238) SPRINT res ~wav~ LPM EET_PCU_off_res END END END /////// //Songs /////// READ_LONG 0xbc "song_off" //0x0 area day song dword //0x04 area night song dword //0x08 area win song dword //0x0c area battle song dword //0x10 area lose song dword FOR (j=0; j<10; j=j+1) BEGIN SET off = ("%song_off%"+0x04*j) LPM EET_PCU_off_mus END //0x28 area ambient (day) 1 WAV resref //0x30 area ambient (day) 2 WAV resref FOR (j=0; j<2; j=j+1) BEGIN SET off = ("%song_off%"+0x28+0x8*j) SPRINT res ~wav~ LPM EET_PCU_off_res END //0x3c area ambient (night) 1 WAV resref //0x44 area ambient (night) 2 WAV resref FOR (j=0; j<2; j=j+1) BEGIN SET off = ("%song_off%"+0x3c+0x8*j) SPRINT res ~wav~ LPM EET_PCU_off_res END ////////////////////// //Rest spawn creatures ////////////////////// READ_LONG 0xc0 "rest_off" //0x48 CRE resref 1 //0x50 CRE resref 2 //0x58 CRE resref 3 //0x60 CRE resref 4 //0x68 CRE resref 5 //0x70 CRE resref 6 //0x78 CRE resref 7 //0x80 CRE resref 8 //0x88 CRE resref 9 //0x90 CRE resref 10 FOR (j=0; j<10; j=j+1) BEGIN SET off = ("%rest_off%"+0x48+0x8*j) SPRINT res ~cre~ LPM EET_PCU_off_res END //Interruption explantion text (10*0x4) FOR (j=0; j<10; j=j+1) BEGIN SET off = ("%rest_off%"+0x4*j+0x20) LPM EET_PCU_off_strref END TEXT_SPRINT ext_check ~are~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //BAF patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF (("%SOURCE_FILE%" STRING_COMPARE_REGEXP ".*.\.BAF$")=0) BEGIN //PATCH_PRINT ~Patching script source file %SOURCE_FILESPEC%...~ LPM EET_PCU_match TEXT_SPRINT ext_check ~baf~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //BCS patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF ("%filetype%" STR_EQ "SC CR CO") BEGIN //PATCH_PRINT ~Patching compiled script file %SOURCE_FILESPEC%...~ DECOMPILE_AND_PATCH BEGIN LPM EET_PCU_match END TEXT_SPRINT ext_check ~bcs~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //CRE / CHR patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF ("%filetype%" STR_EQ "CRE V1.0") /*AND (SOURCE_SIZE > 0x2d3)*/ OR ("%filetype%" STR_EQ "CHR V2.0") BEGIN PATCH_IF ("%filetype%" STR_EQ "CRE V1.0") BEGIN //PATCH_PRINT ~Patching creature version 1.0 file %SOURCE_FILESPEC%...~ SET cre_struct_off = 0 LPF ~FJ_CRE_VALIDITY~ RET valid END //Checks whether a file is well-formed or not, fixes some common bugs, and reports whether the CRE file is still broken or not. END ELSE BEGIN //chr //PATCH_PRINT ~Patching character version 2.0 file %SOURCE_FILESPEC%...~ READ_LONG 0x28 "cre_struct_off" SET valid = 1 END PATCH_IF valid = 1 BEGIN //0x8 Long name SET off = ("%cre_struct_off%"+0x8) LPM EET_PCU_off_strref //0xc Short name (tooltip) SET off = ("%cre_struct_off%"+0xc) LPM EET_PCU_off_strref //0x28 animation ID SET off = ("%cre_struct_off%"+0x28) SPRINT res ~anim~ LPM EET_PCU_off_long //0x34 small portrait BMP resref SET off = ("%cre_struct_off%"+0x34) SPRINT res ~bmp~ LPM EET_PCU_off_res //0x3c large portrait BMP resref SET off = ("%cre_struct_off%"+0x3c) SPRINT res ~bmp~ LPM EET_PCU_off_res //0xa4 sound-set FOR (cnt2=0; cnt2<99; cnt2=cnt2+1) BEGIN SET off = ("%cre_struct_off%"+0xa4+0x4*cnt2) LPM EET_PCU_off_strref END //0x241 racial enemy number SET off = ("%cre_struct_off%"+0x241) SPRINT res ~race~ LPM EET_PCU_off_byte //0x244 kit internal number SET off = ("%cre_struct_off%"+0x244) SPRINT read_len ~l~ LPM EET_PCU_off_kit //0x248 override BCS resref SET off = ("%cre_struct_off%"+0x248) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x250 class BCS resref SET off = ("%cre_struct_off%"+0x250) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x258 race BCS resref SET off = ("%cre_struct_off%"+0x258) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x260 general BCS resref SET off = ("%cre_struct_off%"+0x260) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x268 default BCS resref SET off = ("%cre_struct_off%"+0x268) SPRINT res ~bcs~ LPM EET_PCU_off_res //0x272 Race number SET off = ("%cre_struct_off%"+0x272) SPRINT res ~race~ LPM EET_PCU_off_byte //0x273 Class number SET off = ("%cre_struct_off%"+0x273) SPRINT res ~class~ LPM EET_PCU_off_byte //0x274 Specific number SET off = ("%cre_struct_off%"+0x274) SPRINT res ~spec~ LPM EET_PCU_off_byte //0x280 Death Variable SET off = ("%cre_struct_off%"+0x280) SPRINT res ~dv~ LPM EET_PCU_off_32 //0x2cc DLG resref SET off = ("%cre_struct_off%"+0x2cc) SPRINT res ~dlg~ LPM EET_PCU_off_res ////////////// //Known Spells ////////////// READ_LONG ("%cre_struct_off%"+0x2a0) "kspell_off" READ_SHORT ("%cre_struct_off%"+0x2a4) "kspell_cnt" FOR (cnt=0; cnt<"%kspell_cnt%"; cnt=cnt+1) BEGIN //0x0 SPL resref SET off = ("%kspell_off%"+0xc*cnt) SPRINT res ~spl~ LPM EET_PCU_off_res END ////////////////// //Memorised Spells ////////////////// READ_LONG ("%cre_struct_off%"+0x2b0) "mspell_off" READ_SHORT ("%cre_struct_off%"+0x2b4) "mspell_cnt" FOR (cnt=0; cnt<"%mspell_cnt%"; cnt=cnt+1) BEGIN //0x0 SPL resref SET off = ("%mspell_off%"+0xc*cnt) SPRINT res ~spl~ LPM EET_PCU_off_res END /////// //Items /////// READ_LONG ("%cre_struct_off%"+0x2bc) "item_off" READ_SHORT ("%cre_struct_off%"+0x2c0) "item_cnt" FOR (cnt=0; cnt<"%item_cnt%"; cnt=cnt+1) BEGIN //0x0 ITM resref SET off = ("%item_off%"+0x14*cnt) SPRINT res ~itm~ LPM EET_PCU_off_res END ///////// //Effects ///////// READ_LONG ("%cre_struct_off%"+0x2c4) "fx_off" READ_LONG ("%cre_struct_off%"+0x2c8) "fx_cnt" SET clone_update = 0 FOR (cnt=0; cnt<"%fx_cnt%"; cnt=cnt+1) BEGIN READ_LONG ("%fx_off%"+0x108*cnt+0x8) "fx_type" SET param1 = ("%fx_off%"+0x108*cnt+0x14) SET param2 = ("%fx_off%"+0x108*cnt+0x18) SET resource1 = ("%fx_off%"+0x108*cnt+0x28) SET special = ("%fx_off%"+0x108*cnt+0x40) SET param3 = ("%fx_off%"+0x108*cnt+0x58) SET resource2 = ("%fx_off%"+0x108*cnt+0x68) SET resource3 = ("%fx_off%"+0x108*cnt+0x70) SET ver = 2 SPRINT headerType ~global~ LPM EET_PCU_effects //0x8c source spell SPL resref SET off = ("%fx_off%"+0x108*cnt+0x8c) SPRINT res ~spl~ LPM EET_PCU_off_res //0x98 impact projectile SET off = ("%fx_off%"+0x108*cnt+0x98) SPRINT read_len ~l~ SET sub = 1 LPM EET_PCU_off_ipro END PATCH_IF clone_update = 1 BEGIN LPM EET_clone_update END ///////////////////////////////////////////////////////////////// //Migrate 9-click rare select sounds and additional action sounds ///////////////////////////////////////////////////////////////// FOR (cnt2=0; cnt2<4; cnt2=cnt2+1) BEGIN // rare select SET off = ("%cre_struct_off%"+0x130+0x4*cnt2) SET dest = ("%cre_struct_off%"+0x1d0+0x4*cnt2) LPM EET_PCU_migrate_soundslots // action4-7 SET off = ("%cre_struct_off%"+0x1e0+0x4*cnt2) SET dest = ("%cre_struct_off%"+0x130+0x4*cnt2) LPM EET_PCU_migrate_soundslots END TEXT_SPRINT ext_check ~cre~ END ELSE BEGIN PATCH_WARN ~WARNING: FJ_CRE_VALIDITY returned %SOURCE_FILESPEC% as not valid file~ END END ///////////////////////////////////////////////////////////////////////////////////////////////////// //D patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF (("%SOURCE_FILE%" STRING_COMPARE_REGEXP ".*.\.D$")=0) BEGIN //PATCH_PRINT ~Patching dialog source file %SOURCE_FILESPEC%...~ LPM EET_PCU_match LPM D_DLG_replace PATCH_IF traifyDLG = 1 BEGIN LPM D_traifyDLG_replace END TEXT_SPRINT ext_check ~d~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //DLG patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF ("%filetype%" STR_EQ "DLG V1.0") AND (SOURCE_SIZE > 0x33) BEGIN //protects against invalid files //PATCH_PRINT ~Patching dialog version 1.0 file %SOURCE_FILESPEC%...~ /////////// //Responses /////////// READ_LONG 0x14 "resp_off" READ_SHORT 0x10 "resp_cnt" FOR (cnt=0; cnt<"%resp_cnt%"; cnt=cnt+1) BEGIN //0x14 next dialogue DLG resref SET off = ("%resp_off%"+0x20*cnt+0x14) SPRINT res ~dlg~ LPM EET_PCU_off_res END DECOMPILE_AND_PATCH BEGIN LPM EET_PCU_match LPM D_DLG_replace PATCH_IF traifyDLG = 1 BEGIN LPM D_traifyDLG_replace END END TEXT_SPRINT ext_check ~dlg~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //EFF patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF ("%filetype%" STR_EQ "EFF V2.0") BEGIN //PATCH_PRINT ~Patching effect version 2.0 file %SOURCE_FILESPEC%...~ READ_LONG 0x10 "fx_type" SET param1 = 0x1c SET param2 = 0x20 SET resource1 = 0x30 SET special = 0x48 SET param3 = 0x60 SET resource2 = 0x70 SET resource3 = 0x78 SET ver = 2 SPRINT headerType ~~ LPM EET_PCU_effects //0x94 source spell SPL resref SET off = 0x94 SPRINT res ~spl~ LPM EET_PCU_off_res //0xa0 impact projectile SET off = 0xa4 SPRINT read_len ~l~ SET sub = 1 LPM EET_PCU_off_ipro TEXT_SPRINT ext_check ~eff~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //GAM patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF (("%SOURCE_FILE%" STRING_COMPARE_REGEXP ".*.\.GAM$")=0) BEGIN //PATCH_PRINT ~Patching gam version 1.1 file %SOURCE_FILESPEC%...~ ////// //NPCS ////// READ_LONG 0x30 npcs_off READ_LONG 0x34 npcs_cnt FOR (cnt=0; cnt<"%npcs_cnt%"; cnt=cnt+1) BEGIN //0xc CRE resref SET off = ("%npcs_off%"+0x160*cnt+0xc) SPRINT res ~cre~ LPM EET_PCU_off_res //0x18 ARE resref SET off = ("%npcs_off%"+0x160*cnt+0x18) SPRINT res ~are~ LPM EET_PCU_off_res END TEXT_SPRINT ext_check ~gam~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //ITM patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF ("%filetype%" STR_EQ "ITM V1 ") AND (SOURCE_SIZE > 0x71) BEGIN //PATCH_PRINT ~Patching item version 1.0 file %SOURCE_FILESPEC%...~ //0x8 General name SET off = 0x8 LPM EET_PCU_off_strref //0xc Identified name SET off = 0xc LPM EET_PCU_off_strref //0x10 replacement ITM resref SET off = 0x10 SPRINT res ~itm~ LPM EET_PCU_off_res //0x3a inventory icon BAM resref SET off = 0x3a SPRINT res ~bam~ LPM EET_PCU_off_res //0x44 ground icon BAM resref SET off = 0x44 SPRINT res ~bam~ LPM EET_PCU_off_res //0x50 General description SET off = 0x50 LPM EET_PCU_off_strref //0x54 Identified description SET off = 0x54 LPM EET_PCU_off_strref //0x58 description icon BAM resref SET off = 0x58 SPRINT res ~bam~ LPM EET_PCU_off_res ///////// //Effects ///////// READ_LONG 0x64 "abil_off" READ_SHORT 0x68 "abil_cnt" READ_LONG 0x6a "fx_off" READ_SHORT 0x6e "fx_start" READ_SHORT 0x70 "fx_cnt" SET fx_end = fx_start + fx_cnt PATCH_IF fx_end > fx_start BEGIN DEFINE_ASSOCIATIVE_ARRAY pcu_effects_list BEGIN ~%fx_start%~ , ~%fx_end%~ => ~global~ END END FOR (cnt=0; cnt<"%abil_cnt%"; cnt=cnt+1) BEGIN /////////// //Abilities /////////// //0x4 memorised icon BAM resref SET off = ("%abil_off%"+0x38*cnt+0x4) SPRINT res ~bam~ LPM EET_PCU_off_res //0x2a Projectile animation (missile.ids) SET off = ("%abil_off%"+0x38*cnt+0x2a) SPRINT read_len ~s~ SET sub = 0 LPM EET_PCU_off_ipro READ_SHORT ("%abil_off%"+0x38*cnt+0x1e) "fx_num" READ_SHORT ("%abil_off%"+0x38*cnt+0x20) "fx_start" SET fx_end = fx_start + fx_num PATCH_IF fx_end > fx_start BEGIN DEFINE_ASSOCIATIVE_ARRAY pcu_effects_list BEGIN ~%fx_start%~ , ~%fx_end%~ => ~%cnt%~ END END //SET fx_cnt += fx_num //gauge the total number of effects by summing global effects and the effects of each ability END SET clone_update = 0 PHP_EACH pcu_effects_list AS index => headerType BEGIN FOR (cnt=index; cnt<"%index_1%"; cnt=cnt+1) BEGIN READ_SHORT ("%fx_off%"+0x30*cnt) "fx_type" SET param1 = ("%fx_off%"+0x30*cnt+0x4) SET param2 = ("%fx_off%"+0x30*cnt+0x8) SET resource1 = ("%fx_off%"+0x30*cnt+0x14) SET special = ("%fx_off%"+0x30*cnt+0x2c) SET ver = 1 LPM EET_PCU_effects END END PATCH_IF clone_update = 1 BEGIN LPM EET_clone_update END TEXT_SPRINT ext_check ~itm~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //PRO patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF ("%filetype%" STR_EQ "PRO V1.0") BEGIN //PATCH_PRINT ~Patching PRO version 1.0 file %SOURCE_FILESPEC%...~ //0x10 fire sound WAV resref SET off = 0x10 SPRINT res ~wav~ LPM EET_PCU_off_res //0x18 impact sound WAV resref SET off = 0x18 SPRINT res ~wav~ LPM EET_PCU_off_res //0x20 source animation VVC/BAM resref SET off = 0x20 SPRINT res ~bam~ LPM EET_PCU_off_res //0x30 display message SET off = 0x30 LPM EET_PCU_off_strref //0x44 default spell SPL resref SET off = 0x44 SPRINT res ~spl~ LPM EET_PCU_off_res //0x4c success spell SPL resref SET off = 0x4c SPRINT res ~spl~ LPM EET_PCU_off_res /////////////// //IDS targeting /////////////// READ_LONG 0x2c "pro_flags" PATCH_IF (~%pro_flags%~ BAND BIT30) BEGIN //IWD style check SET off = 0x3e SPRINT res ~splProt~ LPM EET_PCU_off_short READ_SHORT 0x3e "ids_file" PATCH_IF (ids_file = 104) OR (ids_file = 114) BEGIN //Race.ids SET off = 0x3c SPRINT res ~race~ LPM EET_PCU_off_short END ELSE PATCH_IF (ids_file = 105) OR (ids_file = 115) BEGIN //Class.ids SET off = 0x3c SPRINT res ~class~ LPM EET_PCU_off_short END ELSE PATCH_IF (ids_file = 106) OR (ids_file = 116) BEGIN //Specific.ids SET off = 0x3c SPRINT res ~spec~ LPM EET_PCU_off_short END ELSE PATCH_IF (ids_file = 109) BEGIN //Kit.ids SET off = 0x3c SPRINT read_len ~s~ LPM EET_PCU_off_kit END SET off = 0x42 SPRINT res ~splProt~ LPM EET_PCU_off_short READ_SHORT 0x42 "ids_file" PATCH_IF (ids_file = 104) OR (ids_file = 114) BEGIN //Race.ids SET off = 0x40 SPRINT res ~race~ LPM EET_PCU_off_short END ELSE PATCH_IF (ids_file = 105) OR (ids_file = 115) BEGIN //Class.ids SET off = 0x40 SPRINT res ~class~ LPM EET_PCU_off_short END ELSE PATCH_IF (ids_file = 106) OR (ids_file = 116) BEGIN //Specific.ids SET off = 0x40 SPRINT res ~spec~ LPM EET_PCU_off_short END ELSE PATCH_IF (ids_file = 109) BEGIN //Kit.ids SET off = 0x40 SPRINT read_len ~s~ LPM EET_PCU_off_kit END END ELSE BEGIN READ_SHORT 0x3e "ids_file" PATCH_IF (ids_file = 4) BEGIN //Race.ids SET off = 0x3c SPRINT res ~race~ LPM EET_PCU_off_short END ELSE PATCH_IF (ids_file = 5) BEGIN //Class.ids SET off = 0x3c SPRINT res ~class~ LPM EET_PCU_off_short END ELSE PATCH_IF (ids_file = 6) BEGIN //Specific.ids SET off = 0x3c SPRINT res ~spec~ LPM EET_PCU_off_short END ELSE PATCH_IF (ids_file = 9) BEGIN //Kit.ids SET off = 0x3c SPRINT read_len ~s~ LPM EET_PCU_off_kit END READ_SHORT 0x42 "ids_file" PATCH_IF (ids_file = 4) BEGIN //Race.ids SET off = 0x40 SPRINT res ~race~ LPM EET_PCU_off_short END ELSE PATCH_IF (ids_file = 5) BEGIN //Class.ids SET off = 0x40 SPRINT res ~class~ LPM EET_PCU_off_short END ELSE PATCH_IF (ids_file = 6) BEGIN //Specific.ids SET off = 0x40 SPRINT res ~spec~ LPM EET_PCU_off_short END ELSE PATCH_IF (ids_file = 9) BEGIN //Kit.ids SET off = 0x40 SPRINT read_len ~s~ LPM EET_PCU_off_kit END END ///////////////// //Projectile info ///////////////// //0x104 projectile animation BAM resref SET off = 0x104 SPRINT res ~bam~ LPM EET_PCU_off_res //0x10c shadow animation BAM resref SET off = 0x10c SPRINT res ~bam~ LPM EET_PCU_off_res //0x11c palette BMP resref SET off = 0x11c SPRINT res ~bmp~ LPM EET_PCU_off_res //0x136 traveling animation 1 BAM resref SET off = 0x136 SPRINT res ~bam~ LPM EET_PCU_off_res //0x13e traveling animation 2 BAM resref SET off = 0x13e SPRINT res ~bam~ LPM EET_PCU_off_res //0x146 traveling animation 3 BAM resref SET off = 0x146 SPRINT res ~bam~ LPM EET_PCU_off_res /////////// //Area info /////////// PATCH_IF (~%SOURCE_SIZE%~ >= 768) BEGIN //0x208 explosion sound WAV resref SET off = 0x208 SPRINT res ~wav~ LPM EET_PCU_off_res //0x214 secondary projectile (projectl.ids) SET off = 0x214 SPRINT read_len ~s~ SET sub = 1 LPM EET_PCU_off_ipro //0x21a explosion projectile (missile.ids), played on affected creatures SET off = 0x21a SPRINT read_len ~s~ SET sub = 0 LPM EET_PCU_off_ipro //0x21c explosion animation VVC/BAM resref SET off = 0x21c SPRINT res ~bam~ LPM EET_PCU_off_res //0x228 speed animation VVC/BAM resref SET off = 0x228 SPRINT res ~bam~ LPM EET_PCU_off_res //0x230 ring animation VVC/BAM resref SET off = 0x230 SPRINT res ~bam~ LPM EET_PCU_off_res //0x238 area sound WAV resref SET off = 0x238 SPRINT res ~wav~ LPM EET_PCU_off_res END TEXT_SPRINT ext_check ~pro~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //SPL patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF ("%filetype%" STR_EQ "SPL V1 ") AND (SOURCE_SIZE > 0x71) BEGIN //PATCH_PRINT ~Patching spell version 1.0 file %SOURCE_FILESPEC%...~ //0x8 General name SET off = 0x8 LPM EET_PCU_off_strref //0xc Identified name SET off = 0xc LPM EET_PCU_off_strref //0x10 casting sound WAV resref SET off = 0x10 SPRINT res ~wav~ LPM EET_PCU_off_res //0x3a spellbook icon BAM resref SET off = 0x3a SPRINT res ~bam~ LPM EET_PCU_off_res //0x50 General description SET off = 0x50 LPM EET_PCU_off_strref //0x54 Identified description SET off = 0x54 LPM EET_PCU_off_strref ///////// //Effects ///////// READ_LONG 0x64 "abil_off" READ_SHORT 0x68 "abil_cnt" READ_LONG 0x6a "fx_off" READ_SHORT 0x6e "fx_start" READ_SHORT 0x70 "fx_cnt" SET fx_end = fx_start + fx_cnt PATCH_IF fx_end > fx_start BEGIN DEFINE_ASSOCIATIVE_ARRAY pcu_effects_list BEGIN ~%fx_start%~ , ~%fx_end%~ => ~global~ END END FOR (cnt=0; cnt<"%abil_cnt%"; cnt=cnt+1) BEGIN /////////// //Abilities /////////// //0x4 memorised icon BAM resref SET off = ("%abil_off%"+0x28*cnt+0x4) SPRINT res ~bam~ LPM EET_PCU_off_res //0x26 Projectile animation (missile.ids) SET off = ("%abil_off%"+0x28*cnt+0x26) SPRINT read_len ~s~ SET sub = 0 LPM EET_PCU_off_ipro READ_SHORT ("%abil_off%"+0x28*cnt+0x1e) "fx_num" READ_SHORT ("%abil_off%"+0x28*cnt+0x20) "fx_start" SET fx_end = fx_start + fx_num PATCH_IF fx_end > fx_start BEGIN DEFINE_ASSOCIATIVE_ARRAY pcu_effects_list BEGIN ~%fx_start%~ , ~%fx_end%~ => ~%cnt%~ END END //SET fx_cnt += fx_num //gauge the total number of effects by summing global effects and the effects of each ability END SET clone_update = 0 PHP_EACH pcu_effects_list AS index => headerType BEGIN FOR (cnt=index; cnt<"%index_1%"; cnt=cnt+1) BEGIN READ_SHORT ("%fx_off%"+0x30*cnt) "fx_type" SET param1 = ("%fx_off%"+0x30*cnt+0x4) SET param2 = ("%fx_off%"+0x30*cnt+0x8) SET resource1 = ("%fx_off%"+0x30*cnt+0x14) SET special = ("%fx_off%"+0x30*cnt+0x2c) SET ver = 1 LPM EET_PCU_effects END END PATCH_IF clone_update = 1 BEGIN LPM EET_clone_update END TEXT_SPRINT ext_check ~spl~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //STO patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF ("%filetype%" STR_EQ "STORV1.0") AND (SOURCE_SIZE > 0x9b) BEGIN //PATCH_PRINT ~Patching store version 1.0 file %SOURCE_FILESPEC%...~ //0xc Name SET off = 0xc LPM EET_PCU_off_strref //0x44 tavern rumours DLG resref SET off = 0x44 SPRINT res ~dlg~ LPM EET_PCU_off_res //0x54 temple rumours DLG resref SET off = 0x54 SPRINT res ~dlg~ LPM EET_PCU_off_res //////////////// //Items for Sale //////////////// READ_LONG 0x34 "item_off" READ_SHORT 0x38 "item_cnt" FOR (cnt=0; cnt<"%item_cnt%"; cnt=cnt+1) BEGIN //0x0 ITM resref SET off = ("%item_off%"+0x1c*cnt) SPRINT res ~itm~ LPM EET_PCU_off_res END ///////////////// //Drinks for Sale ///////////////// READ_LONG 0x4c "drink_off" READ_SHORT 0x50 "drink_cnt" FOR (cnt=0; cnt<"%drink_cnt%"; cnt=cnt+1) BEGIN //0x0 special rumour DLG resref SET off = ("%drink_off%"+0x14*cnt) SPRINT res ~dlg~ LPM EET_PCU_off_res //0x8 drink name strref SET off = ("%drink_off%"+0x14*cnt+0x8) LPM EET_PCU_off_strref END //////////////// //Cures for Sale //////////////// READ_LONG 0x70 "cure_off" READ_SHORT 0x74 "cure_cnt" FOR (cnt=0; cnt<"%cure_cnt%"; cnt=cnt+1) BEGIN //0x0 SPL resref SET off = ("%cure_off%"+0xc*cnt) SPRINT res ~spl~ LPM EET_PCU_off_res END TEXT_SPRINT ext_check ~sto~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //Worldmap TBL patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF (("%SOURCE_FILE%" STRING_COMPARE_REGEXP ".*areas.*\.tbl$")=0) OR (("%SOURCE_FILE%" STRING_COMPARE_REGEXP ".*links.*\.tbl$")=0) BEGIN //PATCH_PRINT ~Patching tbl file %SOURCE_FILESPEC%...~ REPLACE_EVALUATE CASE_INSENSITIVE ~\([A-Z0-9#_]+\)~ BEGIN SPRINT match ~%MATCH1%~ SPRINT res ~exit~ LPM EET_PCU_outer_8675 END ~%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~\([A-Z0-9#_]+\)~ BEGIN SPRINT match ~%MATCH1%~ SPRINT res ~are~ LPM EET_PCU_outer_res END ~%match%~ TEXT_SPRINT ext_check ~tbl~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //TRA patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF (("%SOURCE_FILE%" STRING_COMPARE_REGEXP ".*.\.TRA$")=0) BEGIN //PATCH_PRINT ~Patching WeiDU translation file %SOURCE_FILESPEC%...~ PHP_EACH remapped_wav AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~\(\[\)%source%\(\]\)~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - wav~ END ~\1%dest%\2~ END TEXT_SPRINT ext_check ~tra~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //TP2/TPH/TPP/TPA patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF (("%SOURCE_FILE%" STRING_COMPARE_REGEXP ".*.\.TP.$")=0) BEGIN //PATCH_PRINT ~Patching WeiDU script file %SOURCE_FILESPEC%...~ //area resrefs PHP_EACH remapped_are AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\(\.ARE\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - are~ END ~\1#d#%dest%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\(\.ARE\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - are~ END ~#d#%dest%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - are~ END ~\1#d#%source%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - are~ END ~\1#d#%source%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - are~ END ~#d#%source%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - are~ END ~#d#%source%~ END //door names PHP_EACH remapped_door AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ "~]\)%source%~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, proposed change if this is a door: %source% => %dest% - door~ END ~~~~~\1#d#%source%~~~~~ END //entrance names PHP_EACH remapped_exit AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ "~]\)%source%~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, proposed change if this is an entrance: %source% => %dest% - exit~ END ~~~~~\1#d#%source%~~~~~ END //other resrefs PHP_EACH remapped_2da AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\(\.2DA\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - 2da~ END ~\1#d#%dest%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\(\.2DA\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - 2da~ END ~#d#%dest%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - 2da~ END ~\1#d#%source%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - 2da~ END ~\1#d#%source%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - 2da~ END ~#d#%source%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - 2da~ END ~#d#%source%~ END PHP_EACH remapped_bam AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\(\.BAM\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - bam~ END ~\1#d#%dest%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\(\.BAM\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - bam~ END ~#d#%dest%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - bam~ END ~\1#d#%source%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - bam~ END ~\1#d#%source%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - bam~ END ~#d#%source%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - bam~ END ~#d#%source%~ END PHP_EACH remapped_bcs AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\(\.BCS\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - bcs~ END ~\1#d#%dest%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\(\.BCS\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - bcs~ END ~#d#%dest%\1~ PATCH_IF skipTpBafD = 0 BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\(\.BAF\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - bcs~ END ~\1#d#%dest%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\(\.BAF\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - bcs~ END ~#d#%dest%\1~ END REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - bcs~ END ~\1#d#%source%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - bcs~ END ~\1#d#%source%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - bcs~ END ~#d#%source%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - bcs~ END ~#d#%source%~ END PHP_EACH remapped_cre AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\(\.CRE\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - cre~ END ~\1#d#%dest%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\(\.CRE\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - cre~ END ~#d#%dest%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - cre~ END ~\1#d#%source%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - cre~ END ~\1#d#%source%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - cre~ END ~#d#%source%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - cre~ END ~#d#%source%~ END PHP_EACH remapped_dlg AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\(\.DLG\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - dlg~ END ~\1#d#%dest%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\(\.DLG\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - dlg~ END ~#d#%dest%\1~ PATCH_IF skipTpBafD = 0 BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\(\.D\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - dlg~ END ~\1#d#%dest%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\(\.D\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - dlg~ END ~#d#%dest%\1~ END REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - dlg~ END ~\1#d#%source%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, proposed change: %source% => %dest% - dlg~ END ~\1#d#%source%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, proposed change: %source% => %dest% - dlg~ END ~#d#%source%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, proposed change: %source% => %dest% - dlg~ END ~#d#%source%~ END PHP_EACH remapped_dv AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"]+\)%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - dv~ END ~\1#d#%source%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"]+\)%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - dv~ END ~\1#d#%source%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - dv~ END ~#d#%source%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - dv~ END ~#d#%source%~ END PHP_EACH remapped_itm AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\(\.ITM\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - itm~ END ~\1#d#%dest%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\(\.ITM\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - itm~ END ~#d#%dest%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - itm~ END ~\1#d#%source%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - itm~ END ~\1#d#%source%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - itm~ END ~#d#%source%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - itm~ END ~#d#%source%~ END PHP_EACH remapped_spl AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\(\.SPL\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - spl~ END ~\1#d#%dest%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\(\.SPL\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - spl~ END ~#d#%dest%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - spl~ END ~\1#d#%source%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - spl~ END ~\1#d#%source%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - spl~ END ~#d#%source%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - spl~ END ~#d#%source%~ END PHP_EACH remapped_sto AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\(\.STO\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - sto~ END ~\1#d#%dest%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\(\.STO\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - sto~ END ~#d#%dest%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - sto~ END ~\1#d#%source%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - sto~ END ~\1#d#%source%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - sto~ END ~#d#%source%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - sto~ END ~#d#%source%~ END PHP_EACH remapped_var AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"]+\)%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - var~ END ~\1#d#%source%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"]+\)%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - var~ END ~\1#d#%source%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - var~ END ~#d#%source%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - var~ END ~#d#%source%~ END PHP_EACH remapped_wav AS source => dest BEGIN REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\(\.WAV\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - wav~ END ~\1#d#%dest%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\(\.WAV\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - wav~ END ~#d#%dest%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - wav~ END ~\1#d#%source%\2~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\([ %TAB%~"/\\]+\)%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - wav~ END ~\1#d#%source%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%\([ %TAB%~"]+\)~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - wav~ END ~#d#%source%\1~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~^%source%$~~~~~ BEGIN PATCH_PRINT ~Analyzing %SOURCE_FILESPEC%, no extension, proposed change: %source% => %dest% - wav~ END ~#d#%source%~ END //" LPM EET_PCU_match REPLACE_TEXTUALLY ~#d#~ ~~ TEXT_SPRINT ext_check ~tp2~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //VEF patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF ("%filetype%" STR_EQ "VEF V1.0") BEGIN //PATCH_PRINT ~Patching VEF version 1.0 file %SOURCE_FILESPEC%...~ //////////// //Components //////////// READ_LONG 0x8 "components1_off" READ_LONG 0xc "components1_num" READ_LONG 0x14 "components2_num" FOR (cnt=0; cnt<("%components1_num%"+"%components2_num%"); cnt=cnt+1) BEGIN READ_LONG ("%components1_off%"+0xe0*cnt+0xc) "Resource_Type" //0x10 resource name WAV/VEF/VVC/BAM resref PATCH_IF (Resource_Type = 0) BEGIN //WAV SET off = ("%components1_off%"+0xe0*cnt+0x10) SPRINT res ~wav~ LPM EET_PCU_off_res END ELSE PATCH_IF (Resource_Type = 1) BEGIN //VVC / BAM SET off = ("%components1_off%"+0xe0*cnt+0x10) SPRINT res ~bam~ LPM EET_PCU_off_res END ELSE PATCH_IF (Resource_Type = 2) BEGIN //VEF / VVC / BAM SET off = ("%components1_off%"+0xe0*cnt+0x10) SPRINT res ~vef~ LPM EET_PCU_off_res SET off = ("%components1_off%"+0xe0*cnt+0x10) SPRINT res ~bam~ LPM EET_PCU_off_res END END TEXT_SPRINT ext_check ~vef~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //VVC patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF ("%filetype%" STR_EQ "VVC V1.0") BEGIN //PATCH_PRINT ~Patching VVC version 1.0 file %SOURCE_FILESPEC%...~ //0x8 animation BAM resref SET off = 0x8 SPRINT res ~bam~ LPM EET_PCU_off_res //0x78 starting sound WAV resref SET off = 0x78 SPRINT res ~wav~ LPM EET_PCU_off_res //0x80 duration sound WAV resref SET off = 0x80 SPRINT res ~wav~ LPM EET_PCU_off_res //0x94 ending sound WAV resref(?) SET off = 0x94 SPRINT res ~wav~ LPM EET_PCU_off_res TEXT_SPRINT ext_check ~vvc~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //WED patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF ("%filetype%" STR_EQ "WED V1.3") BEGIN //PATCH_PRINT ~Patching WED version 1.3 file %SOURCE_FILESPEC%...~ ////////// //Overlays ////////// READ_LONG 0x8 "overlays_num" READ_LONG 0x10 "overlays_off" FOR (cnt=0; cnt<"%overlays_num%"; cnt=cnt+1) BEGIN //0x4 tileset TIS resref SET off = ("%overlays_off%"+0x18*cnt+0x4) SPRINT res ~tis~ LPM EET_PCU_off_res END TEXT_SPRINT ext_check ~wed~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //WMP patching // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE PATCH_IF ("%filetype%" STR_EQ "WMAPV1.0") BEGIN //PATCH_PRINT ~Patching worldmap version 1.0 file %SOURCE_FILESPEC%...~ READ_LONG 0xc "mapentry_off" //0x0 map resource MOS resref SET off = ("%mapentry_off%") SPRINT res ~mos~ LPM EET_PCU_off_res //0x30 map icons BAM resref SET off = ("%mapentry_off%"+0x30) SPRINT res ~bam~ LPM EET_PCU_off_res //////////////////////// //Map entry area entries //////////////////////// READ_LONG ("%mapentry_off%"+0x20) "areaentry_num" READ_LONG ("%mapentry_off%"+0x24) "areaentry_off" FOR (cnt=0; cnt<"%areaentry_num%"; cnt=cnt+1) BEGIN //0x0 area short name (contains area numbers) SET off = ("%areaentry_off%"+0xf0*cnt) SPRINT res ~are~ LPM EET_PCU_off_res //0x8 area content ARE resref SET off = ("%areaentry_off%"+0xf0*cnt+0x8) SPRINT res ~are~ LPM EET_PCU_off_res //0x10 area long name (contains area numbers) SET off = ("%areaentry_off%"+0xf0*cnt+0x10) SPRINT res ~are~ LPM EET_PCU_off_res //0x40 name SET off = ("%areaentry_off%"+0xf0*cnt+0x40) LPM EET_PCU_off_strref //0x44 tooltip SET off = ("%areaentry_off%"+0xf0*cnt+0x44) LPM EET_PCU_off_strref //0x48 loading screen MOS resref SET off = ("%areaentry_off%"+0xf0*cnt+0x48) SPRINT res ~mos~ LPM EET_PCU_off_res END ////////////////////// //Map entry area links ////////////////////// READ_LONG ("%mapentry_off%"+0x28) "arealink_off" READ_LONG ("%mapentry_off%"+0x2c) "arealink_num" FOR (cnt=0; cnt<"%arealink_num%"; cnt=cnt+1) BEGIN //0x4 entrance name (contains area numbers) SET off = ("%arealink_off%"+0xd8*cnt+0x4) SPRINT res ~exit~ LPM EET_PCU_off_8675 //0x2c random encounter ARE resref 1 //0x34 random encounter ARE resref 2 //0x3c random encounter ARE resref 3 //0x44 random encounter ARE resref 4 //0x4c random encounter ARE resref 5 FOR (j=0; j<5; j=j+1) BEGIN SET off = ("%arealink_off%"+0xd8*cnt+0x2c+0x8*j) SPRINT res ~are~ LPM EET_PCU_off_res END END TEXT_SPRINT ext_check ~wmp~ END ///////////////////////////////////////////////////////////////////////////////////////////////////// //Other // ///////////////////////////////////////////////////////////////////////////////////////////////////// ELSE /*PATCH_IF ("%filetype%" STR_EQ "Ignoring 0 byte file")*/ BEGIN PATCH_PRINT ~Ignoring %SOURCE_FILESPEC%...~ TEXT_SPRINT ext_check ~ignore~ END END ///////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE_PATCH_MACRO ~D_DLG_replace~ BEGIN //PHP_EACH remapped_dlg AS source => dest BEGIN // REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(BEGIN[ %TAB%]+[~"]?\)%source%\(?:$|[~" %TAB%]\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - BEGIN~ END ~\1%dest%\2~ // REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(BEGIN[ %TAB%]+[~"]\)%source%\([~"]\)~~~~~ BEGIN SET updated = 1 PATCH_PRINT ~Patching %SOURCE_FILESPEC%: %source% => %dest% - BEGIN~ END ~\1%dest%\2~ //END //why \(?:$|[~" %TAB%]\) doesn't work? //why !@$ characters don't work inside []? REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(IF_FILE_EXISTS[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(BEGIN[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(APPEND[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(APPEND_EARLY[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(EXTEND_TOP[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(EXTEND_BOTTOM[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(ADD_STATE_TRIGGER[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(ADD_TRANS_TRIGGER[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(ADD_TRANS_ACTION[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(REPLACE_TRANS_ACTION[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(REPLACE_TRANS_TRIGGER[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(ALTER_TRANS[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(REPLACE[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(SET_WEIGHT[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(REPLACE_SAY[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(REPLACE_STATE_TRIGGER[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(REPLACE_TRIGGER_TEXT[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(REPLACE_TRIGGER_TEXT_REGEXP[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(REPLACE_ACTION_TEXT[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(REPLACE_ACTION_TEXT_REGEXP[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(REPLACE_ACTION_TEXT_PROCESS[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(REPLACE_ACTION_TEXT_PROCESS_REGEXP[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(R_A_T_P_R[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(INTERJECT[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(INTERJECT_COPY_TRANS[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(INTERJECT_COPY_TRANS2[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(INTERJECT_COPY_TRANS3[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(INTERJECT_COPY_TRANS4[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(I_C_T[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(I_C_T2[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(I_C_T3[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(I_C_T4[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(END[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(EXTERN[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(COPY_TRANS[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(APPENDI[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(==[ %TAB%]*[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(CHAIN[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(THEN[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ /* THEN correction is used for the beginning CHAIN */ REPLACE_EVALUATE CASE_INSENSITIVE ~~~~~\(CHAIN2[ %TAB%]+[~"]?\)\([A-Za-z0-9#_-]+\)~~~~~ BEGIN SPRINT match ~%MATCH2%~ SPRINT res ~dlg~ LPM EET_PCU_outer_res END ~\1%match%~ /* exitFilename for CHAIN2 cannot be corrected using this method */ END ///////////////////////////////////////////////////////////////////////////////////////////////////////// DEFINE_PATCH_MACRO ~D_traifyDLG_replace~ BEGIN REPLACE_EVALUATE CASE_SENSITIVE ~SAY #\([0-9]+\)~ BEGIN LPF EET_strref INT_VAR str = MATCH1 add = strrefAdd RET str END PATCH_IF MATCH1 != str BEGIN SET MATCH1 = str SET updated = 1 END END ~SAY #%MATCH1%~ REPLACE_EVALUATE CASE_SENSITIVE ~REPLY #\([0-9]+\)~ BEGIN LPF EET_strref INT_VAR str = MATCH1 add = strrefAdd RET str END PATCH_IF MATCH1 != str BEGIN SET MATCH1 = str SET updated = 1 END END ~REPLY #%MATCH1%~ REPLACE_EVALUATE CASE_SENSITIVE ~JOURNAL #\([0-9]+\)~ BEGIN LPF EET_strref INT_VAR str = MATCH1 add = strrefAdd RET str END PATCH_IF MATCH1 != str BEGIN SET MATCH1 = str SET updated = 1 END END ~JOURNAL #%MATCH1%~ END ///////////////////////////////////////////////////////////////////////////////////////////////////////// //END Macros /////////////////////////////////////////////////////////////////////////////////////////////////////////