feat: card/level schemas and verified catalog

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas WintherandClaude Sonnet 5.5 committed 2026-10-29 00:00:21 +01:00
1 parent 9a00b8ac18
commit a4b72ad110
10 files changed
+545

No files matched your search

+388
View File
@@ -0,0 +1,388 @@
[
{
"name": "Armorsmith",
"kind": "card",
"type": "minion",
"cost": 2,
"attack": 1,
"health": 4,
"text": "Whenever a friendly minion takes damage, gain 1 Armor.",
"source": "https://hearthstone.wiki.gg/wiki/Armorsmith"
},
{
"name": "Acolyte of Pain",
"kind": "card",
"type": "minion",
"cost": 3,
"attack": 1,
"health": 4,
"text": "Whenever this minion takes damage, draw a card.",
"source": "https://hearthstone.wiki.gg/wiki/Acolyte_of_Pain"
},
{
"name": "Frothing Berserker",
"kind": "card",
"type": "minion",
"cost": 3,
"attack": 2,
"health": 4,
"text": "Whenever a minion takes damage, gain +1 Attack.",
"source": "https://hearthstone.wiki.gg/wiki/Frothing_Berserker"
},
{
"name": "Loot Hoarder",
"kind": "card",
"type": "minion",
"cost": 2,
"attack": 2,
"health": 1,
"text": "Deathrattle: Draw a card.",
"source": "https://hearthstone.wiki.gg/wiki/Loot_Hoarder"
},
{
"name": "Baron Rivendare",
"kind": "card",
"type": "minion",
"cost": 4,
"attack": 1,
"health": 7,
"text": "Your minions trigger their Deathrattles twice.",
"source": "https://hearthstone.wiki.gg/wiki/Baron_Rivendare"
},
{
"name": "Twisting Nether",
"kind": "card",
"type": "spell",
"cost": 8,
"text": "Destroy all minions and locations.",
"source": "https://hearthstone.wiki.gg/wiki/Twisting_Nether"
},
{
"name": "Whirlwind",
"kind": "card",
"type": "spell",
"cost": 1,
"text": "Deal 1 damage to ALL minions.",
"source": "https://hearthstone.wiki.gg/wiki/Whirlwind"
},
{
"name": "Unstable Ghoul",
"kind": "card",
"type": "minion",
"cost": 2,
"attack": 1,
"health": 3,
"text": "Taunt. Deathrattle: Deal 1 damage to all minions.",
"source": "https://hearthstone.wiki.gg/wiki/Unstable_Ghoul"
},
{
"name": "Harvest Golem",
"kind": "card",
"type": "minion",
"cost": 3,
"attack": 2,
"health": 3,
"text": "Deathrattle: Summon a 2/1 Damaged Golem.",
"source": "https://hearthstone.wiki.gg/wiki/Harvest_Golem"
},
{
"name": "Damaged Golem",
"kind": "card",
"type": "minion",
"cost": 1,
"attack": 2,
"health": 1,
"text": "",
"source": "https://hearthstone.wiki.gg/wiki/Damaged_Golem",
"uncollectible": true
},
{
"name": "Brann Bronzebeard",
"kind": "card",
"type": "minion",
"cost": 3,
"attack": 2,
"health": 4,
"text": "Your Battlecries trigger twice.",
"source": "https://hearthstone.wiki.gg/wiki/Brann_Bronzebeard"
},
{
"name": "Drakkari Enchanter",
"kind": "card",
"type": "minion",
"cost": 3,
"attack": 1,
"health": 5,
"text": "Your end of turn effects trigger twice.",
"source": "https://hearthstone.wiki.gg/wiki/Drakkari_Enchanter"
},
{
"name": "Novice Engineer",
"kind": "card",
"type": "minion",
"cost": 2,
"attack": 1,
"health": 1,
"text": "Battlecry: Draw a card.",
"source": "https://hearthstone.wiki.gg/wiki/Novice_Engineer"
},
{
"name": "Dread Infernal",
"kind": "card",
"type": "minion",
"cost": 6,
"attack": 6,
"health": 6,
"text": "Battlecry: Deal 1 damage to ALL other characters.",
"source": "https://hearthstone.wiki.gg/wiki/Dread_Infernal"
},
{
"name": "Fleshshape",
"kind": "card",
"type": "spell",
"cost": 3,
"text": "Assemble a Deathrattle minion. Give all minions in your hand +2/+2.",
"source": "https://hearthstone.wiki.gg/wiki/Fleshshape"
},
{
"name": "Test Echo",
"kind": "card",
"type": "minion",
"cost": 1,
"attack": 1,
"health": 5,
"text": "Whenever a minion takes damage, deal 1 damage to the enemy hero.",
"fictional": true
},
{
"name": "Test Reactor",
"kind": "card",
"type": "minion",
"cost": 1,
"attack": 1,
"health": 5,
"text": "Whenever a hero takes damage, gain +1 Attack.",
"fictional": true
},
{
"name": "Test Filler",
"kind": "card",
"type": "minion",
"cost": 1,
"attack": 1,
"health": 1,
"text": "",
"fictional": true
},
{
"name": "BABA",
"kind": "word",
"role": "noun",
"text": "the Baba creature",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "ROCK",
"kind": "word",
"role": "noun",
"text": "a pushable boulder",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "WALL",
"kind": "word",
"role": "noun",
"text": "a wall",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "FLAG",
"kind": "word",
"role": "noun",
"text": "a flag",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "LAVA",
"kind": "word",
"role": "noun",
"text": "lava",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "KEY",
"kind": "word",
"role": "noun",
"text": "a key",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "DOOR",
"kind": "word",
"role": "noun",
"text": "a door",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "SKULL",
"kind": "word",
"role": "noun",
"text": "a skull",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "WATER",
"kind": "word",
"role": "noun",
"text": "water",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "IS",
"kind": "word",
"role": "operator",
"text": "links a noun to a property or another noun",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "AND",
"kind": "word",
"role": "operator",
"text": "joins nouns or properties",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "NOT",
"kind": "word",
"role": "operator",
"text": "negates the property or noun after IS",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "YOU",
"kind": "word",
"role": "property",
"text": "player controls these",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "WIN",
"kind": "word",
"role": "property",
"text": "touching a YOU object wins",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "PUSH",
"kind": "word",
"role": "property",
"text": "can be pushed",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "STOP",
"kind": "word",
"role": "property",
"text": "blocks movement",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "OPEN",
"kind": "word",
"role": "property",
"text": "opens SHUT objects on contact",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "SHUT",
"kind": "word",
"role": "property",
"text": "blocks until opened",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "HOT",
"kind": "word",
"role": "property",
"text": "melts MELT objects",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "MELT",
"kind": "word",
"role": "property",
"text": "destroyed by HOT",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "SINK",
"kind": "word",
"role": "property",
"text": "destroys itself and what shares its tile",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "DEFEAT",
"kind": "word",
"role": "property",
"text": "destroys YOU objects on contact",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "FLOAT",
"kind": "word",
"role": "property",
"text": "shares a tile layer with non-floating objects",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "WEAK",
"kind": "word",
"role": "property",
"text": "destroyed on contact",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "PULL",
"kind": "word",
"role": "property",
"text": "pulled by a mover",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "DOUBLE",
"kind": "word",
"role": "property",
"text": "effects apply twice",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "TEXT",
"kind": "word",
"role": "meta",
"text": "every text object (a noun about text itself)",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "ALL",
"kind": "word",
"role": "meta",
"text": "every object",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "EMPTY",
"kind": "word",
"role": "meta",
"text": "empty tiles",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md"
},
{
"name": "DEATHRATTLE",
"kind": "word",
"role": "noun",
"text": "a trigger type, so DEATHRATTLE IS DOUBLE doubles deathrattles",
"source": "https://github.com/utilForever/baba-is-auto/blob/main/Documents/rule-language.md",
"game": "spellgrid"
}
]
+45
View File
@@ -0,0 +1,45 @@
{
"$comment": "Structured card text. A trigger clause applies to the effect clauses after it until the next trigger/keyword/aura. split divides top (text[0:split]) from bottom (text[split:]).",
"type": "object",
"required": ["name", "type", "cost", "text", "split"],
"properties": {
"name": { "type": "string" },
"type": { "enum": ["minion", "spell"] },
"cost": { "type": "integer", "minimum": 0 },
"attack": { "type": "integer", "minimum": 0 },
"health": { "type": "integer", "minimum": 1 },
"noun": { "type": "string" },
"split": { "type": "integer", "minimum": 0 },
"fictional": { "type": "boolean" },
"game": { "type": "string" },
"text": {
"type": "array",
"items": {
"oneOf": [
{ "type": "object", "required": ["kind", "keyword"], "properties": { "kind": { "const": "keyword" }, "keyword": { "type": "string" } } },
{ "type": "object", "required": ["kind", "on"], "properties": {
"kind": { "const": "trigger" },
"on": { "enum": ["deathrattle", "battlecry", "selfDamaged", "friendlyMinionDamaged", "anyMinionDamaged", "heroDamaged", "endOfTurn"] } } },
{ "type": "object", "required": ["kind", "modifier"], "properties": {
"kind": { "const": "aura" },
"modifier": { "type": "object", "required": ["type", "trigger", "times", "stacking"], "properties": {
"type": { "const": "triggerMultiplier" },
"trigger": { "enum": ["deathrattle", "battlecry", "selfDamaged", "friendlyMinionDamaged", "anyMinionDamaged", "heroDamaged", "endOfTurn"] },
"times": { "type": "integer", "minimum": 2 },
"stacking": { "enum": ["max", "additive"] } } } } },
{ "type": "object", "required": ["kind", "effect"], "properties": {
"kind": { "const": "effect" },
"effect": { "oneOf": [
{ "type": "object", "required": ["type", "target", "amount"], "properties": { "type": { "const": "dealDamage" }, "target": { "enum": ["self", "allMinions", "allOtherMinions", "allOtherCharacters", "enemyHero", "chosen"] }, "amount": { "type": "integer", "minimum": 0 } } },
{ "type": "object", "required": ["type", "count"], "properties": { "type": { "const": "draw" }, "count": { "type": "integer", "minimum": 1 } } },
{ "type": "object", "required": ["type", "card", "count"], "properties": { "type": { "const": "summon" }, "card": { "type": "string" }, "count": { "type": "integer", "minimum": 1 } } },
{ "type": "object", "required": ["type", "amount"], "properties": { "type": { "const": "gainArmor" }, "amount": { "type": "integer", "minimum": 1 } } },
{ "type": "object", "required": ["type", "target", "amount"], "properties": { "type": { "const": "gainAttack" }, "target": { "enum": ["self", "allMinions", "allOtherMinions", "allOtherCharacters", "enemyHero", "chosen"] }, "amount": { "type": "integer" } } },
{ "type": "object", "required": ["type", "target"], "properties": { "type": { "const": "destroy" }, "target": { "enum": ["self", "allMinions", "allOtherMinions", "allOtherCharacters", "enemyHero", "chosen"] } } },
{ "type": "object", "required": ["type", "word", "at"], "properties": { "type": { "const": "spawnText" }, "word": { "type": "string" }, "at": { "const": "self" } } }
] } } }
]
}
}
}
}
+13
View File
@@ -0,0 +1,13 @@
{
"$comment": "x grows right, y grows down.",
"type": "object",
"required": ["width", "height", "objects"],
"properties": {
"width": { "type": "integer", "minimum": 1 },
"height": { "type": "integer", "minimum": 1 },
"objects": { "type": "array", "items": { "type": "object", "required": ["kind", "x", "y"],
"properties": { "kind": { "type": "string" }, "x": { "type": "integer", "minimum": 0 }, "y": { "type": "integer", "minimum": 0 } } } },
"cards": { "type": "array", "items": { "type": "object", "required": ["card", "x", "y"],
"properties": { "card": { "type": "string" }, "x": { "type": "integer", "minimum": 0 }, "y": { "type": "integer", "minimum": 0 } } } }
}
}