From 747a5ec9aecdea5dc7f13a5394b6ba2334efa5e3 Mon Sep 17 00:00:00 2001 From: schwarzlichtbezirk Date: Fri, 27 Sep 2024 10:15:57 +0300 Subject: [PATCH] Screenx. --- game/slot/indiandreaming/indiandreaming.go | 4 +- game/slot/lines.go | 9 + game/slot/screen.go | 266 ++++++++++++++++----- go.mod | 2 +- go.sum | 4 +- 5 files changed, 224 insertions(+), 61 deletions(-) diff --git a/game/slot/indiandreaming/indiandreaming.go b/game/slot/indiandreaming/indiandreaming.go index 9059c28f..4db4f926 100644 --- a/game/slot/indiandreaming/indiandreaming.go +++ b/game/slot/indiandreaming/indiandreaming.go @@ -116,12 +116,14 @@ func (g *Game) ScanScatters(screen slot.Screen, wins *slot.Wins) { mw = 5 } var pay = ScatPay[count-1] + var line = screen.ScatPos(scat) + line.Cover(screen.ScatPos(wild)) *wins = append(*wins, slot.WinItem{ Pay: g.Bet * pay, Mult: mw, Sym: scat, Num: count, - XY: screen.ScatPos(scat), + XY: line, Free: 12, }) } diff --git a/game/slot/lines.go b/game/slot/lines.go index 1c4cc0f8..c57395e4 100644 --- a/game/slot/lines.go +++ b/game/slot/lines.go @@ -14,6 +14,15 @@ func (l *Linex) Set(x Pos, val Pos) { l[x-1] = val } +func (l *Linex) Cover(op Linex) *Linex { + for i, v := range op { + if v > 0 { + l[i] = v + } + } + return l +} + func (l *Linex) Len() int { for i := 7; i >= 0; i-- { if l[i] > 0 { diff --git a/game/slot/screen.go b/game/slot/screen.go index 64ce84f8..2a712ece 100644 --- a/game/slot/screen.go +++ b/game/slot/screen.go @@ -1,6 +1,7 @@ package game import ( + "encoding/json" "math/rand/v2" "sync" ) @@ -25,6 +26,187 @@ type Screen interface { Free() // put object to pool } +type Screenx struct { + sx, sy Pos + data [40]Sym +} + +var poolsx = sync.Pool{ + New: func() any { + return &Screen3x3{} + }, +} + +func NewScreenx(sx, sy Pos) *Screenx { + var s = poolsx.Get().(*Screenx) + s.sx, s.sy = sx, sy + return s +} + +func (s *Screenx) Free() { + poolsx.Put(s) +} + +func (s *Screenx) Len() int { + for i := 39; i >= 0; i-- { + if s.data[i] > 0 { + return i + 1 + } + } + return 0 +} + +func (s *Screenx) UpdateDim() (sx, sy Pos) { + switch s.Len() { + case 3 * 1: + sx, sy = 3, 1 + case 3 * 3: + sx, sy = 3, 3 + case 5 * 3: + sx, sy = 5, 3 + case 5 * 4: + sx, sy = 5, 4 + case 6 * 4: + sx, sy = 6, 4 + } + s.sx, s.sy = sx, sy + return +} + +func (s *Screenx) Dim() (Pos, Pos) { + return s.sx, s.sy +} + +func (s *Screenx) At(x, y Pos) Sym { + return s.data[(x-1)*s.sy+y-1] +} + +func (s *Screenx) Pos(x Pos, line Linex) Sym { + return s.data[(x-1)*s.sy+line[x-1]-1] +} + +func (s *Screenx) Set(x, y Pos, sym Sym) { + s.data[(x-1)*s.sy+y-1] = sym +} + +func (s *Screenx) SetCol(x Pos, reel []Sym, pos int) { + var i = (x - 1) * s.sy + for y := range s.sy { + s.data[i+y] = reel[(pos+int(y))%len(reel)] + } +} + +func (s *Screenx) Spin(reels Reels) { + var x Pos + for x = 1; x <= s.sx; x++ { + var reel = reels.Reel(x) + var hit = rand.N(len(reel)) + s.SetCol(x, reel, hit) + } +} + +func (s *Screenx) ScatNum(scat Sym) (n Pos) { + for i := range s.sx * s.sy { + if s.data[i] == scat { + n++ + } + } + return +} + +func (s *Screenx) ScatNumOdd(scat Sym) (n Pos) { + var x, y, i Pos +loopx: + for x = 0; x < s.sx; x += 2 { + i = x * s.sy + for y = range s.sy { + if s.data[i+y] == scat { + n++ + continue loopx + } + } + } + return +} + +func (s *Screenx) ScatNumCont(scat Sym) (n Pos) { + var x, y, i Pos +loopx: + for x = range s.sx { + i = x * s.sy + for y = range s.sy { + if s.data[i+y] == scat { + n++ + continue loopx + } + } + break // scatters should be continuous + } + return +} + +func (s *Screenx) ScatPos(scat Sym) (l Linex) { + for i := range s.sx * s.sy { + if s.data[i] == scat { + l[i/s.sy+1] = i%s.sy + 1 + } + } + return +} + +func (s *Screenx) ScatPosOdd(scat Sym) (l Linex) { + var x, y, i Pos +loopx: + for x = 0; x < s.sx; x += 2 { + i = x * s.sy + for y = range s.sy { + if s.data[i+y] == scat { + l[x] = y + 1 + continue loopx + } + } + } + return +} + +func (s *Screenx) ScatPosCont(scat Sym) (l Linex) { + var x, y, i Pos +loopx: + for x = range s.sx { + i = x * s.sy + for y = range s.sy { + if s.data[i+y] == scat { + l[x] = y + 1 + continue loopx + } + } + break // scatters should be continuous + } + return +} + +func (s *Screenx) FillSym() (sym Sym) { + sym = s.data[0] + for i := range s.sx * s.sy { + if s.data[i] != sym { + return 0 + } + } + return +} + +func (s *Screenx) MarshalJSON() ([]byte, error) { + return json.Marshal(s.data[:s.Len()]) +} + +func (s *Screenx) UnmarshalJSON(b []byte) (err error) { + if err = json.Unmarshal(b, &s.data); err != nil { + return + } + s.UpdateDim() + return +} + // Screen for 3x3 slots. type Screen3x3 [3][3]Sym @@ -51,7 +233,7 @@ func (s *Screen3x3) At(x, y Pos) Sym { } func (s *Screen3x3) Pos(x Pos, line Linex) Sym { - return s[x-1][line.At(x)-1] + return s[x-1][line[x-1]-1] } func (s *Screen3x3) Set(x, y Pos, sym Sym) { @@ -74,7 +256,8 @@ func (s *Screen3x3) Spin(reels Reels) { } func (s *Screen3x3) ScatNum(scat Sym) (n Pos) { - for x := range 3 { + var x Pos + for x = range 3 { var r = s[x] if r[0] == scat || r[1] == scat || r[2] == scat { n++ @@ -84,7 +267,8 @@ func (s *Screen3x3) ScatNum(scat Sym) (n Pos) { } func (s *Screen3x3) ScatNumOdd(scat Sym) (n Pos) { - for x := 0; x < 3; x += 2 { + var x Pos + for x = 0; x < 3; x += 2 { var r = s[x] if r[0] == scat || r[1] == scat || r[2] == scat { n++ @@ -94,7 +278,8 @@ func (s *Screen3x3) ScatNumOdd(scat Sym) (n Pos) { } func (s *Screen3x3) ScatNumCont(scat Sym) (n Pos) { - for x := 0; x < 3; x++ { + var x Pos + for x = 0; x < 3; x++ { var r = s[x] if r[0] == scat || r[1] == scat || r[2] == scat { n++ @@ -105,8 +290,7 @@ func (s *Screen3x3) ScatNumCont(scat Sym) (n Pos) { return } -func (s *Screen3x3) ScatPos(scat Sym) Linex { - var l Linex +func (s *Screen3x3) ScatPos(scat Sym) (l Linex) { for x := range 3 { var r = s[x] if r[0] == scat { @@ -115,15 +299,12 @@ func (s *Screen3x3) ScatPos(scat Sym) Linex { l[x] = 2 } else if r[2] == scat { l[x] = 3 - } else { - l[x] = 0 } } - return l + return } -func (s *Screen3x3) ScatPosOdd(scat Sym) Linex { - var l Linex +func (s *Screen3x3) ScatPosOdd(scat Sym) (l Linex) { for x := 0; x < 3; x += 2 { var r = s[x] if r[0] == scat { @@ -132,16 +313,12 @@ func (s *Screen3x3) ScatPosOdd(scat Sym) Linex { l[x] = 2 } else if r[2] == scat { l[x] = 3 - } else { - l[x] = 0 } } - l[1] = 0 - return l + return } -func (s *Screen3x3) ScatPosCont(scat Sym) Linex { - var l Linex +func (s *Screen3x3) ScatPosCont(scat Sym) (l Linex) { var x int for x = 0; x < 3; x++ { var r = s[x] @@ -155,10 +332,7 @@ func (s *Screen3x3) ScatPosCont(scat Sym) Linex { break // scatters should be continuous } } - for ; x < 3; x++ { - l[x] = 0 - } - return l + return } func (s *Screen3x3) FillSym() Sym { @@ -197,7 +371,7 @@ func (s *Screen5x3) At(x, y Pos) Sym { } func (s *Screen5x3) Pos(x Pos, line Linex) Sym { - return s[x-1][line.At(x)-1] + return s[x-1][line[x-1]-1] } func (s *Screen5x3) Set(x, y Pos, sym Sym) { @@ -251,8 +425,7 @@ func (s *Screen5x3) ScatNumCont(scat Sym) (n Pos) { return } -func (s *Screen5x3) ScatPos(scat Sym) Linex { - var l Linex +func (s *Screen5x3) ScatPos(scat Sym) (l Linex) { for x := range 5 { var r = s[x] if r[0] == scat { @@ -261,15 +434,12 @@ func (s *Screen5x3) ScatPos(scat Sym) Linex { l[x] = 2 } else if r[2] == scat { l[x] = 3 - } else { - l[x] = 0 } } - return l + return } -func (s *Screen5x3) ScatPosOdd(scat Sym) Linex { - var l Linex +func (s *Screen5x3) ScatPosOdd(scat Sym) (l Linex) { for x := 0; x < 5; x += 2 { var r = s[x] if r[0] == scat { @@ -278,16 +448,12 @@ func (s *Screen5x3) ScatPosOdd(scat Sym) Linex { l[x] = 2 } else if r[2] == scat { l[x] = 3 - } else { - l[x] = 0 } } - l[1], l[3] = 0, 0 - return l + return } -func (s *Screen5x3) ScatPosCont(scat Sym) Linex { - var l Linex +func (s *Screen5x3) ScatPosCont(scat Sym) (l Linex) { var x int for x = 0; x < 5; x++ { var r = s[x] @@ -301,10 +467,7 @@ func (s *Screen5x3) ScatPosCont(scat Sym) Linex { break // scatters should be continuous } } - for ; x < 5; x++ { - l[x] = 0 - } - return l + return } func (s *Screen5x3) FillSym() Sym { @@ -343,7 +506,7 @@ func (s *Screen5x4) At(x, y Pos) Sym { } func (s *Screen5x4) Pos(x Pos, line Linex) Sym { - return s[x-1][line.At(x)-1] + return s[x-1][line[x-1]-1] } func (s *Screen5x4) Set(x, y Pos, sym Sym) { @@ -397,8 +560,7 @@ func (s *Screen5x4) ScatNumCont(scat Sym) (n Pos) { return } -func (s *Screen5x4) ScatPos(scat Sym) Linex { - var l Linex +func (s *Screen5x4) ScatPos(scat Sym) (l Linex) { for x := range 5 { var r = s[x] if r[0] == scat { @@ -409,15 +571,12 @@ func (s *Screen5x4) ScatPos(scat Sym) Linex { l[x] = 3 } else if r[3] == scat { l[x] = 4 - } else { - l[x] = 0 } } - return l + return } -func (s *Screen5x4) ScatPosOdd(scat Sym) Linex { - var l Linex +func (s *Screen5x4) ScatPosOdd(scat Sym) (l Linex) { for x := 0; x < 5; x += 2 { var r = s[x] if r[0] == scat { @@ -428,16 +587,12 @@ func (s *Screen5x4) ScatPosOdd(scat Sym) Linex { l[x] = 3 } else if r[3] == scat { l[x] = 4 - } else { - l[x] = 0 } } - l[1], l[3] = 0, 0 - return l + return } -func (s *Screen5x4) ScatPosCont(scat Sym) Linex { - var l Linex +func (s *Screen5x4) ScatPosCont(scat Sym) (l Linex) { var x int for x = 0; x < 5; x++ { var r = s[x] @@ -453,10 +608,7 @@ func (s *Screen5x4) ScatPosCont(scat Sym) Linex { break // scatters should be continuous } } - for ; x < 5; x++ { - l[x] = 0 - } - return l + return } func (s *Screen5x4) FillSym() Sym { diff --git a/go.mod b/go.mod index 986e51fb..e4a697b3 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( require ( filippo.io/edwards25519 v1.1.0 // indirect - github.com/bytedance/sonic v1.12.2 // indirect + github.com/bytedance/sonic v1.12.3 // indirect github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect diff --git a/go.sum b/go.sum index b54a5217..ead70a2f 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= -github.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg= -github.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic v1.12.3 h1:W2MGa7RCU1QTeYRTPE3+88mVC0yXmsRQRChiyVocVjU= +github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=