dev
This commit is contained in:
@@ -3,16 +3,21 @@ import hmac
|
||||
import json
|
||||
import time
|
||||
from typing import Optional
|
||||
from core.character.adventure import get_adv_info
|
||||
from core.basic.character import Character
|
||||
from fastapi import Header, Request
|
||||
from api.core.exception import ResponseException
|
||||
|
||||
|
||||
class AlterState:
|
||||
def __init__(self, alter: str, token: str, charcater: Character, equVersion: str,time: int):
|
||||
self.alter = alter
|
||||
def __init__(self, value: str, token: str, charcater: Character, equVersion: str,time: int):
|
||||
self.value = value
|
||||
try:
|
||||
self.alter = get_adv_info(value)["class"]
|
||||
except Exception:
|
||||
raise ResponseException('无效的职业')
|
||||
self.token = token
|
||||
self.origin = alter.split('.')[-1]
|
||||
self.origin = self.alter.split('.')[-1]
|
||||
self.character = charcater
|
||||
self.equVersion = equVersion
|
||||
self.time = time
|
||||
@@ -35,15 +40,15 @@ def dict2obj(dictObj):
|
||||
return d
|
||||
|
||||
|
||||
def createToken(alter: str, equVersion: str, redis = None, expire=86400 / 24 * 2)->str:
|
||||
def createToken(value: str, equVersion: str, redis = None, expire=86400 / 24 * 2)->str:
|
||||
ts_str = str(time.time() + expire)
|
||||
ts_byte = ts_str.encode('utf-8')
|
||||
sha1_tshex_str = hmac.new(alter.encode('utf-8'), ts_byte, 'sha1').hexdigest()
|
||||
sha1_tshex_str = hmac.new(value.encode('utf-8'), ts_byte, 'sha1').hexdigest()
|
||||
token = sha1_tshex_str
|
||||
token = base64.urlsafe_b64encode(token.encode('utf-8')).decode('utf-8')
|
||||
# character = createCharacter(alter)
|
||||
character = {}
|
||||
redis.set(f'token:{token}', json.dumps(AlterState(alter, token, character, equVersion).to_dict()), int(expire))
|
||||
redis.set(f'token:{token}', json.dumps(AlterState(value, token, character, equVersion).to_dict()), int(expire))
|
||||
return token
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ def alterToken(alter_token: Optional[str] = Header(None)):
|
||||
decoded_bytes = base64.b64decode(alter_token)
|
||||
decoded_str = decoded_bytes.decode('utf-8')
|
||||
alter = json.loads(decoded_str)
|
||||
# 时间判断 后面再加
|
||||
# 6小时过期
|
||||
if (int(time.time() * 1000) - alter['time']) / (60 * 60 * 1000) > 6:
|
||||
raise ResponseException('登录过期或无效Token,请刷新后重试')
|
||||
return AlterState(alter['alter'], alter_token, {}, alter['equVersion'], alter['time'])
|
||||
|
||||
@@ -5,6 +5,7 @@ from fastapi import APIRouter,Request
|
||||
from api.core.Response import Return, response
|
||||
from api.core.Redis import get_redis_info
|
||||
from api.dp import RedisDep,AltersDep
|
||||
from core.character.adventure import get_adv_list
|
||||
from core.basic.character import createCharacter
|
||||
|
||||
router = APIRouter()
|
||||
@@ -14,10 +15,7 @@ register_gzip_request(router)
|
||||
|
||||
@router.get('/adventure')
|
||||
async def get_adventure_info(request: Request,redis:RedisDep):
|
||||
def get_adventure():
|
||||
with open('./dataFiles/adventure-info.json', encoding='utf-8') as fp:
|
||||
return json.load(fp)
|
||||
adventure_info = get_redis_info(redis, 'dcalc:adventure', get_adventure)
|
||||
adventure_info = get_redis_info(redis, 'dcalc:adventure', get_adv_list)
|
||||
|
||||
return response(data=adventure_info)
|
||||
|
||||
|
||||
@@ -201,6 +201,7 @@ class Character:
|
||||
self.ElementIncrease = 1.0
|
||||
self.equs = {}
|
||||
self.JadeInfo = Jade()
|
||||
self.equ_effect = []
|
||||
pass
|
||||
|
||||
# region 角色属性设置
|
||||
|
||||
@@ -0,0 +1,245 @@
|
||||
import base64
|
||||
|
||||
adv = [
|
||||
{
|
||||
'id': 0,
|
||||
'name': 'swordman_male',
|
||||
'title': '鬼剑士(男)',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'weapon_master', 'title': '极诣·剑魂', 'open': False},
|
||||
{'id': 1, 'name': 'soul_bender', 'title': '极诣·鬼泣', 'open': False},
|
||||
{'id': 2, 'name': 'berserker', 'title': '极诣·狂战士', 'open': False},
|
||||
{'id': 3, 'name': 'asura', 'title': '极诣·阿修罗', 'open': False},
|
||||
{'id': 4, 'name': 'ghostblade', 'title': '极诣·剑影', 'open': False},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 1,
|
||||
'name': 'swordman_female',
|
||||
'title': '鬼剑士(女)',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'sword_master', 'title': '极诣·驭剑士', 'open': False},
|
||||
{'id': 1, 'name': 'dark_templar', 'title': '极诣·暗殿骑士', 'open': False},
|
||||
{'id': 2, 'name': 'demon_slayer', 'title': '极诣·契魔者', 'open': False},
|
||||
{'id': 3, 'name': 'vegabond', 'title': '极诣·流浪武士', 'open': False},
|
||||
{'id': 4, 'name': 'spectre', 'title': '极诣·刃影', 'open': False},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 2,
|
||||
'name': 'fighter_male',
|
||||
'title': '格斗家(男)',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'nenmaster_male', 'title': '归元·气功师', 'open': False},
|
||||
{'id': 1, 'name': 'striker_male', 'title': '归元·散打', 'open': False},
|
||||
{'id': 2, 'name': 'brawler_male', 'title': '归元·街霸', 'open': False},
|
||||
{'id': 3, 'name': 'grappler_male', 'title': '归元·柔道家', 'open': False},
|
||||
{'name': 'empty', 'title': '', 'comment': '首页'},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 3,
|
||||
'name': 'fighter_female',
|
||||
'title': '格斗家(女)',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'nenmaster_female', 'title': '归元·气功师', 'open': False},
|
||||
{'id': 1, 'name': 'striker_female', 'title': '归元·散打', 'open': False},
|
||||
{'id': 2, 'name': 'brawler_female', 'title': '归元·街霸', 'open': False},
|
||||
{'id': 3, 'name': 'grappler_female', 'title': '归元·柔道家', 'open': False},
|
||||
{'name': 'empty', 'title': '', 'comment': '设置'},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 4,
|
||||
'name': 'gunner_male',
|
||||
'title': '神枪手(男)',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'ranger_male', 'title': '重霄·漫游枪手', 'open': False},
|
||||
{'id': 1, 'name': 'launcher_male', 'title': '重霄·枪炮师', 'open': False},
|
||||
{'id': 2, 'name': 'mechanic_male', 'title': '重霄·机械师', 'open': False},
|
||||
{'id': 3, 'name': 'spitfire_male', 'title': '重霄·弹药专家', 'open': False},
|
||||
{'id': 4, 'name': 'assault', 'title': '重霄·合金战士', 'open': False},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 5,
|
||||
'name': 'gunner_female',
|
||||
'title': '神枪手(女)',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'ranger_female', 'title': '重霄·漫游枪手', 'open': False},
|
||||
{'id': 1, 'name': 'launcher_female', 'title': '重霄·枪炮师', 'open': False},
|
||||
{'id': 2, 'name': 'mechanic_female', 'title': '重霄·机械师', 'open': False},
|
||||
{'id': 3, 'name': 'spitfire_female', 'title': '重霄·弹药专家', 'open': True, 'class': 'GF.gunner_female.spitfire_female'},
|
||||
{'name': 'sponsor', 'url': 'https://bbs.colg.cn', 'title': ''},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 6,
|
||||
'name': 'mage_male',
|
||||
'title': '魔法师(男)',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'elemental_bomber', 'title': '知源·元素爆破师', 'open': False},
|
||||
{'id': 1, 'name': 'glacial_master', 'title': '知源·冰结师', 'open': False},
|
||||
{'id': 2, 'name': 'blood_mage', 'title': '知源·血法师', 'open': False},
|
||||
{'id': 3, 'name': 'swift_master', 'title': '知源·逐风者', 'open': False},
|
||||
{'id': 4, 'name': 'dimension_walker', 'title': '知源·次元行者', 'open': False},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 7,
|
||||
'name': 'mage_female',
|
||||
'title': '魔法师(女)',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'elementalist', 'title': '知源·元素师', 'open': False},
|
||||
{'id': 1, 'name': 'summoner', 'title': '知源·召唤师', 'open': False},
|
||||
{'id': 2, 'name': 'battle_mage', 'title': '知源·战斗法师', 'open': False},
|
||||
{'id': 3, 'name': 'witch', 'title': '知源·魔道学者', 'open': False},
|
||||
{
|
||||
'id': 4,
|
||||
'name': 'enchantress',
|
||||
'title': '知源·小魔女',
|
||||
'open': False,
|
||||
'options': [{'id': 0, 'name': 'default', 'title': '奶', 'class': 'enchantress'}, {'id': 1, 'name': 'default', 'title': '输出', 'class': 'enchantress_carry'}],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 8,
|
||||
'name': 'priest_male',
|
||||
'title': '圣职者(男)',
|
||||
'children': [
|
||||
{
|
||||
'id': 0,
|
||||
'name': 'crusader_male',
|
||||
'title': '神启·圣骑士',
|
||||
'open': False,
|
||||
'options': [{'id': 0, 'name': 'default', 'title': '奶', 'class': 'crusader_male'}, {'id': 1, 'name': 'default', 'title': '审判', 'class': 'crusader_male_carry'}],
|
||||
},
|
||||
{'id': 1, 'name': 'infighter', 'title': '神启·蓝拳圣使', 'open': False},
|
||||
{'id': 2, 'name': 'exorcist', 'title': '神启·驱魔师', 'open': False},
|
||||
{'id': 3, 'name': 'avenger', 'title': '神启·复仇者', 'open': False},
|
||||
{'id': 4, 'name': 'empty', 'title': ''},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 9,
|
||||
'name': 'priest_female',
|
||||
'title': '圣职者(女)',
|
||||
'children': [
|
||||
{
|
||||
'id': 0,
|
||||
'name': 'crusader_female',
|
||||
'title': '神启·圣骑士',
|
||||
'open': False,
|
||||
'options': [{'id': 0, 'name': 'default', 'title': '奶', 'class': 'crusader_female'}, {'id': 1, 'name': 'default', 'title': '输出', 'class': 'crusader_female_carry'}],
|
||||
},
|
||||
{'id': 1, 'name': 'inquistor', 'title': '神启·异端审判者', 'open': False},
|
||||
{'id': 2, 'name': 'sorceress', 'title': '神启·巫女', 'open': False},
|
||||
{'id': 3, 'name': 'mistress', 'title': '神启·诱魔者', 'open': False},
|
||||
{'id': 4, 'name': 'empty', 'title': ''},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 10,
|
||||
'name': 'thief',
|
||||
'title': '暗夜使者',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'rogue', 'title': '隐夜·刺客', 'open': False},
|
||||
{'id': 1, 'name': 'necro', 'title': '隐夜·死灵术士', 'open': False},
|
||||
{'id': 2, 'name': 'kunoichi', 'title': '隐夜·忍者', 'open': False},
|
||||
{'id': 3, 'name': 'shadow_dancer', 'title': '隐夜·影舞者', 'open': False},
|
||||
{'id': 4, 'name': 'empty', 'title': ''},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 11,
|
||||
'name': 'knight',
|
||||
'title': '守护者',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'elven_knight', 'title': '皓曦·精灵骑士', 'open': False},
|
||||
{'id': 1, 'name': 'chaos', 'title': '皓曦·混沌魔灵', 'open': False},
|
||||
{'id': 2, 'name': 'paladin', 'title': '皓曦·帕拉丁', 'open': False},
|
||||
{'id': 3, 'name': 'dragon_knight', 'title': '皓曦·龙骑士', 'open': False},
|
||||
{'id': 4, 'name': 'empty', 'title': ''},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 12,
|
||||
'name': 'demonic_lancer',
|
||||
'title': '魔枪士',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'vanguard', 'title': '千魂·征战者', 'open': False},
|
||||
{'id': 1, 'name': 'skirmisher', 'title': '千魂·决战者', 'open': False},
|
||||
{'id': 2, 'name': 'dragoon', 'title': '千魂·狩猎者', 'open': False},
|
||||
{'id': 3, 'name': 'impaler', 'title': '千魂·暗枪士', 'open': False},
|
||||
{'id': 4, 'name': 'empty', 'title': ''},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 13,
|
||||
'name': 'gunblader',
|
||||
'title': '枪剑士',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'hitman', 'title': '苍暮·暗刃', 'open': False},
|
||||
{'id': 1, 'name': 'agent', 'title': '苍暮·特工', 'open': False},
|
||||
{'id': 2, 'name': 'trouble_shooter', 'title': '苍暮·战线佣兵', 'open': False},
|
||||
{'id': 3, 'name': 'specialist', 'title': '苍暮·源能专家', 'open': False},
|
||||
{'id': 4, 'name': 'empty', 'title': ''},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 14,
|
||||
'name': 'archer',
|
||||
'title': '弓箭手',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'muse', 'title': '聆风·缪斯', 'open': False},
|
||||
{'id': 1, 'name': 'traveler', 'title': '聆风·旅人', 'open': False},
|
||||
{'id': 2, 'name': 'hunter', 'title': '聆风·猎人', 'open': False},
|
||||
{'id': 3, 'name': 'vigilante', 'title': '聆风·妖护使', 'open': False},
|
||||
{'id': 4, 'name': 'empty', 'title': ''},
|
||||
],
|
||||
},
|
||||
{
|
||||
'id': 15,
|
||||
'name': 'extra',
|
||||
'title': '外传',
|
||||
'children': [
|
||||
{'id': 0, 'name': 'creator', 'title': '知源·缔造者', 'open': False},
|
||||
{'id': 1, 'name': 'dark_knight', 'title': '极诣·黑暗武士', 'open': False},
|
||||
{'id': 2, 'name': 'empty', 'title': ''},
|
||||
{'id': 3, 'name': 'empty', 'title': ''},
|
||||
{'id': 4, 'name': 'empty', 'title': ''},
|
||||
],
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def get_adv_list():
|
||||
for parent in adv:
|
||||
parent_id = f'{parent["id"]:02}'
|
||||
for child in parent['children']:
|
||||
child_id = f'{child.get("id", 0):02}'
|
||||
if 'options' in child:
|
||||
for idx, option in enumerate(child['options']):
|
||||
option['value'] = base64.b64encode(f'{parent_id}{child_id}{idx:02}'.encode()).decode()
|
||||
option.pop('class', None)
|
||||
else:
|
||||
child['value'] = base64.b64encode(f'{parent_id}{child_id}00'.encode()).decode()
|
||||
child.pop('class', None)
|
||||
return adv
|
||||
|
||||
|
||||
def get_adv_info(value):
|
||||
value = base64.b64decode(value).decode()
|
||||
parent_id, child_id, option_id = map(int, (value[:2], value[2:4], value[4:6]))
|
||||
parent = next((p for p in adv if p['id'] == parent_id), None)
|
||||
if not parent:
|
||||
return None
|
||||
child = next((c for c in parent['children'] if c.get('id', 0) == child_id), None)
|
||||
if not child:
|
||||
return None
|
||||
if 'options' in child:
|
||||
return next((o for o in child['options'] if o.get('id', 0) == option_id), None)
|
||||
else:
|
||||
return child if option_id == 0 else None
|
||||
print(get_adv_info("MDUwMzAz"))
|
||||
@@ -1,211 +0,0 @@
|
||||
[
|
||||
{
|
||||
"name": "swordman_male",
|
||||
"title": "鬼剑士(男)",
|
||||
"children": [
|
||||
{ "title": "极诣·剑魂", "name": "weapon_master", "open": false },
|
||||
{ "name": "soul_bender", "title": "极诣·鬼泣", "open": false },
|
||||
{ "name": "berserker", "title": "极诣·狂战士", "open": false },
|
||||
{ "name": "asura", "title": "极诣·阿修罗", "open": false },
|
||||
{ "name": "ghostblade", "title": "极诣·剑影", "open": false }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "swordman_female",
|
||||
"title": "鬼剑士(女)",
|
||||
"children": [
|
||||
{ "name": "sword_master", "title": "极诣·驭剑士", "open": false },
|
||||
{ "name": "dark_templar", "title": "极诣·暗殿骑士", "open": false },
|
||||
{ "name": "demon_slayer", "title": "极诣·契魔者", "open": false },
|
||||
{ "name": "vegabond", "title": "极诣·流浪武士", "open": false },
|
||||
{ "name": "spectre", "title": "极诣·刃影", "open": false }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "fighter_male",
|
||||
"title": "格斗家(男)",
|
||||
"children": [
|
||||
{ "name": "nenmaster_male", "title": "归元·气功师", "open": false },
|
||||
{ "name": "striker_male", "title": "归元·散打", "open": false },
|
||||
{ "name": "brawler_male", "title": "归元·街霸", "open": false },
|
||||
{ "name": "grappler_male", "title": "归元·柔道家", "open": false },
|
||||
{ "name": "empty", "title": "", "comment": "首页" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "fighter_female",
|
||||
"title": "格斗家(女)",
|
||||
"children": [
|
||||
{ "name": "nenmaster_female", "title": "归元·气功师", "open": false },
|
||||
{ "name": "striker_female", "title": "归元·散打", "open": false },
|
||||
{ "name": "brawler_female", "title": "归元·街霸", "open": false },
|
||||
{ "name": "grappler_female", "title": "归元·柔道家", "open": false },
|
||||
{ "name": "empty", "title": "", "comment": "设置" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "gunner_male",
|
||||
"title": "神枪手(男)",
|
||||
"children": [
|
||||
{ "name": "ranger_male", "title": "重霄·漫游枪手", "open": false },
|
||||
{ "name": "launcher_male", "title": "重霄·枪炮师", "open": false },
|
||||
{ "name": "mechanic_male", "title": "重霄·机械师", "open": false },
|
||||
{ "name": "spitfire_male", "title": "重霄·弹药专家", "open": false },
|
||||
{ "name": "assault", "title": "重霄·合金战士", "open": false }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "gunner_female",
|
||||
"title": "神枪手(女)",
|
||||
"children": [
|
||||
{ "name": "ranger_female", "title": "重霄·漫游枪手", "open": false },
|
||||
{ "name": "launcher_female", "title": "重霄·枪炮师", "open": false },
|
||||
{ "name": "mechanic_female", "title": "重霄·机械师", "open": false },
|
||||
{ "name": "spitfire_female", "title": "重霄·弹药专家", "open": true, "class": "GF.gunner_female.spitfire_female" },
|
||||
{
|
||||
"name": "sponsor",
|
||||
"url": "https://bbs.colg.cn",
|
||||
"title": "",
|
||||
"open": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "mage_male",
|
||||
"title": "魔法师(男)",
|
||||
"children": [
|
||||
{ "name": "elemental_bomber", "title": "知源·元素爆破师", "open": false },
|
||||
{ "name": "glacial_master", "title": "知源·冰结师", "open": false },
|
||||
{ "name": "blood_mage", "title": "知源·血法师", "open": false },
|
||||
{ "name": "swift_master", "title": "知源·逐风者", "open": false },
|
||||
{ "name": "dimension_walker", "title": "知源·次元行者", "open": false }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "mage_female",
|
||||
"title": "魔法师(女)",
|
||||
"children": [
|
||||
{ "name": "elementalist", "title": "知源·元素师", "open": false },
|
||||
{ "name": "summoner", "title": "知源·召唤师", "open": false },
|
||||
{ "name": "battle_mage", "title": "知源·战斗法师", "open": false },
|
||||
{ "name": "witch", "title": "知源·魔道学者", "open": false },
|
||||
{
|
||||
"name": "enchantress",
|
||||
"title": "知源·小魔女",
|
||||
"open": false,
|
||||
"options": [
|
||||
{ "name": "default", "title": "奶", "class": "enchantress" },
|
||||
{ "name": "default", "title": "输出", "class": "enchantress_carry" }
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "priest_male",
|
||||
"title": "圣职者(男)",
|
||||
"children": [
|
||||
{
|
||||
"name": "crusader_male",
|
||||
"title": "神启·圣骑士",
|
||||
"open": false,
|
||||
"options": [
|
||||
{ "name": "default", "title": "奶", "class": "crusader_male" },
|
||||
{ "name": "default", "title": "审判", "class": "crusader_male_carry" }
|
||||
]
|
||||
},
|
||||
{ "name": "infighter", "title": "神启·蓝拳圣使", "open": false },
|
||||
{ "name": "exorcist", "title": "神启·驱魔师", "open": false },
|
||||
{ "name": "avenger", "title": "神启·复仇者", "open": false },
|
||||
{ "name": "empty", "title": "" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "priest_female",
|
||||
"title": "圣职者(女)",
|
||||
"children": [
|
||||
{
|
||||
"name": "crusader_female",
|
||||
"title": "神启·圣骑士",
|
||||
"open": false,
|
||||
"options": [
|
||||
{ "name": "default", "title": "奶", "class": "crusader_female" },
|
||||
{
|
||||
"name": "default",
|
||||
"title": "输出",
|
||||
"class": "crusader_female_carry"
|
||||
}
|
||||
]
|
||||
},
|
||||
{ "name": "inquistor", "title": "神启·异端审判者", "open": false },
|
||||
{ "name": "sorceress", "title": "神启·巫女", "open": false },
|
||||
{ "name": "mistress", "title": "神启·诱魔者", "open": false },
|
||||
{ "name": "empty", "title": "" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "thief",
|
||||
"title": "暗夜使者",
|
||||
"children": [
|
||||
{ "name": "rogue", "title": "隐夜·刺客", "open": false },
|
||||
{ "name": "necro", "title": "隐夜·死灵术士", "open": false },
|
||||
{ "name": "kunoichi", "title": "隐夜·忍者", "open": false },
|
||||
{ "name": "shadow_dancer", "title": "隐夜·影舞者", "open": false },
|
||||
{ "name": "empty", "title": "" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "knight",
|
||||
"title": "守护者",
|
||||
"children": [
|
||||
{ "name": "elven_knight", "title": "皓曦·精灵骑士", "open": false },
|
||||
{ "name": "chaos", "title": "皓曦·混沌魔灵", "open": false },
|
||||
{ "name": "paladin", "title": "皓曦·帕拉丁", "open": false },
|
||||
{ "name": "dragon_knight", "title": "皓曦·龙骑士", "open": false },
|
||||
{ "name": "empty", "title": "" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "demonic_lancer",
|
||||
"title": "魔枪士",
|
||||
"children": [
|
||||
{ "name": "vanguard", "title": "千魂·征战者", "open": false },
|
||||
{ "name": "skirmisher", "title": "千魂·决战者", "open": false },
|
||||
{ "name": "dragoon", "title": "千魂·狩猎者", "open": false },
|
||||
{ "name": "impaler", "title": "千魂·暗枪士", "open": false },
|
||||
{ "name": "empty", "title": "" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "gunblader",
|
||||
"title": "枪剑士",
|
||||
"children": [
|
||||
{ "name": "hitman", "title": "苍暮·暗刃", "open": false },
|
||||
{ "name": "agent", "title": "苍暮·特工", "open": false },
|
||||
{ "name": "trouble_shooter", "title": "苍暮·战线佣兵", "open": false },
|
||||
{ "name": "specialist", "title": "苍暮·源能专家", "open": false },
|
||||
{ "name": "empty", "title": "" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "archer",
|
||||
"title": "弓箭手",
|
||||
"children": [
|
||||
{ "name": "muse", "title": "聆风·缪斯", "open": false },
|
||||
{ "name": "traveler", "title": "聆风·旅人", "open": false },
|
||||
{ "name": "hunter", "title": "聆风·猎人", "open": false },
|
||||
{ "name": "vigilante", "title": "聆风·妖护使", "open": false },
|
||||
{ "name": "empty", "title": "" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "extra",
|
||||
"title": "外传",
|
||||
"children": [
|
||||
{ "name": "creator", "title": "知源·缔造者", "open": false },
|
||||
{ "name": "dark_knight", "title": "极诣·黑暗武士", "open": false },
|
||||
{ "name": "empty", "title": "" },
|
||||
{ "name": "empty", "title": "" },
|
||||
{ "name": "empty", "title": "" }
|
||||
]
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user