The following (experimental!) code should universalize all the weapons under the sun.
COPY_EXISTING_REGEXP ~.*\.itm~ ~override~
READ_SHORT "0x1c" "type"
READ_BYTE "0x1e" "usab1"
READ_BYTE "0x1f" "usab2"
READ_BYTE "0x20" "usab3"
READ_BYTE "0x21" "usab4"
READ_BYTE "0x26" "stre"
READ_BYTE "0x29" "ukit1"
READ_BYTE "0x2b" "ukit2"
READ_BYTE "0x2d" "ukit3"
READ_BYTE "0x2f" "ukit4"
READ_BYTE "0x31" "weapprof"
READ_BYTE "0x2c" "dex"
SET "patchdone" = "0"
//bastard swords
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h59")) BEGIN
// Haven't already checked (=no real meaning) AND usable by fighter (so no tricky weapon like SOTM) AND is a long sword
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111") //alignment restrictions are left because they make sense roleplay-wise
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111") //as do racial limitations
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010") // beast master
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "13" //stre & dex
WRITE_BYTE "0x2c" "8"
SET "patchdone" = "1"
END
//long swords
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h5a")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "11"
WRITE_BYTE "0x2c" "8"
SET "patchdone" = "1"
END
//short swords
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h5b")) BEGIN
READ_BYTE "0x8c" "bondam"
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "6"
WRITE_BYTE "0x2c" "6"
WRITE_BYTE "0x8x" ("%bondam%" + "1") //base dam of 1d6+1 instead of plain 1d6
SET "patchdone" = "1"
END
//axe
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h5c")) BEGIN
READ_BYTE "0x18" "flag1"
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "13"
WRITE_BYTE "0x2c" "6"
WHILE ((("%flag1%" BAND "0b00000010") = "0b00000010") AND ("%patchdone%" = "0")) BEGIN //weimeric's 2 handed axes aren't good for monks
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10111111")
SET "patchdone" = "1"
END
END
//2h swords
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h5d")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10111111") //monks
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "14"
WRITE_BYTE "0x2c" "8"
SET "patchdone" = "1"
END
//katana
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h5e")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "9"
WRITE_BYTE "0x2c" "13"
SET "patchdone" = "1"
END
//scimitar/W/N
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h5f")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "9"
WRITE_BYTE "0x2c" "9"
SET "patchdone" = "1"
END
//dagger
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h60")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "4"
WRITE_BYTE "0x2c" "4"
//the following code is blatanlty copied/pasted from WeiDU's tutorial about while, provided by Idobek
READ_LONG 0x64 "abilitiesoffset"
READ_SHORT 0x68 "#abilities"
WHILE ("%#abilities%" > 0) BEGIN
READ_BYTE ("%abilitiesoffset%" + ("%#abilities%" - 1) * 0x38) "abilitytype"
SET "patchmelee" = 0
WHILE ("%abilitytype%" = 1)
AND ("%patchmelee%" = 0) BEGIN
WRITE_SHORT ("%abilitiesoffset%" + ("%#abilities%" - 1) * 0x38 + 0x16) 6
WRITE_SHORT ("%abilitiesoffset%" + ("%#abilities%" - 1) * 0x38 + 0x18) 1
SET "patchmelee" = 1
END
SET "patchranged" = 0
WHILE ("%abilitytype%" = 2)
AND ("%patchranged%" = 0) BEGIN
WRITE_SHORT ("%abilitiesoffset%" + ("%#abilities%" - 1) * 0x38 + 0x16) 6
WRITE_SHORT ("%abilitiesoffset%" + ("%#abilities%" - 1) * 0x38 + 0x18) 1
SET "patchranged" = 1
END
SET "#abilities" = ("%#abilities%" - 1)
END
SET "patchdone" = "1"
END
//war hammer
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h61")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "12"
WRITE_BYTE "0x2c" "6"
WRITE_BYTE 0x8a 01
WRITE_BYTE 0x88 06
SET "patchdone" = "1"
END
//spear
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h62")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10111111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "7"
WRITE_BYTE "0x2c" "6"
WRITE_BYTE 0x8a 01
WRITE_BYTE 0x88 08
SET "patchdone" = "1"
END
//halberd
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h63")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10111111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "10"
WRITE_BYTE "0x2c" "6"
SET "patchdone" = "1"
END
//flail/morningstar
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h64")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "10"
WRITE_BYTE "0x2c" "12"
SET "patchdone" = "1"
END
//mace
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h65")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000010")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "12"
WRITE_BYTE "0x2c" "6"
SET "patchdone" = "1"
END
//quarterstaff
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h66")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10111111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000000")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "4"
WRITE_BYTE "0x2c" "4"
SET "patchdone" = "1"
END
//crossbow
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h67")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10111111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000000")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00001100") // kensai & cavalier
WRITE_BYTE "0x26" "10"
WRITE_BYTE "0x2c" "10"
SET "patchdone" = "1"
END
//long bow
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h68")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10111111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000000")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00001100")
WRITE_BYTE "0x26" "14"
WRITE_BYTE "0x2c" "11"
SET "patchdone" = "1"
END
//short bow
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h69")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10111111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000000")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00001100")
WRITE_BYTE "0x26" "12"
WRITE_BYTE "0x2c" "11"
SET "patchdone" = "1"
END
//darts
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h6a")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000000")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00001100")
WRITE_BYTE "0x26" "5"
WRITE_BYTE "0x2c" "10"
SET "patchdone" = "1"
END
//sling
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h6b")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000000")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00001100")
WRITE_BYTE "0x26" "5"
WRITE_BYTE "0x2c" "11"
SET "patchdone" = "1"
END
//club
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0h73")) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000000")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
WRITE_BYTE "0x26" "8"
WRITE_BYTE "0x2c" "6"
SET "patchdone" = "1"
END
//bullets, arrows, bolts
WHILE ((("%patchdone%"<"2") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND (("%type%" = "0h15") OR ("%type%" = "0h0e"))) BEGIN
WRITE_BYTE "0x1e" ("%usab1%" BAND "0b00111111")
WRITE_BYTE "0x1f" ("%usab2%" BAND "0b00000000")
WRITE_BYTE "0x20" ("%usab3%" BAND "0b10000000")
WRITE_BYTE "0x21" ("%usab4%" BAND "0b10011111")
WRITE_BYTE "0x29" ("%ukit1%" BAND "0b00000000")
WRITE_BYTE "0x2b" ("%ukit2%" BAND "0b00000000")
WRITE_BYTE "0x2d" ("%ukit3%" BAND "0b00000000")
WRITE_BYTE "0x2f" ("%ukit4%" BAND "0b00000000")
// cavalier, kensai, monk & any stats can use, because they still won't use the main weapons, and it helps with inventory Micro-Managing
SET "patchdone" = "2"
END
BUT_ONLY_IF_IT_CHANGES
known problems:
1) It won't write your own descriptions, but leave BW's one
2) Composite/long bow, Heavy/LT crossbow, thrown/melee Daggers/axes, flails/morning stars don't get different Stre/dex requirements. It can be done, I suppose,with some trickier WHILE loops and READ_BYTE actions.
3) remember to check for dumb typ0s!
4) copy over the thrownable spears
Benefit:
1) It modifies EVERY weapon in the game (even modded ones, as long as AoE is installed after, universalizing it.
Benefit or problem, depending on how you see it:
1) doesn't remove racial or alignment resctrictions.
Dumb problems that *should* be allright:
1) NPC-only weapons restrictions won't become universalized
2) class specific weapons still remain as such
how? I modify only weapons that are open to standard warrior.
this code was written by Valerio Bigiani, aka The Bigg, with the help of the IESDP's knowledge, and the steal..borrowing of some pieces of code from the tutorials in the WeiDU readme
If it doesn't work, there are good chances I won't be able of tracking errors, as this is my first attempt at TP2, and I've not been able of installing Ghrey's tutorial NPC...