Add card data module with ironclad starter deck
This commit is contained in:
parent
690ffbe43c
commit
08214fc8cb
4 changed files with 92 additions and 0 deletions
19
data/enemies.json
Normal file
19
data/enemies.json
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"jaw_worm": {
|
||||||
|
"id": "jaw_worm",
|
||||||
|
"name": "Jaw Worm",
|
||||||
|
"hp": 6,
|
||||||
|
"actionType": "die",
|
||||||
|
"actions": {
|
||||||
|
"1": { "intent": "attack", "effects": [{ "type": "hit", "value": 2 }] },
|
||||||
|
"2": { "intent": "attack", "effects": [{ "type": "hit", "value": 2 }] },
|
||||||
|
"3": { "intent": "defend", "effects": [{ "type": "block", "value": 2 }] },
|
||||||
|
"4": { "intent": "defend", "effects": [{ "type": "block", "value": 2 }] },
|
||||||
|
"5": {
|
||||||
|
"intent": "buff",
|
||||||
|
"effects": [{ "type": "strength", "value": 1 }]
|
||||||
|
},
|
||||||
|
"6": { "intent": "buff", "effects": [{ "type": "strength", "value": 1 }] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
35
data/starter-ironclad.json
Normal file
35
data/starter-ironclad.json
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
{
|
||||||
|
"strike_r": {
|
||||||
|
"id": "strike_r",
|
||||||
|
"name": "Strike",
|
||||||
|
"cost": 1,
|
||||||
|
"type": "attack",
|
||||||
|
"effects": [{ "type": "hit", "value": 1 }],
|
||||||
|
"keywords": [],
|
||||||
|
"description": "1 hit.",
|
||||||
|
"image": "assets/images/ironclad/starter/1.png"
|
||||||
|
},
|
||||||
|
"defend_r": {
|
||||||
|
"id": "defend_r",
|
||||||
|
"name": "Defend",
|
||||||
|
"cost": 1,
|
||||||
|
"type": "skill",
|
||||||
|
"effects": [{ "type": "block", "value": 1 }],
|
||||||
|
"keywords": [],
|
||||||
|
"description": "1 Block.",
|
||||||
|
"image": "assets/images/ironclad/starter/2.png"
|
||||||
|
},
|
||||||
|
"bash": {
|
||||||
|
"id": "bash",
|
||||||
|
"name": "Bash",
|
||||||
|
"cost": 2,
|
||||||
|
"type": "attack",
|
||||||
|
"effects": [
|
||||||
|
{ "type": "hit", "value": 2 },
|
||||||
|
{ "type": "vulnerable", "value": 1 }
|
||||||
|
],
|
||||||
|
"keywords": [],
|
||||||
|
"description": "2 hit. Apply 1 Vulnerable.",
|
||||||
|
"image": "assets/images/ironclad/starter/0.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
14
src/cards.js
Normal file
14
src/cards.js
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
import starterIronclad from "../data/starter-ironclad.json";
|
||||||
|
|
||||||
|
const cardDb = { ...starterIronclad };
|
||||||
|
|
||||||
|
export function getCard(id) {
|
||||||
|
return cardDb[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getStarterDeck(character) {
|
||||||
|
if (character === "ironclad") {
|
||||||
|
return [...Array(5).fill("strike_r"), ...Array(4).fill("defend_r"), "bash"];
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
}
|
||||||
24
src/cards.test.js
Normal file
24
src/cards.test.js
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
import { describe, expect, test } from "bun:test";
|
||||||
|
import { getCard, getStarterDeck } from "./cards.js";
|
||||||
|
|
||||||
|
describe("cards", () => {
|
||||||
|
test("getCard returns card by id", () => {
|
||||||
|
const card = getCard("strike_r");
|
||||||
|
expect(card.name).toBe("Strike");
|
||||||
|
expect(card.cost).toBe(1);
|
||||||
|
expect(card.type).toBe("attack");
|
||||||
|
expect(card.effects[0].type).toBe("hit");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("getCard returns undefined for unknown id", () => {
|
||||||
|
expect(getCard("nonexistent")).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
test("getStarterDeck returns 10 card ids for ironclad", () => {
|
||||||
|
const deck = getStarterDeck("ironclad");
|
||||||
|
expect(deck).toHaveLength(10);
|
||||||
|
expect(deck.filter((id) => id === "strike_r")).toHaveLength(5);
|
||||||
|
expect(deck.filter((id) => id === "defend_r")).toHaveLength(4);
|
||||||
|
expect(deck.filter((id) => id === "bash")).toHaveLength(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
Loading…
Reference in a new issue