weapons, classes, infusions done
This commit is contained in:
parent
3aebfb43a1
commit
0c57b8ccef
3 changed files with 200 additions and 8 deletions
15
README.md
15
README.md
|
@ -7,14 +7,23 @@
|
||||||
1. [UXM](https://cdn.discordapp.com/attachments/529900741998149643/949045219175825448/UXM_2.4.ER_EldenRingQuickhack.zip) to extract the game files.
|
1. [UXM](https://cdn.discordapp.com/attachments/529900741998149643/949045219175825448/UXM_2.4.ER_EldenRingQuickhack.zip) to extract the game files.
|
||||||
2. [Yapped (Rune Bear)](https://github.com/vawser/Yapped-Rune-Bear) for converting regulation to `.csv`.
|
2. [Yapped (Rune Bear)](https://github.com/vawser/Yapped-Rune-Bear) for converting regulation to `.csv`.
|
||||||
|
|
||||||
|
## Required Files
|
||||||
|
|
||||||
|
- `CharaInitParam.csv`
|
||||||
|
- `EquipParamAccessory.csv`
|
||||||
|
- `EquipParamProtector.csv`
|
||||||
|
- `EquipParamWeapon.csv`
|
||||||
|
- `ReinforceWeaponParam.csv`
|
||||||
|
- `SpEffectParam.csv`
|
||||||
|
|
||||||
## Param Categories
|
## Param Categories
|
||||||
|
|
||||||
### Armor
|
### Armor
|
||||||
|
|
||||||
- Weight: `EquipParamProtector.csv`
|
- Weight: `EquipParamProtector.csv`
|
||||||
- Poise: `EquipParamProtector.csv` - in-game poise value is (poise \* 1000)
|
- Poise: `EquipParamProtector.csv` - in-game poise value is $(poise \cdot 1000)$
|
||||||
- Resistance: `EquipParamProtector.csv`
|
- Resistance: `EquipParamProtector.csv`
|
||||||
- Defenses: `EquipParamProtector.csv` - defense is (1 - absorption) \* 100
|
- Defenses: `EquipParamProtector.csv` - defense is $(1 - absorption) \cdot 100$
|
||||||
- Stats: ???
|
- Stats: ???
|
||||||
|
|
||||||
### Classes
|
### Classes
|
||||||
|
@ -25,8 +34,8 @@
|
||||||
### Weapons
|
### Weapons
|
||||||
|
|
||||||
- Damage: `EquipParamWeapon.csv`
|
- Damage: `EquipParamWeapon.csv`
|
||||||
- Scaling: `EquipParamWeapon.csv`
|
|
||||||
- Upgrading: `ReinforceParamWeapon.csv`
|
- Upgrading: `ReinforceParamWeapon.csv`
|
||||||
|
- Scaling: `EquipParamWeapon.csv`
|
||||||
- Ash of War: `EquipParamGem.csv`
|
- Ash of War: `EquipParamGem.csv`
|
||||||
|
|
||||||
### Talismans
|
### Talismans
|
||||||
|
|
|
@ -1,22 +1,42 @@
|
||||||
import csv
|
import csv
|
||||||
import json
|
import json
|
||||||
|
from statistics import mean
|
||||||
|
import os
|
||||||
|
|
||||||
from corrections import IGNORED, MISSING, HELMET_STATS
|
from corrections import IGNORED, IGNORED_WEAPON_INFUSIONS, MISSING, HELMET_STATS
|
||||||
|
|
||||||
|
INFUSIONS = [
|
||||||
|
"Standard ",
|
||||||
|
"Heavy ",
|
||||||
|
"Keen ",
|
||||||
|
"Quality ",
|
||||||
|
"Fire ",
|
||||||
|
"Flame Art ",
|
||||||
|
"Lightning ",
|
||||||
|
"Sacred ",
|
||||||
|
"Magic ",
|
||||||
|
"Cold ",
|
||||||
|
"Poison ",
|
||||||
|
"Blood ",
|
||||||
|
"Occult ",
|
||||||
|
]
|
||||||
|
|
||||||
helmets = []
|
helmets = []
|
||||||
chestpieces = []
|
chestpieces = []
|
||||||
gauntlets = []
|
gauntlets = []
|
||||||
leggings = []
|
leggings = []
|
||||||
talismans = []
|
talismans = []
|
||||||
|
classes = []
|
||||||
weapons = []
|
weapons = []
|
||||||
|
infusions = []
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
# armors
|
# armors
|
||||||
with open("input/EquipParamProtector.csv") as af:
|
with open("input/EquipParamProtector.csv") as af:
|
||||||
reader = list(csv.DictReader(af, delimiter=";"))
|
rows = list(csv.DictReader(af, delimiter=";"))
|
||||||
|
|
||||||
for armor in reader:
|
for armor in rows:
|
||||||
if not ignored(armor):
|
if not ignored(armor):
|
||||||
process_armor_piece(armor)
|
process_armor_piece(armor)
|
||||||
|
|
||||||
|
@ -26,12 +46,49 @@ def main():
|
||||||
open("input/SpEffectParam.csv") as ef,
|
open("input/SpEffectParam.csv") as ef,
|
||||||
):
|
):
|
||||||
effects = list(csv.DictReader(ef, delimiter=";"))
|
effects = list(csv.DictReader(ef, delimiter=";"))
|
||||||
reader = list(csv.DictReader(tf, delimiter=";"))
|
rows = list(csv.DictReader(tf, delimiter=";"))
|
||||||
|
|
||||||
for talisman in reader:
|
for talisman in rows:
|
||||||
if not ignored(talisman):
|
if not ignored(talisman):
|
||||||
process_talisman(talisman, effects)
|
process_talisman(talisman, effects)
|
||||||
|
|
||||||
|
# classes
|
||||||
|
with open("input/CharaInitParam.csv", "r") as cf:
|
||||||
|
rows = list(csv.DictReader(cf, delimiter=";"))
|
||||||
|
rows = [row for row in rows if 3000 <= int(row["Row ID"]) <= 3009]
|
||||||
|
|
||||||
|
for row in rows:
|
||||||
|
c = {}
|
||||||
|
c["id"] = to_kebab(row["Row Name"][8:])
|
||||||
|
c["name"] = row["Row Name"][8:]
|
||||||
|
c["level"] = int(row["Level"])
|
||||||
|
c["stats"] = [
|
||||||
|
int(row["Vigor"]),
|
||||||
|
int(row["Attunement"]),
|
||||||
|
int(row["Endurance"]),
|
||||||
|
int(row["Strength"]),
|
||||||
|
int(row["Dexterity"]),
|
||||||
|
int(row["Intelligence"]),
|
||||||
|
int(row["Faith"]),
|
||||||
|
int(row["Arcane"]),
|
||||||
|
]
|
||||||
|
classes.append(c)
|
||||||
|
|
||||||
|
# weapons
|
||||||
|
with open("input/EquipParamWeapon.csv") as wf:
|
||||||
|
rows = list(csv.DictReader(wf, delimiter=";"))
|
||||||
|
rows = [row for row in rows if 1000000 <= int(row["Row ID"]) <= 44010000]
|
||||||
|
|
||||||
|
for row in rows:
|
||||||
|
if not ignored(row):
|
||||||
|
process_weapon(row)
|
||||||
|
|
||||||
|
# infusions
|
||||||
|
with open("input/ReinforceParamWeapon.csv") as inf:
|
||||||
|
rows = list(csv.DictReader(inf, delimiter=";"))
|
||||||
|
|
||||||
|
extract_infusions(rows)
|
||||||
|
|
||||||
# add missing items
|
# add missing items
|
||||||
for h in MISSING["helmets"]:
|
for h in MISSING["helmets"]:
|
||||||
helmets.append(h)
|
helmets.append(h)
|
||||||
|
@ -42,11 +99,20 @@ def main():
|
||||||
for l in MISSING["leggings"]:
|
for l in MISSING["leggings"]:
|
||||||
leggings.append(l)
|
leggings.append(l)
|
||||||
|
|
||||||
|
# mark weapons with no infusions as "unique"
|
||||||
|
for weapon in weapons:
|
||||||
|
if weapon["infusions"] == []:
|
||||||
|
weapon["infusions"] = ["unique"]
|
||||||
|
|
||||||
# sort all files
|
# sort all files
|
||||||
helmets.sort(key=lambda item: item["id"])
|
helmets.sort(key=lambda item: item["id"])
|
||||||
chestpieces.sort(key=lambda item: item["id"])
|
chestpieces.sort(key=lambda item: item["id"])
|
||||||
gauntlets.sort(key=lambda item: item["id"])
|
gauntlets.sort(key=lambda item: item["id"])
|
||||||
leggings.sort(key=lambda item: item["id"])
|
leggings.sort(key=lambda item: item["id"])
|
||||||
|
talismans.sort(key=lambda item: item["id"])
|
||||||
|
classes.sort(key=lambda item: item["id"], reverse=True)
|
||||||
|
weapons.sort(key=lambda item: item["id"])
|
||||||
|
# infusions.sort(key=lambda item: item["id"])
|
||||||
|
|
||||||
# add none cases (no helmet etc.)
|
# add none cases (no helmet etc.)
|
||||||
helmets.insert(0, {"id": "no-helmet", "name": "None"})
|
helmets.insert(0, {"id": "no-helmet", "name": "None"})
|
||||||
|
@ -61,14 +127,24 @@ def main():
|
||||||
open("output/gauntlets.json", "w") as gf,
|
open("output/gauntlets.json", "w") as gf,
|
||||||
open("output/leggings.json", "w") as lf,
|
open("output/leggings.json", "w") as lf,
|
||||||
open("output/talismans.json", "w") as tf,
|
open("output/talismans.json", "w") as tf,
|
||||||
|
open("output/classes.json", "w") as scf,
|
||||||
open("output/weapons.json", "w") as wf,
|
open("output/weapons.json", "w") as wf,
|
||||||
|
open("output/infusions.json", "w") as inf,
|
||||||
):
|
):
|
||||||
json.dump(helmets, hf)
|
json.dump(helmets, hf)
|
||||||
json.dump(chestpieces, cf)
|
json.dump(chestpieces, cf)
|
||||||
json.dump(gauntlets, gf)
|
json.dump(gauntlets, gf)
|
||||||
json.dump(leggings, lf)
|
json.dump(leggings, lf)
|
||||||
json.dump(talismans, tf)
|
json.dump(talismans, tf)
|
||||||
|
json.dump(classes, scf)
|
||||||
json.dump(weapons, wf)
|
json.dump(weapons, wf)
|
||||||
|
json.dump(infusions, inf)
|
||||||
|
|
||||||
|
# format output files with prettier
|
||||||
|
if os.system("prettier output --write") != 0:
|
||||||
|
print(
|
||||||
|
"please install prettier (the code formatting tool) to auto-format the output files after generating"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def ignored(row):
|
def ignored(row):
|
||||||
|
@ -162,4 +238,109 @@ def process_talisman(row, effects):
|
||||||
talismans.append(item)
|
talismans.append(item)
|
||||||
|
|
||||||
|
|
||||||
|
def split_weapon_name(name):
|
||||||
|
infusion = "none"
|
||||||
|
for other in INFUSIONS:
|
||||||
|
if other in name and not to_kebab(name) in IGNORED_WEAPON_INFUSIONS:
|
||||||
|
infusion = other
|
||||||
|
name = name.replace(infusion, "")
|
||||||
|
|
||||||
|
return name.strip().replace(" ", " "), to_kebab(infusion)
|
||||||
|
|
||||||
|
|
||||||
|
def process_weapon(row):
|
||||||
|
name, infusion = split_weapon_name(row["Row Name"])
|
||||||
|
id = to_kebab(name)
|
||||||
|
|
||||||
|
for other in weapons:
|
||||||
|
if other["id"] == id:
|
||||||
|
weapon = other
|
||||||
|
weapon["infusions"].append(infusion)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
weapon = {}
|
||||||
|
|
||||||
|
weapon["id"] = id
|
||||||
|
weapon["name"] = name
|
||||||
|
|
||||||
|
weapon["requirements"] = [
|
||||||
|
int(row["Requirement: STR"]),
|
||||||
|
int(row["Requirement: DEX"]),
|
||||||
|
int(row["Requirement: INT"]),
|
||||||
|
int(row["Requirement: FTH"]),
|
||||||
|
int(row["Requirement: ARC"]),
|
||||||
|
]
|
||||||
|
|
||||||
|
if row["Enables Sorcery"] == "True":
|
||||||
|
weapon["sorcery-catalyst"] = True
|
||||||
|
if row["Enables Incantations"] == "True":
|
||||||
|
weapon["incantation-catalyst"] = True
|
||||||
|
|
||||||
|
if infusion == "none":
|
||||||
|
weapon["infusions"] = []
|
||||||
|
else:
|
||||||
|
weapon["infusions"] = [infusion]
|
||||||
|
|
||||||
|
weapons.append(weapon)
|
||||||
|
|
||||||
|
|
||||||
|
def regression(xs, ys):
|
||||||
|
n = len(xs)
|
||||||
|
|
||||||
|
xy = sum([x * y for x, y in zip(xs, ys)])
|
||||||
|
xsq = sum([x * x for x in xs])
|
||||||
|
|
||||||
|
a = (n * xy - sum(xs) * sum(ys)) / (n * xsq - sum(xs) ** 2)
|
||||||
|
b = ys[0]
|
||||||
|
|
||||||
|
return round(a, 5), b
|
||||||
|
|
||||||
|
|
||||||
|
def extract_infusions(rows):
|
||||||
|
for i, ty in enumerate(INFUSIONS):
|
||||||
|
infusion = {}
|
||||||
|
infusion["id"] = to_kebab(ty)
|
||||||
|
infusion["name"] = ty.strip()
|
||||||
|
|
||||||
|
relevant = [row for row in rows[0 + i + i * 25 : 26 + i + i * 25]]
|
||||||
|
|
||||||
|
xs = [x for x in range(0, 26)]
|
||||||
|
|
||||||
|
# damage
|
||||||
|
physical = [float(relevant[i]["Damage %: Physical"]) for i in range(0, 26)]
|
||||||
|
fire = [float(relevant[i]["Damage %: Fire"]) for i in range(0, 26)]
|
||||||
|
magic = [float(relevant[i]["Damage %: Magic"]) for i in range(0, 26)]
|
||||||
|
lightning = [float(relevant[i]["Damage %: Lightning"]) for i in range(0, 26)]
|
||||||
|
holy = [float(relevant[i]["Damage %: Holy"]) for i in range(0, 26)]
|
||||||
|
|
||||||
|
infusion["damage"] = {
|
||||||
|
"physical": regression(xs, physical),
|
||||||
|
"fire": regression(xs, fire),
|
||||||
|
"magic": regression(xs, magic),
|
||||||
|
"lightning": regression(xs, lightning),
|
||||||
|
"holy": regression(xs, holy),
|
||||||
|
}
|
||||||
|
|
||||||
|
# scaling
|
||||||
|
strength = [float(relevant[i]["Scaling %: STR"]) for i in range(0, 26)]
|
||||||
|
dexterity = [float(relevant[i]["Scaling %: DEX"]) for i in range(0, 26)]
|
||||||
|
intelligence = [float(relevant[i]["Scaling %: INT"]) for i in range(0, 26)]
|
||||||
|
faith = [float(relevant[i]["Scaling %: FTH"]) for i in range(0, 26)]
|
||||||
|
arcane = [float(relevant[i]["Scaling %: ARC"]) for i in range(0, 26)]
|
||||||
|
|
||||||
|
infusion["scaling"] = {
|
||||||
|
"strength": regression(xs, strength),
|
||||||
|
"dexterity": regression(xs, dexterity),
|
||||||
|
"intelligence": regression(xs, intelligence),
|
||||||
|
"faith": regression(xs, faith),
|
||||||
|
"arcane": regression(xs, arcane),
|
||||||
|
}
|
||||||
|
|
||||||
|
infusions.append(infusion)
|
||||||
|
|
||||||
|
# catalyst
|
||||||
|
infusion = {}
|
||||||
|
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -151,3 +151,5 @@ HELMET_STATS = {
|
||||||
"twinsage-glintstone-crown": [0, 0, 0, 0, 0, 6, 0, 0],
|
"twinsage-glintstone-crown": [0, 0, 0, 0, 0, 6, 0, 0],
|
||||||
"witchs-glintstone-crown": [0, 0, 0, 0, 0, 3, 0, 3],
|
"witchs-glintstone-crown": [0, 0, 0, 0, 0, 3, 0, 3],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IGNORED_WEAPON_INFUSIONS = ["heavy-crossbow"]
|
||||||
|
|
Loading…
Reference in a new issue