Applying a Damage to one target now runs DAMAGE_STEPS = [redirect, armor]
first. A damageRedirect aura (Bolf Ramshield, fetched from the wiki) sends
damage meant for its owner's hero to the oldest such minion; Armor absorbs
damage to a hero before Health, logged as the new ArmorLost{player, amount}
just before a full-amount Damaged. Four new Module 4 tests; propagated to the
references of Modules 4-10 in both tracks; card schema, catalog, card JSON,
harness.md, Lessons 2, 4 and 5 updated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
55 lines
4.6 KiB
JSON
55 lines
4.6 KiB
JSON
{
|
|
"$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:]). Effect assemble: put a minion into your hand, chosen from the pool of minions matching filter (filter.trigger: it has a trigger clause with that on), with half its text replaced (Module 5). Effect buffHand: give every minion in your hand +attack/+health. Aura damageRedirect: damage that would be dealt to your hero is dealt to this minion instead (Module 4).",
|
|
"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": { "oneOf": [
|
|
{ "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": ["type", "from", "to"], "properties": {
|
|
"type": { "const": "damageRedirect" },
|
|
"from": { "const": "friendlyHero" },
|
|
"to": { "const": "self" } } }
|
|
] } } },
|
|
{ "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" } } },
|
|
{ "type": "object", "required": ["type", "filter"], "properties": { "type": { "const": "assemble" }, "filter": { "type": "object", "properties": {
|
|
"trigger": { "enum": ["deathrattle", "battlecry", "selfDamaged", "friendlyMinionDamaged", "anyMinionDamaged", "heroDamaged", "endOfTurn"] } } } } },
|
|
{ "type": "object", "required": ["type", "attack", "health"], "properties": { "type": { "const": "buffHand" }, "attack": { "type": "integer", "minimum": 0 }, "health": { "type": "integer", "minimum": 0 } } }
|
|
] } } }
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|