aboutsummaryrefslogtreecommitdiff
path: root/internal/casino/types.go
blob: f2848698cb60ca378daeecc757917efc2a76b344 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package casino

import "fmt"

type GameName string

const (
	GameSlots GameName = "slots"
)

type TableConfig struct {
	ID           string   `yaml:"id"`
	Game         GameName `yaml:"game"`
	MaxPlayers   int      `yaml:"max_players,omitempty"`
	BettingTicks int      `yaml:"betting_ticks,omitempty"`
	MinBet       int      `yaml:"min_bet,omitempty"`
	MaxBet       int      `yaml:"max_bet,omitempty"`
}

type MachineConfig struct {
	ID        string   `yaml:"id"`
	Game      GameName `yaml:"game"`
	Variant   string   `yaml:"variant,omitempty"`
	MinBet    int      `yaml:"min_bet,omitempty"`
	MaxBet    int      `yaml:"max_bet,omitempty"`
	SpinTicks int      `yaml:"spin_ticks,omitempty"`
	Payout    float64  `yaml:"payout,omitempty"`
}

func (c MachineConfig) Normalize() MachineConfig {
	if c.MinBet <= 0 {
		c.MinBet = 1
	}
	if c.MaxBet <= 0 {
		c.MaxBet = int(^uint(0) >> 1)
	}
	if c.SpinTicks <= 0 {
		c.SpinTicks = 2
	}
	if c.Variant == "" {
		c.Variant = "huff_and_even_more_puff"
	}
	if c.Payout <= 0 {
		c.Payout = 0.97
	}
	return c
}

func (c TableConfig) Normalize() TableConfig {
	if c.MaxPlayers <= 0 {
		c.MaxPlayers = 8
	}
	if c.BettingTicks <= 0 {
		c.BettingTicks = 20
	}
	if c.MinBet <= 0 {
		c.MinBet = 1
	}
	if c.MaxBet <= 0 {
		c.MaxBet = int(^uint(0) >> 1)
	}
	return c
}

type Wager struct {
	Total   int
	Chips   int
	Credits int
}

type Wallet interface {
	Wager(amount int) (Wager, bool)
	PayCredits(amount int)
}

type EventType string

const (
	EventJoined       EventType = "joined"
	EventBetting      EventType = "betting"
	EventBetPlaced    EventType = "bet_placed"
	EventRoundStarted EventType = "round_started"
	EventResult       EventType = "result"
	EventPayout       EventType = "payout"
	EventTimedOut     EventType = "timed_out"
	EventLeft         EventType = "left"
	EventClosed       EventType = "closed"
)

type Event struct {
	RoomID         int
	TableID        string
	Type           EventType
	Player         string
	Message        string
	PrivateMessage string
	PrivateTo      string
	Color          string
	Public         bool
	Slot           *SlotSnapshot
}

type SlotSnapshot struct {
	Grid         [3][5]string
	StoppedReels int
}

func (e Event) String() string {
	if e.Message != "" {
		return e.Message
	}
	return fmt.Sprintf("%s at %s", e.Type, e.TableID)
}

type Participant struct {
	Name      string
	Connected bool
	HasBet    bool
	Wager     Wager
	Wallet    Wallet
}