343 lines
9.7 KiB
Python
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))
|