落地无头规则引擎与局内内容,便于命令行复现对战。

规则、卡包与测试放在同一套核心里,避免表现层自行结算。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-09 02:06:23 +08:00
co-authored by Cursor
parent ce2b61fc6a
commit ae13f1d06a
51 changed files with 3429 additions and 0 deletions
+12
View File
@@ -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
}
+13
View File
@@ -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" }] }
]
}
+10
View File
@@ -0,0 +1,10 @@
{
"id": "card.cult.civilian",
"name": "Civilian",
"type": "Creature",
"cost": 0,
"attack": 0,
"health": 1,
"tags": ["creature", "enter", "death"],
"effects": []
}
+18
View File
@@ -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 }
]
}
]
}
+10
View File
@@ -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
}
+15
View File
@@ -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" }]
}
]
}
+15
View File
@@ -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 }]
}
]
}
+10
View File
@@ -0,0 +1,10 @@
{
"id": "card.example.salve",
"name": "Salve",
"type": "Spell",
"cost": 1,
"tags": ["heal"],
"effects": [
{ "op": "Heal", "amount": 2, "target": "SelfPlayer" }
]
}
+10
View File
@@ -0,0 +1,10 @@
{
"id": "card.example.spark",
"name": "Spark",
"type": "Spell",
"cost": 1,
"tags": ["damage"],
"effects": [
{ "op": "Damage", "amount": 1, "target": "ChosenEnemy" }
]
}
+9
View File
@@ -0,0 +1,9 @@
{
"id": "card.example.ward",
"name": "Ward",
"type": "Field",
"cost": 1,
"countdown": 0,
"tags": ["field"],
"effects": []
}
+10
View File
@@ -0,0 +1,10 @@
{
"id": "card.example.wisp",
"name": "Wisp",
"type": "Creature",
"cost": 1,
"attack": 1,
"health": 1,
"tags": ["creature"],
"effects": []
}
+10
View File
@@ -0,0 +1,10 @@
{
"id": "card.guard.captain",
"name": "Captain",
"type": "Creature",
"cost": 3,
"attack": 3,
"health": 4,
"tags": ["creature"],
"effects": []
}
+8
View File
@@ -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 }]
}
+12
View File
@@ -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
}
+13
View File
@@ -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" }] }
]
}
+10
View File
@@ -0,0 +1,10 @@
{
"id": "card.guard.militia",
"name": "Militia",
"type": "Creature",
"cost": 1,
"attack": 1,
"health": 1,
"tags": ["creature", "enter", "death"],
"effects": []
}
+8
View File
@@ -0,0 +1,8 @@
{
"id": "card.guard.orders",
"name": "Orders",
"type": "Spell",
"cost": 2,
"tags": ["creature"],
"effects": [{ "op": "BuffAllFriendly", "amount": 1, "amount2": 1 }]
}
+10
View File
@@ -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" }]
}
+8
View File
@@ -0,0 +1,8 @@
{
"id": "card.guard.ration",
"name": "Ration Order",
"type": "Spell",
"cost": 3,
"tags": ["draw"],
"effects": [{ "op": "Draw", "amount": 2 }]
}
+12
View File
@@ -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 }] }
]
}
+16
View File
@@ -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"
]
}
View File
View File
+11
View File
@@ -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 }
]
}
+8
View File
@@ -0,0 +1,8 @@
{
"id": "pack.example.base",
"name": "Common Stock",
"base": true,
"coreActions": [],
"cards": ["card.example.spark", "card.example.wisp"],
"allOf": []
}
+10
View File
@@ -0,0 +1,10 @@
{
"id": "pack.example.vitality",
"name": "Vitality",
"base": false,
"coreActions": ["Heal"],
"cards": ["card.example.salve"],
"allOf": [
{ "kind": "HealReceivedAtLeast", "amount": 2 }
]
}