Implement a very crude "game" as a test. Also updates Player.
This commit is contained in:
162
smoketest/cards.go
Normal file
162
smoketest/cards.go
Normal file
@ -0,0 +1,162 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"cardSimEngine/cardsim"
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Type aliases, unlike distinctly named types, are fully substitutable for
|
||||
// the original type. This trims off some annoying-to-type things.
|
||||
type player = cardsim.Player[*SmokeTestCollection]
|
||||
type card = cardsim.Card[*SmokeTestCollection]
|
||||
type cardOption = cardsim.CardOption[*SmokeTestCollection]
|
||||
|
||||
func makeAdditionCard(amt int) cardsim.Card[*SmokeTestCollection] {
|
||||
c := &cardsim.BasicCard[*SmokeTestCollection]{
|
||||
CardTitle: cardsim.Msgf("Additive %d", amt),
|
||||
CardText: cardsim.Msgf("You can change the Number by %d.", amt),
|
||||
CardOptions: []cardsim.CardOption[*SmokeTestCollection]{
|
||||
&cardsim.BasicOption[*SmokeTestCollection]{
|
||||
Text: cardsim.Msgf("Add %d", amt),
|
||||
Effect: func(p *player) error {
|
||||
p.Stats.Number.Value += amt
|
||||
return nil
|
||||
},
|
||||
Output: cardsim.MsgStr("Added."),
|
||||
},
|
||||
&cardsim.BasicOption[*SmokeTestCollection]{
|
||||
Text: cardsim.Msgf("Subtract %d", amt),
|
||||
Effect: func(p *player) error {
|
||||
p.Stats.Number.Value -= amt
|
||||
return nil
|
||||
},
|
||||
Output: cardsim.MsgStr("Subtracted."),
|
||||
},
|
||||
},
|
||||
AfterOption: func(c card, p *player, _ cardOption) error {
|
||||
p.Deck.InsertRandomBottom(0.5, c)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
func makeMultiplicationCard(amt int) cardsim.Card[*SmokeTestCollection] {
|
||||
c := &cardsim.BasicCard[*SmokeTestCollection]{
|
||||
CardTitle: cardsim.Msgf("Multiplicative %d", amt),
|
||||
CardText: cardsim.Msgf("You can multiply or divide the Number by %d, or maybe divide the Number by that.", amt),
|
||||
CardOptions: []cardsim.CardOption[*SmokeTestCollection]{
|
||||
&cardsim.BasicOption[*SmokeTestCollection]{
|
||||
Text: cardsim.Msgf("Multiply by %d", amt),
|
||||
Effect: func(p *player) error {
|
||||
p.Stats.Number.Value *= amt
|
||||
return nil
|
||||
},
|
||||
Output: cardsim.MsgStr("Multiplied."),
|
||||
},
|
||||
&cardsim.BasicOption[*SmokeTestCollection]{
|
||||
Text: cardsim.Msgf("Integer divide by %d", amt),
|
||||
Effect: func(p *player) error {
|
||||
p.Stats.Number.Value /= amt
|
||||
return nil
|
||||
},
|
||||
Output: cardsim.MsgStr("Divided."),
|
||||
},
|
||||
inverseDivision(amt),
|
||||
},
|
||||
AfterOption: func(c card, p *player, _ cardOption) error {
|
||||
p.Deck.InsertRandomBottom(0.5, c)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
type inverseDivision int
|
||||
|
||||
func (i inverseDivision) OptionText(p *player) (cardsim.Message, error) {
|
||||
if p.Stats.Number.Value == 0 {
|
||||
return cardsim.MsgStr("You can't divide by zero!"), nil
|
||||
}
|
||||
return cardsim.Msgf("Divide %d by the Number", int(i)), nil
|
||||
}
|
||||
|
||||
func (i inverseDivision) Enact(p *player) (cardsim.Message, error) {
|
||||
if p.Stats.Number.Value == 0 {
|
||||
return nil, errors.New("you can't divide by zero!")
|
||||
}
|
||||
p.Stats.Number.Value = int(i) / p.Stats.Number.Value
|
||||
return cardsim.MsgStr("Inverse divided."), nil
|
||||
}
|
||||
|
||||
func (i inverseDivision) Enabled(p *player) bool {
|
||||
return p.Stats.Number.Value != 0
|
||||
}
|
||||
|
||||
func initDeck(d *cardsim.Deck[*SmokeTestCollection]) {
|
||||
addMe := []int{
|
||||
0, 1, 2, 5, 10, 50, 100, 1000, 2500, 500000, 9876543,
|
||||
}
|
||||
for _, n := range addMe {
|
||||
d.Insert(cardsim.BottomOfDeck, makeAdditionCard(n))
|
||||
}
|
||||
|
||||
multiplyMe := []int{
|
||||
2, 4, 8, 16, 32, 64, 128, 512, 1024, 9999, 84720413,
|
||||
}
|
||||
for _, n := range multiplyMe {
|
||||
d.Insert(cardsim.BottomOfDeck, makeMultiplicationCard(n))
|
||||
}
|
||||
if err := d.Shuffle(); cardsim.IsSeriousError(err) {
|
||||
panic(err)
|
||||
} else if err != nil {
|
||||
fmt.Printf("Error shuffling: %v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
func installPermanentActions(pa *[]card) {
|
||||
*pa = []card{
|
||||
&cardsim.BasicCard[*SmokeTestCollection]{
|
||||
CardTitle: cardsim.MsgStr("Reset to 0"),
|
||||
CardText: cardsim.MsgStr("Resets Number to 0."),
|
||||
CardOptions: []cardOption{
|
||||
&cardsim.BasicOption[*SmokeTestCollection]{
|
||||
Text: cardsim.MsgStr("Reset to 0."),
|
||||
Effect: func(p *player) error {
|
||||
p.Stats.Number.Value = 0
|
||||
return nil
|
||||
},
|
||||
Output: cardsim.MsgStr("Done."),
|
||||
},
|
||||
},
|
||||
},
|
||||
&cardsim.BasicCard[*SmokeTestCollection]{
|
||||
CardTitle: cardsim.MsgStr("Reset to 1000000"),
|
||||
CardText: cardsim.MsgStr("Resets Number to one million."),
|
||||
CardOptions: []cardOption{
|
||||
&cardsim.BasicOption[*SmokeTestCollection]{
|
||||
Text: cardsim.MsgStr("Reset to 1,000,000"),
|
||||
Effect: func(p *player) error {
|
||||
p.Stats.Number.Value = 1000000
|
||||
return nil
|
||||
},
|
||||
Output: cardsim.MsgStr("Done."),
|
||||
},
|
||||
},
|
||||
},
|
||||
&cardsim.BasicCard[*SmokeTestCollection]{
|
||||
CardTitle: cardsim.MsgStr("Draw a card"),
|
||||
CardText: cardsim.MsgStr("Draw an extra card."),
|
||||
CardOptions: []cardOption{
|
||||
&cardsim.BasicOption[*SmokeTestCollection]{
|
||||
Text: cardsim.MsgStr("Draw an extra card."),
|
||||
Effect: func(p *player) error {
|
||||
return p.Draw()
|
||||
},
|
||||
Output: cardsim.MsgStr("Drawn. Probably."),
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
25
smoketest/collection.go
Normal file
25
smoketest/collection.go
Normal file
@ -0,0 +1,25 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"cardSimEngine/cardsim"
|
||||
)
|
||||
|
||||
// SmokeTestCollection is a stats collection for the simple test sim.
|
||||
type SmokeTestCollection struct {
|
||||
Number cardsim.Stored[int]
|
||||
Total cardsim.Stored[int]
|
||||
Turns cardsim.Invisible[int]
|
||||
|
||||
Flavor cardsim.Stored[string]
|
||||
}
|
||||
|
||||
func (c *SmokeTestCollection) Average() float64 {
|
||||
return float64(c.Total.Value) / float64(c.Turns.Value)
|
||||
}
|
||||
|
||||
func (c *SmokeTestCollection) Stats() []cardsim.Stat {
|
||||
stats := cardsim.ExtractStats(c)
|
||||
stats = append(stats, cardsim.StatFunc("Average", c.Average))
|
||||
cardsim.SortStats(stats)
|
||||
return stats
|
||||
}
|
62
smoketest/main.go
Normal file
62
smoketest/main.go
Normal file
@ -0,0 +1,62 @@
|
||||
// Binary smoketest runs a very simple cardsim thing.
|
||||
package main
|
||||
|
||||
import (
|
||||
"cardSimEngine/cardsim"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
p := cardsim.InitPlayer(
|
||||
&SmokeTestCollection{
|
||||
Number: cardsim.Stored[int]{
|
||||
Name: "Number",
|
||||
Value: 0,
|
||||
},
|
||||
Total: cardsim.Stored[int64]{
|
||||
Name: "Total",
|
||||
Value: 0,
|
||||
},
|
||||
Turns: cardsim.Invisible[int]{
|
||||
Name: "Turns",
|
||||
Value: 0,
|
||||
},
|
||||
Flavor: cardsim.Stored[string]{
|
||||
Name: "Flavor",
|
||||
Value: "Lemon",
|
||||
},
|
||||
},
|
||||
)
|
||||
p.Name = "Dave"
|
||||
p.HandLimit = 3
|
||||
p.ActionsPerTurn = 2
|
||||
installRules(p.Rules)
|
||||
initDeck(p.Deck)
|
||||
installPermanentActions(&p.PermanentActions)
|
||||
p.InfoPanels = []cardsim.InfoPanel[*SmokeTestCollection]{
|
||||
&cardsim.BasicStatsPanel[*SmokeTestCollection]{
|
||||
Name: cardsim.MsgStr("Stats"),
|
||||
Intro: cardsim.MsgStr("Hi! These are the smoke test stats."),
|
||||
},
|
||||
}
|
||||
p.Prompt = prompt{}
|
||||
p.DebugLevel = 5
|
||||
|
||||
err := cardsim.RunSimpleTerminalUI(p)
|
||||
if err != nil {
|
||||
fmt.Println("Terminated with error:")
|
||||
fmt.Println(err)
|
||||
} else {
|
||||
fmt.Println("Terminated without error.")
|
||||
}
|
||||
}
|
||||
|
||||
type prompt struct{}
|
||||
|
||||
func (prompt) Title(p *cardsim.Player[*SmokeTestCollection]) cardsim.Message {
|
||||
return cardsim.MsgStr("Prompt title -- should not be visible?")
|
||||
}
|
||||
|
||||
func (prompt) Info(p *cardsim.Player[*SmokeTestCollection]) ([]cardsim.Message, error) {
|
||||
return []cardsim.Message{cardsim.MsgStr("Here, have some stuff.")}, nil
|
||||
}
|
31
smoketest/rules.go
Normal file
31
smoketest/rules.go
Normal file
@ -0,0 +1,31 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"cardSimEngine/cardsim"
|
||||
"math"
|
||||
)
|
||||
|
||||
var (
|
||||
updateTotal = cardsim.RuleFunc[*SmokeTestCollection]{
|
||||
Name: "updateTotal",
|
||||
Seq: 1,
|
||||
F: func(p *cardsim.Player[*SmokeTestCollection]) error {
|
||||
p.Stats.Total.Value += int64(p.Stats.Number.Value)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
countTurn = cardsim.RuleFunc[*SmokeTestCollection]{
|
||||
Name: "countTurn",
|
||||
Seq: math.MinInt,
|
||||
F: func(p *cardsim.Player[*SmokeTestCollection]) error {
|
||||
p.Stats.Turns.Value++
|
||||
return nil
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
func installRules(rules *cardsim.RuleCollection[*SmokeTestCollection]) {
|
||||
rules.Insert(&updateTotal)
|
||||
rules.Insert(&countTurn)
|
||||
}
|
Reference in New Issue
Block a user