这是一篇面向炉石传说wiki编辑者的数据构建说明。

概览

本维基在最初建站时,所有数据和图片都是由人工搬运和添加的,那时候炉石传说的卡牌数量及其有限,这种工作方式看起来是完全ok的。

但是随着《炉石传说》的发展,一个又一个的扩展冒险模式出现了,随后又出现了新的玩法(乱斗酒馆战棋),而随着机制阐释需求的不断提高,编辑者们发现,除了我们直观上能感受到的随从武器法术之外,英雄衍生物状态英雄技能在《炉石传说》中都被视为"卡牌"。,这时,我们面临以下问题:

  • 牌库的概念成倍放大,传统的手动添加已经跟不上更新的脚步
  • 传统由可收集卡牌牌面命名页面的方式已经无法处理越来越多的同名卡牌
  • 由于国内代理不会第一时间放出卡包的牌面图,靠手动PS卡牌牌面的工作越来越不切合实际

解决方案

目前本站的数据解决方案如下

数据源

本站的数据源全部请求自国外的开放站点hearthstonejson,包括所有的卡牌牌面图,由hearthstonejson提供的API渲染完成(可能出现奇怪的字体)

部署

在灰机,采用分割过的JSON文件(每个卡牌ID一个文件),存储在Data命名空间,然后进入MongoDB数据库,例如

上述文件由脚本自动请求、拆分、上传,请勿手动更改。

请求

数据的请求方式遵照灰机的MongoDB数据存储方案进行查询,默认采用Lua脚本进行请求,并将结果封装展示。

本站为了解决普通编辑的使用和参与,支持h:帮助:SMongo,可以直接使用模板调用的方式,用SMW风格的query语句进行查询。

图片命名

新图的命名规则是: <id>_card_zhCN.png

卡表里的方形图是 <id>_title_zhCN.jpg

例子

[[file:EX1_614_card_zhCN.png|left|300px]]
[[file:EX1_614_title_zhCN.png|left]]

结果

EX1 614 card zhCN.png
EX1 614 title zhCN.png

但是由于id不太好记,所以平时可以使用{{card}}模板来调取牌面,参考#Card(单张卡牌牌面)

SMongo查询语法

完整的SMongo查询语法参考:h:帮助:SMongo

比如我们要查询所有来自“勇闯安戈洛”扩展包的中立可收集卡牌,可以这样书写:

{{ask
|query=cardClass::NEUTRAL;set::UNGORO;collectible::true;
|?name=卡牌名称
|?cost=费用
|mainlabel = -
|limit =10
|sort=cost|order=asc
}}

结果

费用卡牌名称
1翡翠蜂后
1冰川裂片
1翡翠掠夺者
1火羽精灵
2暴掠龙幼崽
2石塘猎人
2葛拉卡爬行蟹
2倔强的蜗牛
2不稳定的元素
3翼手龙宝宝

输出为卡牌牌面

查询方法同上,加format = templatetemplate=xxx,例如这里我们将之前的Card模板改造为Card/new,作为新的牌面显示模板

{{ask
|query=cardClass::NEUTRAL;set::UNGORO;collectible::true;
|?id=1
|?name =1
|mainlabel = -
|limit =10
|sort=cost|order=asc
|format=template
|template=Card/new
|named args =yes
}}

结果

UNG 085 card zhCN.png
UNG 205 card zhCN.png
UNG 803 card zhCN.png
UNG 809 card zhCN.png
UNG 009 card zhCN.png
UNG 073 card zhCN.png
UNG 807 card zhCN.png
UNG 808 card zhCN.png
UNG 818 card zhCN.png
UNG 001 card zhCN.png

askCards(多张卡牌牌面)

为了方便调用,我们将上述模板做了二次封装,您可以调用

{{askCards
|cardClass::NEUTRAL;set::UNGORO;collectible::true;
}}

同样可以查询指定ID的卡牌,譬如

{{askCards
|id::UNG_831
}}

结果

UNG 831 card zhCN.png

对于查询条件问name的情况,返回值可能不唯一,可以用来罗列所有重名的卡牌,譬如

{{askCards
|name::炎魔之王拉格纳罗斯
}}

结果

BRMA06 3 card zhCN.png
BRMA06 3H card zhCN.png
BRM 027h card zhCN.png
TBA01 1 card zhCN.png
TB BaconShop HERO 11 card zhCN.png
TB EVILBRM Ragnaros01 card zhCN.png
TB Firefest2 Rag H card zhCN.png
TB FW Rag card zhCN.png
EX1 298 card zhCN.png
TRL 316t card zhCN.png
WE1 037 card zhCN.png

prettylable(推荐-大量卡牌标签)

例如我们查询所有可以收集的,和战吼有关的卡牌

{{ask
|query = referencedTags::BATTLECRY;collectible::true
|?name=name
|limit = 800
|format = prettylable
}}

结果

展示符合条件的结果8

prettytable(大量卡牌列表)

例如我们查询所有可以收集的,和战吼有关的卡牌

{{ask
|query = referencedTags::BATTLECRY;collectible::true
|?name=name
|limit = 800
|format = prettytable
}}

结果

卡牌来源Mana icon.pngAttack icon.pngHealth icon.png/Weapon-durability.png卡牌描述
Crowd Favorite
中立 随从
冠军的试炼444每当你使用一张具有战吼的牌,便获得+1/+1。
Blubber Baron
中立 随从
龙争虎斗加基森311每当你召唤一个具有战吼的随从时,便使这张牌(在你手牌中时)获得+1/+1。
Nerub'ar Weblord
中立 随从
纳克萨玛斯的诅咒214具有战吼的随从法力值消耗增加(2)点。
Blazing Invocation
萨满 法术
女巫森林1发现一张具有战吼的随从牌。
Rumbling Elemental
萨满 随从
探险者协会426在你使用一张具有 战吼的随从牌后,随机对一个敌人造成2点伤害。
Brann Bronzebeard
中立 随从
探险者协会324你的战吼会触发 两次。
Corrupt the Waters
萨满 法术
奥丹姆奇兵1任务:使用6张战吼牌。奖励:维尔纳尔之心。
Waxmancy
潜行者 法术
YEAR_OF_THE_DRAGON2发现一张战吼随从牌。其法力值消耗减少(2)点。

Card(单张卡牌牌面)

旧的card模板得到了继承,依然可以通过名字查询,{{Card|伊利丹·怒风}}

结果伊利丹·怒风.png


同时也可以指定id,写法为{{Card|id=<card id>}},例如

{{Card|id=EX1_614}}

结果EX1 614 card zhCN.png

注意,由于本模板内置了查询,因此一个页面不要过多的使用,超过100次会触发高开销警报

当id为酒馆战棋或衍生物时,链接会指向对应的消歧义页面(名字+(ID)),只有可收集卡牌才会指向(名字)所代表的页面,增益效果不会指向具体页面,而是“状态”这个条目

如何获得卡牌ID

最简单的方法是在卡牌查询页面输入卡牌名称,从匹配到的结果中复制。

Card link

沿用了之前的Card link模板

{{Card_link|炎魔之王拉格纳罗斯}}

结果炎魔之王拉格纳罗斯

如上文所说,叫做“炎魔之王拉格纳罗斯”的卡牌有很多,为什么这里没有返回其它的重名卡牌?

为了简化日常调用,这里对返回的所有卡牌id进行了权重排序,详情参见module:hearthstone里的_selectRightIdfunction,通过给卡牌属性的set进行加权,最终返回权重最高的那一个卡牌id,并以此作为依据生成牌面图片,因此:

  • Card link总是试图返回一张可收集的卡牌
  • 常规模式的卡牌权重要比酒馆乱斗、酒馆战棋高
  • 衍生物、增益和冒险模式的boss相关卡牌权重会非常低(低到几乎不会出现)

navbox

沿用了之前的{{Navbox/auto|<cardClass>}},例如:

{{Navbox/auto|PRIEST}}

结果


标题文字 标题文字 标题文字
{{Navbox/auto|<cardClass>}} cardClass可以填PRIEST、SHAMAN等等,详见枚举 用来展示依照职业划分的卡牌
{{Navbox_neutral|<set>}} set可以填GVG、DRAGONS等等,详见枚举 用来展示依照扩展包or来源划分的中立卡牌(合起来太多了)
{{Navbox/BATTLEGROUND}} 用来展示所有酒馆战棋的卡牌

抉择和衍生物

由于现在所有卡牌页面和数据都是严格按照id来配置的,所以我们可以根据id来索引一张卡牌的抉择牌,以及相关的衍生牌

抉择

例如,卡牌“活体根须”的id是 AT_037,我们可以通过在id后面加上小写的ab来获取抉择牌面,下列方式列出他的抉择卡牌:

{{Card|id =AT_037a|200}}
{{Card|id =AT_037b|200}}

结果AT 037a card zhCN.png AT 037b card zhCN.png

衍生物

同理,活体根须的衍生物可以通过在id后面加上小写的t来获取牌面。注意,冒险模式等不可收集卡牌的衍生物规则可能要复杂的多,加t仅对可收集卡牌完全生效。

{{Card|id =AT_037t|200}}

AT 037t card zhCN.png

对于“进化”机制相关的衍生物,我们可以用正则表达式来检索卡牌的id,我们知道他们都与UNG_999相关,

{{askCards
|id::@UNG_999t*;type::SPELL
}}

10个可能出现的进化选项如下:

UNG 999t10 card zhCN.png
UNG 999t13 card zhCN.png
UNG 999t14 card zhCN.png
UNG 999t2 card zhCN.png
UNG 999t3 card zhCN.png
UNG 999t4 card zhCN.png
UNG 999t5 card zhCN.png
UNG 999t6 card zhCN.png
UNG 999t7 card zhCN.png
UNG 999t8 card zhCN.png

将上述条件里的SPELL换成MINION

{{askCards
|id::@UNG_999t*;type::MINION
}}
UNG 999t2t1 card zhCN.png

进阶查询语法

使用正则表达式

对指定的字段查询条件前添加@,如text::@祈求(版面有限,仅显示前五张)

{{ask
|query = text::@祈求;collectible::true
|?name=name
|limit = 5
|format = prettytable
}}

结果:

卡牌来源Mana icon.pngAttack icon.pngHealth icon.png/Weapon-durability.png卡牌描述
Scion of Ruin
战士 随从
巨龙降临432突袭 战吼:如果你已经祈求过两次,召唤该随从的两个复制。
Ritual Chopper
战士 武器
巨龙降临212战吼: 祈求迦拉克隆。
Umbral Skulker
潜行者 随从
巨龙降临433战吼:如果你已经祈求过两次,则将三个幸运币置入你的手牌。
Praise Galakrond!
潜行者 法术
巨龙降临1使一个随从获得+1攻击力。祈求迦拉克隆。
Devoted Maniac
中立 随从
巨龙降临422突袭,战吼: 祈求迦拉克隆。

可以支持通配符(正则语法)譬如 text::@揭示.*法力值;来寻找所有的“拼点”机制卡牌(版面有限,仅显示前五张)

{{ask
|query = text::@揭示.*法力值;collectible::true
|?name=name
|limit = 5
|format = prettytable
}}

结果:

