CardDB_cardIDEnum.cs生成

CardDB_cardIDEnum.cs生成——2021.3.27

# encoding: utf-8
import requests
import re
import json
import os
from tqdm import tqdm

ClassName = {
    "DREAM": "夢境",
    "WHIZBANG": "威茲班"
}

TypeName = {
    "ENCHANTMENT": "附魔",
    "HERO_POWER": "英雄技能"
}

CardSetName = {
    "TB": "TB亂斗模式",
    "HERO_SKINS": "HERO英雄皮膚和技能",
    "THE_BARRENS": "BAR貧瘠之地的錘煉",
    'SCHOLOMANCE': "SCH通靈學(xué)園",
    'BASIC': "CORE基本",
    'BATTLEGROUNDS': "BGS酒館戰(zhàn)棋",
    'BOOMSDAY': "BOT砰砰計劃",
    'BRM': "BRM黑石山的火焰",
    'BLACK_TEMPLE': "BT外域的灰燼",
    'DEMON_HUNTER_INITIATE': "BT惡魔獵手新兵",
    'YEAR_OF_THE_DRAGON': "DRG巨龍降臨",
    "TGT": "AT冠軍的試煉",
    'GANGS': "CFM龍爭虎斗加基森",
    'CORE': "CORE基本",
    'CREDITS': "CREDITS暴雪制作人員",
    'EXPERT1': "EX經(jīng)典",
    'HOF': "HOF榮譽室",
    'DALARAN': "DAL暗影崛起",
    'DARKMOON_FAIRE': "DMF瘋狂的暗月馬戲團",
    'DRAGONS': "DRG巨龍降臨",
    'NAXX': "NAX納克薩瑪斯",
    'GILNEAS': "GIL女巫森林",
    'GVG': "GVG地精大戰(zhàn)侏儒",
    'ICECROWN': "ICC冰封王座的騎士",
    'UNGORO': "UNG勇闖安戈洛",
    'LOOTAPALOOZA': "LOOT狗頭人與地下世界",
    'KARA': "KAR卡拉贊之夜",
    'LOE': "LOE探險者協(xié)會",
    'OG': "OG上古之神的低語",
    'MISSIONS': "MISSIONS新手訓(xùn)練",
    'TROLL': "TRL拉斯塔哈的大亂斗",
    'TAVERNS_OF_TIME': "TOT時光酒館",
    'ULDUM': "ULD奧丹姆奇兵",
    'VANILLA': "VAN經(jīng)典模式"
}

file_list = requests.get("https://api.hearthstonejson.com/v1/").text
ver_list = re.findall("/v1/(\d+)/all/", file_list)
new_version = max(ver_list)
print(f"new_version: {new_version}")

print("loading global_json...")
global_json = requests.get('https://api.hearthstonejson.com/v1/strings/zhCN/GLOBAL.json').text
global_data = json.loads(global_json)
assert global_data is not None
for name in global_data:
    if "GLOBAL_CLASS_" in name:
        class_name = name.replace('GLOBAL_CLASS_', '')
        if class_name not in ClassName:
            ClassName[class_name] = global_data[name]
    if "GLOBAL_CARD_SET_" in name:
        card_set = name.replace('GLOBAL_CARD_SET_', '')
        if card_set not in CardSetName:
            CardSetName[card_set] = global_data[name]
    elif "GLOBAL_CARDTYPE_" in name:
        card_type = name.replace('GLOBAL_CARDTYPE_', '')
        if card_type not in TypeName:
            TypeName[card_type] = global_data[name]

print("loaded global_json successfully!")

print("loading card_data...")
cardJson_data = ""
cardJson_File = f'{new_version}.json'
if os.path.exists(cardJson_File):
    print("--file mode")
    with open(cardJson_File, "r", encoding='utf-8') as f:
        cardJson_data = f.read()
    assert cardJson_data != ""
else:
    cardJson_url = f'https://api.hearthstonejson.com/v1/{new_version}/all/cards.json'
    print(f"--online mode({cardJson_url})")
    cardJson_req = requests.get(cardJson_url, stream=True)
    cardJson_byte = b''
    pbar = tqdm(total=-1, unit='B', unit_scale=True)
    for chunk in cardJson_req.iter_content(chunk_size=1024):
        assert chunk != None
        cardJson_byte += chunk
        pbar.update(1024)
    pbar.close()
    cardJson_data = cardJson_byte.decode()
    assert cardJson_data != ""
    with open(cardJson_File, "w", encoding='utf-8') as f:
        f.write(cardJson_data)

cardData_temp = json.loads(cardJson_data)
assert cardData_temp is not None
print("loaded card_json successfully!")

cardData = {}
for c in cardData_temp:
    cardData[c['id']] = c

sim_path = os.path.join(os.getcwd(), "cards")
print("loading sim_data from", sim_path)
Sim_Context = []
Sim_CardID = []
Sim_text_idx = {}
Sim_id_idx = {}
for root, dirs, files in os.walk(sim_path):
    for file in files:
        card_id = file.replace('Sim_', '').replace('.cs', '')
        with open(os.path.join(root, file), "r", encoding='utf-8') as sim_file:
            sim_content = sim_file.read()
            if "public" not in sim_content:
                continue
            card_idx = len(Sim_Context)
            Sim_Context.append(sim_content)
            Sim_CardID.append(card_id)
            Sim_id_idx[card_id] = card_idx
            if card_id in cardData and 'text' in cardData[card_id]:
                Sim_text_idx[cardData[card_id]['text']['zhCN']] = card_idx
print("loaded " + str(len(Sim_Context)) + " old_sim_data successfully!")

enum_data = ""
if not os.path.exists('sim'):
    os.mkdir('sim')

