Posted by: the bigg
« on: May 14, 2004, 02:17:31 PM »Ok, after slapping my code into the main tp2 for AoE and banging my head on a loop and some typ0s, here's the working code.
On my PC (2000MHz... or was it GHz? don't remember which ) this step takes about twenty seconds... It may be worthwile to write a line like "this step may take a few moments...".
On my PC (2000MHz... or was it GHz? don't remember which ) this step takes about twenty seconds... It may be worthwile to write a line like "this step may take a few moments...".
Code: [Select]
COPY_EXISTING_REGEXP GLOB ~.*\.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%" = "0x59")) BEGIN
// 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%" = "0x5a")) 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%" = "0x5b")) 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 "0x8c" ("%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%" = "0x5c")) 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%" BOR "0b00100000")
SET "patchdone" = "1"
END
SET "patchdone" = "1"
END
//2h swords
WHILE ((("%patchdone%"="0") AND (("%usab2%" BAND "0b00001000") = "0b00000000")) AND ("%weapprof%" = "0x5d")) 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%" = "0x5e")) 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%" = "0x5f")) 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%" = "0x60")) 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 cpoied/pasted, with permission, 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%" = "0x61")) 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%" = "0x62")) 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%" = "0x63")) 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%" = "0x64")) 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%" = "0x65")) 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%" = "0x66")) 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%" = "0x67")) 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%" = "0x68")) 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%" = "0x69")) 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%" = "0x6a")) 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%" = "0x6b")) 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%" = "0x73")) 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%" = "0x0005") OR ("%type%" = "0x000e")OR ("%type%" = "0x001f"))) 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