more cards

This commit is contained in:
Judah 2026-04-01 21:55:04 -06:00
parent 6f20292373
commit 5d942066a9
32 changed files with 551 additions and 40 deletions

View file

@ -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
}

View file

@ -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.`},
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 23 KiB

BIN
docs/008.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
docs/009.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
docs/010.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
docs/011.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
docs/012.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
docs/013.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
docs/014.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
docs/015.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
docs/016.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
docs/017.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
docs/018.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
docs/019.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
docs/020.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
docs/021.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
docs/022.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
docs/023.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
docs/024.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
docs/025.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
docs/026.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
docs/027.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
docs/028.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

27
main.go
View file

@ -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",