卡牌来源Mana icon.pngAttack icon.pngHealth icon.png/Weapon-durability.png卡牌描述
Healing Wave
萨满 法术
冠军的试炼3恢复#7点生命值。揭示双方牌库里的一张随从牌。如果你的牌法力值消耗较大,则恢复#14点生命值。
King's Elekk
猎人 随从
冠军的试炼232战吼:揭示双方牌库里的一张随从牌。如果你的牌法力值消耗较大,抽这张牌。
Argent Lance
圣骑士 武器
冠军的试炼222战吼:揭示双方牌库里的一张随从牌。如果你的牌法力值消耗较大,+1耐久度。
Tuskarr Jouster
圣骑士 随从
冠军的试炼555战吼:揭示双方牌库里的一张随从牌。如果你的牌法力值消耗较大,则为你的英雄恢复#7点生命值。
Armored Warhorse
中立 随从
冠军的试炼453战吼:揭示双方牌库里的一张随从牌。如果你的牌法力值消耗较大,则获得冲锋。

并列查询多个条件

可以使用半角逗号对查询条件进行分割,彼此之间以or的关系查询,例如下面的例子,用来查所有圣骑士和法师的奥秘卡牌

{{ask
|query = cardClass::PALADIN,MAGE;collectible::true;mechanics::SECRET;
|?name=name
|limit=10
|format = prettytable
}}

结果:

卡牌来源Mana icon.pngAttack icon.pngHealth icon.png/Weapon-durability.png卡牌描述
Effigy
法师 法术
冠军的试炼3奥秘:当一个友方随从死亡时,随机召唤一个法力值消耗相同的随从。
Competitive Spirit
圣骑士 法术
冠军的试炼1奥秘:在你的回合开始时,使你的所有随从获得+1/+1。
Autodefense Matrix
圣骑士 法术
砰砰计划1奥秘:当你的随从受到攻击时,使其获得圣盾。
Potion of Polymorph
法师 法术
龙争虎斗加基森3奥秘:在你的对手使用一张随从牌后,将其变形成为1/1的绵羊。
Getaway Kodo
圣骑士 法术
龙争虎斗加基森1奥秘:当一个友方随从死亡时,将其移回你的手牌。
Never Surrender!
圣骑士 法术
暗影崛起1奥秘:当你的对手施放一个法术时,使你的所有随从获得+2生命值。
Noble Sacrifice
圣骑士 法术
专家1奥秘:当一个敌人攻击时,召唤一个2/1的防御者,并使其成为攻击的目标。
Eye for an Eye
圣骑士 法术
专家1奥秘: 当你的英雄受到伤害时,对敌方英雄造成等量伤害。
Redemption
圣骑士 法术
专家1奥秘:当一个友方随从死亡时,使其回到战场,并具有1点生命值。
Counterspell
法师 法术
专家3奥秘:当你的对手施放一个法术时,反制该法术。

查询字段说明

所有字段均来自暴雪的数据包,采用小驼峰命名,在请求时注意条件的正确书写。

