From 08214fc8cbb6d568bbd8c5b40c61309d84dfa0e3 Mon Sep 17 00:00:00 2001 From: Jared Miller Date: Mon, 23 Feb 2026 17:34:05 -0500 Subject: [PATCH] Add card data module with ironclad starter deck --- data/enemies.json | 19 +++++++++++++++++++ data/starter-ironclad.json | 35 +++++++++++++++++++++++++++++++++++ src/cards.js | 14 ++++++++++++++ src/cards.test.js | 24 ++++++++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 data/enemies.json create mode 100644 data/starter-ironclad.json create mode 100644 src/cards.js create mode 100644 src/cards.test.js diff --git a/data/enemies.json b/data/enemies.json new file mode 100644 index 0000000..51b5856 --- /dev/null +++ b/data/enemies.json @@ -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 }] } + } + } +} diff --git a/data/starter-ironclad.json b/data/starter-ironclad.json new file mode 100644 index 0000000..50d8356 --- /dev/null +++ b/data/starter-ironclad.json @@ -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" + } +} diff --git a/src/cards.js b/src/cards.js new file mode 100644 index 0000000..0eb7456 --- /dev/null +++ b/src/cards.js @@ -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 []; +} diff --git a/src/cards.test.js b/src/cards.test.js new file mode 100644 index 0000000..00ada4c --- /dev/null +++ b/src/cards.test.js @@ -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); + }); +});