落地无头规则引擎与局内内容,便于命令行复现对战。
规则、卡包与测试放在同一套核心里,避免表现层自行结算。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"id": "card.cult.believer",
|
||||
"name": "Believer",
|
||||
"type": "Creature",
|
||||
"cost": 1,
|
||||
"attack": 1,
|
||||
"health": 2,
|
||||
"tags": ["creature", "death"],
|
||||
"effects": [],
|
||||
"activate": [{ "op": "TransferStatsThenDie" }],
|
||||
"activateNeedsFriendly": true
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"id": "card.cult.camp",
|
||||
"name": "Labor Camp",
|
||||
"type": "Field",
|
||||
"cost": 2,
|
||||
"countdown": 4,
|
||||
"tags": ["field", "supply", "countdown", "enter"],
|
||||
"effects": [],
|
||||
"triggers": [
|
||||
{ "when": "TurnStart", "effects": [{ "op": "GenerateEnergy", "amount": 1 }] },
|
||||
{ "when": "OpponentTurnEnd", "effects": [{ "op": "Summon", "cardId": "card.cult.civilian" }] }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "card.cult.civilian",
|
||||
"name": "Civilian",
|
||||
"type": "Creature",
|
||||
"cost": 0,
|
||||
"attack": 0,
|
||||
"health": 1,
|
||||
"tags": ["creature", "enter", "death"],
|
||||
"effects": []
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "card.cult.mine",
|
||||
"name": "Labor Mine",
|
||||
"type": "Field",
|
||||
"cost": 1,
|
||||
"countdown": 3,
|
||||
"tags": ["field", "supply", "countdown", "enter"],
|
||||
"effects": [],
|
||||
"triggers": [
|
||||
{
|
||||
"when": "OnEnterBoard",
|
||||
"effects": [
|
||||
{ "op": "GenerateEnergy", "amount": 1 },
|
||||
{ "op": "ModifyCountdown", "amount": -1 }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "card.cult.vilefire",
|
||||
"name": "Vile Fire",
|
||||
"type": "Spell",
|
||||
"cost": 2,
|
||||
"tags": ["damage", "death"],
|
||||
"effects": [{ "customEffect": "vile_fire" }],
|
||||
"playNeedsFriendly": true,
|
||||
"playNeedsEnemy": true
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "card.example.fuse",
|
||||
"name": "Fuse",
|
||||
"type": "Field",
|
||||
"cost": 1,
|
||||
"countdown": 1,
|
||||
"tags": ["field", "countdown"],
|
||||
"effects": [],
|
||||
"triggers": [
|
||||
{
|
||||
"when": "OnDestroyed",
|
||||
"effects": [{ "op": "Damage", "amount": 2, "target": "OpponentPlayer" }]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "card.example.lantern",
|
||||
"name": "Lantern",
|
||||
"type": "Field",
|
||||
"cost": 1,
|
||||
"countdown": 3,
|
||||
"tags": ["field", "supply", "countdown"],
|
||||
"effects": [],
|
||||
"triggers": [
|
||||
{
|
||||
"when": "TurnStart",
|
||||
"effects": [{ "op": "GenerateEnergy", "amount": 1 }]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "card.example.salve",
|
||||
"name": "Salve",
|
||||
"type": "Spell",
|
||||
"cost": 1,
|
||||
"tags": ["heal"],
|
||||
"effects": [
|
||||
{ "op": "Heal", "amount": 2, "target": "SelfPlayer" }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "card.example.spark",
|
||||
"name": "Spark",
|
||||
"type": "Spell",
|
||||
"cost": 1,
|
||||
"tags": ["damage"],
|
||||
"effects": [
|
||||
{ "op": "Damage", "amount": 1, "target": "ChosenEnemy" }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"id": "card.example.ward",
|
||||
"name": "Ward",
|
||||
"type": "Field",
|
||||
"cost": 1,
|
||||
"countdown": 0,
|
||||
"tags": ["field"],
|
||||
"effects": []
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "card.example.wisp",
|
||||
"name": "Wisp",
|
||||
"type": "Creature",
|
||||
"cost": 1,
|
||||
"attack": 1,
|
||||
"health": 1,
|
||||
"tags": ["creature"],
|
||||
"effects": []
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "card.guard.captain",
|
||||
"name": "Captain",
|
||||
"type": "Creature",
|
||||
"cost": 3,
|
||||
"attack": 3,
|
||||
"health": 4,
|
||||
"tags": ["creature"],
|
||||
"effects": []
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"id": "card.guard.conscript",
|
||||
"name": "Conscript Crossbow",
|
||||
"type": "Spell",
|
||||
"cost": 2,
|
||||
"tags": ["creature"],
|
||||
"effects": [{ "op": "CreateInHand", "cardId": "card.guard.crossbow", "amount": 1 }]
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"id": "card.guard.crossbow",
|
||||
"name": "Crossbowman",
|
||||
"type": "Creature",
|
||||
"cost": 3,
|
||||
"attack": 2,
|
||||
"health": 4,
|
||||
"tags": ["creature"],
|
||||
"effects": [],
|
||||
"activate": [{ "op": "Damage", "amount": -1, "target": "ChosenEnemy" }],
|
||||
"activateNeedsEnemy": true
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"id": "card.guard.farm",
|
||||
"name": "Farmstead",
|
||||
"type": "Field",
|
||||
"cost": 2,
|
||||
"countdown": 0,
|
||||
"tags": ["field", "supply", "draw"],
|
||||
"effects": [],
|
||||
"triggers": [
|
||||
{ "when": "TurnStart", "effects": [{ "op": "GenerateEnergy", "amount": 1 }] },
|
||||
{ "when": "OnSupply", "effects": [{ "op": "ShuffleIntoDeck", "cardId": "card.guard.militia" }] }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "card.guard.militia",
|
||||
"name": "Militia",
|
||||
"type": "Creature",
|
||||
"cost": 1,
|
||||
"attack": 1,
|
||||
"health": 1,
|
||||
"tags": ["creature", "enter", "death"],
|
||||
"effects": []
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"id": "card.guard.orders",
|
||||
"name": "Orders",
|
||||
"type": "Spell",
|
||||
"cost": 2,
|
||||
"tags": ["creature"],
|
||||
"effects": [{ "op": "BuffAllFriendly", "amount": 1, "amount2": 1 }]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "card.guard.patrol",
|
||||
"name": "Patrol",
|
||||
"type": "Creature",
|
||||
"cost": 1,
|
||||
"attack": 1,
|
||||
"health": 2,
|
||||
"tags": ["creature", "enter"],
|
||||
"effects": [{ "op": "Summon", "cardId": "card.guard.militia" }]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"id": "card.guard.ration",
|
||||
"name": "Ration Order",
|
||||
"type": "Spell",
|
||||
"cost": 3,
|
||||
"tags": ["draw"],
|
||||
"effects": [{ "op": "Draw", "amount": 2 }]
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"id": "card.system.base_field",
|
||||
"name": "Base Camp",
|
||||
"type": "Field",
|
||||
"cost": 0,
|
||||
"countdown": 3,
|
||||
"tags": ["field", "supply", "countdown"],
|
||||
"effects": [],
|
||||
"triggers": [
|
||||
{ "when": "TurnStart", "effects": [{ "op": "GenerateEnergy", "amount": 1 }] }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"id": "char.example.ash",
|
||||
"name": "Ash",
|
||||
"coreActions": ["Damage", "Heal"],
|
||||
"bridge": "Damage+Heal",
|
||||
"skill": {
|
||||
"id": "skill.ash.ember",
|
||||
"summary": "Healing you receive also nudges damage spells. Combat effect not wired yet."
|
||||
},
|
||||
"startingDeck": [
|
||||
"card.example.spark",
|
||||
"card.example.spark",
|
||||
"card.example.salve",
|
||||
"card.example.wisp"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "pack.example.aftermath",
|
||||
"name": "Aftermath",
|
||||
"base": false,
|
||||
"coreActions": ["Destroy", "Countdown"],
|
||||
"cards": ["card.example.fuse"],
|
||||
"allOf": [
|
||||
{ "kind": "DeckTagAtLeast", "tag": "countdown", "amount": 1 },
|
||||
{ "kind": "FriendlyDestroyedAtLeast", "amount": 1 }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"id": "pack.example.base",
|
||||
"name": "Common Stock",
|
||||
"base": true,
|
||||
"coreActions": [],
|
||||
"cards": ["card.example.spark", "card.example.wisp"],
|
||||
"allOf": []
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "pack.example.vitality",
|
||||
"name": "Vitality",
|
||||
"base": false,
|
||||
"coreActions": ["Heal"],
|
||||
"cards": ["card.example.salve"],
|
||||
"allOf": [
|
||||
{ "kind": "HealReceivedAtLeast", "amount": 2 }
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user