diff --git a/CardList.json b/CardList.json index 0315b44..051b628 100644 --- a/CardList.json +++ b/CardList.json @@ -69,17 +69,17 @@ "id": "003", "face": { "front": { - "name": "CompositeGesture", + "name": "ResidualDividend", "type": "Unit", "cost": 1, "image": "https://docs.brut.systems/judah/entropy/003.png", "isHorizontal": true } }, - "name": "CompositeGesture", + "name": "ResidualDividend", "type": "Unit", "cost": 1, - "isToken": false, + "isToken": true, "Lane": "🟥 Red", "Entropy": 1, "Force": 1, @@ -91,14 +91,58 @@ "id": "004", "face": { "front": { - "name": "BareLapse", + "name": "ConcaveCartilage", "type": "Unit", - "cost": 2, + "cost": 1, "image": "https://docs.brut.systems/judah/entropy/004.png", "isHorizontal": true } }, - "name": "BareLapse", + "name": "ConcaveCartilage", + "type": "Unit", + "cost": 1, + "isToken": true, + "Lane": "🟦 Blue", + "Entropy": 1, + "Force": 1, + "_legal": { + "playtest": true + } + }, + "005": { + "id": "005", + "face": { + "front": { + "name": "BareAperture", + "type": "Unit", + "cost": 1, + "image": "https://docs.brut.systems/judah/entropy/005.png", + "isHorizontal": true + } + }, + "name": "BareAperture", + "type": "Unit", + "cost": 1, + "isToken": false, + "Lane": "🟥 Red", + "Entropy": 1, + "Force": 1, + "_legal": { + "playtest": true + } + }, + "006": { + "id": "006", + "face": { + "front": { + "name": "ConvergentGradient", + "type": "Unit", + "cost": 2, + "image": "https://docs.brut.systems/judah/entropy/006.png", + "isHorizontal": true + } + }, + "name": "ConvergentGradient", "type": "Unit", "cost": 2, "isToken": false, @@ -109,18 +153,18 @@ "playtest": true } }, - "005": { - "id": "005", + "007": { + "id": "007", "face": { "front": { - "name": "ExcessCompact", + "name": "CivicTendon", "type": "Unit", "cost": 3, - "image": "https://docs.brut.systems/judah/entropy/005.png", + "image": "https://docs.brut.systems/judah/entropy/007.png", "isHorizontal": true } }, - "name": "ExcessCompact", + "name": "CivicTendon", "type": "Unit", "cost": 3, "isToken": false, @@ -131,18 +175,18 @@ "playtest": true } }, - "006": { - "id": "006", + "008": { + "id": "008", "face": { "front": { - "name": "ErrantTendon", + "name": "WarmOffset", "type": "Unit", "cost": 4, - "image": "https://docs.brut.systems/judah/entropy/006.png", + "image": "https://docs.brut.systems/judah/entropy/008.png", "isHorizontal": true } }, - "name": "ErrantTendon", + "name": "WarmOffset", "type": "Unit", "cost": 4, "isToken": false, @@ -153,24 +197,442 @@ "playtest": true } }, - "007": { - "id": "007", + "009": { + "id": "009", "face": { "front": { - "name": "BluntSurplus", + "name": "PartialCartilage", "type": "Unit", - "cost": 10, - "image": "https://docs.brut.systems/judah/entropy/007.png", + "cost": 5, + "image": "https://docs.brut.systems/judah/entropy/009.png", "isHorizontal": true } }, - "name": "BluntSurplus", + "name": "PartialCartilage", + "type": "Unit", + "cost": 5, + "isToken": false, + "Lane": "🟥 Red", + "Entropy": 5, + "Force": 5, + "_legal": { + "playtest": true + } + }, + "010": { + "id": "010", + "face": { + "front": { + "name": "DullSubstrate", + "type": "Unit", + "cost": 5, + "image": "https://docs.brut.systems/judah/entropy/010.png", + "isHorizontal": true + } + }, + "name": "DullSubstrate", + "type": "Unit", + "cost": 5, + "isToken": false, + "Lane": "🟥 Red", + "Entropy": 5, + "Force": 3, + "_legal": { + "playtest": true + } + }, + "011": { + "id": "011", + "face": { + "front": { + "name": "WarmGesture", + "type": "Unit", + "cost": 5, + "image": "https://docs.brut.systems/judah/entropy/011.png", + "isHorizontal": true + } + }, + "name": "WarmGesture", + "type": "Unit", + "cost": 5, + "isToken": false, + "Lane": "🟥 Red", + "Entropy": 5, + "Force": 3, + "_legal": { + "playtest": true + } + }, + "012": { + "id": "012", + "face": { + "front": { + "name": "BareConviction", + "type": "Unit", + "cost": 3, + "image": "https://docs.brut.systems/judah/entropy/012.png", + "isHorizontal": true + } + }, + "name": "BareConviction", + "type": "Unit", + "cost": 3, + "isToken": false, + "Lane": "🟥 Red", + "Entropy": 3, + "Force": 2, + "_legal": { + "playtest": true + } + }, + "013": { + "id": "013", + "face": { + "front": { + "name": "PolarVolume", + "type": "Unit", + "cost": 3, + "image": "https://docs.brut.systems/judah/entropy/013.png", + "isHorizontal": true + } + }, + "name": "PolarVolume", + "type": "Unit", + "cost": 3, + "isToken": false, + "Lane": "🟥 Red", + "Entropy": 3, + "Force": 1, + "_legal": { + "playtest": true + } + }, + "014": { + "id": "014", + "face": { + "front": { + "name": "DullSurplus", + "type": "Unit", + "cost": 5, + "image": "https://docs.brut.systems/judah/entropy/014.png", + "isHorizontal": true + } + }, + "name": "DullSurplus", + "type": "Unit", + "cost": 5, + "isToken": false, + "Lane": "🟥 Red", + "Entropy": 5, + "Force": 0, + "_legal": { + "playtest": true + } + }, + "015": { + "id": "015", + "face": { + "front": { + "name": "PolarAxis", + "type": "Unit", + "cost": 4, + "image": "https://docs.brut.systems/judah/entropy/015.png", + "isHorizontal": true + } + }, + "name": "PolarAxis", + "type": "Unit", + "cost": 4, + "isToken": false, + "Lane": "🟦 Blue", + "Entropy": 4, + "Force": 0, + "_legal": { + "playtest": true + } + }, + "016": { + "id": "016", + "face": { + "front": { + "name": "WarmRapport", + "type": "Unit", + "cost": 2, + "image": "https://docs.brut.systems/judah/entropy/016.png", + "isHorizontal": true + } + }, + "name": "WarmRapport", + "type": "Unit", + "cost": 2, + "isToken": false, + "Lane": "🟦 Blue", + "Entropy": 2, + "Force": 2, + "_legal": { + "playtest": true + } + }, + "017": { + "id": "017", + "face": { + "front": { + "name": "RagingAxis", + "type": "Unit", + "cost": 2, + "image": "https://docs.brut.systems/judah/entropy/017.png", + "isHorizontal": true + } + }, + "name": "RagingAxis", + "type": "Unit", + "cost": 2, + "isToken": false, + "Lane": "🟦 Blue", + "Entropy": 2, + "Force": 2, + "_legal": { + "playtest": true + } + }, + "018": { + "id": "018", + "face": { + "front": { + "name": "VampiricMembrane", + "type": "Unit", + "cost": 3, + "image": "https://docs.brut.systems/judah/entropy/018.png", + "isHorizontal": true + } + }, + "name": "VampiricMembrane", + "type": "Unit", + "cost": 3, + "isToken": false, + "Lane": "🟦 Blue", + "Entropy": 3, + "Force": 3, + "_legal": { + "playtest": true + } + }, + "019": { + "id": "019", + "face": { + "front": { + "name": "WarmFilament", + "type": "Unit", + "cost": 2, + "image": "https://docs.brut.systems/judah/entropy/019.png", + "isHorizontal": true + } + }, + "name": "WarmFilament", + "type": "Unit", + "cost": 2, + "isToken": false, + "Lane": "🟦 Blue", + "Entropy": 2, + "Force": 0, + "_legal": { + "playtest": true + } + }, + "020": { + "id": "020", + "face": { + "front": { + "name": "FormerShrine", + "type": "Unit", + "cost": 8, + "image": "https://docs.brut.systems/judah/entropy/020.png", + "isHorizontal": true + } + }, + "name": "FormerShrine", + "type": "Unit", + "cost": 8, + "isToken": false, + "Lane": "🟦 Blue", + "Entropy": 8, + "Force": 3, + "_legal": { + "playtest": true + } + }, + "021": { + "id": "021", + "face": { + "front": { + "name": "SoftFilament", + "type": "Unit", + "cost": 10, + "image": "https://docs.brut.systems/judah/entropy/021.png", + "isHorizontal": true + } + }, + "name": "SoftFilament", "type": "Unit", "cost": 10, "isToken": false, - "Lane": "🟥 Red", + "Lane": "🟦 Blue", "Entropy": 10, - "Force": 10, + "Force": 5, + "_legal": { + "playtest": true + } + }, + "022": { + "id": "022", + "face": { + "front": { + "name": "NominalSurplus", + "type": "Spell", + "cost": 3, + "image": "https://docs.brut.systems/judah/entropy/022.png", + "isHorizontal": true + } + }, + "name": "NominalSurplus", + "type": "Spell", + "cost": 3, + "isToken": false, + "Lane": "🟩 Green", + "Entropy": 3, + "Force": 0, + "_legal": { + "playtest": true + } + }, + "023": { + "id": "023", + "face": { + "front": { + "name": "MootSubstrate", + "type": "Spell", + "cost": 3, + "image": "https://docs.brut.systems/judah/entropy/023.png", + "isHorizontal": true + } + }, + "name": "MootSubstrate", + "type": "Spell", + "cost": 3, + "isToken": false, + "Lane": "🟩 Green", + "Entropy": 3, + "Force": 0, + "_legal": { + "playtest": true + } + }, + "024": { + "id": "024", + "face": { + "front": { + "name": "SoftMutation", + "type": "Spell", + "cost": 1, + "image": "https://docs.brut.systems/judah/entropy/024.png", + "isHorizontal": true + } + }, + "name": "SoftMutation", + "type": "Spell", + "cost": 1, + "isToken": false, + "Lane": "🟩 Green", + "Entropy": 1, + "Force": 0, + "_legal": { + "playtest": true + } + }, + "025": { + "id": "025", + "face": { + "front": { + "name": "BareFilament", + "type": "Spell", + "cost": 2, + "image": "https://docs.brut.systems/judah/entropy/025.png", + "isHorizontal": true + } + }, + "name": "BareFilament", + "type": "Spell", + "cost": 2, + "isToken": false, + "Lane": "🟩 Green", + "Entropy": 2, + "Force": 0, + "_legal": { + "playtest": true + } + }, + "026": { + "id": "026", + "face": { + "front": { + "name": "DullMembrane", + "type": "Spell", + "cost": 4, + "image": "https://docs.brut.systems/judah/entropy/026.png", + "isHorizontal": true + } + }, + "name": "DullMembrane", + "type": "Spell", + "cost": 4, + "isToken": false, + "Lane": "🟩 Green", + "Entropy": 4, + "Force": 0, + "_legal": { + "playtest": true + } + }, + "027": { + "id": "027", + "face": { + "front": { + "name": "SoftVolume", + "type": "Spell", + "cost": 8, + "image": "https://docs.brut.systems/judah/entropy/027.png", + "isHorizontal": true + } + }, + "name": "SoftVolume", + "type": "Spell", + "cost": 8, + "isToken": false, + "Lane": "🟩 Green", + "Entropy": 8, + "Force": 0, + "_legal": { + "playtest": true + } + }, + "028": { + "id": "028", + "face": { + "front": { + "name": "GrossProspect", + "type": "Spell", + "cost": 14, + "image": "https://docs.brut.systems/judah/entropy/028.png", + "isHorizontal": true + } + }, + "name": "GrossProspect", + "type": "Spell", + "cost": 14, + "isToken": false, + "Lane": "🟩 Green", + "Entropy": 14, + "Force": 0, "_legal": { "playtest": true } diff --git a/cards.go b/cards.go index 8fa9796..3df5603 100644 --- a/cards.go +++ b/cards.go @@ -3,6 +3,7 @@ package main var CARDS = []struct { lane Lane typ Type + token bool entropy int recovery int force int @@ -10,11 +11,16 @@ var CARDS = []struct { desc string }{ {typ: Passive, recovery: 3, - name: `Rapid Response`, desc: `Your {{spell}}s cost {{1 hp}} less.`}, + name: `Rapid Response`, desc: `Your {{spell}}s cost {{1 entropy}} less.`}, {typ: Passive, recovery: 2, name: `Breaker`, desc: `The first {{unit}} you play per turn costs {{1 entropy}} less.`}, {typ: Passive, recovery: 0, - name: `Inverse Entropy`, desc: `Add {{1 hp}} to all {{lifesteal}} bonuses.`}, + name: `Inverse Entropy`, desc: `All {{lifesteal}} bonuses are +1.`}, + + {typ: Unit, lane: Red, entropy: 1, force: 1, token: true, + desc: `Token`}, + {typ: Unit, lane: Blue, entropy: 1, force: 1, token: true, + desc: `Token`}, {typ: Unit, lane: Red, entropy: 1, force: 1, desc: ``}, @@ -24,6 +30,48 @@ var CARDS = []struct { desc: ``}, {typ: Unit, lane: Red, entropy: 4, force: 4, desc: ``}, - {typ: Unit, lane: Red, entropy: 10, force: 10, + {typ: Unit, lane: Red, entropy: 5, force: 5, desc: ``}, + {typ: Unit, lane: Red, entropy: 5, force: 3, + desc: `{{pierce}} - Hit the next card on the stack or an opponent (if empty). + {{double tap}} - Do this twice.`}, + {typ: Unit, lane: Red, entropy: 5, force: 3, + desc: `{{next turn}} - If alive, {{push}} a {{1 entropy}} / {{1 force}} unit.`}, + {typ: Unit, lane: Red, entropy: 3, force: 2, + desc: `{{lifesteal}} - {{recover}} this unit's {{force}} when it attacks.`}, + {typ: Unit, lane: Red, entropy: 3, force: 1, + desc: `{{lifesteal}} - {{recover}} this unit's {{force}} when it attacks. + {{vampiric}} - This unit {{recover}}s {{1 force}} when it attacks.`}, + {typ: Unit, lane: Red, entropy: 5, force: 0, + desc: `{{initiative}} - Before this unit attacks, {{swap}} it with the unit below. Give that unit +{{2 force}} this turn.`}, + + {typ: Unit, lane: Blue, entropy: 4, force: 0, + desc: `{{collateral damage}} - Deal half of the attacking unit's {{force}} to the unit below it.`}, + {typ: Unit, lane: Blue, entropy: 2, force: 2, + desc: `{{last stand}} - {{move}} this unit's attacker to the bottom of its {{lane}}.`}, + {typ: Unit, lane: Blue, entropy: 2, force: 2, + desc: ``}, + {typ: Unit, lane: Blue, entropy: 3, force: 3, + desc: ``}, + {typ: Unit, lane: Blue, entropy: 2, force: 0, + desc: `{{initiative}} - Before this unit is attacked, {{discard}} it and it's attacker.`}, + {typ: Unit, lane: Blue, entropy: 8, force: 3, + desc: `This unit costs {{1 entropy}} less for each unit in its lane.`}, + {typ: Unit, lane: Blue, entropy: 10, force: 5, + desc: `This unit costs {{1 entropy}} less for each unit in your opponent's {{red lane}}.`}, + + {typ: Spell, lane: Green, entropy: 3, force: 0, + desc: `{{react}} - {{move}} a unit to the bottom of its lane.`}, + {typ: Spell, lane: Green, entropy: 3, force: 0, + desc: `{{react}} - {{recover}} {{5 hp}}.`}, + {typ: Spell, lane: Green, entropy: 1, force: 0, + desc: `Give a friendly {{unit}} +{{1 force}}.`}, + {typ: Spell, lane: Green, entropy: 2, force: 0, + desc: `Give a friendly {{unit}} +{{2 force}}.`}, + {typ: Spell, lane: Green, entropy: 4, force: 0, + desc: `Give a friendly {{unit}} +{{3 force}}.`}, + {typ: Spell, lane: Green, entropy: 8, force: 0, + desc: `Choose an opponent: they cannot cast spells this turn.`}, + {typ: Spell, lane: Green, entropy: 14, force: 0, + desc: `Choose an opponent: they skip their turn.`}, } diff --git a/docs/000.png b/docs/000.png index 95bbbdc..f1b3cdc 100644 Binary files a/docs/000.png and b/docs/000.png differ diff --git a/docs/001.png b/docs/001.png index f8e466f..e11783c 100644 Binary files a/docs/001.png and b/docs/001.png differ diff --git a/docs/002.png b/docs/002.png index ba8a128..99a95cb 100644 Binary files a/docs/002.png and b/docs/002.png differ diff --git a/docs/003.png b/docs/003.png index 2d6c12c..54d2ba4 100644 Binary files a/docs/003.png and b/docs/003.png differ diff --git a/docs/004.png b/docs/004.png index f012197..61dbae6 100644 Binary files a/docs/004.png and b/docs/004.png differ diff --git a/docs/005.png b/docs/005.png index be0c657..fcc0ac2 100644 Binary files a/docs/005.png and b/docs/005.png differ diff --git a/docs/006.png b/docs/006.png index c0a5cd6..7c68788 100644 Binary files a/docs/006.png and b/docs/006.png differ diff --git a/docs/007.png b/docs/007.png index af62982..4bda973 100644 Binary files a/docs/007.png and b/docs/007.png differ diff --git a/docs/008.png b/docs/008.png new file mode 100644 index 0000000..3fa68e4 Binary files /dev/null and b/docs/008.png differ diff --git a/docs/009.png b/docs/009.png new file mode 100644 index 0000000..853d80c Binary files /dev/null and b/docs/009.png differ diff --git a/docs/010.png b/docs/010.png new file mode 100644 index 0000000..8950114 Binary files /dev/null and b/docs/010.png differ diff --git a/docs/011.png b/docs/011.png new file mode 100644 index 0000000..1a3b072 Binary files /dev/null and b/docs/011.png differ diff --git a/docs/012.png b/docs/012.png new file mode 100644 index 0000000..371690f Binary files /dev/null and b/docs/012.png differ diff --git a/docs/013.png b/docs/013.png new file mode 100644 index 0000000..7198d0b Binary files /dev/null and b/docs/013.png differ diff --git a/docs/014.png b/docs/014.png new file mode 100644 index 0000000..07c0eef Binary files /dev/null and b/docs/014.png differ diff --git a/docs/015.png b/docs/015.png new file mode 100644 index 0000000..008c387 Binary files /dev/null and b/docs/015.png differ diff --git a/docs/016.png b/docs/016.png new file mode 100644 index 0000000..ab944d7 Binary files /dev/null and b/docs/016.png differ diff --git a/docs/017.png b/docs/017.png new file mode 100644 index 0000000..54f0cb5 Binary files /dev/null and b/docs/017.png differ diff --git a/docs/018.png b/docs/018.png new file mode 100644 index 0000000..d08a576 Binary files /dev/null and b/docs/018.png differ diff --git a/docs/019.png b/docs/019.png new file mode 100644 index 0000000..d31e8be Binary files /dev/null and b/docs/019.png differ diff --git a/docs/020.png b/docs/020.png new file mode 100644 index 0000000..fb249e9 Binary files /dev/null and b/docs/020.png differ diff --git a/docs/021.png b/docs/021.png new file mode 100644 index 0000000..bc3ac42 Binary files /dev/null and b/docs/021.png differ diff --git a/docs/022.png b/docs/022.png new file mode 100644 index 0000000..d494e9d Binary files /dev/null and b/docs/022.png differ diff --git a/docs/023.png b/docs/023.png new file mode 100644 index 0000000..820f48b Binary files /dev/null and b/docs/023.png differ diff --git a/docs/024.png b/docs/024.png new file mode 100644 index 0000000..07b4f8e Binary files /dev/null and b/docs/024.png differ diff --git a/docs/025.png b/docs/025.png new file mode 100644 index 0000000..e7e31d0 Binary files /dev/null and b/docs/025.png differ diff --git a/docs/026.png b/docs/026.png new file mode 100644 index 0000000..15d7053 Binary files /dev/null and b/docs/026.png differ diff --git a/docs/027.png b/docs/027.png new file mode 100644 index 0000000..9f011fd Binary files /dev/null and b/docs/027.png differ diff --git a/docs/028.png b/docs/028.png new file mode 100644 index 0000000..b71760a Binary files /dev/null and b/docs/028.png differ diff --git a/main.go b/main.go index 707a141..a8d520d 100644 --- a/main.go +++ b/main.go @@ -26,7 +26,6 @@ const ( Unit Type = iota Spell Passive - Token ) func (l Lane) String() string { @@ -50,8 +49,8 @@ func (t Type) String() string { return "Unit" case Passive: return "Passive" - case Token: - return "Token" + case Spell: + return "Spell" default: panic("unknown") } @@ -102,10 +101,10 @@ func main() { color = [3]float64{248.0 / 255.0, 120.0 / 255.0, 143.0 / 255.0} case Green: baseimg = "base-green.png" - color = [3]float64{120.0 / 255.0, 190.0 / 255.0, 248.0 / 255.0} + color = [3]float64{120.0 / 255.0, 248.0 / 255.0, 178.0 / 255.0} case Blue: baseimg = "base-blue.png" - color = [3]float64{120.0 / 255.0, 248.0 / 255.0, 178.0 / 255.0} + color = [3]float64{120.0 / 255.0, 190.0 / 255.0, 248.0 / 255.0} default: color = [3]float64{184.0 / 255.0, 184.0 / 255.0, 184.0 / 255.0} baseimg = "base-passive.png" @@ -133,13 +132,13 @@ func main() { ctx.Pop() } - // Draw entropy + // Draw entropy or recovery ctx.SetRGB(color[0], color[1], color[2]) ctx.Push() { ctx.Translate(273, 115) ctx.Rotate(270 * math.Pi / 180) - ctx.DrawStringAnchored(fmt.Sprintf("%d", card.entropy), 0, 0, 0.5, 0.5) + ctx.DrawStringAnchored(fmt.Sprintf("%d", max(card.entropy, card.recovery)), 0, 0, 0.5, 0.5) } ctx.Pop() @@ -154,7 +153,7 @@ func main() { { ctx.Translate(435, 985) ctx.Rotate(270 * math.Pi / 180) - ctx.DrawStringWrapped(fmt.Sprintf("#%03d %s - %s\n%s", i, card.name, card.typ.String(), cleandesc), 0, 0, 0.0, 0.0, 900, 1.70, gg.AlignLeft) + ctx.DrawStringWrapped(fmt.Sprintf("#%03d %s - %s\n%s", i, card.name, card.typ.String(), cleandesc), 0, 0, 0.0, 0.0, 900, 1.80, gg.AlignLeft) } ctx.Pop() @@ -176,7 +175,7 @@ func main() { Horizontal: true, }, }, - Token: card.typ == Token, + Token: card.token, Name: card.name, Type: card.typ.String(), Cost: card.entropy, @@ -221,11 +220,12 @@ func generateTemporaryName() string { "Live", "Lucid", "Moot", + "Vampiric", "Nominal", - "Oblique", + "Convergent", "Partial", "Passive", - "Petit", + "Raging", "Polar", "Residual", "Rote", @@ -246,12 +246,12 @@ func generateTemporaryName() string { "Deficit", "Dividend", "Dosage", - "Envelope", + "Shrine", "Filament", "Gesture", "Gradient", "Inlet", - "Lapse", + "Judgement", "Mandate", "Membrane", "Morale", @@ -261,6 +261,7 @@ func generateTemporaryName() string { "Prospect", "Rapport", "Reflex", + "Mutation", "Substrate", "Surplus", "Tendon",