print("Creating sim file and CardDB_cardIDEnum.cs")
for cardid, c in cardData.items():
    sim_data = ""
    basic = ""
    if 'type' in c and 'name' in c and c['type'] in TypeName:
        # create enum data
        type = TypeName[c['type']]
        name_cn = c['name']['zhCN']
        name = c['name']['enUS']
        card_set = c['set']
        cardtext_cn = ""
        cardtext = ""
        if 'cardClass' in c and 'cost' in c:
            if type == '法術(shù)':
                basic = f"{ClassName[c['cardClass']]} 費用:{c['cost']}"
            if type == '隨從' and 'attack' in c and 'health' in c:
                basic = f"{ClassName[c['cardClass']]} 費用:{c['cost']} 攻擊力:{c['attack']} 生命值:{c['health']}"
            if type == '武器' and 'attack' in c and 'durability' in c:
                basic = f"{ClassName[c['cardClass']]} 費用:{c['cost']} 攻擊力:{c['attack']} 耐久度:{c['durability']}"
            if type == '英雄技能':
                basic = f"{ClassName[c['cardClass']]} 費用:{c['cost']}"
        enum_data += "http:/// <summary>\n"
        enum_data += f"http:/// <para>{type} {basic}</para>\n"
        enum_data += f"http:/// <para>{name}</para>\n"
        enum_data += f"http:/// <para>{name_cn}</para>\n"
        if 'text' in c:
            cardtext_cn = c['text']['zhCN'].replace('\n', ' ')
            cardtext = c['text']['enUS'].replace('\n', ' ')
            enum_data += f"http:/// <para>{cardtext}</para>\n"
            enum_data += f"http:/// <para>{cardtext_cn}</para>\n"
        enum_data += "http:/// </summary>\n"
        enum_data += f"{cardid} = {c['dbfId']},\n"
        # create sim data
        if type == '附魔':
            continue
        while True:
            if cardid in Sim_id_idx:
                sim_data = Sim_Context[Sim_id_idx[cardid]]
                break
            if 'text' in c and c['text']['zhCN'] in Sim_text_idx:
                idx = Sim_text_idx[c['text']['zhCN']]
                sim_id = Sim_CardID[idx]
                if cardid not in sim_id:
                    sim_data = Sim_Context[idx]
                    # fix
                    sim_data = sim_data.replace(f'class Sim_{sim_id}', f'class Sim_{cardid}')
                    break
            sim_data = "using System;\nusing System.Collections.Generic;\nusing System.Text;\n\n"
            sim_data += "namespace HREngine.Bots\n{\n"
            sim_data += f"\tclass Sim_{cardid} : SimTemplate //* {name_cn} {name}\n\t{{\n"
            if cardtext != "":
                sim_data += "\t\t//" + cardtext + "\n"
                sim_data += "\t\t//" + cardtext_cn + "\n"
            sim_data += "\t\t\n\t\t\n\t}\n}\n"
            break

        if card_set not in CardSetName:
            print("check CardSetName:", cardid)
            continue

        # write sim data
        sim_dir = f"sim\\{CardSetName[card_set]}"
        if not os.path.exists(sim_dir):
            os.mkdir(sim_dir)
        with open(sim_dir + "\\Sim_" + cardid + ".cs", 'w', encoding='utf-8') as sim:
            sim.write(sim_data)
print("Write sim_data to " + os.path.join(os.getcwd(), "sim") + " successfully!")
# write id_enum data
enum_path = os.path.join(os.getcwd(), "CardDB_cardIDEnum.cs")

enum_file_data = '''namespace HREngine.Bots
{
    partial class CardDB
    {
        public enum cardIDEnum
        {
            None,            
'''
enum_data = enum_data.split('\n')
for line in enum_data:
    enum_file_data += f"\t\t\t{line}\n"

enum_file_data += '''        }
    }
}
'''

with open(enum_path, "w", encoding="utf-8") as cardIDEnum:
    cardIDEnum.write(enum_file_data)
print("Write CardDB_cardIDEnum.cs to " + enum_path + " successfully!")
print("all finish")

轉(zhuǎn)載來源http://blog.wjhwjhn.com/archives/18/
僅供個人研究學(xué)習(xí)之用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子俏扩,更是在濱河造成了極大的恐慌,老刑警劉巖捕传,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扩劝,居然都是意外死亡乐横,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門今野,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人罐农,你說我怎么就攤上這事条霜。” “怎么了涵亏?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵宰睡,是天一觀的道長。 經(jīng)常有香客問我气筋,道長拆内,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任宠默,我火速辦了婚禮麸恍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搀矫。我一直安慰自己抹沪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布瓤球。 她就那樣靜靜地躺著融欧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卦羡。 梳的紋絲不亂的頭發(fā)上噪馏,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天麦到,我揣著相機與錄音,去河邊找鬼欠肾。 笑死瓶颠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的董济。 我是一名探鬼主播步清,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虏肾!你這毒婦竟也來了廓啊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤封豪,失蹤者是張志新(化名)和其女友劉穎谴轮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吹埠,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡第步,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缘琅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粘都。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖刷袍,靈堂內(nèi)的尸體忽然破棺而出翩隧,到底是詐尸還是另有隱情,我是刑警寧澤呻纹,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布堆生,位于F島的核電站,受9級特大地震影響雷酪,放射性物質(zhì)發(fā)生泄漏淑仆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一哥力、第九天 我趴在偏房一處隱蔽的房頂上張望蔗怠。 院中可真熱鬧,春花似錦吩跋、人聲如沸蟀淮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怠惶。三九已至,卻和暖如春轧粟,著一層夾襖步出監(jiān)牢的瞬間策治,已是汗流浹背脓魏。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留通惫,地道東北人茂翔。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像履腋,于是被迫代替她去往敵國和親珊燎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容