void ClassInfo() { SnoFile<GameBalance> gmb("Characters"); json::Value value; for (auto& hero : gmb->x088_Heros) { DumpActorLook(value, hero.x108_ActorSno); DumpActorLook(value, hero.x10C_ActorSno); } json::write(File("webgl_look.js", "w"), value, json::mJS); }
void AnimSets() { Archive ans; SnoFile<GameBalance> gmb("Characters"); Logger::begin(gmb->x088_Heros.size(), "Dumping characters"); for (auto& hero : gmb->x088_Heros) { Logger::item(hero.x000_Text); DumpActorSets(ans, hero.x108_ActorSno); DumpActorSets(ans, hero.x10C_ActorSno); } Logger::end(); ans.write(File("animsets.wgz", "wb"), true); }
void GenerateSkills(json::Value& value, json::Value& data) { TranslateJson(value, data); SnoFile<GameBalance> gmb("Characters"); auto names = Strings::list("Powers"); auto attrs = Strings::list("AttributeDescriptions"); for (auto& chr : gmb->x088_Heros) { SkillTips tips; tips.generate(canonize(chr.x000_Text), chr.x120_SkillKitSno, false, &data["skillFix"]); data["passivetips"][tips.charClass] = tips.passives; data["skilltips"][tips.charClass] = tips.skills; for (auto& kv : tips.skillMap.getMap()) { auto& dst = value["skills"][tips.charClass][kv.first]; dst["name"] = names[kv.second.getString() + "_name"]; data["skillMap"][kv.first] = kv.second; for (char rune = 'a'; rune <= 'e'; ++rune) { //NameRune_A#Witchdoctor_Firebomb dst["runes"][std::string{rune}] = attrs.getfmt("NameRune_%c#%s", rune - 'a' + 'A', kv.second.getString().c_str()); } } for (auto& kv : tips.passiveMap.getMap()) { value["passives"][tips.charClass][kv.first]["name"] = names[kv.second.getString() + "_name"]; data["skillMap"][kv.first] = kv.second; } value["skillcat"][tips.charClass] = tips.categoryMap; } for (auto& cls : value["extraskills"]) { for (auto& skill : cls) { std::string power = skill["power"].getString(); skill.remove("power"); if (!names.has(power + "_name")) { Logger::log("Power not found: %s", power.c_str()); continue; } skill["name"] = names[power + "_name"]; skill["tip"] = SkillTips::format(power); } } //data["skillMap"] }