Files
AzerothAI/deploy/classic/plan-roster.py
2026-09-25 22:57:11 +02:00

46 lines
2.3 KiB
Python

#!/usr/bin/env python3
"""Produce a validated level-one Vanilla roster; never modify live characters."""
import argparse
import collections
import json
import pathlib
import re
RACES = {"Human":1,"Orc":2,"Dwarf":3,"Night Elf":4,"Undead":5,"Tauren":6,"Gnome":7,"Troll":8}
CLASSES = {"Warrior":1,"Paladin":2,"Hunter":3,"Rogue":4,"Priest":5,"Shaman":7,"Mage":8,"Warlock":9,"Druid":11}
ALLOWED = {1:{1,2,4,5,8,9},2:{1,3,4,7,9},3:{1,2,3,4,5},4:{1,3,4,5,11},5:{1,4,5,8,9},6:{1,3,7,11},7:{1,4,8,9},8:{1,3,4,5,7,8}}
ALLIANCE = {"Human","Dwarf","Night Elf","Gnome","Draenei"}
def plan(bots):
if len(bots) != 50 or len({b['name'].lower() for b in bots}) != 50:
raise ValueError("Exactly 50 unique active identities required")
result = []
for b in bots:
if not re.fullmatch(r'[A-Za-z]{2,12}',b['name']):
raise ValueError("Invalid native character name")
race, role = b['race'], b['role']
team = 0 if race in ALLIANCE else 1
if role == 'Death Knight': role = 'Warrior'
if team == 0 and role == 'Shaman': role = 'Paladin'
if team == 1 and role == 'Paladin': role = 'Shaman'
if race == 'Draenei': race = 'Dwarf' if role in ('Hunter','Paladin','Warrior') else 'Human'
if race == 'Blood Elf': race = 'Tauren' if role == 'Shaman' else 'Undead'
race_id, class_id = RACES[race], CLASSES[role]
if class_id not in ALLOWED[race_id]:
raise ValueError(f"Invalid Vanilla combination: {b['name']} {race} {role}")
if (race in ALLIANCE) != (team == 0): raise ValueError('Faction changed')
result.append(dict(id=b['id'],name=b['name'],race=race,role=role,raceId=race_id,classId=class_id,team=team,level=1,
oldRace=b['race'],oldRole=b['role'],oldLevel=b['level']))
if collections.Counter(x['team'] for x in result) != {0:25,1:25}:
raise ValueError('Roster must be 25 Alliance and 25 Horde')
return result
if __name__ == '__main__':
parser=argparse.ArgumentParser()
parser.add_argument('active',type=pathlib.Path)
parser.add_argument('output',type=pathlib.Path)
args=parser.parse_args()
rows=plan(json.loads(args.active.read_text()))
args.output.write_text(json.dumps(rows,indent=2)+'\n')
print('Validated: 50 identities, 25 Alliance, 25 Horde, all start at level 1')