标题文字 标题文字 标题文字
id 卡牌的暴雪原始id string
type 卡牌的类型,枚举类型 string
cardClass 卡牌的职业分类,枚举类型,大部分卡牌都具有,除了少部分冒险模式的卡牌是没有这个属性的 string
classes 特殊的职业字段,来自加基森扩展中的三职业类型(暗金教等),除此之外的卡牌没有这个字段 string
rarity 卡牌的稀有度,枚举类型 string
set 卡牌的牌组,也是卡牌的来源,一般为扩展包或者其他游戏模式,枚举类型 string
collectible 是否可收集,注意,不可收集的卡牌没有这个字段,仅可收集卡牌保护此字段(值为true) boolean
cost 卡牌打出的默认费用,注意不是mana number
attack 卡牌的攻击力,非随从、武器类卡牌可能为空 number
durability 卡牌的耐久度,非武器类卡牌可能为空 number
techLevel 酒馆战棋卡牌的费用 number
health 卡牌的生命值,英雄卡牌也有这个属性 number
name 卡牌的牌面名称,带有多语言 string
text 卡牌的效果描述文字,带有多语言 string
flavor 卡牌的趣味文字,带有多语言 string
mechanics 卡牌的根机制,是一个列表,注意,一些次生机制(比如拼点、进化等并不包含在其中)枚举类型 list(单个值为string
referencedTags 卡牌的描述性标签,是一个列表,一些机制比如“进化”,是算在这里而不是mechanics中 枚举类型 list(单个值为string
artist 卡牌插图的艺术家名字,可能为空 string
faction 卡牌原型在魔兽世界中的阵营(联盟,部落),并不是所有卡都有这个属性 string
race 卡牌原型在魔兽世界中的种族(精灵、兽人等等),并不是所有卡都有这个属性 枚举类型 string
dbfId hearthstoneJSON网站添加的一个id number

多语言

nametextflavor三个字段带有不同的多语言,默认为简体中文,支持的多语言包括:

多语言 字段后缀 范例
繁体中文 _zhTW name_zhTW
英语(美国) _enUS text_enUS
日语 _jaJP flavor_jaJP

type

['ABILITY'] = '技能',
['BLANK'] = '空白',
['ENCHANTMENT'] = '增益效果',
['GAME'] = '游戏',
['GAME_MODE_BUTTON'] = '游戏模式',
['HERO'] = '英雄',
['HERO_POWER'] = '英雄技能',
['INVALID'] = '无效',
['ITEM'] = '物品',
['MINION'] = '随从',
['MOVE_MINION_HOVER_TARGET'] = 'MOVE_MINION_HOVER_TARGET',
['PLAYER'] = '玩家',
['SPELL'] = '法术',
['TOKEN'] = '指示物',
['WEAPON'] = '武器'

cardClass

['DEATHKNIGHT']	= '死亡骑士',
['DREAM'] = '梦境',
['DRUID'] = '德鲁伊',
['HUNTER'] = '猎人',
['INVALID'] = '无效',
['MAGE'] = '法师',
['NEUTRAL'] = '中立',
['PALADIN'] = '圣骑士',
['PRIEST'] = '牧师',
['ROGUE'] = '潜行者',
['SHAMAN'] = '萨满',
['WARLOCK'] = '术士',
['WARRIOR'] = '战士',
['WHIZBANG'] = '威兹班',
['GRIMY_GOONS'] = '污手党',
['JADE_LOTUS']	= '玉莲帮',
['KABAL'] = '暗金教'

set

['BOOMSDAY'] = '砰砰计划',
['BRM'] = '黑石山的火焰',
['BATTLEGROUNDS'] = '酒馆战棋',
['CHEAT'] = 'CHEAT',
['CORE'] = '经典',
['CREDITS'] = '开发人员',
['DALARAN'] = '暗影崛起',
['DEBUG_SP'] = 'DEBUG_SP',
['DEMO'] = 'DEMO',
['DRAGONS'] = '巨龙降临',
['EXPERT1'] = '专家牌',
['FP1'] = 'FP1',
['FP2'] = 'FP2',
['GANGS'] = '龙争虎斗加基森',
['GANGS_RESERVE'] = 'GANGS_RESERVE',
['GILNEAS'] = '女巫森林',
['GVG'] = '地精大战侏儒',
['HERO SKINS'] = '英雄皮肤',
['HOF'] = '荣誉室',
['ICECROWN'] = '冰封王座的骑士',
['KARA'] = '卡拉赞之夜',
['KARA_RESERVE'] = 'KARA_RESERVE',
['LOE'] = '探险者协会',
['LOOTAPALOOZA'] = '狗头人与地下世界',
['MISSIONS'] = '新手教学',
['NAXX'] = '纳克萨玛斯的诅咒',
['NONE'] = 'NONE',
['OG'] = '上古之神的低语',
['OG_RESERVE'] = 'OG_RESERVE',
['PE1'] = 'PE1',
['PE2'] = 'PE2',
['PROMO'] = 'PROMO',
['REWARD'] = 'REWARD',
['SLUSH'] = 'SLUSH',
['TAVERNS_OF_TIME'] = '时光酒馆',
['TB'] = '乱斗模式',
['TEMP1'] = 'TEMP1',
['TEST_TEMPORARY'] = 'TEST_TEMPORARY',
['TGT'] = '冠军的试炼',
['TROLL'] = '拉斯塔哈的大乱斗',
['ULDUM'] = '奥丹姆奇兵',
['UNGORO'] = '勇闯安戈洛',
['WILD_EVENT'] = 'WILD_EVENT',
['YEAR_OF_THE_DRAGON'] = '巨龙降临'

rarity

['COMMON'] = '普通',
['EPIC'] = '史诗',
['FREE'] = '免费',
['INVALID'] = '无效',
['LEGENDARY'] = '传说',
['RARE'] = '稀有',
['UNKNOWN_6'] = '未知'

GameTag

注意,refrerencedTags和mechanics大部分时间是混在一起的,一些枚举如下,还有很多tags没有一一列出,可以参考完整的列表:Data:Enums.json(GameTag部分)

['ADAPT'] = '进化',
['ADJACENT_BUFF'] = '相邻BUFF',
['AURA'] = '光环',
['BATTLECRY'] = '战吼',
['BOSS'] = 'BOSS',
['CHARGE'] = '冲锋',
['CHOOSE ONE'] = '抉择',
['COMBO'] = '连击',
['DEATHRATTLE'] = '亡语',
['DISCOVER'] = '发现',
['DIVINE SHIELD'] = '圣盾',
['ECHO'] = '回响',
['ENRAGED'] = '激怒',
['FORGETFUL'] = '健忘',
['FREEZE'] = '冻结',
['IMMUNE'] = '免疫',
['INSPIRE'] = '激励',
['INVOKE'] = '祈求',
['LIFESTEAL'] = '吸血',
['MORPH'] = '变形',
['OVERKILL'] = '超杀',
['OVERLOAD'] = '过载',
['POISONOUS'] = '剧毒',
['QUEST'] = '任务',
['RECRUIT'] = '招募',
['RITUAL'] = '邪恶仪式',
['REBORN'] = '复生',
['RUSH'] = '突袭',
['SECRET'] = '奥秘',
['SIDEKICK'] = '跟班',
['SILENCE'] = '沉默',
['SPARE_PART'] = '零件',
['STEALTH'] = '潜行',
['SUMMONED'] = '召唤',
['TAUNT'] = '嘲讽',
['TWINSPELL'] = '双生法术',
['UNTOUCHABLE'] = '不可触碰',
['WINDFURY'] = '风怒',
['JADE GOLEM'] = '青玉魔像'

race

['ALL'] = '全部',
['BEAST'] = '野兽',
['BLANK'] =	'空白',
['BLOODELF'] = '血精灵',
['DEMON'] =	'恶魔',
['DRAENEI'] = '德莱尼',
['DRAGON'] = '龙',
['DWARF'] = '矮人',
['EGG'] = '蛋',
['ELEMENTAL'] = '元素生物',
['GNOME'] =	'侏儒',
['GOBLIN'] = '地精',
['GOBLIN2'] = '地精2',
['HUMAN'] = '人类',
['INVALID'] = '无效',
['MECHANICAL'] = '机械',
['MURLOC'] = '鱼人',
['NERUBIAN'] = '穴居魔',
['NIGHTELF'] = '暗夜精灵',
['OGRE'] = '食人魔',
['ORC'] = '兽人',
['PET'] = '宠物',
['PIRATE'] = '海盗',
['SCOURGE'] = '天灾',
['TAUREN'] = '牛头人',
['TOTEM'] = '图腾',
['TROLL'] = '巨魔',
['UNDEAD'] = '亡灵',
['WORGEN'] = '狼人',
0.0
0人评价
avatar