133 lines
5.2 KiB
Python
133 lines
5.2 KiB
Python
|
import json
|
||
|
import math
|
||
|
from collections import defaultdict
|
||
|
|
||
|
def GetName(charaData):
|
||
|
name = "no name"
|
||
|
if charaData is not None:
|
||
|
if charaData["nameEn"] != "":
|
||
|
name = charaData["nameEn"]
|
||
|
elif charaData["name"] != "":
|
||
|
name = charaData["name"]
|
||
|
if charaData["nickname"] != "":
|
||
|
name += " " + charaData["nickname"]
|
||
|
return name
|
||
|
|
||
|
def GetAttackBase(alphaBase, level):
|
||
|
if level <= alphaBase["atkLvMiddleNum"]:
|
||
|
t = (level - 1) / (alphaBase["atkLvMiddleNum"]-1)
|
||
|
return lerp(alphaBase["atkParamLv1"], alphaBase["atkParamLvMiddle"], t)
|
||
|
else:
|
||
|
t = (level - alphaBase["atkLvMiddleNum"]) / (99 - alphaBase["atkLvMiddleNum"])
|
||
|
return lerp(alphaBase["atkParamLvMiddle"], alphaBase["atkParamLv99"], t)
|
||
|
|
||
|
def GetDefenseBase(alphaBase, level):
|
||
|
if level <= alphaBase["defLvMiddleNum"]:
|
||
|
t = (level - 1) / (alphaBase["defLvMiddleNum"]-1)
|
||
|
return lerp(alphaBase["defParamLv1"], alphaBase["defParamLvMiddle"], t)
|
||
|
else:
|
||
|
t = (level - alphaBase["defLvMiddleNum"]) / (99 - alphaBase["defLvMiddleNum"])
|
||
|
return lerp(alphaBase["defParamLvMiddle"], alphaBase["defParamLv99"], t)
|
||
|
|
||
|
def GetHealthBase(alphaBase, level):
|
||
|
if level <= alphaBase["hpLvMiddleNum"]:
|
||
|
t = (level - 1) / (alphaBase["hpLvMiddleNum"]-1)
|
||
|
return lerp(alphaBase["hpParamLv1"], alphaBase["hpParamLvMiddle"], t)
|
||
|
else:
|
||
|
t = (level - alphaBase["hpLvMiddleNum"]) / (99 - alphaBase["hpLvMiddleNum"])
|
||
|
return lerp(alphaBase["hpParamLvMiddle"], alphaBase["hpParamLv99"], t)
|
||
|
|
||
|
def get_all_stats(chara, alphaBase, max_level: bool, rising_status_pattern):
|
||
|
level = 99 if max_level else 1
|
||
|
|
||
|
hp = GetHealthBase(alphaBase, level)
|
||
|
atk = GetAttackBase(alphaBase, level)
|
||
|
defe = GetDefenseBase(alphaBase, level)
|
||
|
|
||
|
if max_level:
|
||
|
starBoost = 1 + (chara["rankHigh"] - 1) * 0.02
|
||
|
hp = int(math.ceil((hp + chara["promoteBonus"]["hp"]) * starBoost) + chara["costumeBonus"]["hp"])
|
||
|
atk = int(math.ceil((atk + chara["promoteBonus"]["atk"]) * starBoost) + chara["costumeBonus"]["atk"])
|
||
|
defe = int(math.ceil((defe + chara["promoteBonus"]["def"]) * starBoost) + chara["costumeBonus"]["def"])
|
||
|
evd = 10 * alphaBase["avoidRatio"] + chara["promoteBonus"]["evd"]
|
||
|
beatBonus = chara["promoteBonus"]["beat"] / 10
|
||
|
actBonus = chara["promoteBonus"]["act"] / 10
|
||
|
tryBonus = chara["promoteBonus"]["try"] / 10
|
||
|
|
||
|
if rising_status_pattern is not None:
|
||
|
for i in range(51):
|
||
|
hp += rising_status_pattern["hp"]
|
||
|
atk += rising_status_pattern["atk"]
|
||
|
defe += rising_status_pattern["def"]
|
||
|
else:
|
||
|
starBoost = 1 + (chara["rankLow"] - 1) * 0.02
|
||
|
hp = int(math.ceil(hp * starBoost))
|
||
|
atk = int(math.ceil(atk * starBoost))
|
||
|
defe = int(math.ceil(defe * starBoost))
|
||
|
evd = 10 * alphaBase["avoidRatio"]
|
||
|
beatBonus = 0
|
||
|
actBonus = 0
|
||
|
tryBonus = 0
|
||
|
|
||
|
|
||
|
status = hp * 8 / 10
|
||
|
if hp * 8 % 10 > 0:
|
||
|
status += 1
|
||
|
status += atk * 3 + defe * 2
|
||
|
|
||
|
result = {
|
||
|
"level" : level,
|
||
|
"status" : int(status),
|
||
|
"wr" : chara["rankHigh"] if max_level else chara["rankLow"],
|
||
|
"hp" : hp,
|
||
|
"atk" : atk,
|
||
|
"def" : defe,
|
||
|
"evd" : evd,
|
||
|
"beat" : beatBonus,
|
||
|
"act" : actBonus,
|
||
|
"try" : tryBonus,
|
||
|
}
|
||
|
|
||
|
return result
|
||
|
|
||
|
def fill_miracle_numbers(chara):
|
||
|
output = []
|
||
|
damages = {}
|
||
|
buffs = defaultdict(list)
|
||
|
|
||
|
for i, damage_param in enumerate(chara["arts"]["damageList"]):
|
||
|
damages[f"[DAMAGE{i}]"] = damage_param
|
||
|
|
||
|
for i, buff_param in enumerate(chara["arts"]["buffList"]):
|
||
|
buffs[f"[BUFF{i}]"].append(buff_param)
|
||
|
buffs[f"[HEAL{i}]"].append(buff_param)
|
||
|
buffs[f"[INCREMENT{i}]"].append(buff_param)
|
||
|
|
||
|
for i in range(1, 7):
|
||
|
base_text = chara["arts"]["actionEffect"]
|
||
|
for damage_key, damage_value in damages.items():
|
||
|
new_value = str(int(damage_value["damageRate"] * (1 + damage_value["growthRate"] * (i - 1)) * 100 + 0.01))
|
||
|
base_text = base_text.replace(damage_key, new_value)
|
||
|
|
||
|
for buff_key, buff_value_list in buffs.items():
|
||
|
buff_value = buff_value_list[0]
|
||
|
if buff_key[1] == 'B':
|
||
|
new_value = str(int(abs(buff_value["coefficient"] * (1 + buff_value["growthRate"] * (i - 1)) - 1) * 100 + 0.01))
|
||
|
base_text = base_text.replace(buff_key, new_value)
|
||
|
elif buff_key[1] == 'H':
|
||
|
new_value = str(int(buff_value["coefficient"] * (1 + buff_value["growthRate"] * (i - 1)) * 100 + 0.01))
|
||
|
base_text = base_text.replace(buff_key, new_value)
|
||
|
elif buff_key[1] == 'I':
|
||
|
new_value = str(int(abs(buff_value["increment"]) * (1 + buff_value["growthRate"] * (i - 1)) + 0.01))
|
||
|
base_text = base_text.replace(buff_key, new_value)
|
||
|
|
||
|
output.append(base_text)
|
||
|
|
||
|
return output
|
||
|
|
||
|
def toJSON(chara):
|
||
|
return json.dumps(chara, default=lambda o: o.__dict__,
|
||
|
sort_keys=True, indent=1, ensure_ascii=False)
|
||
|
|
||
|
def lerp(a, b, t):
|
||
|
return (1 - t) * a + t * b
|