init
This commit is contained in:
commit
98d007c3de
10 changed files with 363 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
.DS_Store
|
||||||
62
docs/CardList.json
Normal file
62
docs/CardList.json
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
{
|
||||||
|
"000": {
|
||||||
|
"id": "000",
|
||||||
|
"face": {
|
||||||
|
"front": {
|
||||||
|
"name": "Rapid Response",
|
||||||
|
"type": "Passive",
|
||||||
|
"cost": 0,
|
||||||
|
"image": "https://media.discordapp.net/attachments/1093017032812929024/1489048592743141426/passive-base.png?ex=69cf0011\u0026is=69cdae91\u0026hm=9e673eb63e15f33d7b5579596b247e1832ccc76bee59477602fa6fd8cc544d73\u0026=\u0026format=webp\u0026quality=lossless\u0026width=2078\u0026height=1488",
|
||||||
|
"isHorizontal": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Rapid Response",
|
||||||
|
"type": "Passive",
|
||||||
|
"cost": 0,
|
||||||
|
"isToken": false,
|
||||||
|
"Lane": "⬜ Any",
|
||||||
|
"Entropy": 0,
|
||||||
|
"Force": 0,
|
||||||
|
"_legal": true
|
||||||
|
},
|
||||||
|
"001": {
|
||||||
|
"id": "001",
|
||||||
|
"face": {
|
||||||
|
"front": {
|
||||||
|
"name": "Breaker",
|
||||||
|
"type": "Passive",
|
||||||
|
"cost": 0,
|
||||||
|
"image": "https://media.discordapp.net/attachments/1093017032812929024/1489048592743141426/passive-base.png?ex=69cf0011\u0026is=69cdae91\u0026hm=9e673eb63e15f33d7b5579596b247e1832ccc76bee59477602fa6fd8cc544d73\u0026=\u0026format=webp\u0026quality=lossless\u0026width=2078\u0026height=1488",
|
||||||
|
"isHorizontal": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Breaker",
|
||||||
|
"type": "Passive",
|
||||||
|
"cost": 0,
|
||||||
|
"isToken": false,
|
||||||
|
"Lane": "⬜ Any",
|
||||||
|
"Entropy": 0,
|
||||||
|
"Force": 0,
|
||||||
|
"_legal": true
|
||||||
|
},
|
||||||
|
"002": {
|
||||||
|
"id": "002",
|
||||||
|
"face": {
|
||||||
|
"front": {
|
||||||
|
"name": "Inverse Entropy",
|
||||||
|
"type": "Passive",
|
||||||
|
"cost": 0,
|
||||||
|
"image": "https://media.discordapp.net/attachments/1093017032812929024/1489048592743141426/passive-base.png?ex=69cf0011\u0026is=69cdae91\u0026hm=9e673eb63e15f33d7b5579596b247e1832ccc76bee59477602fa6fd8cc544d73\u0026=\u0026format=webp\u0026quality=lossless\u0026width=2078\u0026height=1488",
|
||||||
|
"isHorizontal": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Inverse Entropy",
|
||||||
|
"type": "Passive",
|
||||||
|
"cost": 0,
|
||||||
|
"isToken": false,
|
||||||
|
"Lane": "⬜ Any",
|
||||||
|
"Entropy": 0,
|
||||||
|
"Force": 0,
|
||||||
|
"_legal": true
|
||||||
|
}
|
||||||
|
}
|
||||||
72
docs/Game.json
Normal file
72
docs/Game.json
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
{
|
||||||
|
"name": "Entropy",
|
||||||
|
"menuBackgroundImage": "",
|
||||||
|
"defaultRessources": {
|
||||||
|
"backgrounds": [],
|
||||||
|
"decksUrl": ""
|
||||||
|
},
|
||||||
|
"customHelp": "",
|
||||||
|
"cardRotation": 45,
|
||||||
|
"cards": {
|
||||||
|
"dataUrl": "",
|
||||||
|
"cardBack": ""
|
||||||
|
},
|
||||||
|
"deckBuilding": {
|
||||||
|
"mainFilters": [],
|
||||||
|
"formats": []
|
||||||
|
},
|
||||||
|
"gameplay": {
|
||||||
|
"Classic": {
|
||||||
|
"mulligan": {
|
||||||
|
"info": "",
|
||||||
|
"startingHandSize": 7,
|
||||||
|
"drawNewHand": true,
|
||||||
|
"putSelectionAtBottom": false,
|
||||||
|
"drawNewSelectedCards": false
|
||||||
|
},
|
||||||
|
"newTurn": {
|
||||||
|
"drawOnStart": false,
|
||||||
|
"sharedTurn": false,
|
||||||
|
"firstPlayerTokenName": "",
|
||||||
|
"drawPerTurn": 1
|
||||||
|
},
|
||||||
|
"defaultNotes": "",
|
||||||
|
"tokens": [],
|
||||||
|
"countersStartingValues": [
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"hideFacedDownCards": false,
|
||||||
|
"sections": {
|
||||||
|
"customSections": [
|
||||||
|
"Mana"
|
||||||
|
],
|
||||||
|
"layout": {
|
||||||
|
"direction": "row",
|
||||||
|
"isSymetricalForOpponents": false,
|
||||||
|
"content": []
|
||||||
|
},
|
||||||
|
"categoriesAlreadyOnBoard": [],
|
||||||
|
"autoPlayFromHand": {},
|
||||||
|
"autoPlayFromStack": {},
|
||||||
|
"sectionsDict": {
|
||||||
|
"Mana": {
|
||||||
|
"title": "Mana",
|
||||||
|
"isHidden": "yes",
|
||||||
|
"height": "SMALL",
|
||||||
|
"alignment": "START",
|
||||||
|
"opponentAlignment": false,
|
||||||
|
"noAutoPayTo": "true",
|
||||||
|
"isHorizontalAllowed": false,
|
||||||
|
"displayedTitle": "Ressources",
|
||||||
|
"enterTapped": false,
|
||||||
|
"enterSpun": false,
|
||||||
|
"isGroupForbidden": false,
|
||||||
|
"keepTappedNewTurn": false,
|
||||||
|
"showHiddenCardInHistory": false,
|
||||||
|
"noQuickActions": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
docs/blue-base.png
Normal file
BIN
docs/blue-base.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 703 KiB |
BIN
docs/card-base.af
Normal file
BIN
docs/card-base.af
Normal file
Binary file not shown.
BIN
docs/green-base.png
Normal file
BIN
docs/green-base.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 970 KiB |
BIN
docs/passive-base.png
Normal file
BIN
docs/passive-base.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 928 KiB |
BIN
docs/red-base.png
Normal file
BIN
docs/red-base.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 469 KiB |
3
go.mod
Normal file
3
go.mod
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
module tcg
|
||||||
|
|
||||||
|
go 1.26.1
|
||||||
225
main.go
Normal file
225
main.go
Normal file
|
|
@ -0,0 +1,225 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"math/rand/v2"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Cards = []struct {
|
||||||
|
lane Lane
|
||||||
|
typ Type
|
||||||
|
entropy int
|
||||||
|
recovery int
|
||||||
|
force int
|
||||||
|
name string
|
||||||
|
desc string
|
||||||
|
}{
|
||||||
|
{typ: Passive, recovery: 3,
|
||||||
|
name: `Rapid Response`, desc: `Your {{spell}}s cost {{1 hp}} 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`},
|
||||||
|
}
|
||||||
|
|
||||||
|
type Lane int
|
||||||
|
|
||||||
|
const (
|
||||||
|
Any Lane = iota
|
||||||
|
Red
|
||||||
|
Green
|
||||||
|
Blue
|
||||||
|
)
|
||||||
|
|
||||||
|
type Type int
|
||||||
|
|
||||||
|
const (
|
||||||
|
Unit Type = iota
|
||||||
|
Spell
|
||||||
|
Passive
|
||||||
|
Token
|
||||||
|
)
|
||||||
|
|
||||||
|
func (l Lane) String() string {
|
||||||
|
switch l {
|
||||||
|
case Any:
|
||||||
|
return "⬜ Any"
|
||||||
|
case Red:
|
||||||
|
return "🟥 Red"
|
||||||
|
case Green:
|
||||||
|
return "🟩 Green"
|
||||||
|
case Blue:
|
||||||
|
return "🟦 Blue"
|
||||||
|
default:
|
||||||
|
panic("unknwon")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t Type) String() string {
|
||||||
|
switch t {
|
||||||
|
case Unit:
|
||||||
|
return "Unit"
|
||||||
|
case Passive:
|
||||||
|
return "Passive"
|
||||||
|
case Token:
|
||||||
|
return "Token"
|
||||||
|
default:
|
||||||
|
panic("unknown")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
type (
|
||||||
|
jsonfront struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Cost int `json:"cost"`
|
||||||
|
Image string `json:"image"`
|
||||||
|
Horizontal bool `json:"isHorizontal"`
|
||||||
|
}
|
||||||
|
jsoncard struct {
|
||||||
|
// required
|
||||||
|
Id string `json:"id"`
|
||||||
|
Face struct {
|
||||||
|
Front jsonfront `json:"front"`
|
||||||
|
} `json:"face"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Cost int `json:"cost"`
|
||||||
|
Token bool `json:"isToken"`
|
||||||
|
|
||||||
|
// custom
|
||||||
|
Lane string `json:"Lane"`
|
||||||
|
Entropy int `json:"Entropy"`
|
||||||
|
Force int `json:"Force"`
|
||||||
|
Legal bool `json:"_legal"`
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
thejson := make(map[string]jsoncard)
|
||||||
|
for i := range len(Cards) {
|
||||||
|
card := &Cards[i]
|
||||||
|
if len(card.name) == 0 {
|
||||||
|
card.name = generateTemporaryName()
|
||||||
|
}
|
||||||
|
|
||||||
|
var imgurl string
|
||||||
|
switch card.lane {
|
||||||
|
case Red:
|
||||||
|
imgurl = "https://media.discordapp.net/attachments/1093017032812929024/1489047949337038959/red-base.png?ex=69ceff78&is=69cdadf8&hm=7d2ba991862426bf6fe97f9ccbb0c8c60e6dd5e3c7d32f2a8e206130aad3c37e&=&format=webp&quality=lossless&width=2078&height=1488"
|
||||||
|
case Blue:
|
||||||
|
imgurl = "https://media.discordapp.net/attachments/1093017032812929024/1489047948531597432/blue-base.png?ex=69ceff78&is=69cdadf8&hm=4cf2d26b195780d4d044702d51f2d6423034978f1245cf49e4b43ea5f998632e&=&format=webp&quality=lossless&width=2078&height=1488"
|
||||||
|
case Green:
|
||||||
|
imgurl = "https://media.discordapp.net/attachments/1093017032812929024/1489047948959547483/green-base.png?ex=69ceff78&is=69cdadf8&hm=ffb7d13f9c86bf501b22cf8121f88cf1dd49b3696ef92ba6655934f61cae7448&=&format=webp&quality=lossless&width=2078&height=1488"
|
||||||
|
default:
|
||||||
|
imgurl = "https://media.discordapp.net/attachments/1093017032812929024/1489048592743141426/passive-base.png?ex=69cf0011&is=69cdae91&hm=9e673eb63e15f33d7b5579596b247e1832ccc76bee59477602fa6fd8cc544d73&=&format=webp&quality=lossless&width=2078&height=1488"
|
||||||
|
}
|
||||||
|
|
||||||
|
id := fmt.Sprintf("%03d", i)
|
||||||
|
thejson[id] = jsoncard{
|
||||||
|
Id: id,
|
||||||
|
Face: struct {
|
||||||
|
Front jsonfront `json:"front"`
|
||||||
|
}{
|
||||||
|
jsonfront{
|
||||||
|
Name: card.name,
|
||||||
|
Type: card.typ.String(),
|
||||||
|
Image: imgurl,
|
||||||
|
Cost: card.entropy,
|
||||||
|
Horizontal: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Token: card.typ == Token,
|
||||||
|
Name: card.name,
|
||||||
|
Type: card.typ.String(),
|
||||||
|
Cost: card.entropy,
|
||||||
|
|
||||||
|
Entropy: card.entropy,
|
||||||
|
Force: card.force,
|
||||||
|
Lane: card.lane.String(),
|
||||||
|
Legal: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enc, err := json.MarshalIndent(thejson, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.WriteFile("docs/CardList.json", enc, 0644); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateTemporaryName() string {
|
||||||
|
var (
|
||||||
|
adjectives = []string{
|
||||||
|
"Absent",
|
||||||
|
"Ambient",
|
||||||
|
"Bare",
|
||||||
|
"Blunt",
|
||||||
|
"Civic",
|
||||||
|
"Composite",
|
||||||
|
"Concave",
|
||||||
|
"Dull",
|
||||||
|
"Errant",
|
||||||
|
"Excess",
|
||||||
|
"Flat",
|
||||||
|
"Former",
|
||||||
|
"Gross",
|
||||||
|
"Inland",
|
||||||
|
"Lateral",
|
||||||
|
"Live",
|
||||||
|
"Lucid",
|
||||||
|
"Moot",
|
||||||
|
"Nominal",
|
||||||
|
"Oblique",
|
||||||
|
"Partial",
|
||||||
|
"Passive",
|
||||||
|
"Petit",
|
||||||
|
"Polar",
|
||||||
|
"Residual",
|
||||||
|
"Rote",
|
||||||
|
"Soft",
|
||||||
|
"Spent",
|
||||||
|
"Terminal",
|
||||||
|
"Warm",
|
||||||
|
}
|
||||||
|
nouns = []string{
|
||||||
|
"Aperture",
|
||||||
|
"Axis",
|
||||||
|
"Bulk",
|
||||||
|
"Cartilage",
|
||||||
|
"Compact",
|
||||||
|
"Contour",
|
||||||
|
"Conviction",
|
||||||
|
"Cortex",
|
||||||
|
"Deficit",
|
||||||
|
"Dividend",
|
||||||
|
"Dosage",
|
||||||
|
"Envelope",
|
||||||
|
"Filament",
|
||||||
|
"Gesture",
|
||||||
|
"Gradient",
|
||||||
|
"Inlet",
|
||||||
|
"Lapse",
|
||||||
|
"Mandate",
|
||||||
|
"Membrane",
|
||||||
|
"Morale",
|
||||||
|
"Offset",
|
||||||
|
"Posture",
|
||||||
|
"Precinct",
|
||||||
|
"Prospect",
|
||||||
|
"Rapport",
|
||||||
|
"Reflex",
|
||||||
|
"Substrate",
|
||||||
|
"Surplus",
|
||||||
|
"Tendon",
|
||||||
|
"Volume",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
return adjectives[rand.IntN(len(adjectives))] + nouns[rand.IntN(len(nouns))]
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue