ffx/battle.py
2024-03-29 11:04:29 +00:00

343 lines
9.7 KiB
Python

import math, random
deduct = 0
# attacker stats
attack = 10 # this can range from 0 to 255
magic = 255 # likewise
dmcon = 0 # set according to command
movetype = 0 # likewise
element = 0
command = "cure"
attackcheer = 0
attackfocus = 0
strengthplus = 0
magicplus = 0
piercing = False
powerbreak = False
celestial = False
name = "tidus"
hp = 9999
maxhp = 9999
bdl = True
mp = 999
maxmp = 999
magicbooster = False
accuracy = 3
skillaccuracy = 98
attackertype = "person"
attackluck = 3
# defender stats
defence = 34
magicdefence = 1
armour = False
armourbreak = False
mentalbreak = False
defend = False
protect = False
shell = False
defenceplus = 0
mdefenceplus = 0
defencecheer = 0
defencefocus = 5
evasion = 3
defendertype = "monster"
defenceluck = 3
fireeffect = "normal"
lightningeffect = "half"
watereffect = "vuln"
iceeffect = "absorb"
holyeffect = "normal"
defenderhp = 20000
# damage constant
if command == "attack":
dmcon = 16
movetype = "physical"
elif command == "cure":
dmcon = 24
movetype = "heal"
elif command == "cura":
dmcon = 40
movetype = "heal"
elif command == "curaga":
dmcon = 80
movetype = "heal"
elif command == "blizzard":
dmcon = 12
movetype = "magic"
element = "ice"
elif command == "thunder":
dmcon = 12
movetype = "magic"
element = "lightning"
elif command == "water":
dmcon = 12
movetype = "magic"
element = "water"
elif command == "fire":
dmcon = 12
movetype = "magic"
element = "fire"
elif command == "fira":
dmcon = 24
movetype = "magic"
element = "fire"
elif command == "blizzara":
dmcon = 24
movetype = "magic"
element = "ice"
elif command == "thundara":
dmcon = 24
movetype = "magic"
element = "lightning"
elif command == "watera":
dmcon = 24
movetype = "magic"
element = "water"
elif command == "firaga":
dmcon = 42
movetype = "magic"
element = "fire"
elif command == "blizzaga":
dmcon = 42
movetype = "magic"
element = "ice"
elif command == "waterga":
dmcon = 42
movetype = "magic"
element = "water"
elif command == "thundaga":
dmcon = 42
movetype = "magic"
element = "lightning"
elif command == "drain":
dmcon = 20
movetype = "physical" # presumably?
elif command == "osmose":
dmcon = 10
movetype = "magic"
elif command == "flare":
dmcon = 60
movetype = "magic"
elif command == "ultima":
dmcon = 70
movetype = "magic"
elif command == "holy":
dmcon = 100
movetype = "magic"
element = "holy"
# calculate damage
basedamage = math.floor((math.floor(((attack + attackcheer) ** 3) / 32) + 32) * math.floor(dmcon / 16))
if basedamage > 99999:
basedamage = 99999
defnum = math.floor(math.floor(((math.ceil(defence - 280.4)) ** 2) / 110) + 16)
damage = math.floor(basedamage * defnum / 730)
# now do modifiers
if strengthplus > 0:
damage = damage + (math.floor(damage * strengthplus / 100))
if armour == True:
if armourbreak == False and piercing == False:
damage = math.floor(damage / 3)
if armourbreak == True:
defence = 0
if defend == True:
damage = math.floor(damage / 2)
if protect == True:
damage = math.floor(damage / 2)
if powerbreak == True:
damage = math.floor(damage / 2)
if defenceplus > 0:
damage = damage - (math.floor(damage * defenceplus / 100))
if defencecheer > 0:
damage = math.ceil(damage * (15 - defencecheer) / 15)
if celestial == True:
defence = 0
if name == "tidus" or name == "wakka" or name == "kimahri" or name == "rikku":
damage = math.floor(damage * ((10 + (100 * hp / maxhp)) / 110))
elif name == "yuna" or name == "lulu":
damage = math.floor(damage * ((10 + (100 * mp / maxmp)) / 110))
elif name == "auron":
damage = math.floor(damage * ((130 - (100 * hp / maxhp)) / 60))
# now apply the defence stat i guess?
finaldamage = math.floor(damage * (730 - math.floor(((defence * 51) - math.floor((defence ** 2) / 11)) / 10)) / 730)
if element == "fire" and fireeffect == "half":
finaldamage = math.floor(finaldamage / 2)
elif element == "fire" and fireeffect == "vuln":
finaldamage = finaldamage + math.floor(finaldamage / 2)
elif element == "fire" and fireeffect == "absorb":
finaldamage = finaldamage * -1
if element == "water" and watereffect == "half":
finaldamage = math.floor(finaldamage / 2)
elif element == "water" and watereffect == "vuln":
finaldamage = finaldamage + math.floor(finaldamage / 2)
elif element == "water" and watereffect == "absorb":
finaldamage = finaldamage * -1
if element == "lightning" and lightningeffect == "half":
finaldamage = math.floor(finaldamage / 2)
elif element == "lightning" and lightningeffect == "vuln":
finaldamage = finaldamage + math.floor(finaldamage / 2)
elif element == "lightning" and lightningeffect == "absorb":
finaldamage = finaldamage * -1
if element == "ice" and iceeffect == "half":
finaldamage = math.floor(finaldamage / 2)
elif element == "ice" and iceeffect == "vuln":
finaldamage = finaldamage + math.floor(finaldamage / 2)
elif element == "ice" and iceeffect == "absorb":
finaldamage = finaldamage * -1
if element == "holy" and holyeffect == "half":
finaldamage = math.floor(finaldamage / 2)
elif element == "holy" and holyeffect == "vuln":
finaldamage = finaldamage + math.floor(finaldamage / 2)
elif element == "holy" and holyeffect == "absorb":
finaldamage = finaldamage * -1
if finaldamage > 99999:
finaldamage = 99999
if bdl == False and finaldamage > 9999:
finaldamage = 9999
if finaldamage < -99999:
finaldamage = -99999
if bdl == False and finaldamage < -9999:
finaldamage = -9999
if movetype == "physical":
print("Physical damage: " + str(finaldamage))
deduct = finaldamage
# magic damage and healing
if movetype == "heal":
magicbasedamage = dmcon * math.floor((magic + attackfocus + dmcon) / 2)
else:
magicbasedamage = math.floor(dmcon * (math.floor(((magic + attackfocus) ** 2) / 6) + dmcon) / 4)
if magicbasedamage > 99999:
magicbasedamage = 99999
mdefnum = math.floor(math.floor((((magicdefence - 280.4)) ** 2) / 110) + 16)
magicdamage = math.floor(magicbasedamage * mdefnum / 730)
# magic modifiers
if magicbooster == True:
magicdamage = magicdamage + math.floor(magicdamage / 2)
if magicplus > 0:
magicdamage = magicdamage + (math.floor(magicdamage * magicplus / 100))
if mentalbreak == True:
magicdamage = math.floor(magicdamage / 2)
magicdefence = 0
if shell == True:
magicdamage = math.floor(magicdamage / 2)
if mdefenceplus > 0:
magicdamage = magicdamage - (math.floor(magicdamage * mdefenceplus / 100))
if defencefocus > 0:
magicdamage = math.ceil(magicdamage * (15 - defencefocus) / 15)
# magic defence
if movetype == "heal": # i assume this isn't affected by mdef
print("HP healed: " + str(magicdamage))
deduct = -1 * magicdamage
else:
finalmdamage = math.floor(magicdamage * (730 - math.floor(((magicdefence * 51) - math.floor((magicdefence ** 2) / 11)) / 10)) / 730)
if element == "fire" and fireeffect == "half":
finalmdamage = math.floor(finalmdamage / 2)
elif element == "fire" and fireeffect == "vuln":
finalmdamage = finalmdamage + math.floor(finalmdamage / 2)
elif element == "fire" and fireeffect == "absorb":
finalmdamage = finalmdamage * -1
if element == "water" and watereffect == "half":
finalmdamage = math.floor(finalmdamage / 2)
elif element == "water" and watereffect == "vuln":
finalmdamage = finalmdamage + math.floor(finalmdamage / 2)
elif element == "water" and watereffect == "absorb":
finalmdamage = finalmdamage * -1
if element == "lightning" and lightningeffect == "half":
finalmdamage = math.floor(finalmdamage / 2)
elif element == "lightning" and lightningeffect == "vuln":
finalmdamage = finalmdamage + math.floor(finalmdamage / 2)
elif element == "lightning" and lightningeffect == "absorb":
finalmdamage = finalmdamage * -1
if element == "ice" and iceeffect == "half":
finalmdamage = math.floor(finalmdamage / 2)
elif element == "ice" and iceeffect == "vuln":
finalmdamage = finalmdamage + math.floor(finalmdamage / 2)
elif element == "ice" and iceeffect == "absorb":
finalmdamage = finalmdamage * -1
if element == "holy" and holyeffect == "half":
finalmdamage = math.floor(finalmdamage / 2)
elif element == "holy" and holyeffect == "vuln":
finalmdamage = finalmdamage + math.floor(finalmdamage / 2)
elif element == "holy" and holyeffect == "absorb":
finalmdamage = finalmdamage * -1
if finalmdamage > 99999:
finalmdamage = 99999
if bdl == False and finalmdamage > 9999:
finalmdamage = 9999
if finalmdamage < -99999:
finalmdamage = -99999
if bdl == False and finalmdamage < -9999:
finalmdamage = -9999
if movetype == "magic":
print("Magic damage: " + str(finalmdamage))
deduct = finalmdamage
if attackertype == "person":
acnum = accuracy * 0.4 - evasion + 9
if acnum <= 0:
accent = 25
elif acnum < 2.5: # depends on when these are rounded?
accent = 30
elif acnum < 4.5:
accent = 40
elif acnum < 5.5:
accent = 50
elif acnum < 6.5:
accent = 60
elif acnum < 7.5:
accent = 80
else:
accent = 100
elif attackertype == "monster":
accent = skillaccuracy - evasion
hit = accent + attackluck - defenceluck
prohibit = random.randint(0,100)
if movetype != "heal":
if prohibit > hit:
print("Attack failed")
else:
print("Attack succeeded")
defenderhp = defenderhp - deduct
if defenderhp < 1:
print("KO")
else:
print("Target HP: " + str(defenderhp))