ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_prof_numeric_map BEGIN 89 => 99 // bastard sword > great sword 90 => 102 // long sword > large sword 91 => 105 // short sword 92 => 94 // axe 93 => 99 // 2h sword > great sword 94 => 102 // katana > large sword 95 => 102 // scimitar/waki/ninjato > large sword 96 => 115 // dagger 97 => 101 // hammer 98 => 106 // spear 99 => 100 // halberd // 100 => 98 // flail/mstar to flail 101 => 103 // mace 102 => 107 // staff 103 => 97 // crossbow 104 => 95 // longbow > bow 105 => 95 // shortbow > bow 106 => 104 // dart > missile 107 => 104 // sling > missile 115 => 96 // club END ACTION_DEFINE_ASSOCIATIVE_ARRAY cd_prof_text_map BEGIN AXE => 94 BASTARDSWORD => 99 CLUB => 96 CROSSBOW => 97 DAGGER => 115 DART => 104 FLAILMORNINGSTAR => 98 HALBERD => 100 KATANA => 102 LONGBOW => 95 LONGSWORD => 102 MACE => 103 QUARTERSTAFF => 107 SCIMITARWAKISASHININJATO => 102 SHORTBOW => 95 SHORTSWORD => 105 SLING => 104 SPEAR => 106 TWOHANDEDSWORD => 99 WARHAMMER => 101 END DEFINE_PATCH_MACRO ~prof_descripts~ BEGIN PATCH_IF (prof = 95) BEGIN // bows REPLACE_TEXTUALLY CASE_INSENSITIVE ~%prof_text_match%\(%lbow%\|%sbow%\)~ ~%prof_text% %bow%~ END ELSE PATCH_IF (prof = 98) BEGIN // flails REPLACE_TEXTUALLY CASE_INSENSITIVE ~%prof_text_match%%flail% */ *\(%mstar1% ?%mstar2%\)~ ~%prof_text% %flail%~ END ELSE PATCH_IF (prof = 99) BEGIN // great swords REPLACE_TEXTUALLY CASE_INSENSITIVE ~%prof_text_match%\(%bastard%\|%2hsword%\)~ ~%prof_text% %prof_gsword%~ // bastard sword/2h sword END ELSE PATCH_IF (prof = 102) BEGIN // large swords REPLACE_TEXTUALLY CASE_INSENSITIVE ~%prof_text_match%\(\(%scimitar% */ *%waki% */ *\(%ninjato%\|%ninjato_special%\|Ninja-?to\|Ninja-?tÅ\)\)\|\(%katana%\)\|\(%lsword%\)\)~ ~%prof_text% %prof_lsword%~ END ELSE PATCH_IF (prof = 103) BEGIN // morningstars/maces REPLACE_TEXTUALLY CASE_INSENSITIVE ~%prof_text_match%\(\(%flail% */ *%mstar1% ?%mstar2%\)\|\(%mace%\)\)~ ~%prof_text% %mace%/%mstar%~ END ELSE PATCH_IF (prof = 104) BEGIN // misile REPLACE_TEXTUALLY CASE_INSENSITIVE ~%prof_text_match%\(%dart%\|%sling%\)~ ~%prof_text% %prof_missile%~ END END OUTER_SET club_except = 96 INCLUDE ~cdtweaks/lib/profs_common2.tpa~ //item changes PRINT @1 COPY_EXISTING_REGEXP GLOB ~^.+\.itm$~ ~override~ // item changes READ_BYTE 0x31 current_prof ELSE 0 PATCH_IF ((current_prof = 115) OR ((current_prof > 88) AND (current_prof < 108))) BEGIN // sanity check PATCH_IF (current_prof = 100) BEGIN READ_ASCII 0x22 anim (2) PATCH_IF (("%anim%" STRING_COMPARE_CASE "ms" = 0) OR ("%anim%" STRING_COMPARE_CASE "mc" = 0)) BEGIN // morningstars or maces SET prof = 103 END ELSE BEGIN SET prof = 98 END END PHP_EACH cd_prof_numeric_map AS old => new BEGIN PATCH_IF (current_prof = old) BEGIN SET prof = new END END WRITE_BYTE 0x31 prof // new prof PATCH_IF ((prof = 95) OR (prof = 98) OR (prof = 99) OR (prof = 102) OR (prof = 103) OR (prof = 104)) BEGIN // update descriptions PATCH_FOR_EACH offset IN 0x50 0x54 BEGIN READ_LONG ~%offset%~ desc_strref PATCH_IF (desc_strref >= 0 && desc_strref < 2147483646) BEGIN READ_STRREF ~%offset%~ desc INNER_PATCH_SAVE desc ~%desc%~ BEGIN LAUNCH_PATCH_MACRO ~prof_descripts~ END SAY_EVALUATED ~%offset%~ ~%desc%~ // write changes END END END END BUT_ONLY PRINT @1 ACTION_FOR_EACH file IN weapprof racethac BEGIN ACTION_IF FILE_EXISTS_IN_GAME ~%file%.2da~ THEN BEGIN COPY_EXISTING ~%file%.2da~ ~override~ PATCH_IF ("%file%" STRING_COMPARE_CASE "weapprof" = 0) THEN BEGIN SET col_start = 4 SET skip_rows = 8 SET label_col = 0 // read in halberd and staff lines since loop below overwrites them REPLACE_EVALUATE ~^\(HALBERD[ %TAB%]+\)99\([ %TAB%]+.+\)$~ BEGIN SPRINT line_halb "%MATCH1%100%MATCH2%" END "%MATCH1%99%MATCH2%" REPLACE_EVALUATE ~^\(QUARTERSTAFF[ %TAB%]+\)102\([ %TAB%]+.+\)$~ BEGIN SPRINT line_staf "%MATCH1%107%MATCH2%" END "%MATCH1%102%MATCH2%" REPLACE_EVALUATE ~^\(AXE[ %TAB%]+\)92\([ %TAB%]+.+\)$~ BEGIN SPRINT line_axe "%MATCH1%94%MATCH2%" END "UNUSED 92%MATCH2%" REPLACE_EVALUATE ~^SHORTSWORD\([ %TAB%]+\)91\([ %TAB%]+.+\)$~ BEGIN SPRINT line_sswd "SHORT_SWORD%MATCH1%105%MATCH2%" END "UNUSED%MATCH1%91%MATCH2%" END ELSE BEGIN SET col_start = 2 SET skip_rows = 0 SET label_col = 1 // read in halberd and staff lines since loop below overwrites them REPLACE_EVALUATE ~^99\([ %TAB%]+\)HALBERD\([ %TAB%]+.+\)$~ BEGIN SPRINT line_halb "100%MATCH1%HALBERD%MATCH2%" END "99%MATCH1%UNUSED%MATCH2%" REPLACE_EVALUATE ~^102\([ %TAB%]+\)QUARTERSTAFF\([ %TAB%]+.+\)$~ BEGIN SPRINT line_staf "107%MATCH1%QUARTERSTAFF%MATCH2%" END "102%MATCH1%UNUSED%MATCH2%" REPLACE_EVALUATE ~^92\([ %TAB%]+\)AXE\([ %TAB%]+.+\)$~ BEGIN SPRINT line_axe "94%MATCH1%AXE%MATCH2%" END "92%MATCH1%UNUSED%MATCH2%" REPLACE_EVALUATE ~^91\([ %TAB%]+\)SHORTSWORD\([ %TAB%]+.+\)$~ BEGIN SPRINT line_sswd "105%MATCH1%SHORTSWORD%MATCH2%" END "91%MATCH1%UNUSED%MATCH2%" END READ_2DA_ENTRY 0 0 3 foo SET_2DA_ENTRY 0 0 3 ~CD_DELETE_ME %foo%~ // for profs being merged, take the highest of both values COUNT_2DA_COLS col_num FOR (col = col_start; col < col_num; ++col) BEGIN READ_2DA_ENTRY (skip_rows + 1) col col_num star_bast READ_2DA_ENTRY (skip_rows + 2) col col_num star_lswd READ_2DA_ENTRY (skip_rows + 5) col col_num star_2hsw READ_2DA_ENTRY (skip_rows + 6) col col_num star_kata READ_2DA_ENTRY (skip_rows + 7) col col_num star_scim READ_2DA_ENTRY (skip_rows + 17) col col_num star_lbow READ_2DA_ENTRY (skip_rows + 18) col col_num star_sbow READ_2DA_ENTRY (skip_rows + 19) col col_num star_dart READ_2DA_ENTRY (skip_rows + 20) col col_num star_slng PATCH_IF (star_bast < star_2hsw) BEGIN SET star_bast = star_2hsw END // great swords PATCH_IF (star_lswd < star_kata) BEGIN SET star_lswd = star_kata END // large swords PATCH_IF (star_lswd < star_scim) BEGIN SET star_lswd = star_scim END // large swords PATCH_IF (star_lbow < star_sbow) BEGIN SET star_lbow = star_sbow END // bows PATCH_IF (star_dart < star_slng) BEGIN SET star_dart = star_slng END // missile SET_2DA_ENTRY (skip_rows + 12) col col_num ~%star_bast%~ // replaces old halberd line SET_2DA_ENTRY (skip_rows + 15) col col_num ~%star_lswd%~ // replaces old staff line SET_2DA_ENTRY (skip_rows + 7) col col_num ~%star_lbow%~ // replaces old scimitar line SET_2DA_ENTRY (skip_rows + 17) col col_num ~%star_dart%~ // replaces old long bow line PATCH_IF (tb#tutu_realloc_style = 1) BEGIN // eliminate weapon styles SET_2DA_ENTRY (skip_rows + 21) col col_num 0 // two-handed weapon style SET_2DA_ENTRY (skip_rows + 22) col col_num 0 // sword & shield SET_2DA_ENTRY (skip_rows + 23) col col_num 0 // single weapon SET_2DA_ENTRY (skip_rows + 24) col col_num 0 // dual-wield END FOR (row = (skip_rows + 1) ; row < (skip_rows + 6) ; ++row) BEGIN // eliminate first six profs SET_2DA_ENTRY row col col_num 0 // nuke first five rows END END // now read-and-shuffle other profs to correct lines REPLACE_TEXTUALLY ~^107[ %TAB%]+SLING\([ %TAB%]+.+\)$~ ~%line_staf%~ REPLACE_TEXTUALLY ~^SLING[ %TAB%]+107\([ %TAB%]+.+\)$~ ~%line_staf%~ PATCH_IF (col_start = 4) BEGIN REPLACE_EVALUATE ~^FLAILMORNINGSTAR\([ %TAB%]+\)100\([ %TAB%]+.+\)$~ BEGIN SPRINT line_flai "FLAIL%MATCH1%98%MATCH2%" END "%line_halb%" REPLACE_EVALUATE ~^\(SPEAR[ %TAB%]+\)98\([ %TAB%]+.+\)$~ BEGIN SPRINT line_sper "%MATCH1%106%MATCH2%" END "%line_flai%" END ELSE BEGIN REPLACE_EVALUATE ~^100\([ %TAB%]+\)FLAILMORNINGSTAR\([ %TAB%]+.+\)$~ BEGIN SPRINT line_flai "98%MATCH1%FLAIL%MATCH2%" END "%line_halb%" REPLACE_EVALUATE ~^98\([ %TAB%]+\)SPEAR\([ %TAB%]+.+\)$~ BEGIN SPRINT line_sper "106%MATCH1%SPEAR%MATCH2%" END "%line_flai%" END REPLACE_TEXTUALLY ~^106[ %TAB%]+DART[ %TAB]+.+$~ ~%line_sper%~ REPLACE_TEXTUALLY ~^DART[ %TAB%]+106[ %TAB]+.+$~ ~%line_sper%~ PATCH_IF (col_start = 4) BEGIN REPLACE_EVALUATE ~^\(CLUB[ %TAB%]+\)115\([ %TAB%]+.+\)$~ BEGIN SPRINT line_club "%MATCH1%96%MATCH2%" END "%MATCH1%115%MATCH2%" REPLACE_EVALUATE ~^\(EXTRAPROFICIENCY1[ %TAB%]+\)115\([ %TAB%]+.+\)$~ BEGIN SPRINT line_club "%MATCH1%96%MATCH2%" END "%MATCH1%115%MATCH2%" REPLACE_EVALUATE ~^\(DAGGER[ %TAB%]+\)96\([ %TAB%]+.+\)$~ BEGIN SPRINT line_dagg "%MATCH1%115%MATCH2%" END "%line_club%" END ELSE BEGIN REPLACE_EVALUATE ~^115\([ %TAB%]+\)CLUB\([ %TAB%]+.+\)$~ BEGIN SPRINT line_club "96%MATCH1%CLUB%MATCH2%" END "96%MATCH1%CLUB%MATCH2%" REPLACE_EVALUATE ~^115\([ %TAB%]+\)EXTRAPROFICIENCY1\([ %TAB%]+.+\)$~ BEGIN SPRINT line_club "96%MATCH1%EXTRAPROFICIENCY1%MATCH2%" END "96%MATCH1%EXTRAPROFICIENCY1%MATCH2%" REPLACE_EVALUATE ~^96\([ %TAB%]+\)DAGGER\([ %TAB%]+.+\)$~ BEGIN SPRINT line_dagg "115%MATCH1%DAGGER%MATCH2%" END "%line_club%" END REPLACE_TEXTUALLY ~^115[ %TAB%]+\(CLUB\|EXTRAPROFICIENCY1\)\([ %TAB%]+.+\)$~ ~%line_dagg%~ REPLACE_TEXTUALLY ~^\(CLUB\|EXTRAPROFICIENCY1\)[ %TAB%]+115\([ %TAB%]+.+\)$~ ~%line_dagg%~ PATCH_IF (col_start = 4) BEGIN REPLACE_EVALUATE ~^\(MACE[ %TAB%]+\)101\([ %TAB%]+.+\)$~ BEGIN SPRINT line_mace "%MATCH1%103%MATCH2%" END "%MATCH1%101%MATCH2%" REPLACE_EVALUATE ~^\(CROSSBOW[ %TAB%]+\)103\([ %TAB%]+.+\)$~ BEGIN SPRINT line_xbow "%MATCH1%97%MATCH2%" END "%line_mace%" REPLACE_EVALUATE ~^\(WARHAMMER[ %TAB%]+\)97\([ %TAB%]+.+\)$~ BEGIN SPRINT line_hamm "%MATCH1%101%MATCH2%" END "%line_xbow%" END ELSE BEGIN REPLACE_EVALUATE ~^101\([ %TAB%]+\)MACE\([ %TAB%]+.+\)$~ BEGIN SPRINT line_mace "103%MATCH1%MACE%MATCH2%" END "101%MATCH1%MACE%MATCH2%" REPLACE_EVALUATE ~^103\([ %TAB%]+\)CROSSBOW\([ %TAB%]+.+\)$~ BEGIN SPRINT line_xbow "97%MATCH1%CROSSBOW%MATCH2%" END "%line_mace%" REPLACE_EVALUATE ~^97\([ %TAB%]+\)WARHAMMER\([ %TAB%]+.+\)$~ BEGIN SPRINT line_hamm "101%MATCH1%WARHAMMER%MATCH2%" END "%line_xbow%" END REPLACE_TEXTUALLY ~^101[ %TAB%]+MACE\([ %TAB%]+.+\)$~ ~%line_hamm%~ REPLACE_TEXTUALLY ~^MACE[ %TAB%]+101\([ %TAB%]+.+\)$~ ~%line_hamm%~ REPLACE_TEXTUALLY ~^105[ %TAB%]+SHORTBOW\([ %TAB%]+.+\)$~ ~%line_sswd%~ REPLACE_TEXTUALLY ~^SHORTBOW[ %TAB%]+105\([ %TAB%]+.+\)$~ ~%line_sswd%~ REPLACE_TEXTUALLY ~^94[ %TAB%]+KATANA\([ %TAB%]+.+\)$~ ~%line_axe%~ REPLACE_TEXTUALLY ~^KATANA[ %TAB%]+94\([ %TAB%]+.+\)$~ ~%line_axe%~ // final touchups to get descripts and row names correct SET_2DA_ENTRY (skip_rows + 7) label_col col_num BOW // bow ref SET_2DA_ENTRY (skip_rows + 12) label_col col_num GREAT_SWORD // great sword ref SET_2DA_ENTRY (skip_rows + 15) label_col col_num LARGE_SWORD // large sword ref SET_2DA_ENTRY (skip_rows + 17) label_col col_num MISSILE // missile ref PATCH_IF (tb#tutu_realloc_style = 1) BEGIN // eliminate weapon styles FOR (row = (skip_rows + 21) ; row < (skip_rows + 25) ; ++row) BEGIN SET_2DA_ENTRY row label_col col_num UNUSED // ref END END FOR (row = (skip_rows + 1) ; row < (skip_rows + 6) ; ++row) BEGIN // eliminate first six profs SET_2DA_ENTRY row label_col col_num UNUSED // ref END PATCH_IF (col_start = 4) BEGIN // descript updates only needed for weapprof SET_2DA_ENTRY 15 2 col_num 8733 // bow name SET_2DA_ENTRY 15 3 col_num 9591 // bow descript SET_2DA_ENTRY 20 2 col_num cd_prof_name // great sword name SET_2DA_ENTRY 20 3 col_num cd_prof_descript // great sword descript REPLACE ~cd_prof_name~ @216301 REPLACE ~cd_prof_descript~ @216302 SET_2DA_ENTRY 23 2 col_num 8668 // large sword name SET_2DA_ENTRY 23 3 col_num cd_prof_descript // large sword descript REPLACE ~cd_prof_descript~ @216303 SET_2DA_ENTRY 25 2 col_num 9403 // missile name SET_2DA_ENTRY 25 3 col_num cd_prof_descript // missile descript REPLACE ~cd_prof_descript~ @216304 SET_2DA_ENTRY 24 2 col_num cd_prof_name // mace name SET_2DA_ENTRY 24 3 col_num cd_prof_descript // mace descript REPLACE ~cd_prof_name~ @216011 REPLACE ~cd_prof_descript~ @216005 SET_2DA_ENTRY 19 2 col_num 6704 // flail name SET_2DA_ENTRY 19 3 col_num cd_prof_descript // flail descript REPLACE ~cd_prof_descript~ @216004 PATCH_IF (tb#tutu_realloc_style = 1) BEGIN // eliminate weapon styles FOR (row = 29 ; row < 33 ; ++row) BEGIN SET_2DA_ENTRY row 2 col_num 0 // name SET_2DA_ENTRY row 3 col_num 0 // descript END END FOR (row = 9 ; row < 14 ; ++row) BEGIN // eliminate first six profs SET_2DA_ENTRY row 2 col_num 0 // name SET_2DA_ENTRY row 3 col_num 0 // descript END END REPLACE_TEXTUALLY ~CD_DELETE_ME~ ~~ PRETTY_PRINT_2DA BUT_ONLY END END COPY_EXISTING ~stats.ids~ ~override~ REPLACE_TEXTUALLY ~^\(89\|90\|91\|92\|93\)[ %TAB%]+.+$~ ~\1 UNUSEDPROF\1~ REPLACE_TEXTUALLY ~^\(94[ %TAB%]+\).+$~ ~\1PROFICIENCYAXE~ REPLACE_TEXTUALLY ~^\(95[ %TAB%]+\).+$~ ~\1PROFICIENCYBOW~ REPLACE_TEXTUALLY ~^\(96[ %TAB%]+\).+$~ ~\1PROFICIENCYCLUB~ REPLACE_TEXTUALLY ~^\(97[ %TAB%]+\).+$~ ~\1PROFICIENCYCROSSBOW~ REPLACE_TEXTUALLY ~^\(98[ %TAB%]+\).+$~ ~\1PROFICIENCYFLAIL~ REPLACE_TEXTUALLY ~^\(99[ %TAB%]+\).+$~ ~\1PROFICIENCYGREAT_SWORD~ REPLACE_TEXTUALLY ~^\(100[ %TAB%]+\).+$~ ~\1PROFICIENCYHALBERD~ REPLACE_TEXTUALLY ~^\(101[ %TAB%]+\).+$~ ~\1PROFICIENCYWARHAMMER~ REPLACE_TEXTUALLY ~^\(102[ %TAB%]+\).+$~ ~\1PROFICIENCYLARGE_SWORD~ REPLACE_TEXTUALLY ~^\(103[ %TAB%]+\).+$~ ~\1PROFICIENCYMACE~ REPLACE_TEXTUALLY ~^\(104[ %TAB%]+\).+$~ ~\1PROFICIENCYMISSILE~ REPLACE_TEXTUALLY ~^\(105[ %TAB%]+\).+$~ ~\1PROFICIENCYSHORT_SWORD~ REPLACE_TEXTUALLY ~^\(106[ %TAB%]+\).+$~ ~\1PROFICIENCYSPEAR~ REPLACE_TEXTUALLY ~^\(107[ %TAB%]+\).+$~ ~\1PROFICIENCYQUARTERSTAFF~ REPLACE_TEXTUALLY ~^\(115[ %TAB%]+\).+$~ ~\1PROFICIENCYDAGGER~ // for old ids references, add dupe entries // extra append of new name is extraneous but makes compile/decompile easier APPEND ~stats.ids~ ~95 PROFICIENCYLONGBOW 95 PROFICIENCYSHORTBOW 95 PROFICIENCYBOW 96 EXTRAPROFICIENCY1 96 PROFICIENCYBOW 98 PROFICIENCYFLAILMORNINGSTAR 98 PROFICIENCYFLAIL 99 PROFICIENCYBASTARDSWORD 99 PROFICIENCYTWOHANDEDSWORD 99 PROFICIENCYGREAT_SWORD 102 PROFICIENCYKATANA 102 PROFICIENCYLONGSWORD 102 PROFICIENCYSCIMITARWAKISASHININJATO 102 PROFICIENCYLARGE_SWORD 104 PROFICIENCYDART 104 PROFICIENCYSLING 104 PROFICIENCYMISSILE 105 PROFICIENCYSHORTSWORD 105 PROFICIENCYSHORT_SWORD~ // adjust joinable NPCs who lose total pips when profs combine INCLUDE ~cdtweaks/lib/profs_common3.tpa~