diff --git a/gamerule/fortunedragon/constants.go b/gamerule/fortunedragon/constants.go new file mode 100644 index 0000000..9407967 --- /dev/null +++ b/gamerule/fortunedragon/constants.go @@ -0,0 +1,20 @@ +package fortunedragon + +// 房间类型 +const ( + RoomMode_Classic int = iota //经典 + RoomMode_Max +) + +// 场景状态 +const ( + FortuneDragonStateStart int = iota //默认状态 + FortuneDragonStateMax +) + +// 玩家操作 +const ( + FortuneDragonPlayerOpStart int = iota + FortuneDragonPlayerOpSwitch +) +const NowByte int64 = 10000 diff --git a/gamerule/fortunedragon/fruitsAlgorithm.go b/gamerule/fortunedragon/fruitsAlgorithm.go new file mode 100644 index 0000000..4aa587f --- /dev/null +++ b/gamerule/fortunedragon/fruitsAlgorithm.go @@ -0,0 +1,359 @@ +package fortunedragon + +func (w *WinResult) Init() { + w.EleValue = make([]int32, 15) + w.WinLine = nil +} + +// 玛丽游戏 +func (w *WinResult) InitMary() { + w.MaryOutSide = -1 + w.MaryMidArray = nil + w.MaryOutRate = 0 + w.MaryMidRate = 0 + w.MaryLianXu = 0 +} + +// 正常游戏 免费游戏 +func (w *WinResult) CreateLine(ele [][]int32, free bool) { + w.Init() + w.result(ele, free) + //Print(w.EleValue) +} +func (w *WinResult) Win() { + w.getWinLine() +} + +// 玛丽游戏 +func (w *WinResult) CreateMary(maryGame [][]int32) { + w.InitMary() + w.MaryOutSide = RandSliceInt32IndexByWightN(maryGame[0]) + for i := 0; i < 4; i++ { + ele := RandSliceInt32IndexByWightN(maryGame[1]) + w.MaryMidArray = append(w.MaryMidArray, ele) + } + //fmt.Println("外圈元素", w.MaryOutSide) + //fmt.Println("内圈元素", w.MaryMidArray) + w.MaryWin() +} +func (w *WinResult) MaryWin() { + var outRate int64 + switch w.MaryOutSide { + case Watermelon: + outRate += 200 + case Grape: + outRate += 100 + case Lemon: + outRate += 70 + case Cherry: + outRate += 50 + case Banana: + outRate += 20 + case Apple: + outRate += 10 + case Pineapple: + outRate += 5 + } + var flag = w.MaryMidArray[0] + var n int32 + for _, v := range w.MaryMidArray { + if flag != v { + break + } + n++ + } + for _, v := range w.MaryMidArray { + if w.MaryOutSide == v { + w.MaryOutRate = outRate + break + } + } + if n >= 3 { + if n == 3 { + w.MaryMidRate = 20 + } else if n == 4 { + w.MaryMidRate = 500 + } + w.MaryLianXu = n + } + //fmt.Println("外圈倍率:", w.MaryOutRate) + //fmt.Println("内圈倍率", w.MaryMidRate) +} + +func (w *WinResult) result(ele [][]int32, free bool) { + sl1 := make(map[int]bool) + sl2 := make(map[int]bool) + sl3 := make(map[int]bool) + n := 0 + for i := 0; i < Column; i++ { + for j := 0; j < Row; j++ { + val := RandSliceInt32IndexByWightN(ele[j]) + if val == Scatter { + if !sl1[j] { + sl1[j] = true + } else { + noScatter := make([]int32, len(ele[j])) + copy(noScatter, ele[j]) + noScatter[Scatter] = 0 + noScatter[Bonus] = 0 + noScatter[Wild] = 0 + val = RandSliceInt32IndexByWightN(noScatter) + } + } else if val == Bonus { + if !sl2[j] { + sl2[j] = true + } else { + noBonus := make([]int32, len(ele[j])) + copy(noBonus, ele[j]) + noBonus[Scatter] = 0 + noBonus[Bonus] = 0 + noBonus[Wild] = 0 + val = RandSliceInt32IndexByWightN(noBonus) + } + } else if val == Wild { + if !sl3[j] { + sl3[j] = true + } else { + noWild := make([]int32, len(ele[j])) + copy(noWild, ele[j]) + noWild[Scatter] = 0 + noWild[Bonus] = 0 + noWild[Wild] = 0 + val = RandSliceInt32IndexByWightN(noWild) + } + } + w.EleValue[n] = val + n++ + } + } + + if free { + //免费 不中 玛丽游戏和奖池 + eleVal := make([]int32, len(w.EleValue)) + copy(eleVal, w.EleValue) + var wls WinResult + wls.Init() + wls.EleValue = eleVal + wls.Win() + for _, v := range wls.WinLine { + flag := v.Lines[0] + if flag == Scatter { + noScatter := make([]int32, len(ele[2])) + copy(noScatter, ele[2]) + noScatter[Wild] = 0 + noScatter[Scatter] = 0 + vv := RandSliceInt32IndexByWightN(noScatter) + w.EleValue[v.Poss[2]] = vv + } else { + wildNum := 0 + for _, el := range v.Lines { + if el == Wild { + wildNum++ + } else { + wildNum = 0 + } + } + if wildNum >= 3 { + noWild := make([]int32, len(ele[2])) + copy(noWild, ele[2]) + noWild[Wild] = 0 + noWild[Scatter] = 0 + w.EleValue[v.Poss[2]] = RandSliceInt32IndexByWightN(noWild) + } + } + } + } +} + +func (w *WinResult) getWinLine() { + n := 0 + var flag int32 = -1 + for k, cols := range LineWinNum { + flag = w.EleValue[cols[0]] + //Bonus Scatter 不参与线数 Bonus下班单独计算 + if flag == Bonus || flag == Scatter { + continue + } + var line []int32 + var pos []int32 + for _, key := range cols { + //不计算 Bonus + if (flag == w.EleValue[key] || Wild == w.EleValue[key] || flag == Wild) && w.EleValue[key] != Bonus && + w.EleValue[key] != Scatter { + if Wild != w.EleValue[key] { + flag = w.EleValue[key] + } + n++ + line = append(line, w.EleValue[key]) + pos = append(pos, int32(key)) + } else { + if n >= 3 || (flag == Banana && n >= 2) { + w.WinLine = append(w.WinLine, WinLine{ + Lines: line, + Poss: pos, + LineId: k + 1, + Rate: GetRate(flag, n), + }) + } + n = 0 + pos = nil + line = nil + break + } + if n == 5 { + w.WinLine = append(w.WinLine, WinLine{ + Lines: line, + Poss: pos, + LineId: k + 1, + Rate: GetRate(flag, n), + }) + n = 0 + pos = nil + line = nil + } + } + } + + w.getBonusAndScatter() + + //test code + //if len(w.WinLine) > 0 { + // fmt.Println("====== 赢的总线数 =======", len(w.WinLine)) + // for k, v := range w.WinLine { + // fmt.Print(k+1, " ") + // PrintWin(v.Lines) + // fmt.Println(k+1, "位置 ", v.Poss, " 中奖线号:", v.LineId, " 线元素:", v.Lines, " 倍率:", v.Rate) + // } + //} +} +func (w *WinResult) getBonusAndScatter() { + //只计算Bonus和Scatter + for k, cols := range LineWinNum { + var n int + var line []int32 + var pos []int32 + for l, key := range cols { + if w.EleValue[key] == Bonus { + n++ + line = append(line, w.EleValue[key]) + pos = append(pos, int32(key)) + } else { + if n >= 3 { + w.WinLine = append(w.WinLine, WinLine{ + Lines: line, + Poss: pos, + LineId: k + 1, + Rate: GetRate(Bonus, n), + }) + } + n = 0 + pos = nil + line = nil + continue + } + if l == 4 { + if n >= 3 { + w.WinLine = append(w.WinLine, WinLine{ + Lines: line, + Poss: pos, + LineId: k + 1, + Rate: GetRate(Bonus, n), + }) + n = 0 + pos = nil + line = nil + } + } + } + n = 0 + pos = nil + line = nil + for l, key := range cols { + if w.EleValue[key] == Scatter { + n++ + line = append(line, w.EleValue[key]) + pos = append(pos, int32(key)) + } else { + if n >= 3 { + w.WinLine = append(w.WinLine, WinLine{ + Lines: line, + Poss: pos, + LineId: k + 1, + Rate: GetRate(Scatter, n), + }) + } + n = 0 + pos = nil + line = nil + continue + } + if l == 4 { + if n >= 3 { + w.WinLine = append(w.WinLine, WinLine{ + Lines: line, + Poss: pos, + LineId: k + 1, + Rate: GetRate(Scatter, n), + }) + n = 0 + pos = nil + line = nil + } + } + } + n = 0 + pos = nil + line = nil + for l, key := range cols { + if w.EleValue[key] == Wild { + n++ + line = append(line, w.EleValue[key]) + pos = append(pos, int32(key)) + } else { + if n >= 3 { + isHave := false + for _, i2 := range w.WinLine { + if i2.LineId == k+1 { + isHave = true + break + } + } + if !isHave { + w.WinLine = append(w.WinLine, WinLine{ + Lines: line, + Poss: pos, + LineId: k + 1, + Rate: GetRate(Wild, n), + }) + } + } + n = 0 + pos = nil + line = nil + continue + } + if l == 4 { + if n >= 3 { + isHave := false + for _, i2 := range w.WinLine { + if i2.LineId == k+1 { + isHave = true + break + } + } + if !isHave { + w.WinLine = append(w.WinLine, WinLine{ + Lines: line, + Poss: pos, + LineId: k + 1, + Rate: GetRate(Wild, n), + }) + } + n = 0 + pos = nil + line = nil + } + } + } + } +} diff --git a/gamerule/fortunedragon/func.go b/gamerule/fortunedragon/func.go new file mode 100644 index 0000000..d046378 --- /dev/null +++ b/gamerule/fortunedragon/func.go @@ -0,0 +1,215 @@ +package fortunedragon + +import ( + "fmt" + "math/rand" + "strconv" +) + +func GetLineEleVal(gameState int, needRate int64, eleLineAppearRate [][]int32, isLow bool) (WinResult, []int, [][]int32) { + var preInt [][]int32 + for i := 0; i < 1000; i++ { + var wls WinResult + wls.CreateLine(eleLineAppearRate, false) + wls.Win() + var rate int64 + var bonusNum int + var wildNum int + for _, v := range wls.WinLine { + if len(v.Lines) == 0 { + continue + } + rate += v.Rate + if v.Lines[0] == Bonus { + bonusNum += len(v.Lines) + } else if v.Lines[0] == Wild { + wildNum += len(v.Lines) + } + NowWildNum := 0 + for _, l := range v.Lines { + if l != Wild && NowWildNum > 0 { + if NowWildNum < 3 { + NowWildNum = 0 + } + } else if l == Wild { + NowWildNum++ + } + } + if NowWildNum >= 3 { + wildNum += NowWildNum + } + } + + //fmt.Printf("%v || rate %v", wls.EleValue, rate) + //fmt.Println() + var n int64 = 5 + if gameState == FreeGame { + n = 50 + } + if wildNum >= 3 || bonusNum >= 3 { + continue + } + if isLow { + continue + } + if rate >= needRate-n && rate <= needRate+n { + var poss []int32 + for _, v := range wls.WinLine { + poss = append(poss, v.Poss...) + } + var noPoss []int + for k := range wls.EleValue { + isF := false + for _, pn := range poss { + if k == int(pn) { + isF = true + break + } + } + if !isF { + noPoss = append(noPoss, k) + } + } + //fmt.Println("...........find rate: ", rate, " 第 ", i+1, " 次.") + return wls, noPoss, nil + } + if rate != 0 && rate < 50 && len(preInt) < 10 { + preInt = append(preInt, wls.EleValue) + } + } + return WinResult{}, nil, preInt +} +func GetLinePos(lineId int) []int { + if lineId <= 9 || lineId >= 1 { + return LineWinNum[lineId-1] + } + return nil +} +func GetRate(ele int32, num int) int64 { + if data, ok := EleNumRate[ele]; ok { + if r, ok2 := data[num]; ok2 { + return r + } + } + return 0 +} +func RandSliceInt32IndexByWightN(s1 []int32) int32 { + total := 0 + for _, v := range s1 { + total += int(v) + } + if total <= 0 { + return 0 + } + random := rand.Intn(total) + total = 0 + for i, v := range s1 { + total += int(v) + if random < total { + return int32(i) + } + } + return 0 +} +func PrintFruit(idx int32) (str string) { + switch idx { + case Wild: + str += "Wild" + case Bonus: + str += "Bonus" + case Scatter: + str += "SCATTER" + case Bar: + str += "Bar" + case Cherry: + str += "樱桃" + case Bell: + str += "铃铛" + case Pineapple: + str += "菠萝" + case Grape: + str += "葡萄" + case Lemon: + str += "柠檬" + case Watermelon: + str += "西瓜" + case Banana: + str += "香蕉" + case Apple: + str += "苹果" + case Bomb: + str += "炸弹" + } + return str +} + +func Print(res []int32) { + fmt.Println(res, len(res)) + str := "" + for k, ele := range res { + switch ele { + case Wild: + str += "Wild," + case Bonus: + str += "Bonus," + case Scatter: + str += "Scatter," + case Bar: + str += "Bar," + case Cherry: + str += "樱桃," + case Bell: + str += "铃铛," + case Pineapple: + str += "菠萝," + case Grape: + str += "葡萄," + case Lemon: + str += "柠檬," + case Watermelon: + str += "西瓜," + case Apple: + str += "苹果," + case Banana: + str += "香蕉," + } + if (k+1)%5 == 0 { + fmt.Println("第", strconv.Itoa((k+1)/5), "行 ", str) + str = "" + } + } +} +func PrintWin(lines []int32) { + str := "" + for _, ele := range lines { + switch ele { + case Wild: + str += "Wild," + case Bonus: + str += "Bonus," + case Scatter: + str += "Scatter," + case Bar: + str += "Bar," + case Cherry: + str += "樱桃," + case Bell: + str += "铃铛," + case Pineapple: + str += "菠萝," + case Grape: + str += "葡萄," + case Lemon: + str += "柠檬," + case Watermelon: + str += "西瓜," + case Banana: + str += "香蕉," + case Apple: + str += "苹果," + case Bomb: + str += "炸弹," + } + } + fmt.Println(str) +} diff --git a/gamesrv/fortunedragon/action_fortunedragon.go b/gamesrv/fortunedragon/action_fortunedragon.go new file mode 100644 index 0000000..f0c4ea5 --- /dev/null +++ b/gamesrv/fortunedragon/action_fortunedragon.go @@ -0,0 +1,48 @@ +package fortunedragon + +import ( + "mongo.games.com/game/protocol/fortunedragon" + "mongo.games.com/goserver/core/logger" + "mongo.games.com/goserver/core/netlib" + + "mongo.games.com/game/common" + "mongo.games.com/game/gamesrv/base" +) + +type CSFortuneDragonOpPacketFactory struct { +} +type CSFortuneDragonOpHandler struct { +} + +func (this *CSFortuneDragonOpPacketFactory) CreatePacket() interface{} { + pack := &fortunedragon.CSFortuneDragonOp{} + return pack +} + +func (this *CSFortuneDragonOpHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { + if op, ok := data.(*fortunedragon.CSFortuneDragonOp); ok { + p := base.PlayerMgrSington.GetPlayer(sid) + if p == nil { + logger.Logger.Warn("CSFortuneDragonOpHandler p == nil") + return nil + } + scene := p.GetScene() + if scene == nil { + logger.Logger.Warn("CSFortuneDragonOpHandler p.scene == nil") + return nil + } + if !scene.HasPlayer(p) { + return nil + } + if scene.GetScenePolicy() != nil { + scene.GetScenePolicy().OnPlayerOp(scene, p, int(op.GetOpCode()), op.GetParams()) + } + return nil + } + return nil +} +func init() { + //fortunedragon + common.RegisterHandler(int(fortunedragon.FortuneDragonPID_PACKET_FORTUNEDRAGON_CSFORTUNEDRAGONOP), &CSFortuneDragonOpHandler{}) + netlib.RegisterFactory(int(fortunedragon.FortuneDragonPID_PACKET_FORTUNEDRAGON_CSFORTUNEDRAGONOP), &CSFortuneDragonOpPacketFactory{}) +} diff --git a/gamesrv/fortunedragon/playerdata_fortunedragon.go b/gamesrv/fortunedragon/playerdata_fortunedragon.go new file mode 100644 index 0000000..e617dce --- /dev/null +++ b/gamesrv/fortunedragon/playerdata_fortunedragon.go @@ -0,0 +1,16 @@ +package fortunedragon + +import ( + "mongo.games.com/game/gamesrv/base" +) + +type FortuneDragonPlayerData struct { + *base.Player + leaveTime int32 //离开时间 +} + +func (p *FortuneDragonPlayerData) init() { +} +func (p *FortuneDragonPlayerData) Clear() { + +} diff --git a/gamesrv/fortunedragon/scenedata_fortunedragon.go b/gamesrv/fortunedragon/scenedata_fortunedragon.go new file mode 100644 index 0000000..51fffb2 --- /dev/null +++ b/gamesrv/fortunedragon/scenedata_fortunedragon.go @@ -0,0 +1,43 @@ +package fortunedragon + +import ( + "mongo.games.com/game/gamesrv/base" +) + +type FortuneDragonSceneData struct { + *base.Scene //场景 + players map[int32]*FortuneDragonPlayerData //玩家信息 +} + +func NewFortuneDragonSceneData(s *base.Scene) *FortuneDragonSceneData { + sceneEx := &FortuneDragonSceneData{ + Scene: s, + players: make(map[int32]*FortuneDragonPlayerData), + } + sceneEx.Init() + return sceneEx +} +func (s *FortuneDragonSceneData) Init() { + +} + +func (s *FortuneDragonSceneData) Clear() { + //应该是水池变一次就判断修改一次 + //s.slotRateWeight = s.slotRateWeightTotal[0] +} +func (s *FortuneDragonSceneData) SceneDestroy(force bool) { + //销毁房间 + s.Scene.Destroy(force) +} + +func (s *FortuneDragonSceneData) delPlayer(SnId int32) { + if _, exist := s.players[SnId]; exist { + delete(s.players, SnId) + } +} +func (s *FortuneDragonSceneData) OnPlayerLeave(p *base.Player, reason int) { + if /*playerEx*/ _, ok := p.ExtraData.(*FortuneDragonPlayerData); ok { + + } + s.delPlayer(p.SnId) +} diff --git a/gamesrv/fortunedragon/scenepolicy_fortunedragon.go b/gamesrv/fortunedragon/scenepolicy_fortunedragon.go new file mode 100644 index 0000000..6bbfe10 --- /dev/null +++ b/gamesrv/fortunedragon/scenepolicy_fortunedragon.go @@ -0,0 +1,363 @@ +package fortunedragon + +import ( + "mongo.games.com/game/gamerule/fortunedragon" + "time" + + "mongo.games.com/goserver/core" + "mongo.games.com/goserver/core/logger" + + "mongo.games.com/game/common" + "mongo.games.com/game/gamesrv/base" + "mongo.games.com/game/proto" + protocol "mongo.games.com/game/protocol/fortunedragon" +) + +// //////////////////////////////////////////////////////////// +var ScenePolicyFortuneDragonSington = &ScenePolicyFortuneDragon{} + +type ScenePolicyFortuneDragon struct { + base.BaseScenePolicy + states [fortunedragon.FortuneDragonStateMax]base.SceneState +} + +// 创建场景扩展数据 +func (this *ScenePolicyFortuneDragon) CreateSceneExData(s *base.Scene) interface{} { + sceneEx := NewFortuneDragonSceneData(s) + if sceneEx != nil { + if sceneEx.GetInit() { + s.SetExtraData(sceneEx) + } + } + return sceneEx +} + +// 创建玩家扩展数据 +func (this *ScenePolicyFortuneDragon) CreatePlayerExData(s *base.Scene, p *base.Player) interface{} { + playerEx := &FortuneDragonPlayerData{Player: p} + p.SetExtraData(playerEx) + return playerEx +} + +// 场景开启事件 +func (this *ScenePolicyFortuneDragon) OnStart(s *base.Scene) { + logger.Logger.Trace("(this *ScenePolicyFortuneDragon) OnStart, sceneId=", s.GetSceneId()) + sceneEx := NewFortuneDragonSceneData(s) + if sceneEx != nil { + if sceneEx.GetInit() { + s.SetExtraData(sceneEx) + s.ChangeSceneState(fortunedragon.FortuneDragonStateStart) + } + } +} + +// 场景关闭事件 +func (this *ScenePolicyFortuneDragon) OnStop(s *base.Scene) { + logger.Logger.Trace("(this *ScenePolicyFortuneDragon) OnStop , sceneId=", s.GetSceneId()) +} + +// 场景心跳事件 +func (this *ScenePolicyFortuneDragon) OnTick(s *base.Scene) { + if s == nil { + return + } + if s.GetSceneState() != nil { + s.GetSceneState().OnTick(s) + } +} + +// 玩家进入事件 +func (this *ScenePolicyFortuneDragon) OnPlayerEnter(s *base.Scene, p *base.Player) { + if s == nil || p == nil { + return + } + logger.Logger.Trace("(this *ScenePolicyFortuneDragon) OnPlayerEnter, sceneId=", s.GetSceneId(), " player=", p.Name) + if sceneEx, ok := s.GetExtraData().(*FortuneDragonSceneData); ok { + playerEx := &FortuneDragonPlayerData{Player: p} + playerEx.init() + playerEx.Clear() + + sceneEx.players[p.SnId] = playerEx + + p.SetExtraData(playerEx) + FortuneDragonSendRoomInfo(s, sceneEx, playerEx) + + s.FirePlayerEvent(p, base.PlayerEventEnter, nil) + } +} + +// 玩家离开事件 +func (this *ScenePolicyFortuneDragon) OnPlayerLeave(s *base.Scene, p *base.Player, reason int) { + if s == nil || p == nil { + return + } + logger.Logger.Trace("(this *ScenePolicyFortuneDragon) OnPlayerLeave, sceneId=", s.GetSceneId(), " player=", p.SnId) + if sceneEx, ok := s.ExtraData.(*FortuneDragonSceneData); ok { + s.FirePlayerEvent(p, base.PlayerEventLeave, nil) + sceneEx.OnPlayerLeave(p, reason) + } +} + +// 玩家掉线 +func (this *ScenePolicyFortuneDragon) OnPlayerDropLine(s *base.Scene, p *base.Player) { + if s == nil || p == nil { + return + } + logger.Logger.Trace("(this *ScenePolicyFortuneDragon) OnPlayerDropLine, sceneId=", s.GetSceneId(), " player=", p.SnId) + s.FirePlayerEvent(p, base.PlayerEventDropLine, nil) +} + +// 玩家重连 +func (this *ScenePolicyFortuneDragon) OnPlayerRehold(s *base.Scene, p *base.Player) { + if s == nil || p == nil { + return + } + logger.Logger.Trace("(this *ScenePolicyFortuneDragon) OnPlayerRehold, sceneId=", s.GetSceneId(), " player=", p.SnId) + if sceneEx, ok := s.GetExtraData().(*FortuneDragonSceneData); ok { + if playerEx, ok := p.GetExtraData().(*FortuneDragonPlayerData); ok { + FortuneDragonSendRoomInfo(s, sceneEx, playerEx) + } + } +} + +// 返回房间 +func (this *ScenePolicyFortuneDragon) OnPlayerReturn(s *base.Scene, p *base.Player) { + if s == nil || p == nil { + return + } + logger.Logger.Trace("(this *ScenePolicyFortuneDragon) OnPlayerReturn, GetSceneId()=", s.GetSceneId(), " player=", p.Name) + if sceneEx, ok := s.GetExtraData().(*FortuneDragonSceneData); ok { + if playerEx, ok := p.GetExtraData().(*FortuneDragonPlayerData); ok { + //if p.IsMarkFlag(base.PlayerState_Auto) { + // p.UnmarkFlag(base.PlayerState_Auto) + // p.SyncFlag() + //} + //发送房间信息给自己 + FortuneDragonSendRoomInfo(s, sceneEx, playerEx) + s.FirePlayerEvent(p, base.PlayerEventReturn, nil) + } + } +} + +func FortuneDragonSendRoomInfo(s *base.Scene, sceneEx *FortuneDragonSceneData, playerEx *FortuneDragonPlayerData) { + pack := FortuneDragonCreateRoomInfoPacket(s, sceneEx, playerEx) + logger.Logger.Trace("RoomInfo: ", pack) + playerEx.SendToClient(int(protocol.FortuneDragonPID_PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMINFO), pack) +} +func FortuneDragonCreateRoomInfoPacket(s *base.Scene, sceneEx *FortuneDragonSceneData, playerEx *FortuneDragonPlayerData) interface{} { + //房间信息 + pack := &protocol.SCFortuneDragonRoomInfo{ + RoomId: s.SceneId, + GameId: s.GameId, + RoomMode: s.SceneMode, + SceneType: s.GetSceneType(), + Params: common.CopySliceInt64ToInt32(s.Params), + NumOfGames: proto.Int(sceneEx.NumOfGames), + State: proto.Int(s.SceneState.GetState()), + ParamsEx: s.GetDBGameFree().OtherIntParams, + GameFreeId: proto.Int32(s.GetDBGameFree().Id), + //BetLimit: s.GetDBGameFree().BetLimit, + } + + //自己的信息 + if playerEx != nil { + pd := &protocol.FortuneDragonPlayerData{ + SnId: proto.Int32(playerEx.SnId), + Name: proto.String(playerEx.Name), + Head: proto.Int32(playerEx.Head), + Sex: proto.Int32(playerEx.Sex), + Coin: proto.Int64(playerEx.Coin), + Pos: proto.Int(playerEx.Pos), + Flag: proto.Int(playerEx.GetFlag()), + City: proto.String(playerEx.City), + HeadOutLine: proto.Int32(playerEx.HeadOutLine), + VIP: proto.Int32(playerEx.VIP), + } + pack.Player = pd + } + proto.SetDefaults(pack) + return pack +} +func (this *ScenePolicyFortuneDragon) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool { + if s == nil || p == nil { + return false + } + logger.Logger.Trace("(this *ScenePolicyFortuneDragon) OnPlayerOp, sceneId=", s.GetSceneId(), " player=", p.SnId, " opcode=", opcode, " params=", params) + if s.GetSceneState() != nil { + if s.GetSceneState().OnPlayerOp(s, p, opcode, params) { + p.SetLastOPTimer(time.Now()) + return true + } + return false + } + return true +} + +func (this *ScenePolicyFortuneDragon) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) { + if s == nil || p == nil { + return + } + logger.Logger.Trace("(this *ScenePolicyFortuneDragon) OnPlayerEvent, sceneId=", s.GetSceneId(), " player=", p.SnId, " eventcode=", evtcode, " params=", params) + if s.GetSceneState() != nil { + s.GetSceneState().OnPlayerEvent(s, p, evtcode, params) + } +} + +// 当前状态能否换桌 +func (this *ScenePolicyFortuneDragon) CanChangeCoinScene(s *base.Scene, p *base.Player) bool { + if s == nil || p == nil { + return false + } + if s.GetSceneState() != nil { + return s.GetSceneState().CanChangeCoinScene(s, p) + } + return false +} + +// 状态基类 +type SceneBaseStateFortuneDragon struct { +} + +func (this *SceneBaseStateFortuneDragon) GetTimeout(s *base.Scene) int { + if sceneEx, ok := s.GetExtraData().(*FortuneDragonSceneData); ok { + return int(time.Now().Sub(sceneEx.GetStateStartTime()) / time.Second) + } + return 0 +} + +func (this *SceneBaseStateFortuneDragon) CanChangeTo(s base.SceneState) bool { + return true +} + +// 当前状态能否换桌 +func (this *SceneBaseStateFortuneDragon) CanChangeCoinScene(s *base.Scene, p *base.Player) bool { + return true +} +func (this *SceneBaseStateFortuneDragon) OnEnter(s *base.Scene) { + if sceneEx, ok := s.GetExtraData().(*FortuneDragonSceneData); ok { + sceneEx.SetStateStartTime(time.Now()) + } +} + +func (this *SceneBaseStateFortuneDragon) OnLeave(s *base.Scene) {} +func (this *SceneBaseStateFortuneDragon) OnTick(s *base.Scene) { + if time.Now().Sub(s.GameStartTime) > time.Second*3 { + if sceneEx, ok := s.ExtraData.(*FortuneDragonSceneData); ok { + for _, p := range sceneEx.players { + if p.IsOnLine() { + p.leaveTime = 0 + continue + } + p.leaveTime++ + if p.leaveTime < 60*2 { + continue + } + //踢出玩家 + sceneEx.PlayerLeave(p.Player, common.PlayerLeaveReason_LongTimeNoOp, true) + } + } + s.GameStartTime = time.Now() + } +} +func (this *SceneBaseStateFortuneDragon) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool { + return false +} +func (this *SceneBaseStateFortuneDragon) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) { +} + +// //////////////////////////////////////////////////////////// +// 开始状态 +// //////////////////////////////////////////////////////////// +type SceneStateStartFortuneDragon struct { + SceneBaseStateFortuneDragon +} + +func (this *SceneStateStartFortuneDragon) GetState() int { + return fortunedragon.FortuneDragonStateStart +} + +func (this *SceneStateStartFortuneDragon) CanChangeTo(s base.SceneState) bool { + return false +} + +// 当前状态能否换桌 +func (this *SceneStateStartFortuneDragon) CanChangeCoinScene(s *base.Scene, p *base.Player) bool { + if playerEx, ok := p.GetExtraData().(*FortuneDragonPlayerData); ok { + if playerEx.IsOnLine() { + return false + } + } + return true +} + +func (this *SceneStateStartFortuneDragon) GetTimeout(s *base.Scene) int { + return 0 +} + +func (this *SceneStateStartFortuneDragon) OnEnter(s *base.Scene) { + this.SceneBaseStateFortuneDragon.OnEnter(s) + if sceneEx, ok := s.GetExtraData().(*FortuneDragonSceneData); ok { + sceneEx.SetGameNowTime(time.Now()) + } +} + +// 状态离开时 +func (this *SceneStateStartFortuneDragon) OnLeave(s *base.Scene) { + this.SceneBaseStateFortuneDragon.OnLeave(s) + logger.Logger.Tracef("(this *SceneStateStartFortuneDragon) OnLeave, sceneid=%v", s.GetSceneId()) +} + +// 玩家操作 +func (this *SceneStateStartFortuneDragon) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool { + logger.Logger.Tracef("(this *SceneStateStartFortuneDragon) OnPlayerOp, sceneid=%v params=%v", s.GetSceneId(), params) + if this.SceneBaseStateFortuneDragon.OnPlayerOp(s, p, opcode, params) { + return true + } + if _, ok := s.GetExtraData().(*FortuneDragonSceneData); ok { + if playerEx, ok := p.GetExtraData().(*FortuneDragonPlayerData); ok { + switch opcode { + case fortunedragon.FortuneDragonPlayerOpStart: + playerEx.Clear() + } + } + } + return true +} + +// 玩家事件 +func (this *SceneStateStartFortuneDragon) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) { + logger.Logger.Trace("(this *SceneStateStartFortuneDragon) OnPlayerEvent, sceneId=", s.GetSceneId(), " player=", p.SnId, " evtcode=", evtcode) + this.SceneBaseStateFortuneDragon.OnPlayerEvent(s, p, evtcode, params) +} + +func (this *SceneStateStartFortuneDragon) OnTick(s *base.Scene) { + this.SceneBaseStateFortuneDragon.OnTick(s) +} + +// ////////////////////////////////////////////////////////////////////////////// +func (this *ScenePolicyFortuneDragon) RegisteSceneState(state base.SceneState) { + if state == nil { + return + } + stateid := state.GetState() + if stateid < 0 || stateid >= fortunedragon.FortuneDragonStateMax { + return + } + this.states[stateid] = state +} + +func (this *ScenePolicyFortuneDragon) GetSceneState(s *base.Scene, stateid int) base.SceneState { + if stateid >= 0 && stateid < fortunedragon.FortuneDragonStateMax { + return this.states[stateid] + } + return nil +} + +func init() { + //主状态 + ScenePolicyFortuneDragonSington.RegisteSceneState(&SceneStateStartFortuneDragon{}) + core.RegisteHook(core.HOOK_BEFORE_START, func() error { + base.RegisteScenePolicy(common.GameId_FortuneDragon, fortunedragon.RoomMode_Classic, ScenePolicyFortuneDragonSington) + return nil + }) +} diff --git a/gamesrv/slotspkg/external/Client_Config/Config/base/CashMania.lua b/gamesrv/slotspkg/external/Client_Config/Config/base/CashMania.lua new file mode 100644 index 0000000..fc59d1d --- /dev/null +++ b/gamesrv/slotspkg/external/Client_Config/Config/base/CashMania.lua @@ -0,0 +1,382 @@ +-- +local _ = {} + +_.CashManiaBetBetChangeList = { + [0] = { + index = 0, + bet_change_list = 0.3, + bet_size_index = 0, + bet_level_index = 0, + }, + [1] = { + index = 1, + bet_change_list = 0.6, + bet_size_index = 0, + bet_level_index = 1, + }, + [2] = { + index = 2, + bet_change_list = 0.9, + bet_size_index = 0, + bet_level_index = 2, + }, + [3] = { + index = 3, + bet_change_list = 1, + bet_size_index = 1, + bet_level_index = 0, + }, + [4] = { + index = 4, + bet_change_list = 1.5, + bet_size_index = 0, + bet_level_index = 4, + }, + [5] = { + index = 5, + bet_change_list = 3, + bet_size_index = 0, + bet_level_index = 9, + }, + [6] = { + index = 6, + bet_change_list = 5, + bet_size_index = 1, + bet_level_index = 4, + }, + [7] = { + index = 7, + bet_change_list = 9, + bet_size_index = 3, + bet_level_index = 0, + }, + [8] = { + index = 8, + bet_change_list = 10, + bet_size_index = 1, + bet_level_index = 9, + }, + [9] = { + index = 9, + bet_change_list = 15, + bet_size_index = 2, + bet_level_index = 4, + }, + [10] = { + index = 10, + bet_change_list = 30, + bet_size_index = 2, + bet_level_index = 9, + }, + [11] = { + index = 11, + bet_change_list = 45, + bet_size_index = 3, + bet_level_index = 4, + }, + [12] = { + index = 12, + bet_change_list = 90, + bet_size_index = 3, + bet_level_index = 9, + }, +} + +_.CashManiaBetBetLevel = { + [0] = { + index = 0, + bet_level = 1, + }, + [1] = { + index = 1, + bet_level = 2, + }, + [2] = { + index = 2, + bet_level = 3, + }, + [3] = { + index = 3, + bet_level = 4, + }, + [4] = { + index = 4, + bet_level = 5, + }, + [5] = { + index = 5, + bet_level = 6, + }, + [6] = { + index = 6, + bet_level = 7, + }, + [7] = { + index = 7, + bet_level = 8, + }, + [8] = { + index = 8, + bet_level = 9, + }, + [9] = { + index = 9, + bet_level = 10, + }, +} + +_.CashManiaBetBetLine = { + [0] = { + index = 0, + bet_line = 10, + }, +} + +_.CashManiaBetBetSize = { + [0] = { + index = 0, + bet_size = 300, + }, + [1] = { + index = 1, + bet_size = 1000, + }, + [2] = { + index = 2, + bet_size = 3000, + }, + [3] = { + index = 3, + bet_size = 9000, + }, +} + +_.CashManiaFormation = { + { + spin_type = 1, + node_type = "BaseSpin", + id = 1, + seq_id = 1, + reel = "BaseSpin", + matrix = "Line1Form5X5TypeA", + symbol = "Default", + first_init_method = 2, + other_init_method = 4, + first_init_symbols = {}, + other_init_symbols = {}, + }, + { + spin_type = 2, + node_type = "FreeSpin", + id = 1, + seq_id = 1, + reel = "BaseSpin", + matrix = "Line1Form5X5TypeA", + symbol = "Default", + first_init_method = 3, + other_init_method = 3, + first_init_symbols = {}, + other_init_symbols = {}, + }, +} + +_.CashManiaReelBaseSpinRange = { + {5, 5, 5}, +} + +_.CashManiaReelBaseSpinReel = { + {1, 200, 2, 200, 3, 200, 4, 200, 5, 200}, + {6, 200, 7, 200, 8, 200, 9, 200, 10, 200, 11, 200, 12, 200, 13, 200, 14, 200, 15, 200, 16, 200, 17, 200, 18, 200, 19, 200}, + {1, 200, 2, 200, 3, 200, 4, 200, 5, 200}, +} + +_.CashManiaSymbol = { + [1] = { + id = 1, + name = "100倍", + is_wild = false, + group = {1}, + pay_rate = {0, 0, 100}, + client_order = 1, + client_dsc = "", + }, + [2] = { + id = 2, + name = "5倍", + is_wild = false, + group = {2}, + pay_rate = {0, 0, 50}, + client_order = 2, + client_dsc = "", + }, + [3] = { + id = 3, + name = "1倍", + is_wild = false, + group = {3}, + pay_rate = {0, 0, 10}, + client_order = 3, + client_dsc = "", + }, + [4] = { + id = 4, + name = "0.5倍", + is_wild = false, + group = {4}, + pay_rate = {0, 0, 5}, + client_order = 4, + client_dsc = "", + }, + [5] = { + id = 5, + name = "0.1倍", + is_wild = false, + group = {5}, + pay_rate = {0, 0, 1}, + client_order = 5, + client_dsc = "", + }, + [6] = { + id = 6, + name = "5FreeSpin", + is_wild = true, + group = {6}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [7] = { + id = 7, + name = "10FreeSpin", + is_wild = true, + group = {7}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [8] = { + id = 8, + name = "20FreeSpin", + is_wild = true, + group = {8}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [9] = { + id = 9, + name = "wildx1", + is_wild = true, + group = {9}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [10] = { + id = 10, + name = "wildx2", + is_wild = true, + group = {10}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [11] = { + id = 11, + name = "wildx3", + is_wild = true, + group = {11}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [12] = { + id = 12, + name = "wildx5", + is_wild = true, + group = {12}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [13] = { + id = 13, + name = "wildx10", + is_wild = true, + group = {13}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [14] = { + id = 14, + name = "wildx15", + is_wild = true, + group = {14}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [15] = { + id = 15, + name = "wildx20", + is_wild = true, + group = {15}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [16] = { + id = 16, + name = "wildx30", + is_wild = true, + group = {16}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [17] = { + id = 17, + name = "wildx40", + is_wild = true, + group = {17}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [18] = { + id = 18, + name = "wildx50", + is_wild = true, + group = {18}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [19] = { + id = 19, + name = "wildx100", + is_wild = true, + group = {19}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [200] = { + id = 200, + name = "empty", + is_wild = false, + group = {200}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, +} + +_.CashManiaSymbolBetRatio = { + { + bet_ratio = 0.1, + }, +} + +return _ \ No newline at end of file diff --git a/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneDragon.lua b/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneDragon.lua new file mode 100644 index 0000000..c4cbd5d --- /dev/null +++ b/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneDragon.lua @@ -0,0 +1,334 @@ +-- +local _ = {} + +_.FortuneDragonBetBetChangeList = { + [0] = { + index = 0, + bet_change_list = 0.15, + bet_size_index = 0, + bet_level_index = 0, + }, + [1] = { + index = 1, + bet_change_list = 0.3, + bet_size_index = 0, + bet_level_index = 1, + }, + [2] = { + index = 2, + bet_change_list = 0.45, + bet_size_index = 0, + bet_level_index = 2, + }, + [3] = { + index = 3, + bet_change_list = 0.5, + bet_size_index = 1, + bet_level_index = 0, + }, + [4] = { + index = 4, + bet_change_list = 0.75, + bet_size_index = 0, + bet_level_index = 4, + }, + [5] = { + index = 5, + bet_change_list = 1.5, + bet_size_index = 0, + bet_level_index = 9, + }, + [6] = { + index = 6, + bet_change_list = 2.5, + bet_size_index = 1, + bet_level_index = 4, + }, + [7] = { + index = 7, + bet_change_list = 4.5, + bet_size_index = 3, + bet_level_index = 0, + }, + [8] = { + index = 8, + bet_change_list = 5, + bet_size_index = 1, + bet_level_index = 9, + }, + [9] = { + index = 9, + bet_change_list = 7.5, + bet_size_index = 2, + bet_level_index = 4, + }, + [10] = { + index = 10, + bet_change_list = 15, + bet_size_index = 2, + bet_level_index = 9, + }, + [11] = { + index = 11, + bet_change_list = 22.5, + bet_size_index = 3, + bet_level_index = 4, + }, + [12] = { + index = 12, + bet_change_list = 45, + bet_size_index = 3, + bet_level_index = 9, + }, +} + +_.FortuneDragonBetBetLevel = { + [0] = { + index = 0, + bet_level = 1, + }, + [1] = { + index = 1, + bet_level = 2, + }, + [2] = { + index = 2, + bet_level = 3, + }, + [3] = { + index = 3, + bet_level = 4, + }, + [4] = { + index = 4, + bet_level = 5, + }, + [5] = { + index = 5, + bet_level = 6, + }, + [6] = { + index = 6, + bet_level = 7, + }, + [7] = { + index = 7, + bet_level = 8, + }, + [8] = { + index = 8, + bet_level = 9, + }, + [9] = { + index = 9, + bet_level = 10, + }, +} + +_.FortuneDragonBetBetLine = { + [0] = { + index = 0, + bet_line = 5, + }, +} + +_.FortuneDragonBetBetSize = { + [0] = { + index = 0, + bet_size = 300, + }, + [1] = { + index = 1, + bet_size = 1000, + }, + [2] = { + index = 2, + bet_size = 3000, + }, + [3] = { + index = 3, + bet_size = 9000, + }, +} + +_.FortuneDragonFormation = { + { + spin_type = 1, + node_type = "BaseSpin", + id = 1, + seq_id = 1, + reel = "BaseSpin", + matrix = "Line5Form3X3TypeB", + symbol = "Default", + first_init_method = 2, + other_init_method = 4, + first_init_symbols = {}, + other_init_symbols = {}, + }, + { + spin_type = 3, + node_type = "FreeSpin", + id = 1, + seq_id = 1, + reel = "FreeSpin", + matrix = "Line5Form3X3TypeB", + symbol = "Default", + first_init_method = 2, + other_init_method = 2, + first_init_symbols = {}, + other_init_symbols = {}, + }, + { + spin_type = 1, + node_type = "SureWinBaseSpin", + id = 1, + seq_id = 1, + reel = "SureWinBaseSpin", + matrix = "Line5Form3X3TypeB", + symbol = "Default", + first_init_method = 2, + other_init_method = 4, + first_init_symbols = {}, + other_init_symbols = {}, + }, +} + +_.FortuneDragonReelBaseSpinRange = { + {3, 3, 3}, +} + +_.FortuneDragonReelBaseSpinReel = { + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 7, 6, 6, 6, 4, 3, 4, 1, 3, 7, 7, 6, 5, 7, 5, 4, 6, 4, 4, 3, 4, 7, 7, 7, 4, 7, 4, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 7, 7, 7, 2, 5, 7, 4, 3, 6, 5, 7, 6, 3, 1, 6, 2, 3, 5, 6, 3, 2, 2, 5, 7, 6, 6, 4, 1, 7, 7, 3, 6, 4, 7, 6, 1, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 4, 4, 4, 5, 3, 5, 6, 7, 2, 5, 6, 5, 7, 7, 7, 6, 2, 5, 7, 6, 6, 7, 7, 6, 3, 5, 1, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 5, 1, 3, 7, 7, 7, 4, 5, 4, 4, 4, 6, 4, 4, 7, 4, 2, 6, 3, 5, 7, 5, 5, 5, 6, 1, 2, 4, 6, 5, 3, 3, 3, 2, 7, 4, 7, 6, 7, 7, 7, 6, 7, 4, 6, 1, 1, 1, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 7, 3, 3, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 7, 5, 5, 7, 4, 5, 6, 7, 6, 4, 4, 1, 6, 6, 5, 7, 6, 4, 5, 4, 6, 7, 4, 7, 3, 6, 5, 7, 7, 6, 2, 7, 3, 2, 2, 6, 5, 2, 6, 6, 6, 4, 6, 4, 6, 6, 6, 3, 4, 7, 1, 5, 6, 7, 2, 6, 7, 6, 6, 3, 6, 7, 6, 3, 5, 4, 7, 5, 7, 2, 6, 3, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 5, 7, 5, 6, 2, 2, 5, 4, 6, 5, 4, 4, 4, 3, 5, 2, 6, 4, 5, 7, 4, 5, 5, 5, 7, 6, 6, 6, 4, 7, 6, 1, 3, 7, 4, 5, 6, 6, 5, 4, 2, 2, 4, 7, 3, 6, 7, 6, 1, 7, 7, 3, 7, 6, 7, 7, 2, 2, 2, 7, 7, 6, 6, 3, 6, 4, 5, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 4, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 6, 6, 6, 7, 3, 6, 7, 2, 3, 7, 6, 5, 4, 6, 6, 4, 7, 3, 3, 3, 4, 7, 7, 6, 2, 5, 5, 7, 7, 6, 6, 2, 5, 5, 4, 7, 7, 5, 3, 4, 2, 6, 5, 6, 4, 7, 5, 5, 5, 7, 7, 6, 7, 6, 3, 1, 1, 1, 5, 3, 7, 4, 7, 7, 7, 6, 4, 7, 6, 4, 1, 7, 5, 3, 5, 5, 5, 4, 7, 5, 6, 7, 4, 6, 7, 4, 6, 3, 2, 5, 6, 3, 5, 1, 3, 7, 6, 5, 4, 5, 4, 7, 7, 7, 6, 2, 7, 3, 7, 5, 5, 7, 3, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 6, 6, 7, 7, 1, 6, 5, 7, 3, 5, 2, 7, 7, 3, 6, 7, 7, 5, 5, 7, 7, 7, 2, 6, 7, 3, 5, 7, 1, 5, 7, 6, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 1, 6, 6, 5, 7, 6, 1, 7, 6, 7, 7, 6, 3, 3, 2, 4, 4, 7, 2}, + {7, 5, 5, 5, 7, 7, 7, 6, 4, 4, 4, 3, 3, 3, 6, 1, 7, 6, 3, 5, 5, 6, 7, 5, 4, 4, 4, 7, 5, 4, 1, 7, 7, 7, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 1, 1, 1, 7, 5, 2, 5, 6, 4, 7, 6, 3, 7, 6, 7, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 4, 6, 6, 1, 7, 7, 4, 5, 5, 5, 7, 2, 3, 4, 7, 6, 4, 4, 4, 6, 4, 7, 2, 2, 2, 6, 6, 6, 2, 7, 5, 6, 6, 6, 5, 3, 5, 2, 7, 6, 4, 3, 6, 7, 6, 7, 4, 3, 2, 4, 7, 5, 6, 3, 1, 4, 5, 7, 7, 7, 3, 6, 1, 5, 3, 7, 4, 3, 7, 5, 6, 6, 6, 7, 1, 5, 6, 7, 4, 6, 5, 6, 5, 1, 2, 4, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 7, 7, 5, 6, 6, 6, 5, 2, 7, 4, 4, 4, 7, 6, 6, 6, 7, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 6, 7, 6, 5, 5, 5, 2, 2, 5, 7, 7, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 6, 6, 5, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 2, 4, 1, 5, 4, 3, 7, 3, 7, 5, 6, 5, 7, 7, 7, 7, 6, 6, 3, 4, 6, 2, 3, 1, 7, 2, 1, 5, 7, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 5, 4, 2}, +} + +_.FortuneDragonReelFreeSpinRange = { + {3, 3, 3}, +} + +_.FortuneDragonReelFreeSpinReel = { + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 7, 6, 3, 6, 4, 3, 4, 1, 3, 7, 7, 6, 5, 7, 5, 4, 6, 4, 4, 3, 4, 7, 7, 2, 4, 7, 4, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 7, 1, 7, 2, 5, 7, 4, 3, 6, 5, 7, 6, 3, 1, 6, 2, 3, 5, 6, 3, 2, 2, 5, 7, 6, 6, 4, 1, 7, 7, 3, 6, 4, 7, 6, 1, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 4, 4, 3, 5, 3, 5, 6, 7, 2, 5, 6, 5, 3, 7, 7, 6, 2, 5, 7, 6, 6, 7, 7, 6, 3, 5, 1, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 5, 1, 3, 7, 7, 7, 4, 5, 4, 4, 4, 6, 4, 4, 7, 4, 2, 6, 3, 5, 7, 5, 5, 5, 6, 1, 2, 4, 6, 5, 3, 3, 3, 2, 7, 4, 7, 6, 7, 7, 7, 6, 7, 4, 6, 1, 1, 1, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 7, 1, 3, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 7, 5, 5, 7, 4, 5, 6, 7, 6, 4, 4, 1, 6, 6, 5, 7, 6, 4, 5, 4, 6, 7, 4, 7, 3, 6, 5, 7, 7, 6, 2, 7, 3, 2, 2, 6, 5, 2, 6, 6, 2, 4, 6, 4, 6, 6, 6, 3, 4, 7, 1, 5, 6, 7, 2, 6, 7, 6, 6, 3, 6, 7, 6, 3, 5, 4, 7, 5, 7, 2, 6, 3, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 5, 7, 5, 6, 2, 2, 5, 4, 6, 5, 4, 1, 4, 3, 5, 2, 6, 4, 5, 7, 4, 5, 5, 5, 7, 2, 6, 6, 4, 7, 6, 1, 3, 7, 4, 5, 6, 6, 5, 4, 2, 2, 4, 7, 3, 6, 7, 6, 3, 7, 7, 3, 7, 6, 7, 7, 2, 2, 2, 7, 7, 6, 6, 3, 6, 4, 5, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 3, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 6, 3, 6, 7, 3, 6, 7, 2, 3, 7, 6, 5, 4, 6, 3, 4, 7, 3, 6, 3, 4, 7, 7, 6, 2, 5, 5, 7, 7, 6, 6, 2, 5, 5, 4, 7, 7, 5, 3, 4, 2, 6, 5, 6, 4, 7, 5, 1, 5, 7, 7, 6, 7, 6, 3, 1, 1, 1, 5, 3, 7, 4, 7, 7, 7, 6, 4, 7, 6, 4, 1, 7, 5, 3, 5, 5, 2, 4, 7, 5, 6, 7, 4, 6, 7, 4, 6, 3, 2, 5, 6, 3, 5, 1, 3, 7, 6, 5, 4, 5, 4, 1, 7, 7, 6, 2, 7, 3, 7, 5, 5, 7, 3, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 6, 6, 7, 7, 1, 6, 5, 7, 3, 5, 2, 7, 7, 3, 6, 7, 7, 5, 5, 7, 7, 7, 2, 6, 7, 3, 5, 7, 1, 5, 7, 6, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 1, 6, 6, 5, 7, 6, 1, 7, 6, 7, 7, 6, 3, 3, 2, 4, 4, 7, 2}, + {7, 5, 5, 4, 7, 3, 7, 6, 4, 2, 4, 3, 3, 3, 6, 1, 7, 6, 3, 5, 5, 6, 7, 5, 4, 4, 4, 7, 5, 4, 1, 7, 7, 2, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 1, 1, 1, 7, 5, 2, 5, 6, 4, 7, 6, 3, 7, 6, 7, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 4, 6, 6, 1, 7, 7, 4, 3, 5, 5, 7, 2, 3, 4, 7, 6, 3, 4, 4, 6, 4, 7, 2, 2, 2, 6, 6, 6, 2, 7, 5, 6, 6, 3, 5, 3, 5, 2, 7, 6, 4, 3, 6, 7, 6, 7, 4, 3, 2, 4, 7, 5, 6, 3, 1, 4, 5, 7, 7, 7, 3, 6, 1, 5, 3, 7, 4, 3, 7, 5, 6, 6, 6, 7, 1, 5, 6, 7, 4, 6, 5, 6, 5, 1, 2, 4, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 7, 7, 5, 6, 1, 6, 5, 2, 7, 4, 4, 4, 7, 6, 6, 1, 7, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 6, 7, 6, 5, 5, 5, 2, 2, 5, 7, 7, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 6, 6, 5, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 2, 4, 1, 5, 4, 3, 7, 3, 7, 5, 6, 5, 7, 2, 7, 7, 6, 6, 3, 4, 6, 2, 3, 1, 7, 2, 1, 5, 7, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 5, 4, 2}, +} + +_.FortuneDragonReelSureWinBaseSpinRange = { + {3, 3, 3}, +} + +_.FortuneDragonReelSureWinBaseSpinReel = { + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 7, 6, 6, 6, 4, 3, 4, 1, 3, 7, 7, 6, 5, 7, 5, 4, 6, 4, 4, 3, 4, 2, 7, 7, 4, 7, 4, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 1, 7, 7, 2, 5, 7, 4, 3, 6, 5, 7, 6, 3, 1, 6, 2, 3, 5, 6, 3, 2, 2, 5, 7, 6, 6, 4, 3, 7, 7, 3, 6, 4, 7, 6, 1, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 4, 4, 4, 5, 3, 5, 6, 7, 2, 5, 6, 5, 7, 7, 7, 6, 2, 5, 7, 6, 6, 7, 7, 6, 3, 5, 1, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 5, 1, 3, 7, 7, 7, 4, 5, 4, 2, 4, 6, 4, 4, 7, 4, 2, 6, 3, 5, 7, 5, 5, 5, 6, 1, 2, 4, 6, 5, 3, 3, 3, 2, 7, 4, 7, 6, 2, 7, 7, 6, 7, 4, 6, 1, 1, 1, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 2, 3, 3, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 3, 4, 5, 7, 7, 2, 5, 7, 4, 5, 6, 7, 6, 4, 4, 2, 6, 6, 5, 7, 6, 4, 5, 4, 6, 1, 4, 7, 3, 6, 5, 7, 7, 6, 2, 7, 3, 3, 2, 6, 5, 2, 6, 6, 3, 4, 6, 4, 2, 6, 6, 3, 4, 7, 1, 5, 6, 7, 2, 6, 7, 6, 6, 3, 6, 7, 6, 3, 5, 4, 7, 5, 7, 2, 6, 3, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 5, 7, 5, 6, 2, 2, 5, 4, 6, 5, 4, 4, 4, 3, 5, 2, 6, 4, 5, 7, 4, 5, 5, 5, 7, 5, 3, 6, 4, 7, 6, 1, 3, 7, 4, 5, 6, 6, 5, 4, 2, 2, 4, 7, 3, 6, 7, 6, 1, 7, 2, 3, 7, 6, 7, 7, 2, 2, 2, 7, 7, 6, 6, 3, 6, 4, 5, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 4, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 6, 6, 6, 7, 3, 6, 7, 2, 3, 7, 6, 5, 4, 6, 6, 4, 7, 3, 3, 3, 4, 7, 7, 6, 2, 5, 5, 7, 2, 6, 6, 2, 5, 5, 4, 7, 7, 5, 3, 4, 2, 6, 5, 6, 4, 7, 5, 5, 2, 7, 7, 6, 7, 6, 3, 1, 1, 1, 5, 3, 7, 4, 7, 7, 7, 6, 4, 7, 6, 4, 1, 7, 5, 3, 5, 5, 2, 4, 7, 5, 6, 7, 4, 6, 7, 4, 6, 3, 2, 5, 6, 3, 5, 1, 3, 7, 6, 5, 4, 5, 4, 2, 7, 7, 6, 2, 7, 3, 7, 5, 2, 7, 3, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 3, 6, 7, 7, 3, 6, 5, 7, 3, 5, 2, 7, 7, 3, 6, 7, 7, 5, 5, 1, 3, 7, 2, 6, 7, 3, 5, 7, 1, 5, 7, 6, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 1, 6, 6, 5, 7, 6, 1, 7, 6, 2, 7, 6, 3, 3, 2, 4, 4, 7, 2}, + {7, 5, 5, 5, 7, 7, 7, 6, 4, 4, 1, 3, 3, 3, 6, 1, 7, 6, 3, 5, 4, 6, 7, 5, 4, 4, 4, 7, 5, 4, 1, 7, 7, 2, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 1, 1, 1, 7, 5, 2, 5, 6, 4, 7, 6, 3, 7, 6, 2, 7, 3, 4, 5, 5, 5, 6, 3, 1, 7, 7, 2, 6, 5, 4, 6, 6, 3, 7, 7, 4, 5, 5, 5, 7, 2, 3, 4, 7, 6, 4, 4, 4, 6, 4, 7, 2, 2, 2, 6, 4, 3, 2, 7, 5, 6, 6, 6, 5, 3, 5, 2, 7, 6, 4, 3, 6, 7, 6, 7, 4, 3, 2, 4, 7, 5, 6, 3, 1, 4, 5, 7, 7, 7, 3, 6, 1, 5, 3, 7, 4, 3, 7, 5, 2, 6, 6, 7, 1, 5, 6, 7, 4, 6, 5, 6, 5, 1, 2, 4, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 3, 7, 5, 2, 6, 6, 5, 2, 7, 4, 4, 4, 7, 2, 6, 6, 3, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 2, 7, 6, 5, 5, 5, 2, 2, 5, 7, 2, 7, 3, 4, 5, 3, 7, 7, 2, 5, 5, 5, 1, 6, 5, 6, 2, 6, 3, 6, 5, 3, 7, 6, 3, 2, 4, 1, 5, 4, 3, 7, 3, 7, 5, 6, 5, 3, 7, 7, 7, 6, 6, 3, 4, 6, 2, 3, 1, 7, 2, 3, 5, 7, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 5, 4, 2}, +} + +_.FortuneDragonSymbol = { + [1] = { + id = 1, + name = "Wild", + is_wild = true, + group = {1}, + pay_rate = {0, 0, 100}, + client_order = 0, + client_dsc = "", + }, + [2] = { + id = 2, + name = "元宝", + is_wild = false, + group = {2}, + pay_rate = {0, 0, 50}, + client_order = 0, + client_dsc = "", + }, + [3] = { + id = 3, + name = "红包", + is_wild = false, + group = {3}, + pay_rate = {0, 0, 25}, + client_order = 0, + client_dsc = "", + }, + [4] = { + id = 4, + name = "灯笼", + is_wild = false, + group = {4}, + pay_rate = {0, 0, 10}, + client_order = 0, + client_dsc = "", + }, + [5] = { + id = 5, + name = "福炮", + is_wild = false, + group = {5}, + pay_rate = {0, 0, 5}, + client_order = 0, + client_dsc = "", + }, + [6] = { + id = 6, + name = "花结", + is_wild = false, + group = {6}, + pay_rate = {0, 0, 3}, + client_order = 0, + client_dsc = "", + }, + [7] = { + id = 7, + name = "铜钱", + is_wild = false, + group = {7}, + pay_rate = {0, 0, 2}, + client_order = 0, + client_dsc = "", + }, + [8] = { + id = 8, + name = "X2", + is_wild = false, + group = {8}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [9] = { + id = 9, + name = "X5", + is_wild = false, + group = {8}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [10] = { + id = 10, + name = "X10", + is_wild = false, + group = {8}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [200] = { + id = 200, + name = "Empty", + is_wild = false, + group = {8}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, +} + +_.FortuneDragonSymbolBetRatio = { + { + bet_ratio = 1, + }, +} + +return _ \ No newline at end of file diff --git a/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneMouse.lua b/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneMouse.lua new file mode 100644 index 0000000..c808d80 --- /dev/null +++ b/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneMouse.lua @@ -0,0 +1,284 @@ +-- +local _ = {} + +_.FortuneMouseBetBetChangeList = { + [0] = { + index = 0, + bet_change_list = 0.15, + bet_size_index = 0, + bet_level_index = 0, + }, + [1] = { + index = 1, + bet_change_list = 0.3, + bet_size_index = 0, + bet_level_index = 1, + }, + [2] = { + index = 2, + bet_change_list = 0.45, + bet_size_index = 0, + bet_level_index = 2, + }, + [3] = { + index = 3, + bet_change_list = 0.5, + bet_size_index = 1, + bet_level_index = 0, + }, + [4] = { + index = 4, + bet_change_list = 0.75, + bet_size_index = 0, + bet_level_index = 4, + }, + [5] = { + index = 5, + bet_change_list = 1.5, + bet_size_index = 0, + bet_level_index = 9, + }, + [6] = { + index = 6, + bet_change_list = 2.5, + bet_size_index = 1, + bet_level_index = 4, + }, + [7] = { + index = 7, + bet_change_list = 4.5, + bet_size_index = 3, + bet_level_index = 0, + }, + [8] = { + index = 8, + bet_change_list = 5, + bet_size_index = 1, + bet_level_index = 9, + }, + [9] = { + index = 9, + bet_change_list = 7.5, + bet_size_index = 2, + bet_level_index = 4, + }, + [10] = { + index = 10, + bet_change_list = 15, + bet_size_index = 2, + bet_level_index = 9, + }, + [11] = { + index = 11, + bet_change_list = 22.5, + bet_size_index = 3, + bet_level_index = 4, + }, + [12] = { + index = 12, + bet_change_list = 45, + bet_size_index = 3, + bet_level_index = 9, + }, +} + +_.FortuneMouseBetBetLevel = { + [0] = { + index = 0, + bet_level = 1, + }, + [1] = { + index = 1, + bet_level = 2, + }, + [2] = { + index = 2, + bet_level = 3, + }, + [3] = { + index = 3, + bet_level = 4, + }, + [4] = { + index = 4, + bet_level = 5, + }, + [5] = { + index = 5, + bet_level = 6, + }, + [6] = { + index = 6, + bet_level = 7, + }, + [7] = { + index = 7, + bet_level = 8, + }, + [8] = { + index = 8, + bet_level = 9, + }, + [9] = { + index = 9, + bet_level = 10, + }, +} + +_.FortuneMouseBetBetLine = { + [0] = { + index = 0, + bet_line = 5, + }, +} + +_.FortuneMouseBetBetSize = { + [0] = { + index = 0, + bet_size = 300, + }, + [1] = { + index = 1, + bet_size = 1000, + }, + [2] = { + index = 2, + bet_size = 3000, + }, + [3] = { + index = 3, + bet_size = 9000, + }, +} + +_.FortuneMouseFormation = { + { + spin_type = 1, + node_type = "BaseSpin", + id = 1, + seq_id = 1, + reel = "BaseSpin", + matrix = "Line5Form3X3TypeB", + symbol = "Default", + first_init_method = 2, + other_init_method = 4, + first_init_symbols = {}, + other_init_symbols = {}, + }, + { + spin_type = 3, + node_type = "ReSpin", + id = 1, + seq_id = 1, + reel = "ReSpin", + matrix = "Line5Form3X3TypeB", + symbol = "Default", + first_init_method = 3, + other_init_method = 3, + first_init_symbols = {}, + other_init_symbols = {}, + }, +} + +_.FortuneMouseReelBaseSpinRange = { + {3, 3, 3}, +} + +_.FortuneMouseReelBaseSpinReel = { + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 7, 6, 6, 6, 5, 3, 4, 2, 7, 7, 7, 6, 5, 5, 5, 4, 6, 5, 5, 5, 4, 7, 7, 7, 4, 7, 6, 5, 3, 3, 3, 5, 7, 6, 5, 7, 6, 5, 7, 7, 7, 6, 5, 7, 4, 3, 6, 5, 7, 6, 3, 6, 6, 2, 3, 5, 6, 3, 2, 2, 5, 7, 6, 6, 4, 1, 7, 7, 3, 6, 4, 7, 6, 1, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 4, 4, 4, 5, 3, 5, 6, 7, 2, 5, 6, 5, 7, 7, 7, 6, 1, 5, 7, 6, 6, 7, 7, 6, 3, 5, 1, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 5, 1, 3, 7, 7, 7, 4, 5, 7, 6, 4, 5, 4, 6, 7, 4, 2, 6, 3, 5, 7, 5, 5, 5, 6, 1, 2, 4, 6, 5, 3, 3, 3, 2, 7, 4, 7, 6, 7, 7, 7, 6, 7, 4, 6, 1, 5, 6, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 7, 3, 3, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 7, 5, 5, 7, 4, 5, 6, 7, 6, 5, 4, 1, 6, 6, 5, 7, 6, 4, 5, 4, 6, 7, 7, 7, 3, 6, 5, 7, 7, 6, 2, 7, 3, 2, 2, 6, 5, 2, 6, 6, 6, 4, 4, 4, 6, 6, 6, 3, 4, 7, 1, 5, 6, 7, 2, 6, 7, 6, 6, 3, 6, 7, 6, 3, 5, 4, 7, 5, 7, 2, 6, 3, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 5, 7, 6, 6, 2, 7, 5, 4, 6, 5, 4, 4, 4, 3, 5, 2, 6, 4, 5, 7, 4, 5, 5, 5, 7, 6, 6, 6, 4, 7, 6, 6, 6, 7, 4, 6, 6, 6, 5, 4, 7, 6, 4, 7, 3, 6, 7, 6, 7, 7, 7, 3, 7, 6, 7, 7, 2, 2, 2, 7, 7, 6, 6, 3, 6, 4, 5, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 4, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 6, 6, 6, 7, 3, 6, 7, 2, 3, 7, 6, 5, 4, 6, 6, 4, 7, 3, 3, 3, 4, 7, 7, 6, 1, 5, 5, 7, 7, 6, 6, 2, 5, 5, 4, 7, 7, 5, 3, 4, 2, 6, 6, 6, 4, 7, 5, 5, 5, 7, 7, 6, 7, 6, 3, 1, 1, 1, 2, 3, 7, 4, 7, 7, 7, 6, 4, 7, 6, 4, 1, 7, 5, 3, 6, 6, 6, 4, 7, 5, 6, 7, 4, 6, 7, 4, 6, 3, 2, 5, 6, 3, 5, 1, 1, 1, 6, 5, 4, 5, 4, 7, 7, 7, 6, 2, 7, 3, 7, 5, 5, 7, 3, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 6, 6, 7, 7, 7, 6, 5, 7, 3, 6, 2, 7, 7, 3, 6, 7, 7, 5, 5, 7, 7, 7, 2, 6, 7, 3, 5, 7, 1, 6, 5, 2, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 1, 6, 6, 5, 7, 6, 1, 7, 6, 7, 7, 6, 3, 3, 2, 4, 4, 7, 2}, + {7, 5, 5, 5, 7, 7, 7, 6, 4, 4, 4, 3, 3, 3, 6, 6, 6, 7, 3, 5, 5, 6, 7, 5, 4, 4, 4, 7, 5, 4, 1, 7, 7, 7, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 1, 1, 1, 7, 5, 2, 5, 6, 4, 7, 6, 3, 7, 6, 7, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 4, 6, 6, 1, 7, 7, 4, 5, 5, 5, 7, 2, 3, 4, 7, 6, 4, 4, 4, 6, 4, 7, 2, 2, 2, 6, 6, 6, 2, 7, 5, 6, 6, 6, 5, 3, 5, 1, 7, 6, 4, 3, 6, 7, 6, 7, 4, 3, 2, 4, 7, 5, 6, 3, 7, 4, 5, 7, 7, 7, 3, 6, 7, 5, 6, 7, 4, 3, 7, 5, 6, 6, 6, 7, 1, 5, 6, 7, 4, 6, 5, 6, 5, 7, 2, 4, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 7, 7, 5, 6, 6, 6, 5, 2, 7, 4, 4, 4, 7, 6, 6, 6, 7, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 6, 7, 6, 5, 5, 5, 2, 2, 5, 7, 7, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 6, 6, 5, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 2, 4, 1, 5, 4, 3, 7, 3, 7, 5, 6, 5, 4, 7, 7, 7, 6, 6, 3, 4, 6, 2, 3, 1, 7, 2, 1, 5, 7, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 5, 4, 2}, +} + +_.FortuneMouseReelReSpinRange = { + {3, 3, 3}, +} + +_.FortuneMouseReelReSpinReel = { + {1, 1, 1, 2, 2, 2, 2, 7, 7, 7, 7, 8, 8, 8, 6, 6, 6, 6, 3, 3, 3, 3, 8, 8, 8, 5, 5, 5, 5, 4, 4, 4, 4, 8, 8, 8}, + {1, 1, 1}, + {1, 1, 1, 2, 2, 2, 2, 7, 7, 7, 7, 8, 8, 8, 6, 6, 6, 6, 3, 3, 3, 3, 8, 8, 8, 5, 5, 5, 5, 4, 4, 4, 4, 8, 8, 8}, +} + +_.FortuneMouseSymbol = { + [1] = { + id = 1, + name = "wild", + is_wild = true, + group = {1}, + pay_rate = {0, 0, 300}, + client_order = 1, + client_dsc = "", + }, + [2] = { + id = 2, + name = "倒福", + is_wild = false, + group = {2}, + pay_rate = {0, 0, 100}, + client_order = 2, + client_dsc = "", + }, + [3] = { + id = 3, + name = "红包", + is_wild = false, + group = {3}, + pay_rate = {0, 0, 50}, + client_order = 3, + client_dsc = "", + }, + [4] = { + id = 4, + name = "钱袋", + is_wild = false, + group = {4}, + pay_rate = {0, 0, 30}, + client_order = 4, + client_dsc = "", + }, + [5] = { + id = 5, + name = "爆竹", + is_wild = false, + group = {5}, + pay_rate = {0, 0, 15}, + client_order = 5, + client_dsc = "", + }, + [6] = { + id = 6, + name = "橘子", + is_wild = false, + group = {6}, + pay_rate = {0, 0, 5}, + client_order = 6, + client_dsc = "", + }, + [7] = { + id = 7, + name = "花生", + is_wild = false, + group = {7}, + pay_rate = {0, 0, 3}, + client_order = 7, + client_dsc = "", + }, + [8] = { + id = 8, + name = "SuperStack", + is_wild = false, + group = {8}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, +} + +_.FortuneMouseSymbolBetRatio = { + { + bet_ratio = 1, + }, +} + +return _ \ No newline at end of file diff --git a/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneOx.lua b/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneOx.lua new file mode 100644 index 0000000..a0f6859 --- /dev/null +++ b/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneOx.lua @@ -0,0 +1,293 @@ +-- +local _ = {} + +_.FortuneOxBetBetChangeList = { + [0] = { + index = 0, + bet_change_list = 0.3, + bet_size_index = 0, + bet_level_index = 0, + }, + [1] = { + index = 1, + bet_change_list = 0.6, + bet_size_index = 0, + bet_level_index = 1, + }, + [2] = { + index = 2, + bet_change_list = 0.9, + bet_size_index = 0, + bet_level_index = 2, + }, + [3] = { + index = 3, + bet_change_list = 1, + bet_size_index = 1, + bet_level_index = 0, + }, + [4] = { + index = 4, + bet_change_list = 1.5, + bet_size_index = 0, + bet_level_index = 4, + }, + [5] = { + index = 5, + bet_change_list = 3, + bet_size_index = 0, + bet_level_index = 9, + }, + [6] = { + index = 6, + bet_change_list = 5, + bet_size_index = 1, + bet_level_index = 4, + }, + [7] = { + index = 7, + bet_change_list = 9, + bet_size_index = 3, + bet_level_index = 0, + }, + [8] = { + index = 8, + bet_change_list = 10, + bet_size_index = 1, + bet_level_index = 9, + }, + [9] = { + index = 9, + bet_change_list = 15, + bet_size_index = 2, + bet_level_index = 4, + }, + [10] = { + index = 10, + bet_change_list = 30, + bet_size_index = 2, + bet_level_index = 9, + }, + [11] = { + index = 11, + bet_change_list = 45, + bet_size_index = 3, + bet_level_index = 4, + }, + [12] = { + index = 12, + bet_change_list = 90, + bet_size_index = 3, + bet_level_index = 9, + }, +} + +_.FortuneOxBetBetLevel = { + [0] = { + index = 0, + bet_level = 1, + }, + [1] = { + index = 1, + bet_level = 2, + }, + [2] = { + index = 2, + bet_level = 3, + }, + [3] = { + index = 3, + bet_level = 4, + }, + [4] = { + index = 4, + bet_level = 5, + }, + [5] = { + index = 5, + bet_level = 6, + }, + [6] = { + index = 6, + bet_level = 7, + }, + [7] = { + index = 7, + bet_level = 8, + }, + [8] = { + index = 8, + bet_level = 9, + }, + [9] = { + index = 9, + bet_level = 10, + }, +} + +_.FortuneOxBetBetLine = { + [0] = { + index = 0, + bet_line = 10, + }, +} + +_.FortuneOxBetBetSize = { + [0] = { + index = 0, + bet_size = 300, + }, + [1] = { + index = 1, + bet_size = 1000, + }, + [2] = { + index = 2, + bet_size = 3000, + }, + [3] = { + index = 3, + bet_size = 9000, + }, +} + +_.FortuneOxFormation = { + { + spin_type = 1, + node_type = "BaseSpin", + id = 1, + seq_id = 1, + reel = "BaseSpin", + matrix = "Line10Form343TypeA", + symbol = "Default", + first_init_method = 2, + other_init_method = 4, + first_init_symbols = {}, + other_init_symbols = {}, + }, + { + spin_type = 3, + node_type = "ReSpin", + id = 1, + seq_id = 1, + reel = "ReSpin", + matrix = "Line10Form343TypeA", + symbol = "Default", + first_init_method = 3, + other_init_method = 3, + first_init_symbols = {}, + other_init_symbols = {}, + }, +} + +_.FortuneOxReelBaseSpinRange = { + {3, 4, 3}, +} + +_.FortuneOxReelBaseSpinReel = { + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 5, 6, 7, 6, 6, 6, 2, 2, 2, 1, 1, 4, 4, 4, 5, 7, 5, 4, 6, 4, 4, 3, 4, 7, 7, 7, 4, 7, 4, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 7, 7, 7, 2, 5, 7, 4, 2, 6, 5, 7, 6, 6, 6, 2, 2, 2, 5, 6, 2, 2, 2, 5, 7, 6, 6, 4, 2, 7, 7, 7, 6, 5, 7, 6, 1, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 6, 6, 6, 5, 7, 5, 6, 7, 2, 5, 6, 5, 7, 7, 7, 6, 2, 5, 7, 6, 6, 7, 7, 6, 7, 5, 2, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 2, 2, 2, 7, 7, 7, 4, 5, 4, 4, 4, 6, 4, 4, 7, 4, 2, 6, 7, 7, 5, 5, 5, 7, 6, 1, 2, 4, 6, 5, 7, 2, 2, 2, 7, 4, 7, 5, 6, 7, 7, 7, 5, 6, 7, 4, 6, 1, 5, 5, 5, 6, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 7, 7, 7, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 6, 5, 7, 6, 5, 5, 7, 4, 5, 6, 7, 6, 4, 4, 2, 5, 5, 5, 7, 6, 4, 5, 4, 6, 7, 4, 7, 3, 6, 5, 7, 7, 6, 2, 7, 7, 2, 2, 6, 5, 2, 6, 6, 6, 4, 6, 5, 4, 6, 6, 6, 3, 4, 7, 2, 5, 6, 7, 2, 6, 6, 6, 6, 6, 7, 7, 7, 7, 5, 4, 7, 5, 7, 2, 6, 7, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 7, 7, 7, 7, 6, 2, 7, 5, 6, 4, 4, 4, 4, 3, 1, 2, 3, 4, 4, 7, 5, 5, 5, 5, 6, 6, 6, 6, 4, 7, 6, 1, 1, 7, 4, 5, 7, 6, 5, 4, 6, 7, 4, 7, 3, 5, 6, 7, 1, 5, 7, 3, 4, 6, 7, 2, 2, 2, 2, 7, 7, 6, 6, 3, 4, 6, 5, 1, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 4, 4, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 6, 6, 6, 6, 3, 6, 7, 2, 3, 7, 6, 5, 4, 7, 6, 4, 3, 3, 3, 3, 4, 7, 7, 5, 1, 6, 5, 7, 7, 6, 6, 2, 5, 5, 4, 7, 7, 5, 3, 4, 2, 6, 5, 6, 4, 7, 5, 5, 5, 7, 7, 6, 7, 6, 3, 1, 1, 1, 5, 3, 7, 7, 7, 7, 7, 6, 4, 7, 6, 4, 1, 7, 5, 3, 5, 5, 5, 5, 1, 7, 4, 6, 7, 4, 6, 7, 4, 6, 3, 7, 5, 6, 3, 5, 1, 1, 1, 6, 5, 4, 5, 7, 7, 7, 7, 1, 2, 2, 3, 3, 7, 7, 7, 7, 7, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 6, 6, 6, 7, 1, 6, 5, 7, 3, 5, 6, 7, 7, 3, 6, 7, 5, 5, 7, 7, 7, 7, 7, 6, 5, 5, 5, 5, 1, 1, 1, 1, 2, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 1, 6, 6, 6, 6, 5, 1, 7, 7, 7, 7, 6, 3, 7, 5, 4, 4, 7, 6, 7, 7, 7, 7, 7}, + {5, 5, 5, 7, 7, 7, 6, 4, 4, 4, 3, 3, 3, 6, 1, 7, 6, 5, 5, 5, 6, 7, 5, 4, 3, 6, 7, 5, 4, 3, 7, 7, 7, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 1, 1, 3, 7, 5, 3, 7, 6, 4, 7, 6, 3, 7, 6, 7, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 6, 6, 6, 7, 7, 7, 4, 5, 5, 5, 7, 2, 3, 4, 7, 6, 4, 7, 3, 6, 4, 7, 2, 2, 2, 6, 6, 6, 3, 7, 5, 6, 6, 6, 3, 7, 5, 3, 7, 6, 4, 3, 6, 7, 4, 6, 7, 3, 2, 7, 7, 7, 6, 3, 3, 3, 5, 7, 7, 7, 3, 6, 3, 1, 1, 7, 6, 3, 7, 5, 6, 6, 6, 7, 3, 5, 6, 7, 4, 6, 6, 6, 5, 3, 2, 7, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 7, 7, 5, 6, 6, 6, 5, 3, 7, 4, 4, 4, 7, 6, 6, 6, 7, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 6, 7, 6, 5, 5, 5, 2, 2, 7, 7, 7, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 6, 6, 6, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 2, 4, 3, 3, 3, 5, 7, 3, 5, 7, 6, 5, 7, 7, 7, 7, 6, 6, 3, 7, 4, 6, 2, 3, 5, 7, 2, 1, 5, 7, 6, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 7, 4, 2, 7, 7, 7, 6, 6, 6, 7, 7, 7}, +} + +_.FortuneOxReelReSpinRange = { + {3, 4, 3}, +} + +_.FortuneOxReelReSpinReel = { + {9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, 8, 8, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8}, + {9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, 8, 8, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8}, + {9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, 8, 8, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8}, +} + +_.FortuneOxSymbol = { + [1] = { + id = 1, + name = "wild", + is_wild = true, + group = {1}, + pay_rate = {0, 0, 200}, + client_order = 1, + client_dsc = "", + }, + [2] = { + id = 2, + name = "元宝", + is_wild = false, + group = {2}, + pay_rate = {0, 0, 100}, + client_order = 2, + client_dsc = "", + }, + [3] = { + id = 3, + name = "金锦盒", + is_wild = false, + group = {3}, + pay_rate = {0, 0, 50}, + client_order = 3, + client_dsc = "", + }, + [4] = { + id = 4, + name = "钱袋", + is_wild = false, + group = {4}, + pay_rate = {0, 0, 20}, + client_order = 4, + client_dsc = "", + }, + [5] = { + id = 5, + name = "红包", + is_wild = false, + group = {5}, + pay_rate = {0, 0, 10}, + client_order = 5, + client_dsc = "", + }, + [6] = { + id = 6, + name = "橘子", + is_wild = false, + group = {6}, + pay_rate = {0, 0, 5}, + client_order = 6, + client_dsc = "", + }, + [7] = { + id = 7, + name = "炮竹", + is_wild = false, + group = {7}, + pay_rate = {0, 0, 3}, + client_order = 7, + client_dsc = "", + }, + [8] = { + id = 8, + name = "SuperStack1", + is_wild = false, + group = {8}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [9] = { + id = 9, + name = "SuperStack2", + is_wild = false, + group = {9}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, +} + +_.FortuneOxSymbolBetRatio = { + { + bet_ratio = 1, + }, +} + +return _ \ No newline at end of file diff --git a/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneRabbit.lua b/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneRabbit.lua new file mode 100644 index 0000000..b11b893 --- /dev/null +++ b/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneRabbit.lua @@ -0,0 +1,346 @@ +-- +local _ = {} + +_.FortuneRabbitBetBetChangeList = { + [0] = { + index = 0, + bet_change_list = 0.3, + bet_size_index = 0, + bet_level_index = 0, + }, + [1] = { + index = 1, + bet_change_list = 0.6, + bet_size_index = 0, + bet_level_index = 1, + }, + [2] = { + index = 2, + bet_change_list = 0.9, + bet_size_index = 0, + bet_level_index = 2, + }, + [3] = { + index = 3, + bet_change_list = 1, + bet_size_index = 1, + bet_level_index = 0, + }, + [4] = { + index = 4, + bet_change_list = 1.5, + bet_size_index = 0, + bet_level_index = 4, + }, + [5] = { + index = 5, + bet_change_list = 3, + bet_size_index = 0, + bet_level_index = 9, + }, + [6] = { + index = 6, + bet_change_list = 5, + bet_size_index = 1, + bet_level_index = 4, + }, + [7] = { + index = 7, + bet_change_list = 9, + bet_size_index = 3, + bet_level_index = 0, + }, + [8] = { + index = 8, + bet_change_list = 10, + bet_size_index = 1, + bet_level_index = 9, + }, + [9] = { + index = 9, + bet_change_list = 15, + bet_size_index = 2, + bet_level_index = 4, + }, + [10] = { + index = 10, + bet_change_list = 30, + bet_size_index = 2, + bet_level_index = 9, + }, + [11] = { + index = 11, + bet_change_list = 45, + bet_size_index = 3, + bet_level_index = 4, + }, + [12] = { + index = 12, + bet_change_list = 90, + bet_size_index = 3, + bet_level_index = 9, + }, +} + +_.FortuneRabbitBetBetLevel = { + [0] = { + index = 0, + bet_level = 1, + }, + [1] = { + index = 1, + bet_level = 2, + }, + [2] = { + index = 2, + bet_level = 3, + }, + [3] = { + index = 3, + bet_level = 4, + }, + [4] = { + index = 4, + bet_level = 5, + }, + [5] = { + index = 5, + bet_level = 6, + }, + [6] = { + index = 6, + bet_level = 7, + }, + [7] = { + index = 7, + bet_level = 8, + }, + [8] = { + index = 8, + bet_level = 9, + }, + [9] = { + index = 9, + bet_level = 10, + }, +} + +_.FortuneRabbitBetBetLine = { + [0] = { + index = 0, + bet_line = 10, + }, +} + +_.FortuneRabbitBetBetSize = { + [0] = { + index = 0, + bet_size = 300, + }, + [1] = { + index = 1, + bet_size = 1000, + }, + [2] = { + index = 2, + bet_size = 3000, + }, + [3] = { + index = 3, + bet_size = 9000, + }, +} + +_.FortuneRabbitCashPrizeWeight = { + { + id = 1, + prize_value = 0.5, + weight = 144, + }, + { + id = 2, + prize_value = 1, + weight = 25, + }, + { + id = 3, + prize_value = 2, + weight = 25, + }, + { + id = 4, + prize_value = 5, + weight = 100, + }, + { + id = 5, + prize_value = 10, + weight = 50, + }, + { + id = 6, + prize_value = 20, + weight = 25, + }, + { + id = 7, + prize_value = 30, + weight = 15, + }, + { + id = 8, + prize_value = 50, + weight = 10, + }, + { + id = 9, + prize_value = 100, + weight = 5, + }, + { + id = 10, + prize_value = 500, + weight = 1, + }, +} + +_.FortuneRabbitFormation = { + { + spin_type = 1, + node_type = "BaseSpin", + id = 1, + seq_id = 1, + reel = "BaseSpin", + matrix = "Line10Form343TypeA", + symbol = "Default", + first_init_method = 2, + other_init_method = 4, + first_init_symbols = {}, + other_init_symbols = {}, + }, + { + spin_type = 3, + node_type = "FreeSpin", + id = 1, + seq_id = 1, + reel = "FreeSpin", + matrix = "Line10Form343TypeA", + symbol = "Default", + first_init_method = 3, + other_init_method = 3, + first_init_symbols = {}, + other_init_symbols = {}, + }, +} + +_.FortuneRabbitReelBaseSpinRange = { + {3, 4, 3}, +} + +_.FortuneRabbitReelBaseSpinReel = { + {3, 7, 2, 2, 2, 3, 5, 4, 7, 8, 8, 8, 6, 2, 4, 5, 6, 7, 6, 6, 6, 2, 2, 2, 1, 5, 4, 4, 4, 5, 7, 5, 4, 6, 4, 4, 3, 4, 7, 7, 7, 4, 5, 6, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 7, 7, 7, 2, 5, 7, 4, 2, 6, 5, 7, 8, 8, 8, 2, 2, 2, 5, 6, 2, 2, 2, 5, 7, 6, 6, 4, 2, 7, 7, 7, 6, 5, 7, 6, 1, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 6, 6, 6, 5, 7, 5, 6, 7, 2, 5, 6, 5, 3, 3, 3, 6, 2, 5, 7, 6, 8, 8, 8, 6, 7, 5, 2, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 2, 2, 2, 7, 8, 8, 8, 5, 4, 4, 4, 6, 4, 4, 7, 4, 2, 6, 7, 7, 5, 5, 5, 7, 6, 1, 2, 4, 6, 5, 7, 2, 2, 2, 7, 4, 7, 5, 6, 8, 8, 8, 5, 6, 7, 4, 6, 1, 5, 5, 5, 6, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 4, 4, 4, 7, 7, 7, 3, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 6, 5, 7, 6, 5, 5, 7, 4, 5, 6, 7, 6, 4, 4, 2, 5, 5, 5, 7, 6, 4, 5, 4, 6, 7, 4, 7, 3, 6, 5, 8, 8, 8, 2, 7, 7, 2, 2, 6, 5, 2, 6, 4, 7, 6, 3, 5, 4, 6, 6, 6, 3, 4, 7, 2, 5, 6, 7, 2, 4, 5, 6, 6, 6, 8, 8, 8, 7, 5, 4, 1, 5, 7, 2, 6, 7, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 6, 5, 7, 4, 6, 2, 7, 5, 6, 4, 4, 4, 4, 3, 5, 2, 3, 4, 4, 7, 5, 5, 5, 5, 8, 8, 8, 8, 4, 7, 6, 5, 1, 7, 4, 5, 7, 6, 5, 4, 8, 8, 8, 8, 3, 5, 6, 4, 1, 5, 7, 3, 4, 6, 7, 2, 2, 2, 2, 6, 7, 6, 7, 3, 4, 6, 5, 1, 7, 6, 6, 4, 5, 8, 8, 5, 7, 6, 4, 4, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 5, 5, 5, 5, 3, 6, 7, 2, 3, 7, 6, 5, 4, 7, 6, 4, 3, 3, 3, 3, 4, 7, 7, 5, 1, 6, 5, 7, 4, 6, 3, 2, 5, 5, 4, 7, 7, 5, 3, 4, 8, 8, 5, 6, 4, 7, 5, 5, 5, 5, 8, 8, 7, 6, 3, 1, 1, 1, 5, 3, 4, 6, 7, 5, 3, 6, 4, 7, 6, 4, 1, 7, 5, 8, 8, 5, 5, 5, 1, 7, 4, 6, 7, 4, 6, 7, 4, 6, 3, 7, 5, 6, 3, 5, 6, 4, 7, 5, 6, 4, 5, 7, 7, 7, 7, 1, 2, 2, 3, 3, 7, 8, 8, 8, 8, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 6, 6, 6, 7, 1, 6, 5, 7, 3, 5, 6, 7, 7, 3, 6, 7, 5, 5, 8, 8, 8, 8, 7, 6, 5, 5, 5, 5, 1, 1, 1, 1, 2, 4, 6, 3, 5, 8, 8, 8, 8, 6, 5, 3, 4, 2, 6, 6, 6, 6, 5, 1, 7, 7, 7, 7, 6, 3, 7, 5, 4, 4, 7, 6, 5, 5, 5, 5, 7}, + {5, 5, 5, 6, 7, 3, 6, 4, 4, 4, 3, 3, 3, 4, 7, 1, 6, 5, 5, 5, 6, 7, 5, 4, 3, 6, 7, 5, 4, 3, 8, 8, 8, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 1, 1, 1, 3, 7, 5, 3, 7, 6, 4, 7, 6, 3, 4, 6, 5, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 6, 6, 6, 8, 8, 8, 4, 5, 5, 5, 7, 2, 3, 4, 7, 6, 4, 7, 3, 6, 4, 7, 2, 4, 3, 6, 6, 6, 3, 7, 5, 8, 8, 8, 3, 7, 5, 3, 7, 6, 4, 3, 6, 7, 4, 6, 7, 3, 2, 7, 7, 7, 6, 3, 3, 3, 5, 8, 8, 8, 3, 6, 3, 1, 1, 7, 6, 3, 7, 5, 2, 2, 2, 7, 3, 5, 6, 7, 4, 6, 6, 6, 5, 3, 2, 7, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 7, 7, 5, 6, 6, 6, 5, 3, 7, 4, 4, 4, 7, 6, 6, 6, 8, 8, 8, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 8, 8, 8, 3, 6, 6, 7, 6, 5, 5, 5, 2, 2, 8, 8, 8, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 4, 4, 4, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 2, 4, 3, 3, 3, 5, 7, 3, 5, 7, 6, 5, 7, 7, 7, 7, 6, 6, 3, 7, 4, 6, 2, 3, 5, 7, 2, 1, 5, 7, 6, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 7, 4, 2, 7, 7, 7, 6, 6, 6, 7, 7, 7}, +} + +_.FortuneRabbitReelFreeSpinRange = { + {3, 4, 3}, +} + +_.FortuneRabbitReelFreeSpinReel = { + {200, 200, 200, 200, 8, 8, 8, 200, 200, 200, 200, 200}, + {200, 200, 200, 8, 8, 8, 8, 200, 200, 200, 200, 200}, + {200, 200, 200, 200, 8, 8, 8, 200, 200, 200, 200, 200}, +} + +_.FortuneRabbitSymbol = { + [1] = { + id = 1, + name = "wild", + is_wild = true, + group = {1}, + pay_rate = {0, 0, 200}, + client_order = 1, + client_dsc = "", + }, + [2] = { + id = 2, + name = "元宝", + is_wild = false, + group = {2}, + pay_rate = {0, 0, 100}, + client_order = 2, + client_dsc = "", + }, + [3] = { + id = 3, + name = "钱袋", + is_wild = false, + group = {3}, + pay_rate = {0, 0, 50}, + client_order = 3, + client_dsc = "", + }, + [4] = { + id = 4, + name = "红包", + is_wild = false, + group = {4}, + pay_rate = {0, 0, 10}, + client_order = 4, + client_dsc = "", + }, + [5] = { + id = 5, + name = "铜币", + is_wild = false, + group = {5}, + pay_rate = {0, 0, 5}, + client_order = 5, + client_dsc = "", + }, + [6] = { + id = 6, + name = "爆竹", + is_wild = false, + group = {6}, + pay_rate = {0, 0, 3}, + client_order = 6, + client_dsc = "", + }, + [7] = { + id = 7, + name = "胡萝卜", + is_wild = false, + group = {7}, + pay_rate = {0, 0, 2}, + client_order = 7, + client_dsc = "", + }, + [8] = { + id = 8, + name = "Cash", + is_wild = false, + group = {8}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [200] = { + id = 200, + name = "Empty", + is_wild = false, + group = {200}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, +} + +_.FortuneRabbitSymbolBetRatio = { + { + bet_ratio = 1, + }, +} + +return _ \ No newline at end of file diff --git a/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneTiger.lua b/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneTiger.lua new file mode 100644 index 0000000..704672c --- /dev/null +++ b/gamesrv/slotspkg/external/Client_Config/Config/base/FortuneTiger.lua @@ -0,0 +1,293 @@ +-- +local _ = {} + +_.FortuneTigerBetBetChangeList = { + [0] = { + index = 0, + bet_change_list = 0.15, + bet_size_index = 0, + bet_level_index = 0, + }, + [1] = { + index = 1, + bet_change_list = 0.3, + bet_size_index = 0, + bet_level_index = 1, + }, + [2] = { + index = 2, + bet_change_list = 0.45, + bet_size_index = 0, + bet_level_index = 2, + }, + [3] = { + index = 3, + bet_change_list = 0.5, + bet_size_index = 1, + bet_level_index = 0, + }, + [4] = { + index = 4, + bet_change_list = 0.75, + bet_size_index = 0, + bet_level_index = 4, + }, + [5] = { + index = 5, + bet_change_list = 1.5, + bet_size_index = 0, + bet_level_index = 9, + }, + [6] = { + index = 6, + bet_change_list = 2.5, + bet_size_index = 1, + bet_level_index = 4, + }, + [7] = { + index = 7, + bet_change_list = 4.5, + bet_size_index = 3, + bet_level_index = 0, + }, + [8] = { + index = 8, + bet_change_list = 5, + bet_size_index = 1, + bet_level_index = 9, + }, + [9] = { + index = 9, + bet_change_list = 7.5, + bet_size_index = 2, + bet_level_index = 4, + }, + [10] = { + index = 10, + bet_change_list = 15, + bet_size_index = 2, + bet_level_index = 9, + }, + [11] = { + index = 11, + bet_change_list = 22.5, + bet_size_index = 3, + bet_level_index = 4, + }, + [12] = { + index = 12, + bet_change_list = 45, + bet_size_index = 3, + bet_level_index = 9, + }, +} + +_.FortuneTigerBetBetLevel = { + [0] = { + index = 0, + bet_level = 1, + }, + [1] = { + index = 1, + bet_level = 2, + }, + [2] = { + index = 2, + bet_level = 3, + }, + [3] = { + index = 3, + bet_level = 4, + }, + [4] = { + index = 4, + bet_level = 5, + }, + [5] = { + index = 5, + bet_level = 6, + }, + [6] = { + index = 6, + bet_level = 7, + }, + [7] = { + index = 7, + bet_level = 8, + }, + [8] = { + index = 8, + bet_level = 9, + }, + [9] = { + index = 9, + bet_level = 10, + }, +} + +_.FortuneTigerBetBetLine = { + [0] = { + index = 0, + bet_line = 5, + }, +} + +_.FortuneTigerBetBetSize = { + [0] = { + index = 0, + bet_size = 300, + }, + [1] = { + index = 1, + bet_size = 1000, + }, + [2] = { + index = 2, + bet_size = 3000, + }, + [3] = { + index = 3, + bet_size = 9000, + }, +} + +_.FortuneTigerFormation = { + { + spin_type = 1, + node_type = "BaseSpin", + id = 1, + seq_id = 1, + reel = "BaseSpin", + matrix = "Line5Form3X3TypeB", + symbol = "Default", + first_init_method = 2, + other_init_method = 4, + first_init_symbols = {}, + other_init_symbols = {}, + }, + { + spin_type = 3, + node_type = "ReSpin", + id = 1, + seq_id = 1, + reel = "ReSpin", + matrix = "Line5Form3X3TypeB", + symbol = "Default", + first_init_method = 3, + other_init_method = 3, + first_init_symbols = {}, + other_init_symbols = {}, + }, +} + +_.FortuneTigerReelBaseSpinRange = { + {3, 3, 3}, +} + +_.FortuneTigerReelBaseSpinReel = { + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 7, 6, 6, 6, 4, 3, 4, 0, 3, 7, 7, 6, 5, 7, 5, 4, 6, 4, 4, 3, 4, 7, 7, 7, 4, 7, 4, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 7, 7, 7, 2, 5, 7, 4, 3, 6, 5, 7, 6, 3, 6, 6, 2, 3, 5, 6, 3, 2, 2, 5, 7, 6, 6, 4, 0, 7, 7, 3, 6, 4, 7, 6, 0, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 0, 4, 4, 4, 5, 3, 5, 6, 7, 2, 5, 6, 5, 7, 7, 7, 6, 0, 5, 7, 6, 6, 7, 7, 6, 3, 5, 0, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 5, 0, 3, 7, 7, 7, 4, 5, 4, 4, 4, 6, 4, 4, 7, 4, 2, 6, 3, 5, 7, 5, 5, 5, 6, 0, 2, 4, 6, 5, 3, 3, 3, 2, 7, 4, 7, 6, 7, 7, 7, 6, 7, 4, 6, 0, 5, 6, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 7, 3, 3, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 7, 5, 5, 7, 4, 5, 6, 7, 6, 4, 4, 0, 6, 6, 5, 7, 6, 4, 5, 4, 6, 7, 4, 7, 3, 6, 5, 7, 7, 6, 2, 7, 3, 2, 2, 6, 5, 2, 6, 6, 6, 4, 6, 4, 6, 6, 6, 3, 4, 7, 0, 5, 6, 7, 2, 6, 7, 6, 6, 3, 6, 7, 6, 3, 5, 4, 7, 5, 7, 2, 6, 3, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 5, 7, 5, 6, 2, 2, 5, 4, 6, 5, 4, 4, 4, 3, 5, 2, 6, 4, 5, 7, 4, 5, 5, 5, 7, 6, 6, 6, 4, 7, 6, 0, 0, 7, 4, 5, 6, 6, 5, 4, 2, 2, 4, 7, 3, 6, 7, 6, 0, 7, 7, 3, 7, 6, 7, 7, 2, 2, 2, 7, 7, 6, 6, 3, 6, 4, 5, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 4, 4, 4, 3, 6, 0, 3, 5, 4, 6, 7, 2, 3, 4, 6, 6, 6, 7, 3, 6, 7, 2, 3, 7, 6, 5, 4, 6, 6, 4, 7, 3, 3, 3, 4, 7, 7, 6, 0, 5, 5, 7, 7, 6, 6, 2, 5, 5, 4, 7, 7, 5, 3, 4, 2, 6, 5, 6, 4, 7, 5, 5, 5, 7, 7, 6, 7, 6, 3, 0, 0, 0, 5, 3, 7, 4, 7, 7, 7, 6, 4, 7, 6, 4, 0, 7, 5, 3, 5, 5, 5, 4, 7, 5, 6, 7, 4, 6, 7, 4, 6, 3, 2, 5, 6, 3, 5, 0, 0, 0, 6, 5, 4, 5, 4, 7, 7, 7, 6, 2, 7, 3, 7, 5, 5, 7, 3, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 0, 3, 4, 7, 6, 6, 6, 7, 7, 0, 6, 5, 7, 3, 5, 2, 7, 7, 3, 6, 7, 7, 5, 5, 7, 7, 7, 2, 6, 7, 3, 5, 7, 0, 0, 0, 6, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 0, 6, 6, 5, 7, 6, 0, 7, 6, 7, 7, 6, 3, 3, 2, 4, 4, 7, 2}, + {7, 5, 5, 5, 7, 7, 7, 6, 4, 4, 4, 3, 3, 3, 6, 0, 7, 6, 3, 5, 5, 6, 7, 5, 4, 4, 4, 7, 5, 4, 0, 7, 7, 7, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 0, 0, 0, 7, 5, 2, 5, 6, 4, 7, 6, 3, 7, 6, 7, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 4, 6, 6, 0, 7, 7, 4, 5, 5, 5, 7, 2, 3, 4, 7, 6, 4, 4, 4, 6, 4, 7, 2, 2, 2, 6, 6, 6, 2, 7, 5, 6, 6, 6, 5, 3, 5, 0, 7, 6, 4, 3, 6, 7, 6, 7, 4, 3, 2, 4, 7, 5, 6, 3, 0, 4, 5, 7, 7, 7, 3, 6, 0, 0, 0, 7, 4, 3, 7, 5, 6, 6, 6, 7, 0, 5, 6, 7, 4, 6, 5, 6, 5, 0, 2, 4, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 7, 7, 5, 6, 6, 6, 5, 2, 7, 4, 4, 4, 7, 6, 6, 6, 7, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 6, 7, 6, 5, 5, 5, 2, 2, 5, 7, 7, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 6, 6, 5, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 2, 4, 0, 5, 4, 3, 7, 3, 7, 5, 6, 5, 7, 7, 7, 7, 6, 6, 3, 4, 6, 2, 3, 0, 7, 2, 0, 5, 7, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 5, 4, 2}, +} + +_.FortuneTigerReelReSpinRange = { + {3, 3, 3}, +} + +_.FortuneTigerReelReSpinReel = { + {8, 8, 0, 200, 200, 8, 8, 8, 200, 200, 0, 200, 200, 8, 8, 200, 200, 0, 0, 200, 200, 8, 200, 200, 0, 8, 8, 200, 200, 8, 0, 0, 200, 200, 8, 200, 200, 0, 200, 200, 8, 8, 200, 200, 0, 0, 0, 200, 200, 8, 200, 200, 0, 0, 8, 200, 200, 8, 200, 200}, + {8, 8, 0, 200, 200, 8, 8, 8, 200, 200, 0, 200, 200, 8, 8, 200, 200, 0, 0, 200, 200, 8, 200, 200, 0, 8, 8, 200, 200, 8, 0, 0, 200, 200, 8, 200, 200, 0, 200, 200, 8, 8, 200, 200, 0, 0, 0, 200, 200, 8, 200, 200, 0, 0, 8, 200, 200, 8, 200, 200}, + {8, 8, 0, 200, 200, 8, 8, 8, 200, 200, 0, 200, 200, 8, 8, 200, 200, 0, 0, 200, 200, 8, 200, 200, 0, 8, 8, 200, 200, 8, 0, 0, 200, 200, 8, 200, 200, 0, 200, 200, 8, 8, 200, 200, 0, 0, 0, 200, 200, 8, 200, 200, 0, 0, 8, 200, 200, 8, 200, 200}, +} + +_.FortuneTigerSymbol = { + [1] = { + id = 1, + name = "wild", + is_wild = true, + group = {1}, + pay_rate = {0, 0, 250}, + client_order = 1, + client_dsc = "", + }, + [2] = { + id = 2, + name = "元宝", + is_wild = false, + group = {2}, + pay_rate = {0, 0, 100}, + client_order = 2, + client_dsc = "", + }, + [3] = { + id = 3, + name = "玉饰", + is_wild = false, + group = {3}, + pay_rate = {0, 0, 25}, + client_order = 3, + client_dsc = "", + }, + [4] = { + id = 4, + name = "福袋", + is_wild = false, + group = {4}, + pay_rate = {0, 0, 10}, + client_order = 4, + client_dsc = "", + }, + [5] = { + id = 5, + name = "红包", + is_wild = false, + group = {5}, + pay_rate = {0, 0, 8}, + client_order = 5, + client_dsc = "", + }, + [6] = { + id = 6, + name = "爆竹", + is_wild = false, + group = {6}, + pay_rate = {0, 0, 5}, + client_order = 6, + client_dsc = "", + }, + [7] = { + id = 7, + name = "橘子", + is_wild = false, + group = {7}, + pay_rate = {0, 0, 3}, + client_order = 7, + client_dsc = "", + }, + [8] = { + id = 8, + name = "SuperStack", + is_wild = false, + group = {8}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, + [200] = { + id = 200, + name = "Empty", + is_wild = false, + group = {200}, + pay_rate = {0, 0, 0}, + client_order = 0, + client_dsc = "", + }, +} + +_.FortuneTigerSymbolBetRatio = { + { + bet_ratio = 1, + }, +} + +return _ \ No newline at end of file diff --git a/gamesrv/slotspkg/external/Client_Config/Config/base/Matrix.lua b/gamesrv/slotspkg/external/Client_Config/Config/base/Matrix.lua new file mode 100644 index 0000000..02c7893 --- /dev/null +++ b/gamesrv/slotspkg/external/Client_Config/Config/base/Matrix.lua @@ -0,0 +1,3959 @@ +-- +local _ = {} + +_.MatrixFeaturesForm15X1TypeA = { + { + type = "FeatureForm15X1TypeA", + link_type = 2, + direction = 0, + line_count = 100, + lines = { + {0, 0, 0}, + }, + form = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, +} + +_.MatrixFeaturesForm19X1TypeA = { + { + type = "FeatureForm19X1TypeA", + link_type = 2, + direction = 0, + line_count = 100, + lines = { + {0, 0, 0}, + }, + form = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, +} + +_.MatrixFeaturesForm20X1TypeA = { + { + type = "FeatureForm20X1TypeA", + link_type = 2, + direction = 0, + line_count = 100, + lines = { + {0, 0, 0}, + }, + form = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, +} + +_.MatrixFeaturesForm25X1TypeA = { + { + type = "FeatureForm25X1TypeA", + link_type = 2, + direction = 0, + line_count = 100, + lines = { + {0, 0, 0}, + }, + form = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, +} + +_.MatrixFeaturesForm30X1TypeA = { + { + type = "FeatureForm30X1TypeA", + link_type = 2, + direction = 0, + line_count = 100, + lines = { + {0, 0, 0}, + }, + form = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, +} + +_.MatrixFeaturesForm35X1TypeA = { + { + type = "FeatureForm35X1TypeA", + link_type = 2, + direction = 0, + line_count = 100, + lines = { + {0, 0, 0}, + }, + form = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, +} + +_.MatrixFeaturesForm40X1 = { + { + type = "FeatureForm40X1", + link_type = 2, + direction = 0, + line_count = 0, + lines = { + {0, 0, 0}, + }, + form = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, +} + +_.MatrixFeaturesForm40X1TypeA = { + { + type = "FeatureForm40X1", + link_type = 2, + direction = 0, + line_count = 0, + lines = { + {0, 0, 0}, + }, + form = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, +} + +_.MatrixFeaturesForm7X1TypeA = { + { + type = "FeatureForm15X1TypeA", + link_type = 2, + direction = 0, + line_count = 50, + lines = { + {0, 0, 0}, + }, + form = {1, 1, 1, 1, 1, 1, 1}, + }, +} + +_.MatrixLine100Form12X5TypeA = { + { + type = "Line100Form12X5TypeA", + link_type = 0, + direction = 0, + line_count = 100, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {8, 8, 8, 8, 8}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {7, 8, 7, 8, 7}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {8, 7, 8, 7, 8}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {6, 7, 8, 7, 6}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {8, 7, 6, 7, 8}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {7, 8, 8, 8, 7}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {8, 7, 7, 7, 8}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {7, 7, 8, 7, 7}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {8, 8, 7, 8, 8}, + {9, 9, 9, 9, 9}, + {8, 9, 8, 9, 8}, + {9, 8, 9, 8, 9}, + {7, 8, 9, 8, 7}, + {9, 8, 7, 8, 9}, + {8, 9, 9, 9, 8}, + {9, 8, 8, 8, 9}, + {8, 8, 9, 8, 8}, + {9, 9, 8, 9, 9}, + {7, 7, 8, 9, 9}, + {10, 10, 10, 10, 10}, + {9, 10, 9, 10, 9}, + {10, 9, 10, 9, 10}, + {8, 9, 10, 9, 8}, + {10, 9, 8, 9, 10}, + {9, 10, 10, 10, 9}, + {10, 9, 9, 9, 10}, + {9, 9, 10, 9, 9}, + {10, 10, 9, 10, 10}, + {8, 8, 9, 10, 10}, + {11, 11, 11, 11, 11}, + {10, 11, 10, 11, 10}, + {11, 10, 11, 10, 11}, + {9, 10, 11, 10, 9}, + {11, 10, 9, 10, 11}, + {10, 11, 11, 11, 10}, + {11, 10, 10, 10, 11}, + {10, 10, 11, 10, 10}, + {11, 11, 10, 11, 11}, + {9, 9, 10, 11, 11}, + {12, 12, 12, 12, 12}, + {11, 12, 11, 12, 11}, + {12, 11, 12, 11, 12}, + {10, 11, 12, 11, 10}, + {12, 11, 10, 11, 12}, + {11, 12, 12, 12, 11}, + {12, 11, 11, 11, 12}, + {11, 11, 12, 11, 11}, + {12, 12, 11, 12, 12}, + {10, 10, 11, 12, 12}, + }, + form = {12, 12, 12, 12, 12}, + }, +} + +_.MatrixLine100Form6X5TypeA = { + { + type = "Line100Form6X5TypeA", + link_type = 0, + direction = 0, + line_count = 100, + lines = { + {1, 1, 1, 1, 1}, + {1, 1, 2, 1, 1}, + {1, 2, 2, 2, 1}, + {1, 2, 3, 2, 1}, + {1, 2, 1, 2, 1}, + {1, 1, 1, 2, 1}, + {1, 2, 1, 1, 1}, + {1, 1, 2, 2, 1}, + {1, 2, 2, 1, 1}, + {1, 1, 3, 1, 1}, + {1, 1, 3, 2, 1}, + {1, 2, 3, 1, 1}, + {1, 3, 3, 3, 1}, + {1, 3, 1, 3, 1}, + {1, 3, 2, 3, 1}, + {1, 3, 4, 3, 1}, + {2, 2, 2, 2, 2}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {2, 2, 2, 3, 2}, + {2, 2, 2, 1, 2}, + {2, 3, 2, 2, 2}, + {2, 1, 2, 2, 2}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {2, 3, 4, 3, 2}, + {2, 2, 4, 2, 2}, + {2, 4, 4, 4, 2}, + {2, 4, 3, 4, 2}, + {3, 3, 3, 3, 3}, + {3, 3, 4, 3, 3}, + {3, 3, 2, 3, 3}, + {3, 4, 4, 4, 3}, + {3, 2, 2, 2, 3}, + {3, 4, 3, 4, 3}, + {3, 2, 3, 2, 3}, + {3, 3, 3, 4, 3}, + {3, 3, 3, 2, 3}, + {3, 4, 3, 3, 3}, + {3, 2, 3, 3, 3}, + {3, 4, 2, 4, 3}, + {3, 2, 4, 2, 3}, + {3, 4, 5, 4, 3}, + {3, 3, 5, 3, 3}, + {3, 2, 1, 2, 3}, + {3, 3, 1, 3, 3}, + {4, 4, 4, 4, 4}, + {4, 4, 5, 4, 4}, + {4, 4, 3, 4, 4}, + {4, 5, 5, 5, 4}, + {4, 3, 3, 3, 4}, + {4, 5, 4, 5, 4}, + {4, 3, 4, 3, 4}, + {4, 4, 4, 5, 4}, + {4, 4, 4, 3, 4}, + {4, 5, 4, 4, 4}, + {4, 3, 4, 4, 4}, + {4, 5, 3, 5, 4}, + {4, 3, 5, 3, 4}, + {4, 5, 6, 5, 4}, + {4, 4, 6, 4, 4}, + {4, 3, 2, 3, 4}, + {4, 4, 2, 4, 4}, + {5, 5, 5, 5, 5}, + {5, 5, 6, 5, 5}, + {5, 5, 4, 5, 5}, + {5, 6, 6, 6, 5}, + {5, 4, 4, 4, 5}, + {5, 6, 5, 6, 5}, + {5, 4, 5, 4, 5}, + {5, 5, 5, 6, 5}, + {5, 5, 5, 4, 5}, + {5, 6, 5, 5, 5}, + {5, 4, 5, 5, 5}, + {5, 6, 4, 6, 5}, + {5, 4, 6, 4, 5}, + {5, 4, 3, 4, 5}, + {5, 5, 3, 5, 5}, + {5, 3, 3, 3, 5}, + {5, 3, 4, 3, 5}, + {6, 6, 6, 6, 6}, + {6, 6, 5, 6, 6}, + {6, 5, 5, 5, 6}, + {6, 5, 4, 5, 6}, + {6, 5, 6, 5, 6}, + {6, 6, 6, 5, 6}, + {6, 5, 6, 6, 6}, + {6, 6, 5, 5, 6}, + {6, 5, 5, 6, 6}, + {6, 6, 5, 6, 6}, + {6, 6, 4, 5, 6}, + {6, 5, 4, 6, 6}, + {6, 4, 4, 4, 6}, + {6, 4, 6, 4, 6}, + {6, 4, 5, 4, 6}, + {6, 4, 3, 4, 6}, + }, + form = {6, 6, 6, 6, 6}, + }, +} + +_.MatrixLine10Form343TypeA = { + { + type = "Line10Form343TypeA", + link_type = 0, + direction = 0, + line_count = 10, + lines = { + {1, 1, 1}, + {1, 2, 1}, + {1, 2, 2}, + {2, 2, 1}, + {2, 2, 2}, + {2, 3, 2}, + {2, 3, 3}, + {3, 3, 2}, + {3, 3, 3}, + {3, 4, 3}, + }, + form = {3, 4, 3}, + }, +} + +_.MatrixLine10Form3X5TypeA = { + { + type = "Line10Form3X5TypeA", + link_type = 0, + direction = 0, + line_count = 10, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {3, 3, 2, 1, 1}, + {1, 1, 2, 3, 3}, + {3, 2, 2, 2, 1}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine1Form3X3TypeA = { + { + type = "Line1Form3X3TypeA", + link_type = 0, + direction = 0, + line_count = 1, + lines = { + {1, 1, 1}, + }, + form = {3, 3, 3}, + }, +} + +_.MatrixLine1Form3X3TypeB = { + { + type = "Line1Form3X3TypeB", + link_type = 0, + direction = 0, + line_count = 1, + lines = { + {2, 2, 2}, + }, + form = {3, 3, 3}, + }, +} + +_.MatrixLine1Form5X5TypeA = { + { + type = "Line1Form5X5TypeA", + link_type = 0, + direction = 0, + line_count = 1, + lines = { + {3, 3, 3}, + }, + form = {5, 5, 5}, + }, +} + +_.MatrixLine20Form3X5TypeA = { + { + type = "Line20Form3X5TypeA", + link_type = 0, + direction = 0, + line_count = 20, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {2, 1, 3, 1, 2}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine25Form36666TypeA = { + { + type = "Line25Form36666TypeA", + link_type = 0, + direction = 0, + line_count = 25, + lines = { + {2, 5, 5, 5, 5}, + {1, 4, 4, 4, 4}, + {3, 6, 6, 6, 6}, + {1, 5, 6, 5, 4}, + {3, 5, 4, 5, 6}, + {2, 4, 4, 4, 5}, + {2, 6, 6, 6, 5}, + {1, 4, 5, 6, 6}, + {3, 6, 5, 4, 4}, + {2, 4, 5, 4, 5}, + {2, 6, 5, 6, 5}, + {1, 5, 5, 5, 6}, + {3, 5, 5, 5, 4}, + {2, 5, 4, 5, 6}, + {2, 5, 6, 5, 4}, + {1, 5, 4, 5, 4}, + {3, 5, 6, 5, 6}, + {1, 4, 6, 4, 4}, + {3, 6, 4, 6, 6}, + {2, 4, 6, 4, 5}, + {2, 6, 4, 6, 5}, + {1, 6, 4, 6, 4}, + {3, 4, 6, 4, 6}, + {1, 6, 6, 6, 4}, + {3, 4, 4, 4, 6}, + }, + form = {3, 6, 6, 6, 6}, + }, +} + +_.MatrixLine25Form3X5TypeA = { + { + type = "Line25Form3X5TypeA", + link_type = 0, + direction = 0, + line_count = 25, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 3, 2, 1, 1}, + {1, 1, 2, 3, 3}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {3, 3, 1, 3, 3}, + {1, 1, 3, 1, 1}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 3, 3, 1}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {3, 2, 2, 2, 3}, + {1, 2, 2, 2, 1}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine25Form3X5TypeB = { + { + type = "Line25Form3X5TypeB", + link_type = 0, + direction = 2, + line_count = 25, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 3, 2, 1, 1}, + {1, 1, 2, 3, 3}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {3, 3, 1, 3, 3}, + {1, 1, 3, 1, 1}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 3, 3, 1}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {3, 2, 2, 2, 3}, + {1, 2, 2, 2, 1}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine25Form3X5TypeC = { + { + type = "Line25Form3X5TypeC", + link_type = 0, + direction = 0, + line_count = 25, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine25Form3X5TypeD = { + { + type = "Line25Form3X5TypeD", + link_type = 0, + direction = 0, + line_count = 25, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine25Form3X5TypeE = { + { + type = "Line25Form3X5TypeE", + link_type = 0, + direction = 0, + line_count = 25, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {2, 2, 1, 2, 3}, + {2, 2, 3, 2, 1}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine30Form3X5TypeA = { + { + type = "Line30Form3X5TypeA", + link_type = 0, + direction = 0, + line_count = 30, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 3, 2, 1, 3}, + {3, 1, 2, 3, 1}, + {2, 1, 3, 2, 3}, + {1, 3, 2, 3, 1}, + {3, 2, 1, 1, 2}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine30Form3X5TypeB = { + { + type = "Line30Form3X5TypeB", + link_type = 0, + direction = 0, + line_count = 30, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 2, 1}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 2, 3, 1}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine30Form3X5TypeC = { + { + type = "Line30Form3X5TypeC", + link_type = 0, + direction = 0, + line_count = 30, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 3, 2, 1, 1}, + {1, 1, 2, 3, 3}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {3, 2, 2, 2, 3}, + {1, 2, 2, 2, 1}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {3, 3, 1, 3, 3}, + {1, 1, 3, 1, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 3, 3, 1}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {3, 1, 3, 1, 3}, + {1, 3, 1, 3, 1}, + {1, 3, 2, 1, 3}, + {3, 1, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {1, 2, 3, 3, 2}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine30Form3X5TypeD = { + { + type = "Line30Form3X5TypeD", + link_type = 0, + direction = 0, + line_count = 30, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {3, 1, 2, 3, 1}, + {1, 3, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {3, 2, 1, 1, 2}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine30Form3X5TypeE = { + { + type = "Line30Form3X5TypeE", + link_type = 0, + direction = 0, + line_count = 30, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 2, 1, 1}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {3, 2, 2, 2, 3}, + {1, 2, 2, 2, 1}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {3, 1, 3, 1, 3}, + {1, 3, 1, 3, 1}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {3, 3, 1, 3, 3}, + {1, 1, 3, 1, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 3, 3, 2, 3}, + {1, 1, 1, 2, 1}, + {2, 2, 2, 1, 2}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine30Form3X6TypeA = { + { + type = "Line30Form3X6TypeA", + link_type = 0, + direction = 0, + line_count = 30, + lines = { + {1, 1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3, 3}, + {3, 2, 1, 2, 3, 2}, + {1, 2, 3, 2, 1, 2}, + {1, 1, 2, 2, 1, 1}, + {3, 3, 2, 2, 3, 3}, + {1, 2, 2, 2, 2, 1}, + {3, 2, 2, 2, 2, 3}, + {1, 2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2, 3}, + {3, 2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2, 1}, + {2, 2, 1, 1, 2, 2}, + {2, 2, 3, 3, 2, 2}, + {1, 3, 1, 3, 1, 3}, + {3, 1, 3, 1, 3, 1}, + {1, 2, 3, 2, 3, 2}, + {3, 2, 1, 2, 1, 2}, + {1, 2, 1, 2, 3, 2}, + {1, 2, 3, 2, 3, 2}, + {1, 3, 1, 1, 3, 1}, + {3, 1, 3, 3, 1, 3}, + {3, 2, 1, 2, 3, 3}, + {1, 2, 3, 2, 1, 1}, + {1, 1, 2, 2, 1, 2}, + {3, 3, 2, 2, 3, 2}, + {1, 2, 2, 2, 2, 3}, + {3, 2, 2, 2, 2, 1}, + {3, 1, 3, 1, 3, 2}, + }, + form = {3, 3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine30Form4X5TypeA = { + { + type = "Line30Form4X5TypeA", + link_type = 0, + direction = 0, + line_count = 30, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {1, 2, 1, 2, 3}, + {2, 3, 2, 3, 4}, + {4, 3, 4, 3, 2}, + {3, 2, 3, 2, 1}, + {1, 2, 3, 2, 3}, + {2, 3, 4, 3, 4}, + {3, 2, 1, 2, 1}, + {4, 3, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {1, 2, 1, 2, 1}, + {4, 3, 4, 3, 4}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine30Form4X5TypeB = { + { + type = "Line30Form4X5TypeB", + link_type = 0, + direction = 0, + line_count = 30, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {2, 1, 2, 3, 2}, + {3, 2, 3, 4, 3}, + {2, 3, 2, 1, 2}, + {3, 4, 3, 2, 3}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine3Form3X3TypeA = { + { + type = "Line3Form3X3TypeA", + link_type = 0, + direction = 0, + line_count = 3, + lines = { + {1, 1, 1}, + {2, 2, 2}, + {3, 3, 3}, + }, + form = {3, 3, 3}, + }, +} + +_.MatrixLine40Form34543TypeA = { + { + type = "Line40Form34543TypeA", + link_type = 0, + direction = 0, + line_count = 40, + lines = { + {1, 1, 1, 1, 1}, + {1, 1, 4, 3, 2}, + {1, 2, 4, 2, 2}, + {1, 2, 3, 4, 3}, + {1, 3, 1, 1, 1}, + {1, 4, 5, 4, 3}, + {2, 1, 2, 1, 1}, + {2, 1, 3, 3, 2}, + {2, 2, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {2, 3, 2, 1, 1}, + {2, 3, 3, 4, 3}, + {2, 4, 5, 3, 3}, + {2, 4, 5, 4, 3}, + {3, 1, 1, 2, 2}, + {3, 2, 4, 2, 1}, + {3, 3, 3, 3, 2}, + {3, 3, 2, 2, 2}, + {3, 4, 4, 4, 3}, + {3, 4, 5, 3, 2}, + {3, 4, 5, 4, 3}, + {3, 4, 2, 2, 2}, + {3, 3, 2, 3, 2}, + {3, 3, 3, 1, 1}, + {3, 2, 5, 4, 3}, + {3, 1, 1, 1, 1}, + {2, 4, 4, 4, 3}, + {2, 4, 3, 2, 2}, + {2, 3, 5, 4, 3}, + {2, 3, 4, 3, 2}, + {2, 2, 4, 4, 3}, + {2, 2, 3, 1, 1}, + {2, 1, 1, 2, 1}, + {2, 1, 1, 1, 1}, + {1, 4, 5, 3, 2}, + {1, 3, 2, 3, 3}, + {1, 2, 3, 2, 2}, + {1, 2, 4, 3, 2}, + {1, 1, 2, 1, 1}, + {1, 1, 1, 2, 2}, + }, + form = {3, 4, 5, 4, 3}, + }, +} + +_.MatrixLine40Form3X5TypeA = { + { + type = "Line40Form3X5TypeA", + link_type = 0, + direction = 0, + line_count = 40, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 3, 2, 3, 3}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {2, 1, 1, 2, 3}, + {2, 3, 3, 2, 1}, + {2, 2, 2, 3, 2}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine40Form3X5TypeB = { + { + type = "Line40Form3X5TypeB", + link_type = 0, + direction = 0, + line_count = 40, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 2, 1}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 1, 1, 1, 2}, + {2, 2, 2, 2, 1}, + {2, 2, 2, 2, 3}, + {3, 3, 3, 3, 2}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + {2, 1, 1, 1, 1}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine40Form3X5TypeC = { + { + type = "Line40Form3X5TypeC", + link_type = 0, + direction = 0, + line_count = 40, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 2, 3, 1}, + {2, 3, 2, 1, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {2, 2, 2, 1, 2}, + {2, 2, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {3, 3, 2, 1, 2}, + {1, 1, 2, 3, 2}, + {3, 2, 3, 3, 3}, + {1, 2, 1, 1, 1}, + {1, 2, 3, 2, 2}, + {3, 2, 1, 2, 2}, + {2, 1, 2, 1, 1}, + {2, 3, 2, 3, 3}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + {2, 1, 1, 1, 1}, + {2, 3, 3, 3, 3}, + {2, 2, 2, 2, 1}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine40Form3X5TypeD = { + { + type = "Line40Form3X5TypeD", + link_type = 0, + direction = 0, + line_count = 40, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 3, 2, 1, 3}, + {3, 1, 2, 3, 1}, + {2, 1, 3, 2, 3}, + {1, 3, 2, 3, 1}, + {3, 2, 1, 1, 2}, + {1, 2, 3, 3, 2}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 1, 1}, + {3, 1, 1, 2, 3}, + {2, 3, 3, 1, 1}, + {1, 1, 2, 2, 3}, + {3, 3, 1, 2, 1}, + {3, 3, 1, 1, 1}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine40Form4X5TypeA = { + { + type = "Line40Form4X5TypeA", + link_type = 0, + direction = 0, + line_count = 40, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {2, 1, 2, 3, 2}, + {3, 2, 3, 4, 3}, + {2, 3, 2, 1, 2}, + {3, 4, 3, 2, 3}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {2, 2, 4, 2, 2}, + {3, 3, 1, 3, 3}, + {4, 4, 2, 4, 4}, + {1, 1, 1, 2, 3}, + {4, 4, 4, 3, 2}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine40Form4X5TypeB = { + { + type = "Line40Form4X5TypeA", + link_type = 0, + direction = 0, + line_count = 40, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {1, 1, 2, 3, 4}, + {4, 4, 3, 2, 1}, + {2, 1, 1, 1, 2}, + {3, 4, 4, 4, 3}, + {1, 2, 3, 4, 4}, + {4, 3, 2, 1, 1}, + {2, 1, 2, 3, 2}, + {3, 4, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {4, 3, 4, 3, 4}, + {2, 3, 2, 1, 2}, + {3, 2, 3, 4, 3}, + {1, 2, 2, 2, 1}, + {4, 3, 3, 3, 4}, + {2, 2, 3, 4, 4}, + {3, 3, 2, 1, 1}, + {2, 2, 1, 2, 2}, + {3, 3, 4, 3, 3}, + {2, 3, 3, 3, 4}, + {3, 2, 2, 2, 1}, + {1, 1, 2, 1, 1}, + {4, 4, 3, 4, 4}, + {1, 2, 3, 3, 4}, + {4, 3, 2, 2, 1}, + {1, 1, 1, 2, 3}, + {4, 4, 4, 3, 2}, + {2, 1, 1, 2, 3}, + {3, 4, 4, 3, 2}, + {1, 2, 2, 3, 4}, + {4, 3, 3, 2, 1}, + {2, 1, 2, 3, 4}, + {3, 4, 3, 2, 1}, + {1, 2, 3, 4, 3}, + {4, 3, 2, 1, 2}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine40Form4X5TypeC = { + { + type = "Line40Form4X5TypeC", + link_type = 0, + direction = 0, + line_count = 40, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {1, 2, 3, 2, 1}, + {4, 3, 2, 3, 4}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {1, 2, 1, 2, 1}, + {4, 3, 4, 3, 4}, + {2, 1, 2, 1, 2}, + {3, 4, 3, 4, 3}, + {2, 3, 2, 3, 2}, + {3, 2, 3, 2, 3}, + {1, 1, 2, 1, 1}, + {4, 4, 3, 4, 4}, + {2, 2, 3, 2, 2}, + {3, 3, 2, 3, 3}, + {3, 3, 4, 3, 3}, + {2, 2, 1, 2, 2}, + {3, 2, 2, 2, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 4, 4, 4, 3}, + {4, 3, 3, 3, 4}, + {1, 2, 2, 2, 1}, + {3, 1, 1, 1, 3}, + {2, 4, 4, 4, 2}, + {4, 2, 2, 2, 4}, + {1, 3, 3, 3, 1}, + {3, 3, 1, 3, 3}, + {2, 2, 4, 2, 2}, + {4, 4, 2, 4, 4}, + {1, 1, 3, 1, 1}, + {4, 4, 1, 4, 4}, + {1, 1, 4, 1, 1}, + {4, 3, 2, 1, 1}, + {1, 2, 3, 4, 4}, + {1, 1, 2, 3, 4}, + {4, 4, 3, 2, 1}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine40Form4X6TypeA = { + { + type = "Line40Form4X6TypeA", + link_type = 0, + direction = 0, + line_count = 40, + lines = { + {1, 1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4, 4}, + {1, 1, 2, 2, 1, 1}, + {2, 2, 3, 3, 2, 2}, + {3, 3, 4, 4, 3, 3}, + {2, 2, 1, 1, 2, 2}, + {3, 3, 2, 2, 3, 3}, + {4, 4, 3, 3, 4, 4}, + {1, 2, 3, 3, 2, 1}, + {2, 3, 4, 4, 3, 2}, + {3, 2, 1, 1, 2, 3}, + {4, 3, 2, 2, 3, 4}, + {1, 2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2, 3}, + {3, 4, 3, 4, 3, 4}, + {2, 1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3, 2}, + {4, 3, 4, 3, 4, 3}, + {1, 2, 2, 2, 2, 1}, + {2, 3, 3, 3, 3, 2}, + {3, 4, 4, 4, 4, 3}, + {2, 1, 1, 1, 1, 2}, + {3, 2, 2, 2, 2, 3}, + {4, 3, 3, 3, 3, 4}, + {1, 2, 3, 4, 3, 2}, + {2, 3, 4, 3, 2, 1}, + {3, 2, 1, 2, 3, 4}, + {4, 3, 2, 1, 2, 3}, + {2, 1, 2, 3, 4, 3}, + {1, 2, 1, 2, 3, 4}, + {3, 4, 3, 2, 1, 2}, + {4, 3, 4, 3, 2, 1}, + {2, 1, 2, 2, 1, 2}, + {3, 2, 3, 3, 2, 3}, + {4, 3, 4, 4, 3, 4}, + {1, 2, 1, 1, 2, 1}, + {2, 3, 2, 2, 3, 2}, + {3, 4, 3, 3, 4, 3}, + }, + form = {4, 4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine50Form3X5TypeA = { + { + type = "Line50Form3X5TypeA", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {2, 2, 2, 2, 3}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {1, 2, 3, 2, 3}, + {3, 2, 1, 2, 1}, + {1, 1, 1, 1, 2}, + {3, 3, 3, 3, 2}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 2, 1}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {2, 2, 1, 1, 1}, + {2, 2, 3, 3, 3}, + {2, 1, 1, 2, 3}, + {2, 3, 3, 2, 1}, + {2, 1, 2, 3, 3}, + {2, 3, 2, 1, 1}, + {3, 2, 1, 1, 2}, + {1, 2, 3, 3, 2}, + {1, 1, 2, 3, 2}, + {3, 3, 2, 1, 2}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine50Form3X5TypeB = { + { + type = "Line50Form3X5TypeB", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 3, 2, 1, 3}, + {3, 1, 2, 3, 1}, + {2, 1, 3, 2, 3}, + {1, 3, 2, 3, 1}, + {3, 2, 1, 1, 2}, + {1, 2, 3, 3, 2}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 1, 1}, + {3, 1, 1, 2, 3}, + {2, 3, 3, 1, 1}, + {1, 1, 2, 2, 3}, + {3, 3, 1, 2, 1}, + {3, 3, 1, 1, 1}, + {3, 3, 2, 3, 2}, + {1, 1, 3, 2, 1}, + {2, 2, 1, 2, 3}, + {2, 1, 1, 3, 2}, + {2, 3, 1, 1, 3}, + {3, 1, 1, 3, 1}, + {1, 2, 2, 3, 2}, + {1, 2, 3, 1, 3}, + {1, 3, 1, 2, 3}, + {2, 2, 3, 3, 2}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine50Form3X5TypeC = { + { + type = "Line50Form3X5TypeC", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {2, 2, 2, 1, 3}, + {2, 2, 2, 3, 1}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {3, 3, 2, 1, 2}, + {1, 1, 2, 3, 2}, + {3, 2, 3, 3, 3}, + {1, 2, 1, 1, 1}, + {1, 2, 3, 2, 2}, + {3, 2, 1, 2, 2}, + {2, 1, 2, 1, 1}, + {2, 3, 2, 3, 3}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + {2, 1, 1, 1, 1}, + {2, 3, 3, 3, 3}, + {2, 2, 2, 2, 1}, + {2, 2, 2, 2, 3}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 1, 2, 1}, + {3, 3, 3, 2, 3}, + {2, 2, 1, 1, 1}, + {2, 2, 3, 3, 3}, + {1, 1, 2, 2, 1}, + {3, 3, 2, 2, 3}, + {3, 2, 1, 2, 1}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine50Form3X5TypeD = { + { + type = "Line50Form3X5TypeD", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {3, 1, 2, 3, 1}, + {1, 3, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {3, 2, 1, 1, 2}, + {1, 2, 3, 3, 2}, + {1, 1, 3, 3, 3}, + {3, 3, 1, 1, 1}, + {2, 1, 3, 2, 3}, + {2, 3, 1, 2, 1}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 2, 1}, + {2, 3, 3, 1, 1}, + {1, 1, 2, 2, 3}, + {3, 3, 2, 2, 1}, + {3, 1, 1, 1, 1}, + {1, 3, 3, 3, 3}, + {3, 3, 3, 3, 1}, + {1, 1, 1, 1, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine50Form3X5TypeE = { + { + type = "Line50Form3X5TypeE", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 2, 1}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 1, 1, 1, 2}, + {2, 2, 2, 2, 1}, + {2, 2, 2, 2, 3}, + {3, 3, 3, 3, 2}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + {2, 1, 1, 1, 1}, + {2, 3, 3, 3, 3}, + {1, 1, 2, 2, 3}, + {3, 3, 2, 2, 1}, + {1, 1, 2, 3, 2}, + {3, 3, 2, 1, 2}, + {1, 2, 3, 2, 3}, + {3, 2, 1, 2, 1}, + {2, 1, 1, 2, 3}, + {2, 3, 3, 2, 1}, + {1, 3, 1, 3, 1}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine50Form3X5TypeF = { + { + type = "Line50Form3X5TypeF", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {2, 2, 2, 1, 2}, + {2, 2, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {3, 3, 2, 1, 2}, + {1, 1, 2, 3, 2}, + {3, 2, 3, 3, 3}, + {1, 2, 1, 1, 1}, + {1, 2, 3, 2, 2}, + {3, 2, 1, 2, 2}, + {2, 1, 2, 1, 1}, + {2, 3, 2, 3, 3}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + {2, 1, 1, 1, 1}, + {2, 3, 3, 3, 3}, + {2, 2, 2, 2, 1}, + {2, 2, 2, 2, 3}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 1, 2, 1}, + {3, 3, 3, 2, 3}, + {2, 2, 1, 1, 1}, + {2, 2, 3, 3, 3}, + {1, 1, 2, 2, 1}, + {3, 3, 2, 2, 3}, + {3, 2, 1, 2, 1}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine50Form3X5TypeG = { + { + type = "Line50Form3X5TypeG", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 3, 2, 3, 3}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {2, 1, 1, 2, 3}, + {2, 3, 3, 2, 1}, + {2, 2, 2, 3, 2}, + {2, 2, 2, 1, 2}, + {1, 1, 1, 1, 2}, + {3, 3, 3, 3, 2}, + {2, 2, 2, 2, 3}, + {2, 2, 2, 2, 1}, + {2, 2, 1, 1, 1}, + {2, 2, 3, 3, 3}, + {1, 1, 1, 2, 2}, + {3, 3, 3, 2, 2}, + {2, 1, 1, 1, 1}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine50Form3X5TypeH = { + { + type = "Line50Form3X5TypeH", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 3, 2, 3, 3}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {2, 1, 1, 2, 3}, + {2, 3, 3, 2, 1}, + {2, 2, 2, 3, 2}, + {2, 2, 2, 1, 2}, + {1, 1, 1, 1, 2}, + {3, 3, 3, 3, 2}, + {2, 2, 2, 2, 3}, + {2, 2, 2, 2, 1}, + {2, 2, 1, 1, 1}, + {2, 2, 3, 3, 3}, + {1, 1, 1, 2, 2}, + {3, 3, 3, 2, 2}, + {2, 1, 1, 1, 1}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine50Form45454TypeA = { + { + type = "Line50Form45454TypeA", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {1, 1, 1, 1, 1}, + {1, 1, 1, 2, 1}, + {1, 1, 1, 2, 2}, + {1, 2, 1, 1, 1}, + {1, 2, 1, 2, 1}, + {1, 2, 1, 2, 2}, + {1, 2, 2, 2, 1}, + {1, 2, 2, 2, 2}, + {1, 2, 2, 3, 2}, + {1, 2, 2, 3, 3}, + {2, 2, 1, 1, 1}, + {2, 2, 1, 2, 1}, + {2, 2, 1, 2, 2}, + {2, 2, 2, 2, 1}, + {2, 2, 2, 2, 2}, + {2, 2, 2, 3, 2}, + {2, 2, 2, 3, 3}, + {2, 2, 2, 2, 1}, + {2, 3, 2, 2, 2}, + {2, 3, 2, 3, 2}, + {2, 3, 2, 3, 3}, + {2, 3, 3, 3, 2}, + {2, 3, 3, 3, 3}, + {2, 3, 3, 4, 3}, + {2, 3, 3, 4, 4}, + {3, 3, 2, 2, 1}, + {3, 3, 2, 2, 2}, + {3, 3, 2, 3, 2}, + {3, 3, 2, 3, 3}, + {3, 3, 3, 3, 2}, + {3, 3, 3, 3, 3}, + {3, 3, 3, 4, 3}, + {3, 3, 3, 4, 4}, + {3, 4, 3, 3, 2}, + {3, 4, 3, 3, 3}, + {3, 4, 3, 4, 3}, + {3, 4, 3, 4, 4}, + {3, 4, 4, 4, 3}, + {3, 4, 4, 4, 4}, + {3, 4, 4, 5, 4}, + {4, 4, 3, 3, 2}, + {4, 4, 3, 3, 3}, + {4, 4, 3, 4, 3}, + {4, 4, 3, 4, 4}, + {4, 4, 4, 4, 3}, + {4, 4, 4, 4, 4}, + {4, 4, 4, 5, 4}, + {4, 5, 4, 4, 3}, + {4, 5, 4, 4, 4}, + {4, 5, 4, 5, 4}, + }, + form = {4, 5, 4, 5, 4}, + }, +} + +_.MatrixLine50Form4X5TypeA = { + { + type = "Line50Form4X5TypeA", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 3, 3, 3, 4}, + {3, 2, 2, 2, 3}, + {2, 1, 1, 1, 2}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {4, 3, 2, 3, 4}, + {3, 2, 1, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 3, 4, 4}, + {3, 3, 2, 3, 3}, + {2, 2, 1, 2, 2}, + {1, 4, 1, 4, 1}, + {4, 1, 4, 1, 4}, + {4, 2, 4, 2, 4}, + {3, 1, 3, 1, 3}, + {1, 3, 1, 3, 1}, + {2, 4, 2, 4, 2}, + {4, 3, 3, 2, 1}, + {1, 2, 2, 3, 4}, + {1, 2, 3, 3, 4}, + {4, 3, 2, 2, 1}, + {2, 1, 4, 3, 2}, + {3, 4, 1, 2, 3}, + {4, 4, 1, 4, 4}, + {1, 1, 4, 1, 1}, + {4, 1, 1, 1, 4}, + {1, 4, 4, 4, 1}, + {4, 2, 2, 2, 4}, + {1, 3, 3, 3, 1}, + {4, 2, 3, 2, 4}, + {1, 3, 2, 3, 1}, + {4, 1, 2, 1, 4}, + {1, 4, 2, 4, 1}, + {4, 4, 2, 4, 4}, + {1, 1, 3, 1, 1}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine50Form4X5TypeB = { + { + type = "Line50Form4X5TypeB", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {2, 1, 2, 3, 2}, + {3, 2, 3, 4, 3}, + {2, 3, 2, 1, 2}, + {3, 4, 3, 2, 3}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {2, 2, 4, 2, 2}, + {3, 3, 1, 3, 3}, + {4, 4, 2, 4, 4}, + {1, 1, 1, 2, 3}, + {4, 4, 4, 3, 2}, + {2, 2, 2, 3, 4}, + {3, 3, 3, 2, 1}, + {1, 1, 1, 1, 2}, + {4, 4, 4, 4, 3}, + {1, 2, 3, 4, 3}, + {1, 2, 3, 4, 4}, + {4, 3, 2, 1, 1}, + {4, 3, 2, 1, 2}, + {1, 1, 2, 3, 4}, + {4, 4, 3, 2, 1}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine50Form4X5TypeC = { + { + type = "Line50Form4X5TypeC", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {4, 3, 2, 3, 4}, + {3, 4, 3, 4, 3}, + {2, 1, 2, 1, 2}, + {2, 2, 3, 4, 4}, + {3, 3, 2, 1, 1}, + {4, 3, 3, 3, 4}, + {1, 2, 2, 2, 1}, + {2, 3, 2, 1, 2}, + {3, 2, 3, 4, 3}, + {2, 1, 1, 2, 3}, + {3, 4, 4, 3, 2}, + {2, 3, 3, 3, 2}, + {3, 2, 2, 2, 3}, + {3, 3, 4, 3, 2}, + {2, 2, 1, 2, 3}, + {1, 2, 1, 2, 1}, + {4, 3, 4, 3, 4}, + {1, 1, 2, 1, 1}, + {4, 4, 3, 4, 4}, + {2, 2, 3, 2, 2}, + {3, 3, 2, 3, 3}, + {1, 1, 2, 3, 3}, + {4, 4, 3, 2, 2}, + {2, 3, 2, 3, 2}, + {3, 2, 3, 2, 3}, + {3, 4, 3, 2, 3}, + {2, 1, 2, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 4, 4, 4, 3}, + {2, 2, 2, 3, 4}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 4, 3}, + {4, 3, 2, 1, 2}, + {2, 3, 4, 4, 4}, + {3, 2, 1, 1, 1}, + {1, 1, 1, 2, 3}, + {4, 4, 4, 3, 2}, + {4, 3, 3, 2, 1}, + {1, 2, 2, 3, 4}, + {2, 3, 3, 4, 4}, + {3, 2, 2, 1, 1}, + {1, 2, 1, 2, 3}, + {4, 3, 4, 3, 2}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine50Form4X5TypeD = { + { + type = "Line50Form4X5TypeD", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {2, 1, 2, 3, 2}, + {3, 2, 3, 4, 3}, + {2, 3, 2, 1, 2}, + {3, 4, 3, 2, 3}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {2, 2, 4, 2, 2}, + {3, 3, 1, 3, 3}, + {4, 4, 2, 4, 4}, + {1, 1, 1, 2, 3}, + {4, 4, 4, 3, 2}, + {2, 2, 2, 3, 4}, + {3, 3, 3, 2, 1}, + {1, 1, 1, 1, 2}, + {4, 4, 4, 4, 3}, + {1, 2, 3, 4, 3}, + {1, 2, 3, 4, 4}, + {4, 3, 2, 1, 1}, + {4, 3, 2, 1, 2}, + {1, 1, 2, 3, 4}, + {4, 4, 3, 2, 1}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine50Form4X5TypeE = { + { + type = "Line50Form4X5TypeE", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {1, 1, 1, 1, 1}, + {1, 1, 2, 1, 1}, + {1, 2, 2, 2, 1}, + {1, 2, 3, 2, 1}, + {1, 2, 1, 2, 1}, + {1, 1, 1, 2, 1}, + {1, 2, 1, 1, 1}, + {1, 1, 2, 2, 1}, + {1, 2, 2, 1, 1}, + {1, 1, 3, 1, 1}, + {1, 1, 3, 2, 1}, + {1, 2, 3, 1, 1}, + {2, 2, 2, 2, 2}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {2, 2, 2, 3, 2}, + {2, 2, 2, 1, 2}, + {2, 3, 2, 2, 2}, + {2, 1, 2, 2, 2}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {3, 3, 3, 3, 3}, + {3, 3, 4, 3, 3}, + {3, 3, 2, 3, 3}, + {3, 4, 4, 4, 3}, + {3, 2, 2, 2, 3}, + {3, 4, 3, 4, 3}, + {3, 2, 3, 2, 3}, + {3, 3, 3, 4, 3}, + {3, 3, 3, 2, 3}, + {3, 4, 3, 3, 3}, + {3, 2, 3, 3, 3}, + {3, 4, 2, 4, 3}, + {3, 2, 4, 2, 3}, + {4, 4, 4, 4, 4}, + {4, 4, 3, 4, 4}, + {4, 3, 3, 3, 4}, + {4, 3, 2, 3, 4}, + {4, 3, 4, 3, 4}, + {4, 4, 4, 3, 4}, + {4, 3, 4, 4, 4}, + {4, 4, 3, 3, 4}, + {4, 3, 3, 4, 4}, + {4, 4, 2, 4, 4}, + {4, 4, 2, 3, 4}, + {4, 3, 2, 4, 4}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine50Form4X5TypeF = { + { + type = "Line50Form4X5TypeF", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {1, 2, 3, 4, 3}, + {4, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {3, 4, 3, 2, 3}, + {2, 3, 4, 4, 4}, + {3, 2, 1, 1, 1}, + {2, 3, 3, 4, 4}, + {3, 2, 2, 1, 1}, + {2, 2, 1, 2, 2}, + {3, 3, 4, 3, 3}, + {1, 2, 2, 2, 1}, + {4, 3, 3, 3, 4}, + {2, 1, 1, 1, 2}, + {3, 4, 4, 4, 3}, + {1, 1, 2, 1, 1}, + {4, 4, 3, 4, 4}, + {1, 1, 2, 3, 4}, + {4, 4, 3, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {4, 3, 4, 3, 4}, + {2, 1, 2, 1, 2}, + {3, 4, 3, 4, 3}, + {1, 1, 1, 2, 2}, + {4, 4, 4, 3, 3}, + {2, 2, 2, 3, 4}, + {3, 3, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {4, 3, 2, 3, 4}, + {2, 2, 3, 3, 4}, + {3, 3, 2, 2, 1}, + {2, 2, 1, 1, 2}, + {3, 3, 4, 4, 3}, + {1, 2, 1, 1, 2}, + {4, 3, 4, 4, 3}, + {2, 3, 3, 3, 2}, + {3, 2, 2, 2, 3}, + {2, 1, 1, 2, 1}, + {3, 4, 4, 3, 4}, + {1, 2, 2, 1, 2}, + {4, 3, 3, 4, 3}, + {2, 3, 2, 1, 1}, + {3, 2, 3, 4, 4}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine50Form4X6TypeA = { + { + type = "Line50Form4X6TypeA", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {2, 2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4, 4}, + {1, 2, 3, 3, 2, 1}, + {4, 3, 2, 2, 3, 4}, + {2, 3, 4, 4, 3, 2}, + {3, 2, 1, 1, 2, 3}, + {1, 2, 1, 1, 2, 1}, + {4, 3, 4, 4, 3, 4}, + {2, 1, 2, 2, 1, 2}, + {3, 4, 3, 3, 4, 3}, + {2, 3, 2, 2, 3, 2}, + {3, 2, 3, 3, 2, 3}, + {1, 1, 2, 2, 1, 1}, + {4, 4, 3, 3, 4, 4}, + {2, 2, 3, 3, 2, 2}, + {3, 3, 2, 2, 3, 3}, + {3, 3, 4, 4, 3, 3}, + {2, 2, 1, 1, 2, 2}, + {2, 3, 3, 3, 3, 2}, + {3, 2, 2, 2, 2, 3}, + {2, 1, 1, 1, 1, 2}, + {3, 4, 4, 4, 4, 3}, + {4, 3, 3, 3, 3, 4}, + {1, 2, 2, 2, 2, 1}, + {3, 1, 1, 1, 1, 3}, + {2, 4, 4, 4, 4, 2}, + {4, 2, 2, 2, 2, 4}, + {1, 3, 3, 3, 3, 1}, + {3, 3, 1, 1, 3, 3}, + {2, 2, 4, 4, 2, 2}, + {1, 1, 3, 3, 1, 1}, + {4, 4, 2, 2, 4, 4}, + {4, 4, 1, 1, 4, 4}, + {1, 1, 4, 4, 1, 1}, + {4, 3, 2, 1, 1, 1}, + {1, 2, 3, 4, 4, 4}, + {1, 1, 1, 2, 3, 4}, + {4, 4, 4, 3, 2, 1}, + {3, 2, 1, 1, 1, 1}, + {2, 3, 4, 4, 4, 4}, + {1, 1, 1, 1, 2, 3}, + {4, 4, 4, 4, 3, 2}, + {4, 3, 2, 2, 2, 2}, + {1, 2, 3, 3, 3, 3}, + {2, 2, 2, 2, 3, 4}, + {3, 3, 3, 3, 2, 1}, + {2, 4, 1, 1, 4, 2}, + {3, 1, 4, 4, 1, 3}, + }, + form = {4, 4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine50Form5X5TypeA = { + { + type = "Line50Form5X5TypeA", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {2, 1, 2, 3, 2}, + {3, 2, 3, 4, 3}, + {4, 3, 4, 5, 4}, + {2, 3, 2, 1, 2}, + {3, 4, 3, 2, 3}, + {4, 5, 4, 3, 4}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 4, 5, 5}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {5, 5, 4, 3, 3}, + {1, 1, 3, 1, 1}, + {2, 2, 4, 2, 2}, + {3, 3, 5, 3, 3}, + }, + form = {5, 5, 5, 5, 5}, + }, +} + +_.MatrixLine50Form5X5TypeB = { + { + type = "Line50Form5X5TypeB", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {4, 4, 4, 4, 4}, + {3, 3, 3, 3, 3}, + {5, 5, 5, 5, 5}, + {3, 4, 5, 4, 3}, + {5, 4, 3, 4, 5}, + {4, 3, 3, 3, 4}, + {4, 5, 5, 5, 4}, + {3, 3, 4, 5, 5}, + {5, 5, 4, 3, 3}, + {4, 3, 4, 3, 4}, + {4, 5, 4, 5, 4}, + {3, 4, 4, 4, 5}, + {5, 4, 4, 4, 3}, + {4, 4, 3, 4, 5}, + {4, 4, 5, 4, 3}, + {3, 4, 3, 4, 3}, + {5, 4, 5, 4, 5}, + {3, 3, 5, 3, 3}, + {5, 5, 3, 5, 5}, + {4, 3, 5, 3, 4}, + {4, 5, 3, 5, 4}, + {3, 5, 3, 5, 3}, + {5, 3, 5, 3, 5}, + {3, 5, 5, 5, 3}, + {5, 3, 3, 3, 5}, + {3, 5, 4, 5, 3}, + {5, 3, 4, 3, 5}, + {4, 4, 5, 4, 4}, + {4, 4, 3, 4, 4}, + {3, 5, 3, 4, 4}, + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {2, 2, 1, 2, 3}, + {2, 2, 3, 2, 1}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + }, + form = {5, 5, 5, 5, 5}, + }, +} + +_.MatrixLine50Form5X5TypeC = { + { + type = "Line50Form5X5TypeC", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 4, 5, 5}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {5, 5, 4, 3, 3}, + {1, 1, 2, 3, 4}, + {2, 2, 3, 4, 5}, + {5, 5, 4, 3, 2}, + {4, 4, 3, 2, 1}, + {1, 2, 3, 4, 4}, + {2, 3, 4, 5, 5}, + {5, 4, 3, 2, 2}, + {4, 3, 2, 1, 1}, + {1, 2, 3, 4, 3}, + }, + form = {5, 5, 5, 5, 5}, + }, +} + +_.MatrixLine50Form6X5TypeA = { + { + type = "Line50Form6X5TypeA", + link_type = 0, + direction = 0, + line_count = 50, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 4, 5, 5}, + {4, 4, 5, 6, 6}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + }, + form = {6, 6, 6, 6, 6}, + }, +} + +_.MatrixLine5Form3X3TypeA = { + { + type = "Line5Form3X3TypeA", + link_type = 0, + direction = 0, + line_count = 5, + lines = { + {1, 1, 1}, + {2, 2, 2}, + {3, 3, 3}, + {1, 2, 3}, + {3, 2, 1}, + }, + form = {3, 3, 3}, + }, +} + +_.MatrixLine5Form3X3TypeB = { + { + type = "Line5Form3X3TypeB", + link_type = 0, + direction = 0, + line_count = 5, + lines = { + {2, 2, 2}, + {1, 1, 1}, + {3, 3, 3}, + {1, 2, 3}, + {3, 2, 1}, + }, + form = {3, 3, 3}, + }, +} + +_.MatrixLine60Form33633TypeA = { + { + type = "Line60Form33633TypeA", + link_type = 0, + direction = 0, + line_count = 60, + lines = { + {2, 2, 3, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 5, 3, 3}, + {1, 2, 5, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 5, 3, 2}, + {1, 1, 3, 3, 3}, + {3, 3, 3, 1, 1}, + {2, 3, 3, 1, 2}, + {2, 1, 3, 3, 2}, + {1, 2, 3, 2, 1}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 5, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 5, 2, 2}, + {1, 1, 5, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 5, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 5, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 5, 1, 3}, + {3, 1, 3, 3, 1}, + {1, 3, 3, 1, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 3, 1, 3}, + {3, 2, 1, 1, 2}, + {2, 2, 4, 2, 2}, + {1, 1, 2, 1, 1}, + {3, 3, 6, 3, 3}, + {1, 2, 6, 2, 1}, + {3, 2, 2, 2, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 6, 3, 2}, + {1, 1, 4, 3, 3}, + {3, 3, 4, 1, 1}, + {2, 3, 4, 1, 2}, + {2, 1, 4, 3, 2}, + {1, 2, 4, 2, 1}, + {3, 2, 4, 2, 3}, + {1, 2, 2, 2, 1}, + {3, 2, 6, 2, 3}, + {2, 2, 2, 2, 2}, + {2, 2, 6, 2, 2}, + {1, 1, 6, 1, 1}, + {3, 3, 2, 3, 3}, + {1, 3, 6, 3, 1}, + {3, 1, 2, 1, 3}, + {2, 3, 2, 3, 2}, + {2, 1, 6, 1, 2}, + {1, 3, 2, 3, 1}, + {3, 1, 6, 1, 3}, + {3, 1, 4, 3, 1}, + {1, 3, 4, 1, 3}, + {1, 3, 4, 3, 1}, + {3, 1, 4, 1, 3}, + {3, 2, 2, 1, 2}, + }, + form = {3, 3, 6, 3, 3}, + }, +} + +_.MatrixLine60Form8X5TypeA = { + { + type = "Line60Form8X5TypeA", + link_type = 0, + direction = 0, + line_count = 60, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {8, 8, 8, 8, 8}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {7, 8, 7, 8, 7}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {8, 7, 8, 7, 8}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {6, 7, 8, 7, 6}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {8, 7, 6, 7, 8}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {7, 8, 8, 8, 7}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {8, 7, 7, 7, 8}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {7, 7, 8, 7, 7}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {8, 8, 7, 8, 8}, + }, + form = {8, 8, 8, 8, 8}, + }, +} + +_.MatrixLine65Form6X5TypeA = { + { + type = "Line65Form6X5TypeA", + link_type = 0, + direction = 0, + line_count = 65, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 4, 5, 5}, + {4, 4, 5, 6, 6}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {5, 5, 4, 3, 3}, + {6, 6, 5, 4, 4}, + {1, 1, 2, 3, 4}, + {2, 2, 3, 4, 5}, + {3, 3, 4, 5, 6}, + {6, 6, 5, 4, 3}, + {5, 5, 4, 3, 2}, + {4, 4, 3, 2, 1}, + {1, 2, 3, 4, 4}, + {2, 3, 4, 5, 5}, + {3, 4, 5, 6, 6}, + {6, 5, 4, 3, 3}, + {5, 4, 3, 2, 2}, + {4, 3, 2, 1, 1}, + {1, 2, 3, 4, 3}, + }, + form = {6, 6, 6, 6, 6}, + }, +} + +_.MatrixLine70Form9X5TypeA = { + { + type = "Line70Form9X5TypeA", + link_type = 0, + direction = 0, + line_count = 70, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {8, 8, 8, 8, 8}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {7, 8, 7, 8, 7}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {8, 7, 8, 7, 8}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {6, 7, 8, 7, 6}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {8, 7, 6, 7, 8}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {7, 8, 8, 8, 7}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {8, 7, 7, 7, 8}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {7, 7, 8, 7, 7}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {8, 8, 7, 8, 8}, + {9, 9, 9, 9, 9}, + {8, 9, 8, 9, 8}, + {9, 8, 9, 8, 9}, + {7, 8, 9, 8, 7}, + {9, 8, 7, 8, 9}, + {8, 9, 9, 9, 8}, + {9, 8, 8, 8, 9}, + {8, 8, 9, 8, 8}, + {9, 9, 8, 9, 9}, + {7, 7, 8, 9, 9}, + }, + form = {9, 9, 9, 9, 9}, + }, +} + +_.MatrixLine75Form5X6TypeA = { + { + type = "Line75Form5X6TypeA", + link_type = 0, + direction = 0, + line_count = 75, + lines = { + {1, 1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5, 5}, + {1, 2, 3, 4, 5, 4}, + {5, 4, 3, 2, 1, 2}, + {1, 2, 3, 4, 5, 5}, + {5, 4, 3, 2, 1, 1}, + {1, 2, 3, 3, 2, 1}, + {2, 3, 4, 4, 3, 2}, + {3, 4, 5, 5, 4, 3}, + {3, 2, 1, 1, 2, 3}, + {4, 3, 2, 2, 3, 4}, + {5, 4, 3, 3, 4, 5}, + {1, 2, 3, 4, 4, 3}, + {2, 3, 4, 5, 5, 4}, + {5, 4, 3, 2, 2, 3}, + {4, 3, 2, 1, 1, 2}, + {1, 2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2, 3}, + {3, 4, 3, 4, 3, 4}, + {4, 5, 4, 5, 4, 5}, + {2, 1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3, 2}, + {4, 3, 4, 3, 4, 3}, + {5, 4, 5, 4, 5, 4}, + {1, 2, 3, 4, 3, 2}, + {2, 3, 4, 5, 4, 3}, + {5, 4, 3, 2, 3, 4}, + {4, 3, 2, 1, 2, 3}, + {2, 3, 4, 3, 2, 1}, + {3, 4, 5, 4, 3, 2}, + {4, 3, 2, 3, 4, 5}, + {3, 2, 1, 2, 3, 4}, + {1, 2, 3, 4, 4, 4}, + {2, 3, 4, 5, 5, 5}, + {5, 4, 3, 2, 2, 2}, + {4, 3, 2, 1, 1, 1}, + {1, 1, 2, 3, 4, 4}, + {2, 2, 3, 4, 5, 5}, + {5, 5, 4, 3, 2, 2}, + {4, 4, 3, 2, 1, 1}, + {1, 1, 1, 2, 3, 4}, + {2, 2, 2, 3, 4, 5}, + {5, 5, 5, 4, 3, 2}, + {4, 4, 4, 3, 2, 1}, + {1, 2, 3, 2, 3, 2}, + {2, 3, 4, 3, 4, 3}, + {3, 4, 5, 4, 5, 4}, + {5, 4, 3, 4, 3, 4}, + {4, 3, 2, 3, 2, 3}, + {3, 2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2, 1}, + {3, 4, 3, 4, 3, 2}, + {4, 5, 4, 5, 4, 3}, + {4, 3, 4, 3, 4, 5}, + {3, 2, 3, 2, 3, 4}, + {2, 1, 2, 1, 2, 3}, + {2, 1, 1, 1, 1, 2}, + {3, 2, 2, 2, 2, 3}, + {4, 3, 3, 3, 3, 4}, + {5, 4, 4, 4, 4, 5}, + {1, 2, 2, 2, 2, 1}, + {2, 3, 3, 3, 3, 2}, + {3, 4, 4, 4, 4, 3}, + {4, 5, 5, 5, 5, 4}, + {1, 1, 2, 2, 1, 1}, + {2, 2, 3, 3, 2, 2}, + {3, 3, 4, 4, 3, 3}, + {4, 4, 5, 5, 4, 4}, + {5, 5, 4, 4, 5, 5}, + {4, 4, 3, 3, 4, 4}, + {3, 3, 2, 2, 1, 1}, + {2, 2, 1, 1, 2, 2}, + }, + form = {5, 5, 5, 5, 5, 5}, + }, +} + +_.MatrixLine75Form6X5TypeA = { + { + type = "Line75Form6X5TypeA", + link_type = 0, + direction = 0, + line_count = 75, + lines = { + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 2, 1, 1}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {3, 2, 2, 2, 3}, + {1, 2, 2, 2, 1}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {3, 1, 3, 1, 3}, + {1, 3, 1, 3, 1}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {3, 3, 1, 3, 3}, + {1, 1, 3, 1, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 3, 3, 2, 3}, + {1, 1, 1, 2, 1}, + {2, 2, 2, 1, 2}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {4, 4, 4, 4, 4}, + {6, 5, 4, 5, 6}, + {4, 5, 6, 5, 4}, + {6, 6, 5, 6, 6}, + {4, 4, 5, 4, 4}, + {5, 4, 4, 4, 5}, + {5, 6, 6, 6, 5}, + {6, 5, 5, 5, 6}, + {4, 5, 5, 5, 4}, + {6, 5, 6, 5, 6}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {5, 4, 5, 4, 5}, + {5, 5, 6, 5, 5}, + {5, 5, 4, 5, 5}, + {6, 4, 6, 4, 6}, + {4, 6, 4, 6, 4}, + {5, 6, 4, 6, 5}, + {5, 4, 6, 4, 5}, + {6, 6, 4, 6, 6}, + {4, 4, 6, 4, 4}, + {6, 4, 4, 4, 6}, + {4, 6, 6, 6, 4}, + {6, 4, 5, 4, 6}, + {4, 6, 5, 6, 4}, + {6, 6, 6, 5, 6}, + {4, 4, 4, 5, 4}, + {5, 5, 5, 4, 5}, + {4, 4, 3, 4, 4}, + {3, 3, 4, 3, 3}, + {4, 3, 3, 3, 4}, + {3, 4, 4, 4, 3}, + {4, 3, 4, 3, 4}, + {3, 4, 3, 4, 3}, + {4, 2, 3, 2, 4}, + {2, 4, 3, 4, 2}, + {4, 4, 4, 3, 4}, + {3, 3, 3, 4, 3}, + {3, 2, 4, 2, 3}, + {3, 4, 2, 4, 3}, + {4, 3, 2, 3, 4}, + {2, 3, 4, 3, 2}, + {2, 2, 4, 2, 2}, + }, + form = {6, 6, 6, 6, 6}, + }, +} + +_.MatrixLine80Form10X5TypeA = { + { + type = "Line80Form10X5TypeA", + link_type = 0, + direction = 0, + line_count = 80, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {8, 8, 8, 8, 8}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {7, 8, 7, 8, 7}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {8, 7, 8, 7, 8}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {6, 7, 8, 7, 6}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {8, 7, 6, 7, 8}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {7, 8, 8, 8, 7}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {8, 7, 7, 7, 8}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {7, 7, 8, 7, 7}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {8, 8, 7, 8, 8}, + {9, 9, 9, 9, 9}, + {8, 9, 8, 9, 8}, + {9, 8, 9, 8, 9}, + {7, 8, 9, 8, 7}, + {9, 8, 7, 8, 9}, + {8, 9, 9, 9, 8}, + {9, 8, 8, 8, 9}, + {8, 8, 9, 8, 8}, + {9, 9, 8, 9, 9}, + {7, 7, 8, 9, 9}, + {10, 10, 10, 10, 10}, + {9, 10, 9, 10, 9}, + {10, 9, 10, 9, 10}, + {8, 9, 10, 9, 8}, + {10, 9, 8, 9, 10}, + {9, 10, 10, 10, 9}, + {10, 9, 9, 9, 10}, + {9, 9, 10, 9, 9}, + {10, 10, 9, 10, 10}, + {8, 8, 9, 10, 10}, + }, + form = {10, 10, 10, 10, 10}, + }, +} + +_.MatrixLine80Form3X5TypeA = { + { + type = "Line80Form3X5TypeA", + link_type = 0, + direction = 0, + line_count = 80, + lines = { + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {3, 1, 2, 3, 1}, + {1, 3, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {3, 2, 1, 1, 2}, + {1, 2, 3, 3, 2}, + {1, 1, 3, 3, 3}, + {3, 3, 1, 1, 1}, + {2, 1, 3, 2, 3}, + {2, 3, 1, 2, 1}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 2, 1}, + {2, 3, 3, 1, 1}, + {1, 1, 2, 2, 3}, + {3, 3, 2, 2, 1}, + {3, 1, 1, 1, 1}, + {1, 3, 3, 3, 3}, + {3, 3, 3, 3, 1}, + {1, 1, 1, 1, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + {1, 1, 1, 1, 2}, + {1, 1, 1, 2, 2}, + {1, 1, 1, 2, 3}, + {1, 1, 2, 1, 1}, + {1, 1, 2, 2, 1}, + {1, 1, 2, 2, 2}, + {1, 1, 2, 3, 2}, + {1, 2, 1, 1, 1}, + {1, 2, 1, 2, 2}, + {3, 1, 2, 1, 2}, + {1, 3, 2, 3, 2}, + {1, 2, 1, 3, 1}, + {3, 2, 3, 1, 3}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {1, 2, 2, 3, 3}, + {2, 1, 1, 1, 1}, + {2, 1, 1, 2, 2}, + {2, 1, 1, 2, 3}, + {1, 2, 2, 1, 2}, + {2, 1, 2, 2, 3}, + {2, 1, 2, 3, 3}, + {2, 2, 1, 1, 1}, + {2, 2, 1, 1, 2}, + {2, 2, 1, 2, 3}, + {1, 1, 3, 2, 1}, + {2, 2, 2, 1, 1}, + {2, 2, 3, 3, 3}, + {3, 3, 3, 3, 2}, + {2, 2, 2, 2, 3}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixLine80Form4X6TypeA = { + { + type = "Line80Form4X6TypeA", + link_type = 0, + direction = 0, + line_count = 80, + lines = { + {1, 1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4, 4}, + {1, 2, 3, 3, 2, 1}, + {4, 3, 2, 2, 3, 4}, + {2, 3, 4, 4, 3, 2}, + {3, 2, 1, 1, 2, 3}, + {1, 2, 1, 1, 2, 1}, + {4, 3, 4, 4, 3, 4}, + {2, 1, 2, 2, 1, 2}, + {3, 4, 3, 3, 4, 3}, + {2, 3, 2, 2, 3, 2}, + {3, 2, 3, 3, 2, 3}, + {1, 1, 2, 2, 1, 1}, + {4, 4, 3, 3, 4, 4}, + {2, 2, 3, 3, 2, 2}, + {3, 3, 2, 2, 3, 3}, + {3, 3, 4, 4, 3, 3}, + {2, 2, 1, 1, 2, 2}, + {2, 3, 3, 3, 3, 2}, + {3, 2, 2, 2, 2, 3}, + {2, 1, 1, 1, 1, 2}, + {3, 4, 4, 4, 4, 3}, + {4, 3, 3, 3, 3, 4}, + {1, 2, 2, 2, 2, 1}, + {3, 1, 1, 1, 1, 3}, + {2, 4, 4, 4, 4, 2}, + {4, 2, 2, 2, 2, 4}, + {1, 3, 3, 3, 3, 1}, + {3, 3, 1, 1, 3, 3}, + {2, 2, 4, 4, 2, 2}, + {1, 1, 3, 3, 1, 1}, + {4, 4, 2, 2, 4, 4}, + {4, 4, 1, 1, 4, 4}, + {1, 1, 4, 4, 1, 1}, + {4, 3, 2, 1, 1, 1}, + {1, 2, 3, 4, 4, 4}, + {1, 1, 1, 2, 3, 4}, + {4, 4, 4, 3, 2, 1}, + {3, 2, 1, 1, 1, 1}, + {2, 3, 4, 4, 4, 4}, + {1, 1, 1, 1, 2, 3}, + {4, 4, 4, 4, 3, 2}, + {4, 3, 2, 2, 2, 2}, + {1, 2, 3, 3, 3, 3}, + {2, 2, 2, 2, 3, 4}, + {3, 3, 3, 3, 2, 1}, + {2, 4, 1, 1, 4, 2}, + {3, 1, 4, 4, 1, 3}, + {1, 4, 1, 1, 4, 1}, + {4, 1, 4, 4, 1, 4}, + {1, 2, 1, 2, 1, 2}, + {3, 4, 3, 4, 3, 4}, + {2, 3, 2, 3, 2, 3}, + {3, 2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3, 4}, + {2, 1, 2, 1, 2, 1}, + {1, 3, 1, 3, 1, 3}, + {4, 2, 4, 2, 4, 2}, + {2, 4, 2, 4, 2, 4}, + {3, 1, 3, 1, 3, 1}, + {1, 4, 1, 4, 1, 4}, + {4, 1, 4, 1, 4, 1}, + {1, 2, 3, 4, 3, 2}, + {4, 3, 2, 1, 2, 3}, + {2, 3, 4, 3, 2, 1}, + {3, 2, 1, 2, 3, 4}, + {1, 2, 1, 2, 3, 4}, + {4, 3, 4, 3, 2, 1}, + {2, 3, 2, 1, 2, 3}, + {3, 2, 3, 4, 3, 2}, + {1, 4, 4, 4, 4, 1}, + {4, 1, 1, 1, 1, 4}, + {2, 4, 1, 1, 4, 2}, + {3, 1, 4, 4, 1, 3}, + {1, 3, 4, 4, 3, 1}, + {4, 2, 1, 1, 2, 4}, + {2, 4, 1, 4, 1, 3}, + {3, 1, 4, 1, 4, 2}, + }, + form = {4, 4, 4, 4, 4, 4}, + }, +} + +_.MatrixLine80Form7X5TypeA = { + { + type = "Line80Form7X5TypeA", + link_type = 0, + direction = 0, + line_count = 80, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 4, 5, 5}, + {4, 4, 5, 6, 6}, + {5, 5, 6, 7, 7}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {5, 5, 4, 3, 3}, + {6, 6, 5, 4, 4}, + {7, 7, 6, 5, 5}, + {1, 1, 2, 3, 4}, + {2, 2, 3, 4, 5}, + {3, 3, 4, 5, 6}, + {4, 4, 5, 6, 7}, + {7, 7, 6, 5, 4}, + {6, 6, 5, 4, 3}, + {5, 5, 4, 3, 2}, + {4, 4, 3, 2, 1}, + {1, 2, 3, 4, 4}, + {2, 3, 4, 5, 5}, + {3, 4, 5, 6, 6}, + {4, 5, 6, 7, 7}, + {7, 6, 5, 4, 4}, + {6, 5, 4, 3, 3}, + {5, 4, 3, 2, 2}, + {4, 3, 2, 1, 1}, + {1, 2, 3, 4, 3}, + }, + form = {7, 7, 7, 7, 7}, + }, +} + +_.MatrixLine90Form11X5TypeA = { + { + type = "Line90Form11X5TypeA", + link_type = 0, + direction = 0, + line_count = 90, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {8, 8, 8, 8, 8}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {7, 8, 7, 8, 7}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {8, 7, 8, 7, 8}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {6, 7, 8, 7, 6}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {8, 7, 6, 7, 8}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {7, 8, 8, 8, 7}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {8, 7, 7, 7, 8}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {7, 7, 8, 7, 7}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {8, 8, 7, 8, 8}, + {9, 9, 9, 9, 9}, + {8, 9, 8, 9, 8}, + {9, 8, 9, 8, 9}, + {7, 8, 9, 8, 7}, + {9, 8, 7, 8, 9}, + {8, 9, 9, 9, 8}, + {9, 8, 8, 8, 9}, + {8, 8, 9, 8, 8}, + {9, 9, 8, 9, 9}, + {7, 7, 8, 9, 9}, + {10, 10, 10, 10, 10}, + {9, 10, 9, 10, 9}, + {10, 9, 10, 9, 10}, + {8, 9, 10, 9, 8}, + {10, 9, 8, 9, 10}, + {9, 10, 10, 10, 9}, + {10, 9, 9, 9, 10}, + {9, 9, 10, 9, 9}, + {10, 10, 9, 10, 10}, + {8, 8, 9, 10, 10}, + {11, 11, 11, 11, 11}, + {10, 11, 10, 11, 10}, + {11, 10, 11, 10, 11}, + {9, 10, 11, 10, 9}, + {11, 10, 9, 10, 11}, + {10, 11, 11, 11, 10}, + {11, 10, 10, 10, 11}, + {10, 10, 11, 10, 10}, + {11, 11, 10, 11, 11}, + {9, 9, 10, 11, 11}, + }, + form = {11, 11, 11, 11, 11}, + }, +} + +_.MatrixLine95Form8X5TypeA = { + { + type = "Line95Form8X5TypeA", + link_type = 0, + direction = 0, + line_count = 95, + lines = { + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {8, 8, 8, 8, 8}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {7, 8, 8, 8, 7}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {8, 7, 7, 7, 8}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {7, 7, 8, 7, 7}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {8, 8, 7, 8, 8}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {7, 8, 7, 8, 7}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {8, 7, 8, 7, 8}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {6, 7, 8, 7, 6}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {8, 7, 6, 7, 8}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 4, 5, 5}, + {4, 4, 5, 6, 6}, + {5, 5, 6, 7, 7}, + {6, 6, 7, 8, 8}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {5, 5, 4, 3, 3}, + {6, 6, 5, 4, 4}, + {7, 7, 6, 5, 5}, + {8, 8, 7, 6, 6}, + {1, 1, 2, 3, 4}, + {2, 2, 3, 4, 5}, + {3, 3, 4, 5, 6}, + {4, 4, 5, 6, 7}, + {5, 5, 6, 7, 8}, + {8, 8, 7, 6, 5}, + {7, 7, 6, 5, 4}, + {6, 6, 5, 4, 3}, + {5, 5, 4, 3, 2}, + {4, 4, 3, 2, 1}, + {1, 2, 3, 4, 4}, + {2, 3, 4, 5, 5}, + {3, 4, 5, 6, 6}, + {4, 5, 6, 7, 7}, + {5, 6, 7, 8, 8}, + {8, 7, 6, 5, 5}, + {7, 6, 5, 4, 4}, + {6, 5, 4, 3, 3}, + {5, 4, 3, 2, 2}, + {4, 3, 2, 1, 1}, + {1, 2, 3, 4, 3}, + }, + form = {8, 8, 8, 8, 8}, + }, +} + +_.MatrixMatchForm7X7TypeA = { + { + type = "MatchForm7X7", + link_type = 4, + direction = 0, + line_count = 20, + lines = { + {0, 0, 0}, + }, + form = {7, 7, 7, 7, 7, 7, 7}, + }, +} + +_.MatrixSameForm5X6TypeA = { + { + type = "SameForm5X6", + link_type = 3, + direction = 0, + line_count = 20, + lines = { + {0, 0, 0}, + }, + form = {5, 5, 5, 5, 5, 5}, + }, +} + +_.MatrixSameForm5X6TypeB = { + { + type = "SameForm5X6TypeB", + link_type = 3, + direction = 0, + line_count = 25, + lines = { + {0, 0, 0}, + }, + form = {5, 5, 5, 5, 5, 5}, + }, +} + +_.MatrixWaysForm333331 = { + { + type = "WaysForm333331", + link_type = 1, + direction = 0, + line_count = 100, + lines = { + {0, 0, 0}, + }, + form = {3, 3, 3, 3, 3, 1}, + }, +} + +_.MatrixWaysForm33555 = { + { + type = "WaysForm33555", + link_type = 1, + direction = 0, + line_count = 100, + lines = { + {0, 0, 0}, + }, + form = {3, 3, 5, 5, 5}, + }, +} + +_.MatrixWaysForm344444 = { + { + type = "WaysForm344444", + link_type = 1, + direction = 0, + line_count = 100, + lines = { + {0, 0, 0}, + }, + form = {3, 4, 4, 4, 4, 4}, + }, +} + +_.MatrixWaysForm3X5TypeA = { + { + type = "WaysForm3X5TypeA", + link_type = 1, + direction = 0, + line_count = 100, + lines = { + {0, 0, 0}, + }, + form = {3, 3, 3, 3, 3}, + }, +} + +_.MatrixWaysForm44668 = { + { + type = "WaysForm44668", + link_type = 1, + direction = 0, + line_count = 100, + lines = { + {0, 0, 0}, + }, + form = {4, 4, 6, 6, 8}, + }, +} + +_.MatrixWaysForm4X5TypeA = { + { + type = "WaysForm4X5TypeA", + link_type = 1, + direction = 0, + line_count = 100, + lines = { + {0, 0, 0}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +_.MatrixWaysForm4X5TypeB = { + { + type = "WaysForm4X5TypeB", + link_type = 1, + direction = 0, + line_count = 60, + lines = { + {0, 0, 0}, + }, + form = {4, 4, 4, 4, 4}, + }, +} + +return _ \ No newline at end of file diff --git a/gamesrv/slotspkg/external/Client_Config/Config/base/PrizeModel.lua b/gamesrv/slotspkg/external/Client_Config/Config/base/PrizeModel.lua new file mode 100644 index 0000000..07ce268 --- /dev/null +++ b/gamesrv/slotspkg/external/Client_Config/Config/base/PrizeModel.lua @@ -0,0 +1,52 @@ +-- +local _ = {} + +_.PrizeModelPrizeModelTypeA = { + [1] = { + id = 1, + ani_type = "big_win", + min_multiple = 10, + max_multiple = 25, + }, + [2] = { + id = 2, + ani_type = "mega_win", + min_multiple = 25, + max_multiple = 50, + }, + [3] = { + id = 3, + ani_type = "epic_win", + min_multiple = 50, + max_multiple = -1, + }, +} + +_.PrizeModelPrizeModelTypeB = { + [1] = { + id = 1, + ani_type = "big_win", + min_multiple = 15, + max_multiple = 30, + }, + [2] = { + id = 2, + ani_type = "mega_win", + min_multiple = 30, + max_multiple = 45, + }, + [3] = { + id = 3, + ani_type = "epic_win", + min_multiple = 45, + max_multiple = 60, + }, + [4] = { + id = 4, + ani_type = "epic_win", + min_multiple = 60, + max_multiple = -1, + }, +} + +return _ \ No newline at end of file diff --git a/gamesrv/slotspkg/external/ExportGoConfig.bat b/gamesrv/slotspkg/external/ExportGoConfig.bat new file mode 100644 index 0000000..7702846 --- /dev/null +++ b/gamesrv/slotspkg/external/ExportGoConfig.bat @@ -0,0 +1,14 @@ +@echo off +if exist "external" (cd external) + +if not exist converter.exe ( + echo Building converter... + go build -o converter.exe ../tools/converter +) else ( + echo converter.exe already exists. +) + +converter.exe go /excel ../internal/exported/excel2go .. +echo Done. +pause +exit \ No newline at end of file diff --git a/gamesrv/slotspkg/external/README.md b/gamesrv/slotspkg/external/README.md new file mode 100644 index 0000000..983125a --- /dev/null +++ b/gamesrv/slotspkg/external/README.md @@ -0,0 +1,3 @@ +# external + +### 后续需要移植出去,暂时放这里 \ No newline at end of file diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm15X1TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm15X1TypeA.xlsx new file mode 100644 index 0000000..55ca9cc Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm15X1TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm19X1TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm19X1TypeA.xlsx new file mode 100644 index 0000000..6e83d45 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm19X1TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm20X1TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm20X1TypeA.xlsx new file mode 100644 index 0000000..0df7af8 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm20X1TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm25X1TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm25X1TypeA.xlsx new file mode 100644 index 0000000..868c406 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm25X1TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm30X1TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm30X1TypeA.xlsx new file mode 100644 index 0000000..8cec2c8 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm30X1TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm35X1TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm35X1TypeA.xlsx new file mode 100644 index 0000000..e98709e Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm35X1TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm40X1.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm40X1.xlsx new file mode 100644 index 0000000..7cfdd6f Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm40X1.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm40X1TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm40X1TypeA.xlsx new file mode 100644 index 0000000..7cfdd6f Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm40X1TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm7X1TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm7X1TypeA.xlsx new file mode 100644 index 0000000..5edc43f Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/FeaturesForm7X1TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line100Form12X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line100Form12X5TypeA.xlsx new file mode 100644 index 0000000..9690932 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line100Form12X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line100Form6X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line100Form6X5TypeA.xlsx new file mode 100644 index 0000000..7d702c5 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line100Form6X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line10Form343TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line10Form343TypeA.xlsx new file mode 100644 index 0000000..4722f96 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line10Form343TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line10Form3X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line10Form3X5TypeA.xlsx new file mode 100644 index 0000000..6862daf Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line10Form3X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line1Form3X3TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line1Form3X3TypeA.xlsx new file mode 100644 index 0000000..28023f5 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line1Form3X3TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line1Form3X3TypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line1Form3X3TypeB.xlsx new file mode 100644 index 0000000..545d827 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line1Form3X3TypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line1Form5X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line1Form5X5TypeA.xlsx new file mode 100644 index 0000000..bd06e17 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line1Form5X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line20Form3X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line20Form3X5TypeA.xlsx new file mode 100644 index 0000000..68ec80b Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line20Form3X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form36666TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form36666TypeA.xlsx new file mode 100644 index 0000000..1f2bc22 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form36666TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeA.xlsx new file mode 100644 index 0000000..cbf57fb Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeB.xlsx new file mode 100644 index 0000000..e295781 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeC.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeC.xlsx new file mode 100644 index 0000000..fd0f29a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeC.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeD.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeD.xlsx new file mode 100644 index 0000000..52bab9d Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeD.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeE.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeE.xlsx new file mode 100644 index 0000000..6dba012 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line25Form3X5TypeE.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeA.xlsx new file mode 100644 index 0000000..c3ebf64 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeB.xlsx new file mode 100644 index 0000000..215a592 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeC.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeC.xlsx new file mode 100644 index 0000000..68445ac Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeC.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeD.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeD.xlsx new file mode 100644 index 0000000..2c5af92 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeD.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeE.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeE.xlsx new file mode 100644 index 0000000..f93024a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X5TypeE.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X6TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X6TypeA.xlsx new file mode 100644 index 0000000..f43d405 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form3X6TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form4X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form4X5TypeA.xlsx new file mode 100644 index 0000000..459cddc Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form4X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form4X5TypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form4X5TypeB.xlsx new file mode 100644 index 0000000..a1a2e7e Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line30Form4X5TypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line3Form3X3TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line3Form3X3TypeA.xlsx new file mode 100644 index 0000000..8eb14d1 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line3Form3X3TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form34543TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form34543TypeA.xlsx new file mode 100644 index 0000000..67a4cdf Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form34543TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form3X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form3X5TypeA.xlsx new file mode 100644 index 0000000..e2c98f3 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form3X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form3X5TypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form3X5TypeB.xlsx new file mode 100644 index 0000000..f70b47b Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form3X5TypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form3X5TypeC.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form3X5TypeC.xlsx new file mode 100644 index 0000000..ff7a7b4 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form3X5TypeC.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form3X5TypeD.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form3X5TypeD.xlsx new file mode 100644 index 0000000..d828eab Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form3X5TypeD.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form4X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form4X5TypeA.xlsx new file mode 100644 index 0000000..564827d Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form4X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form4X5TypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form4X5TypeB.xlsx new file mode 100644 index 0000000..c8267ab Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form4X5TypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form4X5TypeC.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form4X5TypeC.xlsx new file mode 100644 index 0000000..dcfe1b8 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form4X5TypeC.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form4X6TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form4X6TypeA.xlsx new file mode 100644 index 0000000..8f90473 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line40Form4X6TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeA.xlsx new file mode 100644 index 0000000..117b471 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeB.xlsx new file mode 100644 index 0000000..b2fe685 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeC.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeC.xlsx new file mode 100644 index 0000000..fb743d3 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeC.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeD.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeD.xlsx new file mode 100644 index 0000000..ea19aad Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeD.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeE.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeE.xlsx new file mode 100644 index 0000000..532863d Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeE.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeF.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeF.xlsx new file mode 100644 index 0000000..b40e710 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeF.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeG.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeG.xlsx new file mode 100644 index 0000000..9eb33c3 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeG.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeH.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeH.xlsx new file mode 100644 index 0000000..f8cb717 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form3X5TypeH.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form45454TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form45454TypeA.xlsx new file mode 100644 index 0000000..aa07513 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form45454TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeA.xlsx new file mode 100644 index 0000000..b4794e1 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeB.xlsx new file mode 100644 index 0000000..3000269 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeC.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeC.xlsx new file mode 100644 index 0000000..beeddb3 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeC.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeD.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeD.xlsx new file mode 100644 index 0000000..c3cbafd Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeD.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeE.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeE.xlsx new file mode 100644 index 0000000..3a6383d Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeE.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeF.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeF.xlsx new file mode 100644 index 0000000..6124f49 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X5TypeF.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X6TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X6TypeA.xlsx new file mode 100644 index 0000000..fbb3ca5 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form4X6TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form5X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form5X5TypeA.xlsx new file mode 100644 index 0000000..8b0ebe4 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form5X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form5X5TypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form5X5TypeB.xlsx new file mode 100644 index 0000000..9be533c Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form5X5TypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form5X5TypeC.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form5X5TypeC.xlsx new file mode 100644 index 0000000..5a9ac39 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form5X5TypeC.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form6X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form6X5TypeA.xlsx new file mode 100644 index 0000000..1cdb958 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line50Form6X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line5Form3X3TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line5Form3X3TypeA.xlsx new file mode 100644 index 0000000..b793aa6 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line5Form3X3TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line5Form3X3TypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line5Form3X3TypeB.xlsx new file mode 100644 index 0000000..b5919eb Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line5Form3X3TypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line60Form33633TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line60Form33633TypeA.xlsx new file mode 100644 index 0000000..21f47e3 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line60Form33633TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line60Form8X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line60Form8X5TypeA.xlsx new file mode 100644 index 0000000..6c587a1 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line60Form8X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line65Form6X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line65Form6X5TypeA.xlsx new file mode 100644 index 0000000..f8a0e40 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line65Form6X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line70Form9X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line70Form9X5TypeA.xlsx new file mode 100644 index 0000000..2ab11cf Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line70Form9X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line75Form5X6TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line75Form5X6TypeA.xlsx new file mode 100644 index 0000000..55eb9c5 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line75Form5X6TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line75Form6X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line75Form6X5TypeA.xlsx new file mode 100644 index 0000000..2123331 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line75Form6X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line80Form10X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line80Form10X5TypeA.xlsx new file mode 100644 index 0000000..a244ecb Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line80Form10X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line80Form3X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line80Form3X5TypeA.xlsx new file mode 100644 index 0000000..0463f2e Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line80Form3X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line80Form4X6TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line80Form4X6TypeA.xlsx new file mode 100644 index 0000000..db62837 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line80Form4X6TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line80Form7X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line80Form7X5TypeA.xlsx new file mode 100644 index 0000000..e139493 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line80Form7X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line90Form11X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line90Form11X5TypeA.xlsx new file mode 100644 index 0000000..6b60488 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line90Form11X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line95Form8X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line95Form8X5TypeA.xlsx new file mode 100644 index 0000000..6202bad Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/Line95Form8X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/MatchForm7X7TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/MatchForm7X7TypeA.xlsx new file mode 100644 index 0000000..97231f4 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/MatchForm7X7TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/SameForm5X6TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/SameForm5X6TypeA.xlsx new file mode 100644 index 0000000..96d4514 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/SameForm5X6TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/SameForm5X6TypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/SameForm5X6TypeB.xlsx new file mode 100644 index 0000000..b49a5a1 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/SameForm5X6TypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm333331.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm333331.xlsx new file mode 100644 index 0000000..ca6ba5d Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm333331.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm33555.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm33555.xlsx new file mode 100644 index 0000000..f323e05 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm33555.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm344444.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm344444.xlsx new file mode 100644 index 0000000..de73d94 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm344444.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm3X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm3X5TypeA.xlsx new file mode 100644 index 0000000..18cb62c Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm3X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm44668.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm44668.xlsx new file mode 100644 index 0000000..add5c35 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm44668.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm4X5TypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm4X5TypeA.xlsx new file mode 100644 index 0000000..e5790d5 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm4X5TypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm4X5TypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm4X5TypeB.xlsx new file mode 100644 index 0000000..add4d90 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/Matrix/WaysForm4X5TypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/PrizeModel/PrizeModelTypeA.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/PrizeModel/PrizeModelTypeA.xlsx new file mode 100644 index 0000000..d30b017 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/PrizeModel/PrizeModelTypeA.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Link/PrizeModel/PrizeModelTypeB.xlsx b/gamesrv/slotspkg/external/excel/Base/Link/PrizeModel/PrizeModelTypeB.xlsx new file mode 100644 index 0000000..18fb28c Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Link/PrizeModel/PrizeModelTypeB.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/OptHall/S_OptGroup.xlsx b/gamesrv/slotspkg/external/excel/Base/OptHall/S_OptGroup.xlsx new file mode 100644 index 0000000..cd9a456 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/OptHall/S_OptGroup.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Bet.xlsx new file mode 100644 index 0000000..96f997a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_MidItemInfo.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_MidItemInfo.xlsx new file mode 100644 index 0000000..efcd448 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_MidItemInfo.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_Others.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_Others.xlsx new file mode 100644 index 0000000..5b4fc4f Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_Others.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_RandomItem.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_RandomItem.xlsx new file mode 100644 index 0000000..d1c40fd Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_RandomItem.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_RandomMid.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_RandomMid.xlsx new file mode 100644 index 0000000..75e061b Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_RandomMid.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_WinItem.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_WinItem.xlsx new file mode 100644 index 0000000..8a6330c Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_WinItem.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_WinMid.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_WinMid.xlsx new file mode 100644 index 0000000..7748fb2 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_WinMid.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/Formation.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/Formation.xlsx new file mode 100644 index 0000000..76858bc Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/Formation.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/ReelBaseSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/ReelBaseSpin.xlsx new file mode 100644 index 0000000..1eb62b8 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/ReelBaseSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/S_Map.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/S_Map.xlsx new file mode 100644 index 0000000..49abd74 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/S_Map.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/Symbol.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/Symbol.xlsx new file mode 100644 index 0000000..67990f3 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/Symbol.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Settings.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Settings.xlsx new file mode 100644 index 0000000..bcdc7b3 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Settings.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Bet.xlsx new file mode 100644 index 0000000..f5c9db6 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Feature/S_BaseMultiplier.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Feature/S_BaseMultiplier.xlsx new file mode 100644 index 0000000..3a9ba33 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Feature/S_BaseMultiplier.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Feature/S_FreeMultiplier.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Feature/S_FreeMultiplier.xlsx new file mode 100644 index 0000000..26d212a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Feature/S_FreeMultiplier.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Feature/S_FreeMultiplierCount.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Feature/S_FreeMultiplierCount.xlsx new file mode 100644 index 0000000..49c5d9a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Feature/S_FreeMultiplierCount.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Feature/S_Others.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Feature/S_Others.xlsx new file mode 100644 index 0000000..9d41b60 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Feature/S_Others.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/Formation.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/Formation.xlsx new file mode 100644 index 0000000..066a4b5 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/Formation.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/ReelBaseSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/ReelBaseSpin.xlsx new file mode 100644 index 0000000..aa448e0 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/ReelBaseSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/ReelFreeSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/ReelFreeSpin.xlsx new file mode 100644 index 0000000..6fee26b Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/ReelFreeSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/S_Map.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/S_Map.xlsx new file mode 100644 index 0000000..49abd74 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/S_Map.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/S_ReelSureWinBaseSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/S_ReelSureWinBaseSpin.xlsx new file mode 100644 index 0000000..91356d3 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/S_ReelSureWinBaseSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/S_ReelSureWinFreeSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/S_ReelSureWinFreeSpin.xlsx new file mode 100644 index 0000000..12e971b Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/S_ReelSureWinFreeSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/Symbol.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/Symbol.xlsx new file mode 100644 index 0000000..05c8ab7 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/Symbol.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Settings.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Settings.xlsx new file mode 100644 index 0000000..376290d Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Settings.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Bet.xlsx new file mode 100644 index 0000000..f5c9db6 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Feature/S_Others.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Feature/S_Others.xlsx new file mode 100644 index 0000000..5f4ce66 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Feature/S_Others.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Feature/S_SuperStack.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Feature/S_SuperStack.xlsx new file mode 100644 index 0000000..c12164c Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Feature/S_SuperStack.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/Formation.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/Formation.xlsx new file mode 100644 index 0000000..86f730d Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/Formation.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/ReelBaseSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/ReelBaseSpin.xlsx new file mode 100644 index 0000000..dd3ff3b Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/ReelBaseSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/ReelReSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/ReelReSpin.xlsx new file mode 100644 index 0000000..8a727a5 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/ReelReSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/S_Map.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/S_Map.xlsx new file mode 100644 index 0000000..49abd74 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/S_Map.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/Symbol.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/Symbol.xlsx new file mode 100644 index 0000000..229350b Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Generic/Symbol.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Settings.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Settings.xlsx new file mode 100644 index 0000000..7a517f2 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Settings.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Bet.xlsx new file mode 100644 index 0000000..96f997a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Feature/S_Others.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Feature/S_Others.xlsx new file mode 100644 index 0000000..15b5729 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Feature/S_Others.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Feature/S_SuperStack1.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Feature/S_SuperStack1.xlsx new file mode 100644 index 0000000..0f2e52e Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Feature/S_SuperStack1.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Feature/S_SuperStack2.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Feature/S_SuperStack2.xlsx new file mode 100644 index 0000000..88b8ea7 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Feature/S_SuperStack2.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/Formation.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/Formation.xlsx new file mode 100644 index 0000000..559d3c2 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/Formation.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/ReelBaseSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/ReelBaseSpin.xlsx new file mode 100644 index 0000000..98a7ebd Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/ReelBaseSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/ReelReSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/ReelReSpin.xlsx new file mode 100644 index 0000000..f70c011 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/ReelReSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/S_Map.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/S_Map.xlsx new file mode 100644 index 0000000..49abd74 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/S_Map.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/Symbol.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/Symbol.xlsx new file mode 100644 index 0000000..99436c7 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Generic/Symbol.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Settings.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Settings.xlsx new file mode 100644 index 0000000..7dff454 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Settings.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Bet.xlsx new file mode 100644 index 0000000..96f997a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Feature/CashPrizeWeight.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Feature/CashPrizeWeight.xlsx new file mode 100644 index 0000000..d5f2be8 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Feature/CashPrizeWeight.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Feature/S_ForceCashCountWeight.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Feature/S_ForceCashCountWeight.xlsx new file mode 100644 index 0000000..c7fb51b Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Feature/S_ForceCashCountWeight.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Feature/S_Others.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Feature/S_Others.xlsx new file mode 100644 index 0000000..dbda08f Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Feature/S_Others.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/Formation.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/Formation.xlsx new file mode 100644 index 0000000..175a45c Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/Formation.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/ReelBaseSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/ReelBaseSpin.xlsx new file mode 100644 index 0000000..74dbc7e Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/ReelBaseSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/ReelFreeSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/ReelFreeSpin.xlsx new file mode 100644 index 0000000..0441520 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/ReelFreeSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/S_Map.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/S_Map.xlsx new file mode 100644 index 0000000..faa5982 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/S_Map.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/Symbol.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/Symbol.xlsx new file mode 100644 index 0000000..ad8e8b0 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Generic/Symbol.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Settings.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Settings.xlsx new file mode 100644 index 0000000..eda0ee5 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Settings.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Bet.xlsx new file mode 100644 index 0000000..f5c9db6 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Feature/S_Others.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Feature/S_Others.xlsx new file mode 100644 index 0000000..b570564 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Feature/S_Others.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Feature/S_SuperStack.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Feature/S_SuperStack.xlsx new file mode 100644 index 0000000..6dfe4c2 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Feature/S_SuperStack.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/Formation.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/Formation.xlsx new file mode 100644 index 0000000..7bb4940 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/Formation.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/ReelBaseSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/ReelBaseSpin.xlsx new file mode 100644 index 0000000..26d4221 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/ReelBaseSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/ReelReSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/ReelReSpin.xlsx new file mode 100644 index 0000000..93b4919 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/ReelReSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/S_Map.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/S_Map.xlsx new file mode 100644 index 0000000..49abd74 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/S_Map.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/Symbol.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/Symbol.xlsx new file mode 100644 index 0000000..f837084 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/Symbol.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Settings.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Settings.xlsx new file mode 100644 index 0000000..72ea38a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Settings.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Bet.xlsx new file mode 100644 index 0000000..8af9ed4 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/Multiplier.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/Multiplier.xlsx new file mode 100644 index 0000000..31bd28b Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/Multiplier.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/S_ReelChoose.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/S_ReelChoose.xlsx new file mode 100644 index 0000000..59e9819 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/S_ReelChoose.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/Scatter.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/Scatter.xlsx new file mode 100644 index 0000000..b67124f Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/Scatter.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/Formation.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/Formation.xlsx new file mode 100644 index 0000000..e674d7b Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/Formation.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin.xlsx new file mode 100644 index 0000000..35ec79a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin1.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin1.xlsx new file mode 100644 index 0000000..c54dbc2 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin1.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin2.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin2.xlsx new file mode 100644 index 0000000..aa0b3e2 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin2.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin3.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin3.xlsx new file mode 100644 index 0000000..59930bd Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin3.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin7.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin7.xlsx new file mode 100644 index 0000000..fb87571 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin7.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin8.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin8.xlsx new file mode 100644 index 0000000..db126a2 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin8.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin.xlsx new file mode 100644 index 0000000..ccb274e Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin4.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin4.xlsx new file mode 100644 index 0000000..add7877 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin4.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin5.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin5.xlsx new file mode 100644 index 0000000..f20b84a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin5.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/S_Map.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/S_Map.xlsx new file mode 100644 index 0000000..49abd74 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/S_Map.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/Symbol.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/Symbol.xlsx new file mode 100644 index 0000000..f12c84e Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/Symbol.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Settings.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Settings.xlsx new file mode 100644 index 0000000..a31818e Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Settings.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/Test/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Bet.xlsx new file mode 100644 index 0000000..96f997a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/Test/Feature/S_Random.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Feature/S_Random.xlsx new file mode 100644 index 0000000..2bcd2d1 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Feature/S_Random.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/Test/Generic/Formation.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Generic/Formation.xlsx new file mode 100644 index 0000000..2619862 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Generic/Formation.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/Test/Generic/ReelBaseSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Generic/ReelBaseSpin.xlsx new file mode 100644 index 0000000..385740a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Generic/ReelBaseSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/Test/Generic/S_Map.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Generic/S_Map.xlsx new file mode 100644 index 0000000..49abd74 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Generic/S_Map.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/Test/Generic/Symbol.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Generic/Symbol.xlsx new file mode 100644 index 0000000..501fb17 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Generic/Symbol.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/Test/Settings.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Settings.xlsx new file mode 100644 index 0000000..569e89b Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/Test/Settings.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/System/S_Simulator.xlsx b/gamesrv/slotspkg/external/excel/Base/System/S_Simulator.xlsx new file mode 100644 index 0000000..e86a0e3 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/System/S_Simulator.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1000_Map.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1000_Map.xlsx new file mode 100644 index 0000000..b7da449 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1000_Map.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1001_BetSize.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1001_BetSize.xlsx new file mode 100644 index 0000000..19fa726 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1001_BetSize.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1002_BetLevel.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1002_BetLevel.xlsx new file mode 100644 index 0000000..c6a2161 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1002_BetLevel.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1003_BetLine.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1003_BetLine.xlsx new file mode 100644 index 0000000..1e44ec7 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1003_BetLine.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1004_BetChangeList.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1004_BetChangeList.xlsx new file mode 100644 index 0000000..af182da Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1004_BetChangeList.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1005_Scatter.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1005_Scatter.xlsx new file mode 100644 index 0000000..a86b826 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1005_Scatter.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1006_Symbol.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1006_Symbol.xlsx new file mode 100644 index 0000000..fee9bc5 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1006_Symbol.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1007_Matrix.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1007_Matrix.xlsx new file mode 100644 index 0000000..020be88 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1007_Matrix.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1008_Formation.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1008_Formation.xlsx new file mode 100644 index 0000000..08ec7c0 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1008_Formation.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1009_Jackpot.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1009_Jackpot.xlsx new file mode 100644 index 0000000..adb554e Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1009_Jackpot.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1010_SuperStack.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1010_SuperStack.xlsx new file mode 100644 index 0000000..d32197a Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1010_SuperStack.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1012_PrizeModel.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1012_PrizeModel.xlsx new file mode 100644 index 0000000..49f958b Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1012_PrizeModel.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1013_OptAuthenticate.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1013_OptAuthenticate.xlsx new file mode 100644 index 0000000..9c42896 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1013_OptAuthenticate.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1014_Vector.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1014_Vector.xlsx new file mode 100644 index 0000000..d5ee562 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1014_Vector.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1015_Text.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1015_Text.xlsx new file mode 100644 index 0000000..23d134f Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1015_Text.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1016_FirstBet.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1016_FirstBet.xlsx new file mode 100644 index 0000000..9d074c1 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Template/1016_FirstBet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Settings.xlsx b/gamesrv/slotspkg/external/excel/Settings.xlsx new file mode 100644 index 0000000..3e6ee1d Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Settings.xlsx differ diff --git a/gamesrv/slotspkg/external/excel2lua.bat b/gamesrv/slotspkg/external/excel2lua.bat new file mode 100644 index 0000000..65755ca --- /dev/null +++ b/gamesrv/slotspkg/external/excel2lua.bat @@ -0,0 +1,2 @@ +converter.exe lua ./excel ./Client_Config/Config .. +pause \ No newline at end of file diff --git a/gamesrv/slotspkg/internal/dao/dataset/a_debug.go b/gamesrv/slotspkg/internal/dao/dataset/a_debug.go new file mode 100644 index 0000000..d01e648 --- /dev/null +++ b/gamesrv/slotspkg/internal/dao/dataset/a_debug.go @@ -0,0 +1,31 @@ +//go:build debug +// +build debug + +package dataset + +import ( + "encoding/json" + "os" + "path/filepath" + "qstar_server/internal/exported/excel2go/storage" + "qstar_server/internal/generic/global" +) + +func init() { + path := filepath.Join(global.LogDirectory, "go2json.data") + if _, err := os.Stat(path); err == nil { + data, err := os.ReadFile(path) + if err != nil { + panic(err) + } + + var dataMap = map[string]string{} + if err := json.Unmarshal(data, &dataMap); err != nil { + panic(err) + } + + storage.StoragesLoading(dataMap) + } else { + panic(err) + } +} diff --git a/gamesrv/slotspkg/internal/dao/dataset/dataset.go b/gamesrv/slotspkg/internal/dao/dataset/dataset.go new file mode 100644 index 0000000..305887d --- /dev/null +++ b/gamesrv/slotspkg/internal/dao/dataset/dataset.go @@ -0,0 +1,220 @@ +package dataset + +import ( + "github.com/mohae/deepcopy" + "github.com/tomas-qstarrs/boost/cast" + "github.com/tomas-qstarrs/boost/stringx" + "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/storage" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "strconv" + "strings" +) + +type SubStorage = map[string]map[string]interface{} +type Storage = map[string]SubStorage + +func init() { + Load(nil) +} + +func Load(configMap map[string]string) { + if configMap != nil { + storage.StoragesLoading(configMap) + } + storage.StoragesMapping() + storage.LinksMapping() + storage.CategoriesMapping() +} + +func Duplicate() Storage { + return deepcopy.Copy(storage.Storage).(Storage) +} + +func DuplicateOrigin() Storage { + return deepcopy.Copy(storage.OriginStorage).(Storage) +} + +type ( + // DataSet is the type of group data + DataSet struct { + Category string + SubStorage SubStorage + } +) + +// Base returns Base data for data that cannot be group by +func Base() *DataSet { + return NewDataset(key.Base, storage.Storage) +} + +// NewDataset returns data set by player platform & Group +func NewDataset(category string, storage Storage) *DataSet { + subStorage, ok := storage[category] + if !ok { + subStorage, ok = storage[key.Base] + if !ok { + panic(errors.ConfigCategoryNotFound.ErrorWith(category)) + } + } + ds := &DataSet{ + Category: category, + SubStorage: subStorage, + } + return ds +} + +// getSheet gets sheet config data by path & sheet +func (ds *DataSet) getSheet(path string, sheet string) (interface{}, error) { + excel, ok := ds.SubStorage[path] + if !ok { + return nil, errors.ConfigExcelNotFound.Origin() + } + v, ok := excel[sheet] + if !ok { + return nil, errors.ConfigSheetNotFound.Origin() + } + return v, nil +} + +func (ds *DataSet) ExistSheet(path string, sheet string) bool { + _, err := ds.getSheet(path, sheet) + return err == nil +} + +// GetSheet gets sheet config data by path & sheet +func (ds *DataSet) GetSheet(path string, sheet string) interface{} { + v, err := ds.getSheet(path, sheet) + if err != nil { + panic(errors.ConfigSheetNotFound.ErrorWith(path, sheet)) + } + return v +} + +// GetDefaultSheet gets default sheet config data by path & sheet +func (ds *DataSet) GetDefaultSheet(path string) interface{} { + v, err := ds.getSheet(path, key.Default) + if err != nil { + panic(errors.ConfigSheetNotFound.ErrorWith(path, key.Default)) + } + return v +} + +// GetKeySheet gets sheet config data by path & key sheet +func (ds *DataSet) GetKeySheet(path string, originSheet string, keyName interface{}) interface{} { + sheet := stringx.Merge(originSheet, "/", cast.ToString(keyName)) + v, err := ds.getSheet(path, sheet) + if err != nil { + panic(errors.ConfigSheetNotFound.ErrorWith(path, keyName)) + } + return v +} + +// GetDefaultKeySheet gets default sheet config data by path & key sheet +func (ds *DataSet) GetDefaultKeySheet(path string, keyName interface{}) interface{} { + sheet := stringx.Merge(key.Default, "/", cast.ToString(keyName)) + v, err := ds.getSheet(path, sheet) + if err != nil { + panic(errors.ConfigSheetNotFound.ErrorWith(path, keyName)) + } + return v +} + +func (ds *DataSet) ExistMachineSheet(dir string, excel string, originSheet string, class int64) bool { + path := stringx.Merge(dir, "/", excel) + sheet := stringx.Merge(originSheet, "/", strconv.FormatInt(class, 10)) + if _, err := ds.getSheet(path, sheet); err == nil { + return true + } + sheet = originSheet + if _, err := ds.getSheet(path, sheet); err == nil { + return true + } + return false +} + +// GetMachineSheet returns machine sheet config by class +func (ds *DataSet) GetMachineSheet(dir string, excel string, originSheet string, class int64) interface{} { + path := stringx.Merge(dir, "/", excel) + sheet := stringx.Merge(originSheet, "/", strconv.FormatInt(class, 10)) + if v, err := ds.getSheet(path, sheet); err == nil { + return v + } + sheet = originSheet + if v, err := ds.getSheet(path, sheet); err == nil { + return v + } else { + panic(errors.ConfigSheetNotFound.ErrorWith(dir, excel, class)) + } +} + +// GetMachineDefaultSheet returns machine sheet config by class +func (ds *DataSet) GetMachineDefaultSheet(dir string, excel string, class int64) interface{} { + path := stringx.Merge(dir, "/", excel) + sheet := stringx.Merge(key.Default, "/", strconv.FormatInt(class, 10)) + if v, err := ds.getSheet(path, sheet); err == nil { + return v + } + sheet = key.Default + if v, err := ds.getSheet(path, sheet); err == nil { + return v + } else { + panic(errors.ConfigSheetNotFound.ErrorWith(dir, excel, class)) + } +} + +// GetMachineKeySheet returns machine key sheet config by class +func (ds *DataSet) GetMachineKeySheet(dir string, excel string, originSheet string, class int64, keyName interface{}) interface{} { + path := stringx.Merge(dir, "/", excel) + sheet := stringx.Merge(originSheet, "/", strconv.FormatInt(class, 10), "/", cast.ToString(keyName)) + if v, err := ds.getSheet(path, sheet); err == nil { + return v + } + sheet = stringx.Merge(originSheet, "/", cast.ToString(keyName)) + if v, err := ds.getSheet(path, sheet); err == nil { + return v + } else { + panic(err) + } +} + +// GetMachineDefaultKeySheet returns machine key sheet config by class +func (ds *DataSet) GetMachineDefaultKeySheet(dir string, excel string, class int64, keyName interface{}) interface{} { + path := stringx.Merge(dir, "/", excel) + sheet := stringx.Merge(key.Default, "/", strconv.FormatInt(class, 10), "/", cast.ToString(keyName)) + if v, err := ds.getSheet(path, sheet); err == nil { + return v + } + sheet = stringx.Merge(key.Default, "/", cast.ToString(keyName)) + if v, err := ds.getSheet(path, sheet); err == nil { + return v + } else { + panic(err) + } +} + +// GetMachineExcel returns machine excel config by class +func (ds *DataSet) GetMachineExcel(dir string, excel string, class int64) map[string]interface{} { + path := stringx.Merge(dir, "/", excel) + excelData, ok := ds.SubStorage[path] + if !ok { + panic(errors.ConfigExcelNotFound.ErrorWith(path)) + } + finalExcelList := make(map[string]interface{}) + for sheet, sheetData := range excelData { + parts := strings.Split(sheet, "/") + + if len(parts) == 1 { + if _, ok := finalExcelList[parts[0]]; !ok { + finalExcelList[parts[0]] = sheetData + } + } else if n, err := strconv.ParseInt(parts[1], 10, 64); err == nil { + if n == class { + finalExcelList[parts[0]] = sheetData + } + } else { + panic(errors.ConfigSheetNotFound.ErrorWith(path, sheet)) + } + } + return finalExcelList +} diff --git a/gamesrv/slotspkg/internal/dao/struct/struct.go b/gamesrv/slotspkg/internal/dao/struct/struct.go new file mode 100644 index 0000000..e284ef4 --- /dev/null +++ b/gamesrv/slotspkg/internal/dao/struct/struct.go @@ -0,0 +1,38 @@ +package _struct + +type EnterReq struct { + TraceId string `form:"tid"` + ThirdName string `json:"tn"` + OperatorPlayerSession string `json:"ops"` + GameId int64 `json:"gid"` + Ts int64 `json:"ts"` + IsSimulator bool `json:"is,optional"` +} +type BetConfig struct { + BetChangeList []float64 `json:"bcl"` + BetSize []float64 `json:"bs"` //单注 + BetLevel []int64 `json:"bl"` //下注线数 + BetLines []int64 `json:"bi"` //可选线数 + BetType int `json:"bt"` //total计算方式 1.显示成Lines betSize*betLevel*lines (lines) + BetSizeIndex int64 `json:"bsi"` //选中的单注下标 + BetLevelIndex int64 `json:"bli"` //选中的等级下标 + BetLineIndex int64 `json:"bii"` //选中的线数下标 +} +type TableInfo struct { + Coin float64 `json:"c"` + BetConfig BetConfig `json:"bc"` +} +type EnterResp struct { + TableInfo TableInfo `json:"ti"` + Token string `json:"token"` +} +type SpinReq struct { + TraceId string `form:"tid"` + GameId int64 `json:"gid"` + BetSizeIndex int64 `json:"bsi"` //选中的单注下标 + BetLevelIndex int64 `json:"bli"` //选中的等级下标 + BetLineIndex int64 `json:"bii"` //选中的线数下标 + Platform string `json:"plf"` + BetMode int64 `json:"bm,optional"` //0.常规 1.必中 + Ts int64 `json:"ts"` +} diff --git a/gamesrv/slotspkg/internal/dao/thinkingdata/filter.go b/gamesrv/slotspkg/internal/dao/thinkingdata/filter.go new file mode 100644 index 0000000..9021f48 --- /dev/null +++ b/gamesrv/slotspkg/internal/dao/thinkingdata/filter.go @@ -0,0 +1,69 @@ +package thinkingdata + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "reflect" + "strings" + + "github.com/tomas-qstarrs/boost/mathx" +) + +var playReasons = []string{ + key.ReasonSlotsBet, + key.ReasonSlotsWin, + key.ReasonAirplaneSettle, + key.ReasonAirplaneJump, + key.ReasonAirplaneBet, + key.ReasonMinesSettle, + key.ReasonLuckyWheelBet, + key.ReasonLuckyWheelWin, + key.ReasonPlinkoBet, + key.ReasonPlinkoWin, +} + +func filterEvent(ctx *shared.LogContext, typ string, body interface{}) bool { + if reflect.TypeOf(body).Kind() == reflect.Pointer { + body = reflect.ValueOf(body).Elem().Interface() + } + + switch body := body.(type) { + //case CoinChangeSettle, CoinChangeBet, MinesOpen: + // return true + // + //case SlotsPlay, LuckyWheelSettle, MinesBet, MinesSettle, PlinkoSettle: + // if (ctx.GetSrv().GetSessionBranch() == key.BranchBlaze.Val() || ctx.GetSrv().GetSessionBranch() == key.BranchBet365.Val()) && + // ctx.GetChar().RechargeTimes == 0 && + // ctx.GetBook().Coin < 2000000 { + // return true + // } + + case CoinChange: + if (ctx.GetSrv().GetSessionBranch() == key.BranchBlaze.Val() || ctx.GetSrv().GetSessionBranch() == key.BranchBet365.Val()) && + ctx.GetChar().RechargeTimes == 0 && + ctx.GetBook().Coin < 2000000 { + if mathx.In(body.Reason, playReasons) { + return true + } + return true + } + } + + return false +} + +func typeName(v any) string { + typ := reflect.TypeOf(v) + var name string + if typ.Kind() == reflect.Ptr { + name = typ.Elem().String() + } else { + name = typ.String() + } + parts := strings.Split(name, ".") + if len(parts) > 0 { + name = parts[len(parts)-1] + } + + return name +} diff --git a/gamesrv/slotspkg/internal/dao/thinkingdata/formatter.go b/gamesrv/slotspkg/internal/dao/thinkingdata/formatter.go new file mode 100644 index 0000000..2b56433 --- /dev/null +++ b/gamesrv/slotspkg/internal/dao/thinkingdata/formatter.go @@ -0,0 +1,270 @@ +package thinkingdata + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/global" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "reflect" + + "github.com/tomas-qstarrs/boost/timex" + + "github.com/fatih/structs" + "github.com/gofrs/uuid" + "github.com/tomas-qstarrs/boost/cast" + "github.com/tomas-qstarrs/boost/stringx" +) + +var tagName = "json" + +func formatEvent(ctx *shared.LogContext, typ string, body interface{}) { + if global.Mock { + return + } + + if filterEvent(ctx, typ, body) { + return + } + + ctx = safeCtx(ctx) + + ctx.Identifier.SeqID = global.ProcessSeqID.Add(1) + ctx.Identifier.LogID = uuid.Must(uuid.NewV4()).String() + + //formatter := NewFormatter() + //properties := &Properties{ + // Header: formatter.FormatHeader(ctx, typ, body), + // Super: formatter.FormatSuper(ctx), + // Body: formatter.FormatBody(body), + //} + // + //global.TALogger.WithFields(properties.ToMapStructure()).Info("") +} + +func formatUser(ctx *shared.LogContext, typ string, body interface{}) { + if global.Mock { + return + } + ctx = safeCtx(ctx) + + //formatter := NewFormatter() + + //properties := &Properties{ + // Header: formatter.FormatHeader(ctx, typ, body), + // Super: nil, + // Body: formatter.FormatUserProperties(ctx, body), + //} + // + //global.TALogger.WithFields(properties.ToMapStructure()).Info("") +} + +type Properties struct { + Header *Header + Super *Super + Body interface{} +} + +func (p *Properties) ToMapStructure() map[string]interface{} { + fields := make(map[string]interface{}) + if p.Header != nil { + stHeader := structs.New(p.Header) + stHeader.TagName = tagName + for _, f := range stHeader.Fields() { + fields[f.Tag(tagName)] = f.Value() + } + } + + properties := make(map[string]interface{}) + + if p.Super != nil { + stSuper := structs.New(p.Super) + stSuper.TagName = tagName + for _, f := range stSuper.Fields() { + properties[f.Tag(tagName)] = f.Value() + } + } + + if p.Body != nil { + stBody := structs.New(p.Body) + stBody.TagName = tagName + for _, f := range stBody.Fields() { + properties[f.Tag(tagName)] = f.Value() + } + } + + for k := range fields { + if v, ok := properties[k]; ok { + fields[k] = v + delete(properties, k) + } + } + + fields["properties"] = properties + + return fields +} + +// Formatter formats logs into text with seps. +type Formatter struct { +} + +func NewFormatter() *Formatter { + return &Formatter{} +} + +func (f *Formatter) FormatHeader(ctx *shared.LogContext, typ string, body interface{}) *Header { + var eventName string + if reflect.TypeOf(body).Kind() == reflect.Ptr { + eventName = stringx.PickLast(reflect.TypeOf(body).Elem().String(), ".") + } else { + eventName = stringx.PickLast(reflect.TypeOf(body).String(), ".") + } + + var ( + accountID string + distinctID string + ) + if ctx.UID > 0 { + accountID = cast.ToString(ctx.UID) + } else if ctx.GetSessionContext().GetUID() > 0 { + accountID = cast.ToString(ctx.GetSessionContext().GetUID()) + } + + if accountID == "" || distinctID == "" { + accountID = "system" + distinctID = "|" + } + + header := &Header{ + AccountID: accountID, + DistinctID: distinctID, + Type: typ, + Time: timex.Now().Format("2006-01-02 15:04:05.000"), + EventName: eventName, + UUID: uuid.Must(uuid.NewV4()).String(), + } + return header +} + +func (f *Formatter) FormatSuper(ctx *shared.LogContext) *Super { + return &Super{ + // Common + ZoneOffset: timex.Zone() / 3600, + + // Log + ContextType: ctx.Identifier.GetContextType(), + LogType: ctx.Identifier.GetLogType(), + GroupID: ctx.Identifier.GetGroupID(), + BatchID: ctx.Identifier.GetBatchID(), + SeqID: ctx.Identifier.GetSeqID(), + LogID: ctx.Identifier.GetLogID(), + ProcessID: ctx.Identifier.GetProcessID(), + SessionID: ctx.Identifier.GetSessionID(), + + // Game + Contest: ctx.Game.GetContest(), + ContestType: ctx.Game.GetContestType(), + RoomID: uint64(ctx.Game.GetRoomID()), + RoomType: ctx.Game.GetRoomType(), + RoundID: ctx.Game.GetRoundID(), + Branch: ctx.Game.GetBranch(), + + // Srv + Runtime: ctx.Srv.GetRuntime(), + Version: ctx.Srv.GetVersion(), + SessionVersion: ctx.Srv.GetSessionVersion(), + SessionBranch: ctx.Srv.GetSessionBranch(), + Cluster: ctx.Srv.GetCluster(), + + // Cli + CliPlatform: ctx.Cli.GetThirdName(), + CliLanguage: ctx.Cli.GetLanguage(), + + // User + Nickname: ctx.User.GetNickname(), + Avatar: ctx.User.GetAvatar(), + CPF: ctx.User.GetCPF(), + PixType: ctx.User.GetPixType(), + PixAccount: ctx.User.GetPixAccount(), + Name: ctx.User.GetName(), + PhoneNumber: ctx.User.GetPhoneNumber(), + + // Char + Category: ctx.Char.GetCategory(), + Group: ctx.Char.GetGroup(), + GroupBatch: ctx.Char.GetGroupBatch(), + CreateTime: timex.FormatTime(timex.Time(ctx.Char.GetCreateTime())), + LoginTime: timex.FormatTime(timex.Time(ctx.Char.GetLoginTime())), + LastLoginTime: timex.FormatTime(timex.Time(ctx.Char.GetLastLoginTime())), + ProcessTime: timex.FormatTime(timex.Time(ctx.Char.GetProcessTime())), + LastProcessTime: timex.FormatTime(timex.Time(ctx.Char.GetLastProcessTime())), + Newbie: ctx.Char.GetNewbie(), + Novice: ctx.Char.GetNovice(), + NetworkPromotion: ctx.Char.GetNetworkPromotion(), + ActiveDays: ctx.Char.GetActiveDays(), + FirstRechargeTime: timex.FormatTime(timex.Time(ctx.Char.GetFirstRechargeTime())), + LatestRechargeTime: timex.FormatTime(timex.Time(ctx.Char.GetLatestRechargeTime())), + RechargeTimes: ctx.Char.GetRechargeTimes(), + RechargeCurrency: ctx.Char.GetRechargeCurrency(), + + // Book + Coin: ctx.Book.GetCoin(), + + // Agg + AggSlotsDailySpins: ctx.Agg.GetSlotsDailySpins(), + AggSlotsDailyWin: ctx.Agg.GetSlotsDailyWin(), + AggSlotsDailyBet: ctx.Agg.GetSlotsDailyBet(), + } +} + +func (f *Formatter) FormatBody(body interface{}) interface{} { + return body +} + +func (f *Formatter) FormatUserProperties(ctx *shared.LogContext, body interface{}) interface{} { + switch body.(type) { + case *UserBase: + //body = f.formatUserBase(ctx) + } + return body +} + +func (f *Formatter) formatUserBase(ctx *shared.LogContext) *UserBase { + return &UserBase{ + // Cli + CliPlatform: ctx.Cli.GetThirdName(), + CliLanguage: ctx.Cli.GetLanguage(), + + // User + Nickname: ctx.User.GetNickname(), + Avatar: ctx.User.GetAvatar(), + CPF: ctx.User.GetCPF(), + PixType: ctx.User.GetPixType(), + PixAccount: ctx.User.GetPixAccount(), + Name: ctx.User.GetName(), + PhoneNumber: ctx.User.GetPhoneNumber(), + + // Char + Category: ctx.Char.GetCategory(), + Group: ctx.Char.GetGroup(), + GroupBatch: ctx.Char.GetGroupBatch(), + CreateTime: timex.FormatTime(timex.Time(ctx.Char.GetCreateTime())), + LoginTime: timex.FormatTime(timex.Time(ctx.Char.GetLoginTime())), + LastLoginTime: timex.FormatTime(timex.Time(ctx.Char.GetLastLoginTime())), + ProcessTime: timex.FormatTime(timex.Time(ctx.Char.GetProcessTime())), + LastProcessTime: timex.FormatTime(timex.Time(ctx.Char.GetLastProcessTime())), + Newbie: ctx.Char.GetNewbie(), + Novice: ctx.Char.GetNovice(), + NetworkPromotion: ctx.Char.GetNetworkPromotion(), + ActiveDays: ctx.Char.GetActiveDays(), + FirstRechargeTime: timex.FormatTime(timex.Time(ctx.Char.GetFirstRechargeTime())), + LatestRechargeTime: timex.FormatTime(timex.Time(ctx.Char.GetLatestRechargeTime())), + RechargeTimes: ctx.Char.GetRechargeTimes(), + RechargeCurrency: ctx.Char.GetRechargeCurrency(), + + // Book + Coin: ctx.Book.GetCoin(), + + AggSlotsDailySpins: ctx.Agg.GetSlotsDailySpins(), + AggSlotsDailyWin: ctx.Agg.GetSlotsDailyWin(), + AggSlotsDailyBet: ctx.Agg.GetSlotsDailyBet(), + } +} diff --git a/gamesrv/slotspkg/internal/dao/thinkingdata/structs.go b/gamesrv/slotspkg/internal/dao/thinkingdata/structs.go new file mode 100644 index 0000000..9e31caa --- /dev/null +++ b/gamesrv/slotspkg/internal/dao/thinkingdata/structs.go @@ -0,0 +1,377 @@ +package thinkingdata + +type ( + Header struct { + AccountID string `json:"#account_id"` + DistinctID string `json:"#distinct_id"` + Type string `json:"#type"` + Time string `json:"#time"` + EventName string `json:"#event_name"` + UUID string `json:"#uuid"` + EventID string `json:"#event_id"` + } + + Super struct { + // Common + ZoneOffset int64 `json:"#zone_offset"` + + // Log + ContextType string `json:"context_type"` + LogType string `json:"log_type"` + GroupID string `json:"group_id"` + BatchID string `json:"batch_id"` + SeqID int64 `json:"seq_id"` + LogID string `json:"log_id"` + ProcessID string `json:"process_id"` + SessionID int64 `json:"session_id"` + Contest string `json:"contest"` + ContestType string `json:"contest_type"` + RoomType string `json:"room_type"` + RoomID uint64 `json:"room_id"` + RoundID int64 `json:"round_id"` + Branch uint32 `json:"branch"` + + // Srv + Runtime string `json:"runtime"` + Version string `json:"version"` + SessionVersion string `json:"session_version"` + SessionBranch uint32 `json:"session_branch"` + Cluster string `json:"cluster"` + + // Cli + CliPackage string `json:"#bundle_id"` + CliVersion string `json:"#app_version"` + CliResVersion string `json:"cli_res_version"` + CliPlatform string `json:"cli_platform"` + CliOS string `json:"#os"` + CliDevice string `json:"#device_model"` + CliDeviceID string `json:"#device_id"` + CliZoneOffset string `json:"cli_zone_offset"` + CliIntranetIP string `json:"cli_intranet_ip"` + CliInternetIP string `json:"#ip"` + CliContinent string `json:"cli_continent"` + CliCountry string `json:"cli_country"` + CliASN string `json:"cli_asn"` + CliNetworkPromotion string `json:"cli_promote_network"` + CliIsNetworkPromotionRemote bool `json:"cli_is_promote_network_remote"` + CliBackground bool `json:"cli_background"` + CliSimulator bool `json:"cli_simulator"` + CliLanguage string `json:"cli_language"` + CliNetwork string `json:"cli_network"` + CliCarrier string `json:"cli_carrier"` + CliISP string `json:"cli_isp"` + CliVPN bool `json:"cli_vpn"` + CliProxy bool `json:"cli_proxy"` + CliChannel string `json:"cli_channel"` + + // Acc + AccPackage string `json:"acc_package"` + AccDevice string `json:"acc_device"` + AccFacebook string `json:"acc_facebook"` + AccGoogle string `json:"acc_google"` + + // User + Nickname string `json:"nickname"` + Avatar int64 `json:"avatar"` + CPF string `json:"cpf"` + PixType string `json:"pix_type"` + PixAccount string `json:"pix_account"` + Name string `json:"name"` + PhoneNumber string `json:"phone_number"` + + // Char + GroupBatch int64 `json:"group_batch"` + Group string `json:"group"` + Category string `json:"category"` + CreateTime string `json:"create_time"` + LoginTime string `json:"login_time"` + LastLoginTime string `json:"last_login_time"` + ProcessTime string `json:"process_time"` + LastProcessTime string `json:"last_process_time"` + Newbie bool `json:"newbie"` + Novice bool `json:"novice"` + NetworkPromotion string `json:"promote_network"` + ActiveDays int64 `json:"active_days"` + FirstRechargeTime string `json:"first_recharge_time"` + LatestRechargeTime string `json:"latest_recharge_time"` + RechargeTimes int64 `json:"recharge_times"` + RechargeCurrency int64 `json:"recharge_currency"` + + // Book + Coin int64 `json:"free_coin"` + + // Agg + AggSlotsDailySpins int64 `json:"agg_slots_daily_spins"` + AggSlotsDailyWin int64 `json:"agg_slots_daily_win"` + AggSlotsDailyBet int64 `json:"agg_slots_daily_bet"` + } + + UserBase struct { + // Cli + CliPackage string `json:"cli_package"` + CliVersion string `json:"cli_version"` + CliResVersion string `json:"cli_res_version"` + CliPlatform string `json:"cli_platform"` + CliOS string `json:"cli_os"` + CliDevice string `json:"cli_device_model"` + CliDeviceID string `json:"cli_device_id"` + CliZoneOffset string `json:"cli_zone_offset"` + CliIntranetIP string `json:"cli_intranet_ip"` + CliInternetIP string `json:"cli_ip"` + CliContinent string `json:"cli_continent"` + CliCountry string `json:"cli_country"` + CliASN string `json:"cli_asn"` + CliNetworkPromotion string `json:"cli_promote_network"` + CliIsNetworkPromotionRemote bool `json:"cli_is_promote_network_remote"` + CliBackground bool `json:"cli_background"` + CliSimulator bool `json:"cli_simulator"` + CliLanguage string `json:"cli_language"` + CliNetwork string `json:"cli_network"` + CliCarrier string `json:"cli_carrier"` + CliISP string `json:"cli_isp"` + CliVPN bool `json:"cli_vpn"` + CliProxy bool `json:"cli_proxy"` + CliChannel string `json:"cli_channel"` + + // Acc + AccPackage string `json:"acc_package"` + AccDevice string `json:"acc_device"` + AccFacebook string `json:"acc_facebook"` + AccGoogle string `json:"acc_google"` + + // User + Nickname string `json:"nickname"` + Avatar int64 `json:"avatar"` + CPF string `json:"cpf"` + PixType string `json:"pix_type"` + PixAccount string `json:"pix_account"` + Name string `json:"name"` + PhoneNumber string `json:"phone_number"` + + // Char + GroupBatch int64 `json:"group_batch"` + Group string `json:"group"` + Category string `json:"category"` + CreateTime string `json:"create_time"` + LoginTime string `json:"login_time"` + LastLoginTime string `json:"last_login_time"` + ProcessTime string `json:"process_time"` + LastProcessTime string `json:"last_process_time"` + Newbie bool `json:"newbie"` + Novice bool `json:"novice"` + NetworkPromotion string `json:"promote_network"` + ActiveDays int64 `json:"active_days"` + FirstRechargeTime string `json:"first_recharge_time"` + LatestRechargeTime string `json:"latest_recharge_time"` + RechargeTimes int64 `json:"recharge_times"` + RechargeCurrency int64 `json:"recharge_currency"` + + // Book + Coin int64 `json:"free_coin"` + FreeWinCoin int64 `json:"free_win_coin"` + RechargeCoin int64 `json:"recharge_coin"` + RechargeWinCoin int64 `json:"recharge_win_coin"` + + // Agg + AggSlotsDailySpins int64 `json:"agg_slots_daily_spins"` + AggSlotsDailyWin int64 `json:"agg_slots_daily_win"` + AggSlotsDailyBet int64 `json:"agg_slots_daily_bet"` + } + + UserAccount struct { + CurrentAccount string `json:"current_account"` + CurrentAccountType int64 `json:"current_account_type"` + DeviceAccount string `json:"device_account"` + DeviceEnable bool `json:"device_enable"` + FacebookAccount string `json:"facebook_account"` + FacebookEnable bool `json:"facebook_enable"` + AppleAccount string `json:"apple_account"` + AppleEnable bool `json:"apple_enable"` + } + + LoginRequestReceived struct { + AccessType string `json:"access_type"` + AccessPackage string `json:"access_package"` + AccessAccount string `json:"access_account"` + AccessDevice string `json:"access_device"` + IsGM bool `json:"is_gm"` + } + + LoginGuaranteeUniqueSent struct { + AccessType string `json:"access_type"` + AccessPackage string `json:"access_package"` + AccessAccount string `json:"access_account"` + AccessDevice string `json:"access_device"` + IsGM bool `json:"is_gm"` + } + + LoginGuaranteeUniqueReceived struct { + AccessType string `json:"access_type"` + AccessPackage string `json:"access_package"` + AccessAccount string `json:"access_account"` + AccessDevice string `json:"access_device"` + Result int64 `json:"result"` + } + + Login struct { + AccessType string `json:"access_type"` + AccessPackage string `json:"access_package"` + AccessAccount string `json:"access_account"` + AccessDevice string `json:"access_device"` + IsRepeated bool `json:"is_repeated"` + } + + Logout struct { + } + + Enter struct { + } + + Leave struct { + } + + CoinChange struct { + Reason string `json:"reason"` + Type string `json:"type"` + BeforeCoin int64 `json:"before_coin"` + IncCoin int64 `json:"inc_coin"` + DecCoin int64 `json:"dec_coin"` + AfterCoin int64 `json:"after_coin"` + } + + CoinChangeSettle struct { + Reason string `json:"reason"` + Type string `json:"type"` + BeforeCoin int64 `json:"before_coin"` + IncCoin int64 `json:"inc_coin"` + DecCoin int64 `json:"dec_coin"` + AfterCoin int64 `json:"after_coin"` + } + + CoinChangeBet struct { + Reason string `json:"reason"` + Type string `json:"type"` + BeforeCoin int64 `json:"before_coin"` + IncCoin int64 `json:"inc_coin"` + DecCoin int64 `json:"dec_coin"` + AfterCoin int64 `json:"after_coin"` + } + + SlotsPlay struct { + SlotsNodeType string `json:"slots_node_type"` + SlotsBetIndex int64 `json:"slots_bet_index"` + SlotsCoinValueIndex int64 `json:"slots_coin_value_index"` + SlotsChoice int64 `json:"slots_choice"` + SlotsStay bool `json:"slots_stay"` + SlotsVersion int64 `json:"slots_version"` + SlotsRatio float64 `json:"slots_ratio"` + SlotsBet int64 `json:"slots_bet"` + SlotsActBet int64 `json:"slots_act_bet"` + SlotsTotalBet int64 `json:"slots_total_bet"` + SlotsActualBet int64 `json:"slots_actual_bet"` + SlotsWin int64 `json:"slots_win"` + SlotsNodeTotalWin int64 `json:"slots_node_total_win"` + SlotsTotalWin int64 `json:"slots_total_win"` + SlotsAcutalWin int64 `json:"slots_actual_win"` + SlotsActualWinType int64 `json:"slots_actual_win_type"` + SlotsDisplaySymbols string `json:"slots_display_symbols"` + SlotsFinalSymbols string `json:"slots_final_symbols"` + SlotsFeatures string `json:"slots_features"` + + TotalBetCoin int64 `json:"total_bet_coin"` + TotalPayoutCoin int64 `json:"total_payout_coin"` + TotalPayoutRatio float64 `json:"total_payout_ratio"` + ReservePoolEnable bool `json:"reserve_pool_enable"` + ReservePoolChange int64 `json:"reserve_pool_change"` + ReservePoolType int64 `json:"reserve_pool_type"` + ReservePool int64 `json:"reserve_pool"` + PumpAmount int64 `json:"pump_amount"` + PumpRatio float64 `json:"pump_ratio"` + ReservePumpAmount int64 `json:"reserve_pump_amount"` + ReservePumpRatio float64 `json:"reserve_pump_ratio"` + Novice int64 `json:"novice"` + + NewPoolValue int64 `json:"new_pool_value"` + OldPoolValue int64 `json:"old_pool_value"` + ReservePump int64 `json:"reserve_pump"` + + Poor bool `json:"poor"` + Cycle int64 `json:"cycle"` + CycleOverload bool `json:"cycle_overload"` + Exception bool `json:"exception"` + ExceptionType int64 `json:"exception_type"` + Replay bool `json:"replay"` + + Vector string `json:"vector"` + VectorType int64 `json:"vector_type"` + VectorIndex int64 `json:"vector_index"` + VectorMinRatio float64 `json:"vector_min_ratio"` + VectorMaxRatio float64 `json:"vector_max_ratio"` + + ExpectedBetCoin int64 `json:"expected_bet_coin"` + ExpectedWinCoin int64 `json:"expected_win_coin"` + SkipWinCheck bool `json:"skip_win_check"` + + NoviceForceWin bool `json:"novice_force_win"` + SecondStageForceWin bool `json:"second_stage_force_win"` + PaidForceWin bool `json:"paid_force_win"` + BuyFreeSpinForceWin bool `json:"buy_free_spin_force_win"` + ContinousZeroForceWin bool `json:"continous_zero_force_win"` + } + + Watchdog struct { + GoroutineNum int64 `json:"goroutine_num"` // 协程数量 + SessionNum int64 `json:"session_num"` // session数量 + ActiveSessionNum int64 `json:"active_session_num"` // 活跃session数量 + ActiveRechargeSessionNum int64 `json:"active_recharge_session_num"` // 活跃充值session数量 + SessionSchedulerNum int64 `json:"session_scheduler_num"` // session调度器数量 + CPU int64 `json:"cpu"` // CPU占用 mCores + Memory int64 `json:"memory"` // 内存占用 MiB + SyscallCPU int64 `json:"syscall_cpu"` // Syscall CPU占用 mCores + SyscallMemory int64 `json:"syscall_memory"` // Syscall 内存占用 MiB + RedisMemory int64 `json:"redis_memory"` // redis 内存占用 MiB + } + + Assess struct { + IndicatorRegisterHours int64 `json:"indicator_register_hours"` // 注册时长 + IndicatorContinuousLoginDays int64 `json:"indicator_continuous_login_days"` // 连续登录天数 + IndicatorActiveDaysRatio int64 `json:"indicator_active_days_ratio"` // 活跃天数比例 + IndicatorAverageBetDaily int64 `json:"indicator_average_bet_daily"` // 日均投注额 + IndicatorAverageBet int64 `json:"indicator_average_bet"` // 平均投注额 + IndicatorBetTimesRatioDaily int64 `json:"indicator_bet_times_ratio_daily"` // 日均投注次数比例 + IndicatorMaxWinDaily int64 `json:"indicator_max_win_daily"` // 日最大盈利 + IndicatorMaxLoseDaily int64 `json:"indicator_max_lose_daily"` // 日最大亏损 + IndicatorWinDaysRatio int64 `json:"indicator_win_days_ratio"` // 盈利天数比例 + Score int64 `json:"score"` // 评分 + SubCategory string `json:"sub_category"` // 子类别 + } + + HandlePermit struct { + Tag string `json:"tag"` + Type string `json:"type"` + Value string `json:"value"` + Status bool `json:"status"` + Reason string `json:"reason"` + } + + RocksSyncLayer struct { + Layer string `json:"layer"` + Cost int64 `json:"cost"` + Interval int64 `json:"interval"` + RedisGetCost int64 `json:"redis_get_cost"` + RedisRemCost int64 `json:"redis_rem_cost"` + DDBSetCost int64 `json:"ddb_set_cost"` + } + + HandlePlayerState struct { + UID int64 `json:"uid"` + Type string `json:"type"` + // 原因 + Reason string `json:"reason"` + } + + Reorder struct { + UID int64 `json:"uid"` + InnerID string `json:"inner_id"` + } +) diff --git a/gamesrv/slotspkg/internal/dao/thinkingdata/thinkingdata.go b/gamesrv/slotspkg/internal/dao/thinkingdata/thinkingdata.go new file mode 100644 index 0000000..65e68ba --- /dev/null +++ b/gamesrv/slotspkg/internal/dao/thinkingdata/thinkingdata.go @@ -0,0 +1,81 @@ +package thinkingdata + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/global" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" +) + +const ( + TrackType = "track" + TrackUpdateType = "track_update" + TrackOverwriteType = "track_overwrite" + UserSetType = "user_set" + UserUnsetType = "user_unset" + UserSetOnceType = "user_setOnce" + UserAddType = "user_add" + UserAppendType = "user_append" + UserDelType = "user_del" +) + +func Track(ctx *shared.LogContext, v interface{}) { + if global.Mock { + return + } + formatEvent(ctx, TrackType, v) +} + +func TrackUpdate(ctx *shared.LogContext, v interface{}) { + formatEvent(ctx, TrackUpdateType, v) +} + +func TrackOverWrite(ctx *shared.LogContext, v interface{}) { + formatEvent(ctx, TrackOverwriteType, v) +} + +func UserSet(ctx *shared.LogContext, v interface{}) { + formatUser(ctx, UserSetType, v) +} + +func UserUnset(ctx *shared.LogContext, v interface{}) { + formatUser(ctx, UserUnsetType, v) +} + +func UserSetOnce(ctx *shared.LogContext, v interface{}) { + formatUser(ctx, UserSetOnceType, v) +} + +func UserAdd(ctx *shared.LogContext, v interface{}) { + formatUser(ctx, UserAddType, v) +} + +func UserAppend(ctx *shared.LogContext, v interface{}) { + formatUser(ctx, UserAppendType, v) +} + +func UserDel(ctx *shared.LogContext, v interface{}) { + formatUser(ctx, UserDelType, v) +} + +func safeCtx(ctx *shared.LogContext) *shared.LogContext { + if ctx == nil { + identifier := &shared.Identifier{ + ContextType: key.LogContextTypeNil, + LogType: key.LogTypeProcess, + GroupID: "", + BatchID: global.ProcessID, + ProcessID: global.ProcessID, + } + + srv := &shared.Srv{ + Runtime: global.Runtime, + Cluster: global.Cluster, + } + + return &shared.LogContext{ + Identifier: identifier, + Srv: srv, + } + } + return ctx +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/cash_mania.go b/gamesrv/slotspkg/internal/exported/excel2go/base/cash_mania.go new file mode 100644 index 0000000..6215492 --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/cash_mania.go @@ -0,0 +1,777 @@ +//go:build !debug +// +build !debug + +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +func init() { + CashManiaBetBetChangeList = map[int64]*structs.CashManiaBetBetChangeList{ + 0: { + Index: 0, + BetChangeList: 0.3, + BetSizeIndex: 0, + BetLevelIndex: 0, + }, + 1: { + Index: 1, + BetChangeList: 0.6, + BetSizeIndex: 0, + BetLevelIndex: 1, + }, + 2: { + Index: 2, + BetChangeList: 0.9, + BetSizeIndex: 0, + BetLevelIndex: 2, + }, + 3: { + Index: 3, + BetChangeList: 1, + BetSizeIndex: 1, + BetLevelIndex: 0, + }, + 4: { + Index: 4, + BetChangeList: 1.5, + BetSizeIndex: 0, + BetLevelIndex: 4, + }, + 5: { + Index: 5, + BetChangeList: 3, + BetSizeIndex: 0, + BetLevelIndex: 9, + }, + 6: { + Index: 6, + BetChangeList: 5, + BetSizeIndex: 1, + BetLevelIndex: 4, + }, + 7: { + Index: 7, + BetChangeList: 9, + BetSizeIndex: 3, + BetLevelIndex: 0, + }, + 8: { + Index: 8, + BetChangeList: 10, + BetSizeIndex: 1, + BetLevelIndex: 9, + }, + 9: { + Index: 9, + BetChangeList: 15, + BetSizeIndex: 2, + BetLevelIndex: 4, + }, + 10: { + Index: 10, + BetChangeList: 30, + BetSizeIndex: 2, + BetLevelIndex: 9, + }, + 11: { + Index: 11, + BetChangeList: 45, + BetSizeIndex: 3, + BetLevelIndex: 4, + }, + 12: { + Index: 12, + BetChangeList: 90, + BetSizeIndex: 3, + BetLevelIndex: 9, + }, + } + + CashManiaBetBetLevel = map[int64]*structs.CashManiaBetBetLevel{ + 0: { + Index: 0, + BetLevel: 1, + }, + 1: { + Index: 1, + BetLevel: 2, + }, + 2: { + Index: 2, + BetLevel: 3, + }, + 3: { + Index: 3, + BetLevel: 4, + }, + 4: { + Index: 4, + BetLevel: 5, + }, + 5: { + Index: 5, + BetLevel: 6, + }, + 6: { + Index: 6, + BetLevel: 7, + }, + 7: { + Index: 7, + BetLevel: 8, + }, + 8: { + Index: 8, + BetLevel: 9, + }, + 9: { + Index: 9, + BetLevel: 10, + }, + } + + CashManiaBetBetLine = map[int64]*structs.CashManiaBetBetLine{ + 0: { + Index: 0, + BetLine: 10, + }, + } + + CashManiaBetBetSize = map[int64]*structs.CashManiaBetBetSize{ + 0: { + Index: 0, + BetSize: 300, + }, + 1: { + Index: 1, + BetSize: 1000, + }, + 2: { + Index: 2, + BetSize: 3000, + }, + 3: { + Index: 3, + BetSize: 9000, + }, + } + + CashManiaBetFirstBet = map[int64]*structs.CashManiaBetFirstBet{ + 1: { + Index: 1, + BetSizeIndex: 1, + BetLevelIndex: 0, + }, + } + + CashManiaFormation = []*structs.CashManiaFormation{ + { + SpinType: 1, + NodeType: "BaseSpin", + ID: 1, + SeqID: 1, + Reel: "BaseSpin", + Matrix: "Line1Form5X5TypeA", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 2, + NodeType: "FreeSpin", + ID: 1, + SeqID: 1, + Reel: "BaseSpin", + Matrix: "Line1Form5X5TypeA", + Symbol: "Default", + FirstInitMethod: 3, + OtherInitMethod: 3, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + } + + CashManiaMapRTPMode = map[int64]*structs.CashManiaMapRTPMode{ + 1: { + ID: 1, + TypeWeight: map[int64]*structs.CashManiaMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "96", + Rtp: 0.96, + }, + 2: { + ID: 2, + TypeWeight: map[int64]*structs.CashManiaMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "80", + Rtp: 0.8, + }, + 3: { + ID: 3, + TypeWeight: map[int64]*structs.CashManiaMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "120", + Rtp: 1.2, + }, + } + + CashManiaMidItemInfo = map[int64]*structs.CashManiaMidItemInfo{ + 6: { + Index: 6, + ItemID: 6, + Multi: 1, + FreeSpinCount: 5, + }, + 7: { + Index: 7, + ItemID: 7, + Multi: 1, + FreeSpinCount: 10, + }, + 8: { + Index: 8, + ItemID: 8, + Multi: 1, + FreeSpinCount: 20, + }, + 9: { + Index: 9, + ItemID: 9, + Multi: 1, + FreeSpinCount: 0, + }, + 10: { + Index: 10, + ItemID: 10, + Multi: 2, + FreeSpinCount: 0, + }, + 11: { + Index: 11, + ItemID: 11, + Multi: 3, + FreeSpinCount: 0, + }, + 12: { + Index: 12, + ItemID: 12, + Multi: 5, + FreeSpinCount: 0, + }, + 13: { + Index: 13, + ItemID: 13, + Multi: 10, + FreeSpinCount: 0, + }, + 14: { + Index: 14, + ItemID: 14, + Multi: 15, + FreeSpinCount: 0, + }, + 15: { + Index: 15, + ItemID: 15, + Multi: 20, + FreeSpinCount: 0, + }, + 16: { + Index: 16, + ItemID: 16, + Multi: 30, + FreeSpinCount: 0, + }, + 17: { + Index: 17, + ItemID: 17, + Multi: 40, + FreeSpinCount: 0, + }, + 18: { + Index: 18, + ItemID: 18, + Multi: 50, + FreeSpinCount: 0, + }, + 19: { + Index: 19, + ItemID: 19, + Multi: 100, + FreeSpinCount: 0, + }, + } + + CashManiaOthers = []*structs.CashManiaOthers{ + { + BaseWinPro: 0.15, + FreeWinPro: 0.15, + MaxWin: 2000, + WinNudgePro: 0.01, + WinRespinPro: 0.02, + NoWinNudgePro: 0.005, + NoWinRespinPro: 0.02, + }, + } + + CashManiaRandomItemWeight = []*structs.CashManiaRandomItemWeight{ + { + ID: 1, + ItemID: 1, + BaseWeight: 1, + FreeWeight: 1, + }, + { + ID: 2, + ItemID: 2, + BaseWeight: 1, + FreeWeight: 1, + }, + { + ID: 3, + ItemID: 3, + BaseWeight: 1, + FreeWeight: 1, + }, + { + ID: 4, + ItemID: 4, + BaseWeight: 1, + FreeWeight: 1, + }, + { + ID: 5, + ItemID: 5, + BaseWeight: 1, + FreeWeight: 1, + }, + } + + CashManiaRandomMidWeight = []*structs.CashManiaRandomMidWeight{ + { + ID: 1, + ItemID: 6, + BaseWeight: 12, + FreeWeight: 12, + }, + { + ID: 2, + ItemID: 7, + BaseWeight: 4, + FreeWeight: 4, + }, + { + ID: 3, + ItemID: 8, + BaseWeight: 1, + FreeWeight: 1, + }, + { + ID: 4, + ItemID: 9, + BaseWeight: 33, + FreeWeight: 33, + }, + { + ID: 5, + ItemID: 10, + BaseWeight: 50, + FreeWeight: 50, + }, + { + ID: 6, + ItemID: 11, + BaseWeight: 50, + FreeWeight: 50, + }, + { + ID: 7, + ItemID: 12, + BaseWeight: 50, + FreeWeight: 50, + }, + { + ID: 8, + ItemID: 13, + BaseWeight: 50, + FreeWeight: 50, + }, + { + ID: 9, + ItemID: 14, + BaseWeight: 50, + FreeWeight: 50, + }, + { + ID: 10, + ItemID: 15, + BaseWeight: 50, + FreeWeight: 50, + }, + { + ID: 11, + ItemID: 16, + BaseWeight: 50, + FreeWeight: 50, + }, + { + ID: 12, + ItemID: 17, + BaseWeight: 50, + FreeWeight: 50, + }, + { + ID: 13, + ItemID: 18, + BaseWeight: 50, + FreeWeight: 50, + }, + { + ID: 14, + ItemID: 19, + BaseWeight: 50, + FreeWeight: 50, + }, + } + + CashManiaReelBaseSpinRange = [][]int64{ + {5, 5, 5}, + } + + CashManiaReelBaseSpinReel = [][]int64{ + {200, 200, 200, 200, 200}, + {200, 200, 200, 200, 200}, + {200, 200, 200, 200, 200}, + } + + CashManiaReelBaseSpinWeight = [][]float64{ + {1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1}, + } + + CashManiaSymbol = map[int64]*structs.CashManiaSymbol{ + 1: { + ID: 1, + Name: "100倍", + IsWild: false, + Group: []int64{1}, + PayRate: []int64{0, 0, 100}, + ClientOrder: 1, + ClientDsc: "", + }, + 2: { + ID: 2, + Name: "5倍", + IsWild: false, + Group: []int64{2}, + PayRate: []int64{0, 0, 50}, + ClientOrder: 2, + ClientDsc: "", + }, + 3: { + ID: 3, + Name: "1倍", + IsWild: false, + Group: []int64{3}, + PayRate: []int64{0, 0, 10}, + ClientOrder: 3, + ClientDsc: "", + }, + 4: { + ID: 4, + Name: "0.5倍", + IsWild: false, + Group: []int64{4}, + PayRate: []int64{0, 0, 5}, + ClientOrder: 4, + ClientDsc: "", + }, + 5: { + ID: 5, + Name: "0.1倍", + IsWild: false, + Group: []int64{5}, + PayRate: []int64{0, 0, 1}, + ClientOrder: 5, + ClientDsc: "", + }, + 6: { + ID: 6, + Name: "5FreeSpin", + IsWild: true, + Group: []int64{6}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 7: { + ID: 7, + Name: "10FreeSpin", + IsWild: true, + Group: []int64{7}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 8: { + ID: 8, + Name: "20FreeSpin", + IsWild: true, + Group: []int64{8}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 9: { + ID: 9, + Name: "wildx1", + IsWild: true, + Group: []int64{9}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 10: { + ID: 10, + Name: "wildx2", + IsWild: true, + Group: []int64{10}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 11: { + ID: 11, + Name: "wildx3", + IsWild: true, + Group: []int64{11}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 12: { + ID: 12, + Name: "wildx5", + IsWild: true, + Group: []int64{12}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 13: { + ID: 13, + Name: "wildx10", + IsWild: true, + Group: []int64{13}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 14: { + ID: 14, + Name: "wildx15", + IsWild: true, + Group: []int64{14}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 15: { + ID: 15, + Name: "wildx20", + IsWild: true, + Group: []int64{15}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 16: { + ID: 16, + Name: "wildx30", + IsWild: true, + Group: []int64{16}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 17: { + ID: 17, + Name: "wildx40", + IsWild: true, + Group: []int64{17}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 18: { + ID: 18, + Name: "wildx50", + IsWild: true, + Group: []int64{18}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 19: { + ID: 19, + Name: "wildx100", + IsWild: true, + Group: []int64{19}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 200: { + ID: 200, + Name: "empty", + IsWild: false, + Group: []int64{200}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + } + + CashManiaSymbolBetRatio = []*structs.CashManiaSymbolBetRatio{ + { + BetRatio: 0.1, + }, + } + + CashManiaWinItemWeight = []*structs.CashManiaWinItemWeight{ + { + ID: 1, + ItemID: 1, + BaseWeight: 8, + FreeWeight: 18, + }, + { + ID: 2, + ItemID: 2, + BaseWeight: 18, + FreeWeight: 15, + }, + { + ID: 3, + ItemID: 3, + BaseWeight: 18, + FreeWeight: 36, + }, + { + ID: 4, + ItemID: 4, + BaseWeight: 28, + FreeWeight: 29, + }, + { + ID: 5, + ItemID: 5, + BaseWeight: 28, + FreeWeight: 27, + }, + } + + CashManiaWinMidWeight = []*structs.CashManiaWinMidWeight{ + { + ID: 1, + ItemID: 6, + BaseWeight: 48, + FreeWeight: 4, + }, + { + ID: 2, + ItemID: 7, + BaseWeight: 24, + FreeWeight: 0, + }, + { + ID: 3, + ItemID: 8, + BaseWeight: 6, + FreeWeight: 0, + }, + { + ID: 4, + ItemID: 9, + BaseWeight: 322, + FreeWeight: 56, + }, + { + ID: 5, + ItemID: 10, + BaseWeight: 800, + FreeWeight: 30, + }, + { + ID: 6, + ItemID: 11, + BaseWeight: 300, + FreeWeight: 15, + }, + { + ID: 7, + ItemID: 12, + BaseWeight: 200, + FreeWeight: 10, + }, + { + ID: 8, + ItemID: 13, + BaseWeight: 10, + FreeWeight: 1, + }, + { + ID: 9, + ItemID: 14, + BaseWeight: 10, + FreeWeight: 1, + }, + { + ID: 10, + ItemID: 15, + BaseWeight: 1, + FreeWeight: 5, + }, + { + ID: 11, + ItemID: 16, + BaseWeight: 1, + FreeWeight: 2, + }, + { + ID: 12, + ItemID: 17, + BaseWeight: 1, + FreeWeight: 2, + }, + { + ID: 13, + ItemID: 18, + BaseWeight: 0, + FreeWeight: 2, + }, + { + ID: 14, + ItemID: 19, + BaseWeight: 0, + FreeWeight: 2, + }, + } + +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_dragon.go b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_dragon.go new file mode 100644 index 0000000..9b345be --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_dragon.go @@ -0,0 +1,506 @@ +//go:build !debug +// +build !debug + +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +func init() { + FortuneDragonBaseMultiplier = []*structs.FortuneDragonBaseMultiplier{ + { + WinRateMin: 0, + WinRateMax: 0.01, + ItemIds: []int64{200, 8, 9, 10}, + MultiplierWeights: []int64{140, 10, 20, 10}, + }, + { + WinRateMin: 0.01, + WinRateMax: 1, + ItemIds: []int64{200, 8, 9, 10}, + MultiplierWeights: []int64{1689, 98, 176, 100}, + }, + { + WinRateMin: 1, + WinRateMax: 3, + ItemIds: []int64{200, 8, 9, 10}, + MultiplierWeights: []int64{60, 8, 10, 2}, + }, + { + WinRateMin: 3, + WinRateMax: 10, + ItemIds: []int64{200, 8, 9, 10}, + MultiplierWeights: []int64{2883, 100, 100, 250}, + }, + { + WinRateMin: 10, + WinRateMax: 20, + ItemIds: []int64{200, 8, 9, 10}, + MultiplierWeights: []int64{820, 1585, 100, 10}, + }, + { + WinRateMin: 20, + WinRateMax: 999999, + ItemIds: []int64{200, 8, 9, 10}, + MultiplierWeights: []int64{2884, 8, 10, 287}, + }, + } + + FortuneDragonBetBetChangeList = map[int64]*structs.FortuneDragonBetBetChangeList{ + 0: { + Index: 0, + BetChangeList: 0.15, + BetSizeIndex: 0, + BetLevelIndex: 0, + }, + 1: { + Index: 1, + BetChangeList: 0.3, + BetSizeIndex: 0, + BetLevelIndex: 1, + }, + 2: { + Index: 2, + BetChangeList: 0.45, + BetSizeIndex: 0, + BetLevelIndex: 2, + }, + 3: { + Index: 3, + BetChangeList: 0.5, + BetSizeIndex: 1, + BetLevelIndex: 0, + }, + 4: { + Index: 4, + BetChangeList: 0.75, + BetSizeIndex: 0, + BetLevelIndex: 4, + }, + 5: { + Index: 5, + BetChangeList: 1.5, + BetSizeIndex: 0, + BetLevelIndex: 9, + }, + 6: { + Index: 6, + BetChangeList: 2.5, + BetSizeIndex: 1, + BetLevelIndex: 4, + }, + 7: { + Index: 7, + BetChangeList: 4.5, + BetSizeIndex: 3, + BetLevelIndex: 0, + }, + 8: { + Index: 8, + BetChangeList: 5, + BetSizeIndex: 1, + BetLevelIndex: 9, + }, + 9: { + Index: 9, + BetChangeList: 7.5, + BetSizeIndex: 2, + BetLevelIndex: 4, + }, + 10: { + Index: 10, + BetChangeList: 15, + BetSizeIndex: 2, + BetLevelIndex: 9, + }, + 11: { + Index: 11, + BetChangeList: 22.5, + BetSizeIndex: 3, + BetLevelIndex: 4, + }, + 12: { + Index: 12, + BetChangeList: 45, + BetSizeIndex: 3, + BetLevelIndex: 9, + }, + } + + FortuneDragonBetBetLevel = map[int64]*structs.FortuneDragonBetBetLevel{ + 0: { + Index: 0, + BetLevel: 1, + }, + 1: { + Index: 1, + BetLevel: 2, + }, + 2: { + Index: 2, + BetLevel: 3, + }, + 3: { + Index: 3, + BetLevel: 4, + }, + 4: { + Index: 4, + BetLevel: 5, + }, + 5: { + Index: 5, + BetLevel: 6, + }, + 6: { + Index: 6, + BetLevel: 7, + }, + 7: { + Index: 7, + BetLevel: 8, + }, + 8: { + Index: 8, + BetLevel: 9, + }, + 9: { + Index: 9, + BetLevel: 10, + }, + } + + FortuneDragonBetBetLine = map[int64]*structs.FortuneDragonBetBetLine{ + 0: { + Index: 0, + BetLine: 5, + }, + } + + FortuneDragonBetBetSize = map[int64]*structs.FortuneDragonBetBetSize{ + 0: { + Index: 0, + BetSize: 300, + }, + 1: { + Index: 1, + BetSize: 1000, + }, + 2: { + Index: 2, + BetSize: 3000, + }, + 3: { + Index: 3, + BetSize: 9000, + }, + } + + FortuneDragonBetFirstBet = map[int64]*structs.FortuneDragonBetFirstBet{ + 1: { + Index: 1, + BetSizeIndex: 1, + BetLevelIndex: 1, + }, + } + + FortuneDragonFormation = []*structs.FortuneDragonFormation{ + { + SpinType: 1, + NodeType: "BaseSpin", + ID: 1, + SeqID: 1, + Reel: "BaseSpin", + Matrix: "Line5Form3X3TypeB", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 3, + NodeType: "FreeSpin", + ID: 1, + SeqID: 1, + Reel: "FreeSpin", + Matrix: "Line5Form3X3TypeB", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 2, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 1, + NodeType: "SureWinBaseSpin", + ID: 1, + SeqID: 1, + Reel: "SureWinBaseSpin", + Matrix: "Line5Form3X3TypeB", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 3, + NodeType: "SureWinFreeSpin", + ID: 1, + SeqID: 1, + Reel: "SureWinFreeSpin", + Matrix: "Line5Form3X3TypeB", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 2, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + } + + FortuneDragonFreeMultiplier = []*structs.FortuneDragonFreeMultiplier{ + { + ItemID: 8, + Weight: 30, + }, + { + ItemID: 9, + Weight: 30, + }, + { + ItemID: 10, + Weight: 15, + }, + } + + FortuneDragonFreeMultiplierCount = []*structs.FortuneDragonFreeMultiplierCount{ + { + MultiplierCount: 2, + Weight: 3, + }, + { + MultiplierCount: 3, + Weight: 1, + }, + } + + FortuneDragonMapRTPMode = map[int64]*structs.FortuneDragonMapRTPMode{ + 1: { + ID: 1, + TypeWeight: map[int64]*structs.FortuneDragonMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "96", + Rtp: 0.96, + }, + 2: { + ID: 2, + TypeWeight: map[int64]*structs.FortuneDragonMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "80", + Rtp: 0.8, + }, + 3: { + ID: 3, + TypeWeight: map[int64]*structs.FortuneDragonMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "120", + Rtp: 1.2, + }, + } + + FortuneDragonOthers = []*structs.FortuneDragonOthers{ + { + FreespinTriggerPro: 0.005, + FreeSpinCount: 8, + MaxWin: 2500, + SureWinFreespinTriggerPro: 0.0273, + SureWinBetMultiplier: 5, + }, + } + + FortuneDragonReelBaseSpinRange = [][]int64{ + {3, 3, 3}, + } + + FortuneDragonReelBaseSpinReel = [][]int64{ + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 7, 6, 6, 6, 4, 3, 4, 1, 3, 7, 7, 6, 5, 7, 5, 4, 6, 4, 4, 3, 4, 7, 7, 7, 4, 7, 4, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 7, 7, 7, 2, 5, 7, 4, 3, 6, 5, 7, 6, 3, 1, 6, 2, 3, 5, 6, 3, 2, 2, 5, 7, 6, 6, 4, 1, 7, 7, 3, 6, 4, 7, 6, 1, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 4, 4, 4, 5, 3, 5, 6, 7, 2, 5, 6, 5, 7, 7, 7, 6, 2, 5, 7, 6, 6, 7, 7, 6, 3, 5, 1, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 5, 1, 3, 7, 7, 7, 4, 5, 4, 4, 4, 6, 4, 4, 7, 4, 2, 6, 3, 5, 7, 5, 5, 5, 6, 1, 2, 4, 6, 5, 3, 3, 3, 2, 7, 4, 7, 6, 7, 7, 7, 6, 7, 4, 6, 1, 1, 1, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 7, 3, 3, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 7, 5, 5, 7, 4, 5, 6, 7, 6, 4, 4, 1, 6, 6, 5, 7, 6, 4, 5, 4, 6, 7, 4, 7, 3, 6, 5, 7, 7, 6, 2, 7, 3, 2, 2, 6, 5, 2, 6, 6, 6, 4, 6, 4, 6, 6, 6, 3, 4, 7, 1, 5, 6, 7, 2, 6, 7, 6, 6, 3, 6, 7, 6, 3, 5, 4, 7, 5, 7, 2, 6, 3, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 5, 7, 5, 6, 2, 2, 5, 4, 6, 5, 4, 4, 4, 3, 5, 2, 6, 4, 5, 7, 4, 5, 5, 5, 7, 6, 6, 6, 4, 7, 6, 1, 3, 7, 4, 5, 6, 6, 5, 4, 2, 2, 4, 7, 3, 6, 7, 6, 1, 7, 7, 3, 7, 6, 7, 7, 2, 2, 2, 7, 7, 6, 6, 3, 6, 4, 5, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 4, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 6, 6, 6, 7, 3, 6, 7, 2, 3, 7, 6, 5, 4, 6, 6, 4, 7, 3, 3, 3, 4, 7, 7, 6, 2, 5, 5, 7, 7, 6, 6, 2, 5, 5, 4, 7, 7, 5, 3, 4, 2, 6, 5, 6, 4, 7, 5, 5, 5, 7, 7, 6, 7, 6, 3, 1, 1, 1, 5, 3, 7, 4, 7, 7, 7, 6, 4, 7, 6, 4, 1, 7, 5, 3, 5, 5, 5, 4, 7, 5, 6, 7, 4, 6, 7, 4, 6, 3, 2, 5, 6, 3, 5, 1, 3, 7, 6, 5, 4, 5, 4, 7, 7, 7, 6, 2, 7, 3, 7, 5, 5, 7, 3, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 6, 6, 7, 7, 1, 6, 5, 7, 3, 5, 2, 7, 7, 3, 6, 7, 7, 5, 5, 7, 7, 7, 2, 6, 7, 3, 5, 7, 1, 5, 7, 6, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 1, 6, 6, 5, 7, 6, 1, 7, 6, 7, 7, 6, 3, 3, 2, 4, 4, 7, 2}, + {7, 5, 5, 5, 7, 7, 7, 6, 4, 4, 4, 3, 3, 3, 6, 1, 7, 6, 3, 5, 5, 6, 7, 5, 4, 4, 4, 7, 5, 4, 1, 7, 7, 7, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 1, 1, 1, 7, 5, 2, 5, 6, 4, 7, 6, 3, 7, 6, 7, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 4, 6, 6, 1, 7, 7, 4, 5, 5, 5, 7, 2, 3, 4, 7, 6, 4, 4, 4, 6, 4, 7, 2, 2, 2, 6, 6, 6, 2, 7, 5, 6, 6, 6, 5, 3, 5, 2, 7, 6, 4, 3, 6, 7, 6, 7, 4, 3, 2, 4, 7, 5, 6, 3, 1, 4, 5, 7, 7, 7, 3, 6, 1, 5, 3, 7, 4, 3, 7, 5, 6, 6, 6, 7, 1, 5, 6, 7, 4, 6, 5, 6, 5, 1, 2, 4, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 7, 7, 5, 6, 6, 6, 5, 2, 7, 4, 4, 4, 7, 6, 6, 6, 7, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 6, 7, 6, 5, 5, 5, 2, 2, 5, 7, 7, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 6, 6, 5, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 2, 4, 1, 5, 4, 3, 7, 3, 7, 5, 6, 5, 7, 7, 7, 7, 6, 6, 3, 4, 6, 2, 3, 1, 7, 2, 1, 5, 7, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 5, 4, 2}, + } + + FortuneDragonReelBaseSpinWeight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + FortuneDragonReelFreeSpinRange = [][]int64{ + {3, 3, 3}, + } + + FortuneDragonReelFreeSpinReel = [][]int64{ + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 7, 6, 3, 6, 4, 3, 4, 1, 3, 7, 7, 6, 5, 7, 5, 4, 6, 4, 4, 3, 4, 7, 7, 2, 4, 7, 4, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 7, 6, 7, 2, 5, 7, 4, 3, 6, 5, 7, 6, 3, 1, 6, 2, 3, 5, 6, 3, 2, 2, 5, 7, 6, 6, 4, 1, 7, 7, 3, 6, 4, 7, 6, 3, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 4, 4, 3, 5, 3, 5, 6, 7, 2, 5, 6, 5, 3, 7, 7, 6, 2, 5, 7, 6, 6, 7, 7, 6, 3, 5, 4, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 5, 1, 3, 7, 7, 7, 4, 5, 4, 4, 4, 6, 4, 4, 7, 4, 2, 6, 3, 5, 7, 5, 5, 5, 6, 3, 2, 4, 6, 5, 3, 3, 3, 2, 7, 4, 7, 6, 7, 7, 7, 6, 7, 4, 6, 1, 1, 1, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 7, 1, 3, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 7, 5, 5, 7, 4, 5, 6, 7, 6, 4, 4, 1, 6, 6, 5, 7, 6, 4, 5, 4, 6, 7, 4, 7, 3, 6, 5, 7, 7, 6, 2, 7, 3, 2, 2, 6, 5, 2, 6, 6, 2, 4, 6, 4, 6, 6, 6, 3, 4, 7, 3, 5, 6, 7, 2, 6, 7, 6, 6, 3, 6, 7, 6, 3, 5, 4, 7, 5, 7, 2, 6, 3, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 5, 7, 5, 6, 2, 3, 5, 4, 6, 5, 4, 1, 4, 3, 5, 7, 6, 4, 5, 7, 4, 5, 5, 5, 7, 2, 6, 6, 4, 7, 6, 1, 3, 7, 4, 5, 6, 6, 5, 4, 1, 5, 4, 7, 3, 6, 7, 6, 3, 7, 7, 3, 7, 6, 7, 7, 2, 2, 2, 7, 7, 6, 6, 3, 6, 4, 5, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 3, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 6, 3, 6, 7, 3, 6, 7, 2, 3, 7, 6, 5, 4, 6, 3, 4, 7, 3, 6, 3, 4, 1, 7, 6, 5, 3, 7, 6, 5, 7, 6, 2, 5, 7, 4, 5, 7, 3, 5, 4, 1, 6, 5, 4, 6, 7, 5, 4, 5, 7, 7, 6, 7, 6, 3, 1, 1, 1, 5, 3, 7, 4, 7, 7, 7, 6, 4, 7, 6, 4, 1, 7, 5, 3, 5, 5, 2, 4, 7, 5, 6, 7, 4, 6, 7, 4, 6, 3, 2, 5, 6, 3, 5, 6, 3, 7, 6, 5, 4, 5, 4, 1, 7, 7, 6, 2, 7, 3, 7, 5, 5, 7, 3, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 6, 6, 7, 7, 1, 6, 5, 7, 3, 5, 2, 7, 7, 3, 6, 7, 7, 5, 5, 7, 7, 7, 2, 6, 7, 3, 5, 7, 1, 5, 7, 6, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 1, 6, 6, 5, 7, 6, 1, 7, 6, 7, 4, 6, 3, 7, 5, 4, 4, 7, 2}, + {7, 5, 5, 4, 7, 3, 7, 6, 4, 2, 4, 3, 5, 7, 6, 1, 7, 6, 4, 5, 3, 6, 7, 5, 4, 4, 4, 7, 5, 4, 1, 7, 7, 2, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 1, 1, 1, 7, 5, 2, 5, 6, 4, 7, 6, 3, 7, 6, 1, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 4, 6, 6, 1, 7, 7, 4, 3, 5, 5, 7, 2, 3, 4, 7, 6, 3, 4, 4, 6, 4, 7, 2, 2, 2, 6, 6, 6, 2, 7, 5, 6, 7, 3, 5, 3, 5, 2, 7, 6, 4, 3, 6, 7, 6, 7, 4, 3, 2, 4, 7, 5, 4, 7, 1, 4, 5, 7, 7, 7, 4, 6, 7, 5, 6, 7, 4, 3, 7, 5, 6, 6, 6, 7, 1, 5, 6, 7, 4, 6, 5, 6, 5, 1, 5, 4, 3, 5, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 6, 7, 5, 6, 4, 6, 5, 2, 7, 4, 4, 4, 7, 6, 6, 1, 7, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 6, 7, 6, 5, 5, 5, 4, 2, 5, 7, 7, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 6, 6, 5, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 5, 4, 1, 5, 4, 3, 7, 3, 7, 1, 6, 5, 7, 2, 5, 7, 6, 6, 3, 4, 6, 2, 3, 1, 7, 6, 1, 5, 7, 5, 5, 5, 6, 3, 5, 7, 4, 1, 7, 6, 5, 4, 2}, + } + + FortuneDragonReelFreeSpinWeight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + FortuneDragonReelSureWinBaseSpinRange = [][]int64{ + {3, 3, 3}, + } + + FortuneDragonReelSureWinBaseSpinReel = [][]int64{ + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 7, 6, 6, 6, 4, 3, 4, 1, 3, 7, 7, 6, 5, 7, 5, 4, 6, 4, 4, 3, 4, 2, 7, 7, 4, 7, 4, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 1, 7, 7, 2, 5, 7, 4, 3, 6, 5, 7, 6, 3, 1, 6, 2, 3, 5, 6, 3, 2, 2, 5, 7, 6, 6, 4, 3, 7, 7, 3, 6, 4, 7, 6, 1, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 4, 4, 4, 5, 3, 5, 6, 7, 2, 5, 6, 5, 7, 7, 7, 6, 2, 5, 7, 6, 6, 7, 7, 6, 3, 5, 1, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 5, 1, 3, 7, 7, 7, 4, 5, 4, 2, 4, 6, 4, 4, 7, 4, 2, 6, 3, 5, 7, 5, 5, 5, 6, 1, 2, 4, 6, 5, 3, 3, 3, 2, 7, 4, 7, 6, 2, 7, 7, 6, 7, 4, 6, 1, 1, 1, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 2, 3, 3, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 3, 4, 5, 7, 7, 2, 5, 7, 4, 5, 6, 7, 6, 4, 4, 2, 6, 6, 5, 7, 6, 4, 5, 4, 6, 1, 4, 7, 3, 6, 5, 7, 7, 6, 2, 7, 3, 3, 2, 6, 5, 2, 6, 6, 3, 4, 6, 4, 2, 6, 6, 3, 4, 7, 1, 5, 6, 7, 2, 6, 7, 6, 6, 3, 6, 7, 6, 3, 5, 4, 7, 5, 7, 2, 6, 3, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 5, 7, 5, 6, 2, 2, 5, 4, 6, 5, 4, 4, 4, 3, 5, 2, 6, 4, 5, 7, 4, 5, 5, 5, 7, 5, 3, 6, 4, 7, 6, 1, 3, 7, 4, 5, 6, 6, 5, 4, 2, 2, 4, 7, 3, 6, 7, 6, 1, 7, 2, 3, 7, 6, 7, 7, 2, 2, 2, 7, 7, 6, 6, 3, 6, 4, 5, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 4, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 6, 6, 6, 7, 3, 6, 7, 2, 3, 7, 6, 5, 4, 6, 6, 4, 7, 3, 3, 3, 4, 7, 7, 6, 2, 5, 5, 7, 2, 6, 6, 2, 5, 5, 4, 7, 7, 5, 3, 4, 2, 6, 5, 6, 4, 7, 5, 5, 2, 7, 7, 6, 7, 6, 3, 1, 1, 1, 5, 3, 7, 4, 7, 7, 7, 6, 4, 7, 6, 4, 1, 7, 5, 3, 5, 5, 2, 4, 7, 5, 6, 7, 4, 6, 7, 4, 6, 3, 2, 5, 6, 3, 5, 1, 3, 7, 6, 5, 4, 5, 4, 2, 7, 7, 6, 2, 7, 3, 7, 5, 2, 7, 3, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 3, 6, 7, 7, 3, 6, 5, 7, 3, 5, 2, 7, 7, 3, 6, 7, 7, 5, 5, 1, 3, 7, 2, 6, 7, 3, 5, 7, 1, 5, 7, 6, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 1, 6, 6, 5, 7, 6, 1, 7, 6, 2, 7, 6, 3, 3, 2, 4, 4, 7, 2}, + {7, 5, 5, 5, 7, 7, 7, 6, 4, 4, 1, 3, 3, 3, 6, 1, 7, 6, 3, 5, 4, 6, 7, 5, 4, 4, 4, 7, 5, 4, 1, 7, 7, 2, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 1, 1, 1, 7, 5, 2, 5, 6, 4, 7, 6, 3, 7, 6, 2, 7, 3, 4, 5, 5, 5, 6, 3, 1, 7, 7, 2, 6, 5, 4, 6, 6, 3, 7, 7, 4, 5, 5, 5, 7, 2, 3, 4, 7, 6, 4, 4, 4, 6, 4, 7, 2, 2, 2, 6, 4, 3, 2, 7, 5, 6, 6, 6, 5, 3, 5, 2, 7, 6, 4, 3, 6, 7, 6, 7, 4, 3, 2, 4, 7, 5, 6, 3, 1, 4, 5, 7, 7, 7, 3, 6, 1, 5, 3, 7, 4, 3, 7, 5, 2, 6, 6, 7, 1, 5, 6, 7, 4, 6, 5, 6, 5, 1, 2, 4, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 3, 7, 5, 2, 6, 6, 5, 2, 7, 4, 4, 4, 7, 2, 6, 6, 3, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 2, 7, 6, 5, 5, 5, 2, 2, 5, 7, 2, 7, 3, 4, 5, 3, 7, 7, 2, 5, 5, 5, 1, 6, 5, 6, 2, 6, 3, 6, 5, 3, 7, 6, 3, 2, 4, 1, 5, 4, 3, 7, 3, 7, 5, 6, 5, 3, 7, 7, 7, 6, 6, 3, 4, 6, 2, 3, 1, 7, 2, 3, 5, 7, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 5, 4, 2}, + } + + FortuneDragonReelSureWinBaseSpinWeight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + FortuneDragonReelSureWinFreeSpinRange = [][]int64{ + {3, 3, 3}, + } + + FortuneDragonReelSureWinFreeSpinReel = [][]int64{ + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 7, 6, 3, 6, 4, 3, 4, 1, 3, 7, 7, 6, 5, 7, 5, 4, 6, 4, 4, 3, 4, 7, 7, 2, 4, 7, 4, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 7, 6, 7, 2, 5, 7, 4, 3, 6, 5, 7, 6, 3, 1, 6, 2, 3, 5, 6, 3, 2, 2, 5, 7, 6, 6, 4, 1, 7, 7, 3, 6, 4, 7, 6, 3, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 4, 4, 3, 5, 3, 5, 6, 7, 2, 5, 6, 5, 3, 7, 7, 6, 2, 5, 7, 6, 6, 7, 7, 6, 3, 5, 4, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 5, 1, 3, 7, 7, 7, 4, 5, 4, 4, 4, 6, 4, 4, 7, 4, 2, 6, 3, 5, 7, 5, 5, 5, 6, 3, 2, 4, 6, 5, 3, 3, 3, 2, 7, 4, 7, 6, 7, 7, 7, 6, 7, 4, 6, 1, 1, 1, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 7, 1, 3, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 7, 5, 5, 7, 4, 5, 6, 7, 6, 4, 4, 1, 6, 6, 5, 7, 6, 4, 5, 4, 6, 7, 4, 7, 3, 6, 5, 7, 7, 6, 2, 7, 3, 2, 2, 6, 5, 2, 6, 6, 2, 4, 6, 4, 6, 6, 6, 3, 4, 7, 3, 5, 6, 7, 2, 6, 7, 6, 6, 3, 6, 7, 6, 3, 5, 4, 7, 5, 7, 2, 6, 3, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 5, 7, 5, 6, 2, 3, 5, 4, 6, 5, 4, 1, 4, 3, 5, 7, 6, 4, 5, 7, 4, 5, 5, 5, 7, 2, 6, 6, 4, 7, 6, 1, 3, 7, 4, 5, 6, 6, 5, 4, 1, 5, 4, 7, 3, 6, 7, 6, 3, 7, 7, 3, 7, 6, 7, 7, 2, 2, 2, 7, 7, 6, 6, 3, 6, 4, 5, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 3, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 6, 3, 6, 7, 3, 6, 7, 2, 3, 7, 6, 5, 4, 6, 3, 4, 7, 3, 6, 3, 4, 1, 7, 6, 5, 3, 7, 6, 5, 7, 6, 2, 5, 7, 4, 5, 7, 3, 5, 4, 1, 6, 5, 4, 6, 7, 5, 4, 5, 7, 7, 6, 7, 6, 3, 1, 1, 1, 5, 3, 7, 4, 7, 7, 7, 6, 4, 7, 6, 4, 1, 7, 5, 3, 5, 5, 2, 4, 7, 5, 6, 7, 4, 6, 7, 4, 6, 3, 2, 5, 6, 3, 5, 6, 3, 7, 6, 5, 4, 5, 4, 1, 7, 7, 6, 2, 7, 3, 7, 5, 5, 7, 3, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 6, 6, 7, 7, 1, 6, 5, 7, 3, 5, 2, 7, 7, 3, 6, 7, 7, 5, 5, 7, 7, 7, 2, 6, 7, 3, 5, 7, 1, 5, 7, 6, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 1, 6, 6, 5, 7, 6, 1, 7, 6, 7, 4, 6, 3, 7, 5, 4, 4, 7, 2}, + {7, 5, 5, 4, 7, 3, 7, 6, 4, 2, 4, 3, 5, 7, 6, 1, 7, 6, 4, 5, 3, 6, 7, 5, 4, 4, 4, 7, 5, 4, 1, 7, 7, 2, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 1, 1, 1, 7, 5, 2, 5, 6, 4, 7, 6, 3, 7, 6, 1, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 4, 6, 6, 1, 7, 7, 4, 3, 5, 5, 7, 2, 3, 4, 7, 6, 3, 4, 4, 6, 4, 7, 2, 2, 2, 6, 6, 6, 2, 7, 5, 6, 7, 3, 5, 3, 5, 2, 7, 6, 4, 3, 6, 7, 6, 7, 4, 3, 2, 4, 7, 5, 4, 7, 1, 4, 5, 7, 7, 7, 4, 6, 7, 5, 6, 7, 4, 3, 7, 5, 6, 6, 6, 7, 1, 5, 6, 7, 4, 6, 5, 6, 5, 1, 5, 4, 3, 5, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 6, 7, 5, 6, 4, 6, 5, 2, 7, 4, 4, 4, 7, 6, 6, 1, 7, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 6, 7, 6, 5, 5, 5, 4, 2, 5, 7, 7, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 6, 6, 5, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 5, 4, 1, 5, 4, 3, 7, 3, 7, 1, 6, 5, 7, 2, 5, 7, 6, 6, 3, 4, 6, 2, 3, 1, 7, 6, 1, 5, 7, 5, 5, 5, 6, 3, 5, 7, 4, 1, 7, 6, 5, 4, 2}, + } + + FortuneDragonReelSureWinFreeSpinWeight = [][]float64{ + {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0}, + } + + FortuneDragonSymbol = map[int64]*structs.FortuneDragonSymbol{ + 1: { + ID: 1, + Name: "Wild", + IsWild: true, + Group: []int64{1}, + PayRate: []int64{0, 0, 100}, + ClientOrder: 0, + ClientDsc: "", + }, + 2: { + ID: 2, + Name: "元宝", + IsWild: false, + Group: []int64{2}, + PayRate: []int64{0, 0, 50}, + ClientOrder: 0, + ClientDsc: "", + }, + 3: { + ID: 3, + Name: "红包", + IsWild: false, + Group: []int64{3}, + PayRate: []int64{0, 0, 25}, + ClientOrder: 0, + ClientDsc: "", + }, + 4: { + ID: 4, + Name: "灯笼", + IsWild: false, + Group: []int64{4}, + PayRate: []int64{0, 0, 10}, + ClientOrder: 0, + ClientDsc: "", + }, + 5: { + ID: 5, + Name: "福炮", + IsWild: false, + Group: []int64{5}, + PayRate: []int64{0, 0, 5}, + ClientOrder: 0, + ClientDsc: "", + }, + 6: { + ID: 6, + Name: "花结", + IsWild: false, + Group: []int64{6}, + PayRate: []int64{0, 0, 3}, + ClientOrder: 0, + ClientDsc: "", + }, + 7: { + ID: 7, + Name: "铜钱", + IsWild: false, + Group: []int64{7}, + PayRate: []int64{0, 0, 2}, + ClientOrder: 0, + ClientDsc: "", + }, + 8: { + ID: 8, + Name: "X2", + IsWild: false, + Group: []int64{8}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 9: { + ID: 9, + Name: "X5", + IsWild: false, + Group: []int64{8}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 10: { + ID: 10, + Name: "X10", + IsWild: false, + Group: []int64{8}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 200: { + ID: 200, + Name: "Empty", + IsWild: false, + Group: []int64{8}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + } + + FortuneDragonSymbolBetRatio = []*structs.FortuneDragonSymbolBetRatio{ + { + BetRatio: 1, + }, + } + +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_mouse.go b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_mouse.go new file mode 100644 index 0000000..e8930b9 --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_mouse.go @@ -0,0 +1,392 @@ +//go:build !debug +// +build !debug + +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +func init() { + FortuneMouseBetBetChangeList = map[int64]*structs.FortuneMouseBetBetChangeList{ + 0: { + Index: 0, + BetChangeList: 0.15, + BetSizeIndex: 0, + BetLevelIndex: 0, + }, + 1: { + Index: 1, + BetChangeList: 0.3, + BetSizeIndex: 0, + BetLevelIndex: 1, + }, + 2: { + Index: 2, + BetChangeList: 0.45, + BetSizeIndex: 0, + BetLevelIndex: 2, + }, + 3: { + Index: 3, + BetChangeList: 0.5, + BetSizeIndex: 1, + BetLevelIndex: 0, + }, + 4: { + Index: 4, + BetChangeList: 0.75, + BetSizeIndex: 0, + BetLevelIndex: 4, + }, + 5: { + Index: 5, + BetChangeList: 1.5, + BetSizeIndex: 0, + BetLevelIndex: 9, + }, + 6: { + Index: 6, + BetChangeList: 2.5, + BetSizeIndex: 1, + BetLevelIndex: 4, + }, + 7: { + Index: 7, + BetChangeList: 4.5, + BetSizeIndex: 3, + BetLevelIndex: 0, + }, + 8: { + Index: 8, + BetChangeList: 5, + BetSizeIndex: 1, + BetLevelIndex: 9, + }, + 9: { + Index: 9, + BetChangeList: 7.5, + BetSizeIndex: 2, + BetLevelIndex: 4, + }, + 10: { + Index: 10, + BetChangeList: 15, + BetSizeIndex: 2, + BetLevelIndex: 9, + }, + 11: { + Index: 11, + BetChangeList: 22.5, + BetSizeIndex: 3, + BetLevelIndex: 4, + }, + 12: { + Index: 12, + BetChangeList: 45, + BetSizeIndex: 3, + BetLevelIndex: 9, + }, + } + + FortuneMouseBetBetLevel = map[int64]*structs.FortuneMouseBetBetLevel{ + 0: { + Index: 0, + BetLevel: 1, + }, + 1: { + Index: 1, + BetLevel: 2, + }, + 2: { + Index: 2, + BetLevel: 3, + }, + 3: { + Index: 3, + BetLevel: 4, + }, + 4: { + Index: 4, + BetLevel: 5, + }, + 5: { + Index: 5, + BetLevel: 6, + }, + 6: { + Index: 6, + BetLevel: 7, + }, + 7: { + Index: 7, + BetLevel: 8, + }, + 8: { + Index: 8, + BetLevel: 9, + }, + 9: { + Index: 9, + BetLevel: 10, + }, + } + + FortuneMouseBetBetLine = map[int64]*structs.FortuneMouseBetBetLine{ + 0: { + Index: 0, + BetLine: 5, + }, + } + + FortuneMouseBetBetSize = map[int64]*structs.FortuneMouseBetBetSize{ + 0: { + Index: 0, + BetSize: 300, + }, + 1: { + Index: 1, + BetSize: 1000, + }, + 2: { + Index: 2, + BetSize: 3000, + }, + 3: { + Index: 3, + BetSize: 9000, + }, + } + + FortuneMouseBetFirstBet = map[int64]*structs.FortuneMouseBetFirstBet{ + 1: { + Index: 1, + BetSizeIndex: 1, + BetLevelIndex: 1, + }, + } + + FortuneMouseFormation = []*structs.FortuneMouseFormation{ + { + SpinType: 1, + NodeType: "BaseSpin", + ID: 1, + SeqID: 1, + Reel: "BaseSpin", + Matrix: "Line5Form3X3TypeB", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 3, + NodeType: "ReSpin", + ID: 1, + SeqID: 1, + Reel: "ReSpin", + Matrix: "Line5Form3X3TypeB", + Symbol: "Default", + FirstInitMethod: 3, + OtherInitMethod: 3, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + } + + FortuneMouseMapRTPMode = map[int64]*structs.FortuneMouseMapRTPMode{ + 1: { + ID: 1, + TypeWeight: map[int64]*structs.FortuneMouseMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "96", + Rtp: 0.96, + }, + 2: { + ID: 2, + TypeWeight: map[int64]*structs.FortuneMouseMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "80", + Rtp: 0.8, + }, + 3: { + ID: 3, + TypeWeight: map[int64]*structs.FortuneMouseMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "120", + Rtp: 1.2, + }, + } + + FortuneMouseOthers = []*structs.FortuneMouseOthers{ + { + RespinTriggerPro: 0.0123, + MaxWin: 1000, + ExtraWin: 700, + }, + } + + FortuneMouseReelBaseSpinRange = [][]int64{ + {3, 3, 3}, + } + + FortuneMouseReelBaseSpinReel = [][]int64{ + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 7, 6, 6, 6, 5, 3, 4, 2, 7, 7, 7, 6, 5, 5, 5, 4, 6, 5, 5, 5, 4, 7, 7, 7, 4, 7, 6, 5, 3, 3, 3, 5, 7, 6, 5, 7, 6, 5, 7, 7, 7, 6, 5, 7, 4, 3, 6, 5, 7, 6, 3, 6, 6, 2, 3, 5, 6, 3, 2, 2, 5, 7, 6, 6, 4, 1, 7, 7, 3, 6, 4, 7, 6, 1, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 4, 4, 4, 5, 3, 5, 6, 7, 2, 5, 6, 5, 7, 7, 7, 6, 1, 5, 7, 6, 6, 7, 7, 6, 3, 5, 1, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 5, 1, 3, 7, 7, 7, 4, 5, 7, 6, 4, 5, 4, 6, 7, 4, 2, 6, 3, 5, 7, 5, 5, 5, 6, 1, 2, 4, 6, 5, 3, 3, 3, 2, 7, 4, 7, 6, 7, 7, 7, 6, 7, 4, 6, 1, 5, 6, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 7, 3, 3, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 7, 5, 5, 7, 4, 5, 6, 7, 6, 5, 4, 1, 6, 6, 5, 7, 6, 4, 5, 4, 6, 7, 7, 7, 3, 6, 5, 7, 7, 6, 2, 7, 3, 2, 2, 6, 5, 2, 6, 6, 6, 4, 4, 4, 6, 6, 6, 3, 4, 7, 1, 5, 6, 7, 2, 6, 7, 6, 6, 3, 6, 7, 6, 3, 5, 4, 7, 5, 7, 2, 6, 3, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 5, 7, 6, 6, 2, 7, 5, 4, 6, 5, 4, 4, 4, 3, 5, 2, 6, 4, 5, 7, 4, 5, 5, 5, 7, 6, 6, 6, 4, 7, 6, 6, 6, 7, 4, 6, 6, 6, 5, 4, 7, 6, 4, 7, 3, 6, 7, 6, 7, 7, 7, 3, 7, 6, 7, 7, 2, 2, 2, 7, 7, 6, 6, 3, 6, 4, 5, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 4, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 6, 6, 6, 7, 3, 6, 7, 2, 3, 7, 6, 5, 4, 6, 6, 4, 7, 3, 3, 3, 4, 7, 7, 6, 1, 5, 5, 7, 7, 6, 6, 2, 5, 5, 4, 7, 7, 5, 3, 4, 2, 6, 6, 6, 4, 7, 5, 5, 5, 7, 7, 6, 7, 6, 3, 1, 1, 1, 2, 3, 7, 4, 7, 7, 7, 6, 4, 7, 6, 4, 1, 7, 5, 3, 6, 6, 6, 4, 7, 5, 6, 7, 4, 6, 7, 4, 6, 3, 2, 5, 6, 3, 5, 1, 1, 1, 6, 5, 4, 5, 4, 7, 7, 7, 6, 2, 7, 3, 7, 5, 5, 7, 3, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 6, 6, 7, 7, 7, 6, 5, 7, 3, 6, 2, 7, 7, 3, 6, 7, 7, 5, 5, 7, 7, 7, 2, 6, 7, 3, 5, 7, 1, 6, 5, 2, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 1, 6, 6, 5, 7, 6, 1, 7, 6, 7, 7, 6, 3, 3, 2, 4, 4, 7, 2}, + {7, 5, 5, 5, 7, 7, 7, 6, 4, 4, 4, 3, 3, 3, 6, 6, 6, 7, 3, 5, 5, 6, 7, 5, 4, 4, 4, 7, 5, 4, 1, 7, 7, 7, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 1, 1, 1, 7, 5, 2, 5, 6, 4, 7, 6, 3, 7, 6, 7, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 4, 6, 6, 1, 7, 7, 4, 5, 5, 5, 7, 2, 3, 4, 7, 6, 4, 4, 4, 6, 4, 7, 2, 2, 2, 6, 6, 6, 2, 7, 5, 6, 6, 6, 5, 3, 5, 1, 7, 6, 4, 3, 6, 7, 6, 7, 4, 3, 2, 4, 7, 5, 6, 3, 7, 4, 5, 7, 7, 7, 3, 6, 7, 5, 6, 7, 4, 3, 7, 5, 6, 6, 6, 7, 1, 5, 6, 7, 4, 6, 5, 6, 5, 7, 2, 4, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 7, 7, 5, 6, 6, 6, 5, 2, 7, 4, 4, 4, 7, 6, 6, 6, 7, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 6, 7, 6, 5, 5, 5, 2, 2, 5, 7, 7, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 6, 6, 5, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 2, 4, 1, 5, 4, 3, 7, 3, 7, 5, 6, 5, 4, 7, 7, 7, 6, 6, 3, 4, 6, 2, 3, 1, 7, 2, 1, 5, 7, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 5, 4, 2}, + } + + FortuneMouseReelBaseSpinWeight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + FortuneMouseReelReSpinRange = [][]int64{ + {3, 3, 3}, + } + + FortuneMouseReelReSpinReel = [][]int64{ + {1, 1, 1, 2, 2, 2, 2, 7, 7, 7, 7, 8, 8, 8, 6, 6, 6, 6, 3, 3, 3, 3, 8, 8, 8, 5, 5, 5, 5, 4, 4, 4, 4, 8, 8, 8}, + {1, 1, 1}, + {1, 1, 1, 2, 2, 2, 2, 7, 7, 7, 7, 8, 8, 8, 6, 6, 6, 6, 3, 3, 3, 3, 8, 8, 8, 5, 5, 5, 5, 4, 4, 4, 4, 8, 8, 8}, + } + + FortuneMouseReelReSpinWeight = [][]float64{ + {0.5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1}, + {0.5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + FortuneMouseSuperStackWeight = []*structs.FortuneMouseSuperStackWeight{ + { + ID: 1, + ItemID: 1, + Weight: 0, + }, + { + ID: 2, + ItemID: 2, + Weight: 3, + }, + { + ID: 3, + ItemID: 3, + Weight: 5, + }, + { + ID: 4, + ItemID: 4, + Weight: 7, + }, + { + ID: 5, + ItemID: 5, + Weight: 8, + }, + { + ID: 6, + ItemID: 6, + Weight: 9, + }, + { + ID: 7, + ItemID: 7, + Weight: 10, + }, + } + + FortuneMouseSymbol = map[int64]*structs.FortuneMouseSymbol{ + 1: { + ID: 1, + Name: "wild", + IsWild: true, + Group: []int64{1}, + PayRate: []int64{0, 0, 300}, + ClientOrder: 1, + ClientDsc: "", + }, + 2: { + ID: 2, + Name: "倒福", + IsWild: false, + Group: []int64{2}, + PayRate: []int64{0, 0, 100}, + ClientOrder: 2, + ClientDsc: "", + }, + 3: { + ID: 3, + Name: "红包", + IsWild: false, + Group: []int64{3}, + PayRate: []int64{0, 0, 50}, + ClientOrder: 3, + ClientDsc: "", + }, + 4: { + ID: 4, + Name: "钱袋", + IsWild: false, + Group: []int64{4}, + PayRate: []int64{0, 0, 30}, + ClientOrder: 4, + ClientDsc: "", + }, + 5: { + ID: 5, + Name: "爆竹", + IsWild: false, + Group: []int64{5}, + PayRate: []int64{0, 0, 15}, + ClientOrder: 5, + ClientDsc: "", + }, + 6: { + ID: 6, + Name: "橘子", + IsWild: false, + Group: []int64{6}, + PayRate: []int64{0, 0, 5}, + ClientOrder: 6, + ClientDsc: "", + }, + 7: { + ID: 7, + Name: "花生", + IsWild: false, + Group: []int64{7}, + PayRate: []int64{0, 0, 3}, + ClientOrder: 7, + ClientDsc: "", + }, + 8: { + ID: 8, + Name: "SuperStack", + IsWild: false, + Group: []int64{8}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + } + + FortuneMouseSymbolBetRatio = []*structs.FortuneMouseSymbolBetRatio{ + { + BetRatio: 1, + }, + } + +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_ox.go b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_ox.go new file mode 100644 index 0000000..a50d12f --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_ox.go @@ -0,0 +1,439 @@ +//go:build !debug +// +build !debug + +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +func init() { + FortuneOxBetBetChangeList = map[int64]*structs.FortuneOxBetBetChangeList{ + 0: { + Index: 0, + BetChangeList: 0.3, + BetSizeIndex: 0, + BetLevelIndex: 0, + }, + 1: { + Index: 1, + BetChangeList: 0.6, + BetSizeIndex: 0, + BetLevelIndex: 1, + }, + 2: { + Index: 2, + BetChangeList: 0.9, + BetSizeIndex: 0, + BetLevelIndex: 2, + }, + 3: { + Index: 3, + BetChangeList: 1, + BetSizeIndex: 1, + BetLevelIndex: 0, + }, + 4: { + Index: 4, + BetChangeList: 1.5, + BetSizeIndex: 0, + BetLevelIndex: 4, + }, + 5: { + Index: 5, + BetChangeList: 3, + BetSizeIndex: 0, + BetLevelIndex: 9, + }, + 6: { + Index: 6, + BetChangeList: 5, + BetSizeIndex: 1, + BetLevelIndex: 4, + }, + 7: { + Index: 7, + BetChangeList: 9, + BetSizeIndex: 3, + BetLevelIndex: 0, + }, + 8: { + Index: 8, + BetChangeList: 10, + BetSizeIndex: 1, + BetLevelIndex: 9, + }, + 9: { + Index: 9, + BetChangeList: 15, + BetSizeIndex: 2, + BetLevelIndex: 4, + }, + 10: { + Index: 10, + BetChangeList: 30, + BetSizeIndex: 2, + BetLevelIndex: 9, + }, + 11: { + Index: 11, + BetChangeList: 45, + BetSizeIndex: 3, + BetLevelIndex: 4, + }, + 12: { + Index: 12, + BetChangeList: 90, + BetSizeIndex: 3, + BetLevelIndex: 9, + }, + } + + FortuneOxBetBetLevel = map[int64]*structs.FortuneOxBetBetLevel{ + 0: { + Index: 0, + BetLevel: 1, + }, + 1: { + Index: 1, + BetLevel: 2, + }, + 2: { + Index: 2, + BetLevel: 3, + }, + 3: { + Index: 3, + BetLevel: 4, + }, + 4: { + Index: 4, + BetLevel: 5, + }, + 5: { + Index: 5, + BetLevel: 6, + }, + 6: { + Index: 6, + BetLevel: 7, + }, + 7: { + Index: 7, + BetLevel: 8, + }, + 8: { + Index: 8, + BetLevel: 9, + }, + 9: { + Index: 9, + BetLevel: 10, + }, + } + + FortuneOxBetBetLine = map[int64]*structs.FortuneOxBetBetLine{ + 0: { + Index: 0, + BetLine: 10, + }, + } + + FortuneOxBetBetSize = map[int64]*structs.FortuneOxBetBetSize{ + 0: { + Index: 0, + BetSize: 300, + }, + 1: { + Index: 1, + BetSize: 1000, + }, + 2: { + Index: 2, + BetSize: 3000, + }, + 3: { + Index: 3, + BetSize: 9000, + }, + } + + FortuneOxBetFirstBet = map[int64]*structs.FortuneOxBetFirstBet{ + 1: { + Index: 1, + BetSizeIndex: 1, + BetLevelIndex: 0, + }, + } + + FortuneOxFormation = []*structs.FortuneOxFormation{ + { + SpinType: 1, + NodeType: "BaseSpin", + ID: 1, + SeqID: 1, + Reel: "BaseSpin", + Matrix: "Line10Form343TypeA", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 3, + NodeType: "ReSpin", + ID: 1, + SeqID: 1, + Reel: "ReSpin", + Matrix: "Line10Form343TypeA", + Symbol: "Default", + FirstInitMethod: 3, + OtherInitMethod: 3, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + } + + FortuneOxMapRTPMode = map[int64]*structs.FortuneOxMapRTPMode{ + 1: { + ID: 1, + TypeWeight: map[int64]*structs.FortuneOxMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "96", + Rtp: 0.96, + }, + 2: { + ID: 2, + TypeWeight: map[int64]*structs.FortuneOxMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "80", + Rtp: 0.8, + }, + 3: { + ID: 3, + TypeWeight: map[int64]*structs.FortuneOxMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "120", + Rtp: 1.2, + }, + } + + FortuneOxOthers = []*structs.FortuneOxOthers{ + { + RespinTriggerPro: 0.0107, + Multiplier: 10, + MaxWin: 2000, + }, + } + + FortuneOxReelBaseSpinRange = [][]int64{ + {3, 4, 3}, + } + + FortuneOxReelBaseSpinReel = [][]int64{ + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 5, 6, 7, 6, 6, 6, 2, 2, 2, 1, 1, 4, 4, 4, 5, 7, 5, 4, 6, 4, 4, 3, 4, 7, 7, 7, 4, 7, 4, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 7, 7, 7, 2, 5, 7, 4, 2, 6, 5, 7, 6, 6, 6, 2, 2, 2, 5, 6, 2, 2, 2, 5, 7, 6, 6, 4, 2, 7, 7, 7, 6, 5, 7, 6, 1, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 6, 6, 6, 5, 7, 5, 6, 7, 2, 5, 6, 5, 7, 7, 7, 6, 2, 5, 7, 6, 6, 7, 7, 6, 7, 5, 2, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 2, 2, 2, 7, 7, 7, 4, 5, 4, 4, 4, 6, 4, 4, 7, 4, 2, 6, 7, 7, 5, 5, 5, 7, 6, 1, 2, 4, 6, 5, 7, 2, 2, 2, 7, 4, 7, 5, 6, 7, 7, 7, 5, 6, 7, 4, 6, 1, 5, 5, 5, 6, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 7, 7, 7, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 6, 5, 7, 6, 5, 5, 7, 4, 5, 6, 7, 6, 4, 4, 2, 5, 5, 5, 7, 6, 4, 5, 4, 6, 7, 4, 7, 3, 6, 5, 7, 7, 6, 2, 7, 7, 2, 2, 6, 5, 2, 6, 6, 6, 4, 6, 5, 4, 6, 6, 6, 3, 4, 7, 2, 5, 6, 7, 2, 6, 6, 6, 6, 6, 7, 7, 7, 7, 5, 4, 7, 5, 7, 2, 6, 7, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 7, 7, 7, 7, 6, 2, 7, 5, 6, 4, 4, 4, 4, 3, 1, 2, 3, 4, 4, 7, 5, 5, 5, 5, 6, 6, 6, 6, 4, 7, 6, 1, 1, 7, 4, 5, 7, 6, 5, 4, 6, 7, 4, 7, 3, 5, 6, 7, 1, 5, 7, 3, 4, 6, 7, 2, 2, 2, 2, 7, 7, 6, 6, 3, 4, 6, 5, 1, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 4, 4, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 6, 6, 6, 6, 3, 6, 7, 2, 3, 7, 6, 5, 4, 7, 6, 4, 3, 3, 3, 3, 4, 7, 7, 5, 1, 6, 5, 7, 7, 6, 6, 2, 5, 5, 4, 7, 7, 5, 3, 4, 2, 6, 5, 6, 4, 7, 5, 5, 5, 7, 7, 6, 7, 6, 3, 1, 1, 1, 5, 3, 7, 7, 7, 7, 7, 6, 4, 7, 6, 4, 1, 7, 5, 3, 5, 5, 5, 5, 1, 7, 4, 6, 7, 4, 6, 7, 4, 6, 3, 7, 5, 6, 3, 5, 1, 1, 1, 6, 5, 4, 5, 7, 7, 7, 7, 1, 2, 2, 3, 3, 7, 7, 7, 7, 7, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 6, 6, 6, 7, 1, 6, 5, 7, 3, 5, 6, 7, 7, 3, 6, 7, 5, 5, 7, 7, 7, 7, 7, 6, 5, 5, 5, 5, 1, 1, 1, 1, 2, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 1, 6, 6, 6, 6, 5, 1, 7, 7, 7, 7, 6, 3, 7, 5, 4, 4, 7, 6, 7, 7, 7, 7, 7}, + {5, 5, 5, 7, 7, 7, 6, 4, 4, 4, 3, 3, 3, 6, 1, 7, 6, 5, 5, 5, 6, 7, 5, 4, 3, 6, 7, 5, 4, 3, 7, 7, 7, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 1, 1, 3, 7, 5, 3, 7, 6, 4, 7, 6, 3, 7, 6, 7, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 6, 6, 6, 7, 7, 7, 4, 5, 5, 5, 7, 2, 3, 4, 7, 6, 4, 7, 3, 6, 4, 7, 2, 2, 2, 6, 6, 6, 3, 7, 5, 6, 6, 6, 3, 7, 5, 3, 7, 6, 4, 3, 6, 7, 4, 6, 7, 3, 2, 7, 7, 7, 6, 3, 3, 3, 5, 7, 7, 7, 3, 6, 3, 1, 1, 7, 6, 3, 7, 5, 6, 6, 6, 7, 3, 5, 6, 7, 4, 6, 6, 6, 5, 3, 2, 7, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 7, 7, 5, 6, 6, 6, 5, 3, 7, 4, 4, 4, 7, 6, 6, 6, 7, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 6, 7, 6, 5, 5, 5, 2, 2, 7, 7, 7, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 6, 6, 6, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 2, 4, 3, 3, 3, 5, 7, 3, 5, 7, 6, 5, 7, 7, 7, 7, 6, 6, 3, 7, 4, 6, 2, 3, 5, 7, 2, 1, 5, 7, 6, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 7, 4, 2, 7, 7, 7, 6, 6, 6, 7, 7, 7}, + } + + FortuneOxReelBaseSpinWeight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + FortuneOxReelReSpinRange = [][]int64{ + {3, 4, 3}, + } + + FortuneOxReelReSpinReel = [][]int64{ + {8, 8, 8, 9, 9, 9, 1, 1, 1}, + {9, 9, 9, 1, 1, 1, 9, 9, 9, 2, 2, 2, 2, 7, 7, 7, 7, 1, 1, 1, 1, 6, 6, 6, 6, 3, 3, 3, 3, 9, 9, 9, 8, 8, 8, 5, 5, 5, 5, 4, 4, 4, 4, 8, 8, 8}, + {8, 8, 8, 9, 9, 9, 1, 1, 1}, + } + + FortuneOxReelReSpinWeight = [][]float64{ + {34, 1, 1, 1, 1, 0.4, 0.2, 0.4, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 11, 1, 1, 1, 0, 1, 1, 1, 11, 1, 1, 1, 6, 1, 1, 1, 1, 1, 7, 1, 1, 1, 9, 1, 1, 1, 8, 1, 1, 1, 7, 1, 1}, + {34, 1, 1, 1, 1, 0.4, 0.2, 0.4, 1}, + } + + FortuneOxSuperStack1Weight = []*structs.FortuneOxSuperStack1Weight{ + { + ID: 1, + ItemID: 1, + Weight: 0, + }, + { + ID: 2, + ItemID: 2, + Weight: 1, + }, + { + ID: 3, + ItemID: 3, + Weight: 4, + }, + { + ID: 4, + ItemID: 4, + Weight: 10, + }, + { + ID: 5, + ItemID: 5, + Weight: 15, + }, + { + ID: 6, + ItemID: 6, + Weight: 30, + }, + { + ID: 7, + ItemID: 7, + Weight: 40, + }, + } + + FortuneOxSuperStack2Weight = []*structs.FortuneOxSuperStack2Weight{ + { + ID: 1, + ItemID: 1, + Weight: 0, + }, + { + ID: 2, + ItemID: 2, + Weight: 1, + }, + { + ID: 3, + ItemID: 3, + Weight: 2, + }, + { + ID: 4, + ItemID: 4, + Weight: 3, + }, + { + ID: 5, + ItemID: 5, + Weight: 4, + }, + { + ID: 6, + ItemID: 6, + Weight: 5, + }, + { + ID: 7, + ItemID: 7, + Weight: 6, + }, + } + + FortuneOxSymbol = map[int64]*structs.FortuneOxSymbol{ + 1: { + ID: 1, + Name: "wild", + IsWild: true, + Group: []int64{1}, + PayRate: []int64{0, 0, 200}, + ClientOrder: 1, + ClientDsc: "", + }, + 2: { + ID: 2, + Name: "元宝", + IsWild: false, + Group: []int64{2}, + PayRate: []int64{0, 0, 100}, + ClientOrder: 2, + ClientDsc: "", + }, + 3: { + ID: 3, + Name: "金锦盒", + IsWild: false, + Group: []int64{3}, + PayRate: []int64{0, 0, 50}, + ClientOrder: 3, + ClientDsc: "", + }, + 4: { + ID: 4, + Name: "钱袋", + IsWild: false, + Group: []int64{4}, + PayRate: []int64{0, 0, 20}, + ClientOrder: 4, + ClientDsc: "", + }, + 5: { + ID: 5, + Name: "红包", + IsWild: false, + Group: []int64{5}, + PayRate: []int64{0, 0, 10}, + ClientOrder: 5, + ClientDsc: "", + }, + 6: { + ID: 6, + Name: "橘子", + IsWild: false, + Group: []int64{6}, + PayRate: []int64{0, 0, 5}, + ClientOrder: 6, + ClientDsc: "", + }, + 7: { + ID: 7, + Name: "炮竹", + IsWild: false, + Group: []int64{7}, + PayRate: []int64{0, 0, 3}, + ClientOrder: 7, + ClientDsc: "", + }, + 8: { + ID: 8, + Name: "SuperStack1", + IsWild: false, + Group: []int64{8}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 9: { + ID: 9, + Name: "SuperStack2", + IsWild: false, + Group: []int64{9}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + } + + FortuneOxSymbolBetRatio = []*structs.FortuneOxSymbolBetRatio{ + { + BetRatio: 1, + }, + } + +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_rabbit.go b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_rabbit.go new file mode 100644 index 0000000..f5cdbd0 --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_rabbit.go @@ -0,0 +1,480 @@ +//go:build !debug +// +build !debug + +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +func init() { + FortuneRabbitBetBetChangeList = map[int64]*structs.FortuneRabbitBetBetChangeList{ + 0: { + Index: 0, + BetChangeList: 0.3, + BetSizeIndex: 0, + BetLevelIndex: 0, + }, + 1: { + Index: 1, + BetChangeList: 0.6, + BetSizeIndex: 0, + BetLevelIndex: 1, + }, + 2: { + Index: 2, + BetChangeList: 0.9, + BetSizeIndex: 0, + BetLevelIndex: 2, + }, + 3: { + Index: 3, + BetChangeList: 1, + BetSizeIndex: 1, + BetLevelIndex: 0, + }, + 4: { + Index: 4, + BetChangeList: 1.5, + BetSizeIndex: 0, + BetLevelIndex: 4, + }, + 5: { + Index: 5, + BetChangeList: 3, + BetSizeIndex: 0, + BetLevelIndex: 9, + }, + 6: { + Index: 6, + BetChangeList: 5, + BetSizeIndex: 1, + BetLevelIndex: 4, + }, + 7: { + Index: 7, + BetChangeList: 9, + BetSizeIndex: 3, + BetLevelIndex: 0, + }, + 8: { + Index: 8, + BetChangeList: 10, + BetSizeIndex: 1, + BetLevelIndex: 9, + }, + 9: { + Index: 9, + BetChangeList: 15, + BetSizeIndex: 2, + BetLevelIndex: 4, + }, + 10: { + Index: 10, + BetChangeList: 30, + BetSizeIndex: 2, + BetLevelIndex: 9, + }, + 11: { + Index: 11, + BetChangeList: 45, + BetSizeIndex: 3, + BetLevelIndex: 4, + }, + 12: { + Index: 12, + BetChangeList: 90, + BetSizeIndex: 3, + BetLevelIndex: 9, + }, + } + + FortuneRabbitBetBetLevel = map[int64]*structs.FortuneRabbitBetBetLevel{ + 0: { + Index: 0, + BetLevel: 1, + }, + 1: { + Index: 1, + BetLevel: 2, + }, + 2: { + Index: 2, + BetLevel: 3, + }, + 3: { + Index: 3, + BetLevel: 4, + }, + 4: { + Index: 4, + BetLevel: 5, + }, + 5: { + Index: 5, + BetLevel: 6, + }, + 6: { + Index: 6, + BetLevel: 7, + }, + 7: { + Index: 7, + BetLevel: 8, + }, + 8: { + Index: 8, + BetLevel: 9, + }, + 9: { + Index: 9, + BetLevel: 10, + }, + } + + FortuneRabbitBetBetLine = map[int64]*structs.FortuneRabbitBetBetLine{ + 0: { + Index: 0, + BetLine: 10, + }, + } + + FortuneRabbitBetBetSize = map[int64]*structs.FortuneRabbitBetBetSize{ + 0: { + Index: 0, + BetSize: 300, + }, + 1: { + Index: 1, + BetSize: 1000, + }, + 2: { + Index: 2, + BetSize: 3000, + }, + 3: { + Index: 3, + BetSize: 9000, + }, + } + + FortuneRabbitBetFirstBet = map[int64]*structs.FortuneRabbitBetFirstBet{ + 1: { + Index: 1, + BetSizeIndex: 1, + BetLevelIndex: 0, + }, + } + + FortuneRabbitCashPrizeWeight = []*structs.FortuneRabbitCashPrizeWeight{ + { + ID: 1, + PrizeValue: 0.5, + Weight: 150, + NoWinWeight: 100, + }, + { + ID: 2, + PrizeValue: 1, + Weight: 25, + NoWinWeight: 25, + }, + { + ID: 3, + PrizeValue: 2, + Weight: 9, + NoWinWeight: 9, + }, + { + ID: 4, + PrizeValue: 5, + Weight: 55, + NoWinWeight: 55, + }, + { + ID: 5, + PrizeValue: 10, + Weight: 6, + NoWinWeight: 12, + }, + { + ID: 6, + PrizeValue: 20, + Weight: 3, + NoWinWeight: 9, + }, + { + ID: 7, + PrizeValue: 30, + Weight: 0.6, + NoWinWeight: 6, + }, + { + ID: 8, + PrizeValue: 50, + Weight: 1, + NoWinWeight: 3, + }, + { + ID: 9, + PrizeValue: 100, + Weight: 0.39, + NoWinWeight: 0.9, + }, + { + ID: 10, + PrizeValue: 500, + Weight: 0.01, + NoWinWeight: 0.1, + }, + } + + FortuneRabbitForceCashCountWeight = []*structs.FortuneRabbitForceCashCountWeight{ + { + ID: 1, + Count: 5, + Weight: 80, + }, + { + ID: 2, + Count: 6, + Weight: 15, + }, + { + ID: 3, + Count: 7, + Weight: 5, + }, + { + ID: 4, + Count: 8, + Weight: 0, + }, + { + ID: 5, + Count: 9, + Weight: 0, + }, + { + ID: 6, + Count: 10, + Weight: 0, + }, + { + ID: 7, + Count: 11, + Weight: 0, + }, + } + + FortuneRabbitFormation = []*structs.FortuneRabbitFormation{ + { + SpinType: 1, + NodeType: "BaseSpin", + ID: 1, + SeqID: 1, + Reel: "BaseSpin", + Matrix: "Line10Form343TypeA", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 3, + NodeType: "FreeSpin", + ID: 1, + SeqID: 1, + Reel: "FreeSpin", + Matrix: "Line10Form343TypeA", + Symbol: "Default", + FirstInitMethod: 3, + OtherInitMethod: 3, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + } + + FortuneRabbitMapRTPMode = map[int64]*structs.FortuneRabbitMapRTPMode{ + 1: { + ID: 1, + TypeWeight: map[int64]*structs.FortuneRabbitMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "96", + Rtp: 0.96, + }, + 2: { + ID: 2, + TypeWeight: map[int64]*structs.FortuneRabbitMapRTPModeTypeWeight{ + 2: { + ID: 2, + Weight: 1, + }, + }, + Desc: "80", + Rtp: 0.8, + }, + 3: { + ID: 3, + TypeWeight: map[int64]*structs.FortuneRabbitMapRTPModeTypeWeight{ + 3: { + ID: 3, + Weight: 1, + }, + }, + Desc: "120", + Rtp: 1.2, + }, + } + + FortuneRabbitOthers = []*structs.FortuneRabbitOthers{ + { + FreespinTriggerPro: 0.0106, + FreeSpinCount: 8, + MaxWin: 5000, + }, + } + + FortuneRabbitOthersRTP120 = []*structs.FortuneRabbitOthersRTP120{ + { + FreespinTriggerPro: 0.01785, + FreeSpinCount: 8, + MaxWin: 5000, + }, + } + + FortuneRabbitOthersRTP80 = []*structs.FortuneRabbitOthersRTP80{ + { + FreespinTriggerPro: 0.00577, + FreeSpinCount: 8, + MaxWin: 5000, + }, + } + + FortuneRabbitReelBaseSpinRange = [][]int64{ + {3, 4, 3}, + } + + FortuneRabbitReelBaseSpinReel = [][]int64{ + {3, 7, 2, 2, 2, 3, 5, 4, 7, 8, 8, 8, 6, 2, 4, 5, 6, 7, 6, 6, 6, 2, 2, 2, 1, 5, 4, 4, 4, 5, 7, 5, 4, 6, 4, 4, 3, 4, 7, 7, 7, 4, 5, 6, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 7, 7, 7, 2, 5, 7, 4, 2, 6, 5, 7, 8, 8, 8, 2, 2, 2, 5, 6, 2, 2, 2, 5, 7, 6, 6, 4, 2, 7, 7, 7, 6, 5, 7, 6, 1, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 6, 6, 6, 5, 7, 5, 6, 7, 2, 5, 6, 5, 3, 3, 3, 6, 2, 5, 7, 6, 8, 8, 8, 6, 7, 5, 2, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 2, 2, 2, 7, 8, 8, 8, 5, 4, 4, 4, 6, 4, 4, 7, 4, 2, 6, 7, 7, 5, 5, 5, 7, 6, 1, 2, 4, 6, 5, 7, 2, 2, 2, 7, 4, 7, 5, 6, 8, 8, 8, 5, 6, 7, 4, 6, 1, 5, 5, 5, 6, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 4, 4, 4, 7, 7, 7, 3, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 6, 5, 7, 6, 5, 5, 7, 4, 5, 6, 7, 6, 4, 4, 2, 5, 5, 5, 7, 6, 4, 5, 4, 6, 7, 4, 7, 3, 6, 5, 8, 8, 8, 2, 7, 7, 2, 2, 6, 5, 2, 6, 4, 7, 6, 3, 5, 4, 6, 6, 6, 3, 4, 7, 2, 5, 6, 7, 2, 4, 5, 6, 6, 6, 8, 8, 8, 7, 5, 4, 1, 5, 7, 2, 6, 7, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 6, 5, 7, 4, 6, 2, 7, 5, 6, 4, 4, 4, 4, 3, 5, 2, 3, 4, 4, 7, 5, 5, 5, 5, 8, 8, 8, 8, 4, 7, 6, 5, 1, 7, 4, 5, 7, 6, 5, 4, 8, 8, 8, 8, 3, 5, 6, 4, 1, 5, 7, 3, 4, 6, 7, 2, 2, 2, 2, 6, 7, 6, 7, 3, 4, 6, 5, 1, 7, 6, 6, 4, 5, 8, 8, 5, 7, 6, 4, 4, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 5, 5, 5, 5, 3, 6, 7, 2, 3, 7, 6, 5, 4, 7, 6, 4, 3, 3, 3, 3, 4, 7, 7, 5, 1, 6, 5, 7, 4, 6, 3, 2, 5, 5, 4, 7, 7, 5, 3, 4, 8, 8, 5, 6, 4, 7, 5, 5, 5, 5, 8, 8, 7, 6, 3, 1, 1, 1, 5, 3, 4, 6, 7, 5, 3, 6, 4, 7, 6, 4, 1, 7, 5, 8, 8, 5, 5, 5, 1, 7, 4, 6, 7, 4, 6, 7, 4, 6, 3, 7, 5, 6, 3, 5, 6, 4, 7, 5, 6, 4, 5, 7, 7, 7, 7, 1, 2, 2, 3, 3, 7, 8, 8, 8, 8, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 6, 6, 6, 7, 1, 6, 5, 7, 3, 5, 6, 7, 7, 3, 6, 7, 5, 5, 8, 8, 8, 8, 7, 6, 5, 5, 5, 5, 1, 1, 1, 1, 2, 4, 6, 3, 5, 8, 8, 8, 8, 6, 5, 3, 4, 2, 6, 6, 6, 6, 5, 1, 7, 7, 7, 7, 6, 3, 7, 5, 4, 4, 7, 6, 5, 5, 5, 5, 7}, + {5, 5, 5, 6, 7, 3, 6, 4, 4, 4, 3, 3, 3, 4, 7, 1, 6, 5, 5, 5, 6, 7, 5, 4, 3, 6, 7, 5, 4, 3, 8, 8, 8, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 1, 1, 1, 3, 7, 5, 3, 7, 6, 4, 7, 6, 3, 4, 6, 5, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 6, 6, 6, 8, 8, 8, 4, 5, 5, 5, 7, 2, 3, 4, 7, 6, 4, 7, 3, 6, 4, 7, 2, 4, 3, 6, 6, 6, 3, 7, 5, 8, 8, 8, 3, 7, 5, 3, 7, 6, 4, 3, 6, 7, 4, 6, 7, 3, 2, 7, 7, 7, 6, 3, 3, 3, 5, 8, 8, 8, 3, 6, 3, 1, 1, 7, 6, 3, 7, 5, 2, 2, 2, 7, 3, 5, 6, 7, 4, 6, 6, 6, 5, 3, 2, 7, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 7, 7, 5, 6, 6, 6, 5, 3, 7, 4, 4, 4, 7, 6, 6, 6, 8, 8, 8, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 8, 8, 8, 3, 6, 6, 7, 6, 5, 5, 5, 2, 2, 8, 8, 8, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 4, 4, 4, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 2, 4, 3, 3, 3, 5, 7, 3, 5, 7, 6, 5, 7, 7, 7, 7, 6, 6, 3, 7, 4, 6, 2, 3, 5, 7, 2, 1, 5, 7, 6, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 7, 4, 2, 7, 7, 7, 6, 6, 6, 7, 7, 7}, + } + + FortuneRabbitReelBaseSpinWeight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + FortuneRabbitReelFreeSpinRange = [][]int64{ + {3, 4, 3}, + } + + FortuneRabbitReelFreeSpinReel = [][]int64{ + {200, 200, 200, 200, 8, 8, 8, 200, 200, 200, 200, 200}, + {200, 200, 200, 8, 8, 8, 8, 200, 200, 200, 200, 200}, + {200, 200, 200, 200, 8, 8, 8, 200, 200, 200, 200, 200}, + } + + FortuneRabbitReelFreeSpinWeight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + FortuneRabbitSymbol = map[int64]*structs.FortuneRabbitSymbol{ + 1: { + ID: 1, + Name: "wild", + IsWild: true, + Group: []int64{1}, + PayRate: []int64{0, 0, 200}, + ClientOrder: 1, + ClientDsc: "", + }, + 2: { + ID: 2, + Name: "元宝", + IsWild: false, + Group: []int64{2}, + PayRate: []int64{0, 0, 100}, + ClientOrder: 2, + ClientDsc: "", + }, + 3: { + ID: 3, + Name: "钱袋", + IsWild: false, + Group: []int64{3}, + PayRate: []int64{0, 0, 50}, + ClientOrder: 3, + ClientDsc: "", + }, + 4: { + ID: 4, + Name: "红包", + IsWild: false, + Group: []int64{4}, + PayRate: []int64{0, 0, 10}, + ClientOrder: 4, + ClientDsc: "", + }, + 5: { + ID: 5, + Name: "铜币", + IsWild: false, + Group: []int64{5}, + PayRate: []int64{0, 0, 5}, + ClientOrder: 5, + ClientDsc: "", + }, + 6: { + ID: 6, + Name: "爆竹", + IsWild: false, + Group: []int64{6}, + PayRate: []int64{0, 0, 3}, + ClientOrder: 6, + ClientDsc: "", + }, + 7: { + ID: 7, + Name: "胡萝卜", + IsWild: false, + Group: []int64{7}, + PayRate: []int64{0, 0, 2}, + ClientOrder: 7, + ClientDsc: "", + }, + 8: { + ID: 8, + Name: "Cash", + IsWild: false, + Group: []int64{8}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 200: { + ID: 200, + Name: "Empty", + IsWild: false, + Group: []int64{200}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + } + + FortuneRabbitSymbolBetRatio = []*structs.FortuneRabbitSymbolBetRatio{ + { + BetRatio: 1, + }, + } + +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_tiger.go b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_tiger.go new file mode 100644 index 0000000..2b54df8 --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_tiger.go @@ -0,0 +1,401 @@ +//go:build !debug +// +build !debug + +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +func init() { + FortuneTigerBetBetChangeList = map[int64]*structs.FortuneTigerBetBetChangeList{ + 0: { + Index: 0, + BetChangeList: 0.15, + BetSizeIndex: 0, + BetLevelIndex: 0, + }, + 1: { + Index: 1, + BetChangeList: 0.3, + BetSizeIndex: 0, + BetLevelIndex: 1, + }, + 2: { + Index: 2, + BetChangeList: 0.45, + BetSizeIndex: 0, + BetLevelIndex: 2, + }, + 3: { + Index: 3, + BetChangeList: 0.5, + BetSizeIndex: 1, + BetLevelIndex: 0, + }, + 4: { + Index: 4, + BetChangeList: 0.75, + BetSizeIndex: 0, + BetLevelIndex: 4, + }, + 5: { + Index: 5, + BetChangeList: 1.5, + BetSizeIndex: 0, + BetLevelIndex: 9, + }, + 6: { + Index: 6, + BetChangeList: 2.5, + BetSizeIndex: 1, + BetLevelIndex: 4, + }, + 7: { + Index: 7, + BetChangeList: 4.5, + BetSizeIndex: 3, + BetLevelIndex: 0, + }, + 8: { + Index: 8, + BetChangeList: 5, + BetSizeIndex: 1, + BetLevelIndex: 9, + }, + 9: { + Index: 9, + BetChangeList: 7.5, + BetSizeIndex: 2, + BetLevelIndex: 4, + }, + 10: { + Index: 10, + BetChangeList: 15, + BetSizeIndex: 2, + BetLevelIndex: 9, + }, + 11: { + Index: 11, + BetChangeList: 22.5, + BetSizeIndex: 3, + BetLevelIndex: 4, + }, + 12: { + Index: 12, + BetChangeList: 45, + BetSizeIndex: 3, + BetLevelIndex: 9, + }, + } + + FortuneTigerBetBetLevel = map[int64]*structs.FortuneTigerBetBetLevel{ + 0: { + Index: 0, + BetLevel: 1, + }, + 1: { + Index: 1, + BetLevel: 2, + }, + 2: { + Index: 2, + BetLevel: 3, + }, + 3: { + Index: 3, + BetLevel: 4, + }, + 4: { + Index: 4, + BetLevel: 5, + }, + 5: { + Index: 5, + BetLevel: 6, + }, + 6: { + Index: 6, + BetLevel: 7, + }, + 7: { + Index: 7, + BetLevel: 8, + }, + 8: { + Index: 8, + BetLevel: 9, + }, + 9: { + Index: 9, + BetLevel: 10, + }, + } + + FortuneTigerBetBetLine = map[int64]*structs.FortuneTigerBetBetLine{ + 0: { + Index: 0, + BetLine: 5, + }, + } + + FortuneTigerBetBetSize = map[int64]*structs.FortuneTigerBetBetSize{ + 0: { + Index: 0, + BetSize: 300, + }, + 1: { + Index: 1, + BetSize: 1000, + }, + 2: { + Index: 2, + BetSize: 3000, + }, + 3: { + Index: 3, + BetSize: 9000, + }, + } + + FortuneTigerBetFirstBet = map[int64]*structs.FortuneTigerBetFirstBet{ + 1: { + Index: 1, + BetSizeIndex: 1, + BetLevelIndex: 1, + }, + } + + FortuneTigerFormation = []*structs.FortuneTigerFormation{ + { + SpinType: 1, + NodeType: "BaseSpin", + ID: 1, + SeqID: 1, + Reel: "BaseSpin", + Matrix: "Line5Form3X3TypeB", + Symbol: "Default", + FirstInitMethod: 4, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 3, + NodeType: "ReSpin", + ID: 1, + SeqID: 1, + Reel: "ReSpin", + Matrix: "Line5Form3X3TypeB", + Symbol: "Default", + FirstInitMethod: 3, + OtherInitMethod: 3, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + } + + FortuneTigerMapRTPMode = map[int64]*structs.FortuneTigerMapRTPMode{ + 1: { + ID: 1, + TypeWeight: map[int64]*structs.FortuneTigerMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "96", + Rtp: 0.96, + }, + 2: { + ID: 2, + TypeWeight: map[int64]*structs.FortuneTigerMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "80", + Rtp: 0.8, + }, + 3: { + ID: 3, + TypeWeight: map[int64]*structs.FortuneTigerMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "120", + Rtp: 1.2, + }, + } + + FortuneTigerOthers = []*structs.FortuneTigerOthers{ + { + RespinTriggerPro: 0.0104, + Multiplier: 10, + MaxWin: 2500, + }, + } + + FortuneTigerReelBaseSpinRange = [][]int64{ + {3, 3, 3}, + } + + FortuneTigerReelBaseSpinReel = [][]int64{ + {3, 7, 2, 2, 2, 3, 5, 4, 7, 5, 5, 5, 6, 2, 4, 7, 6, 6, 6, 4, 3, 4, 1, 3, 7, 7, 6, 5, 7, 5, 4, 6, 4, 4, 3, 4, 7, 7, 7, 4, 7, 4, 7, 3, 3, 3, 5, 2, 6, 4, 4, 4, 5, 7, 7, 7, 2, 5, 7, 4, 3, 6, 5, 7, 6, 3, 6, 6, 2, 3, 5, 6, 3, 2, 2, 5, 7, 6, 6, 4, 1, 7, 7, 3, 6, 4, 7, 6, 1, 5, 5, 2, 6, 6, 2, 5, 5, 7, 7, 1, 4, 4, 4, 5, 3, 5, 6, 7, 2, 5, 6, 5, 7, 7, 7, 6, 1, 5, 7, 6, 6, 7, 7, 6, 3, 5, 1, 6, 7, 7, 5, 3, 6, 7, 7, 6, 5, 5, 1, 3, 7, 7, 7, 4, 5, 4, 4, 4, 6, 4, 4, 7, 4, 2, 6, 3, 5, 7, 5, 5, 5, 6, 1, 2, 4, 6, 5, 3, 3, 3, 2, 7, 4, 7, 6, 7, 7, 7, 6, 7, 4, 6, 1, 5, 6, 6, 6, 7, 4, 5, 2, 3, 7, 5, 7, 6, 7, 7, 3, 3, 7, 5, 7, 4, 5, 5, 5, 2, 7, 7, 7, 4, 5, 7, 7, 5, 5, 7, 4, 5, 6, 7, 6, 4, 4, 1, 6, 6, 5, 7, 6, 4, 5, 4, 6, 7, 4, 7, 3, 6, 5, 7, 7, 6, 2, 7, 3, 2, 2, 6, 5, 2, 6, 6, 6, 4, 6, 4, 6, 6, 6, 3, 4, 7, 1, 5, 6, 7, 2, 6, 7, 6, 6, 3, 6, 7, 6, 3, 5, 4, 7, 5, 7, 2, 6, 3, 5, 5, 5, 6}, + {5, 6, 3, 4, 6, 4, 5, 7, 5, 6, 2, 2, 5, 4, 6, 5, 4, 4, 4, 3, 5, 2, 6, 4, 5, 7, 4, 5, 5, 5, 7, 6, 6, 6, 4, 7, 6, 1, 1, 7, 4, 5, 6, 6, 5, 4, 2, 2, 4, 7, 3, 6, 7, 6, 1, 7, 7, 3, 7, 6, 7, 7, 2, 2, 2, 7, 7, 6, 6, 3, 6, 4, 5, 7, 6, 6, 4, 5, 7, 2, 5, 7, 6, 4, 4, 4, 3, 6, 1, 3, 5, 4, 6, 7, 2, 3, 4, 6, 6, 6, 7, 3, 6, 7, 2, 3, 7, 6, 5, 4, 6, 6, 4, 7, 3, 3, 3, 4, 7, 7, 6, 1, 5, 5, 7, 7, 6, 6, 2, 5, 5, 4, 7, 7, 5, 3, 4, 2, 6, 5, 6, 4, 7, 5, 5, 5, 7, 7, 6, 7, 6, 3, 1, 1, 1, 5, 3, 7, 4, 7, 7, 7, 6, 4, 7, 6, 4, 1, 7, 5, 3, 5, 5, 5, 4, 7, 5, 6, 7, 4, 6, 7, 4, 6, 3, 2, 5, 6, 3, 5, 1, 1, 1, 6, 5, 4, 5, 4, 7, 7, 7, 6, 2, 7, 3, 7, 5, 5, 7, 3, 4, 7, 6, 5, 2, 4, 3, 5, 7, 6, 5, 7, 1, 3, 4, 7, 6, 6, 6, 7, 7, 1, 6, 5, 7, 3, 5, 2, 7, 7, 3, 6, 7, 7, 5, 5, 7, 7, 7, 2, 6, 7, 3, 5, 7, 1, 1, 1, 6, 4, 6, 3, 5, 7, 5, 2, 7, 6, 5, 3, 4, 1, 6, 6, 5, 7, 6, 1, 7, 6, 7, 7, 6, 3, 3, 2, 4, 4, 7, 2}, + {7, 5, 5, 5, 7, 7, 7, 6, 4, 4, 4, 3, 3, 3, 6, 1, 7, 6, 3, 5, 5, 6, 7, 5, 4, 4, 4, 7, 5, 4, 1, 7, 7, 7, 6, 6, 3, 7, 7, 7, 2, 4, 4, 4, 6, 1, 1, 1, 7, 5, 2, 5, 6, 4, 7, 6, 3, 7, 6, 7, 7, 3, 4, 5, 5, 5, 6, 3, 7, 7, 7, 2, 6, 5, 4, 6, 6, 1, 7, 7, 4, 5, 5, 5, 7, 2, 3, 4, 7, 6, 4, 4, 4, 6, 4, 7, 2, 2, 2, 6, 6, 6, 2, 7, 5, 6, 6, 6, 5, 3, 5, 1, 7, 6, 4, 3, 6, 7, 6, 7, 4, 3, 2, 4, 7, 5, 6, 3, 1, 4, 5, 7, 7, 7, 3, 6, 1, 1, 1, 7, 4, 3, 7, 5, 6, 6, 6, 7, 1, 5, 6, 7, 4, 6, 5, 6, 5, 1, 2, 4, 3, 6, 7, 3, 5, 2, 6, 7, 4, 6, 7, 5, 2, 7, 7, 7, 5, 6, 6, 6, 5, 2, 7, 4, 4, 4, 7, 6, 6, 6, 7, 7, 7, 4, 5, 2, 3, 5, 4, 6, 7, 3, 2, 6, 7, 4, 3, 7, 4, 7, 3, 6, 6, 7, 6, 5, 5, 5, 2, 2, 5, 7, 7, 7, 3, 4, 5, 3, 7, 7, 7, 5, 5, 5, 6, 6, 5, 6, 2, 6, 3, 6, 5, 3, 7, 6, 2, 2, 4, 1, 5, 4, 3, 7, 3, 7, 5, 6, 5, 7, 7, 7, 7, 6, 6, 3, 4, 6, 2, 3, 1, 7, 2, 1, 5, 7, 5, 5, 5, 6, 3, 5, 6, 4, 6, 7, 6, 5, 4, 2}, + } + + FortuneTigerReelBaseSpinWeight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + FortuneTigerReelReSpinRange = [][]int64{ + {3, 3, 3}, + } + + FortuneTigerReelReSpinReel = [][]int64{ + {8, 8, 1, 200, 200, 8, 8, 8, 200, 200, 1, 200, 200, 8, 8, 200, 200, 1, 1, 200, 200, 8, 200, 200, 1, 8, 8, 200, 200, 8, 8, 8, 200, 200, 8, 200, 200, 1, 200, 200, 8, 8, 200, 200, 8, 8, 8, 200, 200, 8, 200, 200, 8, 8, 8, 200, 200, 8, 200, 200}, + {8, 8, 1, 200, 200, 8, 8, 8, 200, 200, 1, 200, 200, 8, 8, 200, 200, 1, 1, 200, 200, 8, 200, 200, 1, 8, 8, 200, 200, 8, 8, 8, 200, 200, 8, 200, 200, 1, 200, 200, 8, 8, 200, 200, 8, 8, 8, 200, 200, 8, 200, 200, 8, 8, 8, 200, 200, 8, 200, 200}, + {8, 8, 1, 200, 200, 8, 8, 8, 200, 200, 1, 200, 200, 8, 8, 200, 200, 1, 1, 200, 200, 8, 200, 200, 1, 8, 8, 200, 200, 8, 8, 8, 200, 200, 8, 200, 200, 1, 200, 200, 8, 8, 200, 200, 8, 8, 8, 200, 200, 8, 200, 200, 8, 8, 8, 200, 200, 8, 200, 200}, + } + + FortuneTigerReelReSpinWeight = [][]float64{ + {0.5, 1, 0, 1, 1, 0.5, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 2, 1, 1, 1, 1, 0, 0.5, 1, 1, 1, 0.5, 0, 0, 1, 2, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 1, 1, 1, 1, 0, 0, 1, 2, 2, 2, 1, 1}, + {0.5, 0, 1, 1, 1, 0.5, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 2, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 2, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 2, 1, 0, 0, 1, 1, 2, 2, 2, 1, 1}, + {0, 1, 1, 1, 1, 0.5, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 2, 1, 0, 1, 0.5, 1, 1, 1, 0, 0, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 2, 1, 0, 0, 0, 1, 1, 2, 2, 2, 1, 1}, + } + + FortuneTigerSuperStackWeight = []*structs.FortuneTigerSuperStackWeight{ + { + ID: 1, + ItemID: 1, + Weight: 0, + }, + { + ID: 2, + ItemID: 2, + Weight: 0.66, + }, + { + ID: 3, + ItemID: 3, + Weight: 3.34, + }, + { + ID: 4, + ItemID: 4, + Weight: 11, + }, + { + ID: 5, + ItemID: 5, + Weight: 15, + }, + { + ID: 6, + ItemID: 6, + Weight: 20, + }, + { + ID: 7, + ItemID: 7, + Weight: 50, + }, + } + + FortuneTigerSymbol = map[int64]*structs.FortuneTigerSymbol{ + 1: { + ID: 1, + Name: "wild", + IsWild: true, + Group: []int64{1}, + PayRate: []int64{0, 0, 250}, + ClientOrder: 1, + ClientDsc: "", + }, + 2: { + ID: 2, + Name: "元宝", + IsWild: false, + Group: []int64{2}, + PayRate: []int64{0, 0, 100}, + ClientOrder: 2, + ClientDsc: "", + }, + 3: { + ID: 3, + Name: "玉饰", + IsWild: false, + Group: []int64{3}, + PayRate: []int64{0, 0, 25}, + ClientOrder: 3, + ClientDsc: "", + }, + 4: { + ID: 4, + Name: "福袋", + IsWild: false, + Group: []int64{4}, + PayRate: []int64{0, 0, 10}, + ClientOrder: 4, + ClientDsc: "", + }, + 5: { + ID: 5, + Name: "红包", + IsWild: false, + Group: []int64{5}, + PayRate: []int64{0, 0, 8}, + ClientOrder: 5, + ClientDsc: "", + }, + 6: { + ID: 6, + Name: "爆竹", + IsWild: false, + Group: []int64{6}, + PayRate: []int64{0, 0, 5}, + ClientOrder: 6, + ClientDsc: "", + }, + 7: { + ID: 7, + Name: "橘子", + IsWild: false, + Group: []int64{7}, + PayRate: []int64{0, 0, 3}, + ClientOrder: 7, + ClientDsc: "", + }, + 8: { + ID: 8, + Name: "SuperStack", + IsWild: false, + Group: []int64{8}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 200: { + ID: 200, + Name: "Empty", + IsWild: false, + Group: []int64{200}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + } + + FortuneTigerSymbolBetRatio = []*structs.FortuneTigerSymbolBetRatio{ + { + BetRatio: 1, + }, + } + +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/gateof_olympus.go b/gamesrv/slotspkg/internal/exported/excel2go/base/gateof_olympus.go new file mode 100644 index 0000000..dc15bf8 --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/gateof_olympus.go @@ -0,0 +1,1098 @@ +//go:build !debug +// +build !debug + +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +func init() { + GateofOlympusBetBetChangeList = map[int64]*structs.GateofOlympusBetBetChangeList{ + 0: { + Index: 0, + BetChangeList: 0.6, + BetSizeIndex: 0, + BetLevelIndex: 0, + }, + 1: { + Index: 1, + BetChangeList: 1.2, + BetSizeIndex: 0, + BetLevelIndex: 1, + }, + 2: { + Index: 2, + BetChangeList: 1.8, + BetSizeIndex: 0, + BetLevelIndex: 2, + }, + 3: { + Index: 3, + BetChangeList: 2, + BetSizeIndex: 1, + BetLevelIndex: 0, + }, + 4: { + Index: 4, + BetChangeList: 3, + BetSizeIndex: 0, + BetLevelIndex: 4, + }, + 5: { + Index: 5, + BetChangeList: 6, + BetSizeIndex: 0, + BetLevelIndex: 9, + }, + 6: { + Index: 6, + BetChangeList: 10, + BetSizeIndex: 1, + BetLevelIndex: 4, + }, + 7: { + Index: 7, + BetChangeList: 18, + BetSizeIndex: 3, + BetLevelIndex: 0, + }, + 8: { + Index: 8, + BetChangeList: 20, + BetSizeIndex: 1, + BetLevelIndex: 9, + }, + 9: { + Index: 9, + BetChangeList: 30, + BetSizeIndex: 2, + BetLevelIndex: 4, + }, + 10: { + Index: 10, + BetChangeList: 60, + BetSizeIndex: 2, + BetLevelIndex: 9, + }, + 11: { + Index: 11, + BetChangeList: 90, + BetSizeIndex: 3, + BetLevelIndex: 4, + }, + 12: { + Index: 12, + BetChangeList: 180, + BetSizeIndex: 3, + BetLevelIndex: 9, + }, + } + + GateofOlympusBetBetLevel = map[int64]*structs.GateofOlympusBetBetLevel{ + 0: { + Index: 0, + BetLevel: 1, + }, + 1: { + Index: 1, + BetLevel: 2, + }, + 2: { + Index: 2, + BetLevel: 3, + }, + 3: { + Index: 3, + BetLevel: 4, + }, + 4: { + Index: 4, + BetLevel: 5, + }, + 5: { + Index: 5, + BetLevel: 6, + }, + 6: { + Index: 6, + BetLevel: 7, + }, + 7: { + Index: 7, + BetLevel: 8, + }, + 8: { + Index: 8, + BetLevel: 9, + }, + 9: { + Index: 9, + BetLevel: 10, + }, + } + + GateofOlympusBetBetLine = map[int64]*structs.GateofOlympusBetBetLine{ + 0: { + Index: 0, + BetLine: 20, + }, + } + + GateofOlympusBetBetSize = map[int64]*structs.GateofOlympusBetBetSize{ + 0: { + Index: 0, + BetSize: 300, + }, + 1: { + Index: 1, + BetSize: 1000, + }, + 2: { + Index: 2, + BetSize: 3000, + }, + 3: { + Index: 3, + BetSize: 9000, + }, + } + + GateofOlympusBetFirstBet = map[int64]*structs.GateofOlympusBetFirstBet{ + 1: { + Index: 1, + BetSizeIndex: 1, + BetLevelIndex: 1, + }, + } + + GateofOlympusFormation = []*structs.GateofOlympusFormation{ + { + SpinType: 1, + NodeType: "BaseSpin", + ID: 1, + SeqID: 1, + Reel: "BaseSpin", + Matrix: "SameForm5X6TypeA", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 1, + NodeType: "BaseSpin1", + ID: 1, + SeqID: 1, + Reel: "BaseSpin1", + Matrix: "SameForm5X6TypeA", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 1, + NodeType: "BaseSpin2", + ID: 1, + SeqID: 1, + Reel: "BaseSpin2", + Matrix: "SameForm5X6TypeA", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 1, + NodeType: "BaseSpin3", + ID: 1, + SeqID: 1, + Reel: "BaseSpin3", + Matrix: "SameForm5X6TypeA", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 1, + NodeType: "BaseSpin7", + ID: 1, + SeqID: 1, + Reel: "BaseSpin7", + Matrix: "SameForm5X6TypeA", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 1, + NodeType: "BaseSpin8", + ID: 1, + SeqID: 1, + Reel: "BaseSpin8", + Matrix: "SameForm5X6TypeA", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 2, + NodeType: "FreeSpin", + ID: 2, + SeqID: 1, + Reel: "FreeSpin", + Matrix: "SameForm5X6TypeA", + Symbol: "Default", + FirstInitMethod: 3, + OtherInitMethod: 3, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 2, + NodeType: "FreeSpin4", + ID: 2, + SeqID: 1, + Reel: "FreeSpin4", + Matrix: "SameForm5X6TypeA", + Symbol: "Default", + FirstInitMethod: 3, + OtherInitMethod: 3, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 2, + NodeType: "FreeSpin5", + ID: 2, + SeqID: 1, + Reel: "FreeSpin5", + Matrix: "SameForm5X6TypeA", + Symbol: "Default", + FirstInitMethod: 3, + OtherInitMethod: 3, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 1, + NodeType: "MoreScatterBaseSpin", + ID: 1, + SeqID: 1, + Reel: "BaseSpin", + Matrix: "SameForm5X6TypeB", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 1, + NodeType: "MoreScatterBaseSpin1", + ID: 1, + SeqID: 1, + Reel: "BaseSpin1", + Matrix: "SameForm5X6TypeB", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 1, + NodeType: "MoreScatterBaseSpin2", + ID: 1, + SeqID: 1, + Reel: "BaseSpin2", + Matrix: "SameForm5X6TypeB", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 1, + NodeType: "MoreScatterBaseSpin3", + ID: 1, + SeqID: 1, + Reel: "BaseSpin3", + Matrix: "SameForm5X6TypeB", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 1, + NodeType: "MoreScatterBaseSpin7", + ID: 1, + SeqID: 1, + Reel: "BaseSpin7", + Matrix: "SameForm5X6TypeB", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + { + SpinType: 1, + NodeType: "MoreScatterBaseSpin8", + ID: 1, + SeqID: 1, + Reel: "BaseSpin8", + Matrix: "SameForm5X6TypeB", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + } + + GateofOlympusMapRTPMode = map[int64]*structs.GateofOlympusMapRTPMode{ + 1: { + ID: 1, + TypeWeight: map[int64]*structs.GateofOlympusMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "96", + Rtp: 0.96, + }, + 2: { + ID: 2, + TypeWeight: map[int64]*structs.GateofOlympusMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "80", + Rtp: 0.8, + }, + 3: { + ID: 3, + TypeWeight: map[int64]*structs.GateofOlympusMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "120", + Rtp: 1.2, + }, + } + + GateofOlympusMultiplier = []*structs.GateofOlympusMultiplier{ + { + Multiple: 2, + ID: 13, + Weights: []int64{3150, 3150, 3150}, + }, + { + Multiple: 3, + ID: 14, + Weights: []int64{2250, 2250, 2000}, + }, + { + Multiple: 4, + ID: 15, + Weights: []int64{1500, 1500, 1500}, + }, + { + Multiple: 5, + ID: 16, + Weights: []int64{1100, 1100, 1000}, + }, + { + Multiple: 6, + ID: 17, + Weights: []int64{300, 300, 600}, + }, + { + Multiple: 8, + ID: 18, + Weights: []int64{150, 150, 400}, + }, + { + Multiple: 10, + ID: 19, + Weights: []int64{80, 80, 200}, + }, + { + Multiple: 12, + ID: 20, + Weights: []int64{30, 30, 100}, + }, + { + Multiple: 15, + ID: 21, + Weights: []int64{10, 10, 50}, + }, + { + Multiple: 20, + ID: 22, + Weights: []int64{20, 20, 50}, + }, + { + Multiple: 25, + ID: 23, + Weights: []int64{10, 10, 50}, + }, + { + Multiple: 50, + ID: 24, + Weights: []int64{1, 1, 25}, + }, + { + Multiple: 100, + ID: 25, + Weights: []int64{1, 1, 25}, + }, + { + Multiple: 250, + ID: 26, + Weights: []int64{0, 0, 10}, + }, + { + Multiple: 500, + ID: 27, + Weights: []int64{0, 0, 10}, + }, + } + + GateofOlympusMultiplierKeyID = map[int64]*structs.GateofOlympusMultiplierKeyID{ + 13: { + Multiple: 2, + ID: 13, + Weights: []int64{3150, 3150, 3150}, + }, + 14: { + Multiple: 3, + ID: 14, + Weights: []int64{2250, 2250, 2000}, + }, + 15: { + Multiple: 4, + ID: 15, + Weights: []int64{1500, 1500, 1500}, + }, + 16: { + Multiple: 5, + ID: 16, + Weights: []int64{1100, 1100, 1000}, + }, + 17: { + Multiple: 6, + ID: 17, + Weights: []int64{300, 300, 600}, + }, + 18: { + Multiple: 8, + ID: 18, + Weights: []int64{150, 150, 400}, + }, + 19: { + Multiple: 10, + ID: 19, + Weights: []int64{80, 80, 200}, + }, + 20: { + Multiple: 12, + ID: 20, + Weights: []int64{30, 30, 100}, + }, + 21: { + Multiple: 15, + ID: 21, + Weights: []int64{10, 10, 50}, + }, + 22: { + Multiple: 20, + ID: 22, + Weights: []int64{20, 20, 50}, + }, + 23: { + Multiple: 25, + ID: 23, + Weights: []int64{10, 10, 50}, + }, + 24: { + Multiple: 50, + ID: 24, + Weights: []int64{1, 1, 25}, + }, + 25: { + Multiple: 100, + ID: 25, + Weights: []int64{1, 1, 25}, + }, + 26: { + Multiple: 250, + ID: 26, + Weights: []int64{0, 0, 10}, + }, + 27: { + Multiple: 500, + ID: 27, + Weights: []int64{0, 0, 10}, + }, + } + + GateofOlympusReelBaseSpinRange = [][]int64{ + {5, 5, 5, 5, 5, 5}, + } + + GateofOlympusReelBaseSpinReel = [][]int64{ + {1, 6, 6, 11, 11, 10, 10, 9, 9, 6, 6, 8, 8, 8, 10, 10, 10, 11, 11, 6, 6, 10, 10, 10, 8, 8, 11, 11, 4, 4, 9, 9, 8, 8, 11, 11, 10, 10, 5, 5, 8, 8, 11, 11, 11, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 11, 11, 11, 5, 5, 7, 7, 9}, + {1, 9, 9, 6, 6, 8, 8, 10, 11, 11, 9, 9, 10, 10, 10, 4, 4, 9, 9, 9, 11, 11, 8, 8, 10, 10, 5, 5, 8, 8, 3, 3, 6, 6, 10, 10, 10, 9, 9, 4, 4, 1, 3, 3, 11, 11, 5, 5, 10, 10, 7, 7, 9, 9, 6, 6, 10, 10, 8, 8, 11, 11, 11}, + {1, 5, 5, 5, 8, 8, 11, 11, 5, 5, 9, 9, 6, 6, 7, 7, 3, 3, 5, 5, 5, 7, 7, 8, 8, 11, 11, 4, 4, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 7, 7, 7, 4, 4, 9, 9, 10, 10, 8, 8, 11, 11, 8, 8, 8, 10, 10, 11, 11, 6, 6, 7, 7}, + {1, 4, 4, 11, 11, 5, 5, 7, 7, 9, 9, 11, 11, 10, 10, 4, 4, 9, 9, 11, 11, 5, 5, 8, 8, 10, 10, 11, 11, 5, 5, 3, 3, 9, 9, 6, 6, 10, 10, 4, 4, 7, 7, 7, 11, 11, 6, 6, 6, 9, 9, 10, 10, 10, 11, 11, 3, 3, 3, 7, 7, 10, 10}, + {1, 9, 10, 10, 11, 11, 6, 6, 8, 8, 5, 5, 11, 11, 6, 6, 8, 8, 10, 10, 11, 11, 6, 6, 10, 10, 4, 4, 9, 9, 7, 7, 4, 4, 4, 5, 5, 9, 9, 8, 8, 8, 11, 11, 7, 7, 9, 9, 9, 3, 3, 11, 11, 11, 10, 10, 9, 9, 5, 5, 7, 7, 7}, + {1, 6, 6, 6, 4, 4, 9, 9, 8, 8, 7, 7, 11, 11, 9, 9, 7, 7, 8, 8, 5, 5, 11, 11, 11, 9, 9, 8, 8, 10, 10, 5, 5, 7, 7, 11, 11, 10, 10, 3, 3, 6, 6, 6, 11, 11, 9, 9, 9, 10, 10, 10, 4, 4, 4, 3, 3, 9, 9, 5, 5, 8, 8}, + } + + GateofOlympusReelBaseSpinWeight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + GateofOlympusReelBaseSpin1Range = [][]int64{ + {5, 5, 5, 5, 5, 5}, + } + + GateofOlympusReelBaseSpin1Reel = [][]int64{ + {1, 6, 6, 11, 11, 10, 10, 9, 9, 6, 6, 8, 8, 8, 10, 10, 10, 11, 11, 6, 6, 10, 10, 10, 8, 8, 11, 11, 4, 4, 9, 9, 8, 8, 11, 11, 10, 10, 5, 5, 8, 8, 11, 11, 11, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 11, 11, 11, 5, 5, 7, 7, 9}, + {1, 9, 9, 6, 6, 8, 8, 10, 11, 11, 9, 9, 10, 10, 10, 4, 4, 9, 9, 9, 11, 11, 8, 8, 10, 10, 5, 5, 8, 8, 3, 3, 6, 6, 10, 10, 10, 9, 9, 4, 4, 1, 3, 3, 11, 11, 5, 5, 10, 10, 7, 7, 9, 9, 6, 6, 10, 10, 8, 8, 11, 11, 11}, + {1, 5, 5, 5, 8, 8, 11, 11, 5, 5, 9, 9, 6, 6, 7, 7, 3, 3, 5, 5, 5, 7, 7, 8, 8, 11, 11, 4, 4, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 7, 7, 7, 4, 4, 9, 9, 10, 10, 8, 8, 11, 11, 8, 8, 8, 10, 10, 11, 11, 6, 6, 7, 7}, + {1, 4, 4, 11, 11, 5, 5, 7, 7, 9, 9, 11, 11, 10, 10, 4, 4, 9, 9, 11, 11, 5, 5, 8, 8, 10, 10, 11, 11, 5, 5, 3, 3, 9, 9, 6, 6, 10, 10, 4, 4, 7, 7, 7, 11, 11, 6, 6, 6, 9, 9, 10, 10, 10, 11, 11, 3, 3, 3, 7, 7, 10, 10}, + {1, 9, 10, 10, 11, 11, 6, 6, 8, 8, 5, 5, 11, 11, 6, 6, 8, 8, 10, 10, 11, 11, 6, 6, 10, 10, 4, 4, 9, 9, 7, 7, 4, 4, 4, 5, 5, 9, 9, 8, 8, 8, 11, 11, 7, 7, 9, 9, 9, 3, 3, 11, 11, 11, 10, 10, 9, 9, 5, 5, 7, 7, 7}, + {1, 6, 6, 6, 4, 4, 9, 9, 8, 8, 7, 7, 11, 11, 9, 9, 7, 7, 8, 8, 5, 5, 11, 11, 11, 9, 9, 8, 8, 10, 10, 5, 5, 7, 7, 11, 11, 10, 10, 3, 3, 6, 6, 6, 11, 11, 9, 9, 9, 10, 10, 10, 4, 4, 4, 3, 3, 9, 9, 5, 5, 8, 8}, + } + + GateofOlympusReelBaseSpin1Weight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + GateofOlympusReelBaseSpin2Range = [][]int64{ + {5, 5, 5, 5, 5, 5}, + } + + GateofOlympusReelBaseSpin2Reel = [][]int64{ + {1, 6, 6, 11, 8, 10, 11, 9, 7, 6, 6, 11, 8, 8, 9, 10, 7, 11, 11, 8, 6, 10, 9, 10, 8, 8, 3, 11, 11, 4, 4, 9, 11, 8, 7, 11, 11, 9, 10, 5, 5, 8, 10, 11, 6, 11, 10, 7, 11, 9, 10, 10, 4, 4, 3, 3, 7, 6, 11, 5, 5, 7, 10, 9}, + {1, 9, 9, 6, 6, 8, 8, 10, 4, 11, 9, 9, 10, 10, 11, 4, 10, 8, 9, 9, 7, 11, 8, 8, 10, 10, 5, 5, 7, 9, 10, 3, 6, 7, 8, 6, 11, 9, 7, 4, 4, 1, 3, 11, 11, 9, 5, 5, 10, 6, 7, 7, 10, 9, 6, 6, 11, 10, 8, 8, 11, 7, 11}, + {1, 5, 11, 5, 8, 8, 11, 7, 5, 10, 9, 7, 10, 6, 7, 1, 10, 3, 5, 10, 5, 7, 7, 8, 7, 9, 11, 11, 4, 4, 7, 10, 9, 11, 11, 10, 4, 4, 9, 3, 7, 10, 7, 4, 11, 9, 9, 10, 7, 8, 8, 11, 7, 8, 9, 8, 10, 7, 11, 11, 6, 6, 8, 7}, + {1, 4, 4, 11, 10, 5, 5, 11, 11, 9, 9, 6, 11, 10, 9, 4, 4, 9, 9, 4, 11, 10, 5, 8, 8, 8, 10, 10, 11, 11, 5, 5, 3, 11, 9, 9, 6, 8, 6, 10, 4, 4, 7, 9, 7, 11, 11, 6, 7, 6, 10, 9, 8, 7, 10, 3, 11, 3, 11, 3, 7, 7, 10, 10}, + {1, 9, 10, 10, 11, 7, 4, 6, 8, 8, 1, 5, 9, 11, 6, 6, 8, 8, 10, 10, 11, 6, 11, 6, 11, 10, 7, 4, 4, 11, 9, 7, 6, 8, 9, 4, 5, 5, 7, 9, 7, 8, 8, 9, 10, 7, 7, 11, 11, 9, 3, 3, 11, 11, 8, 10, 10, 9, 9, 5, 5, 10, 11, 7}, + {1, 6, 7, 6, 4, 11, 9, 9, 10, 8, 3, 7, 11, 6, 9, 9, 8, 7, 10, 8, 5, 6, 11, 10, 11, 9, 9, 8, 8, 7, 10, 5, 5, 7, 7, 11, 9, 10, 11, 3, 7, 6, 10, 6, 11, 11, 9, 9, 9, 10, 8, 10, 4, 11, 4, 3, 3, 9, 9, 5, 5, 9, 8}, + } + + GateofOlympusReelBaseSpin2Weight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + GateofOlympusReelBaseSpin3Range = [][]int64{ + {5, 5, 5, 5, 5, 5}, + } + + GateofOlympusReelBaseSpin3Reel = [][]int64{ + {12, 6, 6, 11, 11, 10, 10, 9, 9, 6, 6, 8, 8, 8, 10, 10, 10, 11, 11, 6, 6, 10, 10, 10, 8, 8, 11, 11, 4, 4, 9, 9, 8, 8, 11, 11, 10, 10, 5, 5, 8, 8, 11, 11, 11, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 11, 11, 11, 5, 5, 7, 7, 9}, + {12, 9, 9, 6, 6, 8, 8, 10, 11, 11, 9, 9, 10, 10, 10, 4, 4, 9, 9, 9, 11, 11, 8, 8, 10, 10, 5, 5, 8, 8, 3, 3, 6, 6, 10, 10, 10, 9, 9, 4, 4, 12, 3, 3, 11, 11, 5, 5, 10, 10, 7, 7, 9, 9, 6, 6, 10, 10, 8, 8, 11, 11, 11}, + {12, 5, 5, 5, 8, 8, 11, 11, 5, 5, 9, 9, 6, 6, 7, 7, 3, 3, 5, 5, 5, 7, 7, 8, 8, 11, 11, 4, 4, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 7, 7, 7, 4, 4, 9, 9, 10, 10, 8, 8, 11, 11, 8, 8, 8, 10, 10, 11, 11, 6, 6, 7, 7}, + {12, 4, 4, 11, 11, 5, 5, 7, 7, 9, 9, 11, 11, 10, 10, 4, 4, 9, 9, 11, 11, 5, 5, 8, 8, 10, 10, 11, 11, 5, 5, 3, 3, 9, 9, 6, 6, 10, 10, 4, 4, 7, 7, 7, 11, 11, 6, 6, 6, 9, 9, 10, 10, 10, 11, 11, 3, 3, 3, 7, 7, 10, 10}, + {12, 9, 10, 10, 11, 11, 6, 6, 8, 8, 5, 5, 11, 11, 6, 6, 8, 8, 10, 10, 11, 11, 6, 6, 10, 10, 4, 4, 9, 9, 7, 7, 4, 4, 4, 5, 5, 9, 9, 8, 8, 8, 11, 11, 7, 7, 9, 9, 9, 3, 3, 11, 11, 11, 10, 10, 9, 9, 5, 5, 7, 7, 7}, + {12, 6, 6, 6, 4, 4, 9, 9, 8, 8, 7, 7, 11, 11, 9, 9, 7, 7, 8, 8, 5, 5, 11, 11, 11, 9, 9, 8, 8, 10, 10, 5, 5, 7, 7, 11, 11, 10, 10, 3, 3, 6, 6, 6, 11, 11, 9, 9, 9, 10, 10, 10, 4, 4, 4, 3, 3, 9, 9, 5, 5, 8, 8}, + } + + GateofOlympusReelBaseSpin3Weight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + GateofOlympusReelBaseSpin7Range = [][]int64{ + {5, 5, 5, 5, 5, 5}, + } + + GateofOlympusReelBaseSpin7Reel = [][]int64{ + {11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6}, + {1, 9, 3, 8, 5, 1, 10, 7, 6, 11, 1, 3, 8, 5, 4, 1, 7, 6, 11, 9, 1, 8, 5, 4, 10, 1, 6, 11, 9, 3, 1, 5, 4, 10, 7, 1, 11, 9, 3, 8, 1, 4, 10, 7, 6}, + {1, 9, 3, 8, 5, 1, 10, 7, 6, 11, 1, 3, 8, 5, 4, 1, 7, 6, 11, 9, 1, 8, 5, 4, 10, 1, 6, 11, 9, 3, 1, 5, 4, 10, 7, 1, 11, 9, 3, 8, 1, 4, 10, 7, 6}, + {1, 9, 3, 8, 5, 1, 10, 7, 6, 11, 1, 3, 8, 5, 4, 1, 7, 6, 11, 9, 1, 8, 5, 4, 10, 1, 6, 11, 9, 3, 1, 5, 4, 10, 7, 1, 11, 9, 3, 8, 1, 4, 10, 7, 6}, + {1, 9, 3, 8, 5, 1, 10, 7, 6, 11, 1, 3, 8, 5, 4, 1, 7, 6, 11, 9, 1, 8, 5, 4, 10, 1, 6, 11, 9, 3, 1, 5, 4, 10, 7, 1, 11, 9, 3, 8, 1, 4, 10, 7, 6}, + {11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6}, + } + + GateofOlympusReelBaseSpin7Weight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + GateofOlympusReelBaseSpin8Range = [][]int64{ + {5, 5, 5, 5, 5, 5}, + } + + GateofOlympusReelBaseSpin8Reel = [][]int64{ + {1, 6, 6, 11, 8, 10, 11, 9, 7, 6, 6, 11, 8, 8, 9, 10, 7, 11, 11, 8, 6, 10, 9, 4, 11, 11, 4, 4, 9, 11, 8, 7, 11, 1, 9, 10, 5, 5, 8, 10, 11, 6, 11, 10, 7, 11, 9, 10, 10, 4, 4, 3, 3, 7, 6, 11, 5, 5, 7, 10, 9}, + {1, 9, 9, 6, 6, 8, 8, 10, 4, 11, 9, 9, 10, 10, 11, 4, 10, 8, 9, 9, 7, 11, 8, 7, 5, 5, 7, 9, 10, 3, 6, 7, 8, 6, 11, 9, 7, 4, 4, 1, 3, 11, 11, 9, 5, 5, 10, 6, 7, 7, 10, 9, 6, 6, 11, 10, 8, 8, 11, 7, 11}, + {1, 5, 11, 5, 8, 8, 11, 7, 5, 10, 9, 7, 10, 6, 7, 1, 10, 3, 5, 10, 5, 7, 11, 11, 11, 4, 4, 7, 10, 9, 11, 11, 10, 4, 4, 9, 3, 7, 10, 7, 4, 11, 9, 9, 10, 7, 8, 8, 11, 7, 8, 9, 8, 10, 7, 11, 11, 6, 6, 8, 7}, + {1, 4, 4, 11, 10, 5, 5, 11, 11, 9, 9, 6, 11, 10, 9, 4, 4, 9, 9, 4, 8, 8, 10, 10, 11, 11, 5, 5, 3, 11, 9, 9, 1, 8, 6, 10, 4, 4, 7, 9, 7, 11, 11, 6, 7, 6, 10, 9, 8, 7, 10, 3, 11, 3, 11, 3, 7, 7, 10, 10}, + {1, 9, 10, 10, 11, 7, 4, 6, 8, 8, 1, 5, 9, 11, 6, 6, 8, 8, 10, 10, 11, 10, 7, 4, 4, 11, 9, 7, 6, 8, 9, 4, 5, 5, 7, 9, 7, 8, 8, 9, 10, 7, 7, 11, 11, 9, 3, 3, 11, 11, 8, 10, 10, 9, 9, 5, 5, 10, 11, 7}, + {1, 6, 7, 6, 4, 11, 9, 9, 10, 8, 3, 7, 11, 6, 9, 9, 8, 7, 10, 8, 5, 6, 9, 9, 8, 8, 7, 10, 5, 5, 7, 7, 11, 9, 10, 11, 3, 7, 4, 10, 6, 11, 11, 9, 9, 9, 10, 8, 10, 4, 11, 4, 3, 3, 9, 9, 5, 5, 9, 8}, + } + + GateofOlympusReelBaseSpin8Weight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + GateofOlympusReelChoose = []*structs.GateofOlympusReelChoose{ + { + ID: 1, + IsFreeSpin: false, + NodeType: "BaseSpin1", + Weights: []int64{40, 162, 0}, + }, + { + ID: 2, + IsFreeSpin: false, + NodeType: "BaseSpin2", + Weights: []int64{66, 0, 0}, + }, + { + ID: 3, + IsFreeSpin: false, + NodeType: "BaseSpin3", + Weights: []int64{20, 68, 0}, + }, + { + ID: 4, + IsFreeSpin: false, + NodeType: "BaseSpin7", + Weights: []int64{0, 0, 1}, + }, + { + ID: 5, + IsFreeSpin: false, + NodeType: "BaseSpin8", + Weights: []int64{1, 180, 0}, + }, + { + ID: 6, + IsFreeSpin: true, + NodeType: "FreeSpin4", + Weights: []int64{1, 1, 1}, + }, + { + ID: 7, + IsFreeSpin: true, + NodeType: "FreeSpin5", + Weights: []int64{2, 2, 2}, + }, + } + + GateofOlympusReelFreeSpinRange = [][]int64{ + {5, 5, 5, 5, 5, 5}, + } + + GateofOlympusReelFreeSpinReel = [][]int64{ + {12, 6, 6, 11, 11, 10, 10, 9, 9, 6, 6, 8, 8, 8, 10, 10, 10, 11, 11, 6, 6, 10, 10, 10, 8, 8, 1, 11, 11, 4, 4, 9, 9, 8, 8, 11, 11, 10, 10, 5, 5, 8, 8, 11, 11, 11, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 11, 11, 11, 5, 5, 7, 7, 9}, + {12, 9, 9, 6, 6, 8, 8, 10, 11, 11, 9, 9, 10, 10, 10, 4, 4, 9, 9, 9, 11, 11, 8, 8, 10, 10, 1, 5, 5, 8, 8, 3, 3, 6, 6, 10, 10, 10, 9, 9, 4, 4, 12, 3, 3, 11, 11, 5, 5, 10, 10, 7, 7, 9, 9, 6, 6, 10, 10, 8, 8, 11, 11, 11}, + {12, 5, 5, 5, 8, 8, 11, 11, 5, 5, 9, 9, 6, 6, 7, 7, 3, 3, 5, 5, 5, 7, 7, 8, 8, 1, 11, 11, 4, 4, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 7, 7, 7, 4, 4, 9, 9, 10, 10, 8, 8, 11, 11, 8, 8, 8, 10, 10, 11, 11, 6, 6, 7, 7}, + {12, 4, 4, 11, 11, 5, 5, 7, 7, 9, 9, 11, 11, 10, 10, 4, 4, 9, 9, 11, 11, 5, 5, 1, 8, 8, 10, 10, 11, 11, 5, 5, 3, 3, 9, 9, 6, 6, 10, 10, 4, 4, 7, 7, 7, 11, 11, 6, 6, 6, 9, 9, 10, 10, 10, 11, 11, 3, 3, 3, 7, 7, 10, 10}, + {12, 9, 10, 10, 11, 11, 6, 6, 8, 8, 5, 5, 11, 11, 6, 6, 8, 8, 10, 10, 11, 11, 6, 6, 1, 10, 10, 4, 4, 9, 9, 7, 7, 4, 4, 4, 5, 5, 9, 9, 8, 8, 8, 11, 11, 7, 7, 9, 9, 9, 3, 3, 11, 11, 11, 10, 10, 9, 9, 5, 5, 7, 7, 7}, + {12, 6, 6, 6, 4, 4, 9, 9, 8, 8, 7, 7, 11, 11, 9, 9, 7, 7, 8, 8, 5, 5, 11, 11, 11, 1, 9, 9, 8, 8, 10, 10, 5, 5, 7, 7, 11, 11, 10, 10, 3, 3, 6, 6, 6, 11, 11, 9, 9, 9, 10, 10, 10, 4, 4, 4, 3, 3, 9, 9, 5, 5, 8, 8}, + } + + GateofOlympusReelFreeSpinWeight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + GateofOlympusReelFreeSpin4Range = [][]int64{ + {5, 5, 5, 5, 5, 5}, + } + + GateofOlympusReelFreeSpin4Reel = [][]int64{ + {12, 6, 6, 11, 11, 10, 10, 9, 9, 6, 6, 8, 8, 8, 10, 10, 10, 11, 11, 6, 6, 10, 10, 10, 8, 8, 1, 11, 11, 4, 4, 9, 9, 8, 8, 11, 11, 10, 10, 5, 5, 8, 8, 11, 11, 11, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 11, 11, 11, 5, 5, 7, 7, 9}, + {12, 9, 9, 6, 6, 8, 8, 10, 11, 11, 9, 9, 10, 10, 10, 4, 4, 9, 9, 9, 11, 11, 8, 8, 10, 10, 1, 5, 5, 8, 8, 3, 3, 6, 6, 10, 10, 10, 9, 9, 4, 4, 12, 3, 3, 11, 11, 5, 5, 10, 10, 7, 7, 9, 9, 6, 6, 10, 10, 8, 8, 11, 11, 11}, + {12, 5, 5, 5, 8, 8, 11, 11, 5, 5, 9, 9, 6, 6, 7, 7, 3, 3, 5, 5, 5, 7, 7, 8, 8, 1, 11, 11, 4, 4, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 7, 7, 7, 4, 4, 9, 9, 10, 10, 8, 8, 11, 11, 8, 8, 8, 10, 10, 11, 11, 6, 6, 7, 7}, + {12, 4, 4, 11, 11, 5, 5, 7, 7, 9, 9, 11, 11, 10, 10, 4, 4, 9, 9, 11, 11, 5, 5, 1, 8, 8, 10, 10, 11, 11, 5, 5, 3, 3, 9, 9, 6, 6, 10, 10, 4, 4, 7, 7, 7, 11, 11, 6, 6, 6, 9, 9, 10, 10, 10, 11, 11, 3, 3, 3, 7, 7, 10, 10}, + {12, 9, 10, 10, 11, 11, 6, 6, 8, 8, 5, 5, 11, 11, 6, 6, 8, 8, 10, 10, 11, 11, 6, 6, 1, 10, 10, 4, 4, 9, 9, 7, 7, 4, 4, 4, 5, 5, 9, 9, 8, 8, 8, 11, 11, 7, 7, 9, 9, 9, 3, 3, 11, 11, 11, 10, 10, 9, 9, 5, 5, 7, 7, 7}, + {12, 6, 6, 6, 4, 4, 9, 9, 8, 8, 7, 7, 11, 11, 9, 9, 7, 7, 8, 8, 5, 5, 11, 11, 11, 1, 9, 9, 8, 8, 10, 10, 5, 5, 7, 7, 11, 11, 10, 10, 3, 3, 6, 6, 6, 11, 11, 9, 9, 9, 10, 10, 10, 4, 4, 4, 3, 3, 9, 9, 5, 5, 8, 8}, + } + + GateofOlympusReelFreeSpin4Weight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + GateofOlympusReelFreeSpin5Range = [][]int64{ + {5, 5, 5, 5, 5, 5}, + } + + GateofOlympusReelFreeSpin5Reel = [][]int64{ + {12, 6, 6, 11, 11, 10, 10, 9, 9, 6, 6, 8, 8, 8, 10, 10, 10, 11, 11, 6, 6, 10, 10, 10, 8, 8, 11, 11, 4, 4, 9, 9, 8, 8, 11, 11, 10, 10, 5, 5, 8, 8, 11, 11, 11, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 11, 11, 11, 5, 5, 7, 7, 9}, + {12, 9, 9, 6, 6, 8, 8, 10, 11, 11, 9, 9, 10, 10, 10, 4, 4, 9, 9, 9, 11, 11, 8, 8, 10, 10, 5, 5, 8, 8, 3, 3, 6, 6, 10, 10, 10, 9, 9, 4, 4, 12, 3, 3, 11, 11, 5, 5, 10, 10, 7, 7, 9, 9, 6, 6, 10, 10, 8, 8, 11, 11, 11}, + {12, 5, 5, 5, 8, 8, 11, 11, 5, 5, 9, 9, 6, 6, 7, 7, 3, 3, 5, 5, 5, 7, 7, 8, 8, 11, 11, 4, 4, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 7, 7, 7, 4, 4, 9, 9, 10, 10, 8, 8, 11, 11, 8, 8, 8, 10, 10, 11, 11, 6, 6, 7, 7}, + {12, 4, 4, 11, 11, 5, 5, 7, 7, 9, 9, 11, 11, 10, 10, 4, 4, 9, 9, 11, 11, 5, 5, 8, 8, 10, 10, 11, 11, 5, 5, 3, 3, 9, 9, 6, 6, 10, 10, 4, 4, 7, 7, 7, 11, 11, 6, 6, 6, 9, 9, 10, 10, 10, 11, 11, 3, 3, 3, 7, 7, 10, 10}, + {12, 9, 10, 10, 11, 11, 6, 6, 8, 8, 5, 5, 11, 11, 6, 6, 8, 8, 10, 10, 11, 11, 6, 6, 10, 10, 4, 4, 9, 9, 7, 7, 4, 4, 4, 5, 5, 9, 9, 8, 8, 8, 11, 11, 7, 7, 9, 9, 9, 3, 3, 11, 11, 11, 10, 10, 9, 9, 5, 5, 7, 7, 7}, + {12, 6, 6, 6, 4, 4, 9, 9, 8, 8, 7, 7, 11, 11, 9, 9, 7, 7, 8, 8, 5, 5, 11, 11, 11, 9, 9, 8, 8, 10, 10, 5, 5, 7, 7, 11, 11, 10, 10, 3, 3, 6, 6, 6, 11, 11, 9, 9, 9, 10, 10, 10, 4, 4, 4, 3, 3, 9, 9, 5, 5, 8, 8}, + } + + GateofOlympusReelFreeSpin5Weight = [][]float64{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + } + + GateofOlympusScatter = map[int64]*structs.GateofOlympusScatter{ + 1: { + ScatterCount: 1, + FreeSpinBouts: 0, + FreeSpinExtraBouts: 0, + BasePayrate: 0, + FreePayrate: 0, + }, + 2: { + ScatterCount: 2, + FreeSpinBouts: 0, + FreeSpinExtraBouts: 0, + BasePayrate: 0, + FreePayrate: 0, + }, + 3: { + ScatterCount: 3, + FreeSpinBouts: 0, + FreeSpinExtraBouts: 5, + BasePayrate: 0, + FreePayrate: 0, + }, + 4: { + ScatterCount: 4, + FreeSpinBouts: 15, + FreeSpinExtraBouts: 5, + BasePayrate: 3, + FreePayrate: 3, + }, + 5: { + ScatterCount: 5, + FreeSpinBouts: 15, + FreeSpinExtraBouts: 5, + BasePayrate: 5, + FreePayrate: 5, + }, + 6: { + ScatterCount: 6, + FreeSpinBouts: 15, + FreeSpinExtraBouts: 5, + BasePayrate: 100, + FreePayrate: 100, + }, + } + + GateofOlympusSymbol = map[int64]*structs.GateofOlympusSymbol{ + 1: { + ID: 1, + Name: "Scatter", + IsWild: false, + Group: []int64{1}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 2: { + ID: 2, + Name: "无", + IsWild: false, + Group: []int64{2}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 3: { + ID: 3, + Name: "皇冠", + IsWild: false, + Group: []int64{3}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 200, 200, 500, 500, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}, + ClientOrder: 1, + ClientDsc: "", + }, + 4: { + ID: 4, + Name: "沙漏", + IsWild: false, + Group: []int64{4}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 50, 50, 200, 200, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500}, + ClientOrder: 2, + ClientDsc: "", + }, + 5: { + ID: 5, + Name: "戒指", + IsWild: false, + Group: []int64{5}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 40, 40, 100, 100, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, + ClientOrder: 3, + ClientDsc: "", + }, + 6: { + ID: 6, + Name: "酒杯", + IsWild: false, + Group: []int64{6}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 30, 30, 40, 40, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240}, + ClientOrder: 4, + ClientDsc: "", + }, + 7: { + ID: 7, + Name: "红宝石", + IsWild: false, + Group: []int64{7}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 20, 20, 30, 30, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200}, + ClientOrder: 5, + ClientDsc: "", + }, + 8: { + ID: 8, + Name: "紫宝石", + IsWild: false, + Group: []int64{8}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 16, 16, 24, 24, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160}, + ClientOrder: 6, + ClientDsc: "", + }, + 9: { + ID: 9, + Name: "黄宝石", + IsWild: false, + Group: []int64{9}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 10, 10, 20, 20, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100}, + ClientOrder: 7, + ClientDsc: "", + }, + 10: { + ID: 10, + Name: "绿宝石", + IsWild: false, + Group: []int64{10}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 8, 8, 18, 18, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80}, + ClientOrder: 8, + ClientDsc: "", + }, + 11: { + ID: 11, + Name: "蓝宝石", + IsWild: false, + Group: []int64{11}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 5, 5, 15, 15, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, + ClientOrder: 9, + ClientDsc: "", + }, + 12: { + ID: 12, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 13: { + ID: 13, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 14: { + ID: 14, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 15: { + ID: 15, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 16: { + ID: 16, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 17: { + ID: 17, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 18: { + ID: 18, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 19: { + ID: 19, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 20: { + ID: 20, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 21: { + ID: 21, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 22: { + ID: 22, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 23: { + ID: 23, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 24: { + ID: 24, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 25: { + ID: 25, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 26: { + ID: 26, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + 27: { + ID: 27, + Name: "倍乘", + IsWild: false, + Group: []int64{12}, + PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + ClientOrder: 0, + ClientDsc: "", + }, + } + + GateofOlympusSymbolBetRatio = []*structs.GateofOlympusSymbolBetRatio{ + { + BetRatio: 1, + }, + } + +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/matrix.go b/gamesrv/slotspkg/internal/exported/excel2go/base/matrix.go new file mode 100644 index 0000000..7c5f3de --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/matrix.go @@ -0,0 +1,3965 @@ +//go:build !debug +// +build !debug + +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +func init() { + MatrixFeaturesForm15X1TypeA = []*structs.MatrixFeaturesForm15X1TypeA{ + { + Type: "FeatureForm15X1TypeA", + LinkType: 2, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, + } + + MatrixFeaturesForm19X1TypeA = []*structs.MatrixFeaturesForm19X1TypeA{ + { + Type: "FeatureForm19X1TypeA", + LinkType: 2, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, + } + + MatrixFeaturesForm20X1TypeA = []*structs.MatrixFeaturesForm20X1TypeA{ + { + Type: "FeatureForm20X1TypeA", + LinkType: 2, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, + } + + MatrixFeaturesForm25X1TypeA = []*structs.MatrixFeaturesForm25X1TypeA{ + { + Type: "FeatureForm25X1TypeA", + LinkType: 2, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, + } + + MatrixFeaturesForm30X1TypeA = []*structs.MatrixFeaturesForm30X1TypeA{ + { + Type: "FeatureForm30X1TypeA", + LinkType: 2, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, + } + + MatrixFeaturesForm35X1TypeA = []*structs.MatrixFeaturesForm35X1TypeA{ + { + Type: "FeatureForm35X1TypeA", + LinkType: 2, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, + } + + MatrixFeaturesForm40X1 = []*structs.MatrixFeaturesForm40X1{ + { + Type: "FeatureForm40X1", + LinkType: 2, + Direction: 0, + LineCount: 0, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, + } + + MatrixFeaturesForm40X1TypeA = []*structs.MatrixFeaturesForm40X1TypeA{ + { + Type: "FeatureForm40X1", + LinkType: 2, + Direction: 0, + LineCount: 0, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + }, + } + + MatrixFeaturesForm7X1TypeA = []*structs.MatrixFeaturesForm7X1TypeA{ + { + Type: "FeatureForm15X1TypeA", + LinkType: 2, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{1, 1, 1, 1, 1, 1, 1}, + }, + } + + MatrixLine100Form12X5TypeA = []*structs.MatrixLine100Form12X5TypeA{ + { + Type: "Line100Form12X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {8, 8, 8, 8, 8}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {7, 8, 7, 8, 7}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {8, 7, 8, 7, 8}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {6, 7, 8, 7, 6}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {8, 7, 6, 7, 8}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {7, 8, 8, 8, 7}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {8, 7, 7, 7, 8}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {7, 7, 8, 7, 7}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {8, 8, 7, 8, 8}, + {9, 9, 9, 9, 9}, + {8, 9, 8, 9, 8}, + {9, 8, 9, 8, 9}, + {7, 8, 9, 8, 7}, + {9, 8, 7, 8, 9}, + {8, 9, 9, 9, 8}, + {9, 8, 8, 8, 9}, + {8, 8, 9, 8, 8}, + {9, 9, 8, 9, 9}, + {7, 7, 8, 9, 9}, + {10, 10, 10, 10, 10}, + {9, 10, 9, 10, 9}, + {10, 9, 10, 9, 10}, + {8, 9, 10, 9, 8}, + {10, 9, 8, 9, 10}, + {9, 10, 10, 10, 9}, + {10, 9, 9, 9, 10}, + {9, 9, 10, 9, 9}, + {10, 10, 9, 10, 10}, + {8, 8, 9, 10, 10}, + {11, 11, 11, 11, 11}, + {10, 11, 10, 11, 10}, + {11, 10, 11, 10, 11}, + {9, 10, 11, 10, 9}, + {11, 10, 9, 10, 11}, + {10, 11, 11, 11, 10}, + {11, 10, 10, 10, 11}, + {10, 10, 11, 10, 10}, + {11, 11, 10, 11, 11}, + {9, 9, 10, 11, 11}, + {12, 12, 12, 12, 12}, + {11, 12, 11, 12, 11}, + {12, 11, 12, 11, 12}, + {10, 11, 12, 11, 10}, + {12, 11, 10, 11, 12}, + {11, 12, 12, 12, 11}, + {12, 11, 11, 11, 12}, + {11, 11, 12, 11, 11}, + {12, 12, 11, 12, 12}, + {10, 10, 11, 12, 12}, + }, + Form: []int64{12, 12, 12, 12, 12}, + }, + } + + MatrixLine100Form6X5TypeA = []*structs.MatrixLine100Form6X5TypeA{ + { + Type: "Line100Form6X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {1, 1, 2, 1, 1}, + {1, 2, 2, 2, 1}, + {1, 2, 3, 2, 1}, + {1, 2, 1, 2, 1}, + {1, 1, 1, 2, 1}, + {1, 2, 1, 1, 1}, + {1, 1, 2, 2, 1}, + {1, 2, 2, 1, 1}, + {1, 1, 3, 1, 1}, + {1, 1, 3, 2, 1}, + {1, 2, 3, 1, 1}, + {1, 3, 3, 3, 1}, + {1, 3, 1, 3, 1}, + {1, 3, 2, 3, 1}, + {1, 3, 4, 3, 1}, + {2, 2, 2, 2, 2}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {2, 2, 2, 3, 2}, + {2, 2, 2, 1, 2}, + {2, 3, 2, 2, 2}, + {2, 1, 2, 2, 2}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {2, 3, 4, 3, 2}, + {2, 2, 4, 2, 2}, + {2, 4, 4, 4, 2}, + {2, 4, 3, 4, 2}, + {3, 3, 3, 3, 3}, + {3, 3, 4, 3, 3}, + {3, 3, 2, 3, 3}, + {3, 4, 4, 4, 3}, + {3, 2, 2, 2, 3}, + {3, 4, 3, 4, 3}, + {3, 2, 3, 2, 3}, + {3, 3, 3, 4, 3}, + {3, 3, 3, 2, 3}, + {3, 4, 3, 3, 3}, + {3, 2, 3, 3, 3}, + {3, 4, 2, 4, 3}, + {3, 2, 4, 2, 3}, + {3, 4, 5, 4, 3}, + {3, 3, 5, 3, 3}, + {3, 2, 1, 2, 3}, + {3, 3, 1, 3, 3}, + {4, 4, 4, 4, 4}, + {4, 4, 5, 4, 4}, + {4, 4, 3, 4, 4}, + {4, 5, 5, 5, 4}, + {4, 3, 3, 3, 4}, + {4, 5, 4, 5, 4}, + {4, 3, 4, 3, 4}, + {4, 4, 4, 5, 4}, + {4, 4, 4, 3, 4}, + {4, 5, 4, 4, 4}, + {4, 3, 4, 4, 4}, + {4, 5, 3, 5, 4}, + {4, 3, 5, 3, 4}, + {4, 5, 6, 5, 4}, + {4, 4, 6, 4, 4}, + {4, 3, 2, 3, 4}, + {4, 4, 2, 4, 4}, + {5, 5, 5, 5, 5}, + {5, 5, 6, 5, 5}, + {5, 5, 4, 5, 5}, + {5, 6, 6, 6, 5}, + {5, 4, 4, 4, 5}, + {5, 6, 5, 6, 5}, + {5, 4, 5, 4, 5}, + {5, 5, 5, 6, 5}, + {5, 5, 5, 4, 5}, + {5, 6, 5, 5, 5}, + {5, 4, 5, 5, 5}, + {5, 6, 4, 6, 5}, + {5, 4, 6, 4, 5}, + {5, 4, 3, 4, 5}, + {5, 5, 3, 5, 5}, + {5, 3, 3, 3, 5}, + {5, 3, 4, 3, 5}, + {6, 6, 6, 6, 6}, + {6, 6, 5, 6, 6}, + {6, 5, 5, 5, 6}, + {6, 5, 4, 5, 6}, + {6, 5, 6, 5, 6}, + {6, 6, 6, 5, 6}, + {6, 5, 6, 6, 6}, + {6, 6, 5, 5, 6}, + {6, 5, 5, 6, 6}, + {6, 6, 5, 6, 6}, + {6, 6, 4, 5, 6}, + {6, 5, 4, 6, 6}, + {6, 4, 4, 4, 6}, + {6, 4, 6, 4, 6}, + {6, 4, 5, 4, 6}, + {6, 4, 3, 4, 6}, + }, + Form: []int64{6, 6, 6, 6, 6}, + }, + } + + MatrixLine10Form343TypeA = []*structs.MatrixLine10Form343TypeA{ + { + Type: "Line10Form343TypeA", + LinkType: 0, + Direction: 0, + LineCount: 10, + Lines: [][]int64{ + {1, 1, 1}, + {1, 2, 1}, + {1, 2, 2}, + {2, 2, 1}, + {2, 2, 2}, + {2, 3, 2}, + {2, 3, 3}, + {3, 3, 2}, + {3, 3, 3}, + {3, 4, 3}, + }, + Form: []int64{3, 4, 3}, + }, + } + + MatrixLine10Form3X5TypeA = []*structs.MatrixLine10Form3X5TypeA{ + { + Type: "Line10Form3X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 10, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {3, 3, 2, 1, 1}, + {1, 1, 2, 3, 3}, + {3, 2, 2, 2, 1}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine1Form3X3TypeA = []*structs.MatrixLine1Form3X3TypeA{ + { + Type: "Line1Form3X3TypeA", + LinkType: 0, + Direction: 0, + LineCount: 1, + Lines: [][]int64{ + {1, 1, 1}, + }, + Form: []int64{3, 3, 3}, + }, + } + + MatrixLine1Form3X3TypeB = []*structs.MatrixLine1Form3X3TypeB{ + { + Type: "Line1Form3X3TypeB", + LinkType: 0, + Direction: 0, + LineCount: 1, + Lines: [][]int64{ + {2, 2, 2}, + }, + Form: []int64{3, 3, 3}, + }, + } + + MatrixLine1Form5X5TypeA = []*structs.MatrixLine1Form5X5TypeA{ + { + Type: "Line1Form5X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 1, + Lines: [][]int64{ + {3, 3, 3}, + }, + Form: []int64{5, 5, 5}, + }, + } + + MatrixLine20Form3X5TypeA = []*structs.MatrixLine20Form3X5TypeA{ + { + Type: "Line20Form3X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 20, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {2, 1, 3, 1, 2}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine25Form36666TypeA = []*structs.MatrixLine25Form36666TypeA{ + { + Type: "Line25Form36666TypeA", + LinkType: 0, + Direction: 0, + LineCount: 25, + Lines: [][]int64{ + {2, 5, 5, 5, 5}, + {1, 4, 4, 4, 4}, + {3, 6, 6, 6, 6}, + {1, 5, 6, 5, 4}, + {3, 5, 4, 5, 6}, + {2, 4, 4, 4, 5}, + {2, 6, 6, 6, 5}, + {1, 4, 5, 6, 6}, + {3, 6, 5, 4, 4}, + {2, 4, 5, 4, 5}, + {2, 6, 5, 6, 5}, + {1, 5, 5, 5, 6}, + {3, 5, 5, 5, 4}, + {2, 5, 4, 5, 6}, + {2, 5, 6, 5, 4}, + {1, 5, 4, 5, 4}, + {3, 5, 6, 5, 6}, + {1, 4, 6, 4, 4}, + {3, 6, 4, 6, 6}, + {2, 4, 6, 4, 5}, + {2, 6, 4, 6, 5}, + {1, 6, 4, 6, 4}, + {3, 4, 6, 4, 6}, + {1, 6, 6, 6, 4}, + {3, 4, 4, 4, 6}, + }, + Form: []int64{3, 6, 6, 6, 6}, + }, + } + + MatrixLine25Form3X5TypeA = []*structs.MatrixLine25Form3X5TypeA{ + { + Type: "Line25Form3X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 25, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 3, 2, 1, 1}, + {1, 1, 2, 3, 3}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {3, 3, 1, 3, 3}, + {1, 1, 3, 1, 1}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 3, 3, 1}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {3, 2, 2, 2, 3}, + {1, 2, 2, 2, 1}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine25Form3X5TypeB = []*structs.MatrixLine25Form3X5TypeB{ + { + Type: "Line25Form3X5TypeB", + LinkType: 0, + Direction: 2, + LineCount: 25, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 3, 2, 1, 1}, + {1, 1, 2, 3, 3}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {3, 3, 1, 3, 3}, + {1, 1, 3, 1, 1}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 3, 3, 1}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {3, 2, 2, 2, 3}, + {1, 2, 2, 2, 1}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine25Form3X5TypeC = []*structs.MatrixLine25Form3X5TypeC{ + { + Type: "Line25Form3X5TypeC", + LinkType: 0, + Direction: 0, + LineCount: 25, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine25Form3X5TypeD = []*structs.MatrixLine25Form3X5TypeD{ + { + Type: "Line25Form3X5TypeD", + LinkType: 0, + Direction: 0, + LineCount: 25, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine25Form3X5TypeE = []*structs.MatrixLine25Form3X5TypeE{ + { + Type: "Line25Form3X5TypeE", + LinkType: 0, + Direction: 0, + LineCount: 25, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {2, 2, 1, 2, 3}, + {2, 2, 3, 2, 1}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine30Form3X5TypeA = []*structs.MatrixLine30Form3X5TypeA{ + { + Type: "Line30Form3X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 30, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 3, 2, 1, 3}, + {3, 1, 2, 3, 1}, + {2, 1, 3, 2, 3}, + {1, 3, 2, 3, 1}, + {3, 2, 1, 1, 2}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine30Form3X5TypeB = []*structs.MatrixLine30Form3X5TypeB{ + { + Type: "Line30Form3X5TypeB", + LinkType: 0, + Direction: 0, + LineCount: 30, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 2, 1}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 2, 3, 1}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine30Form3X5TypeC = []*structs.MatrixLine30Form3X5TypeC{ + { + Type: "Line30Form3X5TypeC", + LinkType: 0, + Direction: 0, + LineCount: 30, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 3, 2, 1, 1}, + {1, 1, 2, 3, 3}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {3, 2, 2, 2, 3}, + {1, 2, 2, 2, 1}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {3, 3, 1, 3, 3}, + {1, 1, 3, 1, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 3, 3, 1}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {3, 1, 3, 1, 3}, + {1, 3, 1, 3, 1}, + {1, 3, 2, 1, 3}, + {3, 1, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {1, 2, 3, 3, 2}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine30Form3X5TypeD = []*structs.MatrixLine30Form3X5TypeD{ + { + Type: "Line30Form3X5TypeD", + LinkType: 0, + Direction: 0, + LineCount: 30, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {3, 1, 2, 3, 1}, + {1, 3, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {3, 2, 1, 1, 2}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine30Form3X5TypeE = []*structs.MatrixLine30Form3X5TypeE{ + { + Type: "Line30Form3X5TypeE", + LinkType: 0, + Direction: 0, + LineCount: 30, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 2, 1, 1}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {3, 2, 2, 2, 3}, + {1, 2, 2, 2, 1}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {3, 1, 3, 1, 3}, + {1, 3, 1, 3, 1}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {3, 3, 1, 3, 3}, + {1, 1, 3, 1, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 3, 3, 2, 3}, + {1, 1, 1, 2, 1}, + {2, 2, 2, 1, 2}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine30Form3X6TypeA = []*structs.MatrixLine30Form3X6TypeA{ + { + Type: "Line30Form3X6TypeA", + LinkType: 0, + Direction: 0, + LineCount: 30, + Lines: [][]int64{ + {1, 1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3, 3}, + {3, 2, 1, 2, 3, 2}, + {1, 2, 3, 2, 1, 2}, + {1, 1, 2, 2, 1, 1}, + {3, 3, 2, 2, 3, 3}, + {1, 2, 2, 2, 2, 1}, + {3, 2, 2, 2, 2, 3}, + {1, 2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2, 3}, + {3, 2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2, 1}, + {2, 2, 1, 1, 2, 2}, + {2, 2, 3, 3, 2, 2}, + {1, 3, 1, 3, 1, 3}, + {3, 1, 3, 1, 3, 1}, + {1, 2, 3, 2, 3, 2}, + {3, 2, 1, 2, 1, 2}, + {1, 2, 1, 2, 3, 2}, + {1, 2, 3, 2, 3, 2}, + {1, 3, 1, 1, 3, 1}, + {3, 1, 3, 3, 1, 3}, + {3, 2, 1, 2, 3, 3}, + {1, 2, 3, 2, 1, 1}, + {1, 1, 2, 2, 1, 2}, + {3, 3, 2, 2, 3, 2}, + {1, 2, 2, 2, 2, 3}, + {3, 2, 2, 2, 2, 1}, + {3, 1, 3, 1, 3, 2}, + }, + Form: []int64{3, 3, 3, 3, 3, 3}, + }, + } + + MatrixLine30Form4X5TypeA = []*structs.MatrixLine30Form4X5TypeA{ + { + Type: "Line30Form4X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 30, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {1, 2, 1, 2, 3}, + {2, 3, 2, 3, 4}, + {4, 3, 4, 3, 2}, + {3, 2, 3, 2, 1}, + {1, 2, 3, 2, 3}, + {2, 3, 4, 3, 4}, + {3, 2, 1, 2, 1}, + {4, 3, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {1, 2, 1, 2, 1}, + {4, 3, 4, 3, 4}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + + MatrixLine30Form4X5TypeB = []*structs.MatrixLine30Form4X5TypeB{ + { + Type: "Line30Form4X5TypeB", + LinkType: 0, + Direction: 0, + LineCount: 30, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {2, 1, 2, 3, 2}, + {3, 2, 3, 4, 3}, + {2, 3, 2, 1, 2}, + {3, 4, 3, 2, 3}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + + MatrixLine3Form3X3TypeA = []*structs.MatrixLine3Form3X3TypeA{ + { + Type: "Line3Form3X3TypeA", + LinkType: 0, + Direction: 0, + LineCount: 3, + Lines: [][]int64{ + {1, 1, 1}, + {2, 2, 2}, + {3, 3, 3}, + }, + Form: []int64{3, 3, 3}, + }, + } + + MatrixLine40Form34543TypeA = []*structs.MatrixLine40Form34543TypeA{ + { + Type: "Line40Form34543TypeA", + LinkType: 0, + Direction: 0, + LineCount: 40, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {1, 1, 4, 3, 2}, + {1, 2, 4, 2, 2}, + {1, 2, 3, 4, 3}, + {1, 3, 1, 1, 1}, + {1, 4, 5, 4, 3}, + {2, 1, 2, 1, 1}, + {2, 1, 3, 3, 2}, + {2, 2, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {2, 3, 2, 1, 1}, + {2, 3, 3, 4, 3}, + {2, 4, 5, 3, 3}, + {2, 4, 5, 4, 3}, + {3, 1, 1, 2, 2}, + {3, 2, 4, 2, 1}, + {3, 3, 3, 3, 2}, + {3, 3, 2, 2, 2}, + {3, 4, 4, 4, 3}, + {3, 4, 5, 3, 2}, + {3, 4, 5, 4, 3}, + {3, 4, 2, 2, 2}, + {3, 3, 2, 3, 2}, + {3, 3, 3, 1, 1}, + {3, 2, 5, 4, 3}, + {3, 1, 1, 1, 1}, + {2, 4, 4, 4, 3}, + {2, 4, 3, 2, 2}, + {2, 3, 5, 4, 3}, + {2, 3, 4, 3, 2}, + {2, 2, 4, 4, 3}, + {2, 2, 3, 1, 1}, + {2, 1, 1, 2, 1}, + {2, 1, 1, 1, 1}, + {1, 4, 5, 3, 2}, + {1, 3, 2, 3, 3}, + {1, 2, 3, 2, 2}, + {1, 2, 4, 3, 2}, + {1, 1, 2, 1, 1}, + {1, 1, 1, 2, 2}, + }, + Form: []int64{3, 4, 5, 4, 3}, + }, + } + + MatrixLine40Form3X5TypeA = []*structs.MatrixLine40Form3X5TypeA{ + { + Type: "Line40Form3X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 40, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 3, 2, 3, 3}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {2, 1, 1, 2, 3}, + {2, 3, 3, 2, 1}, + {2, 2, 2, 3, 2}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine40Form3X5TypeB = []*structs.MatrixLine40Form3X5TypeB{ + { + Type: "Line40Form3X5TypeB", + LinkType: 0, + Direction: 0, + LineCount: 40, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 2, 1}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 1, 1, 1, 2}, + {2, 2, 2, 2, 1}, + {2, 2, 2, 2, 3}, + {3, 3, 3, 3, 2}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + {2, 1, 1, 1, 1}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine40Form3X5TypeC = []*structs.MatrixLine40Form3X5TypeC{ + { + Type: "Line40Form3X5TypeC", + LinkType: 0, + Direction: 0, + LineCount: 40, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 2, 3, 1}, + {2, 3, 2, 1, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {2, 2, 2, 1, 2}, + {2, 2, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {3, 3, 2, 1, 2}, + {1, 1, 2, 3, 2}, + {3, 2, 3, 3, 3}, + {1, 2, 1, 1, 1}, + {1, 2, 3, 2, 2}, + {3, 2, 1, 2, 2}, + {2, 1, 2, 1, 1}, + {2, 3, 2, 3, 3}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + {2, 1, 1, 1, 1}, + {2, 3, 3, 3, 3}, + {2, 2, 2, 2, 1}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine40Form3X5TypeD = []*structs.MatrixLine40Form3X5TypeD{ + { + Type: "Line40Form3X5TypeD", + LinkType: 0, + Direction: 0, + LineCount: 40, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 3, 2, 1, 3}, + {3, 1, 2, 3, 1}, + {2, 1, 3, 2, 3}, + {1, 3, 2, 3, 1}, + {3, 2, 1, 1, 2}, + {1, 2, 3, 3, 2}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 1, 1}, + {3, 1, 1, 2, 3}, + {2, 3, 3, 1, 1}, + {1, 1, 2, 2, 3}, + {3, 3, 1, 2, 1}, + {3, 3, 1, 1, 1}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine40Form4X5TypeA = []*structs.MatrixLine40Form4X5TypeA{ + { + Type: "Line40Form4X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 40, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {2, 1, 2, 3, 2}, + {3, 2, 3, 4, 3}, + {2, 3, 2, 1, 2}, + {3, 4, 3, 2, 3}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {2, 2, 4, 2, 2}, + {3, 3, 1, 3, 3}, + {4, 4, 2, 4, 4}, + {1, 1, 1, 2, 3}, + {4, 4, 4, 3, 2}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + + MatrixLine40Form4X5TypeB = []*structs.MatrixLine40Form4X5TypeB{ + { + Type: "Line40Form4X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 40, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {1, 1, 2, 3, 4}, + {4, 4, 3, 2, 1}, + {2, 1, 1, 1, 2}, + {3, 4, 4, 4, 3}, + {1, 2, 3, 4, 4}, + {4, 3, 2, 1, 1}, + {2, 1, 2, 3, 2}, + {3, 4, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {4, 3, 4, 3, 4}, + {2, 3, 2, 1, 2}, + {3, 2, 3, 4, 3}, + {1, 2, 2, 2, 1}, + {4, 3, 3, 3, 4}, + {2, 2, 3, 4, 4}, + {3, 3, 2, 1, 1}, + {2, 2, 1, 2, 2}, + {3, 3, 4, 3, 3}, + {2, 3, 3, 3, 4}, + {3, 2, 2, 2, 1}, + {1, 1, 2, 1, 1}, + {4, 4, 3, 4, 4}, + {1, 2, 3, 3, 4}, + {4, 3, 2, 2, 1}, + {1, 1, 1, 2, 3}, + {4, 4, 4, 3, 2}, + {2, 1, 1, 2, 3}, + {3, 4, 4, 3, 2}, + {1, 2, 2, 3, 4}, + {4, 3, 3, 2, 1}, + {2, 1, 2, 3, 4}, + {3, 4, 3, 2, 1}, + {1, 2, 3, 4, 3}, + {4, 3, 2, 1, 2}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + + MatrixLine40Form4X5TypeC = []*structs.MatrixLine40Form4X5TypeC{ + { + Type: "Line40Form4X5TypeC", + LinkType: 0, + Direction: 0, + LineCount: 40, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {1, 2, 3, 2, 1}, + {4, 3, 2, 3, 4}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {1, 2, 1, 2, 1}, + {4, 3, 4, 3, 4}, + {2, 1, 2, 1, 2}, + {3, 4, 3, 4, 3}, + {2, 3, 2, 3, 2}, + {3, 2, 3, 2, 3}, + {1, 1, 2, 1, 1}, + {4, 4, 3, 4, 4}, + {2, 2, 3, 2, 2}, + {3, 3, 2, 3, 3}, + {3, 3, 4, 3, 3}, + {2, 2, 1, 2, 2}, + {3, 2, 2, 2, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 4, 4, 4, 3}, + {4, 3, 3, 3, 4}, + {1, 2, 2, 2, 1}, + {3, 1, 1, 1, 3}, + {2, 4, 4, 4, 2}, + {4, 2, 2, 2, 4}, + {1, 3, 3, 3, 1}, + {3, 3, 1, 3, 3}, + {2, 2, 4, 2, 2}, + {4, 4, 2, 4, 4}, + {1, 1, 3, 1, 1}, + {4, 4, 1, 4, 4}, + {1, 1, 4, 1, 1}, + {4, 3, 2, 1, 1}, + {1, 2, 3, 4, 4}, + {1, 1, 2, 3, 4}, + {4, 4, 3, 2, 1}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + + MatrixLine40Form4X6TypeA = []*structs.MatrixLine40Form4X6TypeA{ + { + Type: "Line40Form4X6TypeA", + LinkType: 0, + Direction: 0, + LineCount: 40, + Lines: [][]int64{ + {1, 1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4, 4}, + {1, 1, 2, 2, 1, 1}, + {2, 2, 3, 3, 2, 2}, + {3, 3, 4, 4, 3, 3}, + {2, 2, 1, 1, 2, 2}, + {3, 3, 2, 2, 3, 3}, + {4, 4, 3, 3, 4, 4}, + {1, 2, 3, 3, 2, 1}, + {2, 3, 4, 4, 3, 2}, + {3, 2, 1, 1, 2, 3}, + {4, 3, 2, 2, 3, 4}, + {1, 2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2, 3}, + {3, 4, 3, 4, 3, 4}, + {2, 1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3, 2}, + {4, 3, 4, 3, 4, 3}, + {1, 2, 2, 2, 2, 1}, + {2, 3, 3, 3, 3, 2}, + {3, 4, 4, 4, 4, 3}, + {2, 1, 1, 1, 1, 2}, + {3, 2, 2, 2, 2, 3}, + {4, 3, 3, 3, 3, 4}, + {1, 2, 3, 4, 3, 2}, + {2, 3, 4, 3, 2, 1}, + {3, 2, 1, 2, 3, 4}, + {4, 3, 2, 1, 2, 3}, + {2, 1, 2, 3, 4, 3}, + {1, 2, 1, 2, 3, 4}, + {3, 4, 3, 2, 1, 2}, + {4, 3, 4, 3, 2, 1}, + {2, 1, 2, 2, 1, 2}, + {3, 2, 3, 3, 2, 3}, + {4, 3, 4, 4, 3, 4}, + {1, 2, 1, 1, 2, 1}, + {2, 3, 2, 2, 3, 2}, + {3, 4, 3, 3, 4, 3}, + }, + Form: []int64{4, 4, 4, 4, 4, 4}, + }, + } + + MatrixLine50Form3X5TypeA = []*structs.MatrixLine50Form3X5TypeA{ + { + Type: "Line50Form3X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {2, 2, 2, 2, 3}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {1, 2, 3, 2, 3}, + {3, 2, 1, 2, 1}, + {1, 1, 1, 1, 2}, + {3, 3, 3, 3, 2}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 2, 1}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {2, 2, 1, 1, 1}, + {2, 2, 3, 3, 3}, + {2, 1, 1, 2, 3}, + {2, 3, 3, 2, 1}, + {2, 1, 2, 3, 3}, + {2, 3, 2, 1, 1}, + {3, 2, 1, 1, 2}, + {1, 2, 3, 3, 2}, + {1, 1, 2, 3, 2}, + {3, 3, 2, 1, 2}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine50Form3X5TypeB = []*structs.MatrixLine50Form3X5TypeB{ + { + Type: "Line50Form3X5TypeB", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 3, 2, 1, 3}, + {3, 1, 2, 3, 1}, + {2, 1, 3, 2, 3}, + {1, 3, 2, 3, 1}, + {3, 2, 1, 1, 2}, + {1, 2, 3, 3, 2}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 1, 1}, + {3, 1, 1, 2, 3}, + {2, 3, 3, 1, 1}, + {1, 1, 2, 2, 3}, + {3, 3, 1, 2, 1}, + {3, 3, 1, 1, 1}, + {3, 3, 2, 3, 2}, + {1, 1, 3, 2, 1}, + {2, 2, 1, 2, 3}, + {2, 1, 1, 3, 2}, + {2, 3, 1, 1, 3}, + {3, 1, 1, 3, 1}, + {1, 2, 2, 3, 2}, + {1, 2, 3, 1, 3}, + {1, 3, 1, 2, 3}, + {2, 2, 3, 3, 2}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine50Form3X5TypeC = []*structs.MatrixLine50Form3X5TypeC{ + { + Type: "Line50Form3X5TypeC", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {2, 2, 2, 1, 3}, + {2, 2, 2, 3, 1}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {3, 3, 2, 1, 2}, + {1, 1, 2, 3, 2}, + {3, 2, 3, 3, 3}, + {1, 2, 1, 1, 1}, + {1, 2, 3, 2, 2}, + {3, 2, 1, 2, 2}, + {2, 1, 2, 1, 1}, + {2, 3, 2, 3, 3}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + {2, 1, 1, 1, 1}, + {2, 3, 3, 3, 3}, + {2, 2, 2, 2, 1}, + {2, 2, 2, 2, 3}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 1, 2, 1}, + {3, 3, 3, 2, 3}, + {2, 2, 1, 1, 1}, + {2, 2, 3, 3, 3}, + {1, 1, 2, 2, 1}, + {3, 3, 2, 2, 3}, + {3, 2, 1, 2, 1}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine50Form3X5TypeD = []*structs.MatrixLine50Form3X5TypeD{ + { + Type: "Line50Form3X5TypeD", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {3, 1, 2, 3, 1}, + {1, 3, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {3, 2, 1, 1, 2}, + {1, 2, 3, 3, 2}, + {1, 1, 3, 3, 3}, + {3, 3, 1, 1, 1}, + {2, 1, 3, 2, 3}, + {2, 3, 1, 2, 1}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 2, 1}, + {2, 3, 3, 1, 1}, + {1, 1, 2, 2, 3}, + {3, 3, 2, 2, 1}, + {3, 1, 1, 1, 1}, + {1, 3, 3, 3, 3}, + {3, 3, 3, 3, 1}, + {1, 1, 1, 1, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine50Form3X5TypeE = []*structs.MatrixLine50Form3X5TypeE{ + { + Type: "Line50Form3X5TypeE", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 2, 1}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 1, 1, 1, 2}, + {2, 2, 2, 2, 1}, + {2, 2, 2, 2, 3}, + {3, 3, 3, 3, 2}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + {2, 1, 1, 1, 1}, + {2, 3, 3, 3, 3}, + {1, 1, 2, 2, 3}, + {3, 3, 2, 2, 1}, + {1, 1, 2, 3, 2}, + {3, 3, 2, 1, 2}, + {1, 2, 3, 2, 3}, + {3, 2, 1, 2, 1}, + {2, 1, 1, 2, 3}, + {2, 3, 3, 2, 1}, + {1, 3, 1, 3, 1}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine50Form3X5TypeF = []*structs.MatrixLine50Form3X5TypeF{ + { + Type: "Line50Form3X5TypeF", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 2, 3, 2}, + {2, 3, 2, 1, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {2, 2, 2, 1, 2}, + {2, 2, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {3, 3, 2, 1, 2}, + {1, 1, 2, 3, 2}, + {3, 2, 3, 3, 3}, + {1, 2, 1, 1, 1}, + {1, 2, 3, 2, 2}, + {3, 2, 1, 2, 2}, + {2, 1, 2, 1, 1}, + {2, 3, 2, 3, 3}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + {2, 1, 1, 1, 1}, + {2, 3, 3, 3, 3}, + {2, 2, 2, 2, 1}, + {2, 2, 2, 2, 3}, + {1, 1, 2, 1, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 1, 2, 1}, + {3, 3, 3, 2, 3}, + {2, 2, 1, 1, 1}, + {2, 2, 3, 3, 3}, + {1, 1, 2, 2, 1}, + {3, 3, 2, 2, 3}, + {3, 2, 1, 2, 1}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine50Form3X5TypeG = []*structs.MatrixLine50Form3X5TypeG{ + { + Type: "Line50Form3X5TypeG", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 3, 2, 3, 3}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {2, 1, 1, 2, 3}, + {2, 3, 3, 2, 1}, + {2, 2, 2, 3, 2}, + {2, 2, 2, 1, 2}, + {1, 1, 1, 1, 2}, + {3, 3, 3, 3, 2}, + {2, 2, 2, 2, 3}, + {2, 2, 2, 2, 1}, + {2, 2, 1, 1, 1}, + {2, 2, 3, 3, 3}, + {1, 1, 1, 2, 2}, + {3, 3, 3, 2, 2}, + {2, 1, 1, 1, 1}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine50Form3X5TypeH = []*structs.MatrixLine50Form3X5TypeH{ + { + Type: "Line50Form3X5TypeH", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 3, 2, 3, 3}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {1, 1, 1, 2, 3}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {2, 1, 1, 2, 3}, + {2, 3, 3, 2, 1}, + {2, 2, 2, 3, 2}, + {2, 2, 2, 1, 2}, + {1, 1, 1, 1, 2}, + {3, 3, 3, 3, 2}, + {2, 2, 2, 2, 3}, + {2, 2, 2, 2, 1}, + {2, 2, 1, 1, 1}, + {2, 2, 3, 3, 3}, + {1, 1, 1, 2, 2}, + {3, 3, 3, 2, 2}, + {2, 1, 1, 1, 1}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine50Form45454TypeA = []*structs.MatrixLine50Form45454TypeA{ + { + Type: "Line50Form45454TypeA", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {1, 1, 1, 2, 1}, + {1, 1, 1, 2, 2}, + {1, 2, 1, 1, 1}, + {1, 2, 1, 2, 1}, + {1, 2, 1, 2, 2}, + {1, 2, 2, 2, 1}, + {1, 2, 2, 2, 2}, + {1, 2, 2, 3, 2}, + {1, 2, 2, 3, 3}, + {2, 2, 1, 1, 1}, + {2, 2, 1, 2, 1}, + {2, 2, 1, 2, 2}, + {2, 2, 2, 2, 1}, + {2, 2, 2, 2, 2}, + {2, 2, 2, 3, 2}, + {2, 2, 2, 3, 3}, + {2, 2, 2, 2, 1}, + {2, 3, 2, 2, 2}, + {2, 3, 2, 3, 2}, + {2, 3, 2, 3, 3}, + {2, 3, 3, 3, 2}, + {2, 3, 3, 3, 3}, + {2, 3, 3, 4, 3}, + {2, 3, 3, 4, 4}, + {3, 3, 2, 2, 1}, + {3, 3, 2, 2, 2}, + {3, 3, 2, 3, 2}, + {3, 3, 2, 3, 3}, + {3, 3, 3, 3, 2}, + {3, 3, 3, 3, 3}, + {3, 3, 3, 4, 3}, + {3, 3, 3, 4, 4}, + {3, 4, 3, 3, 2}, + {3, 4, 3, 3, 3}, + {3, 4, 3, 4, 3}, + {3, 4, 3, 4, 4}, + {3, 4, 4, 4, 3}, + {3, 4, 4, 4, 4}, + {3, 4, 4, 5, 4}, + {4, 4, 3, 3, 2}, + {4, 4, 3, 3, 3}, + {4, 4, 3, 4, 3}, + {4, 4, 3, 4, 4}, + {4, 4, 4, 4, 3}, + {4, 4, 4, 4, 4}, + {4, 4, 4, 5, 4}, + {4, 5, 4, 4, 3}, + {4, 5, 4, 4, 4}, + {4, 5, 4, 5, 4}, + }, + Form: []int64{4, 5, 4, 5, 4}, + }, + } + + MatrixLine50Form4X5TypeA = []*structs.MatrixLine50Form4X5TypeA{ + { + Type: "Line50Form4X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 3, 3, 3, 4}, + {3, 2, 2, 2, 3}, + {2, 1, 1, 1, 2}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {4, 3, 2, 3, 4}, + {3, 2, 1, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 3, 4, 4}, + {3, 3, 2, 3, 3}, + {2, 2, 1, 2, 2}, + {1, 4, 1, 4, 1}, + {4, 1, 4, 1, 4}, + {4, 2, 4, 2, 4}, + {3, 1, 3, 1, 3}, + {1, 3, 1, 3, 1}, + {2, 4, 2, 4, 2}, + {4, 3, 3, 2, 1}, + {1, 2, 2, 3, 4}, + {1, 2, 3, 3, 4}, + {4, 3, 2, 2, 1}, + {2, 1, 4, 3, 2}, + {3, 4, 1, 2, 3}, + {4, 4, 1, 4, 4}, + {1, 1, 4, 1, 1}, + {4, 1, 1, 1, 4}, + {1, 4, 4, 4, 1}, + {4, 2, 2, 2, 4}, + {1, 3, 3, 3, 1}, + {4, 2, 3, 2, 4}, + {1, 3, 2, 3, 1}, + {4, 1, 2, 1, 4}, + {1, 4, 2, 4, 1}, + {4, 4, 2, 4, 4}, + {1, 1, 3, 1, 1}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + + MatrixLine50Form4X5TypeB = []*structs.MatrixLine50Form4X5TypeB{ + { + Type: "Line50Form4X5TypeB", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {2, 1, 2, 3, 2}, + {3, 2, 3, 4, 3}, + {2, 3, 2, 1, 2}, + {3, 4, 3, 2, 3}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {2, 2, 4, 2, 2}, + {3, 3, 1, 3, 3}, + {4, 4, 2, 4, 4}, + {1, 1, 1, 2, 3}, + {4, 4, 4, 3, 2}, + {2, 2, 2, 3, 4}, + {3, 3, 3, 2, 1}, + {1, 1, 1, 1, 2}, + {4, 4, 4, 4, 3}, + {1, 2, 3, 4, 3}, + {1, 2, 3, 4, 4}, + {4, 3, 2, 1, 1}, + {4, 3, 2, 1, 2}, + {1, 1, 2, 3, 4}, + {4, 4, 3, 2, 1}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + + MatrixLine50Form4X5TypeC = []*structs.MatrixLine50Form4X5TypeC{ + { + Type: "Line50Form4X5TypeC", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {4, 3, 2, 3, 4}, + {3, 4, 3, 4, 3}, + {2, 1, 2, 1, 2}, + {2, 2, 3, 4, 4}, + {3, 3, 2, 1, 1}, + {4, 3, 3, 3, 4}, + {1, 2, 2, 2, 1}, + {2, 3, 2, 1, 2}, + {3, 2, 3, 4, 3}, + {2, 1, 1, 2, 3}, + {3, 4, 4, 3, 2}, + {2, 3, 3, 3, 2}, + {3, 2, 2, 2, 3}, + {3, 3, 4, 3, 2}, + {2, 2, 1, 2, 3}, + {1, 2, 1, 2, 1}, + {4, 3, 4, 3, 4}, + {1, 1, 2, 1, 1}, + {4, 4, 3, 4, 4}, + {2, 2, 3, 2, 2}, + {3, 3, 2, 3, 3}, + {1, 1, 2, 3, 3}, + {4, 4, 3, 2, 2}, + {2, 3, 2, 3, 2}, + {3, 2, 3, 2, 3}, + {3, 4, 3, 2, 3}, + {2, 1, 2, 3, 2}, + {2, 1, 1, 1, 2}, + {3, 4, 4, 4, 3}, + {2, 2, 2, 3, 4}, + {3, 3, 3, 2, 1}, + {1, 2, 3, 4, 3}, + {4, 3, 2, 1, 2}, + {2, 3, 4, 4, 4}, + {3, 2, 1, 1, 1}, + {1, 1, 1, 2, 3}, + {4, 4, 4, 3, 2}, + {4, 3, 3, 2, 1}, + {1, 2, 2, 3, 4}, + {2, 3, 3, 4, 4}, + {3, 2, 2, 1, 1}, + {1, 2, 1, 2, 3}, + {4, 3, 4, 3, 2}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + + MatrixLine50Form4X5TypeD = []*structs.MatrixLine50Form4X5TypeD{ + { + Type: "Line50Form4X5TypeD", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {2, 1, 2, 3, 2}, + {3, 2, 3, 4, 3}, + {2, 3, 2, 1, 2}, + {3, 4, 3, 2, 3}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {2, 2, 4, 2, 2}, + {3, 3, 1, 3, 3}, + {4, 4, 2, 4, 4}, + {1, 1, 1, 2, 3}, + {4, 4, 4, 3, 2}, + {2, 2, 2, 3, 4}, + {3, 3, 3, 2, 1}, + {1, 1, 1, 1, 2}, + {4, 4, 4, 4, 3}, + {1, 2, 3, 4, 3}, + {1, 2, 3, 4, 4}, + {4, 3, 2, 1, 1}, + {4, 3, 2, 1, 2}, + {1, 1, 2, 3, 4}, + {4, 4, 3, 2, 1}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + + MatrixLine50Form4X5TypeE = []*structs.MatrixLine50Form4X5TypeE{ + { + Type: "Line50Form4X5TypeE", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {1, 1, 2, 1, 1}, + {1, 2, 2, 2, 1}, + {1, 2, 3, 2, 1}, + {1, 2, 1, 2, 1}, + {1, 1, 1, 2, 1}, + {1, 2, 1, 1, 1}, + {1, 1, 2, 2, 1}, + {1, 2, 2, 1, 1}, + {1, 1, 3, 1, 1}, + {1, 1, 3, 2, 1}, + {1, 2, 3, 1, 1}, + {2, 2, 2, 2, 2}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {2, 3, 3, 3, 2}, + {2, 1, 1, 1, 2}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {2, 2, 2, 3, 2}, + {2, 2, 2, 1, 2}, + {2, 3, 2, 2, 2}, + {2, 1, 2, 2, 2}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {3, 3, 3, 3, 3}, + {3, 3, 4, 3, 3}, + {3, 3, 2, 3, 3}, + {3, 4, 4, 4, 3}, + {3, 2, 2, 2, 3}, + {3, 4, 3, 4, 3}, + {3, 2, 3, 2, 3}, + {3, 3, 3, 4, 3}, + {3, 3, 3, 2, 3}, + {3, 4, 3, 3, 3}, + {3, 2, 3, 3, 3}, + {3, 4, 2, 4, 3}, + {3, 2, 4, 2, 3}, + {4, 4, 4, 4, 4}, + {4, 4, 3, 4, 4}, + {4, 3, 3, 3, 4}, + {4, 3, 2, 3, 4}, + {4, 3, 4, 3, 4}, + {4, 4, 4, 3, 4}, + {4, 3, 4, 4, 4}, + {4, 4, 3, 3, 4}, + {4, 3, 3, 4, 4}, + {4, 4, 2, 4, 4}, + {4, 4, 2, 3, 4}, + {4, 3, 2, 4, 4}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + + MatrixLine50Form4X5TypeF = []*structs.MatrixLine50Form4X5TypeF{ + { + Type: "Line50Form4X5TypeF", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4}, + {1, 2, 3, 4, 3}, + {4, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {3, 4, 3, 2, 3}, + {2, 3, 4, 4, 4}, + {3, 2, 1, 1, 1}, + {2, 3, 3, 4, 4}, + {3, 2, 2, 1, 1}, + {2, 2, 1, 2, 2}, + {3, 3, 4, 3, 3}, + {1, 2, 2, 2, 1}, + {4, 3, 3, 3, 4}, + {2, 1, 1, 1, 2}, + {3, 4, 4, 4, 3}, + {1, 1, 2, 1, 1}, + {4, 4, 3, 4, 4}, + {1, 1, 2, 3, 4}, + {4, 4, 3, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {4, 3, 4, 3, 4}, + {2, 1, 2, 1, 2}, + {3, 4, 3, 4, 3}, + {1, 1, 1, 2, 2}, + {4, 4, 4, 3, 3}, + {2, 2, 2, 3, 4}, + {3, 3, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {4, 3, 2, 3, 4}, + {2, 2, 3, 3, 4}, + {3, 3, 2, 2, 1}, + {2, 2, 1, 1, 2}, + {3, 3, 4, 4, 3}, + {1, 2, 1, 1, 2}, + {4, 3, 4, 4, 3}, + {2, 3, 3, 3, 2}, + {3, 2, 2, 2, 3}, + {2, 1, 1, 2, 1}, + {3, 4, 4, 3, 4}, + {1, 2, 2, 1, 2}, + {4, 3, 3, 4, 3}, + {2, 3, 2, 1, 1}, + {3, 2, 3, 4, 4}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + + MatrixLine50Form4X6TypeA = []*structs.MatrixLine50Form4X6TypeA{ + { + Type: "Line50Form4X6TypeA", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {2, 2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1, 1}, + {4, 4, 4, 4, 4, 4}, + {1, 2, 3, 3, 2, 1}, + {4, 3, 2, 2, 3, 4}, + {2, 3, 4, 4, 3, 2}, + {3, 2, 1, 1, 2, 3}, + {1, 2, 1, 1, 2, 1}, + {4, 3, 4, 4, 3, 4}, + {2, 1, 2, 2, 1, 2}, + {3, 4, 3, 3, 4, 3}, + {2, 3, 2, 2, 3, 2}, + {3, 2, 3, 3, 2, 3}, + {1, 1, 2, 2, 1, 1}, + {4, 4, 3, 3, 4, 4}, + {2, 2, 3, 3, 2, 2}, + {3, 3, 2, 2, 3, 3}, + {3, 3, 4, 4, 3, 3}, + {2, 2, 1, 1, 2, 2}, + {2, 3, 3, 3, 3, 2}, + {3, 2, 2, 2, 2, 3}, + {2, 1, 1, 1, 1, 2}, + {3, 4, 4, 4, 4, 3}, + {4, 3, 3, 3, 3, 4}, + {1, 2, 2, 2, 2, 1}, + {3, 1, 1, 1, 1, 3}, + {2, 4, 4, 4, 4, 2}, + {4, 2, 2, 2, 2, 4}, + {1, 3, 3, 3, 3, 1}, + {3, 3, 1, 1, 3, 3}, + {2, 2, 4, 4, 2, 2}, + {1, 1, 3, 3, 1, 1}, + {4, 4, 2, 2, 4, 4}, + {4, 4, 1, 1, 4, 4}, + {1, 1, 4, 4, 1, 1}, + {4, 3, 2, 1, 1, 1}, + {1, 2, 3, 4, 4, 4}, + {1, 1, 1, 2, 3, 4}, + {4, 4, 4, 3, 2, 1}, + {3, 2, 1, 1, 1, 1}, + {2, 3, 4, 4, 4, 4}, + {1, 1, 1, 1, 2, 3}, + {4, 4, 4, 4, 3, 2}, + {4, 3, 2, 2, 2, 2}, + {1, 2, 3, 3, 3, 3}, + {2, 2, 2, 2, 3, 4}, + {3, 3, 3, 3, 2, 1}, + {2, 4, 1, 1, 4, 2}, + {3, 1, 4, 4, 1, 3}, + }, + Form: []int64{4, 4, 4, 4, 4, 4}, + }, + } + + MatrixLine50Form5X5TypeA = []*structs.MatrixLine50Form5X5TypeA{ + { + Type: "Line50Form5X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {2, 1, 2, 3, 2}, + {3, 2, 3, 4, 3}, + {4, 3, 4, 5, 4}, + {2, 3, 2, 1, 2}, + {3, 4, 3, 2, 3}, + {4, 5, 4, 3, 4}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 4, 5, 5}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {5, 5, 4, 3, 3}, + {1, 1, 3, 1, 1}, + {2, 2, 4, 2, 2}, + {3, 3, 5, 3, 3}, + }, + Form: []int64{5, 5, 5, 5, 5}, + }, + } + + MatrixLine50Form5X5TypeB = []*structs.MatrixLine50Form5X5TypeB{ + { + Type: "Line50Form5X5TypeB", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {4, 4, 4, 4, 4}, + {3, 3, 3, 3, 3}, + {5, 5, 5, 5, 5}, + {3, 4, 5, 4, 3}, + {5, 4, 3, 4, 5}, + {4, 3, 3, 3, 4}, + {4, 5, 5, 5, 4}, + {3, 3, 4, 5, 5}, + {5, 5, 4, 3, 3}, + {4, 3, 4, 3, 4}, + {4, 5, 4, 5, 4}, + {3, 4, 4, 4, 5}, + {5, 4, 4, 4, 3}, + {4, 4, 3, 4, 5}, + {4, 4, 5, 4, 3}, + {3, 4, 3, 4, 3}, + {5, 4, 5, 4, 5}, + {3, 3, 5, 3, 3}, + {5, 5, 3, 5, 5}, + {4, 3, 5, 3, 4}, + {4, 5, 3, 5, 4}, + {3, 5, 3, 5, 3}, + {5, 3, 5, 3, 5}, + {3, 5, 5, 5, 3}, + {5, 3, 3, 3, 5}, + {3, 5, 4, 5, 3}, + {5, 3, 4, 3, 5}, + {4, 4, 5, 4, 4}, + {4, 4, 3, 4, 4}, + {3, 5, 3, 4, 4}, + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {2, 2, 1, 2, 3}, + {2, 2, 3, 2, 1}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {2, 1, 3, 1, 2}, + {2, 3, 1, 3, 2}, + }, + Form: []int64{5, 5, 5, 5, 5}, + }, + } + + MatrixLine50Form5X5TypeC = []*structs.MatrixLine50Form5X5TypeC{ + { + Type: "Line50Form5X5TypeC", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 4, 5, 5}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {5, 5, 4, 3, 3}, + {1, 1, 2, 3, 4}, + {2, 2, 3, 4, 5}, + {5, 5, 4, 3, 2}, + {4, 4, 3, 2, 1}, + {1, 2, 3, 4, 4}, + {2, 3, 4, 5, 5}, + {5, 4, 3, 2, 2}, + {4, 3, 2, 1, 1}, + {1, 2, 3, 4, 3}, + }, + Form: []int64{5, 5, 5, 5, 5}, + }, + } + + MatrixLine50Form6X5TypeA = []*structs.MatrixLine50Form6X5TypeA{ + { + Type: "Line50Form6X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 50, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 4, 5, 5}, + {4, 4, 5, 6, 6}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + }, + Form: []int64{6, 6, 6, 6, 6}, + }, + } + + MatrixLine5Form3X3TypeA = []*structs.MatrixLine5Form3X3TypeA{ + { + Type: "Line5Form3X3TypeA", + LinkType: 0, + Direction: 0, + LineCount: 5, + Lines: [][]int64{ + {1, 1, 1}, + {2, 2, 2}, + {3, 3, 3}, + {1, 2, 3}, + {3, 2, 1}, + }, + Form: []int64{3, 3, 3}, + }, + } + + MatrixLine5Form3X3TypeB = []*structs.MatrixLine5Form3X3TypeB{ + { + Type: "Line5Form3X3TypeB", + LinkType: 0, + Direction: 0, + LineCount: 5, + Lines: [][]int64{ + {2, 2, 2}, + {1, 1, 1}, + {3, 3, 3}, + {1, 2, 3}, + {3, 2, 1}, + }, + Form: []int64{3, 3, 3}, + }, + } + + MatrixLine60Form33633TypeA = []*structs.MatrixLine60Form33633TypeA{ + { + Type: "Line60Form33633TypeA", + LinkType: 0, + Direction: 0, + LineCount: 60, + Lines: [][]int64{ + {2, 2, 3, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 5, 3, 3}, + {1, 2, 5, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 5, 3, 2}, + {1, 1, 3, 3, 3}, + {3, 3, 3, 1, 1}, + {2, 3, 3, 1, 2}, + {2, 1, 3, 3, 2}, + {1, 2, 3, 2, 1}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 5, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 5, 2, 2}, + {1, 1, 5, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 5, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 5, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 5, 1, 3}, + {3, 1, 3, 3, 1}, + {1, 3, 3, 1, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 3, 1, 3}, + {3, 2, 1, 1, 2}, + {2, 2, 4, 2, 2}, + {1, 1, 2, 1, 1}, + {3, 3, 6, 3, 3}, + {1, 2, 6, 2, 1}, + {3, 2, 2, 2, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 6, 3, 2}, + {1, 1, 4, 3, 3}, + {3, 3, 4, 1, 1}, + {2, 3, 4, 1, 2}, + {2, 1, 4, 3, 2}, + {1, 2, 4, 2, 1}, + {3, 2, 4, 2, 3}, + {1, 2, 2, 2, 1}, + {3, 2, 6, 2, 3}, + {2, 2, 2, 2, 2}, + {2, 2, 6, 2, 2}, + {1, 1, 6, 1, 1}, + {3, 3, 2, 3, 3}, + {1, 3, 6, 3, 1}, + {3, 1, 2, 1, 3}, + {2, 3, 2, 3, 2}, + {2, 1, 6, 1, 2}, + {1, 3, 2, 3, 1}, + {3, 1, 6, 1, 3}, + {3, 1, 4, 3, 1}, + {1, 3, 4, 1, 3}, + {1, 3, 4, 3, 1}, + {3, 1, 4, 1, 3}, + {3, 2, 2, 1, 2}, + }, + Form: []int64{3, 3, 6, 3, 3}, + }, + } + + MatrixLine60Form8X5TypeA = []*structs.MatrixLine60Form8X5TypeA{ + { + Type: "Line60Form8X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 60, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {8, 8, 8, 8, 8}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {7, 8, 7, 8, 7}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {8, 7, 8, 7, 8}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {6, 7, 8, 7, 6}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {8, 7, 6, 7, 8}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {7, 8, 8, 8, 7}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {8, 7, 7, 7, 8}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {7, 7, 8, 7, 7}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {8, 8, 7, 8, 8}, + }, + Form: []int64{8, 8, 8, 8, 8}, + }, + } + + MatrixLine65Form6X5TypeA = []*structs.MatrixLine65Form6X5TypeA{ + { + Type: "Line65Form6X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 65, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 4, 5, 5}, + {4, 4, 5, 6, 6}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {5, 5, 4, 3, 3}, + {6, 6, 5, 4, 4}, + {1, 1, 2, 3, 4}, + {2, 2, 3, 4, 5}, + {3, 3, 4, 5, 6}, + {6, 6, 5, 4, 3}, + {5, 5, 4, 3, 2}, + {4, 4, 3, 2, 1}, + {1, 2, 3, 4, 4}, + {2, 3, 4, 5, 5}, + {3, 4, 5, 6, 6}, + {6, 5, 4, 3, 3}, + {5, 4, 3, 2, 2}, + {4, 3, 2, 1, 1}, + {1, 2, 3, 4, 3}, + }, + Form: []int64{6, 6, 6, 6, 6}, + }, + } + + MatrixLine70Form9X5TypeA = []*structs.MatrixLine70Form9X5TypeA{ + { + Type: "Line70Form9X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 70, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {8, 8, 8, 8, 8}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {7, 8, 7, 8, 7}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {8, 7, 8, 7, 8}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {6, 7, 8, 7, 6}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {8, 7, 6, 7, 8}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {7, 8, 8, 8, 7}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {8, 7, 7, 7, 8}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {7, 7, 8, 7, 7}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {8, 8, 7, 8, 8}, + {9, 9, 9, 9, 9}, + {8, 9, 8, 9, 8}, + {9, 8, 9, 8, 9}, + {7, 8, 9, 8, 7}, + {9, 8, 7, 8, 9}, + {8, 9, 9, 9, 8}, + {9, 8, 8, 8, 9}, + {8, 8, 9, 8, 8}, + {9, 9, 8, 9, 9}, + {7, 7, 8, 9, 9}, + }, + Form: []int64{9, 9, 9, 9, 9}, + }, + } + + MatrixLine75Form5X6TypeA = []*structs.MatrixLine75Form5X6TypeA{ + { + Type: "Line75Form5X6TypeA", + LinkType: 0, + Direction: 0, + LineCount: 75, + Lines: [][]int64{ + {1, 1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5, 5}, + {1, 2, 3, 4, 5, 4}, + {5, 4, 3, 2, 1, 2}, + {1, 2, 3, 4, 5, 5}, + {5, 4, 3, 2, 1, 1}, + {1, 2, 3, 3, 2, 1}, + {2, 3, 4, 4, 3, 2}, + {3, 4, 5, 5, 4, 3}, + {3, 2, 1, 1, 2, 3}, + {4, 3, 2, 2, 3, 4}, + {5, 4, 3, 3, 4, 5}, + {1, 2, 3, 4, 4, 3}, + {2, 3, 4, 5, 5, 4}, + {5, 4, 3, 2, 2, 3}, + {4, 3, 2, 1, 1, 2}, + {1, 2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2, 3}, + {3, 4, 3, 4, 3, 4}, + {4, 5, 4, 5, 4, 5}, + {2, 1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3, 2}, + {4, 3, 4, 3, 4, 3}, + {5, 4, 5, 4, 5, 4}, + {1, 2, 3, 4, 3, 2}, + {2, 3, 4, 5, 4, 3}, + {5, 4, 3, 2, 3, 4}, + {4, 3, 2, 1, 2, 3}, + {2, 3, 4, 3, 2, 1}, + {3, 4, 5, 4, 3, 2}, + {4, 3, 2, 3, 4, 5}, + {3, 2, 1, 2, 3, 4}, + {1, 2, 3, 4, 4, 4}, + {2, 3, 4, 5, 5, 5}, + {5, 4, 3, 2, 2, 2}, + {4, 3, 2, 1, 1, 1}, + {1, 1, 2, 3, 4, 4}, + {2, 2, 3, 4, 5, 5}, + {5, 5, 4, 3, 2, 2}, + {4, 4, 3, 2, 1, 1}, + {1, 1, 1, 2, 3, 4}, + {2, 2, 2, 3, 4, 5}, + {5, 5, 5, 4, 3, 2}, + {4, 4, 4, 3, 2, 1}, + {1, 2, 3, 2, 3, 2}, + {2, 3, 4, 3, 4, 3}, + {3, 4, 5, 4, 5, 4}, + {5, 4, 3, 4, 3, 4}, + {4, 3, 2, 3, 2, 3}, + {3, 2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2, 1}, + {3, 4, 3, 4, 3, 2}, + {4, 5, 4, 5, 4, 3}, + {4, 3, 4, 3, 4, 5}, + {3, 2, 3, 2, 3, 4}, + {2, 1, 2, 1, 2, 3}, + {2, 1, 1, 1, 1, 2}, + {3, 2, 2, 2, 2, 3}, + {4, 3, 3, 3, 3, 4}, + {5, 4, 4, 4, 4, 5}, + {1, 2, 2, 2, 2, 1}, + {2, 3, 3, 3, 3, 2}, + {3, 4, 4, 4, 4, 3}, + {4, 5, 5, 5, 5, 4}, + {1, 1, 2, 2, 1, 1}, + {2, 2, 3, 3, 2, 2}, + {3, 3, 4, 4, 3, 3}, + {4, 4, 5, 5, 4, 4}, + {5, 5, 4, 4, 5, 5}, + {4, 4, 3, 3, 4, 4}, + {3, 3, 2, 2, 1, 1}, + {2, 2, 1, 1, 2, 2}, + }, + Form: []int64{5, 5, 5, 5, 5, 5}, + }, + } + + MatrixLine75Form6X5TypeA = []*structs.MatrixLine75Form6X5TypeA{ + { + Type: "Line75Form6X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 75, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {1, 1, 1, 1, 1}, + {3, 2, 1, 2, 3}, + {1, 2, 3, 2, 1}, + {3, 3, 2, 3, 3}, + {1, 1, 2, 1, 1}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {3, 2, 2, 2, 3}, + {1, 2, 2, 2, 1}, + {3, 2, 3, 2, 3}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {2, 1, 2, 1, 2}, + {2, 2, 3, 2, 2}, + {2, 2, 1, 2, 2}, + {3, 1, 3, 1, 3}, + {1, 3, 1, 3, 1}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {3, 3, 1, 3, 3}, + {1, 1, 3, 1, 1}, + {3, 1, 1, 1, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 3, 3, 2, 3}, + {1, 1, 1, 2, 1}, + {2, 2, 2, 1, 2}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {4, 4, 4, 4, 4}, + {6, 5, 4, 5, 6}, + {4, 5, 6, 5, 4}, + {6, 6, 5, 6, 6}, + {4, 4, 5, 4, 4}, + {5, 4, 4, 4, 5}, + {5, 6, 6, 6, 5}, + {6, 5, 5, 5, 6}, + {4, 5, 5, 5, 4}, + {6, 5, 6, 5, 6}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {5, 4, 5, 4, 5}, + {5, 5, 6, 5, 5}, + {5, 5, 4, 5, 5}, + {6, 4, 6, 4, 6}, + {4, 6, 4, 6, 4}, + {5, 6, 4, 6, 5}, + {5, 4, 6, 4, 5}, + {6, 6, 4, 6, 6}, + {4, 4, 6, 4, 4}, + {6, 4, 4, 4, 6}, + {4, 6, 6, 6, 4}, + {6, 4, 5, 4, 6}, + {4, 6, 5, 6, 4}, + {6, 6, 6, 5, 6}, + {4, 4, 4, 5, 4}, + {5, 5, 5, 4, 5}, + {4, 4, 3, 4, 4}, + {3, 3, 4, 3, 3}, + {4, 3, 3, 3, 4}, + {3, 4, 4, 4, 3}, + {4, 3, 4, 3, 4}, + {3, 4, 3, 4, 3}, + {4, 2, 3, 2, 4}, + {2, 4, 3, 4, 2}, + {4, 4, 4, 3, 4}, + {3, 3, 3, 4, 3}, + {3, 2, 4, 2, 3}, + {3, 4, 2, 4, 3}, + {4, 3, 2, 3, 4}, + {2, 3, 4, 3, 2}, + {2, 2, 4, 2, 2}, + }, + Form: []int64{6, 6, 6, 6, 6}, + }, + } + + MatrixLine80Form10X5TypeA = []*structs.MatrixLine80Form10X5TypeA{ + { + Type: "Line80Form10X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 80, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {8, 8, 8, 8, 8}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {7, 8, 7, 8, 7}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {8, 7, 8, 7, 8}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {6, 7, 8, 7, 6}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {8, 7, 6, 7, 8}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {7, 8, 8, 8, 7}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {8, 7, 7, 7, 8}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {7, 7, 8, 7, 7}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {8, 8, 7, 8, 8}, + {9, 9, 9, 9, 9}, + {8, 9, 8, 9, 8}, + {9, 8, 9, 8, 9}, + {7, 8, 9, 8, 7}, + {9, 8, 7, 8, 9}, + {8, 9, 9, 9, 8}, + {9, 8, 8, 8, 9}, + {8, 8, 9, 8, 8}, + {9, 9, 8, 9, 9}, + {7, 7, 8, 9, 9}, + {10, 10, 10, 10, 10}, + {9, 10, 9, 10, 9}, + {10, 9, 10, 9, 10}, + {8, 9, 10, 9, 8}, + {10, 9, 8, 9, 10}, + {9, 10, 10, 10, 9}, + {10, 9, 9, 9, 10}, + {9, 9, 10, 9, 9}, + {10, 10, 9, 10, 10}, + {8, 8, 9, 10, 10}, + }, + Form: []int64{10, 10, 10, 10, 10}, + }, + } + + MatrixLine80Form3X5TypeA = []*structs.MatrixLine80Form3X5TypeA{ + { + Type: "Line80Form3X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 80, + Lines: [][]int64{ + {2, 2, 2, 2, 2}, + {1, 1, 1, 1, 1}, + {3, 3, 3, 3, 3}, + {1, 2, 3, 2, 1}, + {3, 2, 1, 2, 3}, + {2, 1, 1, 1, 2}, + {2, 3, 3, 3, 2}, + {1, 1, 2, 3, 3}, + {3, 3, 2, 1, 1}, + {2, 3, 2, 1, 2}, + {2, 1, 2, 3, 2}, + {1, 2, 2, 2, 1}, + {3, 2, 2, 2, 3}, + {1, 2, 1, 2, 1}, + {3, 2, 3, 2, 3}, + {2, 2, 1, 2, 2}, + {2, 2, 3, 2, 2}, + {1, 1, 3, 1, 1}, + {3, 3, 1, 3, 3}, + {1, 3, 3, 3, 1}, + {3, 1, 1, 1, 3}, + {2, 3, 1, 3, 2}, + {2, 1, 3, 1, 2}, + {1, 3, 1, 3, 1}, + {3, 1, 3, 1, 3}, + {3, 1, 2, 3, 1}, + {1, 3, 2, 1, 3}, + {1, 3, 2, 3, 1}, + {3, 1, 2, 1, 3}, + {3, 2, 1, 1, 2}, + {1, 2, 3, 3, 2}, + {1, 1, 3, 3, 3}, + {3, 3, 1, 1, 1}, + {2, 1, 3, 2, 3}, + {2, 3, 1, 2, 1}, + {1, 2, 1, 2, 3}, + {3, 2, 3, 2, 1}, + {2, 3, 3, 1, 1}, + {1, 1, 2, 2, 3}, + {3, 3, 2, 2, 1}, + {3, 1, 1, 1, 1}, + {1, 3, 3, 3, 3}, + {3, 3, 3, 3, 1}, + {1, 1, 1, 1, 3}, + {2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2}, + {1, 2, 3, 3, 3}, + {3, 2, 1, 1, 1}, + {1, 2, 2, 2, 2}, + {3, 2, 2, 2, 2}, + {1, 1, 1, 1, 2}, + {1, 1, 1, 2, 2}, + {1, 1, 1, 2, 3}, + {1, 1, 2, 1, 1}, + {1, 1, 2, 2, 1}, + {1, 1, 2, 2, 2}, + {1, 1, 2, 3, 2}, + {1, 2, 1, 1, 1}, + {1, 2, 1, 2, 2}, + {3, 1, 2, 1, 2}, + {1, 3, 2, 3, 2}, + {1, 2, 1, 3, 1}, + {3, 2, 3, 1, 3}, + {1, 2, 2, 2, 3}, + {3, 2, 2, 2, 1}, + {1, 2, 2, 3, 3}, + {2, 1, 1, 1, 1}, + {2, 1, 1, 2, 2}, + {2, 1, 1, 2, 3}, + {1, 2, 2, 1, 2}, + {2, 1, 2, 2, 3}, + {2, 1, 2, 3, 3}, + {2, 2, 1, 1, 1}, + {2, 2, 1, 1, 2}, + {2, 2, 1, 2, 3}, + {1, 1, 3, 2, 1}, + {2, 2, 2, 1, 1}, + {2, 2, 3, 3, 3}, + {3, 3, 3, 3, 2}, + {2, 2, 2, 2, 3}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixLine80Form4X6TypeA = []*structs.MatrixLine80Form4X6TypeA{ + { + Type: "Line80Form4X6TypeA", + LinkType: 0, + Direction: 0, + LineCount: 80, + Lines: [][]int64{ + {1, 1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4, 4}, + {1, 2, 3, 3, 2, 1}, + {4, 3, 2, 2, 3, 4}, + {2, 3, 4, 4, 3, 2}, + {3, 2, 1, 1, 2, 3}, + {1, 2, 1, 1, 2, 1}, + {4, 3, 4, 4, 3, 4}, + {2, 1, 2, 2, 1, 2}, + {3, 4, 3, 3, 4, 3}, + {2, 3, 2, 2, 3, 2}, + {3, 2, 3, 3, 2, 3}, + {1, 1, 2, 2, 1, 1}, + {4, 4, 3, 3, 4, 4}, + {2, 2, 3, 3, 2, 2}, + {3, 3, 2, 2, 3, 3}, + {3, 3, 4, 4, 3, 3}, + {2, 2, 1, 1, 2, 2}, + {2, 3, 3, 3, 3, 2}, + {3, 2, 2, 2, 2, 3}, + {2, 1, 1, 1, 1, 2}, + {3, 4, 4, 4, 4, 3}, + {4, 3, 3, 3, 3, 4}, + {1, 2, 2, 2, 2, 1}, + {3, 1, 1, 1, 1, 3}, + {2, 4, 4, 4, 4, 2}, + {4, 2, 2, 2, 2, 4}, + {1, 3, 3, 3, 3, 1}, + {3, 3, 1, 1, 3, 3}, + {2, 2, 4, 4, 2, 2}, + {1, 1, 3, 3, 1, 1}, + {4, 4, 2, 2, 4, 4}, + {4, 4, 1, 1, 4, 4}, + {1, 1, 4, 4, 1, 1}, + {4, 3, 2, 1, 1, 1}, + {1, 2, 3, 4, 4, 4}, + {1, 1, 1, 2, 3, 4}, + {4, 4, 4, 3, 2, 1}, + {3, 2, 1, 1, 1, 1}, + {2, 3, 4, 4, 4, 4}, + {1, 1, 1, 1, 2, 3}, + {4, 4, 4, 4, 3, 2}, + {4, 3, 2, 2, 2, 2}, + {1, 2, 3, 3, 3, 3}, + {2, 2, 2, 2, 3, 4}, + {3, 3, 3, 3, 2, 1}, + {2, 4, 1, 1, 4, 2}, + {3, 1, 4, 4, 1, 3}, + {1, 4, 1, 1, 4, 1}, + {4, 1, 4, 4, 1, 4}, + {1, 2, 1, 2, 1, 2}, + {3, 4, 3, 4, 3, 4}, + {2, 3, 2, 3, 2, 3}, + {3, 2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3, 4}, + {2, 1, 2, 1, 2, 1}, + {1, 3, 1, 3, 1, 3}, + {4, 2, 4, 2, 4, 2}, + {2, 4, 2, 4, 2, 4}, + {3, 1, 3, 1, 3, 1}, + {1, 4, 1, 4, 1, 4}, + {4, 1, 4, 1, 4, 1}, + {1, 2, 3, 4, 3, 2}, + {4, 3, 2, 1, 2, 3}, + {2, 3, 4, 3, 2, 1}, + {3, 2, 1, 2, 3, 4}, + {1, 2, 1, 2, 3, 4}, + {4, 3, 4, 3, 2, 1}, + {2, 3, 2, 1, 2, 3}, + {3, 2, 3, 4, 3, 2}, + {1, 4, 4, 4, 4, 1}, + {4, 1, 1, 1, 1, 4}, + {2, 4, 1, 1, 4, 2}, + {3, 1, 4, 4, 1, 3}, + {1, 3, 4, 4, 3, 1}, + {4, 2, 1, 1, 2, 4}, + {2, 4, 1, 4, 1, 3}, + {3, 1, 4, 1, 4, 2}, + }, + Form: []int64{4, 4, 4, 4, 4, 4}, + }, + } + + MatrixLine80Form7X5TypeA = []*structs.MatrixLine80Form7X5TypeA{ + { + Type: "Line80Form7X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 80, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 4, 5, 5}, + {4, 4, 5, 6, 6}, + {5, 5, 6, 7, 7}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {5, 5, 4, 3, 3}, + {6, 6, 5, 4, 4}, + {7, 7, 6, 5, 5}, + {1, 1, 2, 3, 4}, + {2, 2, 3, 4, 5}, + {3, 3, 4, 5, 6}, + {4, 4, 5, 6, 7}, + {7, 7, 6, 5, 4}, + {6, 6, 5, 4, 3}, + {5, 5, 4, 3, 2}, + {4, 4, 3, 2, 1}, + {1, 2, 3, 4, 4}, + {2, 3, 4, 5, 5}, + {3, 4, 5, 6, 6}, + {4, 5, 6, 7, 7}, + {7, 6, 5, 4, 4}, + {6, 5, 4, 3, 3}, + {5, 4, 3, 2, 2}, + {4, 3, 2, 1, 1}, + {1, 2, 3, 4, 3}, + }, + Form: []int64{7, 7, 7, 7, 7}, + }, + } + + MatrixLine90Form11X5TypeA = []*structs.MatrixLine90Form11X5TypeA{ + { + Type: "Line90Form11X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 90, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {8, 8, 8, 8, 8}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {7, 8, 7, 8, 7}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {8, 7, 8, 7, 8}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {6, 7, 8, 7, 6}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {8, 7, 6, 7, 8}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {7, 8, 8, 8, 7}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {8, 7, 7, 7, 8}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {7, 7, 8, 7, 7}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {8, 8, 7, 8, 8}, + {9, 9, 9, 9, 9}, + {8, 9, 8, 9, 8}, + {9, 8, 9, 8, 9}, + {7, 8, 9, 8, 7}, + {9, 8, 7, 8, 9}, + {8, 9, 9, 9, 8}, + {9, 8, 8, 8, 9}, + {8, 8, 9, 8, 8}, + {9, 9, 8, 9, 9}, + {7, 7, 8, 9, 9}, + {10, 10, 10, 10, 10}, + {9, 10, 9, 10, 9}, + {10, 9, 10, 9, 10}, + {8, 9, 10, 9, 8}, + {10, 9, 8, 9, 10}, + {9, 10, 10, 10, 9}, + {10, 9, 9, 9, 10}, + {9, 9, 10, 9, 9}, + {10, 10, 9, 10, 10}, + {8, 8, 9, 10, 10}, + {11, 11, 11, 11, 11}, + {10, 11, 10, 11, 10}, + {11, 10, 11, 10, 11}, + {9, 10, 11, 10, 9}, + {11, 10, 9, 10, 11}, + {10, 11, 11, 11, 10}, + {11, 10, 10, 10, 11}, + {10, 10, 11, 10, 10}, + {11, 11, 10, 11, 11}, + {9, 9, 10, 11, 11}, + }, + Form: []int64{11, 11, 11, 11, 11}, + }, + } + + MatrixLine95Form8X5TypeA = []*structs.MatrixLine95Form8X5TypeA{ + { + Type: "Line95Form8X5TypeA", + LinkType: 0, + Direction: 0, + LineCount: 95, + Lines: [][]int64{ + {1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2}, + {3, 3, 3, 3, 3}, + {4, 4, 4, 4, 4}, + {5, 5, 5, 5, 5}, + {6, 6, 6, 6, 6}, + {7, 7, 7, 7, 7}, + {8, 8, 8, 8, 8}, + {1, 2, 2, 2, 1}, + {2, 3, 3, 3, 2}, + {3, 4, 4, 4, 3}, + {4, 5, 5, 5, 4}, + {5, 6, 6, 6, 5}, + {6, 7, 7, 7, 6}, + {7, 8, 8, 8, 7}, + {2, 1, 1, 1, 2}, + {3, 2, 2, 2, 3}, + {4, 3, 3, 3, 4}, + {5, 4, 4, 4, 5}, + {6, 5, 5, 5, 6}, + {7, 6, 6, 6, 7}, + {8, 7, 7, 7, 8}, + {1, 1, 2, 1, 1}, + {2, 2, 3, 2, 2}, + {3, 3, 4, 3, 3}, + {4, 4, 5, 4, 4}, + {5, 5, 6, 5, 5}, + {6, 6, 7, 6, 6}, + {7, 7, 8, 7, 7}, + {2, 2, 1, 2, 2}, + {3, 3, 2, 3, 3}, + {4, 4, 3, 4, 4}, + {5, 5, 4, 5, 5}, + {6, 6, 5, 6, 6}, + {7, 7, 6, 7, 7}, + {8, 8, 7, 8, 8}, + {1, 2, 1, 2, 1}, + {2, 3, 2, 3, 2}, + {3, 4, 3, 4, 3}, + {4, 5, 4, 5, 4}, + {5, 6, 5, 6, 5}, + {6, 7, 6, 7, 6}, + {7, 8, 7, 8, 7}, + {2, 1, 2, 1, 2}, + {3, 2, 3, 2, 3}, + {4, 3, 4, 3, 4}, + {5, 4, 5, 4, 5}, + {6, 5, 6, 5, 6}, + {7, 6, 7, 6, 7}, + {8, 7, 8, 7, 8}, + {1, 2, 3, 2, 1}, + {2, 3, 4, 3, 2}, + {3, 4, 5, 4, 3}, + {4, 5, 6, 5, 4}, + {5, 6, 7, 6, 5}, + {6, 7, 8, 7, 6}, + {3, 2, 1, 2, 3}, + {4, 3, 2, 3, 4}, + {5, 4, 3, 4, 5}, + {6, 5, 4, 5, 6}, + {7, 6, 5, 6, 7}, + {8, 7, 6, 7, 8}, + {1, 1, 2, 3, 3}, + {2, 2, 3, 4, 4}, + {3, 3, 4, 5, 5}, + {4, 4, 5, 6, 6}, + {5, 5, 6, 7, 7}, + {6, 6, 7, 8, 8}, + {3, 3, 2, 1, 1}, + {4, 4, 3, 2, 2}, + {5, 5, 4, 3, 3}, + {6, 6, 5, 4, 4}, + {7, 7, 6, 5, 5}, + {8, 8, 7, 6, 6}, + {1, 1, 2, 3, 4}, + {2, 2, 3, 4, 5}, + {3, 3, 4, 5, 6}, + {4, 4, 5, 6, 7}, + {5, 5, 6, 7, 8}, + {8, 8, 7, 6, 5}, + {7, 7, 6, 5, 4}, + {6, 6, 5, 4, 3}, + {5, 5, 4, 3, 2}, + {4, 4, 3, 2, 1}, + {1, 2, 3, 4, 4}, + {2, 3, 4, 5, 5}, + {3, 4, 5, 6, 6}, + {4, 5, 6, 7, 7}, + {5, 6, 7, 8, 8}, + {8, 7, 6, 5, 5}, + {7, 6, 5, 4, 4}, + {6, 5, 4, 3, 3}, + {5, 4, 3, 2, 2}, + {4, 3, 2, 1, 1}, + {1, 2, 3, 4, 3}, + }, + Form: []int64{8, 8, 8, 8, 8}, + }, + } + + MatrixMatchForm7X7TypeA = []*structs.MatrixMatchForm7X7TypeA{ + { + Type: "MatchForm7X7", + LinkType: 4, + Direction: 0, + LineCount: 20, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{7, 7, 7, 7, 7, 7, 7}, + }, + } + + MatrixSameForm5X6TypeA = []*structs.MatrixSameForm5X6TypeA{ + { + Type: "SameForm5X6", + LinkType: 3, + Direction: 0, + LineCount: 20, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{5, 5, 5, 5, 5, 5}, + }, + } + + MatrixSameForm5X6TypeB = []*structs.MatrixSameForm5X6TypeB{ + { + Type: "SameForm5X6TypeB", + LinkType: 3, + Direction: 0, + LineCount: 25, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{5, 5, 5, 5, 5, 5}, + }, + } + + MatrixWaysForm333331 = []*structs.MatrixWaysForm333331{ + { + Type: "WaysForm333331", + LinkType: 1, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{3, 3, 3, 3, 3, 1}, + }, + } + + MatrixWaysForm33555 = []*structs.MatrixWaysForm33555{ + { + Type: "WaysForm33555", + LinkType: 1, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{3, 3, 5, 5, 5}, + }, + } + + MatrixWaysForm344444 = []*structs.MatrixWaysForm344444{ + { + Type: "WaysForm344444", + LinkType: 1, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{3, 4, 4, 4, 4, 4}, + }, + } + + MatrixWaysForm3X5TypeA = []*structs.MatrixWaysForm3X5TypeA{ + { + Type: "WaysForm3X5TypeA", + LinkType: 1, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{3, 3, 3, 3, 3}, + }, + } + + MatrixWaysForm44668 = []*structs.MatrixWaysForm44668{ + { + Type: "WaysForm44668", + LinkType: 1, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{4, 4, 6, 6, 8}, + }, + } + + MatrixWaysForm4X5TypeA = []*structs.MatrixWaysForm4X5TypeA{ + { + Type: "WaysForm4X5TypeA", + LinkType: 1, + Direction: 0, + LineCount: 100, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + + MatrixWaysForm4X5TypeB = []*structs.MatrixWaysForm4X5TypeB{ + { + Type: "WaysForm4X5TypeB", + LinkType: 1, + Direction: 0, + LineCount: 60, + Lines: [][]int64{ + {0, 0, 0}, + }, + Form: []int64{4, 4, 4, 4, 4}, + }, + } + +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/opt_group.go b/gamesrv/slotspkg/internal/exported/excel2go/base/opt_group.go new file mode 100644 index 0000000..2fedcfe --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/opt_group.go @@ -0,0 +1,22 @@ +//go:build !debug +// +build !debug + +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +func init() { + OptGroup = []*structs.OptGroup{ + { + ID: 1, + Batch: 1, + IsNewPlayer: true, + StartTime: "2023-4-26", + EndTime: "2050-11-27", + Affect: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + Weight: []int64{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + }, + } + +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/prize_model.go b/gamesrv/slotspkg/internal/exported/excel2go/base/prize_model.go new file mode 100644 index 0000000..b13f286 --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/prize_model.go @@ -0,0 +1,58 @@ +//go:build !debug +// +build !debug + +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +func init() { + PrizeModelPrizeModelTypeA = map[int64]*structs.PrizeModelPrizeModelTypeA{ + 1: { + ID: 1, + AniType: "big_win", + MinMultiple: 10, + MaxMultiple: 25, + }, + 2: { + ID: 2, + AniType: "mega_win", + MinMultiple: 25, + MaxMultiple: 50, + }, + 3: { + ID: 3, + AniType: "epic_win", + MinMultiple: 50, + MaxMultiple: -1, + }, + } + + PrizeModelPrizeModelTypeB = map[int64]*structs.PrizeModelPrizeModelTypeB{ + 1: { + ID: 1, + AniType: "big_win", + MinMultiple: 15, + MaxMultiple: 30, + }, + 2: { + ID: 2, + AniType: "mega_win", + MinMultiple: 30, + MaxMultiple: 45, + }, + 3: { + ID: 3, + AniType: "epic_win", + MinMultiple: 45, + MaxMultiple: 60, + }, + 4: { + ID: 4, + AniType: "epic_win", + MinMultiple: 60, + MaxMultiple: -1, + }, + } + +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/simulator.go b/gamesrv/slotspkg/internal/exported/excel2go/base/simulator.go new file mode 100644 index 0000000..49d75bc --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/simulator.go @@ -0,0 +1,171 @@ +//go:build !debug +// +build !debug + +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +func init() { + SimulatorFSMultiLevel = []*structs.SimulatorFSMultiLevel{ + { + Level: 1, + Min: 0, + Max: 3, + }, + { + Level: 2, + Min: 3, + Max: 6, + }, + { + Level: 3, + Min: 6, + Max: 9, + }, + { + Level: 4, + Min: 9, + Max: 12, + }, + { + Level: 5, + Min: 12, + Max: 18, + }, + { + Level: 6, + Min: 18, + Max: 20, + }, + { + Level: 7, + Min: 20, + Max: 30, + }, + { + Level: 8, + Min: 30, + Max: 50, + }, + { + Level: 9, + Min: 50, + Max: 100, + }, + { + Level: 10, + Min: 100, + Max: 500, + }, + { + Level: 11, + Min: 500, + Max: 1000, + }, + { + Level: 12, + Min: 1000, + Max: -1, + }, + } + + SimulatorMultiLevel = []*structs.SimulatorMultiLevel{ + { + Level: 1, + Min: 0, + Max: 1, + }, + { + Level: 2, + Min: 1, + Max: 2, + }, + { + Level: 3, + Min: 2, + Max: 3, + }, + { + Level: 4, + Min: 3, + Max: 4, + }, + { + Level: 5, + Min: 4, + Max: 5, + }, + { + Level: 6, + Min: 5, + Max: 6, + }, + { + Level: 7, + Min: 6, + Max: 8, + }, + { + Level: 8, + Min: 8, + Max: 10, + }, + { + Level: 9, + Min: 10, + Max: 12, + }, + { + Level: 10, + Min: 12, + Max: 15, + }, + { + Level: 11, + Min: 15, + Max: 18, + }, + { + Level: 12, + Min: 18, + Max: 20, + }, + { + Level: 13, + Min: 20, + Max: 25, + }, + { + Level: 14, + Min: 25, + Max: 30, + }, + { + Level: 15, + Min: 30, + Max: 50, + }, + { + Level: 16, + Min: 50, + Max: 100, + }, + { + Level: 17, + Min: 100, + Max: 500, + }, + { + Level: 18, + Min: 500, + Max: 1000, + }, + { + Level: 19, + Min: 1000, + Max: -1, + }, + } + +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/test.go b/gamesrv/slotspkg/internal/exported/excel2go/base/test.go new file mode 100644 index 0000000..620b087 --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/test.go @@ -0,0 +1,5262 @@ +//go:build !debug +// +build !debug + +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +func init() { + TestBetBetChangeList = map[int64]*structs.TestBetBetChangeList{ + 0: { + Index: 0, + BetChangeList: 0.3, + BetSizeIndex: 0, + BetLevelIndex: 0, + }, + 1: { + Index: 1, + BetChangeList: 0.6, + BetSizeIndex: 0, + BetLevelIndex: 1, + }, + 2: { + Index: 2, + BetChangeList: 0.9, + BetSizeIndex: 0, + BetLevelIndex: 2, + }, + 3: { + Index: 3, + BetChangeList: 1, + BetSizeIndex: 1, + BetLevelIndex: 0, + }, + 4: { + Index: 4, + BetChangeList: 1.5, + BetSizeIndex: 0, + BetLevelIndex: 4, + }, + 5: { + Index: 5, + BetChangeList: 3, + BetSizeIndex: 0, + BetLevelIndex: 9, + }, + 6: { + Index: 6, + BetChangeList: 5, + BetSizeIndex: 1, + BetLevelIndex: 4, + }, + 7: { + Index: 7, + BetChangeList: 9, + BetSizeIndex: 3, + BetLevelIndex: 0, + }, + 8: { + Index: 8, + BetChangeList: 10, + BetSizeIndex: 1, + BetLevelIndex: 9, + }, + 9: { + Index: 9, + BetChangeList: 15, + BetSizeIndex: 2, + BetLevelIndex: 4, + }, + 10: { + Index: 10, + BetChangeList: 30, + BetSizeIndex: 2, + BetLevelIndex: 9, + }, + 11: { + Index: 11, + BetChangeList: 45, + BetSizeIndex: 3, + BetLevelIndex: 4, + }, + 12: { + Index: 12, + BetChangeList: 90, + BetSizeIndex: 3, + BetLevelIndex: 9, + }, + } + + TestBetBetLevel = map[int64]*structs.TestBetBetLevel{ + 0: { + Index: 0, + BetLevel: 1, + }, + 1: { + Index: 1, + BetLevel: 2, + }, + 2: { + Index: 2, + BetLevel: 3, + }, + 3: { + Index: 3, + BetLevel: 4, + }, + 4: { + Index: 4, + BetLevel: 5, + }, + 5: { + Index: 5, + BetLevel: 6, + }, + 6: { + Index: 6, + BetLevel: 7, + }, + 7: { + Index: 7, + BetLevel: 8, + }, + 8: { + Index: 8, + BetLevel: 9, + }, + 9: { + Index: 9, + BetLevel: 10, + }, + } + + TestBetBetLine = map[int64]*structs.TestBetBetLine{ + 0: { + Index: 0, + BetLine: 10, + }, + } + + TestBetBetSize = map[int64]*structs.TestBetBetSize{ + 0: { + Index: 0, + BetSize: 300, + }, + 1: { + Index: 1, + BetSize: 1000, + }, + 2: { + Index: 2, + BetSize: 3000, + }, + 3: { + Index: 3, + BetSize: 9000, + }, + } + + TestBetFirstBet = map[int64]*structs.TestBetFirstBet{ + 1: { + Index: 1, + BetSizeIndex: 1, + BetLevelIndex: 0, + }, + } + + TestFormation = []*structs.TestFormation{ + { + SpinType: 1, + NodeType: "BaseSpin", + ID: 1, + SeqID: 1, + Reel: "BaseSpin", + Matrix: "Line1Form3X3TypeA", + Symbol: "Default", + FirstInitMethod: 2, + OtherInitMethod: 4, + FirstInitSymbols: []int64{}, + OtherInitSymbols: []int64{}, + }, + } + + TestMapRTPMode = map[int64]*structs.TestMapRTPMode{ + 1: { + ID: 1, + TypeWeight: map[int64]*structs.TestMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "96", + Rtp: 0.96, + }, + 2: { + ID: 2, + TypeWeight: map[int64]*structs.TestMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "80", + Rtp: 0.8, + }, + 3: { + ID: 3, + TypeWeight: map[int64]*structs.TestMapRTPModeTypeWeight{ + 1: { + ID: 1, + Weight: 1, + }, + }, + Desc: "120", + Rtp: 1.2, + }, + } + + TestRandomWeight = []*structs.TestRandomWeight{ + { + ID: 1, + Time: 0, + Weight: 0.043017, + }, + { + ID: 2, + Time: 0.1, + Weight: 0.00795, + }, + { + ID: 3, + Time: 0.2, + Weight: 0.007884, + }, + { + ID: 4, + Time: 0.3, + Weight: 0.007819, + }, + { + ID: 5, + Time: 0.4, + Weight: 0.007754, + }, + { + ID: 6, + Time: 0.5, + Weight: 0.007689, + }, + { + ID: 7, + Time: 0.6, + Weight: 0.007625, + }, + { + ID: 8, + Time: 0.7, + Weight: 0.007562, + }, + { + ID: 9, + Time: 0.8, + Weight: 0.007499, + }, + { + ID: 10, + Time: 0.9, + Weight: 0.007437, + }, + { + ID: 11, + Time: 1, + Weight: 0.007375, + }, + { + ID: 12, + Time: 1.1, + Weight: 0.007314, + }, + { + ID: 13, + Time: 1.2, + Weight: 0.007253, + }, + { + ID: 14, + Time: 1.3, + Weight: 0.007193, + }, + { + ID: 15, + Time: 1.4, + Weight: 0.007133, + }, + { + ID: 16, + Time: 1.5, + Weight: 0.007074, + }, + { + ID: 17, + Time: 1.6, + Weight: 0.007015, + }, + { + ID: 18, + Time: 1.7, + Weight: 0.006957, + }, + { + ID: 19, + Time: 1.8, + Weight: 0.006899, + }, + { + ID: 20, + Time: 1.9, + Weight: 0.006842, + }, + { + ID: 21, + Time: 2, + Weight: 0.006785, + }, + { + ID: 22, + Time: 2.1, + Weight: 0.006728, + }, + { + ID: 23, + Time: 2.2, + Weight: 0.006673, + }, + { + ID: 24, + Time: 2.3, + Weight: 0.006617, + }, + { + ID: 25, + Time: 2.4, + Weight: 0.006562, + }, + { + ID: 26, + Time: 2.5, + Weight: 0.006508, + }, + { + ID: 27, + Time: 2.6, + Weight: 0.006454, + }, + { + ID: 28, + Time: 2.7, + Weight: 0.0064, + }, + { + ID: 29, + Time: 2.8, + Weight: 0.006347, + }, + { + ID: 30, + Time: 2.9, + Weight: 0.006294, + }, + { + ID: 31, + Time: 3, + Weight: 0.006242, + }, + { + ID: 32, + Time: 3.1, + Weight: 0.00619, + }, + { + ID: 33, + Time: 3.2, + Weight: 0.006138, + }, + { + ID: 34, + Time: 3.3, + Weight: 0.006087, + }, + { + ID: 35, + Time: 3.4, + Weight: 0.006037, + }, + { + ID: 36, + Time: 3.5, + Weight: 0.005987, + }, + { + ID: 37, + Time: 3.6, + Weight: 0.005937, + }, + { + ID: 38, + Time: 3.7, + Weight: 0.005888, + }, + { + ID: 39, + Time: 3.8, + Weight: 0.005839, + }, + { + ID: 40, + Time: 3.9, + Weight: 0.00579, + }, + { + ID: 41, + Time: 4, + Weight: 0.005742, + }, + { + ID: 42, + Time: 4.1, + Weight: 0.005694, + }, + { + ID: 43, + Time: 4.2, + Weight: 0.005647, + }, + { + ID: 44, + Time: 4.3, + Weight: 0.0056, + }, + { + ID: 45, + Time: 4.4, + Weight: 0.005554, + }, + { + ID: 46, + Time: 4.5, + Weight: 0.005508, + }, + { + ID: 47, + Time: 4.6, + Weight: 0.005462, + }, + { + ID: 48, + Time: 4.7, + Weight: 0.005416, + }, + { + ID: 49, + Time: 4.8, + Weight: 0.005371, + }, + { + ID: 50, + Time: 4.9, + Weight: 0.005327, + }, + { + ID: 51, + Time: 5, + Weight: 0.005283, + }, + { + ID: 52, + Time: 5.1, + Weight: 0.005239, + }, + { + ID: 53, + Time: 5.2, + Weight: 0.005195, + }, + { + ID: 54, + Time: 5.3, + Weight: 0.005152, + }, + { + ID: 55, + Time: 5.4, + Weight: 0.005109, + }, + { + ID: 56, + Time: 5.5, + Weight: 0.005067, + }, + { + ID: 57, + Time: 5.6, + Weight: 0.005025, + }, + { + ID: 58, + Time: 5.7, + Weight: 0.004983, + }, + { + ID: 59, + Time: 5.8, + Weight: 0.004942, + }, + { + ID: 60, + Time: 5.9, + Weight: 0.004901, + }, + { + ID: 61, + Time: 6, + Weight: 0.00486, + }, + { + ID: 62, + Time: 6.1, + Weight: 0.004819, + }, + { + ID: 63, + Time: 6.2, + Weight: 0.004779, + }, + { + ID: 64, + Time: 6.3, + Weight: 0.00474, + }, + { + ID: 65, + Time: 6.4, + Weight: 0.0047, + }, + { + ID: 66, + Time: 6.5, + Weight: 0.004661, + }, + { + ID: 67, + Time: 6.6, + Weight: 0.004623, + }, + { + ID: 68, + Time: 6.7, + Weight: 0.004584, + }, + { + ID: 69, + Time: 6.8, + Weight: 0.004546, + }, + { + ID: 70, + Time: 6.9, + Weight: 0.004508, + }, + { + ID: 71, + Time: 7, + Weight: 0.004471, + }, + { + ID: 72, + Time: 7.1, + Weight: 0.004434, + }, + { + ID: 73, + Time: 7.2, + Weight: 0.004397, + }, + { + ID: 74, + Time: 7.3, + Weight: 0.00436, + }, + { + ID: 75, + Time: 7.4, + Weight: 0.004324, + }, + { + ID: 76, + Time: 7.5, + Weight: 0.004288, + }, + { + ID: 77, + Time: 7.6, + Weight: 0.004253, + }, + { + ID: 78, + Time: 7.7, + Weight: 0.004217, + }, + { + ID: 79, + Time: 7.8, + Weight: 0.004182, + }, + { + ID: 80, + Time: 7.9, + Weight: 0.004147, + }, + { + ID: 81, + Time: 8, + Weight: 0.004113, + }, + { + ID: 82, + Time: 8.1, + Weight: 0.004079, + }, + { + ID: 83, + Time: 8.2, + Weight: 0.004045, + }, + { + ID: 84, + Time: 8.3, + Weight: 0.004011, + }, + { + ID: 85, + Time: 8.4, + Weight: 0.003978, + }, + { + ID: 86, + Time: 8.5, + Weight: 0.003945, + }, + { + ID: 87, + Time: 8.6, + Weight: 0.003912, + }, + { + ID: 88, + Time: 8.7, + Weight: 0.00388, + }, + { + ID: 89, + Time: 8.8, + Weight: 0.003847, + }, + { + ID: 90, + Time: 8.9, + Weight: 0.003816, + }, + { + ID: 91, + Time: 9, + Weight: 0.003784, + }, + { + ID: 92, + Time: 9.1, + Weight: 0.003752, + }, + { + ID: 93, + Time: 9.2, + Weight: 0.003721, + }, + { + ID: 94, + Time: 9.3, + Weight: 0.00369, + }, + { + ID: 95, + Time: 9.4, + Weight: 0.00366, + }, + { + ID: 96, + Time: 9.5, + Weight: 0.003629, + }, + { + ID: 97, + Time: 9.6, + Weight: 0.003599, + }, + { + ID: 98, + Time: 9.7, + Weight: 0.003569, + }, + { + ID: 99, + Time: 9.8, + Weight: 0.00354, + }, + { + ID: 100, + Time: 9.9, + Weight: 0.00351, + }, + { + ID: 101, + Time: 10, + Weight: 0.003481, + }, + { + ID: 102, + Time: 10.1, + Weight: 0.003452, + }, + { + ID: 103, + Time: 10.2, + Weight: 0.003423, + }, + { + ID: 104, + Time: 10.3, + Weight: 0.003395, + }, + { + ID: 105, + Time: 10.4, + Weight: 0.003367, + }, + { + ID: 106, + Time: 10.5, + Weight: 0.003339, + }, + { + ID: 107, + Time: 10.6, + Weight: 0.003311, + }, + { + ID: 108, + Time: 10.7, + Weight: 0.003284, + }, + { + ID: 109, + Time: 10.8, + Weight: 0.003256, + }, + { + ID: 110, + Time: 10.9, + Weight: 0.003229, + }, + { + ID: 111, + Time: 11, + Weight: 0.003202, + }, + { + ID: 112, + Time: 11.1, + Weight: 0.003176, + }, + { + ID: 113, + Time: 11.2, + Weight: 0.003149, + }, + { + ID: 114, + Time: 11.3, + Weight: 0.003123, + }, + { + ID: 115, + Time: 11.4, + Weight: 0.003097, + }, + { + ID: 116, + Time: 11.5, + Weight: 0.003072, + }, + { + ID: 117, + Time: 11.6, + Weight: 0.003046, + }, + { + ID: 118, + Time: 11.7, + Weight: 0.003021, + }, + { + ID: 119, + Time: 11.8, + Weight: 0.002996, + }, + { + ID: 120, + Time: 11.9, + Weight: 0.002971, + }, + { + ID: 121, + Time: 12, + Weight: 0.002946, + }, + { + ID: 122, + Time: 12.1, + Weight: 0.002922, + }, + { + ID: 123, + Time: 12.2, + Weight: 0.002897, + }, + { + ID: 124, + Time: 12.3, + Weight: 0.002873, + }, + { + ID: 125, + Time: 12.4, + Weight: 0.002849, + }, + { + ID: 126, + Time: 12.5, + Weight: 0.002826, + }, + { + ID: 127, + Time: 12.6, + Weight: 0.002802, + }, + { + ID: 128, + Time: 12.7, + Weight: 0.002779, + }, + { + ID: 129, + Time: 12.8, + Weight: 0.002756, + }, + { + ID: 130, + Time: 12.9, + Weight: 0.002733, + }, + { + ID: 131, + Time: 13, + Weight: 0.00271, + }, + { + ID: 132, + Time: 13.1, + Weight: 0.002688, + }, + { + ID: 133, + Time: 13.2, + Weight: 0.002665, + }, + { + ID: 134, + Time: 13.3, + Weight: 0.002643, + }, + { + ID: 135, + Time: 13.4, + Weight: 0.002621, + }, + { + ID: 136, + Time: 13.5, + Weight: 0.0026, + }, + { + ID: 137, + Time: 13.6, + Weight: 0.002578, + }, + { + ID: 138, + Time: 13.7, + Weight: 0.002557, + }, + { + ID: 139, + Time: 13.8, + Weight: 0.002535, + }, + { + ID: 140, + Time: 13.9, + Weight: 0.002514, + }, + { + ID: 141, + Time: 14, + Weight: 0.002493, + }, + { + ID: 142, + Time: 14.1, + Weight: 0.002473, + }, + { + ID: 143, + Time: 14.2, + Weight: 0.002452, + }, + { + ID: 144, + Time: 14.3, + Weight: 0.002432, + }, + { + ID: 145, + Time: 14.4, + Weight: 0.002412, + }, + { + ID: 146, + Time: 14.5, + Weight: 0.002391, + }, + { + ID: 147, + Time: 14.6, + Weight: 0.002372, + }, + { + ID: 148, + Time: 14.7, + Weight: 0.002352, + }, + { + ID: 149, + Time: 14.8, + Weight: 0.002332, + }, + { + ID: 150, + Time: 14.9, + Weight: 0.002313, + }, + { + ID: 151, + Time: 15, + Weight: 0.002294, + }, + { + ID: 152, + Time: 15.1, + Weight: 0.002275, + }, + { + ID: 153, + Time: 15.2, + Weight: 0.002256, + }, + { + ID: 154, + Time: 15.3, + Weight: 0.002237, + }, + { + ID: 155, + Time: 15.4, + Weight: 0.002219, + }, + { + ID: 156, + Time: 15.5, + Weight: 0.0022, + }, + { + ID: 157, + Time: 15.6, + Weight: 0.002182, + }, + { + ID: 158, + Time: 15.7, + Weight: 0.002164, + }, + { + ID: 159, + Time: 15.8, + Weight: 0.002146, + }, + { + ID: 160, + Time: 15.9, + Weight: 0.002128, + }, + { + ID: 161, + Time: 16, + Weight: 0.00211, + }, + { + ID: 162, + Time: 16.1, + Weight: 0.002093, + }, + { + ID: 163, + Time: 16.2, + Weight: 0.002075, + }, + { + ID: 164, + Time: 16.3, + Weight: 0.002058, + }, + { + ID: 165, + Time: 16.4, + Weight: 0.002041, + }, + { + ID: 166, + Time: 16.5, + Weight: 0.002024, + }, + { + ID: 167, + Time: 16.6, + Weight: 0.002007, + }, + { + ID: 168, + Time: 16.7, + Weight: 0.001991, + }, + { + ID: 169, + Time: 16.8, + Weight: 0.001974, + }, + { + ID: 170, + Time: 16.9, + Weight: 0.001958, + }, + { + ID: 171, + Time: 17, + Weight: 0.001941, + }, + { + ID: 172, + Time: 17.1, + Weight: 0.001925, + }, + { + ID: 173, + Time: 17.2, + Weight: 0.001909, + }, + { + ID: 174, + Time: 17.3, + Weight: 0.001893, + }, + { + ID: 175, + Time: 17.4, + Weight: 0.001878, + }, + { + ID: 176, + Time: 17.5, + Weight: 0.001862, + }, + { + ID: 177, + Time: 17.6, + Weight: 0.001847, + }, + { + ID: 178, + Time: 17.7, + Weight: 0.001831, + }, + { + ID: 179, + Time: 17.8, + Weight: 0.001816, + }, + { + ID: 180, + Time: 17.9, + Weight: 0.001801, + }, + { + ID: 181, + Time: 18, + Weight: 0.001786, + }, + { + ID: 182, + Time: 18.1, + Weight: 0.001771, + }, + { + ID: 183, + Time: 18.2, + Weight: 0.001756, + }, + { + ID: 184, + Time: 18.3, + Weight: 0.001742, + }, + { + ID: 185, + Time: 18.4, + Weight: 0.001727, + }, + { + ID: 186, + Time: 18.5, + Weight: 0.001713, + }, + { + ID: 187, + Time: 18.6, + Weight: 0.001699, + }, + { + ID: 188, + Time: 18.7, + Weight: 0.001685, + }, + { + ID: 189, + Time: 18.8, + Weight: 0.001671, + }, + { + ID: 190, + Time: 18.9, + Weight: 0.001657, + }, + { + ID: 191, + Time: 19, + Weight: 0.001643, + }, + { + ID: 192, + Time: 19.1, + Weight: 0.001629, + }, + { + ID: 193, + Time: 19.2, + Weight: 0.001616, + }, + { + ID: 194, + Time: 19.3, + Weight: 0.001602, + }, + { + ID: 195, + Time: 19.4, + Weight: 0.001589, + }, + { + ID: 196, + Time: 19.5, + Weight: 0.001576, + }, + { + ID: 197, + Time: 19.6, + Weight: 0.001563, + }, + { + ID: 198, + Time: 19.7, + Weight: 0.00155, + }, + { + ID: 199, + Time: 19.8, + Weight: 0.001537, + }, + { + ID: 200, + Time: 19.9, + Weight: 0.001524, + }, + { + ID: 201, + Time: 20, + Weight: 0.001511, + }, + { + ID: 202, + Time: 20.1, + Weight: 0.001499, + }, + { + ID: 203, + Time: 20.2, + Weight: 0.001486, + }, + { + ID: 204, + Time: 20.3, + Weight: 0.001474, + }, + { + ID: 205, + Time: 20.4, + Weight: 0.001462, + }, + { + ID: 206, + Time: 20.5, + Weight: 0.00145, + }, + { + ID: 207, + Time: 20.6, + Weight: 0.001438, + }, + { + ID: 208, + Time: 20.7, + Weight: 0.001426, + }, + { + ID: 209, + Time: 20.8, + Weight: 0.001414, + }, + { + ID: 210, + Time: 20.9, + Weight: 0.001402, + }, + { + ID: 211, + Time: 21, + Weight: 0.001391, + }, + { + ID: 212, + Time: 21.1, + Weight: 0.001379, + }, + { + ID: 213, + Time: 21.2, + Weight: 0.001368, + }, + { + ID: 214, + Time: 21.3, + Weight: 0.001356, + }, + { + ID: 215, + Time: 21.4, + Weight: 0.001345, + }, + { + ID: 216, + Time: 21.5, + Weight: 0.001334, + }, + { + ID: 217, + Time: 21.6, + Weight: 0.001323, + }, + { + ID: 218, + Time: 21.7, + Weight: 0.001312, + }, + { + ID: 219, + Time: 21.8, + Weight: 0.001301, + }, + { + ID: 220, + Time: 21.9, + Weight: 0.00129, + }, + { + ID: 221, + Time: 22, + Weight: 0.001279, + }, + { + ID: 222, + Time: 22.1, + Weight: 0.001269, + }, + { + ID: 223, + Time: 22.2, + Weight: 0.001258, + }, + { + ID: 224, + Time: 22.3, + Weight: 0.001248, + }, + { + ID: 225, + Time: 22.4, + Weight: 0.001237, + }, + { + ID: 226, + Time: 22.5, + Weight: 0.001227, + }, + { + ID: 227, + Time: 22.6, + Weight: 0.001217, + }, + { + ID: 228, + Time: 22.7, + Weight: 0.001207, + }, + { + ID: 229, + Time: 22.8, + Weight: 0.001197, + }, + { + ID: 230, + Time: 22.9, + Weight: 0.001187, + }, + { + ID: 231, + Time: 23, + Weight: 0.001177, + }, + { + ID: 232, + Time: 23.1, + Weight: 0.001167, + }, + { + ID: 233, + Time: 23.2, + Weight: 0.001157, + }, + { + ID: 234, + Time: 23.3, + Weight: 0.001148, + }, + { + ID: 235, + Time: 23.4, + Weight: 0.001138, + }, + { + ID: 236, + Time: 23.5, + Weight: 0.001129, + }, + { + ID: 237, + Time: 23.6, + Weight: 0.001119, + }, + { + ID: 238, + Time: 23.7, + Weight: 0.00111, + }, + { + ID: 239, + Time: 23.8, + Weight: 0.001101, + }, + { + ID: 240, + Time: 23.9, + Weight: 0.001092, + }, + { + ID: 241, + Time: 24, + Weight: 0.001083, + }, + { + ID: 242, + Time: 24.1, + Weight: 0.001074, + }, + { + ID: 243, + Time: 24.2, + Weight: 0.001065, + }, + { + ID: 244, + Time: 24.3, + Weight: 0.001056, + }, + { + ID: 245, + Time: 24.4, + Weight: 0.001047, + }, + { + ID: 246, + Time: 24.5, + Weight: 0.001038, + }, + { + ID: 247, + Time: 24.6, + Weight: 0.00103, + }, + { + ID: 248, + Time: 24.7, + Weight: 0.001021, + }, + { + ID: 249, + Time: 24.8, + Weight: 0.001013, + }, + { + ID: 250, + Time: 24.9, + Weight: 0.001004, + }, + { + ID: 251, + Time: 25, + Weight: 0.000996, + }, + { + ID: 252, + Time: 25.1, + Weight: 0.000988, + }, + { + ID: 253, + Time: 25.2, + Weight: 0.00098, + }, + { + ID: 254, + Time: 25.3, + Weight: 0.000971, + }, + { + ID: 255, + Time: 25.4, + Weight: 0.000963, + }, + { + ID: 256, + Time: 25.5, + Weight: 0.000955, + }, + { + ID: 257, + Time: 25.6, + Weight: 0.000947, + }, + { + ID: 258, + Time: 25.7, + Weight: 0.000939, + }, + { + ID: 259, + Time: 25.8, + Weight: 0.000932, + }, + { + ID: 260, + Time: 25.9, + Weight: 0.000924, + }, + { + ID: 261, + Time: 26, + Weight: 0.000916, + }, + { + ID: 262, + Time: 26.1, + Weight: 0.000909, + }, + { + ID: 263, + Time: 26.2, + Weight: 0.000901, + }, + { + ID: 264, + Time: 26.3, + Weight: 0.000894, + }, + { + ID: 265, + Time: 26.4, + Weight: 0.000886, + }, + { + ID: 266, + Time: 26.5, + Weight: 0.000879, + }, + { + ID: 267, + Time: 26.6, + Weight: 0.000872, + }, + { + ID: 268, + Time: 26.7, + Weight: 0.000864, + }, + { + ID: 269, + Time: 26.8, + Weight: 0.000857, + }, + { + ID: 270, + Time: 26.9, + Weight: 0.00085, + }, + { + ID: 271, + Time: 27, + Weight: 0.000843, + }, + { + ID: 272, + Time: 27.1, + Weight: 0.000836, + }, + { + ID: 273, + Time: 27.2, + Weight: 0.000829, + }, + { + ID: 274, + Time: 27.3, + Weight: 0.000822, + }, + { + ID: 275, + Time: 27.4, + Weight: 0.000815, + }, + { + ID: 276, + Time: 27.5, + Weight: 0.000809, + }, + { + ID: 277, + Time: 27.6, + Weight: 0.000802, + }, + { + ID: 278, + Time: 27.7, + Weight: 0.000795, + }, + { + ID: 279, + Time: 27.8, + Weight: 0.000789, + }, + { + ID: 280, + Time: 27.9, + Weight: 0.000782, + }, + { + ID: 281, + Time: 28, + Weight: 0.000775, + }, + { + ID: 282, + Time: 28.1, + Weight: 0.000769, + }, + { + ID: 283, + Time: 28.2, + Weight: 0.000763, + }, + { + ID: 284, + Time: 28.3, + Weight: 0.000756, + }, + { + ID: 285, + Time: 28.4, + Weight: 0.00075, + }, + { + ID: 286, + Time: 28.5, + Weight: 0.000744, + }, + { + ID: 287, + Time: 28.6, + Weight: 0.000738, + }, + { + ID: 288, + Time: 28.7, + Weight: 0.000731, + }, + { + ID: 289, + Time: 28.8, + Weight: 0.000725, + }, + { + ID: 290, + Time: 28.9, + Weight: 0.000719, + }, + { + ID: 291, + Time: 29, + Weight: 0.000713, + }, + { + ID: 292, + Time: 29.1, + Weight: 0.000707, + }, + { + ID: 293, + Time: 29.2, + Weight: 0.000702, + }, + { + ID: 294, + Time: 29.3, + Weight: 0.000696, + }, + { + ID: 295, + Time: 29.4, + Weight: 0.00069, + }, + { + ID: 296, + Time: 29.5, + Weight: 0.000684, + }, + { + ID: 297, + Time: 29.6, + Weight: 0.000679, + }, + { + ID: 298, + Time: 29.7, + Weight: 0.000673, + }, + { + ID: 299, + Time: 29.8, + Weight: 0.000667, + }, + { + ID: 300, + Time: 29.9, + Weight: 0.000662, + }, + { + ID: 301, + Time: 30, + Weight: 0.000656, + }, + { + ID: 302, + Time: 30.1, + Weight: 0.000651, + }, + { + ID: 303, + Time: 30.2, + Weight: 0.000645, + }, + { + ID: 304, + Time: 30.3, + Weight: 0.00064, + }, + { + ID: 305, + Time: 30.4, + Weight: 0.000635, + }, + { + ID: 306, + Time: 30.5, + Weight: 0.000629, + }, + { + ID: 307, + Time: 30.6, + Weight: 0.000624, + }, + { + ID: 308, + Time: 30.7, + Weight: 0.000619, + }, + { + ID: 309, + Time: 30.8, + Weight: 0.000614, + }, + { + ID: 310, + Time: 30.9, + Weight: 0.000609, + }, + { + ID: 311, + Time: 31, + Weight: 0.000604, + }, + { + ID: 312, + Time: 31.1, + Weight: 0.000599, + }, + { + ID: 313, + Time: 31.2, + Weight: 0.000594, + }, + { + ID: 314, + Time: 31.3, + Weight: 0.000589, + }, + { + ID: 315, + Time: 31.4, + Weight: 0.000584, + }, + { + ID: 316, + Time: 31.5, + Weight: 0.000579, + }, + { + ID: 317, + Time: 31.6, + Weight: 0.000574, + }, + { + ID: 318, + Time: 31.7, + Weight: 0.00057, + }, + { + ID: 319, + Time: 31.8, + Weight: 0.000565, + }, + { + ID: 320, + Time: 31.9, + Weight: 0.00056, + }, + { + ID: 321, + Time: 32, + Weight: 0.000555, + }, + { + ID: 322, + Time: 32.1, + Weight: 0.000551, + }, + { + ID: 323, + Time: 32.2, + Weight: 0.000546, + }, + { + ID: 324, + Time: 32.3, + Weight: 0.000542, + }, + { + ID: 325, + Time: 32.4, + Weight: 0.000537, + }, + { + ID: 326, + Time: 32.5, + Weight: 0.000533, + }, + { + ID: 327, + Time: 32.6, + Weight: 0.000528, + }, + { + ID: 328, + Time: 32.7, + Weight: 0.000524, + }, + { + ID: 329, + Time: 32.8, + Weight: 0.00052, + }, + { + ID: 330, + Time: 32.9, + Weight: 0.000515, + }, + { + ID: 331, + Time: 33, + Weight: 0.000511, + }, + { + ID: 332, + Time: 33.1, + Weight: 0.000507, + }, + { + ID: 333, + Time: 33.2, + Weight: 0.000503, + }, + { + ID: 334, + Time: 33.3, + Weight: 0.000498, + }, + { + ID: 335, + Time: 33.4, + Weight: 0.000494, + }, + { + ID: 336, + Time: 33.5, + Weight: 0.00049, + }, + { + ID: 337, + Time: 33.6, + Weight: 0.000486, + }, + { + ID: 338, + Time: 33.7, + Weight: 0.000482, + }, + { + ID: 339, + Time: 33.8, + Weight: 0.000478, + }, + { + ID: 340, + Time: 33.9, + Weight: 0.000474, + }, + { + ID: 341, + Time: 34, + Weight: 0.00047, + }, + { + ID: 342, + Time: 34.1, + Weight: 0.000466, + }, + { + ID: 343, + Time: 34.2, + Weight: 0.000462, + }, + { + ID: 344, + Time: 34.3, + Weight: 0.000458, + }, + { + ID: 345, + Time: 34.4, + Weight: 0.000455, + }, + { + ID: 346, + Time: 34.5, + Weight: 0.000451, + }, + { + ID: 347, + Time: 34.6, + Weight: 0.000447, + }, + { + ID: 348, + Time: 34.7, + Weight: 0.000443, + }, + { + ID: 349, + Time: 34.8, + Weight: 0.00044, + }, + { + ID: 350, + Time: 34.9, + Weight: 0.000436, + }, + { + ID: 351, + Time: 35, + Weight: 0.000432, + }, + { + ID: 352, + Time: 35.1, + Weight: 0.000429, + }, + { + ID: 353, + Time: 35.2, + Weight: 0.000425, + }, + { + ID: 354, + Time: 35.3, + Weight: 0.000422, + }, + { + ID: 355, + Time: 35.4, + Weight: 0.000418, + }, + { + ID: 356, + Time: 35.5, + Weight: 0.000415, + }, + { + ID: 357, + Time: 35.6, + Weight: 0.000411, + }, + { + ID: 358, + Time: 35.7, + Weight: 0.000408, + }, + { + ID: 359, + Time: 35.8, + Weight: 0.000405, + }, + { + ID: 360, + Time: 35.9, + Weight: 0.000401, + }, + { + ID: 361, + Time: 36, + Weight: 0.000398, + }, + { + ID: 362, + Time: 36.1, + Weight: 0.000395, + }, + { + ID: 363, + Time: 36.2, + Weight: 0.000391, + }, + { + ID: 364, + Time: 36.3, + Weight: 0.000388, + }, + { + ID: 365, + Time: 36.4, + Weight: 0.000385, + }, + { + ID: 366, + Time: 36.5, + Weight: 0.000382, + }, + { + ID: 367, + Time: 36.6, + Weight: 0.000378, + }, + { + ID: 368, + Time: 36.7, + Weight: 0.000375, + }, + { + ID: 369, + Time: 36.8, + Weight: 0.000372, + }, + { + ID: 370, + Time: 36.9, + Weight: 0.000369, + }, + { + ID: 371, + Time: 37, + Weight: 0.000366, + }, + { + ID: 372, + Time: 37.1, + Weight: 0.000363, + }, + { + ID: 373, + Time: 37.2, + Weight: 0.00036, + }, + { + ID: 374, + Time: 37.3, + Weight: 0.000357, + }, + { + ID: 375, + Time: 37.4, + Weight: 0.000354, + }, + { + ID: 376, + Time: 37.5, + Weight: 0.000351, + }, + { + ID: 377, + Time: 37.6, + Weight: 0.000348, + }, + { + ID: 378, + Time: 37.7, + Weight: 0.000345, + }, + { + ID: 379, + Time: 37.8, + Weight: 0.000342, + }, + { + ID: 380, + Time: 37.9, + Weight: 0.00034, + }, + { + ID: 381, + Time: 38, + Weight: 0.000337, + }, + { + ID: 382, + Time: 38.1, + Weight: 0.000334, + }, + { + ID: 383, + Time: 38.2, + Weight: 0.000331, + }, + { + ID: 384, + Time: 38.3, + Weight: 0.000328, + }, + { + ID: 385, + Time: 38.4, + Weight: 0.000326, + }, + { + ID: 386, + Time: 38.5, + Weight: 0.000323, + }, + { + ID: 387, + Time: 38.6, + Weight: 0.00032, + }, + { + ID: 388, + Time: 38.7, + Weight: 0.000318, + }, + { + ID: 389, + Time: 38.8, + Weight: 0.000315, + }, + { + ID: 390, + Time: 38.9, + Weight: 0.000312, + }, + { + ID: 391, + Time: 39, + Weight: 0.00031, + }, + { + ID: 392, + Time: 39.1, + Weight: 0.000307, + }, + { + ID: 393, + Time: 39.2, + Weight: 0.000305, + }, + { + ID: 394, + Time: 39.3, + Weight: 0.000302, + }, + { + ID: 395, + Time: 39.4, + Weight: 0.0003, + }, + { + ID: 396, + Time: 39.5, + Weight: 0.000297, + }, + { + ID: 397, + Time: 39.6, + Weight: 0.000295, + }, + { + ID: 398, + Time: 39.7, + Weight: 0.000292, + }, + { + ID: 399, + Time: 39.8, + Weight: 0.00029, + }, + { + ID: 400, + Time: 39.9, + Weight: 0.000287, + }, + { + ID: 401, + Time: 40, + Weight: 0.000285, + }, + { + ID: 402, + Time: 40.1, + Weight: 0.000283, + }, + { + ID: 403, + Time: 40.2, + Weight: 0.00028, + }, + { + ID: 404, + Time: 40.3, + Weight: 0.000278, + }, + { + ID: 405, + Time: 40.4, + Weight: 0.000276, + }, + { + ID: 406, + Time: 40.5, + Weight: 0.000273, + }, + { + ID: 407, + Time: 40.6, + Weight: 0.000271, + }, + { + ID: 408, + Time: 40.7, + Weight: 0.000269, + }, + { + ID: 409, + Time: 40.8, + Weight: 0.000267, + }, + { + ID: 410, + Time: 40.9, + Weight: 0.000264, + }, + { + ID: 411, + Time: 41, + Weight: 0.000262, + }, + { + ID: 412, + Time: 41.1, + Weight: 0.00026, + }, + { + ID: 413, + Time: 41.2, + Weight: 0.000258, + }, + { + ID: 414, + Time: 41.3, + Weight: 0.000256, + }, + { + ID: 415, + Time: 41.4, + Weight: 0.000254, + }, + { + ID: 416, + Time: 41.5, + Weight: 0.000251, + }, + { + ID: 417, + Time: 41.6, + Weight: 0.000249, + }, + { + ID: 418, + Time: 41.7, + Weight: 0.000247, + }, + { + ID: 419, + Time: 41.8, + Weight: 0.000245, + }, + { + ID: 420, + Time: 41.9, + Weight: 0.000243, + }, + { + ID: 421, + Time: 42, + Weight: 0.000241, + }, + { + ID: 422, + Time: 42.1, + Weight: 0.000239, + }, + { + ID: 423, + Time: 42.2, + Weight: 0.000237, + }, + { + ID: 424, + Time: 42.3, + Weight: 0.000235, + }, + { + ID: 425, + Time: 42.4, + Weight: 0.000233, + }, + { + ID: 426, + Time: 42.5, + Weight: 0.000231, + }, + { + ID: 427, + Time: 42.6, + Weight: 0.000229, + }, + { + ID: 428, + Time: 42.7, + Weight: 0.000228, + }, + { + ID: 429, + Time: 42.8, + Weight: 0.000226, + }, + { + ID: 430, + Time: 42.9, + Weight: 0.000224, + }, + { + ID: 431, + Time: 43, + Weight: 0.000222, + }, + { + ID: 432, + Time: 43.1, + Weight: 0.00022, + }, + { + ID: 433, + Time: 43.2, + Weight: 0.000218, + }, + { + ID: 434, + Time: 43.3, + Weight: 0.000216, + }, + { + ID: 435, + Time: 43.4, + Weight: 0.000215, + }, + { + ID: 436, + Time: 43.5, + Weight: 0.000213, + }, + { + ID: 437, + Time: 43.6, + Weight: 0.000211, + }, + { + ID: 438, + Time: 43.7, + Weight: 0.000209, + }, + { + ID: 439, + Time: 43.8, + Weight: 0.000208, + }, + { + ID: 440, + Time: 43.9, + Weight: 0.000206, + }, + { + ID: 441, + Time: 44, + Weight: 0.000204, + }, + { + ID: 442, + Time: 44.1, + Weight: 0.000202, + }, + { + ID: 443, + Time: 44.2, + Weight: 0.000201, + }, + { + ID: 444, + Time: 44.3, + Weight: 0.000199, + }, + { + ID: 445, + Time: 44.4, + Weight: 0.000197, + }, + { + ID: 446, + Time: 44.5, + Weight: 0.000196, + }, + { + ID: 447, + Time: 44.6, + Weight: 0.000194, + }, + { + ID: 448, + Time: 44.7, + Weight: 0.000193, + }, + { + ID: 449, + Time: 44.8, + Weight: 0.000191, + }, + { + ID: 450, + Time: 44.9, + Weight: 0.000189, + }, + { + ID: 451, + Time: 45, + Weight: 0.000188, + }, + { + ID: 452, + Time: 45.1, + Weight: 0.000186, + }, + { + ID: 453, + Time: 45.2, + Weight: 0.000185, + }, + { + ID: 454, + Time: 45.3, + Weight: 0.000183, + }, + { + ID: 455, + Time: 45.4, + Weight: 0.000182, + }, + { + ID: 456, + Time: 45.5, + Weight: 0.00018, + }, + { + ID: 457, + Time: 45.6, + Weight: 0.000179, + }, + { + ID: 458, + Time: 45.7, + Weight: 0.000177, + }, + { + ID: 459, + Time: 45.8, + Weight: 0.000176, + }, + { + ID: 460, + Time: 45.9, + Weight: 0.000174, + }, + { + ID: 461, + Time: 46, + Weight: 0.000173, + }, + { + ID: 462, + Time: 46.1, + Weight: 0.000171, + }, + { + ID: 463, + Time: 46.2, + Weight: 0.00017, + }, + { + ID: 464, + Time: 46.3, + Weight: 0.000168, + }, + { + ID: 465, + Time: 46.4, + Weight: 0.000167, + }, + { + ID: 466, + Time: 46.5, + Weight: 0.000166, + }, + { + ID: 467, + Time: 46.6, + Weight: 0.000164, + }, + { + ID: 468, + Time: 46.7, + Weight: 0.000163, + }, + { + ID: 469, + Time: 46.8, + Weight: 0.000162, + }, + { + ID: 470, + Time: 46.9, + Weight: 0.00016, + }, + { + ID: 471, + Time: 47, + Weight: 0.000159, + }, + { + ID: 472, + Time: 47.1, + Weight: 0.000158, + }, + { + ID: 473, + Time: 47.2, + Weight: 0.000156, + }, + { + ID: 474, + Time: 47.3, + Weight: 0.000155, + }, + { + ID: 475, + Time: 47.4, + Weight: 0.000154, + }, + { + ID: 476, + Time: 47.5, + Weight: 0.000152, + }, + { + ID: 477, + Time: 47.6, + Weight: 0.000151, + }, + { + ID: 478, + Time: 47.7, + Weight: 0.00015, + }, + { + ID: 479, + Time: 47.8, + Weight: 0.000149, + }, + { + ID: 480, + Time: 47.9, + Weight: 0.000147, + }, + { + ID: 481, + Time: 48, + Weight: 0.000146, + }, + { + ID: 482, + Time: 48.1, + Weight: 0.000145, + }, + { + ID: 483, + Time: 48.2, + Weight: 0.000144, + }, + { + ID: 484, + Time: 48.3, + Weight: 0.000143, + }, + { + ID: 485, + Time: 48.4, + Weight: 0.000141, + }, + { + ID: 486, + Time: 48.5, + Weight: 0.00014, + }, + { + ID: 487, + Time: 48.6, + Weight: 0.000139, + }, + { + ID: 488, + Time: 48.7, + Weight: 0.000138, + }, + { + ID: 489, + Time: 48.8, + Weight: 0.000137, + }, + { + ID: 490, + Time: 48.9, + Weight: 0.000136, + }, + { + ID: 491, + Time: 49, + Weight: 0.000135, + }, + { + ID: 492, + Time: 49.1, + Weight: 0.000133, + }, + { + ID: 493, + Time: 49.2, + Weight: 0.000132, + }, + { + ID: 494, + Time: 49.3, + Weight: 0.000131, + }, + { + ID: 495, + Time: 49.4, + Weight: 0.00013, + }, + { + ID: 496, + Time: 49.5, + Weight: 0.000129, + }, + { + ID: 497, + Time: 49.6, + Weight: 0.000128, + }, + { + ID: 498, + Time: 49.7, + Weight: 0.000127, + }, + { + ID: 499, + Time: 49.8, + Weight: 0.000126, + }, + { + ID: 500, + Time: 49.9, + Weight: 0.000125, + }, + { + ID: 501, + Time: 50, + Weight: 0.000124, + }, + { + ID: 502, + Time: 50.1, + Weight: 0.000123, + }, + { + ID: 503, + Time: 50.2, + Weight: 0.000122, + }, + { + ID: 504, + Time: 50.3, + Weight: 0.000121, + }, + { + ID: 505, + Time: 50.4, + Weight: 0.00012, + }, + { + ID: 506, + Time: 50.5, + Weight: 0.000119, + }, + { + ID: 507, + Time: 50.6, + Weight: 0.000118, + }, + { + ID: 508, + Time: 50.7, + Weight: 0.000117, + }, + { + ID: 509, + Time: 50.8, + Weight: 0.000116, + }, + { + ID: 510, + Time: 50.9, + Weight: 0.000115, + }, + { + ID: 511, + Time: 51, + Weight: 0.000114, + }, + { + ID: 512, + Time: 51.1, + Weight: 0.000113, + }, + { + ID: 513, + Time: 51.2, + Weight: 0.000112, + }, + { + ID: 514, + Time: 51.3, + Weight: 0.000111, + }, + { + ID: 515, + Time: 51.4, + Weight: 0.00011, + }, + { + ID: 516, + Time: 51.5, + Weight: 0.000109, + }, + { + ID: 517, + Time: 51.6, + Weight: 0.000108, + }, + { + ID: 518, + Time: 51.7, + Weight: 0.000107, + }, + { + ID: 519, + Time: 51.8, + Weight: 0.000106, + }, + { + ID: 520, + Time: 51.9, + Weight: 0.000106, + }, + { + ID: 521, + Time: 52, + Weight: 0.000105, + }, + { + ID: 522, + Time: 52.1, + Weight: 0.000104, + }, + { + ID: 523, + Time: 52.2, + Weight: 0.000103, + }, + { + ID: 524, + Time: 52.3, + Weight: 0.000102, + }, + { + ID: 525, + Time: 52.4, + Weight: 0.000101, + }, + { + ID: 526, + Time: 52.5, + Weight: 0.0001, + }, + { + ID: 527, + Time: 52.6, + Weight: 0.0001, + }, + { + ID: 528, + Time: 52.7, + Weight: 0.000099, + }, + { + ID: 529, + Time: 52.8, + Weight: 0.000098, + }, + { + ID: 530, + Time: 52.9, + Weight: 0.000097, + }, + { + ID: 531, + Time: 53, + Weight: 0.000096, + }, + { + ID: 532, + Time: 53.1, + Weight: 0.000096, + }, + { + ID: 533, + Time: 53.2, + Weight: 0.000095, + }, + { + ID: 534, + Time: 53.3, + Weight: 0.000094, + }, + { + ID: 535, + Time: 53.4, + Weight: 0.000093, + }, + { + ID: 536, + Time: 53.5, + Weight: 0.000092, + }, + { + ID: 537, + Time: 53.6, + Weight: 0.000092, + }, + { + ID: 538, + Time: 53.7, + Weight: 0.000091, + }, + { + ID: 539, + Time: 53.8, + Weight: 0.00009, + }, + { + ID: 540, + Time: 53.9, + Weight: 0.000089, + }, + { + ID: 541, + Time: 54, + Weight: 0.000089, + }, + { + ID: 542, + Time: 54.1, + Weight: 0.000088, + }, + { + ID: 543, + Time: 54.2, + Weight: 0.000087, + }, + { + ID: 544, + Time: 54.3, + Weight: 0.000086, + }, + { + ID: 545, + Time: 54.4, + Weight: 0.000086, + }, + { + ID: 546, + Time: 54.5, + Weight: 0.000085, + }, + { + ID: 547, + Time: 54.6, + Weight: 0.000084, + }, + { + ID: 548, + Time: 54.7, + Weight: 0.000084, + }, + { + ID: 549, + Time: 54.8, + Weight: 0.000083, + }, + { + ID: 550, + Time: 54.9, + Weight: 0.000082, + }, + { + ID: 551, + Time: 55, + Weight: 0.000082, + }, + { + ID: 552, + Time: 55.1, + Weight: 0.000081, + }, + { + ID: 553, + Time: 55.2, + Weight: 0.00008, + }, + { + ID: 554, + Time: 55.3, + Weight: 0.00008, + }, + { + ID: 555, + Time: 55.4, + Weight: 0.000079, + }, + { + ID: 556, + Time: 55.5, + Weight: 0.000078, + }, + { + ID: 557, + Time: 55.6, + Weight: 0.000078, + }, + { + ID: 558, + Time: 55.7, + Weight: 0.000077, + }, + { + ID: 559, + Time: 55.8, + Weight: 0.000076, + }, + { + ID: 560, + Time: 55.9, + Weight: 0.000076, + }, + { + ID: 561, + Time: 56, + Weight: 0.000075, + }, + { + ID: 562, + Time: 56.1, + Weight: 0.000074, + }, + { + ID: 563, + Time: 56.2, + Weight: 0.000074, + }, + { + ID: 564, + Time: 56.3, + Weight: 0.000073, + }, + { + ID: 565, + Time: 56.4, + Weight: 0.000073, + }, + { + ID: 566, + Time: 56.5, + Weight: 0.000072, + }, + { + ID: 567, + Time: 56.6, + Weight: 0.000071, + }, + { + ID: 568, + Time: 56.7, + Weight: 0.000071, + }, + { + ID: 569, + Time: 56.8, + Weight: 0.00007, + }, + { + ID: 570, + Time: 56.9, + Weight: 0.00007, + }, + { + ID: 571, + Time: 57, + Weight: 0.000069, + }, + { + ID: 572, + Time: 57.1, + Weight: 0.000068, + }, + { + ID: 573, + Time: 57.2, + Weight: 0.000068, + }, + { + ID: 574, + Time: 57.3, + Weight: 0.000067, + }, + { + ID: 575, + Time: 57.4, + Weight: 0.000067, + }, + { + ID: 576, + Time: 57.5, + Weight: 0.000066, + }, + { + ID: 577, + Time: 57.6, + Weight: 0.000066, + }, + { + ID: 578, + Time: 57.7, + Weight: 0.000065, + }, + { + ID: 579, + Time: 57.8, + Weight: 0.000065, + }, + { + ID: 580, + Time: 57.9, + Weight: 0.000064, + }, + { + ID: 581, + Time: 58, + Weight: 0.000063, + }, + { + ID: 582, + Time: 58.1, + Weight: 0.000063, + }, + { + ID: 583, + Time: 58.2, + Weight: 0.000062, + }, + { + ID: 584, + Time: 58.3, + Weight: 0.000062, + }, + { + ID: 585, + Time: 58.4, + Weight: 0.000061, + }, + { + ID: 586, + Time: 58.5, + Weight: 0.000061, + }, + { + ID: 587, + Time: 58.6, + Weight: 0.00006, + }, + { + ID: 588, + Time: 58.7, + Weight: 0.00006, + }, + { + ID: 589, + Time: 58.8, + Weight: 0.000059, + }, + { + ID: 590, + Time: 58.9, + Weight: 0.000059, + }, + { + ID: 591, + Time: 59, + Weight: 0.000058, + }, + { + ID: 592, + Time: 59.1, + Weight: 0.000058, + }, + { + ID: 593, + Time: 59.2, + Weight: 0.000057, + }, + { + ID: 594, + Time: 59.3, + Weight: 0.000057, + }, + { + ID: 595, + Time: 59.4, + Weight: 0.000056, + }, + { + ID: 596, + Time: 59.5, + Weight: 0.000056, + }, + { + ID: 597, + Time: 59.6, + Weight: 0.000056, + }, + { + ID: 598, + Time: 59.7, + Weight: 0.000055, + }, + { + ID: 599, + Time: 59.8, + Weight: 0.000055, + }, + { + ID: 600, + Time: 59.9, + Weight: 0.000054, + }, + { + ID: 601, + Time: 60, + Weight: 0.000054, + }, + { + ID: 602, + Time: 60.1, + Weight: 0.000053, + }, + { + ID: 603, + Time: 60.2, + Weight: 0.000053, + }, + { + ID: 604, + Time: 60.3, + Weight: 0.000052, + }, + { + ID: 605, + Time: 60.4, + Weight: 0.000052, + }, + { + ID: 606, + Time: 60.5, + Weight: 0.000052, + }, + { + ID: 607, + Time: 60.6, + Weight: 0.000051, + }, + { + ID: 608, + Time: 60.7, + Weight: 0.000051, + }, + { + ID: 609, + Time: 60.8, + Weight: 0.00005, + }, + { + ID: 610, + Time: 60.9, + Weight: 0.00005, + }, + { + ID: 611, + Time: 61, + Weight: 0.000049, + }, + { + ID: 612, + Time: 61.1, + Weight: 0.000049, + }, + { + ID: 613, + Time: 61.2, + Weight: 0.000049, + }, + { + ID: 614, + Time: 61.3, + Weight: 0.000048, + }, + { + ID: 615, + Time: 61.4, + Weight: 0.000048, + }, + { + ID: 616, + Time: 61.5, + Weight: 0.000047, + }, + { + ID: 617, + Time: 61.6, + Weight: 0.000047, + }, + { + ID: 618, + Time: 61.7, + Weight: 0.000047, + }, + { + ID: 619, + Time: 61.8, + Weight: 0.000046, + }, + { + ID: 620, + Time: 61.9, + Weight: 0.000046, + }, + { + ID: 621, + Time: 62, + Weight: 0.000045, + }, + { + ID: 622, + Time: 62.1, + Weight: 0.000045, + }, + { + ID: 623, + Time: 62.2, + Weight: 0.000045, + }, + { + ID: 624, + Time: 62.3, + Weight: 0.000044, + }, + { + ID: 625, + Time: 62.4, + Weight: 0.000044, + }, + { + ID: 626, + Time: 62.5, + Weight: 0.000044, + }, + { + ID: 627, + Time: 62.6, + Weight: 0.000043, + }, + { + ID: 628, + Time: 62.7, + Weight: 0.000043, + }, + { + ID: 629, + Time: 62.8, + Weight: 0.000043, + }, + { + ID: 630, + Time: 62.9, + Weight: 0.000042, + }, + { + ID: 631, + Time: 63, + Weight: 0.000042, + }, + { + ID: 632, + Time: 63.1, + Weight: 0.000041, + }, + { + ID: 633, + Time: 63.2, + Weight: 0.000041, + }, + { + ID: 634, + Time: 63.3, + Weight: 0.000041, + }, + { + ID: 635, + Time: 63.4, + Weight: 0.00004, + }, + { + ID: 636, + Time: 63.5, + Weight: 0.00004, + }, + { + ID: 637, + Time: 63.6, + Weight: 0.00004, + }, + { + ID: 638, + Time: 63.7, + Weight: 0.000039, + }, + { + ID: 639, + Time: 63.8, + Weight: 0.000039, + }, + { + ID: 640, + Time: 63.9, + Weight: 0.000039, + }, + { + ID: 641, + Time: 64, + Weight: 0.000038, + }, + { + ID: 642, + Time: 64.1, + Weight: 0.000038, + }, + { + ID: 643, + Time: 64.2, + Weight: 0.000038, + }, + { + ID: 644, + Time: 64.3, + Weight: 0.000038, + }, + { + ID: 645, + Time: 64.4, + Weight: 0.000037, + }, + { + ID: 646, + Time: 64.5, + Weight: 0.000037, + }, + { + ID: 647, + Time: 64.6, + Weight: 0.000037, + }, + { + ID: 648, + Time: 64.7, + Weight: 0.000036, + }, + { + ID: 649, + Time: 64.8, + Weight: 0.000036, + }, + { + ID: 650, + Time: 64.9, + Weight: 0.000036, + }, + { + ID: 651, + Time: 65, + Weight: 0.000035, + }, + { + ID: 652, + Time: 65.1, + Weight: 0.000035, + }, + { + ID: 653, + Time: 65.2, + Weight: 0.000035, + }, + { + ID: 654, + Time: 65.3, + Weight: 0.000035, + }, + { + ID: 655, + Time: 65.4, + Weight: 0.000034, + }, + { + ID: 656, + Time: 65.5, + Weight: 0.000034, + }, + { + ID: 657, + Time: 65.6, + Weight: 0.000034, + }, + { + ID: 658, + Time: 65.7, + Weight: 0.000033, + }, + { + ID: 659, + Time: 65.8, + Weight: 0.000033, + }, + { + ID: 660, + Time: 65.9, + Weight: 0.000033, + }, + { + ID: 661, + Time: 66, + Weight: 0.000033, + }, + { + ID: 662, + Time: 66.1, + Weight: 0.000032, + }, + { + ID: 663, + Time: 66.2, + Weight: 0.000032, + }, + { + ID: 664, + Time: 66.3, + Weight: 0.000032, + }, + { + ID: 665, + Time: 66.4, + Weight: 0.000032, + }, + { + ID: 666, + Time: 66.5, + Weight: 0.000031, + }, + { + ID: 667, + Time: 66.6, + Weight: 0.000031, + }, + { + ID: 668, + Time: 66.7, + Weight: 0.000031, + }, + { + ID: 669, + Time: 66.8, + Weight: 0.00003, + }, + { + ID: 670, + Time: 66.9, + Weight: 0.00003, + }, + { + ID: 671, + Time: 67, + Weight: 0.00003, + }, + { + ID: 672, + Time: 67.1, + Weight: 0.00003, + }, + { + ID: 673, + Time: 67.2, + Weight: 0.000029, + }, + { + ID: 674, + Time: 67.3, + Weight: 0.000029, + }, + { + ID: 675, + Time: 67.4, + Weight: 0.000029, + }, + { + ID: 676, + Time: 67.5, + Weight: 0.000029, + }, + { + ID: 677, + Time: 67.6, + Weight: 0.000029, + }, + { + ID: 678, + Time: 67.7, + Weight: 0.000028, + }, + { + ID: 679, + Time: 67.8, + Weight: 0.000028, + }, + { + ID: 680, + Time: 67.9, + Weight: 0.000028, + }, + { + ID: 681, + Time: 68, + Weight: 0.000028, + }, + { + ID: 682, + Time: 68.1, + Weight: 0.000027, + }, + { + ID: 683, + Time: 68.2, + Weight: 0.000027, + }, + { + ID: 684, + Time: 68.3, + Weight: 0.000027, + }, + { + ID: 685, + Time: 68.4, + Weight: 0.000027, + }, + { + ID: 686, + Time: 68.5, + Weight: 0.000026, + }, + { + ID: 687, + Time: 68.6, + Weight: 0.000026, + }, + { + ID: 688, + Time: 68.7, + Weight: 0.000026, + }, + { + ID: 689, + Time: 68.8, + Weight: 0.000026, + }, + { + ID: 690, + Time: 68.9, + Weight: 0.000026, + }, + { + ID: 691, + Time: 69, + Weight: 0.000025, + }, + { + ID: 692, + Time: 69.1, + Weight: 0.000025, + }, + { + ID: 693, + Time: 69.2, + Weight: 0.000025, + }, + { + ID: 694, + Time: 69.3, + Weight: 0.000025, + }, + { + ID: 695, + Time: 69.4, + Weight: 0.000025, + }, + { + ID: 696, + Time: 69.5, + Weight: 0.000024, + }, + { + ID: 697, + Time: 69.6, + Weight: 0.000024, + }, + { + ID: 698, + Time: 69.7, + Weight: 0.000024, + }, + { + ID: 699, + Time: 69.8, + Weight: 0.000024, + }, + { + ID: 700, + Time: 69.9, + Weight: 0.000024, + }, + { + ID: 701, + Time: 70, + Weight: 0.000023, + }, + { + ID: 702, + Time: 70.1, + Weight: 0.000023, + }, + { + ID: 703, + Time: 70.2, + Weight: 0.000023, + }, + { + ID: 704, + Time: 70.3, + Weight: 0.000023, + }, + { + ID: 705, + Time: 70.4, + Weight: 0.000023, + }, + { + ID: 706, + Time: 70.5, + Weight: 0.000022, + }, + { + ID: 707, + Time: 70.6, + Weight: 0.000022, + }, + { + ID: 708, + Time: 70.7, + Weight: 0.000022, + }, + { + ID: 709, + Time: 70.8, + Weight: 0.000022, + }, + { + ID: 710, + Time: 70.9, + Weight: 0.000022, + }, + { + ID: 711, + Time: 71, + Weight: 0.000021, + }, + { + ID: 712, + Time: 71.1, + Weight: 0.000021, + }, + { + ID: 713, + Time: 71.2, + Weight: 0.000021, + }, + { + ID: 714, + Time: 71.3, + Weight: 0.000021, + }, + { + ID: 715, + Time: 71.4, + Weight: 0.000021, + }, + { + ID: 716, + Time: 71.5, + Weight: 0.000021, + }, + { + ID: 717, + Time: 71.6, + Weight: 0.00002, + }, + { + ID: 718, + Time: 71.7, + Weight: 0.00002, + }, + { + ID: 719, + Time: 71.8, + Weight: 0.00002, + }, + { + ID: 720, + Time: 71.9, + Weight: 0.00002, + }, + { + ID: 721, + Time: 72, + Weight: 0.00002, + }, + { + ID: 722, + Time: 72.1, + Weight: 0.00002, + }, + { + ID: 723, + Time: 72.2, + Weight: 0.000019, + }, + { + ID: 724, + Time: 72.3, + Weight: 0.000019, + }, + { + ID: 725, + Time: 72.4, + Weight: 0.000019, + }, + { + ID: 726, + Time: 72.5, + Weight: 0.000019, + }, + { + ID: 727, + Time: 72.6, + Weight: 0.000019, + }, + { + ID: 728, + Time: 72.7, + Weight: 0.000019, + }, + { + ID: 729, + Time: 72.8, + Weight: 0.000018, + }, + { + ID: 730, + Time: 72.9, + Weight: 0.000018, + }, + { + ID: 731, + Time: 73, + Weight: 0.000018, + }, + { + ID: 732, + Time: 73.1, + Weight: 0.000018, + }, + { + ID: 733, + Time: 73.2, + Weight: 0.000018, + }, + { + ID: 734, + Time: 73.3, + Weight: 0.000018, + }, + { + ID: 735, + Time: 73.4, + Weight: 0.000018, + }, + { + ID: 736, + Time: 73.5, + Weight: 0.000017, + }, + { + ID: 737, + Time: 73.6, + Weight: 0.000017, + }, + { + ID: 738, + Time: 73.7, + Weight: 0.000017, + }, + { + ID: 739, + Time: 73.8, + Weight: 0.000017, + }, + { + ID: 740, + Time: 73.9, + Weight: 0.000017, + }, + { + ID: 741, + Time: 74, + Weight: 0.000017, + }, + { + ID: 742, + Time: 74.1, + Weight: 0.000017, + }, + { + ID: 743, + Time: 74.2, + Weight: 0.000016, + }, + { + ID: 744, + Time: 74.3, + Weight: 0.000016, + }, + { + ID: 745, + Time: 74.4, + Weight: 0.000016, + }, + { + ID: 746, + Time: 74.5, + Weight: 0.000016, + }, + { + ID: 747, + Time: 74.6, + Weight: 0.000016, + }, + { + ID: 748, + Time: 74.7, + Weight: 0.000016, + }, + { + ID: 749, + Time: 74.8, + Weight: 0.000016, + }, + { + ID: 750, + Time: 74.9, + Weight: 0.000016, + }, + { + ID: 751, + Time: 75, + Weight: 0.000015, + }, + { + ID: 752, + Time: 75.1, + Weight: 0.000015, + }, + { + ID: 753, + Time: 75.2, + Weight: 0.000015, + }, + { + ID: 754, + Time: 75.3, + Weight: 0.000015, + }, + { + ID: 755, + Time: 75.4, + Weight: 0.000015, + }, + { + ID: 756, + Time: 75.5, + Weight: 0.000015, + }, + { + ID: 757, + Time: 75.6, + Weight: 0.000015, + }, + { + ID: 758, + Time: 75.7, + Weight: 0.000015, + }, + { + ID: 759, + Time: 75.8, + Weight: 0.000014, + }, + { + ID: 760, + Time: 75.9, + Weight: 0.000014, + }, + { + ID: 761, + Time: 76, + Weight: 0.000014, + }, + { + ID: 762, + Time: 76.1, + Weight: 0.000014, + }, + { + ID: 763, + Time: 76.2, + Weight: 0.000014, + }, + { + ID: 764, + Time: 76.3, + Weight: 0.000014, + }, + { + ID: 765, + Time: 76.4, + Weight: 0.000014, + }, + { + ID: 766, + Time: 76.5, + Weight: 0.000014, + }, + { + ID: 767, + Time: 76.6, + Weight: 0.000013, + }, + { + ID: 768, + Time: 76.7, + Weight: 0.000013, + }, + { + ID: 769, + Time: 76.8, + Weight: 0.000013, + }, + { + ID: 770, + Time: 76.9, + Weight: 0.000013, + }, + { + ID: 771, + Time: 77, + Weight: 0.000013, + }, + { + ID: 772, + Time: 77.1, + Weight: 0.000013, + }, + { + ID: 773, + Time: 77.2, + Weight: 0.000013, + }, + { + ID: 774, + Time: 77.3, + Weight: 0.000013, + }, + { + ID: 775, + Time: 77.4, + Weight: 0.000013, + }, + { + ID: 776, + Time: 77.5, + Weight: 0.000012, + }, + { + ID: 777, + Time: 77.6, + Weight: 0.000012, + }, + { + ID: 778, + Time: 77.7, + Weight: 0.000012, + }, + { + ID: 779, + Time: 77.8, + Weight: 0.000012, + }, + { + ID: 780, + Time: 77.9, + Weight: 0.000012, + }, + { + ID: 781, + Time: 78, + Weight: 0.000012, + }, + { + ID: 782, + Time: 78.1, + Weight: 0.000012, + }, + { + ID: 783, + Time: 78.2, + Weight: 0.000012, + }, + { + ID: 784, + Time: 78.3, + Weight: 0.000012, + }, + { + ID: 785, + Time: 78.4, + Weight: 0.000012, + }, + { + ID: 786, + Time: 78.5, + Weight: 0.000011, + }, + { + ID: 787, + Time: 78.6, + Weight: 0.000011, + }, + { + ID: 788, + Time: 78.7, + Weight: 0.000011, + }, + { + ID: 789, + Time: 78.8, + Weight: 0.000011, + }, + { + ID: 790, + Time: 78.9, + Weight: 0.000011, + }, + { + ID: 791, + Time: 79, + Weight: 0.000011, + }, + { + ID: 792, + Time: 79.1, + Weight: 0.000011, + }, + { + ID: 793, + Time: 79.2, + Weight: 0.000011, + }, + { + ID: 794, + Time: 79.3, + Weight: 0.000011, + }, + { + ID: 795, + Time: 79.4, + Weight: 0.000011, + }, + { + ID: 796, + Time: 79.5, + Weight: 0.000011, + }, + { + ID: 797, + Time: 79.6, + Weight: 0.00001, + }, + { + ID: 798, + Time: 79.7, + Weight: 0.00001, + }, + { + ID: 799, + Time: 79.8, + Weight: 0.00001, + }, + { + ID: 800, + Time: 79.9, + Weight: 0.00001, + }, + { + ID: 801, + Time: 80, + Weight: 0.00001, + }, + { + ID: 802, + Time: 80.1, + Weight: 0.00001, + }, + { + ID: 803, + Time: 80.2, + Weight: 0.00001, + }, + { + ID: 804, + Time: 80.3, + Weight: 0.00001, + }, + { + ID: 805, + Time: 80.4, + Weight: 0.00001, + }, + { + ID: 806, + Time: 80.5, + Weight: 0.00001, + }, + { + ID: 807, + Time: 80.6, + Weight: 0.00001, + }, + { + ID: 808, + Time: 80.7, + Weight: 0.00001, + }, + { + ID: 809, + Time: 80.8, + Weight: 0.000009, + }, + { + ID: 810, + Time: 80.9, + Weight: 0.000009, + }, + { + ID: 811, + Time: 81, + Weight: 0.000009, + }, + { + ID: 812, + Time: 81.1, + Weight: 0.000009, + }, + { + ID: 813, + Time: 81.2, + Weight: 0.000009, + }, + { + ID: 814, + Time: 81.3, + Weight: 0.000009, + }, + { + ID: 815, + Time: 81.4, + Weight: 0.000009, + }, + { + ID: 816, + Time: 81.5, + Weight: 0.000009, + }, + { + ID: 817, + Time: 81.6, + Weight: 0.000009, + }, + { + ID: 818, + Time: 81.7, + Weight: 0.000009, + }, + { + ID: 819, + Time: 81.8, + Weight: 0.000009, + }, + { + ID: 820, + Time: 81.9, + Weight: 0.000009, + }, + { + ID: 821, + Time: 82, + Weight: 0.000009, + }, + { + ID: 822, + Time: 82.1, + Weight: 0.000009, + }, + { + ID: 823, + Time: 82.2, + Weight: 0.000008, + }, + { + ID: 824, + Time: 82.3, + Weight: 0.000008, + }, + { + ID: 825, + Time: 82.4, + Weight: 0.000008, + }, + { + ID: 826, + Time: 82.5, + Weight: 0.000008, + }, + { + ID: 827, + Time: 82.6, + Weight: 0.000008, + }, + { + ID: 828, + Time: 82.7, + Weight: 0.000008, + }, + { + ID: 829, + Time: 82.8, + Weight: 0.000008, + }, + { + ID: 830, + Time: 82.9, + Weight: 0.000008, + }, + { + ID: 831, + Time: 83, + Weight: 0.000008, + }, + { + ID: 832, + Time: 83.1, + Weight: 0.000008, + }, + { + ID: 833, + Time: 83.2, + Weight: 0.000008, + }, + { + ID: 834, + Time: 83.3, + Weight: 0.000008, + }, + { + ID: 835, + Time: 83.4, + Weight: 0.000008, + }, + { + ID: 836, + Time: 83.5, + Weight: 0.000008, + }, + { + ID: 837, + Time: 83.6, + Weight: 0.000008, + }, + { + ID: 838, + Time: 83.7, + Weight: 0.000007, + }, + { + ID: 839, + Time: 83.8, + Weight: 0.000007, + }, + { + ID: 840, + Time: 83.9, + Weight: 0.000007, + }, + { + ID: 841, + Time: 84, + Weight: 0.000007, + }, + { + ID: 842, + Time: 84.1, + Weight: 0.000007, + }, + { + ID: 843, + Time: 84.2, + Weight: 0.000007, + }, + { + ID: 844, + Time: 84.3, + Weight: 0.000007, + }, + { + ID: 845, + Time: 84.4, + Weight: 0.000007, + }, + { + ID: 846, + Time: 84.5, + Weight: 0.000007, + }, + { + ID: 847, + Time: 84.6, + Weight: 0.000007, + }, + { + ID: 848, + Time: 84.7, + Weight: 0.000007, + }, + { + ID: 849, + Time: 84.8, + Weight: 0.000007, + }, + { + ID: 850, + Time: 84.9, + Weight: 0.000007, + }, + { + ID: 851, + Time: 85, + Weight: 0.000007, + }, + { + ID: 852, + Time: 85.1, + Weight: 0.000007, + }, + { + ID: 853, + Time: 85.2, + Weight: 0.000007, + }, + { + ID: 854, + Time: 85.3, + Weight: 0.000007, + }, + { + ID: 855, + Time: 85.4, + Weight: 0.000006, + }, + { + ID: 856, + Time: 85.5, + Weight: 0.000006, + }, + { + ID: 857, + Time: 85.6, + Weight: 0.000006, + }, + { + ID: 858, + Time: 85.7, + Weight: 0.000006, + }, + { + ID: 859, + Time: 85.8, + Weight: 0.000006, + }, + { + ID: 860, + Time: 85.9, + Weight: 0.000006, + }, + { + ID: 861, + Time: 86, + Weight: 0.000006, + }, + { + ID: 862, + Time: 86.1, + Weight: 0.000006, + }, + { + ID: 863, + Time: 86.2, + Weight: 0.000006, + }, + { + ID: 864, + Time: 86.3, + Weight: 0.000006, + }, + { + ID: 865, + Time: 86.4, + Weight: 0.000006, + }, + { + ID: 866, + Time: 86.5, + Weight: 0.000006, + }, + { + ID: 867, + Time: 86.6, + Weight: 0.000006, + }, + { + ID: 868, + Time: 86.7, + Weight: 0.000006, + }, + { + ID: 869, + Time: 86.8, + Weight: 0.000006, + }, + { + ID: 870, + Time: 86.9, + Weight: 0.000006, + }, + { + ID: 871, + Time: 87, + Weight: 0.000006, + }, + { + ID: 872, + Time: 87.1, + Weight: 0.000006, + }, + { + ID: 873, + Time: 87.2, + Weight: 0.000006, + }, + { + ID: 874, + Time: 87.3, + Weight: 0.000006, + }, + { + ID: 875, + Time: 87.4, + Weight: 0.000005, + }, + { + ID: 876, + Time: 87.5, + Weight: 0.000005, + }, + { + ID: 877, + Time: 87.6, + Weight: 0.000005, + }, + { + ID: 878, + Time: 87.7, + Weight: 0.000005, + }, + { + ID: 879, + Time: 87.8, + Weight: 0.000005, + }, + { + ID: 880, + Time: 87.9, + Weight: 0.000005, + }, + { + ID: 881, + Time: 88, + Weight: 0.000005, + }, + { + ID: 882, + Time: 88.1, + Weight: 0.000005, + }, + { + ID: 883, + Time: 88.2, + Weight: 0.000005, + }, + { + ID: 884, + Time: 88.3, + Weight: 0.000005, + }, + { + ID: 885, + Time: 88.4, + Weight: 0.000005, + }, + { + ID: 886, + Time: 88.5, + Weight: 0.000005, + }, + { + ID: 887, + Time: 88.6, + Weight: 0.000005, + }, + { + ID: 888, + Time: 88.7, + Weight: 0.000005, + }, + { + ID: 889, + Time: 88.8, + Weight: 0.000005, + }, + { + ID: 890, + Time: 88.9, + Weight: 0.000005, + }, + { + ID: 891, + Time: 89, + Weight: 0.000005, + }, + { + ID: 892, + Time: 89.1, + Weight: 0.000005, + }, + { + ID: 893, + Time: 89.2, + Weight: 0.000005, + }, + { + ID: 894, + Time: 89.3, + Weight: 0.000005, + }, + { + ID: 895, + Time: 89.4, + Weight: 0.000005, + }, + { + ID: 896, + Time: 89.5, + Weight: 0.000005, + }, + { + ID: 897, + Time: 89.6, + Weight: 0.000005, + }, + { + ID: 898, + Time: 89.7, + Weight: 0.000005, + }, + { + ID: 899, + Time: 89.8, + Weight: 0.000004, + }, + { + ID: 900, + Time: 89.9, + Weight: 0.000004, + }, + { + ID: 901, + Time: 90, + Weight: 0.000004, + }, + { + ID: 902, + Time: 90.1, + Weight: 0.000004, + }, + { + ID: 903, + Time: 90.2, + Weight: 0.000004, + }, + { + ID: 904, + Time: 90.3, + Weight: 0.000004, + }, + { + ID: 905, + Time: 90.4, + Weight: 0.000004, + }, + { + ID: 906, + Time: 90.5, + Weight: 0.000004, + }, + { + ID: 907, + Time: 90.6, + Weight: 0.000004, + }, + { + ID: 908, + Time: 90.7, + Weight: 0.000004, + }, + { + ID: 909, + Time: 90.8, + Weight: 0.000004, + }, + { + ID: 910, + Time: 90.9, + Weight: 0.000004, + }, + { + ID: 911, + Time: 91, + Weight: 0.000004, + }, + { + ID: 912, + Time: 91.1, + Weight: 0.000004, + }, + { + ID: 913, + Time: 91.2, + Weight: 0.000004, + }, + { + ID: 914, + Time: 91.3, + Weight: 0.000004, + }, + { + ID: 915, + Time: 91.4, + Weight: 0.000004, + }, + { + ID: 916, + Time: 91.5, + Weight: 0.000004, + }, + { + ID: 917, + Time: 91.6, + Weight: 0.000004, + }, + { + ID: 918, + Time: 91.7, + Weight: 0.000004, + }, + { + ID: 919, + Time: 91.8, + Weight: 0.000004, + }, + { + ID: 920, + Time: 91.9, + Weight: 0.000004, + }, + { + ID: 921, + Time: 92, + Weight: 0.000004, + }, + { + ID: 922, + Time: 92.1, + Weight: 0.000004, + }, + { + ID: 923, + Time: 92.2, + Weight: 0.000004, + }, + { + ID: 924, + Time: 92.3, + Weight: 0.000004, + }, + { + ID: 925, + Time: 92.4, + Weight: 0.000004, + }, + { + ID: 926, + Time: 92.5, + Weight: 0.000004, + }, + { + ID: 927, + Time: 92.6, + Weight: 0.000004, + }, + { + ID: 928, + Time: 92.7, + Weight: 0.000004, + }, + { + ID: 929, + Time: 92.8, + Weight: 0.000003, + }, + { + ID: 930, + Time: 92.9, + Weight: 0.000003, + }, + { + ID: 931, + Time: 93, + Weight: 0.000003, + }, + { + ID: 932, + Time: 93.1, + Weight: 0.000003, + }, + { + ID: 933, + Time: 93.2, + Weight: 0.000003, + }, + { + ID: 934, + Time: 93.3, + Weight: 0.000003, + }, + { + ID: 935, + Time: 93.4, + Weight: 0.000003, + }, + { + ID: 936, + Time: 93.5, + Weight: 0.000003, + }, + { + ID: 937, + Time: 93.6, + Weight: 0.000003, + }, + { + ID: 938, + Time: 93.7, + Weight: 0.000003, + }, + { + ID: 939, + Time: 93.8, + Weight: 0.000003, + }, + { + ID: 940, + Time: 93.9, + Weight: 0.000003, + }, + { + ID: 941, + Time: 94, + Weight: 0.000003, + }, + { + ID: 942, + Time: 94.1, + Weight: 0.000003, + }, + { + ID: 943, + Time: 94.2, + Weight: 0.000003, + }, + { + ID: 944, + Time: 94.3, + Weight: 0.000003, + }, + { + ID: 945, + Time: 94.4, + Weight: 0.000003, + }, + { + ID: 946, + Time: 94.5, + Weight: 0.000003, + }, + { + ID: 947, + Time: 94.6, + Weight: 0.000003, + }, + { + ID: 948, + Time: 94.7, + Weight: 0.000003, + }, + { + ID: 949, + Time: 94.8, + Weight: 0.000003, + }, + { + ID: 950, + Time: 94.9, + Weight: 0.000003, + }, + { + ID: 951, + Time: 95, + Weight: 0.000003, + }, + { + ID: 952, + Time: 95.1, + Weight: 0.000003, + }, + { + ID: 953, + Time: 95.2, + Weight: 0.000003, + }, + { + ID: 954, + Time: 95.3, + Weight: 0.000003, + }, + { + ID: 955, + Time: 95.4, + Weight: 0.000003, + }, + { + ID: 956, + Time: 95.5, + Weight: 0.000003, + }, + { + ID: 957, + Time: 95.6, + Weight: 0.000003, + }, + { + ID: 958, + Time: 95.7, + Weight: 0.000003, + }, + { + ID: 959, + Time: 95.8, + Weight: 0.000003, + }, + { + ID: 960, + Time: 95.9, + Weight: 0.000003, + }, + { + ID: 961, + Time: 96, + Weight: 0.000003, + }, + { + ID: 962, + Time: 96.1, + Weight: 0.000003, + }, + { + ID: 963, + Time: 96.2, + Weight: 0.000003, + }, + { + ID: 964, + Time: 96.3, + Weight: 0.000003, + }, + { + ID: 965, + Time: 96.4, + Weight: 0.000003, + }, + { + ID: 966, + Time: 96.5, + Weight: 0.000003, + }, + { + ID: 967, + Time: 96.6, + Weight: 0.000003, + }, + { + ID: 968, + Time: 96.7, + Weight: 0.000003, + }, + { + ID: 969, + Time: 96.8, + Weight: 0.000002, + }, + { + ID: 970, + Time: 96.9, + Weight: 0.000002, + }, + { + ID: 971, + Time: 97, + Weight: 0.000002, + }, + { + ID: 972, + Time: 97.1, + Weight: 0.000002, + }, + { + ID: 973, + Time: 97.2, + Weight: 0.000002, + }, + { + ID: 974, + Time: 97.3, + Weight: 0.000002, + }, + { + ID: 975, + Time: 97.4, + Weight: 0.000002, + }, + { + ID: 976, + Time: 97.5, + Weight: 0.000002, + }, + { + ID: 977, + Time: 97.6, + Weight: 0.000002, + }, + { + ID: 978, + Time: 97.7, + Weight: 0.000002, + }, + { + ID: 979, + Time: 97.8, + Weight: 0.000002, + }, + { + ID: 980, + Time: 97.9, + Weight: 0.000002, + }, + { + ID: 981, + Time: 98, + Weight: 0.000002, + }, + { + ID: 982, + Time: 98.1, + Weight: 0.000002, + }, + { + ID: 983, + Time: 98.2, + Weight: 0.000002, + }, + { + ID: 984, + Time: 98.3, + Weight: 0.000002, + }, + { + ID: 985, + Time: 98.4, + Weight: 0.000002, + }, + { + ID: 986, + Time: 98.5, + Weight: 0.000002, + }, + { + ID: 987, + Time: 98.6, + Weight: 0.000002, + }, + { + ID: 988, + Time: 98.7, + Weight: 0.000002, + }, + { + ID: 989, + Time: 98.8, + Weight: 0.000002, + }, + { + ID: 990, + Time: 98.9, + Weight: 0.000002, + }, + { + ID: 991, + Time: 99, + Weight: 0.000002, + }, + { + ID: 992, + Time: 99.1, + Weight: 0.000002, + }, + { + ID: 993, + Time: 99.2, + Weight: 0.000002, + }, + { + ID: 994, + Time: 99.3, + Weight: 0.000002, + }, + { + ID: 995, + Time: 99.4, + Weight: 0.000002, + }, + { + ID: 996, + Time: 99.5, + Weight: 0.000002, + }, + { + ID: 997, + Time: 99.6, + Weight: 0.000002, + }, + { + ID: 998, + Time: 99.7, + Weight: 0.000002, + }, + { + ID: 999, + Time: 99.8, + Weight: 0.000002, + }, + { + ID: 1000, + Time: 99.9, + Weight: 0.000002, + }, + { + ID: 1001, + Time: 100, + Weight: 0.00023, + }, + } + + TestReelBaseSpinRange = [][]int64{ + {3, 3, 3}, + } + + TestReelBaseSpinReel = [][]int64{ + {1, 1, 1}, + {1, 1, 1}, + {1, 1, 1}, + } + + TestReelBaseSpinWeight = [][]float64{ + {1, 1, 1}, + {1, 1, 1}, + {1, 1, 1}, + } + + TestSymbol = map[int64]*structs.TestSymbol{ + 1: { + ID: 1, + Name: "xx", + IsWild: false, + Group: []int64{1}, + PayRate: []int64{0, 0, 0}, + ClientOrder: 1, + ClientDsc: "", + }, + } + + TestSymbolBetRatio = []*structs.TestSymbolBetRatio{ + { + BetRatio: 1, + }, + } + +} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/var.go b/gamesrv/slotspkg/internal/exported/excel2go/base/var.go new file mode 100644 index 0000000..b4d8915 --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/var.go @@ -0,0 +1,265 @@ +// +package base + +import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + +var ( + CashManiaBetBetChangeList = map[int64]*structs.CashManiaBetBetChangeList{} + CashManiaBetBetLevel = map[int64]*structs.CashManiaBetBetLevel{} + CashManiaBetBetLine = map[int64]*structs.CashManiaBetBetLine{} + CashManiaBetBetSize = map[int64]*structs.CashManiaBetBetSize{} + CashManiaBetFirstBet = map[int64]*structs.CashManiaBetFirstBet{} + CashManiaFormation = []*structs.CashManiaFormation{} + CashManiaMapRTPMode = map[int64]*structs.CashManiaMapRTPMode{} + CashManiaMidItemInfo = map[int64]*structs.CashManiaMidItemInfo{} + CashManiaOthers = []*structs.CashManiaOthers{} + CashManiaRandomItemWeight = []*structs.CashManiaRandomItemWeight{} + CashManiaRandomMidWeight = []*structs.CashManiaRandomMidWeight{} + CashManiaReelBaseSpinRange = [][]int64{} + CashManiaReelBaseSpinReel = [][]int64{} + CashManiaReelBaseSpinWeight = [][]float64{} + CashManiaSymbolBetRatio = []*structs.CashManiaSymbolBetRatio{} + CashManiaSymbol = map[int64]*structs.CashManiaSymbol{} + CashManiaWinItemWeight = []*structs.CashManiaWinItemWeight{} + CashManiaWinMidWeight = []*structs.CashManiaWinMidWeight{} + FortuneDragonBaseMultiplier = []*structs.FortuneDragonBaseMultiplier{} + FortuneDragonBetBetChangeList = map[int64]*structs.FortuneDragonBetBetChangeList{} + FortuneDragonBetBetLevel = map[int64]*structs.FortuneDragonBetBetLevel{} + FortuneDragonBetBetLine = map[int64]*structs.FortuneDragonBetBetLine{} + FortuneDragonBetBetSize = map[int64]*structs.FortuneDragonBetBetSize{} + FortuneDragonBetFirstBet = map[int64]*structs.FortuneDragonBetFirstBet{} + FortuneDragonFormation = []*structs.FortuneDragonFormation{} + FortuneDragonFreeMultiplier = []*structs.FortuneDragonFreeMultiplier{} + FortuneDragonFreeMultiplierCount = []*structs.FortuneDragonFreeMultiplierCount{} + FortuneDragonMapRTPMode = map[int64]*structs.FortuneDragonMapRTPMode{} + FortuneDragonOthers = []*structs.FortuneDragonOthers{} + FortuneDragonReelBaseSpinRange = [][]int64{} + FortuneDragonReelBaseSpinReel = [][]int64{} + FortuneDragonReelBaseSpinWeight = [][]float64{} + FortuneDragonReelFreeSpinRange = [][]int64{} + FortuneDragonReelFreeSpinReel = [][]int64{} + FortuneDragonReelFreeSpinWeight = [][]float64{} + FortuneDragonReelSureWinBaseSpinRange = [][]int64{} + FortuneDragonReelSureWinBaseSpinReel = [][]int64{} + FortuneDragonReelSureWinBaseSpinWeight = [][]float64{} + FortuneDragonReelSureWinFreeSpinRange = [][]int64{} + FortuneDragonReelSureWinFreeSpinReel = [][]int64{} + FortuneDragonReelSureWinFreeSpinWeight = [][]float64{} + FortuneDragonSymbolBetRatio = []*structs.FortuneDragonSymbolBetRatio{} + FortuneDragonSymbol = map[int64]*structs.FortuneDragonSymbol{} + FortuneMouseBetBetChangeList = map[int64]*structs.FortuneMouseBetBetChangeList{} + FortuneMouseBetBetLevel = map[int64]*structs.FortuneMouseBetBetLevel{} + FortuneMouseBetBetLine = map[int64]*structs.FortuneMouseBetBetLine{} + FortuneMouseBetBetSize = map[int64]*structs.FortuneMouseBetBetSize{} + FortuneMouseBetFirstBet = map[int64]*structs.FortuneMouseBetFirstBet{} + FortuneMouseFormation = []*structs.FortuneMouseFormation{} + FortuneMouseMapRTPMode = map[int64]*structs.FortuneMouseMapRTPMode{} + FortuneMouseOthers = []*structs.FortuneMouseOthers{} + FortuneMouseReelBaseSpinRange = [][]int64{} + FortuneMouseReelBaseSpinReel = [][]int64{} + FortuneMouseReelBaseSpinWeight = [][]float64{} + FortuneMouseReelReSpinRange = [][]int64{} + FortuneMouseReelReSpinReel = [][]int64{} + FortuneMouseReelReSpinWeight = [][]float64{} + FortuneMouseSuperStackWeight = []*structs.FortuneMouseSuperStackWeight{} + FortuneMouseSymbolBetRatio = []*structs.FortuneMouseSymbolBetRatio{} + FortuneMouseSymbol = map[int64]*structs.FortuneMouseSymbol{} + FortuneOxBetBetChangeList = map[int64]*structs.FortuneOxBetBetChangeList{} + FortuneOxBetBetLevel = map[int64]*structs.FortuneOxBetBetLevel{} + FortuneOxBetBetLine = map[int64]*structs.FortuneOxBetBetLine{} + FortuneOxBetBetSize = map[int64]*structs.FortuneOxBetBetSize{} + FortuneOxBetFirstBet = map[int64]*structs.FortuneOxBetFirstBet{} + FortuneOxFormation = []*structs.FortuneOxFormation{} + FortuneOxMapRTPMode = map[int64]*structs.FortuneOxMapRTPMode{} + FortuneOxOthers = []*structs.FortuneOxOthers{} + FortuneOxReelBaseSpinRange = [][]int64{} + FortuneOxReelBaseSpinReel = [][]int64{} + FortuneOxReelBaseSpinWeight = [][]float64{} + FortuneOxReelReSpinRange = [][]int64{} + FortuneOxReelReSpinReel = [][]int64{} + FortuneOxReelReSpinWeight = [][]float64{} + FortuneOxSuperStack1Weight = []*structs.FortuneOxSuperStack1Weight{} + FortuneOxSuperStack2Weight = []*structs.FortuneOxSuperStack2Weight{} + FortuneOxSymbolBetRatio = []*structs.FortuneOxSymbolBetRatio{} + FortuneOxSymbol = map[int64]*structs.FortuneOxSymbol{} + FortuneRabbitBetBetChangeList = map[int64]*structs.FortuneRabbitBetBetChangeList{} + FortuneRabbitBetBetLevel = map[int64]*structs.FortuneRabbitBetBetLevel{} + FortuneRabbitBetBetLine = map[int64]*structs.FortuneRabbitBetBetLine{} + FortuneRabbitBetBetSize = map[int64]*structs.FortuneRabbitBetBetSize{} + FortuneRabbitBetFirstBet = map[int64]*structs.FortuneRabbitBetFirstBet{} + FortuneRabbitCashPrizeWeight = []*structs.FortuneRabbitCashPrizeWeight{} + FortuneRabbitForceCashCountWeight = []*structs.FortuneRabbitForceCashCountWeight{} + FortuneRabbitFormation = []*structs.FortuneRabbitFormation{} + FortuneRabbitMapRTPMode = map[int64]*structs.FortuneRabbitMapRTPMode{} + FortuneRabbitOthers = []*structs.FortuneRabbitOthers{} + FortuneRabbitOthersRTP120 = []*structs.FortuneRabbitOthersRTP120{} + FortuneRabbitOthersRTP80 = []*structs.FortuneRabbitOthersRTP80{} + FortuneRabbitReelBaseSpinRange = [][]int64{} + FortuneRabbitReelBaseSpinReel = [][]int64{} + FortuneRabbitReelBaseSpinWeight = [][]float64{} + FortuneRabbitReelFreeSpinRange = [][]int64{} + FortuneRabbitReelFreeSpinReel = [][]int64{} + FortuneRabbitReelFreeSpinWeight = [][]float64{} + FortuneRabbitSymbolBetRatio = []*structs.FortuneRabbitSymbolBetRatio{} + FortuneRabbitSymbol = map[int64]*structs.FortuneRabbitSymbol{} + FortuneTigerBetBetChangeList = map[int64]*structs.FortuneTigerBetBetChangeList{} + FortuneTigerBetBetLevel = map[int64]*structs.FortuneTigerBetBetLevel{} + FortuneTigerBetBetLine = map[int64]*structs.FortuneTigerBetBetLine{} + FortuneTigerBetBetSize = map[int64]*structs.FortuneTigerBetBetSize{} + FortuneTigerBetFirstBet = map[int64]*structs.FortuneTigerBetFirstBet{} + FortuneTigerFormation = []*structs.FortuneTigerFormation{} + FortuneTigerMapRTPMode = map[int64]*structs.FortuneTigerMapRTPMode{} + FortuneTigerOthers = []*structs.FortuneTigerOthers{} + FortuneTigerReelBaseSpinRange = [][]int64{} + FortuneTigerReelBaseSpinReel = [][]int64{} + FortuneTigerReelBaseSpinWeight = [][]float64{} + FortuneTigerReelReSpinRange = [][]int64{} + FortuneTigerReelReSpinReel = [][]int64{} + FortuneTigerReelReSpinWeight = [][]float64{} + FortuneTigerSuperStackWeight = []*structs.FortuneTigerSuperStackWeight{} + FortuneTigerSymbolBetRatio = []*structs.FortuneTigerSymbolBetRatio{} + FortuneTigerSymbol = map[int64]*structs.FortuneTigerSymbol{} + GateofOlympusBetBetChangeList = map[int64]*structs.GateofOlympusBetBetChangeList{} + GateofOlympusBetBetLevel = map[int64]*structs.GateofOlympusBetBetLevel{} + GateofOlympusBetBetLine = map[int64]*structs.GateofOlympusBetBetLine{} + GateofOlympusBetBetSize = map[int64]*structs.GateofOlympusBetBetSize{} + GateofOlympusBetFirstBet = map[int64]*structs.GateofOlympusBetFirstBet{} + GateofOlympusFormation = []*structs.GateofOlympusFormation{} + GateofOlympusMapRTPMode = map[int64]*structs.GateofOlympusMapRTPMode{} + GateofOlympusMultiplier = []*structs.GateofOlympusMultiplier{} + GateofOlympusMultiplierKeyID = map[int64]*structs.GateofOlympusMultiplierKeyID{} + GateofOlympusReelBaseSpin1Range = [][]int64{} + GateofOlympusReelBaseSpin1Reel = [][]int64{} + GateofOlympusReelBaseSpin1Weight = [][]float64{} + GateofOlympusReelBaseSpin2Range = [][]int64{} + GateofOlympusReelBaseSpin2Reel = [][]int64{} + GateofOlympusReelBaseSpin2Weight = [][]float64{} + GateofOlympusReelBaseSpin3Range = [][]int64{} + GateofOlympusReelBaseSpin3Reel = [][]int64{} + GateofOlympusReelBaseSpin3Weight = [][]float64{} + GateofOlympusReelBaseSpin7Range = [][]int64{} + GateofOlympusReelBaseSpin7Reel = [][]int64{} + GateofOlympusReelBaseSpin7Weight = [][]float64{} + GateofOlympusReelBaseSpin8Range = [][]int64{} + GateofOlympusReelBaseSpin8Reel = [][]int64{} + GateofOlympusReelBaseSpin8Weight = [][]float64{} + GateofOlympusReelBaseSpinRange = [][]int64{} + GateofOlympusReelBaseSpinReel = [][]int64{} + GateofOlympusReelBaseSpinWeight = [][]float64{} + GateofOlympusReelChoose = []*structs.GateofOlympusReelChoose{} + GateofOlympusReelFreeSpin4Range = [][]int64{} + GateofOlympusReelFreeSpin4Reel = [][]int64{} + GateofOlympusReelFreeSpin4Weight = [][]float64{} + GateofOlympusReelFreeSpin5Range = [][]int64{} + GateofOlympusReelFreeSpin5Reel = [][]int64{} + GateofOlympusReelFreeSpin5Weight = [][]float64{} + GateofOlympusReelFreeSpinRange = [][]int64{} + GateofOlympusReelFreeSpinReel = [][]int64{} + GateofOlympusReelFreeSpinWeight = [][]float64{} + GateofOlympusScatter = map[int64]*structs.GateofOlympusScatter{} + GateofOlympusSymbolBetRatio = []*structs.GateofOlympusSymbolBetRatio{} + GateofOlympusSymbol = map[int64]*structs.GateofOlympusSymbol{} + MatrixFeaturesForm15X1TypeA = []*structs.MatrixFeaturesForm15X1TypeA{} + MatrixFeaturesForm19X1TypeA = []*structs.MatrixFeaturesForm19X1TypeA{} + MatrixFeaturesForm20X1TypeA = []*structs.MatrixFeaturesForm20X1TypeA{} + MatrixFeaturesForm25X1TypeA = []*structs.MatrixFeaturesForm25X1TypeA{} + MatrixFeaturesForm30X1TypeA = []*structs.MatrixFeaturesForm30X1TypeA{} + MatrixFeaturesForm35X1TypeA = []*structs.MatrixFeaturesForm35X1TypeA{} + MatrixFeaturesForm40X1 = []*structs.MatrixFeaturesForm40X1{} + MatrixFeaturesForm40X1TypeA = []*structs.MatrixFeaturesForm40X1TypeA{} + MatrixFeaturesForm7X1TypeA = []*structs.MatrixFeaturesForm7X1TypeA{} + MatrixLine100Form12X5TypeA = []*structs.MatrixLine100Form12X5TypeA{} + MatrixLine100Form6X5TypeA = []*structs.MatrixLine100Form6X5TypeA{} + MatrixLine10Form343TypeA = []*structs.MatrixLine10Form343TypeA{} + MatrixLine10Form3X5TypeA = []*structs.MatrixLine10Form3X5TypeA{} + MatrixLine1Form3X3TypeA = []*structs.MatrixLine1Form3X3TypeA{} + MatrixLine1Form3X3TypeB = []*structs.MatrixLine1Form3X3TypeB{} + MatrixLine1Form5X5TypeA = []*structs.MatrixLine1Form5X5TypeA{} + MatrixLine20Form3X5TypeA = []*structs.MatrixLine20Form3X5TypeA{} + MatrixLine25Form36666TypeA = []*structs.MatrixLine25Form36666TypeA{} + MatrixLine25Form3X5TypeA = []*structs.MatrixLine25Form3X5TypeA{} + MatrixLine25Form3X5TypeB = []*structs.MatrixLine25Form3X5TypeB{} + MatrixLine25Form3X5TypeC = []*structs.MatrixLine25Form3X5TypeC{} + MatrixLine25Form3X5TypeD = []*structs.MatrixLine25Form3X5TypeD{} + MatrixLine25Form3X5TypeE = []*structs.MatrixLine25Form3X5TypeE{} + MatrixLine30Form3X5TypeA = []*structs.MatrixLine30Form3X5TypeA{} + MatrixLine30Form3X5TypeB = []*structs.MatrixLine30Form3X5TypeB{} + MatrixLine30Form3X5TypeC = []*structs.MatrixLine30Form3X5TypeC{} + MatrixLine30Form3X5TypeD = []*structs.MatrixLine30Form3X5TypeD{} + MatrixLine30Form3X5TypeE = []*structs.MatrixLine30Form3X5TypeE{} + MatrixLine30Form3X6TypeA = []*structs.MatrixLine30Form3X6TypeA{} + MatrixLine30Form4X5TypeA = []*structs.MatrixLine30Form4X5TypeA{} + MatrixLine30Form4X5TypeB = []*structs.MatrixLine30Form4X5TypeB{} + MatrixLine3Form3X3TypeA = []*structs.MatrixLine3Form3X3TypeA{} + MatrixLine40Form34543TypeA = []*structs.MatrixLine40Form34543TypeA{} + MatrixLine40Form3X5TypeA = []*structs.MatrixLine40Form3X5TypeA{} + MatrixLine40Form3X5TypeB = []*structs.MatrixLine40Form3X5TypeB{} + MatrixLine40Form3X5TypeC = []*structs.MatrixLine40Form3X5TypeC{} + MatrixLine40Form3X5TypeD = []*structs.MatrixLine40Form3X5TypeD{} + MatrixLine40Form4X5TypeA = []*structs.MatrixLine40Form4X5TypeA{} + MatrixLine40Form4X5TypeB = []*structs.MatrixLine40Form4X5TypeB{} + MatrixLine40Form4X5TypeC = []*structs.MatrixLine40Form4X5TypeC{} + MatrixLine40Form4X6TypeA = []*structs.MatrixLine40Form4X6TypeA{} + MatrixLine50Form3X5TypeA = []*structs.MatrixLine50Form3X5TypeA{} + MatrixLine50Form3X5TypeB = []*structs.MatrixLine50Form3X5TypeB{} + MatrixLine50Form3X5TypeC = []*structs.MatrixLine50Form3X5TypeC{} + MatrixLine50Form3X5TypeD = []*structs.MatrixLine50Form3X5TypeD{} + MatrixLine50Form3X5TypeE = []*structs.MatrixLine50Form3X5TypeE{} + MatrixLine50Form3X5TypeF = []*structs.MatrixLine50Form3X5TypeF{} + MatrixLine50Form3X5TypeG = []*structs.MatrixLine50Form3X5TypeG{} + MatrixLine50Form3X5TypeH = []*structs.MatrixLine50Form3X5TypeH{} + MatrixLine50Form45454TypeA = []*structs.MatrixLine50Form45454TypeA{} + MatrixLine50Form4X5TypeA = []*structs.MatrixLine50Form4X5TypeA{} + MatrixLine50Form4X5TypeB = []*structs.MatrixLine50Form4X5TypeB{} + MatrixLine50Form4X5TypeC = []*structs.MatrixLine50Form4X5TypeC{} + MatrixLine50Form4X5TypeD = []*structs.MatrixLine50Form4X5TypeD{} + MatrixLine50Form4X5TypeE = []*structs.MatrixLine50Form4X5TypeE{} + MatrixLine50Form4X5TypeF = []*structs.MatrixLine50Form4X5TypeF{} + MatrixLine50Form4X6TypeA = []*structs.MatrixLine50Form4X6TypeA{} + MatrixLine50Form5X5TypeA = []*structs.MatrixLine50Form5X5TypeA{} + MatrixLine50Form5X5TypeB = []*structs.MatrixLine50Form5X5TypeB{} + MatrixLine50Form5X5TypeC = []*structs.MatrixLine50Form5X5TypeC{} + MatrixLine50Form6X5TypeA = []*structs.MatrixLine50Form6X5TypeA{} + MatrixLine5Form3X3TypeA = []*structs.MatrixLine5Form3X3TypeA{} + MatrixLine5Form3X3TypeB = []*structs.MatrixLine5Form3X3TypeB{} + MatrixLine60Form33633TypeA = []*structs.MatrixLine60Form33633TypeA{} + MatrixLine60Form8X5TypeA = []*structs.MatrixLine60Form8X5TypeA{} + MatrixLine65Form6X5TypeA = []*structs.MatrixLine65Form6X5TypeA{} + MatrixLine70Form9X5TypeA = []*structs.MatrixLine70Form9X5TypeA{} + MatrixLine75Form5X6TypeA = []*structs.MatrixLine75Form5X6TypeA{} + MatrixLine75Form6X5TypeA = []*structs.MatrixLine75Form6X5TypeA{} + MatrixLine80Form10X5TypeA = []*structs.MatrixLine80Form10X5TypeA{} + MatrixLine80Form3X5TypeA = []*structs.MatrixLine80Form3X5TypeA{} + MatrixLine80Form4X6TypeA = []*structs.MatrixLine80Form4X6TypeA{} + MatrixLine80Form7X5TypeA = []*structs.MatrixLine80Form7X5TypeA{} + MatrixLine90Form11X5TypeA = []*structs.MatrixLine90Form11X5TypeA{} + MatrixLine95Form8X5TypeA = []*structs.MatrixLine95Form8X5TypeA{} + MatrixMatchForm7X7TypeA = []*structs.MatrixMatchForm7X7TypeA{} + MatrixSameForm5X6TypeA = []*structs.MatrixSameForm5X6TypeA{} + MatrixSameForm5X6TypeB = []*structs.MatrixSameForm5X6TypeB{} + MatrixWaysForm333331 = []*structs.MatrixWaysForm333331{} + MatrixWaysForm33555 = []*structs.MatrixWaysForm33555{} + MatrixWaysForm344444 = []*structs.MatrixWaysForm344444{} + MatrixWaysForm3X5TypeA = []*structs.MatrixWaysForm3X5TypeA{} + MatrixWaysForm44668 = []*structs.MatrixWaysForm44668{} + MatrixWaysForm4X5TypeA = []*structs.MatrixWaysForm4X5TypeA{} + MatrixWaysForm4X5TypeB = []*structs.MatrixWaysForm4X5TypeB{} + OptGroup = []*structs.OptGroup{} + PrizeModelPrizeModelTypeA = map[int64]*structs.PrizeModelPrizeModelTypeA{} + PrizeModelPrizeModelTypeB = map[int64]*structs.PrizeModelPrizeModelTypeB{} + SimulatorFSMultiLevel = []*structs.SimulatorFSMultiLevel{} + SimulatorMultiLevel = []*structs.SimulatorMultiLevel{} + TestBetBetChangeList = map[int64]*structs.TestBetBetChangeList{} + TestBetBetLevel = map[int64]*structs.TestBetBetLevel{} + TestBetBetLine = map[int64]*structs.TestBetBetLine{} + TestBetBetSize = map[int64]*structs.TestBetBetSize{} + TestBetFirstBet = map[int64]*structs.TestBetFirstBet{} + TestFormation = []*structs.TestFormation{} + TestMapRTPMode = map[int64]*structs.TestMapRTPMode{} + TestRandomWeight = []*structs.TestRandomWeight{} + TestReelBaseSpinRange = [][]int64{} + TestReelBaseSpinReel = [][]int64{} + TestReelBaseSpinWeight = [][]float64{} + TestSymbolBetRatio = []*structs.TestSymbolBetRatio{} + TestSymbol = map[int64]*structs.TestSymbol{} +) diff --git a/gamesrv/slotspkg/internal/exported/excel2go/storage/storage.go b/gamesrv/slotspkg/internal/exported/excel2go/storage/storage.go new file mode 100644 index 0000000..f3b919a --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/storage/storage.go @@ -0,0 +1,723 @@ +// +package storage + +import ( + "encoding/json" + "qstar_server/internal/exported/excel2go/base" + "strings" +) + +var Storage = make(map[string]map[string]map[string]interface{}) +var OriginStorage = make(map[string]map[string]map[string]interface{}) + +var Categories = []string{ + "Base", + "Bet365", + "Bet365_A", + "Bet365_B", + "Bet365_C", + "Bet365_D", + "Bet365_E", + "Bet365_F", + "Bet365_G", + "Blaze", + "Blaze_A", + "Blaze_B", + "Blaze_C", + "Blaze_D", + "Blaze_E", + "Blaze_F", + "Blaze_G", + "Brabet", + "Brabet_A", + "Brabet_B", + "Brabet_C", + "Brabet_D", + "Brabet_E", + "Brabet_F", + "Brabet_G", + "Futemax", + "Futemax_A", + "Futemax_B", + "Futemax_C", + "Futemax_D", + "Futemax_E", + "Futemax_F", + "Futemax_G", + "Pixbet", + "Pixbet_A", + "Pixbet_B", + "Pixbet_C", + "Pixbet_D", + "Pixbet_E", + "Pixbet_F", + "Pixbet_G", + "Stake", + "Stake_A", + "Stake_B", + "Stake_C", + "Stake_D", + "Stake_E", + "Stake_F", + "Stake_G", +} + +func StoragesLoading(data map[string]string) { + Load(data, "Base.CashMania/Bet.BetChangeList", &base.CashManiaBetBetChangeList) + Load(data, "Base.CashMania/Bet.BetLevel", &base.CashManiaBetBetLevel) + Load(data, "Base.CashMania/Bet.BetLine", &base.CashManiaBetBetLine) + Load(data, "Base.CashMania/Bet.BetSize", &base.CashManiaBetBetSize) + Load(data, "Base.CashMania/Bet.FirstBet", &base.CashManiaBetFirstBet) + Load(data, "Base.CashMania/Formation.Default", &base.CashManiaFormation) + Load(data, "Base.CashMania/Map.RTPMode", &base.CashManiaMapRTPMode) + Load(data, "Base.CashMania/MidItemInfo.Default", &base.CashManiaMidItemInfo) + Load(data, "Base.CashMania/Others.Default", &base.CashManiaOthers) + Load(data, "Base.CashMania/RandomItem.Weight", &base.CashManiaRandomItemWeight) + Load(data, "Base.CashMania/RandomMid.Weight", &base.CashManiaRandomMidWeight) + Load(data, "Base.CashMania/ReelBaseSpin.Range", &base.CashManiaReelBaseSpinRange) + Load(data, "Base.CashMania/ReelBaseSpin.Reel", &base.CashManiaReelBaseSpinReel) + Load(data, "Base.CashMania/ReelBaseSpin.Weight", &base.CashManiaReelBaseSpinWeight) + Load(data, "Base.CashMania/Symbol.BetRatio", &base.CashManiaSymbolBetRatio) + Load(data, "Base.CashMania/Symbol.Default", &base.CashManiaSymbol) + Load(data, "Base.CashMania/WinItem.Weight", &base.CashManiaWinItemWeight) + Load(data, "Base.CashMania/WinMid.Weight", &base.CashManiaWinMidWeight) + Load(data, "Base.FortuneDragon/BaseMultiplier.Default", &base.FortuneDragonBaseMultiplier) + Load(data, "Base.FortuneDragon/Bet.BetChangeList", &base.FortuneDragonBetBetChangeList) + Load(data, "Base.FortuneDragon/Bet.BetLevel", &base.FortuneDragonBetBetLevel) + Load(data, "Base.FortuneDragon/Bet.BetLine", &base.FortuneDragonBetBetLine) + Load(data, "Base.FortuneDragon/Bet.BetSize", &base.FortuneDragonBetBetSize) + Load(data, "Base.FortuneDragon/Bet.FirstBet", &base.FortuneDragonBetFirstBet) + Load(data, "Base.FortuneDragon/Formation.Default", &base.FortuneDragonFormation) + Load(data, "Base.FortuneDragon/FreeMultiplier.Default", &base.FortuneDragonFreeMultiplier) + Load(data, "Base.FortuneDragon/FreeMultiplierCount.Default", &base.FortuneDragonFreeMultiplierCount) + Load(data, "Base.FortuneDragon/Map.RTPMode", &base.FortuneDragonMapRTPMode) + Load(data, "Base.FortuneDragon/Others.Default", &base.FortuneDragonOthers) + Load(data, "Base.FortuneDragon/ReelBaseSpin.Range", &base.FortuneDragonReelBaseSpinRange) + Load(data, "Base.FortuneDragon/ReelBaseSpin.Reel", &base.FortuneDragonReelBaseSpinReel) + Load(data, "Base.FortuneDragon/ReelBaseSpin.Weight", &base.FortuneDragonReelBaseSpinWeight) + Load(data, "Base.FortuneDragon/ReelFreeSpin.Range", &base.FortuneDragonReelFreeSpinRange) + Load(data, "Base.FortuneDragon/ReelFreeSpin.Reel", &base.FortuneDragonReelFreeSpinReel) + Load(data, "Base.FortuneDragon/ReelFreeSpin.Weight", &base.FortuneDragonReelFreeSpinWeight) + Load(data, "Base.FortuneDragon/ReelSureWinBaseSpin.Range", &base.FortuneDragonReelSureWinBaseSpinRange) + Load(data, "Base.FortuneDragon/ReelSureWinBaseSpin.Reel", &base.FortuneDragonReelSureWinBaseSpinReel) + Load(data, "Base.FortuneDragon/ReelSureWinBaseSpin.Weight", &base.FortuneDragonReelSureWinBaseSpinWeight) + Load(data, "Base.FortuneDragon/ReelSureWinFreeSpin.Range", &base.FortuneDragonReelSureWinFreeSpinRange) + Load(data, "Base.FortuneDragon/ReelSureWinFreeSpin.Reel", &base.FortuneDragonReelSureWinFreeSpinReel) + Load(data, "Base.FortuneDragon/ReelSureWinFreeSpin.Weight", &base.FortuneDragonReelSureWinFreeSpinWeight) + Load(data, "Base.FortuneDragon/Symbol.BetRatio", &base.FortuneDragonSymbolBetRatio) + Load(data, "Base.FortuneDragon/Symbol.Default", &base.FortuneDragonSymbol) + Load(data, "Base.FortuneMouse/Bet.BetChangeList", &base.FortuneMouseBetBetChangeList) + Load(data, "Base.FortuneMouse/Bet.BetLevel", &base.FortuneMouseBetBetLevel) + Load(data, "Base.FortuneMouse/Bet.BetLine", &base.FortuneMouseBetBetLine) + Load(data, "Base.FortuneMouse/Bet.BetSize", &base.FortuneMouseBetBetSize) + Load(data, "Base.FortuneMouse/Bet.FirstBet", &base.FortuneMouseBetFirstBet) + Load(data, "Base.FortuneMouse/Formation.Default", &base.FortuneMouseFormation) + Load(data, "Base.FortuneMouse/Map.RTPMode", &base.FortuneMouseMapRTPMode) + Load(data, "Base.FortuneMouse/Others.Default", &base.FortuneMouseOthers) + Load(data, "Base.FortuneMouse/ReelBaseSpin.Range", &base.FortuneMouseReelBaseSpinRange) + Load(data, "Base.FortuneMouse/ReelBaseSpin.Reel", &base.FortuneMouseReelBaseSpinReel) + Load(data, "Base.FortuneMouse/ReelBaseSpin.Weight", &base.FortuneMouseReelBaseSpinWeight) + Load(data, "Base.FortuneMouse/ReelReSpin.Range", &base.FortuneMouseReelReSpinRange) + Load(data, "Base.FortuneMouse/ReelReSpin.Reel", &base.FortuneMouseReelReSpinReel) + Load(data, "Base.FortuneMouse/ReelReSpin.Weight", &base.FortuneMouseReelReSpinWeight) + Load(data, "Base.FortuneMouse/SuperStack.Weight", &base.FortuneMouseSuperStackWeight) + Load(data, "Base.FortuneMouse/Symbol.BetRatio", &base.FortuneMouseSymbolBetRatio) + Load(data, "Base.FortuneMouse/Symbol.Default", &base.FortuneMouseSymbol) + Load(data, "Base.FortuneOx/Bet.BetChangeList", &base.FortuneOxBetBetChangeList) + Load(data, "Base.FortuneOx/Bet.BetLevel", &base.FortuneOxBetBetLevel) + Load(data, "Base.FortuneOx/Bet.BetLine", &base.FortuneOxBetBetLine) + Load(data, "Base.FortuneOx/Bet.BetSize", &base.FortuneOxBetBetSize) + Load(data, "Base.FortuneOx/Bet.FirstBet", &base.FortuneOxBetFirstBet) + Load(data, "Base.FortuneOx/Formation.Default", &base.FortuneOxFormation) + Load(data, "Base.FortuneOx/Map.RTPMode", &base.FortuneOxMapRTPMode) + Load(data, "Base.FortuneOx/Others.Default", &base.FortuneOxOthers) + Load(data, "Base.FortuneOx/ReelBaseSpin.Range", &base.FortuneOxReelBaseSpinRange) + Load(data, "Base.FortuneOx/ReelBaseSpin.Reel", &base.FortuneOxReelBaseSpinReel) + Load(data, "Base.FortuneOx/ReelBaseSpin.Weight", &base.FortuneOxReelBaseSpinWeight) + Load(data, "Base.FortuneOx/ReelReSpin.Range", &base.FortuneOxReelReSpinRange) + Load(data, "Base.FortuneOx/ReelReSpin.Reel", &base.FortuneOxReelReSpinReel) + Load(data, "Base.FortuneOx/ReelReSpin.Weight", &base.FortuneOxReelReSpinWeight) + Load(data, "Base.FortuneOx/SuperStack1.Weight", &base.FortuneOxSuperStack1Weight) + Load(data, "Base.FortuneOx/SuperStack2.Weight", &base.FortuneOxSuperStack2Weight) + Load(data, "Base.FortuneOx/Symbol.BetRatio", &base.FortuneOxSymbolBetRatio) + Load(data, "Base.FortuneOx/Symbol.Default", &base.FortuneOxSymbol) + Load(data, "Base.FortuneRabbit/Bet.BetChangeList", &base.FortuneRabbitBetBetChangeList) + Load(data, "Base.FortuneRabbit/Bet.BetLevel", &base.FortuneRabbitBetBetLevel) + Load(data, "Base.FortuneRabbit/Bet.BetLine", &base.FortuneRabbitBetBetLine) + Load(data, "Base.FortuneRabbit/Bet.BetSize", &base.FortuneRabbitBetBetSize) + Load(data, "Base.FortuneRabbit/Bet.FirstBet", &base.FortuneRabbitBetFirstBet) + Load(data, "Base.FortuneRabbit/CashPrizeWeight.Default", &base.FortuneRabbitCashPrizeWeight) + Load(data, "Base.FortuneRabbit/ForceCashCountWeight.Default", &base.FortuneRabbitForceCashCountWeight) + Load(data, "Base.FortuneRabbit/Formation.Default", &base.FortuneRabbitFormation) + Load(data, "Base.FortuneRabbit/Map.RTPMode", &base.FortuneRabbitMapRTPMode) + Load(data, "Base.FortuneRabbit/Others.Default", &base.FortuneRabbitOthers) + Load(data, "Base.FortuneRabbit/Others.RTP120", &base.FortuneRabbitOthersRTP120) + Load(data, "Base.FortuneRabbit/Others.RTP80", &base.FortuneRabbitOthersRTP80) + Load(data, "Base.FortuneRabbit/ReelBaseSpin.Range", &base.FortuneRabbitReelBaseSpinRange) + Load(data, "Base.FortuneRabbit/ReelBaseSpin.Reel", &base.FortuneRabbitReelBaseSpinReel) + Load(data, "Base.FortuneRabbit/ReelBaseSpin.Weight", &base.FortuneRabbitReelBaseSpinWeight) + Load(data, "Base.FortuneRabbit/ReelFreeSpin.Range", &base.FortuneRabbitReelFreeSpinRange) + Load(data, "Base.FortuneRabbit/ReelFreeSpin.Reel", &base.FortuneRabbitReelFreeSpinReel) + Load(data, "Base.FortuneRabbit/ReelFreeSpin.Weight", &base.FortuneRabbitReelFreeSpinWeight) + Load(data, "Base.FortuneRabbit/Symbol.BetRatio", &base.FortuneRabbitSymbolBetRatio) + Load(data, "Base.FortuneRabbit/Symbol.Default", &base.FortuneRabbitSymbol) + Load(data, "Base.FortuneTiger/Bet.BetChangeList", &base.FortuneTigerBetBetChangeList) + Load(data, "Base.FortuneTiger/Bet.BetLevel", &base.FortuneTigerBetBetLevel) + Load(data, "Base.FortuneTiger/Bet.BetLine", &base.FortuneTigerBetBetLine) + Load(data, "Base.FortuneTiger/Bet.BetSize", &base.FortuneTigerBetBetSize) + Load(data, "Base.FortuneTiger/Bet.FirstBet", &base.FortuneTigerBetFirstBet) + Load(data, "Base.FortuneTiger/Formation.Default", &base.FortuneTigerFormation) + Load(data, "Base.FortuneTiger/Map.RTPMode", &base.FortuneTigerMapRTPMode) + Load(data, "Base.FortuneTiger/Others.Default", &base.FortuneTigerOthers) + Load(data, "Base.FortuneTiger/ReelBaseSpin.Range", &base.FortuneTigerReelBaseSpinRange) + Load(data, "Base.FortuneTiger/ReelBaseSpin.Reel", &base.FortuneTigerReelBaseSpinReel) + Load(data, "Base.FortuneTiger/ReelBaseSpin.Weight", &base.FortuneTigerReelBaseSpinWeight) + Load(data, "Base.FortuneTiger/ReelReSpin.Range", &base.FortuneTigerReelReSpinRange) + Load(data, "Base.FortuneTiger/ReelReSpin.Reel", &base.FortuneTigerReelReSpinReel) + Load(data, "Base.FortuneTiger/ReelReSpin.Weight", &base.FortuneTigerReelReSpinWeight) + Load(data, "Base.FortuneTiger/SuperStack.Weight", &base.FortuneTigerSuperStackWeight) + Load(data, "Base.FortuneTiger/Symbol.BetRatio", &base.FortuneTigerSymbolBetRatio) + Load(data, "Base.FortuneTiger/Symbol.Default", &base.FortuneTigerSymbol) + Load(data, "Base.GateofOlympus/Bet.BetChangeList", &base.GateofOlympusBetBetChangeList) + Load(data, "Base.GateofOlympus/Bet.BetLevel", &base.GateofOlympusBetBetLevel) + Load(data, "Base.GateofOlympus/Bet.BetLine", &base.GateofOlympusBetBetLine) + Load(data, "Base.GateofOlympus/Bet.BetSize", &base.GateofOlympusBetBetSize) + Load(data, "Base.GateofOlympus/Bet.FirstBet", &base.GateofOlympusBetFirstBet) + Load(data, "Base.GateofOlympus/Formation.Default", &base.GateofOlympusFormation) + Load(data, "Base.GateofOlympus/Map.RTPMode", &base.GateofOlympusMapRTPMode) + Load(data, "Base.GateofOlympus/Multiplier.Default", &base.GateofOlympusMultiplier) + Load(data, "Base.GateofOlympus/Multiplier.Default/ID", &base.GateofOlympusMultiplierKeyID) + Load(data, "Base.GateofOlympus/ReelBaseSpin1.Range", &base.GateofOlympusReelBaseSpin1Range) + Load(data, "Base.GateofOlympus/ReelBaseSpin1.Reel", &base.GateofOlympusReelBaseSpin1Reel) + Load(data, "Base.GateofOlympus/ReelBaseSpin1.Weight", &base.GateofOlympusReelBaseSpin1Weight) + Load(data, "Base.GateofOlympus/ReelBaseSpin2.Range", &base.GateofOlympusReelBaseSpin2Range) + Load(data, "Base.GateofOlympus/ReelBaseSpin2.Reel", &base.GateofOlympusReelBaseSpin2Reel) + Load(data, "Base.GateofOlympus/ReelBaseSpin2.Weight", &base.GateofOlympusReelBaseSpin2Weight) + Load(data, "Base.GateofOlympus/ReelBaseSpin3.Range", &base.GateofOlympusReelBaseSpin3Range) + Load(data, "Base.GateofOlympus/ReelBaseSpin3.Reel", &base.GateofOlympusReelBaseSpin3Reel) + Load(data, "Base.GateofOlympus/ReelBaseSpin3.Weight", &base.GateofOlympusReelBaseSpin3Weight) + Load(data, "Base.GateofOlympus/ReelBaseSpin7.Range", &base.GateofOlympusReelBaseSpin7Range) + Load(data, "Base.GateofOlympus/ReelBaseSpin7.Reel", &base.GateofOlympusReelBaseSpin7Reel) + Load(data, "Base.GateofOlympus/ReelBaseSpin7.Weight", &base.GateofOlympusReelBaseSpin7Weight) + Load(data, "Base.GateofOlympus/ReelBaseSpin8.Range", &base.GateofOlympusReelBaseSpin8Range) + Load(data, "Base.GateofOlympus/ReelBaseSpin8.Reel", &base.GateofOlympusReelBaseSpin8Reel) + Load(data, "Base.GateofOlympus/ReelBaseSpin8.Weight", &base.GateofOlympusReelBaseSpin8Weight) + Load(data, "Base.GateofOlympus/ReelBaseSpin.Range", &base.GateofOlympusReelBaseSpinRange) + Load(data, "Base.GateofOlympus/ReelBaseSpin.Reel", &base.GateofOlympusReelBaseSpinReel) + Load(data, "Base.GateofOlympus/ReelBaseSpin.Weight", &base.GateofOlympusReelBaseSpinWeight) + Load(data, "Base.GateofOlympus/ReelChoose.Default", &base.GateofOlympusReelChoose) + Load(data, "Base.GateofOlympus/ReelFreeSpin4.Range", &base.GateofOlympusReelFreeSpin4Range) + Load(data, "Base.GateofOlympus/ReelFreeSpin4.Reel", &base.GateofOlympusReelFreeSpin4Reel) + Load(data, "Base.GateofOlympus/ReelFreeSpin4.Weight", &base.GateofOlympusReelFreeSpin4Weight) + Load(data, "Base.GateofOlympus/ReelFreeSpin5.Range", &base.GateofOlympusReelFreeSpin5Range) + Load(data, "Base.GateofOlympus/ReelFreeSpin5.Reel", &base.GateofOlympusReelFreeSpin5Reel) + Load(data, "Base.GateofOlympus/ReelFreeSpin5.Weight", &base.GateofOlympusReelFreeSpin5Weight) + Load(data, "Base.GateofOlympus/ReelFreeSpin.Range", &base.GateofOlympusReelFreeSpinRange) + Load(data, "Base.GateofOlympus/ReelFreeSpin.Reel", &base.GateofOlympusReelFreeSpinReel) + Load(data, "Base.GateofOlympus/ReelFreeSpin.Weight", &base.GateofOlympusReelFreeSpinWeight) + Load(data, "Base.GateofOlympus/Scatter.Default", &base.GateofOlympusScatter) + Load(data, "Base.GateofOlympus/Symbol.BetRatio", &base.GateofOlympusSymbolBetRatio) + Load(data, "Base.GateofOlympus/Symbol.Default", &base.GateofOlympusSymbol) + Load(data, "Base.Matrix/FeaturesForm15X1TypeA.Default", &base.MatrixFeaturesForm15X1TypeA) + Load(data, "Base.Matrix/FeaturesForm19X1TypeA.Default", &base.MatrixFeaturesForm19X1TypeA) + Load(data, "Base.Matrix/FeaturesForm20X1TypeA.Default", &base.MatrixFeaturesForm20X1TypeA) + Load(data, "Base.Matrix/FeaturesForm25X1TypeA.Default", &base.MatrixFeaturesForm25X1TypeA) + Load(data, "Base.Matrix/FeaturesForm30X1TypeA.Default", &base.MatrixFeaturesForm30X1TypeA) + Load(data, "Base.Matrix/FeaturesForm35X1TypeA.Default", &base.MatrixFeaturesForm35X1TypeA) + Load(data, "Base.Matrix/FeaturesForm40X1.Default", &base.MatrixFeaturesForm40X1) + Load(data, "Base.Matrix/FeaturesForm40X1TypeA.Default", &base.MatrixFeaturesForm40X1TypeA) + Load(data, "Base.Matrix/FeaturesForm7X1TypeA.Default", &base.MatrixFeaturesForm7X1TypeA) + Load(data, "Base.Matrix/Line100Form12X5TypeA.Default", &base.MatrixLine100Form12X5TypeA) + Load(data, "Base.Matrix/Line100Form6X5TypeA.Default", &base.MatrixLine100Form6X5TypeA) + Load(data, "Base.Matrix/Line10Form343TypeA.Default", &base.MatrixLine10Form343TypeA) + Load(data, "Base.Matrix/Line10Form3X5TypeA.Default", &base.MatrixLine10Form3X5TypeA) + Load(data, "Base.Matrix/Line1Form3X3TypeA.Default", &base.MatrixLine1Form3X3TypeA) + Load(data, "Base.Matrix/Line1Form3X3TypeB.Default", &base.MatrixLine1Form3X3TypeB) + Load(data, "Base.Matrix/Line1Form5X5TypeA.Default", &base.MatrixLine1Form5X5TypeA) + Load(data, "Base.Matrix/Line20Form3X5TypeA.Default", &base.MatrixLine20Form3X5TypeA) + Load(data, "Base.Matrix/Line25Form36666TypeA.Default", &base.MatrixLine25Form36666TypeA) + Load(data, "Base.Matrix/Line25Form3X5TypeA.Default", &base.MatrixLine25Form3X5TypeA) + Load(data, "Base.Matrix/Line25Form3X5TypeB.Default", &base.MatrixLine25Form3X5TypeB) + Load(data, "Base.Matrix/Line25Form3X5TypeC.Default", &base.MatrixLine25Form3X5TypeC) + Load(data, "Base.Matrix/Line25Form3X5TypeD.Default", &base.MatrixLine25Form3X5TypeD) + Load(data, "Base.Matrix/Line25Form3X5TypeE.Default", &base.MatrixLine25Form3X5TypeE) + Load(data, "Base.Matrix/Line30Form3X5TypeA.Default", &base.MatrixLine30Form3X5TypeA) + Load(data, "Base.Matrix/Line30Form3X5TypeB.Default", &base.MatrixLine30Form3X5TypeB) + Load(data, "Base.Matrix/Line30Form3X5TypeC.Default", &base.MatrixLine30Form3X5TypeC) + Load(data, "Base.Matrix/Line30Form3X5TypeD.Default", &base.MatrixLine30Form3X5TypeD) + Load(data, "Base.Matrix/Line30Form3X5TypeE.Default", &base.MatrixLine30Form3X5TypeE) + Load(data, "Base.Matrix/Line30Form3X6TypeA.Default", &base.MatrixLine30Form3X6TypeA) + Load(data, "Base.Matrix/Line30Form4X5TypeA.Default", &base.MatrixLine30Form4X5TypeA) + Load(data, "Base.Matrix/Line30Form4X5TypeB.Default", &base.MatrixLine30Form4X5TypeB) + Load(data, "Base.Matrix/Line3Form3X3TypeA.Default", &base.MatrixLine3Form3X3TypeA) + Load(data, "Base.Matrix/Line40Form34543TypeA.Default", &base.MatrixLine40Form34543TypeA) + Load(data, "Base.Matrix/Line40Form3X5TypeA.Default", &base.MatrixLine40Form3X5TypeA) + Load(data, "Base.Matrix/Line40Form3X5TypeB.Default", &base.MatrixLine40Form3X5TypeB) + Load(data, "Base.Matrix/Line40Form3X5TypeC.Default", &base.MatrixLine40Form3X5TypeC) + Load(data, "Base.Matrix/Line40Form3X5TypeD.Default", &base.MatrixLine40Form3X5TypeD) + Load(data, "Base.Matrix/Line40Form4X5TypeA.Default", &base.MatrixLine40Form4X5TypeA) + Load(data, "Base.Matrix/Line40Form4X5TypeB.Default", &base.MatrixLine40Form4X5TypeB) + Load(data, "Base.Matrix/Line40Form4X5TypeC.Default", &base.MatrixLine40Form4X5TypeC) + Load(data, "Base.Matrix/Line40Form4X6TypeA.Default", &base.MatrixLine40Form4X6TypeA) + Load(data, "Base.Matrix/Line50Form3X5TypeA.Default", &base.MatrixLine50Form3X5TypeA) + Load(data, "Base.Matrix/Line50Form3X5TypeB.Default", &base.MatrixLine50Form3X5TypeB) + Load(data, "Base.Matrix/Line50Form3X5TypeC.Default", &base.MatrixLine50Form3X5TypeC) + Load(data, "Base.Matrix/Line50Form3X5TypeD.Default", &base.MatrixLine50Form3X5TypeD) + Load(data, "Base.Matrix/Line50Form3X5TypeE.Default", &base.MatrixLine50Form3X5TypeE) + Load(data, "Base.Matrix/Line50Form3X5TypeF.Default", &base.MatrixLine50Form3X5TypeF) + Load(data, "Base.Matrix/Line50Form3X5TypeG.Default", &base.MatrixLine50Form3X5TypeG) + Load(data, "Base.Matrix/Line50Form3X5TypeH.Default", &base.MatrixLine50Form3X5TypeH) + Load(data, "Base.Matrix/Line50Form45454TypeA.Default", &base.MatrixLine50Form45454TypeA) + Load(data, "Base.Matrix/Line50Form4X5TypeA.Default", &base.MatrixLine50Form4X5TypeA) + Load(data, "Base.Matrix/Line50Form4X5TypeB.Default", &base.MatrixLine50Form4X5TypeB) + Load(data, "Base.Matrix/Line50Form4X5TypeC.Default", &base.MatrixLine50Form4X5TypeC) + Load(data, "Base.Matrix/Line50Form4X5TypeD.Default", &base.MatrixLine50Form4X5TypeD) + Load(data, "Base.Matrix/Line50Form4X5TypeE.Default", &base.MatrixLine50Form4X5TypeE) + Load(data, "Base.Matrix/Line50Form4X5TypeF.Default", &base.MatrixLine50Form4X5TypeF) + Load(data, "Base.Matrix/Line50Form4X6TypeA.Default", &base.MatrixLine50Form4X6TypeA) + Load(data, "Base.Matrix/Line50Form5X5TypeA.Default", &base.MatrixLine50Form5X5TypeA) + Load(data, "Base.Matrix/Line50Form5X5TypeB.Default", &base.MatrixLine50Form5X5TypeB) + Load(data, "Base.Matrix/Line50Form5X5TypeC.Default", &base.MatrixLine50Form5X5TypeC) + Load(data, "Base.Matrix/Line50Form6X5TypeA.Default", &base.MatrixLine50Form6X5TypeA) + Load(data, "Base.Matrix/Line5Form3X3TypeA.Default", &base.MatrixLine5Form3X3TypeA) + Load(data, "Base.Matrix/Line5Form3X3TypeB.Default", &base.MatrixLine5Form3X3TypeB) + Load(data, "Base.Matrix/Line60Form33633TypeA.Default", &base.MatrixLine60Form33633TypeA) + Load(data, "Base.Matrix/Line60Form8X5TypeA.Default", &base.MatrixLine60Form8X5TypeA) + Load(data, "Base.Matrix/Line65Form6X5TypeA.Default", &base.MatrixLine65Form6X5TypeA) + Load(data, "Base.Matrix/Line70Form9X5TypeA.Default", &base.MatrixLine70Form9X5TypeA) + Load(data, "Base.Matrix/Line75Form5X6TypeA.Default", &base.MatrixLine75Form5X6TypeA) + Load(data, "Base.Matrix/Line75Form6X5TypeA.Default", &base.MatrixLine75Form6X5TypeA) + Load(data, "Base.Matrix/Line80Form10X5TypeA.Default", &base.MatrixLine80Form10X5TypeA) + Load(data, "Base.Matrix/Line80Form3X5TypeA.Default", &base.MatrixLine80Form3X5TypeA) + Load(data, "Base.Matrix/Line80Form4X6TypeA.Default", &base.MatrixLine80Form4X6TypeA) + Load(data, "Base.Matrix/Line80Form7X5TypeA.Default", &base.MatrixLine80Form7X5TypeA) + Load(data, "Base.Matrix/Line90Form11X5TypeA.Default", &base.MatrixLine90Form11X5TypeA) + Load(data, "Base.Matrix/Line95Form8X5TypeA.Default", &base.MatrixLine95Form8X5TypeA) + Load(data, "Base.Matrix/MatchForm7X7TypeA.Default", &base.MatrixMatchForm7X7TypeA) + Load(data, "Base.Matrix/SameForm5X6TypeA.Default", &base.MatrixSameForm5X6TypeA) + Load(data, "Base.Matrix/SameForm5X6TypeB.Default", &base.MatrixSameForm5X6TypeB) + Load(data, "Base.Matrix/WaysForm333331.Default", &base.MatrixWaysForm333331) + Load(data, "Base.Matrix/WaysForm33555.Default", &base.MatrixWaysForm33555) + Load(data, "Base.Matrix/WaysForm344444.Default", &base.MatrixWaysForm344444) + Load(data, "Base.Matrix/WaysForm3X5TypeA.Default", &base.MatrixWaysForm3X5TypeA) + Load(data, "Base.Matrix/WaysForm44668.Default", &base.MatrixWaysForm44668) + Load(data, "Base.Matrix/WaysForm4X5TypeA.Default", &base.MatrixWaysForm4X5TypeA) + Load(data, "Base.Matrix/WaysForm4X5TypeB.Default", &base.MatrixWaysForm4X5TypeB) + Load(data, "Base.OptGroup.Default", &base.OptGroup) + Load(data, "Base.PrizeModel/PrizeModelTypeA.Default", &base.PrizeModelPrizeModelTypeA) + Load(data, "Base.PrizeModel/PrizeModelTypeB.Default", &base.PrizeModelPrizeModelTypeB) + Load(data, "Base.Simulator.FSMultiLevel", &base.SimulatorFSMultiLevel) + Load(data, "Base.Simulator.MultiLevel", &base.SimulatorMultiLevel) + Load(data, "Base.Test/Bet.BetChangeList", &base.TestBetBetChangeList) + Load(data, "Base.Test/Bet.BetLevel", &base.TestBetBetLevel) + Load(data, "Base.Test/Bet.BetLine", &base.TestBetBetLine) + Load(data, "Base.Test/Bet.BetSize", &base.TestBetBetSize) + Load(data, "Base.Test/Bet.FirstBet", &base.TestBetFirstBet) + Load(data, "Base.Test/Formation.Default", &base.TestFormation) + Load(data, "Base.Test/Map.RTPMode", &base.TestMapRTPMode) + Load(data, "Base.Test/Random.Weight", &base.TestRandomWeight) + Load(data, "Base.Test/ReelBaseSpin.Range", &base.TestReelBaseSpinRange) + Load(data, "Base.Test/ReelBaseSpin.Reel", &base.TestReelBaseSpinReel) + Load(data, "Base.Test/ReelBaseSpin.Weight", &base.TestReelBaseSpinWeight) + Load(data, "Base.Test/Symbol.BetRatio", &base.TestSymbolBetRatio) + Load(data, "Base.Test/Symbol.Default", &base.TestSymbol) +} + +func StoragesMapping() { + Set("Base", "CashMania/Bet", "BetChangeList", base.CashManiaBetBetChangeList) + Set("Base", "CashMania/Bet", "BetLevel", base.CashManiaBetBetLevel) + Set("Base", "CashMania/Bet", "BetLine", base.CashManiaBetBetLine) + Set("Base", "CashMania/Bet", "BetSize", base.CashManiaBetBetSize) + Set("Base", "CashMania/Bet", "FirstBet", base.CashManiaBetFirstBet) + Set("Base", "CashMania/Formation", "Default", base.CashManiaFormation) + Set("Base", "CashMania/Map", "RTPMode", base.CashManiaMapRTPMode) + Set("Base", "CashMania/MidItemInfo", "Default", base.CashManiaMidItemInfo) + Set("Base", "CashMania/Others", "Default", base.CashManiaOthers) + Set("Base", "CashMania/RandomItem", "Weight", base.CashManiaRandomItemWeight) + Set("Base", "CashMania/RandomMid", "Weight", base.CashManiaRandomMidWeight) + Set("Base", "CashMania/ReelBaseSpin", "Range", base.CashManiaReelBaseSpinRange) + Set("Base", "CashMania/ReelBaseSpin", "Reel", base.CashManiaReelBaseSpinReel) + Set("Base", "CashMania/ReelBaseSpin", "Weight", base.CashManiaReelBaseSpinWeight) + Set("Base", "CashMania/Symbol", "BetRatio", base.CashManiaSymbolBetRatio) + Set("Base", "CashMania/Symbol", "Default", base.CashManiaSymbol) + Set("Base", "CashMania/WinItem", "Weight", base.CashManiaWinItemWeight) + Set("Base", "CashMania/WinMid", "Weight", base.CashManiaWinMidWeight) + Set("Base", "FortuneDragon/BaseMultiplier", "Default", base.FortuneDragonBaseMultiplier) + Set("Base", "FortuneDragon/Bet", "BetChangeList", base.FortuneDragonBetBetChangeList) + Set("Base", "FortuneDragon/Bet", "BetLevel", base.FortuneDragonBetBetLevel) + Set("Base", "FortuneDragon/Bet", "BetLine", base.FortuneDragonBetBetLine) + Set("Base", "FortuneDragon/Bet", "BetSize", base.FortuneDragonBetBetSize) + Set("Base", "FortuneDragon/Bet", "FirstBet", base.FortuneDragonBetFirstBet) + Set("Base", "FortuneDragon/Formation", "Default", base.FortuneDragonFormation) + Set("Base", "FortuneDragon/FreeMultiplier", "Default", base.FortuneDragonFreeMultiplier) + Set("Base", "FortuneDragon/FreeMultiplierCount", "Default", base.FortuneDragonFreeMultiplierCount) + Set("Base", "FortuneDragon/Map", "RTPMode", base.FortuneDragonMapRTPMode) + Set("Base", "FortuneDragon/Others", "Default", base.FortuneDragonOthers) + Set("Base", "FortuneDragon/ReelBaseSpin", "Range", base.FortuneDragonReelBaseSpinRange) + Set("Base", "FortuneDragon/ReelBaseSpin", "Reel", base.FortuneDragonReelBaseSpinReel) + Set("Base", "FortuneDragon/ReelBaseSpin", "Weight", base.FortuneDragonReelBaseSpinWeight) + Set("Base", "FortuneDragon/ReelFreeSpin", "Range", base.FortuneDragonReelFreeSpinRange) + Set("Base", "FortuneDragon/ReelFreeSpin", "Reel", base.FortuneDragonReelFreeSpinReel) + Set("Base", "FortuneDragon/ReelFreeSpin", "Weight", base.FortuneDragonReelFreeSpinWeight) + Set("Base", "FortuneDragon/ReelSureWinBaseSpin", "Range", base.FortuneDragonReelSureWinBaseSpinRange) + Set("Base", "FortuneDragon/ReelSureWinBaseSpin", "Reel", base.FortuneDragonReelSureWinBaseSpinReel) + Set("Base", "FortuneDragon/ReelSureWinBaseSpin", "Weight", base.FortuneDragonReelSureWinBaseSpinWeight) + Set("Base", "FortuneDragon/ReelSureWinFreeSpin", "Range", base.FortuneDragonReelSureWinFreeSpinRange) + Set("Base", "FortuneDragon/ReelSureWinFreeSpin", "Reel", base.FortuneDragonReelSureWinFreeSpinReel) + Set("Base", "FortuneDragon/ReelSureWinFreeSpin", "Weight", base.FortuneDragonReelSureWinFreeSpinWeight) + Set("Base", "FortuneDragon/Symbol", "BetRatio", base.FortuneDragonSymbolBetRatio) + Set("Base", "FortuneDragon/Symbol", "Default", base.FortuneDragonSymbol) + Set("Base", "FortuneMouse/Bet", "BetChangeList", base.FortuneMouseBetBetChangeList) + Set("Base", "FortuneMouse/Bet", "BetLevel", base.FortuneMouseBetBetLevel) + Set("Base", "FortuneMouse/Bet", "BetLine", base.FortuneMouseBetBetLine) + Set("Base", "FortuneMouse/Bet", "BetSize", base.FortuneMouseBetBetSize) + Set("Base", "FortuneMouse/Bet", "FirstBet", base.FortuneMouseBetFirstBet) + Set("Base", "FortuneMouse/Formation", "Default", base.FortuneMouseFormation) + Set("Base", "FortuneMouse/Map", "RTPMode", base.FortuneMouseMapRTPMode) + Set("Base", "FortuneMouse/Others", "Default", base.FortuneMouseOthers) + Set("Base", "FortuneMouse/ReelBaseSpin", "Range", base.FortuneMouseReelBaseSpinRange) + Set("Base", "FortuneMouse/ReelBaseSpin", "Reel", base.FortuneMouseReelBaseSpinReel) + Set("Base", "FortuneMouse/ReelBaseSpin", "Weight", base.FortuneMouseReelBaseSpinWeight) + Set("Base", "FortuneMouse/ReelReSpin", "Range", base.FortuneMouseReelReSpinRange) + Set("Base", "FortuneMouse/ReelReSpin", "Reel", base.FortuneMouseReelReSpinReel) + Set("Base", "FortuneMouse/ReelReSpin", "Weight", base.FortuneMouseReelReSpinWeight) + Set("Base", "FortuneMouse/SuperStack", "Weight", base.FortuneMouseSuperStackWeight) + Set("Base", "FortuneMouse/Symbol", "BetRatio", base.FortuneMouseSymbolBetRatio) + Set("Base", "FortuneMouse/Symbol", "Default", base.FortuneMouseSymbol) + Set("Base", "FortuneOx/Bet", "BetChangeList", base.FortuneOxBetBetChangeList) + Set("Base", "FortuneOx/Bet", "BetLevel", base.FortuneOxBetBetLevel) + Set("Base", "FortuneOx/Bet", "BetLine", base.FortuneOxBetBetLine) + Set("Base", "FortuneOx/Bet", "BetSize", base.FortuneOxBetBetSize) + Set("Base", "FortuneOx/Bet", "FirstBet", base.FortuneOxBetFirstBet) + Set("Base", "FortuneOx/Formation", "Default", base.FortuneOxFormation) + Set("Base", "FortuneOx/Map", "RTPMode", base.FortuneOxMapRTPMode) + Set("Base", "FortuneOx/Others", "Default", base.FortuneOxOthers) + Set("Base", "FortuneOx/ReelBaseSpin", "Range", base.FortuneOxReelBaseSpinRange) + Set("Base", "FortuneOx/ReelBaseSpin", "Reel", base.FortuneOxReelBaseSpinReel) + Set("Base", "FortuneOx/ReelBaseSpin", "Weight", base.FortuneOxReelBaseSpinWeight) + Set("Base", "FortuneOx/ReelReSpin", "Range", base.FortuneOxReelReSpinRange) + Set("Base", "FortuneOx/ReelReSpin", "Reel", base.FortuneOxReelReSpinReel) + Set("Base", "FortuneOx/ReelReSpin", "Weight", base.FortuneOxReelReSpinWeight) + Set("Base", "FortuneOx/SuperStack1", "Weight", base.FortuneOxSuperStack1Weight) + Set("Base", "FortuneOx/SuperStack2", "Weight", base.FortuneOxSuperStack2Weight) + Set("Base", "FortuneOx/Symbol", "BetRatio", base.FortuneOxSymbolBetRatio) + Set("Base", "FortuneOx/Symbol", "Default", base.FortuneOxSymbol) + Set("Base", "FortuneRabbit/Bet", "BetChangeList", base.FortuneRabbitBetBetChangeList) + Set("Base", "FortuneRabbit/Bet", "BetLevel", base.FortuneRabbitBetBetLevel) + Set("Base", "FortuneRabbit/Bet", "BetLine", base.FortuneRabbitBetBetLine) + Set("Base", "FortuneRabbit/Bet", "BetSize", base.FortuneRabbitBetBetSize) + Set("Base", "FortuneRabbit/Bet", "FirstBet", base.FortuneRabbitBetFirstBet) + Set("Base", "FortuneRabbit/CashPrizeWeight", "Default", base.FortuneRabbitCashPrizeWeight) + Set("Base", "FortuneRabbit/ForceCashCountWeight", "Default", base.FortuneRabbitForceCashCountWeight) + Set("Base", "FortuneRabbit/Formation", "Default", base.FortuneRabbitFormation) + Set("Base", "FortuneRabbit/Map", "RTPMode", base.FortuneRabbitMapRTPMode) + Set("Base", "FortuneRabbit/Others", "Default", base.FortuneRabbitOthers) + Set("Base", "FortuneRabbit/Others", "RTP120", base.FortuneRabbitOthersRTP120) + Set("Base", "FortuneRabbit/Others", "RTP80", base.FortuneRabbitOthersRTP80) + Set("Base", "FortuneRabbit/ReelBaseSpin", "Range", base.FortuneRabbitReelBaseSpinRange) + Set("Base", "FortuneRabbit/ReelBaseSpin", "Reel", base.FortuneRabbitReelBaseSpinReel) + Set("Base", "FortuneRabbit/ReelBaseSpin", "Weight", base.FortuneRabbitReelBaseSpinWeight) + Set("Base", "FortuneRabbit/ReelFreeSpin", "Range", base.FortuneRabbitReelFreeSpinRange) + Set("Base", "FortuneRabbit/ReelFreeSpin", "Reel", base.FortuneRabbitReelFreeSpinReel) + Set("Base", "FortuneRabbit/ReelFreeSpin", "Weight", base.FortuneRabbitReelFreeSpinWeight) + Set("Base", "FortuneRabbit/Symbol", "BetRatio", base.FortuneRabbitSymbolBetRatio) + Set("Base", "FortuneRabbit/Symbol", "Default", base.FortuneRabbitSymbol) + Set("Base", "FortuneTiger/Bet", "BetChangeList", base.FortuneTigerBetBetChangeList) + Set("Base", "FortuneTiger/Bet", "BetLevel", base.FortuneTigerBetBetLevel) + Set("Base", "FortuneTiger/Bet", "BetLine", base.FortuneTigerBetBetLine) + Set("Base", "FortuneTiger/Bet", "BetSize", base.FortuneTigerBetBetSize) + Set("Base", "FortuneTiger/Bet", "FirstBet", base.FortuneTigerBetFirstBet) + Set("Base", "FortuneTiger/Formation", "Default", base.FortuneTigerFormation) + Set("Base", "FortuneTiger/Map", "RTPMode", base.FortuneTigerMapRTPMode) + Set("Base", "FortuneTiger/Others", "Default", base.FortuneTigerOthers) + Set("Base", "FortuneTiger/ReelBaseSpin", "Range", base.FortuneTigerReelBaseSpinRange) + Set("Base", "FortuneTiger/ReelBaseSpin", "Reel", base.FortuneTigerReelBaseSpinReel) + Set("Base", "FortuneTiger/ReelBaseSpin", "Weight", base.FortuneTigerReelBaseSpinWeight) + Set("Base", "FortuneTiger/ReelReSpin", "Range", base.FortuneTigerReelReSpinRange) + Set("Base", "FortuneTiger/ReelReSpin", "Reel", base.FortuneTigerReelReSpinReel) + Set("Base", "FortuneTiger/ReelReSpin", "Weight", base.FortuneTigerReelReSpinWeight) + Set("Base", "FortuneTiger/SuperStack", "Weight", base.FortuneTigerSuperStackWeight) + Set("Base", "FortuneTiger/Symbol", "BetRatio", base.FortuneTigerSymbolBetRatio) + Set("Base", "FortuneTiger/Symbol", "Default", base.FortuneTigerSymbol) + Set("Base", "GateofOlympus/Bet", "BetChangeList", base.GateofOlympusBetBetChangeList) + Set("Base", "GateofOlympus/Bet", "BetLevel", base.GateofOlympusBetBetLevel) + Set("Base", "GateofOlympus/Bet", "BetLine", base.GateofOlympusBetBetLine) + Set("Base", "GateofOlympus/Bet", "BetSize", base.GateofOlympusBetBetSize) + Set("Base", "GateofOlympus/Bet", "FirstBet", base.GateofOlympusBetFirstBet) + Set("Base", "GateofOlympus/Formation", "Default", base.GateofOlympusFormation) + Set("Base", "GateofOlympus/Map", "RTPMode", base.GateofOlympusMapRTPMode) + Set("Base", "GateofOlympus/Multiplier", "Default", base.GateofOlympusMultiplier) + Set("Base", "GateofOlympus/Multiplier", "Default/ID", base.GateofOlympusMultiplierKeyID) + Set("Base", "GateofOlympus/ReelBaseSpin1", "Range", base.GateofOlympusReelBaseSpin1Range) + Set("Base", "GateofOlympus/ReelBaseSpin1", "Reel", base.GateofOlympusReelBaseSpin1Reel) + Set("Base", "GateofOlympus/ReelBaseSpin1", "Weight", base.GateofOlympusReelBaseSpin1Weight) + Set("Base", "GateofOlympus/ReelBaseSpin2", "Range", base.GateofOlympusReelBaseSpin2Range) + Set("Base", "GateofOlympus/ReelBaseSpin2", "Reel", base.GateofOlympusReelBaseSpin2Reel) + Set("Base", "GateofOlympus/ReelBaseSpin2", "Weight", base.GateofOlympusReelBaseSpin2Weight) + Set("Base", "GateofOlympus/ReelBaseSpin3", "Range", base.GateofOlympusReelBaseSpin3Range) + Set("Base", "GateofOlympus/ReelBaseSpin3", "Reel", base.GateofOlympusReelBaseSpin3Reel) + Set("Base", "GateofOlympus/ReelBaseSpin3", "Weight", base.GateofOlympusReelBaseSpin3Weight) + Set("Base", "GateofOlympus/ReelBaseSpin7", "Range", base.GateofOlympusReelBaseSpin7Range) + Set("Base", "GateofOlympus/ReelBaseSpin7", "Reel", base.GateofOlympusReelBaseSpin7Reel) + Set("Base", "GateofOlympus/ReelBaseSpin7", "Weight", base.GateofOlympusReelBaseSpin7Weight) + Set("Base", "GateofOlympus/ReelBaseSpin8", "Range", base.GateofOlympusReelBaseSpin8Range) + Set("Base", "GateofOlympus/ReelBaseSpin8", "Reel", base.GateofOlympusReelBaseSpin8Reel) + Set("Base", "GateofOlympus/ReelBaseSpin8", "Weight", base.GateofOlympusReelBaseSpin8Weight) + Set("Base", "GateofOlympus/ReelBaseSpin", "Range", base.GateofOlympusReelBaseSpinRange) + Set("Base", "GateofOlympus/ReelBaseSpin", "Reel", base.GateofOlympusReelBaseSpinReel) + Set("Base", "GateofOlympus/ReelBaseSpin", "Weight", base.GateofOlympusReelBaseSpinWeight) + Set("Base", "GateofOlympus/ReelChoose", "Default", base.GateofOlympusReelChoose) + Set("Base", "GateofOlympus/ReelFreeSpin4", "Range", base.GateofOlympusReelFreeSpin4Range) + Set("Base", "GateofOlympus/ReelFreeSpin4", "Reel", base.GateofOlympusReelFreeSpin4Reel) + Set("Base", "GateofOlympus/ReelFreeSpin4", "Weight", base.GateofOlympusReelFreeSpin4Weight) + Set("Base", "GateofOlympus/ReelFreeSpin5", "Range", base.GateofOlympusReelFreeSpin5Range) + Set("Base", "GateofOlympus/ReelFreeSpin5", "Reel", base.GateofOlympusReelFreeSpin5Reel) + Set("Base", "GateofOlympus/ReelFreeSpin5", "Weight", base.GateofOlympusReelFreeSpin5Weight) + Set("Base", "GateofOlympus/ReelFreeSpin", "Range", base.GateofOlympusReelFreeSpinRange) + Set("Base", "GateofOlympus/ReelFreeSpin", "Reel", base.GateofOlympusReelFreeSpinReel) + Set("Base", "GateofOlympus/ReelFreeSpin", "Weight", base.GateofOlympusReelFreeSpinWeight) + Set("Base", "GateofOlympus/Scatter", "Default", base.GateofOlympusScatter) + Set("Base", "GateofOlympus/Symbol", "BetRatio", base.GateofOlympusSymbolBetRatio) + Set("Base", "GateofOlympus/Symbol", "Default", base.GateofOlympusSymbol) + Set("Base", "Matrix/FeaturesForm15X1TypeA", "Default", base.MatrixFeaturesForm15X1TypeA) + Set("Base", "Matrix/FeaturesForm19X1TypeA", "Default", base.MatrixFeaturesForm19X1TypeA) + Set("Base", "Matrix/FeaturesForm20X1TypeA", "Default", base.MatrixFeaturesForm20X1TypeA) + Set("Base", "Matrix/FeaturesForm25X1TypeA", "Default", base.MatrixFeaturesForm25X1TypeA) + Set("Base", "Matrix/FeaturesForm30X1TypeA", "Default", base.MatrixFeaturesForm30X1TypeA) + Set("Base", "Matrix/FeaturesForm35X1TypeA", "Default", base.MatrixFeaturesForm35X1TypeA) + Set("Base", "Matrix/FeaturesForm40X1", "Default", base.MatrixFeaturesForm40X1) + Set("Base", "Matrix/FeaturesForm40X1TypeA", "Default", base.MatrixFeaturesForm40X1TypeA) + Set("Base", "Matrix/FeaturesForm7X1TypeA", "Default", base.MatrixFeaturesForm7X1TypeA) + Set("Base", "Matrix/Line100Form12X5TypeA", "Default", base.MatrixLine100Form12X5TypeA) + Set("Base", "Matrix/Line100Form6X5TypeA", "Default", base.MatrixLine100Form6X5TypeA) + Set("Base", "Matrix/Line10Form343TypeA", "Default", base.MatrixLine10Form343TypeA) + Set("Base", "Matrix/Line10Form3X5TypeA", "Default", base.MatrixLine10Form3X5TypeA) + Set("Base", "Matrix/Line1Form3X3TypeA", "Default", base.MatrixLine1Form3X3TypeA) + Set("Base", "Matrix/Line1Form3X3TypeB", "Default", base.MatrixLine1Form3X3TypeB) + Set("Base", "Matrix/Line1Form5X5TypeA", "Default", base.MatrixLine1Form5X5TypeA) + Set("Base", "Matrix/Line20Form3X5TypeA", "Default", base.MatrixLine20Form3X5TypeA) + Set("Base", "Matrix/Line25Form36666TypeA", "Default", base.MatrixLine25Form36666TypeA) + Set("Base", "Matrix/Line25Form3X5TypeA", "Default", base.MatrixLine25Form3X5TypeA) + Set("Base", "Matrix/Line25Form3X5TypeB", "Default", base.MatrixLine25Form3X5TypeB) + Set("Base", "Matrix/Line25Form3X5TypeC", "Default", base.MatrixLine25Form3X5TypeC) + Set("Base", "Matrix/Line25Form3X5TypeD", "Default", base.MatrixLine25Form3X5TypeD) + Set("Base", "Matrix/Line25Form3X5TypeE", "Default", base.MatrixLine25Form3X5TypeE) + Set("Base", "Matrix/Line30Form3X5TypeA", "Default", base.MatrixLine30Form3X5TypeA) + Set("Base", "Matrix/Line30Form3X5TypeB", "Default", base.MatrixLine30Form3X5TypeB) + Set("Base", "Matrix/Line30Form3X5TypeC", "Default", base.MatrixLine30Form3X5TypeC) + Set("Base", "Matrix/Line30Form3X5TypeD", "Default", base.MatrixLine30Form3X5TypeD) + Set("Base", "Matrix/Line30Form3X5TypeE", "Default", base.MatrixLine30Form3X5TypeE) + Set("Base", "Matrix/Line30Form3X6TypeA", "Default", base.MatrixLine30Form3X6TypeA) + Set("Base", "Matrix/Line30Form4X5TypeA", "Default", base.MatrixLine30Form4X5TypeA) + Set("Base", "Matrix/Line30Form4X5TypeB", "Default", base.MatrixLine30Form4X5TypeB) + Set("Base", "Matrix/Line3Form3X3TypeA", "Default", base.MatrixLine3Form3X3TypeA) + Set("Base", "Matrix/Line40Form34543TypeA", "Default", base.MatrixLine40Form34543TypeA) + Set("Base", "Matrix/Line40Form3X5TypeA", "Default", base.MatrixLine40Form3X5TypeA) + Set("Base", "Matrix/Line40Form3X5TypeB", "Default", base.MatrixLine40Form3X5TypeB) + Set("Base", "Matrix/Line40Form3X5TypeC", "Default", base.MatrixLine40Form3X5TypeC) + Set("Base", "Matrix/Line40Form3X5TypeD", "Default", base.MatrixLine40Form3X5TypeD) + Set("Base", "Matrix/Line40Form4X5TypeA", "Default", base.MatrixLine40Form4X5TypeA) + Set("Base", "Matrix/Line40Form4X5TypeB", "Default", base.MatrixLine40Form4X5TypeB) + Set("Base", "Matrix/Line40Form4X5TypeC", "Default", base.MatrixLine40Form4X5TypeC) + Set("Base", "Matrix/Line40Form4X6TypeA", "Default", base.MatrixLine40Form4X6TypeA) + Set("Base", "Matrix/Line50Form3X5TypeA", "Default", base.MatrixLine50Form3X5TypeA) + Set("Base", "Matrix/Line50Form3X5TypeB", "Default", base.MatrixLine50Form3X5TypeB) + Set("Base", "Matrix/Line50Form3X5TypeC", "Default", base.MatrixLine50Form3X5TypeC) + Set("Base", "Matrix/Line50Form3X5TypeD", "Default", base.MatrixLine50Form3X5TypeD) + Set("Base", "Matrix/Line50Form3X5TypeE", "Default", base.MatrixLine50Form3X5TypeE) + Set("Base", "Matrix/Line50Form3X5TypeF", "Default", base.MatrixLine50Form3X5TypeF) + Set("Base", "Matrix/Line50Form3X5TypeG", "Default", base.MatrixLine50Form3X5TypeG) + Set("Base", "Matrix/Line50Form3X5TypeH", "Default", base.MatrixLine50Form3X5TypeH) + Set("Base", "Matrix/Line50Form45454TypeA", "Default", base.MatrixLine50Form45454TypeA) + Set("Base", "Matrix/Line50Form4X5TypeA", "Default", base.MatrixLine50Form4X5TypeA) + Set("Base", "Matrix/Line50Form4X5TypeB", "Default", base.MatrixLine50Form4X5TypeB) + Set("Base", "Matrix/Line50Form4X5TypeC", "Default", base.MatrixLine50Form4X5TypeC) + Set("Base", "Matrix/Line50Form4X5TypeD", "Default", base.MatrixLine50Form4X5TypeD) + Set("Base", "Matrix/Line50Form4X5TypeE", "Default", base.MatrixLine50Form4X5TypeE) + Set("Base", "Matrix/Line50Form4X5TypeF", "Default", base.MatrixLine50Form4X5TypeF) + Set("Base", "Matrix/Line50Form4X6TypeA", "Default", base.MatrixLine50Form4X6TypeA) + Set("Base", "Matrix/Line50Form5X5TypeA", "Default", base.MatrixLine50Form5X5TypeA) + Set("Base", "Matrix/Line50Form5X5TypeB", "Default", base.MatrixLine50Form5X5TypeB) + Set("Base", "Matrix/Line50Form5X5TypeC", "Default", base.MatrixLine50Form5X5TypeC) + Set("Base", "Matrix/Line50Form6X5TypeA", "Default", base.MatrixLine50Form6X5TypeA) + Set("Base", "Matrix/Line5Form3X3TypeA", "Default", base.MatrixLine5Form3X3TypeA) + Set("Base", "Matrix/Line5Form3X3TypeB", "Default", base.MatrixLine5Form3X3TypeB) + Set("Base", "Matrix/Line60Form33633TypeA", "Default", base.MatrixLine60Form33633TypeA) + Set("Base", "Matrix/Line60Form8X5TypeA", "Default", base.MatrixLine60Form8X5TypeA) + Set("Base", "Matrix/Line65Form6X5TypeA", "Default", base.MatrixLine65Form6X5TypeA) + Set("Base", "Matrix/Line70Form9X5TypeA", "Default", base.MatrixLine70Form9X5TypeA) + Set("Base", "Matrix/Line75Form5X6TypeA", "Default", base.MatrixLine75Form5X6TypeA) + Set("Base", "Matrix/Line75Form6X5TypeA", "Default", base.MatrixLine75Form6X5TypeA) + Set("Base", "Matrix/Line80Form10X5TypeA", "Default", base.MatrixLine80Form10X5TypeA) + Set("Base", "Matrix/Line80Form3X5TypeA", "Default", base.MatrixLine80Form3X5TypeA) + Set("Base", "Matrix/Line80Form4X6TypeA", "Default", base.MatrixLine80Form4X6TypeA) + Set("Base", "Matrix/Line80Form7X5TypeA", "Default", base.MatrixLine80Form7X5TypeA) + Set("Base", "Matrix/Line90Form11X5TypeA", "Default", base.MatrixLine90Form11X5TypeA) + Set("Base", "Matrix/Line95Form8X5TypeA", "Default", base.MatrixLine95Form8X5TypeA) + Set("Base", "Matrix/MatchForm7X7TypeA", "Default", base.MatrixMatchForm7X7TypeA) + Set("Base", "Matrix/SameForm5X6TypeA", "Default", base.MatrixSameForm5X6TypeA) + Set("Base", "Matrix/SameForm5X6TypeB", "Default", base.MatrixSameForm5X6TypeB) + Set("Base", "Matrix/WaysForm333331", "Default", base.MatrixWaysForm333331) + Set("Base", "Matrix/WaysForm33555", "Default", base.MatrixWaysForm33555) + Set("Base", "Matrix/WaysForm344444", "Default", base.MatrixWaysForm344444) + Set("Base", "Matrix/WaysForm3X5TypeA", "Default", base.MatrixWaysForm3X5TypeA) + Set("Base", "Matrix/WaysForm44668", "Default", base.MatrixWaysForm44668) + Set("Base", "Matrix/WaysForm4X5TypeA", "Default", base.MatrixWaysForm4X5TypeA) + Set("Base", "Matrix/WaysForm4X5TypeB", "Default", base.MatrixWaysForm4X5TypeB) + Set("Base", "OptGroup", "Default", base.OptGroup) + Set("Base", "PrizeModel/PrizeModelTypeA", "Default", base.PrizeModelPrizeModelTypeA) + Set("Base", "PrizeModel/PrizeModelTypeB", "Default", base.PrizeModelPrizeModelTypeB) + Set("Base", "Simulator", "FSMultiLevel", base.SimulatorFSMultiLevel) + Set("Base", "Simulator", "MultiLevel", base.SimulatorMultiLevel) + Set("Base", "Test/Bet", "BetChangeList", base.TestBetBetChangeList) + Set("Base", "Test/Bet", "BetLevel", base.TestBetBetLevel) + Set("Base", "Test/Bet", "BetLine", base.TestBetBetLine) + Set("Base", "Test/Bet", "BetSize", base.TestBetBetSize) + Set("Base", "Test/Bet", "FirstBet", base.TestBetFirstBet) + Set("Base", "Test/Formation", "Default", base.TestFormation) + Set("Base", "Test/Map", "RTPMode", base.TestMapRTPMode) + Set("Base", "Test/Random", "Weight", base.TestRandomWeight) + Set("Base", "Test/ReelBaseSpin", "Range", base.TestReelBaseSpinRange) + Set("Base", "Test/ReelBaseSpin", "Reel", base.TestReelBaseSpinReel) + Set("Base", "Test/ReelBaseSpin", "Weight", base.TestReelBaseSpinWeight) + Set("Base", "Test/Symbol", "BetRatio", base.TestSymbolBetRatio) + Set("Base", "Test/Symbol", "Default", base.TestSymbol) +} + +func LinksMapping() { + Link("CashMania/MatrixLine1Form5X5TypeA", "Default", "Matrix/Line1Form5X5TypeA", "Default") + Link("CashMania/PrizeModel", "Default", "PrizeModel/PrizeModelTypeB", "Default") + Link("CashMania/ReelBaseSpin", "Weight/1", "CashMania/ReelBaseSpin", "Weight") + Link("CashMania/ReelBaseSpin", "Weight/2", "CashMania/ReelBaseSpin", "Weight") + Link("CashMania/ReelBaseSpin", "Weight/3", "CashMania/ReelBaseSpin", "Weight") + Link("FortuneDragon/MatrixLine5Form3X3TypeB", "Default", "Matrix/Line5Form3X3TypeB", "Default") + Link("FortuneDragon/PrizeModel", "Default", "PrizeModel/PrizeModelTypeA", "Default") + Link("FortuneDragon/ReelBaseSpin", "Weight/1", "FortuneDragon/ReelBaseSpin", "Weight") + Link("FortuneDragon/ReelBaseSpin", "Weight/2", "FortuneDragon/ReelBaseSpin", "Weight") + Link("FortuneDragon/ReelBaseSpin", "Weight/3", "FortuneDragon/ReelBaseSpin", "Weight") + Link("FortuneMouse/MatrixLine5Form3X3TypeB", "Default", "Matrix/Line5Form3X3TypeB", "Default") + Link("FortuneMouse/PrizeModel", "Default", "PrizeModel/PrizeModelTypeB", "Default") + Link("FortuneMouse/ReelBaseSpin", "Weight/1", "FortuneMouse/ReelBaseSpin", "Weight") + Link("FortuneMouse/ReelBaseSpin", "Weight/2", "FortuneMouse/ReelBaseSpin", "Weight") + Link("FortuneMouse/ReelBaseSpin", "Weight/3", "FortuneMouse/ReelBaseSpin", "Weight") + Link("FortuneOx/MatrixLine10Form343TypeA", "Default", "Matrix/Line10Form343TypeA", "Default") + Link("FortuneOx/PrizeModel", "Default", "PrizeModel/PrizeModelTypeB", "Default") + Link("FortuneOx/ReelBaseSpin", "Weight/1", "FortuneOx/ReelBaseSpin", "Weight") + Link("FortuneOx/ReelBaseSpin", "Weight/2", "FortuneOx/ReelBaseSpin", "Weight") + Link("FortuneOx/ReelBaseSpin", "Weight/3", "FortuneOx/ReelBaseSpin", "Weight") + Link("FortuneRabbit/MatrixLine10Form343TypeA", "Default", "Matrix/Line10Form343TypeA", "Default") + Link("FortuneRabbit/Others", "Default/1", "FortuneRabbit/Others", "Default") + Link("FortuneRabbit/Others", "Default/2", "FortuneRabbit/Others", "RTP80") + Link("FortuneRabbit/Others", "Default/3", "FortuneRabbit/Others", "RTP120") + Link("FortuneRabbit/PrizeModel", "Default", "PrizeModel/PrizeModelTypeB", "Default") + Link("FortuneRabbit/ReelBaseSpin", "Weight/1", "FortuneRabbit/ReelBaseSpin", "Weight") + Link("FortuneRabbit/ReelBaseSpin", "Weight/2", "FortuneRabbit/ReelBaseSpin", "Weight") + Link("FortuneRabbit/ReelBaseSpin", "Weight/3", "FortuneRabbit/ReelBaseSpin", "Weight") + Link("FortuneTiger/MatrixLine5Form3X3TypeB", "Default", "Matrix/Line5Form3X3TypeB", "Default") + Link("FortuneTiger/PrizeModel", "Default", "PrizeModel/PrizeModelTypeB", "Default") + Link("FortuneTiger/ReelBaseSpin", "Weight/1", "FortuneTiger/ReelBaseSpin", "Weight") + Link("FortuneTiger/ReelBaseSpin", "Weight/2", "FortuneTiger/ReelBaseSpin", "Weight") + Link("FortuneTiger/ReelBaseSpin", "Weight/3", "FortuneTiger/ReelBaseSpin", "Weight") + Link("GatesOfOlympus/MatrixSameForm5X6TypeA", "Default", "Matrix/SameForm5X6TypeA", "Default") + Link("GatesOfOlympus/MatrixSameForm5X6TypeB", "Default", "Matrix/SameForm5X6TypeB", "Default") + Link("GatesOfOlympus/PrizeModel", "Default", "PrizeModel/PrizeModelTypeB", "Default") + Link("GatesOfOlympus/ReelBaseSpin1", "Weight/1", "GatesOfOlympus/ReelBaseSpin1", "Weight") + Link("GatesOfOlympus/ReelBaseSpin1", "Weight/2", "GatesOfOlympus/ReelBaseSpin1", "Weight") + Link("GatesOfOlympus/ReelBaseSpin1", "Weight/3", "GatesOfOlympus/ReelBaseSpin1", "Weight") + Link("Test/MatrixLine1Form3X3TypeA", "Default", "Matrix/Line1Form3X3TypeA", "Default") + Link("Test/PrizeModel", "Default", "PrizeModel/PrizeModelTypeB", "Default") + Link("Test/ReelBaseSpin", "Weight/1", "Test/ReelBaseSpin", "Weight") + Link("Test/ReelBaseSpin", "Weight/2", "Test/ReelBaseSpin", "Weight") + Link("Test/ReelBaseSpin", "Weight/3", "Test/ReelBaseSpin", "Weight") +} + +func CategoriesMapping() { + for _, dstCategory := range Categories { + srcCategory := Parent(dstCategory) + if srcCategory == "" { + continue + } + if _, ok := Storage[dstCategory]; !ok { + Storage[dstCategory] = Storage[srcCategory] + } else { + for excelName, excel := range Storage[srcCategory] { + if _, ok := Storage[dstCategory][excelName]; !ok { + Storage[dstCategory][excelName] = excel + } else { + for sheetName, sheet := range Storage[srcCategory][excelName] { + if _, ok := Storage[dstCategory][excelName][sheetName]; !ok { + Storage[dstCategory][excelName][sheetName] = sheet + } + } + } + } + } + } +} + +func Set(packageName string, excelName string, sheetName string, v interface{}) { + if _, ok := Storage[packageName]; !ok { + Storage[packageName] = make(map[string]map[string]interface{}) + OriginStorage[packageName] = make(map[string]map[string]interface{}) + } + if _, ok := Storage[packageName][excelName]; !ok { + Storage[packageName][excelName] = make(map[string]interface{}) + OriginStorage[packageName][excelName] = make(map[string]interface{}) + } + Storage[packageName][excelName][sheetName] = v + OriginStorage[packageName][excelName][sheetName] = v +} + +func Parent(packageName string) string { + if packageName == "Base" { + return "" + } + strs := strings.Split(packageName, "_") + if len(strs) == 1 { + return "Base" + } else { + return strs[0] + } +} + +func Has(packageName string, excelName string, sheetName string) bool { + if _, ok := Storage[packageName]; !ok { + return false + } + if _, ok := Storage[packageName][excelName]; !ok { + return false + } + if _, ok := Storage[packageName][excelName][sheetName]; !ok { + return false + } + return true +} + +func Find(packageName string, excelName string, sheetName string) interface{} { + for { + if packageName == "" { + return nil + } + if !Has(packageName, excelName, sheetName) { + packageName = Parent(packageName) + continue + } + return Storage[packageName][excelName][sheetName] + } +} + +func Link(dstExcelName string, dstSheetName string, srcExcelName string, srcSheetName string) { + for _, category := range Categories { + Set(category, dstExcelName, dstSheetName, Find(category, srcExcelName, srcSheetName)) + } +} + +func Load(dataMap map[string]string, name string, v interface{}) { + if _, ok := dataMap[name]; !ok { + return + } + if err := json.Unmarshal([]byte(dataMap[name]), v); err != nil { + panic(err) + } +} + diff --git a/gamesrv/slotspkg/internal/exported/excel2go/structs/structs.go b/gamesrv/slotspkg/internal/exported/excel2go/structs/structs.go new file mode 100644 index 0000000..8ee1e34 --- /dev/null +++ b/gamesrv/slotspkg/internal/exported/excel2go/structs/structs.go @@ -0,0 +1,854 @@ +// Package structs +package structs + +import ( + "fmt" + "math/big" + "time" +) + +var timeLocation = time.FixedZone("SYS", 0) + +func NewTime(year, month, day, hour, minute, second int) *time.Time { + tm := time.Date(year, time.Month(month), day, hour, minute, second, 0, timeLocation) + return &tm +} + +func NewBigInt(s string) *big.Int { + i := new(big.Int) + _, ok := i.SetString(s, 10) + if !ok { + panic(fmt.Errorf("big int:%s error in excel", s)) + } + return i +} + +func NewBigFloat(s string) *big.Float { + f := new(big.Float) + _, ok := f.SetString(s) + if !ok { + panic(fmt.Errorf("big float:%s error in excel", s)) + } + return f +} + +func NewBigRat(s string) *big.Rat { + r := new(big.Rat) + _, ok := r.SetString(s) + if !ok { + panic(fmt.Errorf("big rat:%s error in excel", s)) + } + return r +} + +type ( + // BetChangeList comment + BetChangeList struct { + Index int64 + BetChangeList float64 + BetSizeIndex int64 + BetLevelIndex int64 + } + // BetLevel comment + BetLevel struct { + Index int64 + BetLevel int64 + } + // BetLine comment + BetLine struct { + Index int64 + BetLine int64 + } + // BetSize comment + BetSize struct { + Index int64 + BetSize int64 + } + // CashManiaMidItemInfo comment + CashManiaMidItemInfo struct { + Index int64 + ItemID int64 + Multi int64 + FreeSpinCount int64 + } + // CashManiaOthers comment + CashManiaOthers struct { + BaseWinPro float64 + FreeWinPro float64 + MaxWin int64 + WinNudgePro float64 + WinRespinPro float64 + NoWinNudgePro float64 + NoWinRespinPro float64 + } + // CashManiaRandomItemWeight comment + CashManiaRandomItemWeight struct { + ID int64 + ItemID int64 + BaseWeight float64 + FreeWeight float64 + } + // FirstBet comment + FirstBet struct { + Index int64 + BetSizeIndex int64 + BetLevelIndex int64 + } + // Formation comment + Formation struct { + SpinType int64 + NodeType string + ID int64 + SeqID int64 + Reel string + Matrix string + Symbol string + FirstInitMethod int64 + OtherInitMethod int64 + FirstInitSymbols []int64 + OtherInitSymbols []int64 + } + // FortuneDragonBaseMultiplier comment + FortuneDragonBaseMultiplier struct { + WinRateMin float64 + WinRateMax float64 + ItemIds []int64 + MultiplierWeights []int64 + } + // FortuneDragonFreeMultiplier comment + FortuneDragonFreeMultiplier struct { + ItemID int64 + Weight int64 + } + // FortuneDragonFreeMultiplierCount comment + FortuneDragonFreeMultiplierCount struct { + MultiplierCount int64 + Weight int64 + } + // FortuneDragonOthers comment + FortuneDragonOthers struct { + FreespinTriggerPro float64 + FreeSpinCount int64 + MaxWin int64 + SureWinFreespinTriggerPro float64 + SureWinBetMultiplier int64 + } + // FortuneMouseOthers comment + FortuneMouseOthers struct { + RespinTriggerPro float64 + MaxWin int64 + ExtraWin int64 + } + // FortuneOxOthers comment + FortuneOxOthers struct { + RespinTriggerPro float64 + Multiplier int64 + MaxWin int64 + } + // FortuneRabbitCashPrizeWeight comment + FortuneRabbitCashPrizeWeight struct { + ID int64 + PrizeValue float64 + Weight float64 + NoWinWeight float64 + } + // FortuneRabbitForceCashCountWeight comment + FortuneRabbitForceCashCountWeight struct { + ID int64 + Count int64 + Weight float64 + } + // FortuneRabbitOthers comment + FortuneRabbitOthers struct { + FreespinTriggerPro float64 + FreeSpinCount int64 + MaxWin int64 + } + // GateofOlympusMultiplier comment + GateofOlympusMultiplier struct { + Multiple int64 + ID int64 + Weights []int64 + } + // GateofOlympusReelChoose comment + GateofOlympusReelChoose struct { + ID int64 + IsFreeSpin bool + NodeType string + Weights []int64 + } + // JackpotPrize comment + JackpotPrize struct { + PrizeType int64 + PipeIn int64 + StartPoint int64 + IsRolling bool + RollingTime int64 + ReducePercent int64 + JackpotLimitByTotalBet int64 + } + // MapRTPMode comment + MapRTPMode struct { + ID int64 + TypeWeight map[int64]*MapRTPModeTypeWeight + Desc string + Rtp float64 + } + // MapRTPModeTypeWeight comment + MapRTPModeTypeWeight struct { + ID int64 + Weight int64 + } + // Matrix comment + Matrix struct { + Type string + LinkType int64 + Direction int64 + LineCount int64 + Lines [][]int64 + Form []int64 + } + // OptAuthenticate comment + OptAuthenticate struct { + Flag string + Order int64 + ValidValues []string + InvalidValues []string + } + // OptGroup comment + OptGroup struct { + ID int64 + Batch int64 + IsNewPlayer bool + StartTime string + EndTime string + Affect []int64 + Weight []int64 + } + // PrizeModel comment + PrizeModel struct { + ID int64 + AniType string + MinMultiple int64 + MaxMultiple int64 + } + // Scatter comment + Scatter struct { + ScatterCount int64 + FreeSpinBouts int64 + FreeSpinExtraBouts int64 + BasePayrate int64 + FreePayrate int64 + } + // ScatterFreeChoose comment + ScatterFreeChoose struct { + ID int64 + FreeSpinTimes int64 + TouchTimesMin int64 + TouchTimesMax int64 + } + // SimulatorFSMultiLevel comment + SimulatorFSMultiLevel struct { + Level int64 + Min int64 + Max int64 + } + // SuperStackWeight comment + SuperStackWeight struct { + ID int64 + ItemID int64 + Weight float64 + } + // Symbol comment + Symbol struct { + ID int64 + Name string + IsWild bool + Group []int64 + PayRate []int64 + ClientOrder int64 + ClientDsc string + } + // SymbolBetRatio comment + SymbolBetRatio struct { + BetRatio float64 + } + // TestRandomWeight comment + TestRandomWeight struct { + ID int64 + Time float64 + Weight float64 + } + // Text comment + Text struct { + Type string + Texts []*TextTexts + } + // TextTexts comment + TextTexts struct { + Lang string + Text string + } + // Vector comment + Vector struct { + Choice int64 + Ratio float64 + Vector []int64 + Procedure string + } + // VectorDemand comment + VectorDemand struct { + Choice int64 + MinRatio float64 + MaxRatio float64 + Procedure string + Count int64 + } + // VectorForceWin comment + VectorForceWin struct { + Choice int64 + MinRatio float64 + MaxRatio float64 + Weight float64 + } + // CashManiaBetBetChangeList comment + CashManiaBetBetChangeList = BetChangeList + + // CashManiaBetBetLevel comment + CashManiaBetBetLevel = BetLevel + + // CashManiaBetBetLine comment + CashManiaBetBetLine = BetLine + + // CashManiaBetBetSize comment + CashManiaBetBetSize = BetSize + + // CashManiaBetFirstBet comment + CashManiaBetFirstBet = FirstBet + + // CashManiaFormation comment + CashManiaFormation = Formation + + // CashManiaMapRTPMode comment + CashManiaMapRTPMode = MapRTPMode + + // CashManiaMapRTPModeTypeWeight comment + CashManiaMapRTPModeTypeWeight = MapRTPModeTypeWeight + + // CashManiaRandomMidWeight comment + CashManiaRandomMidWeight = CashManiaRandomItemWeight + + // CashManiaSymbol comment + CashManiaSymbol = Symbol + + // CashManiaSymbolBetRatio comment + CashManiaSymbolBetRatio = SymbolBetRatio + + // CashManiaWinItemWeight comment + CashManiaWinItemWeight = CashManiaRandomItemWeight + + // CashManiaWinMidWeight comment + CashManiaWinMidWeight = CashManiaRandomItemWeight + + // FortuneDragonBetBetChangeList comment + FortuneDragonBetBetChangeList = BetChangeList + + // FortuneDragonBetBetLevel comment + FortuneDragonBetBetLevel = BetLevel + + // FortuneDragonBetBetLine comment + FortuneDragonBetBetLine = BetLine + + // FortuneDragonBetBetSize comment + FortuneDragonBetBetSize = BetSize + + // FortuneDragonBetFirstBet comment + FortuneDragonBetFirstBet = FirstBet + + // FortuneDragonFormation comment + FortuneDragonFormation = Formation + + // FortuneDragonMapRTPMode comment + FortuneDragonMapRTPMode = MapRTPMode + + // FortuneDragonMapRTPModeTypeWeight comment + FortuneDragonMapRTPModeTypeWeight = MapRTPModeTypeWeight + + // FortuneDragonSymbol comment + FortuneDragonSymbol = Symbol + + // FortuneDragonSymbolBetRatio comment + FortuneDragonSymbolBetRatio = SymbolBetRatio + + // FortuneMouseBetBetChangeList comment + FortuneMouseBetBetChangeList = BetChangeList + + // FortuneMouseBetBetLevel comment + FortuneMouseBetBetLevel = BetLevel + + // FortuneMouseBetBetLine comment + FortuneMouseBetBetLine = BetLine + + // FortuneMouseBetBetSize comment + FortuneMouseBetBetSize = BetSize + + // FortuneMouseBetFirstBet comment + FortuneMouseBetFirstBet = FirstBet + + // FortuneMouseFormation comment + FortuneMouseFormation = Formation + + // FortuneMouseMapRTPMode comment + FortuneMouseMapRTPMode = MapRTPMode + + // FortuneMouseMapRTPModeTypeWeight comment + FortuneMouseMapRTPModeTypeWeight = MapRTPModeTypeWeight + + // FortuneMouseSuperStackWeight comment + FortuneMouseSuperStackWeight = SuperStackWeight + + // FortuneMouseSymbol comment + FortuneMouseSymbol = Symbol + + // FortuneMouseSymbolBetRatio comment + FortuneMouseSymbolBetRatio = SymbolBetRatio + + // FortuneOxBetBetChangeList comment + FortuneOxBetBetChangeList = BetChangeList + + // FortuneOxBetBetLevel comment + FortuneOxBetBetLevel = BetLevel + + // FortuneOxBetBetLine comment + FortuneOxBetBetLine = BetLine + + // FortuneOxBetBetSize comment + FortuneOxBetBetSize = BetSize + + // FortuneOxBetFirstBet comment + FortuneOxBetFirstBet = FirstBet + + // FortuneOxFormation comment + FortuneOxFormation = Formation + + // FortuneOxMapRTPMode comment + FortuneOxMapRTPMode = MapRTPMode + + // FortuneOxMapRTPModeTypeWeight comment + FortuneOxMapRTPModeTypeWeight = MapRTPModeTypeWeight + + // FortuneOxSuperStack1Weight comment + FortuneOxSuperStack1Weight = SuperStackWeight + + // FortuneOxSuperStack2Weight comment + FortuneOxSuperStack2Weight = SuperStackWeight + + // FortuneOxSymbol comment + FortuneOxSymbol = Symbol + + // FortuneOxSymbolBetRatio comment + FortuneOxSymbolBetRatio = SymbolBetRatio + + // FortuneRabbitBetBetChangeList comment + FortuneRabbitBetBetChangeList = BetChangeList + + // FortuneRabbitBetBetLevel comment + FortuneRabbitBetBetLevel = BetLevel + + // FortuneRabbitBetBetLine comment + FortuneRabbitBetBetLine = BetLine + + // FortuneRabbitBetBetSize comment + FortuneRabbitBetBetSize = BetSize + + // FortuneRabbitBetFirstBet comment + FortuneRabbitBetFirstBet = FirstBet + + // FortuneRabbitFormation comment + FortuneRabbitFormation = Formation + + // FortuneRabbitMapRTPMode comment + FortuneRabbitMapRTPMode = MapRTPMode + + // FortuneRabbitMapRTPModeTypeWeight comment + FortuneRabbitMapRTPModeTypeWeight = MapRTPModeTypeWeight + + // FortuneRabbitOthersRTP120 comment + FortuneRabbitOthersRTP120 = FortuneRabbitOthers + + // FortuneRabbitOthersRTP80 comment + FortuneRabbitOthersRTP80 = FortuneRabbitOthers + + // FortuneRabbitSymbol comment + FortuneRabbitSymbol = Symbol + + // FortuneRabbitSymbolBetRatio comment + FortuneRabbitSymbolBetRatio = SymbolBetRatio + + // FortuneTigerBetBetChangeList comment + FortuneTigerBetBetChangeList = BetChangeList + + // FortuneTigerBetBetLevel comment + FortuneTigerBetBetLevel = BetLevel + + // FortuneTigerBetBetLine comment + FortuneTigerBetBetLine = BetLine + + // FortuneTigerBetBetSize comment + FortuneTigerBetBetSize = BetSize + + // FortuneTigerBetFirstBet comment + FortuneTigerBetFirstBet = FirstBet + + // FortuneTigerFormation comment + FortuneTigerFormation = Formation + + // FortuneTigerMapRTPMode comment + FortuneTigerMapRTPMode = MapRTPMode + + // FortuneTigerMapRTPModeTypeWeight comment + FortuneTigerMapRTPModeTypeWeight = MapRTPModeTypeWeight + + // FortuneTigerOthers comment + FortuneTigerOthers = FortuneOxOthers + + // FortuneTigerSuperStackWeight comment + FortuneTigerSuperStackWeight = SuperStackWeight + + // FortuneTigerSymbol comment + FortuneTigerSymbol = Symbol + + // FortuneTigerSymbolBetRatio comment + FortuneTigerSymbolBetRatio = SymbolBetRatio + + // GateofOlympusBetBetChangeList comment + GateofOlympusBetBetChangeList = BetChangeList + + // GateofOlympusBetBetLevel comment + GateofOlympusBetBetLevel = BetLevel + + // GateofOlympusBetBetLine comment + GateofOlympusBetBetLine = BetLine + + // GateofOlympusBetBetSize comment + GateofOlympusBetBetSize = BetSize + + // GateofOlympusBetFirstBet comment + GateofOlympusBetFirstBet = FirstBet + + // GateofOlympusFormation comment + GateofOlympusFormation = Formation + + // GateofOlympusMapRTPMode comment + GateofOlympusMapRTPMode = MapRTPMode + + // GateofOlympusMapRTPModeTypeWeight comment + GateofOlympusMapRTPModeTypeWeight = MapRTPModeTypeWeight + + // GateofOlympusMultiplierKeyID comment + GateofOlympusMultiplierKeyID = GateofOlympusMultiplier + + // GateofOlympusScatter comment + GateofOlympusScatter = Scatter + + // GateofOlympusSymbol comment + GateofOlympusSymbol = Symbol + + // GateofOlympusSymbolBetRatio comment + GateofOlympusSymbolBetRatio = SymbolBetRatio + + // MatrixFeaturesForm15X1TypeA comment + MatrixFeaturesForm15X1TypeA = Matrix + + // MatrixFeaturesForm19X1TypeA comment + MatrixFeaturesForm19X1TypeA = Matrix + + // MatrixFeaturesForm20X1TypeA comment + MatrixFeaturesForm20X1TypeA = Matrix + + // MatrixFeaturesForm25X1TypeA comment + MatrixFeaturesForm25X1TypeA = Matrix + + // MatrixFeaturesForm30X1TypeA comment + MatrixFeaturesForm30X1TypeA = Matrix + + // MatrixFeaturesForm35X1TypeA comment + MatrixFeaturesForm35X1TypeA = Matrix + + // MatrixFeaturesForm40X1 comment + MatrixFeaturesForm40X1 = Matrix + + // MatrixFeaturesForm40X1TypeA comment + MatrixFeaturesForm40X1TypeA = Matrix + + // MatrixFeaturesForm7X1TypeA comment + MatrixFeaturesForm7X1TypeA = Matrix + + // MatrixLine100Form12X5TypeA comment + MatrixLine100Form12X5TypeA = Matrix + + // MatrixLine100Form6X5TypeA comment + MatrixLine100Form6X5TypeA = Matrix + + // MatrixLine10Form343TypeA comment + MatrixLine10Form343TypeA = Matrix + + // MatrixLine10Form3X5TypeA comment + MatrixLine10Form3X5TypeA = Matrix + + // MatrixLine1Form3X3TypeA comment + MatrixLine1Form3X3TypeA = Matrix + + // MatrixLine1Form3X3TypeB comment + MatrixLine1Form3X3TypeB = Matrix + + // MatrixLine1Form5X5TypeA comment + MatrixLine1Form5X5TypeA = Matrix + + // MatrixLine20Form3X5TypeA comment + MatrixLine20Form3X5TypeA = Matrix + + // MatrixLine25Form36666TypeA comment + MatrixLine25Form36666TypeA = Matrix + + // MatrixLine25Form3X5TypeA comment + MatrixLine25Form3X5TypeA = Matrix + + // MatrixLine25Form3X5TypeB comment + MatrixLine25Form3X5TypeB = Matrix + + // MatrixLine25Form3X5TypeC comment + MatrixLine25Form3X5TypeC = Matrix + + // MatrixLine25Form3X5TypeD comment + MatrixLine25Form3X5TypeD = Matrix + + // MatrixLine25Form3X5TypeE comment + MatrixLine25Form3X5TypeE = Matrix + + // MatrixLine30Form3X5TypeA comment + MatrixLine30Form3X5TypeA = Matrix + + // MatrixLine30Form3X5TypeB comment + MatrixLine30Form3X5TypeB = Matrix + + // MatrixLine30Form3X5TypeC comment + MatrixLine30Form3X5TypeC = Matrix + + // MatrixLine30Form3X5TypeD comment + MatrixLine30Form3X5TypeD = Matrix + + // MatrixLine30Form3X5TypeE comment + MatrixLine30Form3X5TypeE = Matrix + + // MatrixLine30Form3X6TypeA comment + MatrixLine30Form3X6TypeA = Matrix + + // MatrixLine30Form4X5TypeA comment + MatrixLine30Form4X5TypeA = Matrix + + // MatrixLine30Form4X5TypeB comment + MatrixLine30Form4X5TypeB = Matrix + + // MatrixLine3Form3X3TypeA comment + MatrixLine3Form3X3TypeA = Matrix + + // MatrixLine40Form34543TypeA comment + MatrixLine40Form34543TypeA = Matrix + + // MatrixLine40Form3X5TypeA comment + MatrixLine40Form3X5TypeA = Matrix + + // MatrixLine40Form3X5TypeB comment + MatrixLine40Form3X5TypeB = Matrix + + // MatrixLine40Form3X5TypeC comment + MatrixLine40Form3X5TypeC = Matrix + + // MatrixLine40Form3X5TypeD comment + MatrixLine40Form3X5TypeD = Matrix + + // MatrixLine40Form4X5TypeA comment + MatrixLine40Form4X5TypeA = Matrix + + // MatrixLine40Form4X5TypeB comment + MatrixLine40Form4X5TypeB = Matrix + + // MatrixLine40Form4X5TypeC comment + MatrixLine40Form4X5TypeC = Matrix + + // MatrixLine40Form4X6TypeA comment + MatrixLine40Form4X6TypeA = Matrix + + // MatrixLine50Form3X5TypeA comment + MatrixLine50Form3X5TypeA = Matrix + + // MatrixLine50Form3X5TypeB comment + MatrixLine50Form3X5TypeB = Matrix + + // MatrixLine50Form3X5TypeC comment + MatrixLine50Form3X5TypeC = Matrix + + // MatrixLine50Form3X5TypeD comment + MatrixLine50Form3X5TypeD = Matrix + + // MatrixLine50Form3X5TypeE comment + MatrixLine50Form3X5TypeE = Matrix + + // MatrixLine50Form3X5TypeF comment + MatrixLine50Form3X5TypeF = Matrix + + // MatrixLine50Form3X5TypeG comment + MatrixLine50Form3X5TypeG = Matrix + + // MatrixLine50Form3X5TypeH comment + MatrixLine50Form3X5TypeH = Matrix + + // MatrixLine50Form45454TypeA comment + MatrixLine50Form45454TypeA = Matrix + + // MatrixLine50Form4X5TypeA comment + MatrixLine50Form4X5TypeA = Matrix + + // MatrixLine50Form4X5TypeB comment + MatrixLine50Form4X5TypeB = Matrix + + // MatrixLine50Form4X5TypeC comment + MatrixLine50Form4X5TypeC = Matrix + + // MatrixLine50Form4X5TypeD comment + MatrixLine50Form4X5TypeD = Matrix + + // MatrixLine50Form4X5TypeE comment + MatrixLine50Form4X5TypeE = Matrix + + // MatrixLine50Form4X5TypeF comment + MatrixLine50Form4X5TypeF = Matrix + + // MatrixLine50Form4X6TypeA comment + MatrixLine50Form4X6TypeA = Matrix + + // MatrixLine50Form5X5TypeA comment + MatrixLine50Form5X5TypeA = Matrix + + // MatrixLine50Form5X5TypeB comment + MatrixLine50Form5X5TypeB = Matrix + + // MatrixLine50Form5X5TypeC comment + MatrixLine50Form5X5TypeC = Matrix + + // MatrixLine50Form6X5TypeA comment + MatrixLine50Form6X5TypeA = Matrix + + // MatrixLine5Form3X3TypeA comment + MatrixLine5Form3X3TypeA = Matrix + + // MatrixLine5Form3X3TypeB comment + MatrixLine5Form3X3TypeB = Matrix + + // MatrixLine60Form33633TypeA comment + MatrixLine60Form33633TypeA = Matrix + + // MatrixLine60Form8X5TypeA comment + MatrixLine60Form8X5TypeA = Matrix + + // MatrixLine65Form6X5TypeA comment + MatrixLine65Form6X5TypeA = Matrix + + // MatrixLine70Form9X5TypeA comment + MatrixLine70Form9X5TypeA = Matrix + + // MatrixLine75Form5X6TypeA comment + MatrixLine75Form5X6TypeA = Matrix + + // MatrixLine75Form6X5TypeA comment + MatrixLine75Form6X5TypeA = Matrix + + // MatrixLine80Form10X5TypeA comment + MatrixLine80Form10X5TypeA = Matrix + + // MatrixLine80Form3X5TypeA comment + MatrixLine80Form3X5TypeA = Matrix + + // MatrixLine80Form4X6TypeA comment + MatrixLine80Form4X6TypeA = Matrix + + // MatrixLine80Form7X5TypeA comment + MatrixLine80Form7X5TypeA = Matrix + + // MatrixLine90Form11X5TypeA comment + MatrixLine90Form11X5TypeA = Matrix + + // MatrixLine95Form8X5TypeA comment + MatrixLine95Form8X5TypeA = Matrix + + // MatrixMatchForm7X7TypeA comment + MatrixMatchForm7X7TypeA = Matrix + + // MatrixSameForm5X6TypeA comment + MatrixSameForm5X6TypeA = Matrix + + // MatrixSameForm5X6TypeB comment + MatrixSameForm5X6TypeB = Matrix + + // MatrixWaysForm333331 comment + MatrixWaysForm333331 = Matrix + + // MatrixWaysForm33555 comment + MatrixWaysForm33555 = Matrix + + // MatrixWaysForm344444 comment + MatrixWaysForm344444 = Matrix + + // MatrixWaysForm3X5TypeA comment + MatrixWaysForm3X5TypeA = Matrix + + // MatrixWaysForm44668 comment + MatrixWaysForm44668 = Matrix + + // MatrixWaysForm4X5TypeA comment + MatrixWaysForm4X5TypeA = Matrix + + // MatrixWaysForm4X5TypeB comment + MatrixWaysForm4X5TypeB = Matrix + + // PrizeModelPrizeModelTypeA comment + PrizeModelPrizeModelTypeA = PrizeModel + + // PrizeModelPrizeModelTypeB comment + PrizeModelPrizeModelTypeB = PrizeModel + + // SimulatorMultiLevel comment + SimulatorMultiLevel = SimulatorFSMultiLevel + + // TestBetBetChangeList comment + TestBetBetChangeList = BetChangeList + + // TestBetBetLevel comment + TestBetBetLevel = BetLevel + + // TestBetBetLine comment + TestBetBetLine = BetLine + + // TestBetBetSize comment + TestBetBetSize = BetSize + + // TestBetFirstBet comment + TestBetFirstBet = FirstBet + + // TestFormation comment + TestFormation = Formation + + // TestMapRTPMode comment + TestMapRTPMode = MapRTPMode + + // TestMapRTPModeTypeWeight comment + TestMapRTPModeTypeWeight = MapRTPModeTypeWeight + + // TestSymbol comment + TestSymbol = Symbol + + // TestSymbolBetRatio comment + TestSymbolBetRatio = SymbolBetRatio + +) \ No newline at end of file diff --git a/gamesrv/slotspkg/internal/generic/ddb/config.go b/gamesrv/slotspkg/internal/generic/ddb/config.go new file mode 100644 index 0000000..6ecb47d --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/ddb/config.go @@ -0,0 +1,65 @@ +package ddb + +import "github.com/tomas-qstarrs/boost/config" + +type Table struct { + TableName string + IndexName string + PartitionKey string + SortKey string + SortKeyNum string +} + +type Provisioned struct { + ReadCapacityUnits int64 + WriteCapacityUnits int64 +} + +type Endpoint struct { + PartitionID string + URL string + SigningRegion string +} + +type Credentials struct { + AccessKeyID string + SecretAccessKey string + SessionToken string + Source string +} + +type Config struct { + Table Table + Provisioned Provisioned + Endpoint Endpoint + Credentials Credentials + TransactionSize int +} + +func NewConfig() *Config { + return &Config{ + Table: Table{ + TableName: config.GetString("ddb.table.tableName"), + IndexName: config.GetString("ddb.table.indexName"), + PartitionKey: config.GetString("ddb.table.partitionKey"), + SortKey: config.GetString("ddb.table.sortKey"), + SortKeyNum: config.GetString("ddb.table.sortKeyNum"), + }, + Provisioned: Provisioned{ + ReadCapacityUnits: config.GetInt64("ddb.provisioned.readCapacityUnits"), + WriteCapacityUnits: config.GetInt64("ddb.provisioned.writeCapacityUnits"), + }, + Endpoint: Endpoint{ + PartitionID: config.GetString("ddb.endpoint.partitionID"), + URL: config.GetString("ddb.endpoint.url"), + SigningRegion: config.GetString("ddb.endpoint.signingRegion"), + }, + Credentials: Credentials{ + AccessKeyID: config.GetString("ddb.credentials.accessKeyID"), + SecretAccessKey: config.GetString("ddb.credentials.secretAccessKey"), + SessionToken: config.GetString("ddb.credentials.sessionToken"), + Source: config.GetString("ddb.credentials.source"), + }, + TransactionSize: config.GetInt("ddb.transactionSize"), + } +} diff --git a/gamesrv/slotspkg/internal/generic/ddb/ddb.go b/gamesrv/slotspkg/internal/generic/ddb/ddb.go new file mode 100644 index 0000000..6382e35 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/ddb/ddb.go @@ -0,0 +1,113 @@ +package ddb + +import ( + "context" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/service/dynamodb" + "github.com/tomas-qstarrs/redimo" +) + +type DDB struct { + *Config + dynamodbClient *dynamodb.Client + redimoClient *redimo.Client +} + +func Init() { + ddb.init() +} + +var ddb = &DDB{} + +func (ddb *DDB) init() { + ddb.initConfig() + ddb.initClient() + ddb.initTable() +} + +func (ddb *DDB) initConfig() { + ddb.Config = NewConfig() +} + +func (ddb *DDB) initClient() { + var ( + sdkConfig aws.Config + err error + ) + var options []func(*config.LoadOptions) error + + if ddb.Endpoint.URL != "" || ddb.Endpoint.PartitionID != "" || + ddb.Endpoint.SigningRegion != "" { + options = append(options, config.WithEndpointResolverWithOptions( + aws.EndpointResolverWithOptionsFunc( + func(service, region string, _ ...interface{}) ( + aws.Endpoint, error) { + if service == dynamodb.ServiceID { + return aws.Endpoint{ + URL: ddb.Endpoint.URL, + PartitionID: ddb.Endpoint.PartitionID, + SigningRegion: ddb.Endpoint.SigningRegion, + }, nil + } + return aws.Endpoint{}, &aws.EndpointNotFoundError{} + }, + ), + )) + } + + if ddb.Credentials.AccessKeyID != "" || ddb.Credentials.SecretAccessKey != "" || + ddb.Credentials.SessionToken != "" || ddb.Credentials.Source != "" { + options = append(options, config.WithCredentialsProvider( + aws.CredentialsProviderFunc( + func(_ context.Context) (aws.Credentials, error) { + return aws.Credentials{ + AccessKeyID: ddb.Credentials.AccessKeyID, + SecretAccessKey: ddb.Credentials.SecretAccessKey, + SessionToken: ddb.Credentials.SessionToken, + Source: ddb.Credentials.Source, + }, nil + }, + ), + )) + } + sdkConfig, err = config.LoadDefaultConfig(context.Background(), options...) + if err != nil { + panic(err) + } + + ddb.dynamodbClient = dynamodb.NewFromConfig(sdkConfig) + + redimoClientStruct := redimo.NewClient( + ddb.dynamodbClient, + ).Table( + ddb.Table.TableName, + ).Index( + ddb.Table.IndexName, + ).Attributes( + ddb.Table.PartitionKey, + ddb.Table.SortKey, + ddb.Table.SortKeyNum, + ).TransactionActions( + ddb.TransactionSize, + ) + ddb.redimoClient = &redimoClientStruct +} + +func (ddb *DDB) initTable() { + if ok, err := ddb.redimoClient.ExistsTable(); err != nil { + panic(err) + } else if !ok { + if err := ddb.redimoClient.CreateTable(ddb.Provisioned.ReadCapacityUnits, ddb.Provisioned.WriteCapacityUnits); err != nil { + panic(err) + } + } +} + +func DynamoDBClient() *dynamodb.Client { + return ddb.dynamodbClient +} + +func RedimoClient() *redimo.Client { + return ddb.redimoClient +} diff --git a/gamesrv/slotspkg/internal/generic/errors/errors.go b/gamesrv/slotspkg/internal/generic/errors/errors.go new file mode 100644 index 0000000..1527b6b --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/errors/errors.go @@ -0,0 +1,332 @@ +package errors + +const ( + Nil Code = 0 + + ErrorBegin Code = 999 + iota + EnterErr + SpinErr + JwtErr + FreshCoinErr + ErrorTransactionFailed + + GMIsNotAvailable + UsernameAlreadyExists + UsernameNotExists + PasswordInvalid + InvalidAward + TurntableNotPayUser + TurntableNotEnoughCoin + ErrorDeregistered + ErrorNotImplemented + SettleFuncNotFound + CoinBagNotFound + CoinBagTypeError + CanceledLogin + AccessTypeInvalid + AccessArgsInvalid + AccessIsBanned + UIDRequired + GoogleVerifyFailed + GetGoogleAccessTokenFailed + ProductIDNotMatch + PackageNameInvalid + ReceiptDataInvalid + TransactionIDNotMatch + ConfigTypeError + ConfigRowNoMatch + ConfigKeyNotFound + ConfigInvalidZero + ConfigSheetNotFound + ConfigSheetEmpty + ConfigTimeFormatError + ConfigCategoryNotFound + ConfigExcelNotFound + UIDInvalid + ThemeNotFound + LeakTheme + LeakThemeData + LackOfCoins + NodeNotFound + NextNodeNotFound + FormationNotFound + FeatureNotFound + FeatureTypeNotFound + CustomNotFound + CustomNil + FeatureAlreadyExists + PlayerNotFound + FormationReelWeightNotMatch + FormationSeqIDNotFound + FormationSymbolNotFound + FormationLinkPayIsNotFound + FormationDirectionNotSupport + SymbolsLengthNotEqual + DataInvalidConversion + NewNodeZeroProgress + BetIsZero + InvalidBetIndex + InvalidCoinValueIndex + GameCheatInvalidKey + AirplaneHasRoom + AirplaneHasNoRoom + AirplaneHasNoBet + AirplaneStateInvalid + AirplaneBetCoinNotEnough + AirplaneCarryCoinNotEnough + AirplaneHasJumped + AirplaneCoinNotEnough + AirplaneRoomNotFound + AirplaneBetAmountInvalid + DiceHasRoom + DiceHasNoRoom + DiceStateInvalid + DiceBetCoinNotEnough + DiceBetAmountInvalid + DiceBetPositionInvalid + DiceCarryCoinNotEnough + DoubleHasRoom + DoubleHasNoRoom + DoubleStateInvalid + DoubleBetCoinNotEnough + DoubleBetAmountInvalid + DoubleCarryCoinNotEnough + MinesIsPlaying + MinesIsNotPlaying + MinesOpenDuplicate + MinesStepZero + MinesCoinNotEnough + MinesCarryCoinNotEnough + MinesBetAmountInvalid + MinesCountInvalid + MinesOpenIndexInvalid + BindDeviceAccessIsInvalid + PlayerAlreadyBoundToThirdPlatform + ThirdPlatformAlreadyBoundToPlayer + GoodsIDNotExist + CoinNotEnough + RemoteLogin + ParallelLogin + DataSetInvalid + AuthenticateLoginInvalid + LuckyWheelBetAmountInvalid + LuckyWheelCarryCoinNotEnough + LuckyWheelCoinNotEnough + NotNewbie + DirectInviterExist + InviterUIDCantSelf + InviterUIDInvalid + AirplaneAutoJumpInvalid + DoubleDisplayLimit + ClubHasRoom + ClubHasNoRoom + ClubStateInvalid + ClubBetCoinNotEnough + ClubBetAmountInvalid + ClubBetPositionInvalid + ClubCarryCoinNotEnough + BonusStateInvalid + WeeklyDealsFreeBonusFetched + WeeklyDealsFreeBonusInvalid + LoginRequired + PhoneNumberInvalid // 电话号码格式错误 + PhoneVerifyCodeError // 验证码输入错误 + PhoneVerifyCodeVerified // 验证码已被使用 + PhoneVerifyCodeExpired // 验证码已过期 + PlayerAlreadyBoundToPhoneNumber // 此账号已经绑定了手机号码 + PhoneNumberAlreadyBoundToPlayer // 此手机号码已经被绑定了其他账号 + PhoneVerifyCodeTotalLimit // 验证码使用次数超过总限制 + PhoneVerifyCodeDailyLimit // 验证码使用次数超过每日限制 + PhoneVerifyCodeLimitDuration // 验证码发送太频繁,请稍后再试 + VipCashbackInvalid + VipCashbackNotEnough + VipRewardInvalid + VipRewardFetched + InvalidPhoneMessageType + InnerIDInvalid + PurchaseAuthenticateFailed + PurchaseCloseFailed + BranchError + MemberCardInvalid + PlinkoBetAmountInvalid + PlinkoCarryCoinNotEnough + PlinkoCoinNotEnough + PassGetLevelRewardInvalid + PassNotActivated + SystemNotOpen + CoinNegative + LinearDiceBetAmountInvalid + LinearDiceValueInvalid + LinearDiceCarryCoinNotEnough + LinearDiceCoinNotEnough + VipRewardLocked + PackageNotFound + AbaCashbackInvalid + AccountDelete + + // Add new error above this line + ErrorEnd +) + +var Errors = map[Code]string{ + // Generic + Nil: "Nil", + EnterErr: "EnterErr", + SpinErr: "SpinErr", + JwtErr: "JwtErr", + FreshCoinErr: "FreshCoinErr", + ErrorTransactionFailed: "ErrorTransactionFailed", + GMIsNotAvailable: "GMIsNotAvailable", + UsernameAlreadyExists: "UsernameAlreadyExists", + UsernameNotExists: "UsernameNotExists", + PasswordInvalid: "PasswordInvalid", + InvalidAward: "InvalidAward", + TurntableNotPayUser: "TurntableNotPayUser", + TurntableNotEnoughCoin: "TurntableNotEnoughCoin", + ErrorDeregistered: "ErrorDeregistered", + ErrorNotImplemented: "ErrorNotImplemented", + SettleFuncNotFound: "SettleFuncNotFound", + CoinBagNotFound: "CoinBagNotFound", + CoinBagTypeError: "CoinBagTypeError", + RemoteLogin: "RemoteLogin", + CanceledLogin: "CanceledLogin", + AccessTypeInvalid: "AccessTypeInvalid", + AccessArgsInvalid: "AccessArgsInvalid", + AccessIsBanned: "AccessIsBanned", + UIDRequired: "UIDRequired", + GoogleVerifyFailed: "GoogleVerifyFailed", + GetGoogleAccessTokenFailed: "GetGoogleAccessTokenFailed", + ProductIDNotMatch: "ProductIDNotMatch", + PackageNameInvalid: "PackageNameInvalid", + ReceiptDataInvalid: "ReceiptDataInvalid", + TransactionIDNotMatch: "TransactionIDNotMatch", + ConfigTypeError: "ConfigTypeError", + ConfigRowNoMatch: "ConfigRowNoMatch", + ConfigKeyNotFound: "ConfigKeyNotFound", + ConfigInvalidZero: "ConfigInvalidZero", + ConfigSheetNotFound: "ConfigSheetNotFound", + ConfigSheetEmpty: "ConfigSheetEmpty", + ConfigTimeFormatError: "ConfigTimeFormatError", + ConfigCategoryNotFound: "ConfigCategoryNotFound", + ConfigExcelNotFound: "ConfigExcelNotFound", + UIDInvalid: "UIDInvalid", + ThemeNotFound: "ThemeNotFound", + LeakTheme: "LeakTheme", + LeakThemeData: "LeakThemeData", + LackOfCoins: "LackOfCoins", + NodeNotFound: "NodeNotFound", + NextNodeNotFound: "NextNodeNotFound", + FormationNotFound: "FormationNotFound", + FeatureNotFound: "FeatureNotFound", + FeatureTypeNotFound: "FeatureTypeNotFound", + CustomNotFound: "CustomNotFound", + CustomNil: "CustomNil", + FeatureAlreadyExists: "FeatureAlreadyExists", + PlayerNotFound: "PlayerNotFound", + FormationReelWeightNotMatch: "FormationReelWeightNotMatch", + FormationSeqIDNotFound: "FormationSeqIDNotFound", + FormationSymbolNotFound: "FormationSymbolNotFound", + FormationLinkPayIsNotFound: "FormationLinkPayIsNotFound", + FormationDirectionNotSupport: "FormationDirectionNotSupport", + SymbolsLengthNotEqual: "SymbolsLengthNotEqual", + DataInvalidConversion: "DataInvalidConversion", + NewNodeZeroProgress: "NewNodeZeroProgress", + BetIsZero: "BetIsZero", + InvalidBetIndex: "InvalidBetIndex", + InvalidCoinValueIndex: "InvalidCoinValueIndex", + GameCheatInvalidKey: "GameCheatInvalidKey", + AirplaneHasRoom: "AirplaneHasRoom", + AirplaneHasNoRoom: "AirplaneHasNoRoom", + AirplaneHasNoBet: "AirplaneHasNoBet", + AirplaneStateInvalid: "AirplaneStateInvalid", + AirplaneBetCoinNotEnough: "AirplaneBetCoinNotEnough", + AirplaneCarryCoinNotEnough: "AirplaneCarryCoinNotEnough", + AirplaneHasJumped: "AirplaneHasJumped", + AirplaneCoinNotEnough: "AirplaneCoinNotEnough", + AirplaneRoomNotFound: "AirplaneRoomNotFound", + AirplaneBetAmountInvalid: "AirplaneBetAmountInvalid", + DiceHasRoom: "DiceHasRoom", + DiceHasNoRoom: "DiceHasNoRoom", + DiceStateInvalid: "DiceStateInvalid", + DiceBetCoinNotEnough: "DiceBetCoinNotEnough", + DiceBetAmountInvalid: "DiceBetAmountInvalid", + DiceBetPositionInvalid: "DiceBetPositionInvalid", + DiceCarryCoinNotEnough: "DiceCarryCoinNotEnough", + DoubleHasRoom: "DoubleHasRoom", + DoubleHasNoRoom: "DoubleHasNoRoom", + DoubleStateInvalid: "DoubleStateInvalid", + DoubleBetCoinNotEnough: "DoubleBetCoinNotEnough", + DoubleBetAmountInvalid: "DoubleBetAmountInvalid", + DoubleCarryCoinNotEnough: "DoubleCarryCoinNotEnough", + MinesIsPlaying: "MinesIsPlaying", + MinesIsNotPlaying: "MinesIsNotPlaying", + MinesOpenDuplicate: "MinesOpenDuplicate", + MinesStepZero: "MinesStepZero", + MinesCoinNotEnough: "MinesCoinNotEnough", + MinesCarryCoinNotEnough: "MinesCarryCoinNotEnough", + MinesBetAmountInvalid: "MinesBetAmountInvalid", + MinesCountInvalid: "MinesCountInvalid", + MinesOpenIndexInvalid: "MinesOpenIndexInvalid", + BindDeviceAccessIsInvalid: "BindDeviceAccessIsInvalid", + PlayerAlreadyBoundToThirdPlatform: "PlayerAlreadyBoundToThirdPlatform", + ThirdPlatformAlreadyBoundToPlayer: "ThirdPlatformAlreadyBoundToPlayer", + GoodsIDNotExist: "GoodsIDNotExist", + CoinNotEnough: "CoinNotEnough", + ParallelLogin: "ParallelLogin", + DataSetInvalid: "DataSetInvalid", + AuthenticateLoginInvalid: "AuthenticateLoginInvalid", + LuckyWheelBetAmountInvalid: "LuckyWheelBetAmountInvalid", + LuckyWheelCarryCoinNotEnough: "LuckyWheelCarryCoinNotEnough", + LuckyWheelCoinNotEnough: "LuckyWheelCoinNotEnough", + NotNewbie: "NotNewbie", + DirectInviterExist: "DirectInviterExist", + InviterUIDCantSelf: "InviterUIDCantSelf", + InviterUIDInvalid: "InviterUIDInvalid", + AirplaneAutoJumpInvalid: "AirplaneAutoJumpInvalid", + DoubleDisplayLimit: "DoubleDisplayLimit", + ClubHasRoom: "ClubHasRoom", + ClubHasNoRoom: "ClubHasNoRoom", + ClubStateInvalid: "ClubStateInvalid", + ClubBetCoinNotEnough: "ClubBetCoinNotEnough", + ClubBetAmountInvalid: "ClubBetAmountInvalid", + ClubBetPositionInvalid: "ClubBetPositionInvalid", + ClubCarryCoinNotEnough: "ClubCarryCoinNotEnough", + BonusStateInvalid: "BonusStateInvalid", + WeeklyDealsFreeBonusFetched: "WeeklyDealsFreeBonusFetched", + WeeklyDealsFreeBonusInvalid: "WeeklyDealsFreeBonusInvalid", + LoginRequired: "LoginRequired", + PhoneNumberInvalid: "PhoneNumberInvalid", + PhoneVerifyCodeError: "PhoneVerifyCodeError", + PhoneVerifyCodeVerified: "PhoneVerifyCodeVerified", + PhoneVerifyCodeExpired: "PhoneVerifyCodeExpired", + PlayerAlreadyBoundToPhoneNumber: "PlayerAlreadyBoundToPhoneNumber", + PhoneNumberAlreadyBoundToPlayer: "PhoneNumberAlreadyBoundToPlayer", + PhoneVerifyCodeTotalLimit: "PhoneVerifyCodeTotalLimit", + PhoneVerifyCodeDailyLimit: "PhoneVerifyCodeDailyLimit", + PhoneVerifyCodeLimitDuration: "PhoneVerifyCodeLimitDuration", + VipCashbackInvalid: "VipCashbackInvalid", + VipCashbackNotEnough: "VipCashbackNotEnough", + VipRewardInvalid: "VipRewardInvalid", + VipRewardFetched: "VipRewardFetched", + InvalidPhoneMessageType: "InvalidPhoneMessageType", + InnerIDInvalid: "InnerIDInvalid", + PurchaseAuthenticateFailed: "PurchaseAuthenticateFailed", + PurchaseCloseFailed: "PurchaseCloseFailed", + BranchError: "BranchError", + MemberCardInvalid: "MemberCardInvalid", + PlinkoBetAmountInvalid: "PlinkoBetAmountInvalid", + PlinkoCarryCoinNotEnough: "PlinkoCarryCoinNotEnough", + PlinkoCoinNotEnough: "PlinkoCoinNotEnough", + PassGetLevelRewardInvalid: "PassGetLevelRewardInvalid", + PassNotActivated: "PassNotActivated", + SystemNotOpen: "SystemNotOpen", + CoinNegative: "CoinNegative", + LinearDiceBetAmountInvalid: "LinearDiceBetAmountInvalid", + LinearDiceValueInvalid: "LinearDiceValueInvalid", + LinearDiceCarryCoinNotEnough: "LinearDiceCarryCoinNotEnough", + LinearDiceCoinNotEnough: "LinearDiceCoinNotEnough", + VipRewardLocked: "VipRewardLocked", + PackageNotFound: "PackageNotFound", + AbaCashbackInvalid: "AbaCashbackInvalid", + AccountDelete: "AccountDelete", +} diff --git a/gamesrv/slotspkg/internal/generic/errors/errors_test.go b/gamesrv/slotspkg/internal/generic/errors/errors_test.go new file mode 100644 index 0000000..0be178e --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/errors/errors_test.go @@ -0,0 +1,20 @@ +package errors_test + +import ( + "testing" + + "qstar_server/internal/generic/errors" +) + +func TestEnum(t *testing.T) { + t.Log(errors.ConfigSheetNotFound.Error()) +} + +func TestReflect(t *testing.T) { + if errors.Reflect(nil) != errors.Nil { + t.Error("errors reflect failed") + } + if errors.Reflect(errors.ConfigSheetNotFound.Error()) != errors.ConfigSheetNotFound { + t.Error("errors reflect failed") + } +} diff --git a/gamesrv/slotspkg/internal/generic/errors/format.go b/gamesrv/slotspkg/internal/generic/errors/format.go new file mode 100644 index 0000000..f85bea4 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/errors/format.go @@ -0,0 +1,225 @@ +package errors + +import ( + "errors" + "fmt" + "runtime" + "strings" + + "github.com/tomas-qstarrs/boost/cast" +) + +// LastPart splits s with sep, and get last piece +func LastPart(s string, sep string) string { + lastIndex := strings.LastIndex(s, sep) + if lastIndex < 0 { + return s + } + return s[lastIndex+len(sep):] +} + +// Error is a wrapper for error +func Error(err error) error { + pc := make([]uintptr, 1) + runtime.Callers(2, pc) + funcName := runtime.FuncForPC(pc[0]).Name() + funcName = LastPart(funcName, "qstar_server/") + + _, file, line, ok := runtime.Caller(1) + if !ok { + panic(fmt.Errorf("get file & line failed")) + } + file = LastPart(file, "qstar_server/") + fileLine := fmt.Sprintf("%s:%d", file, line) + + newErr := fmt.Errorf("\n - line: %s\n - func: %s \n - error: %w", + fileLine, funcName, err) + + // Assert here: errors.Is(newErr, err) == true + return newErr +} + +// Errorf is a wrapper for fmt.Errorf +func Errorf(format string, a ...interface{}) error { + pc := make([]uintptr, 1) + runtime.Callers(2, pc) + funcName := runtime.FuncForPC(pc[0]).Name() + funcName = LastPart(funcName, "qstar_server/") + + _, file, line, ok := runtime.Caller(1) + if !ok { + panic(fmt.Errorf("get file & line failed")) + } + file = LastPart(file, "qstar_server/") + fileLine := fmt.Sprintf("%s:%d", file, line) + + err := fmt.Errorf(format, a...) + newErr := fmt.Errorf("\n - line: %s\n - func: %s \n - error: %w", + fileLine, funcName, err) + + // Assert here: errors.Is(newErr, err) == true + return newErr +} + +type ( + // Code is error's code + Code int64 +) + +func Reflect(err error) Code { + if err == nil { + return Nil + } + e := errors.Unwrap(err) + if e == nil { + return ErrorDeregistered + } + code, ok := Codes[e] + if !ok { + return ErrorDeregistered + } + return code +} + +// ErrorWith returns an error with tags created by errors.New() +func (e Code) ErrorWith(tags ...interface{}) error { + if e == Nil { + return nil + } + + pc := make([]uintptr, 1) + runtime.Callers(2, pc) + funcName := runtime.FuncForPC(pc[0]).Name() + funcName = LastPart(funcName, "qstar_server/") + + _, file, line, ok := runtime.Caller(1) + if !ok { + panic(fmt.Errorf("get file & line failed")) + } + file = LastPart(file, "qstar_server/") + fileLine := fmt.Sprintf("%s:%d", file, line) + + strTags := make([]string, 0) + for _, tag := range tags { + strTags = append(strTags, cast.ToString(tag)) + } + + newErr := fmt.Errorf("\n - line: %s\n - func: %s\n - error: %w\n - tags: %s", + fileLine, funcName, Errs[e], strings.Join(strTags, " & ")) + + // Assert here: errors.Is(newErr, err) == true + return newErr +} + +// ErrorWithCause returns an error with default tags created by errors.New() +func (e Code) Error() error { + if e == Nil { + return nil + } + + pc := make([]uintptr, 1) + runtime.Callers(2, pc) + funcName := runtime.FuncForPC(pc[0]).Name() + funcName = LastPart(funcName, "qstar_server/") + + _, file, line, ok := runtime.Caller(1) + if !ok { + panic(fmt.Errorf("get file & line failed")) + } + file = LastPart(file, "qstar_server/") + fileLine := fmt.Sprintf("%s:%d", file, line) + + newErr := fmt.Errorf("\n - line: %s\n - func: %s \n - error: %w", + fileLine, funcName, Errs[e]) + + // Assert here: errors.Is(newErr, err) == true + return newErr +} + +func (e Code) Is(err error) bool { + return errors.Is(err, Errs[e]) +} + +// Code returns the code of error +func (e Code) Code() int64 { + return int64(e) +} + +// Message returns the msg of error +func (e Code) String() string { + return Errs[e].Error() +} + +// Origin returns origin Error +func (e Code) Origin() error { + return Errs[e] +} + +// Tag stores tag info for create an error +type Tag struct { + Data []interface{} +} + +// With creates a Tag ojbect with tags data +func With(tags ...interface{}) *Tag { + tag := &Tag{} + tag.Data = tags + return tag +} + +// Error returns an error with tags created by errors.New() +func (t *Tag) Error(err error) error { + if t == nil { + return nil + } + + pc := make([]uintptr, 1) + runtime.Callers(2, pc) + funcName := runtime.FuncForPC(pc[0]).Name() + funcName = LastPart(funcName, "qstar_server/") + + _, file, line, ok := runtime.Caller(1) + if !ok { + panic(fmt.Errorf("get file & line failed")) + } + file = LastPart(file, "qstar_server/") + fileLine := fmt.Sprintf("%s:%d", file, line) + + strTags := make([]string, 0) + for _, tag := range t.Data { + strTags = append(strTags, cast.ToString(tag)) + } + + newErr := fmt.Errorf("\n - line: %s\n - func: %s\n - error: %w\n - tags: %s", + fileLine, funcName, err, strings.Join(strTags, " & ")) + + // Assert here: errors.Is(newErr, err) == true + return newErr +} + +// Errorf returns an error with tags created by fmt.Errorf() +func (t *Tag) Errorf(format string, a ...interface{}) error { + pc := make([]uintptr, 1) + runtime.Callers(2, pc) + funcName := runtime.FuncForPC(pc[0]).Name() + funcName = LastPart(funcName, "qstar_server/") + + _, file, line, ok := runtime.Caller(1) + if !ok { + panic(fmt.Errorf("get file & line failed")) + } + file = LastPart(file, "qstar_server/") + fileLine := fmt.Sprintf("%s:%d", file, line) + + strTags := make([]string, 0) + for _, tag := range t.Data { + strTags = append(strTags, cast.ToString(tag)) + } + + err := fmt.Errorf(format, a...) + newErr := fmt.Errorf("\n - line: %s\n - func: %s\n - error: %w\n - tags: %s", + fileLine, funcName, err, strings.Join(strTags, " & ")) + + // Assert here: errors.Is(newErr, err) == true + return newErr +} diff --git a/gamesrv/slotspkg/internal/generic/errors/init.go b/gamesrv/slotspkg/internal/generic/errors/init.go new file mode 100644 index 0000000..b34b914 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/errors/init.go @@ -0,0 +1,42 @@ +package errors + +import "github.com/idealeak/goserver/core/logger" + +var ( + begins = []Code{ErrorBegin} + ends = []Code{ErrorEnd} +) + +var ( + Errs = make(map[Code]error) + Codes = make(map[error]Code) + Keys = make(map[Code]string) +) + +func init() { + checkSection() + initErrs() +} + +func checkSection() { + for index := 0; index < len(begins); index++ { + var last string + for e := begins[index] + 1; e < ends[index]; e++ { + s, ok := Errors[e] + if !ok { + logger.Logger.Debugf("Error id %d is not ready for exporting lua, which should be written below %s.", e, last) + } else { + last = s + } + } + } +} + +func initErrs() { + for code, text := range Errors { + err := New(text) + Errs[code] = err + Codes[err] = code + Keys[code] = text + } +} diff --git a/gamesrv/slotspkg/internal/generic/errors/wrapper.go b/gamesrv/slotspkg/internal/generic/errors/wrapper.go new file mode 100644 index 0000000..3aa22ee --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/errors/wrapper.go @@ -0,0 +1,25 @@ +package errors + +import ( + "errors" +) + +// As is a wrapper for errors.As +func As(err error, target interface{}) bool { + return errors.As(err, target) +} + +// Is is a wrapper for errors.Is +func Is(err, target error) bool { + return errors.Is(err, target) +} + +// New is a wrapper for errors.New +func New(text string) error { + return errors.New(text) +} + +// Unwrap is a wrapper for error.Unwrap +func Unwrap(err error) error { + return errors.Unwrap(err) +} diff --git a/gamesrv/slotspkg/internal/generic/global/config.go b/gamesrv/slotspkg/internal/generic/global/config.go new file mode 100644 index 0000000..065521c --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/global/config.go @@ -0,0 +1,119 @@ +package global + +import ( + "encoding/json" +) + +var Config = Configuration{} + +type Configuration struct { + AppId string + SrvId string + IsDevMode bool +} + +func (this *Configuration) Name() string { + return "global" +} + +func (this *Configuration) Init() error { + return nil +} + +func (this *Configuration) Close() error { + return nil +} + +func init() { + //core.RegistePackage(&Config) + //core.RegistePackage(&CustomConfig) +} + +var CustomConfig = make(CustomConfiguration) + +type CustomConfiguration map[string]interface{} + +func (this *CustomConfiguration) Name() string { + return "costum" +} + +func (this *CustomConfiguration) Init() error { + return nil +} + +func (this *CustomConfiguration) Close() error { + return nil +} + +func (this *CustomConfiguration) GetString(key string) string { + if v, exist := (*this)[key]; exist { + if str, ok := v.(string); ok { + return str + } + } + return "" +} + +func (this *CustomConfiguration) GetStrings(key string) (strs []string) { + if v, exist := (*this)[key]; exist { + if vals, ok := v.([]interface{}); ok { + for _, s := range vals { + if str, ok := s.(string); ok { + strs = append(strs, str) + } + } + return + } + } + return +} + +func (this *CustomConfiguration) GetCustomCfgs(key string) (strs []*CustomConfiguration) { + if v, exist := (*this)[key]; exist { + if vals, ok := v.([]interface{}); ok { + for _, s := range vals { + if data, ok := s.(map[string]interface{}); ok { + var pkg *CustomConfiguration + modelBuff, _ := json.Marshal(data) + err := json.Unmarshal(modelBuff, &pkg) + if err == nil { + strs = append(strs, pkg) + } + } + } + return + } + } + return +} + +func (this *CustomConfiguration) GetInts(key string) (strs []int) { + if v, exist := (*this)[key]; exist { + if vals, ok := v.([]interface{}); ok { + for _, s := range vals { + if str, ok := s.(float64); ok { + strs = append(strs, int(str)) + } + } + return + } + } + return +} +func (this *CustomConfiguration) GetInt(key string) int { + if v, exist := (*this)[key]; exist { + if val, ok := v.(float64); ok { + return int(val) + } + } + return 0 +} + +func (this *CustomConfiguration) GetBool(key string) bool { + if v, exist := (*this)[key]; exist { + if val, ok := v.(bool); ok { + return val + } + } + return false +} diff --git a/gamesrv/slotspkg/internal/generic/global/configencryptor.go b/gamesrv/slotspkg/internal/generic/global/configencryptor.go new file mode 100644 index 0000000..8803608 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/global/configencryptor.go @@ -0,0 +1,119 @@ +package global + +const ( + aa uint = 0x7E + bb = 0x33 + cc = 0xA1 + ENCRYPT_KEY1 = 0xa61fce5e // A = 0x20, B = 0xFD, C = 0x07, first = 0x1F, key = a61fce5e + ENCRYPT_KEY2 = 0x443ffc04 // A = 0x7A, B = 0xCF, C = 0xE5, first = 0x3F, key = 443ffc04 + ENCRYPT_KEY3 = 0x12345678 +) + +var ConfigFE = &ConfigFileEncryptor{} + +type ConfigFileEncryptor struct { + m_nPos1 int + m_nPos2 int + m_nPos3 int + m_cGlobalEncrypt EncryptCode +} +type EncryptCode struct { + m_bufEncrypt1 [256]uint8 + m_bufEncrypt2 [256]uint8 + m_bufEncrypt3 [256]uint8 +} + +func (this *EncryptCode) init(key1, key2, key3 uint) { + var a1, b1, c1, fst1 uint + a1 = ((key1 >> 0) & 0xFF) ^ aa + b1 = ((key1 >> 8) & 0xFF) ^ bb + c1 = ((key1 >> 24) & 0xFF) ^ cc + fst1 = (key1 >> 16) & 0xFF + + var a2, b2, c2, fst2 uint + a2 = ((key2 >> 0) & 0xFF) ^ aa + b2 = ((key2 >> 8) & 0xFF) ^ bb + c2 = ((key2 >> 24) & 0xFF) ^ cc + fst2 = (key2 >> 16) & 0xFF + + i := 0 + nCode := uint8(fst1) + for i = 0; i < 256; i++ { + this.m_bufEncrypt1[i] = nCode + nCode = (uint8(a1)*nCode*nCode + uint8(b1)*nCode + uint8(c1)) & 0xFF + } + + nCode = uint8(fst2) + for i = 0; i < 256; i++ { + this.m_bufEncrypt2[i] = nCode + nCode = (uint8(a2)*nCode*nCode + uint8(b2)*nCode + uint8(c2)) & 0xFF + } + + for i = 0; i < 256; i++ { + this.m_bufEncrypt3[i] = uint8(((key3 >> uint(i%4)) ^ uint(i)) & 0xff) + } +} +func (this *ConfigFileEncryptor) init(key1, key2, key3 uint) { + this.m_cGlobalEncrypt.init(key1, key2, key3) +} +func (this *ConfigFileEncryptor) IsCipherText(buf []byte) bool { + size := len(buf) + if size < 4 { + return false + } + //0x1b454e43 + if buf[size-1] == 0x43 && buf[size-2] == 0x4e && buf[size-3] == 0x45 && buf[size-4] == 0x1b { + return true + } + return false +} +func (this *ConfigFileEncryptor) Encrypt(buf []byte) []byte { + size := len(buf) + oldPos1, oldPos2, oldPos3 := this.m_nPos1, this.m_nPos2, this.m_nPos3 + for i := 0; i < size; i++ { + buf[i] ^= this.m_cGlobalEncrypt.m_bufEncrypt1[this.m_nPos1] + buf[i] ^= this.m_cGlobalEncrypt.m_bufEncrypt2[this.m_nPos2] + buf[i] ^= this.m_cGlobalEncrypt.m_bufEncrypt3[this.m_nPos3] + this.m_nPos1++ + if this.m_nPos1 >= 256 { + this.m_nPos1 = 0 + this.m_nPos2++ + if this.m_nPos2 >= 256 { + this.m_nPos2 = 0 + } + } + this.m_nPos3++ + if this.m_nPos3 >= 256 { + this.m_nPos3 = 0 + } + } + this.m_nPos1, this.m_nPos2, this.m_nPos3 = oldPos1, oldPos2, oldPos3 + buf = append(buf, 0x1b, 0x45, 0x4e, 0x43) + return buf +} +func (this *ConfigFileEncryptor) Decrtypt(buf []byte) []byte { + size := len(buf) - 4 + oldPos1, oldPos2, oldPos3 := this.m_nPos1, this.m_nPos2, this.m_nPos3 + for i := 0; i < size; i++ { + buf[i] ^= this.m_cGlobalEncrypt.m_bufEncrypt1[this.m_nPos1] + buf[i] ^= this.m_cGlobalEncrypt.m_bufEncrypt2[this.m_nPos2] + buf[i] ^= this.m_cGlobalEncrypt.m_bufEncrypt3[this.m_nPos3] + this.m_nPos1++ + if this.m_nPos1 >= 256 { + this.m_nPos1 = 0 + this.m_nPos2++ + if this.m_nPos2 >= 256 { + this.m_nPos2 = 0 + } + } + this.m_nPos3++ + if this.m_nPos3 >= 256 { + this.m_nPos3 = 0 + } + } + this.m_nPos1, this.m_nPos2, this.m_nPos3 = oldPos1, oldPos2, oldPos3 + return buf[:size] +} +func init() { + ConfigFE.init(ENCRYPT_KEY1, ENCRYPT_KEY2, ENCRYPT_KEY3) +} diff --git a/gamesrv/slotspkg/internal/generic/global/ddb.go b/gamesrv/slotspkg/internal/generic/global/ddb.go new file mode 100644 index 0000000..4b0cc5d --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/global/ddb.go @@ -0,0 +1,136 @@ +package global + +import ( + "fmt" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" +) + +type Ddb struct{} + +var DDB Ddb + +func (Ddb) GameAccount(typ string, packageName string, account string) string { + return fmt.Sprintf(key.DdbGameAccount, typ, packageName, account) +} + +func (Ddb) GameAccountHistory(typ string, packageName string, account string) string { + return fmt.Sprintf(key.DdbGameAccountHistory, typ, packageName, account) +} + +func (Ddb) GameAccountResetCount(typ string, packageName string, account string) string { + return fmt.Sprintf(key.DdbGameAccountResetCount, typ, packageName, account) +} + +func (Ddb) GamePlayerSN() string { + return key.DdbGamePlayerSN +} + +func (Ddb) GamePlayer(uid uint64) string { + return fmt.Sprintf(key.DdbGamePlayer, uid) +} + +func (Ddb) GamePlayerLoginTime() string { + return key.DdbGamePlayerLoginTime +} + +func (Ddb) GameSettle(uid uint64) string { + return fmt.Sprintf(key.DdbGameSettle, uid) +} + +func (Ddb) GamePool() string { + if Cluster == "" { + return key.DdbGamePool + } + return fmt.Sprintf(key.DdbGameClusterPool, Cluster) +} + +func (Ddb) CheatSlots(uid int64) string { + return fmt.Sprintf(key.DdbCheatSlots, uid) +} + +func (Ddb) SystemMailSN() string { + return key.DdbSystemMailSN +} + +func (Ddb) SystemMail(uid int64) string { + return fmt.Sprintf(key.DdbSystemMail, uid) +} + +func (Ddb) SystemPaymentOrder() string { + return key.DdbSystemPaymentOrder +} + +func (Ddb) OptBanPlayer() string { + return key.DdbOptBanPlayer +} + +func (Ddb) OptConfig() string { + if Cluster == "" { + return key.DdbOptConfig + } + return fmt.Sprintf(key.DdbOptClusterConfig, Cluster) +} + +func (Ddb) OptPlayer(uid int64) string { + return fmt.Sprintf(key.DdbOptPlayer, uid) +} + +func (Ddb) SystemInviteReward() string { + return key.DdbSystemInviteReward +} + +func (Ddb) SystemInviteRank() string { + return key.DdbSystemInviteRank +} + +func (Ddb) SystemInviteCoin() string { + return key.DdbSystemInviteCoin +} + +func (Ddb) SystemBroadcast() string { + return key.DdbSystemBroadcast +} + +func (Ddb) SystemPaymentOrderDaily(day string) string { + return fmt.Sprintf(key.DdbSystemPaymentOrderDaily, day) +} + +func (Ddb) SystemCustomerServiceDaily(day string) string { + return fmt.Sprintf(key.DdbSystemCustomerServiceDaily, day) +} + +func (Ddb) SystemCustomerServiceTotal() string { + return fmt.Sprintf(key.DdbSystemCustomerServiceTotal) +} + +func (Ddb) OptDevice() string { + return key.DdbOptDevice +} + +func (Ddb) SystemStatisticsDaily(day string) string { + return fmt.Sprintf(key.DdbSystemStatisticsDaily, day) +} + +func (Ddb) OptPermitLogin() string { + return key.DdbOptPermitLogin +} + +func (Ddb) OptPermitUserTag() string { + return key.DdbOptPermitUserTag +} + +func (Ddb) SystemPix() string { + return key.DdbSystemPix +} + +func (Ddb) SystemCPF() string { + return key.DdbSystemCPF +} + +func (Ddb) SystemPhoneNumber() string { + return key.DdbSystemPhoneNumber +} + +func (Ddb) OptOperate() string { + return key.DdbOptOperate +} diff --git a/gamesrv/slotspkg/internal/generic/global/global.go b/gamesrv/slotspkg/internal/generic/global/global.go new file mode 100644 index 0000000..0fb5f6a --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/global/global.go @@ -0,0 +1,318 @@ +package global + +import ( + "fmt" + logger2 "github.com/breezedup/goserver/core/logger" + "github.com/go-redis/redis" + "github.com/gofrs/uuid" + "github.com/gogo/protobuf/codec" + "github.com/sirupsen/logrus" + "github.com/tomas-qstarrs/boost/config" + "github.com/tomas-qstarrs/boost/dogfish" + "github.com/tomas-qstarrs/boost/httpx" + "github.com/tomas-qstarrs/boost/logger" + "github.com/tomas-qstarrs/boost/regexp" + "github.com/tomas-qstarrs/boost/timex" + "os" + "os/exec" + "path/filepath" + "qstar_server/internal/exported/resource" + "qstar_server/internal/generic/ddb" + "sort" + "strings" + "sync/atomic" + "time" +) + +var ( + // Project is the name of project + Project string + + // Game is the name of game + Game string + + // Process is the name of type name of process + Process string + + // ProcessID is the id of process + ProcessID string + + // ProcessTime is the time of process + ProcessTime int64 + + // ProcessSeqID is the seq id of process + ProcessSeqID atomic.Int64 + + // Runtime is the value of Runtime + Runtime string + + // Cluster is the cluster of project + Cluster string + + // Instance is the instance of project + Instance string + + // ExecutableDirectory is the path of Executable + ExecutableDirectory string + + // WorkingDirectory is the path of CWD + WorkingDirectory string + + // ProjectDirectory is the path of project `qstar_server` + ProjectDirectory string + + // ConfigDirectory is the path of config + ConfigDirectory string + + // LogDirectory is the path of log + LogDirectory string + + // Config is the config of project + Configs *config.Config + + // Timex is the timex of project + Timex *timex.Timex + + // Logger is the logger of project + //Logger *logger.Logger + + // TALogger is the ta logger of project + TALogger *logger.Logger + + // Codec is the codec of project + Codec codec.Codec + + // PlainCodec is the plain codec + PlainCodec codec.Codec + + // Mock is the mock mode + Mock bool + + // HTTP is the http client + HTTPClient *httpx.Client + + // RedisClient is the redis client + RedisClient *redis.Client + + Regexp *regexp.Regexp +) + +func init() { + InitGeneric() + Project = getProject() + Game = getGame() + Process = getProcess() + ProcessID = getProcessID() + Runtime = getRuntime() + Cluster = getCluster() + Instance = getInstance() + ExecutableDirectory = getExecutableDirectory() + WorkingDirectory = getWorkingDirectory() + ProjectDirectory = getProjectDirectory() + ConfigDirectory = getConfigDirectory() + Configs = getConfig() + Timex = getTimex() + //Logger = getLogger() + ProcessTime = getProcessTime() + Mock = getMock() + HTTPClient = getHTTPClient() + RedisClient = getRedisClient() + ddb.Init() +} + +func getProject() string { + return "qstar_server" +} + +func getGame() string { + return "SLOTS" +} + +func getProcess() string { + args := os.Args + if len(args) < 2 { + return "" + } + return args[1] +} + +func getProcessID() string { + return uuid.Must(uuid.NewV4()).String() +} + +func getProcessTime() int64 { + return timex.Now().Unix() +} + +func getRuntime() string { + s := os.Getenv("QSTAR_SERVER_RUNTIME") + logger2.Logger.Infof("QSTAR_SERVER_RUNTIME--------- [%v]", s) + if s == "" { + logger2.Logger.Info("Please set environment variable QSTAR_SERVER_RUNTIME, " + + "now temporarily use QSTAR_SERVER_RUNTIME=Default.") + s = config.GetString("runtime") + } else { + logger2.Logger.Infof("Use QSTAR_SERVER_RUNTIME=%s", s) + } + return strings.ToLower(s) +} + +func getCluster() string { + return os.Getenv("qstar_server_CLUSTER") +} + +func getInstance() string { + return os.Getenv("qstar_server_INSTANCE") +} + +func getExecutableDirectory() string { + if _, err := os.Stat(os.Args[0]); err == nil { + return filepath.Dir(os.Args[0]) + } + path, err := exec.LookPath(os.Args[0]) + if err != nil { + panic(err) + } + return filepath.Dir(path) +} + +func getWorkingDirectory() string { + dir, err := os.Getwd() + if err != nil { + panic(err) + } + return dir +} + +func getProjectDirectory() string { + // MatchParentDir returns target's directory's full path, + // returning error if `dir`'s parent dir names don't match `target` + matchParentDir := func(dir string, target string) (string, error) { + var currentDir string + var file string + for { + currentDir = filepath.Dir(dir) + file = filepath.Base(dir) + + // Match target directory + if file == target { + return dir, nil + } + + // Reach the top of directory + if currentDir == dir { + return "", fmt.Errorf( + "diretory `%s` doesn't match `%s`", dir, target) + } + + dir = currentDir + } + } + + dir, err := matchParentDir(WorkingDirectory, Project) + if err != nil { + dir, err = os.Getwd() + if err != nil { + panic(err) + } + } + return dir +} + +func getConfigDirectory() string { + return filepath.Join(ProjectDirectory, "resource/config") +} +func InitGeneric() { + config.ReadBinary(func() []string { + var assetNames = make([]string, 0) + for _, assetName := range resource.AssetNames() { + if strings.HasPrefix(assetName, "resource/config/generic") { + assetNames = append(assetNames, assetName) + } + } + sort.Strings(assetNames) + return assetNames + }, resource.Asset) +} +func getConfig() *config.Config { + config.SetRuntimeEnv(Runtime).ReadBinary(func() []string { + var assetNames = make([]string, 0) + for _, assetName := range resource.AssetNames() { + /*if strings.HasPrefix(assetName, "resource/config/generic") { + assetNames = append(assetNames, assetName) + } else*/if strings.HasPrefix(assetName, "resource/config/runtime/"+Runtime) { + assetNames = append(assetNames, assetName) + } + } + sort.Strings(assetNames) + return assetNames + }, resource.Asset) + + config.Default().AutomaticEnv() + config.Default().SetEnvPrefix("qstar_server") + config.Default().SetEnvKeyReplacer(strings.NewReplacer(".", "_")) + config.Default().AutoParse(1) + + return config.Default() +} + +func getTimex() *timex.Timex { + tm := timex.Init(config.JSON("timex")) + dogfish.LocateAt(timex.TimeLocation()) + return tm +} +func getLogger() *logrus.Logger { + logger, err := logger.New(config.Parse(config.JSON("logger.default"))) + if err != nil { + panic(err) + } + //log.Use(logger) + return logger +} +func getMock() bool { + s := os.Getenv("qstar_server_MOCK") + logger2.Logger.Infof("qstar_server_MOCK--------- [%v]", s) + if s != "" { + if s == "true" { + return true + } else { + return false + } + } + return config.GetBool("mock") +} + +func getHTTPClient() *httpx.Client { + c := httpx.NewClient(httpx.ClientConfig{ + Retry: config.GetInt64("http.retry"), + Timeout: config.GetDuration("http.timeout") * time.Second, + Proxy: config.GetString("http.proxy"), + DialerTimeout: config.GetDuration("http.dialerTimeout") * time.Second, + DialerKeepAlive: config.GetDuration("http.dialerKeepAlive") * time.Second, + ForceAttemptHTTP2: config.GetBool("http.forceAttemptHTTP2"), + MaxIdleConns: config.GetInt("http.maxIdleConns"), + MaxIdleConnsPerHost: config.GetInt("http.maxIdleConnsPerHost"), + MaxConnsPerHost: config.GetInt("http.maxConnsPerHost"), + IdleConnTimeout: config.GetDuration("http.idleConnTimeout") * time.Second, + TLSHandshakeTimeout: config.GetDuration("http.tlsHandshakeTimeout") * time.Second, + ResponseHeaderTimeout: config.GetDuration("http.responseHeaderTimeout") * time.Second, + ExpectContinueTimeout: config.GetDuration("http.expectContinueTimeout") * time.Second, + }) + + return c +} + +func getRedisClient() *redis.Client { + c := redis.NewClient(&redis.Options{ + Addr: config.GetString("redis.player.addr"), + Password: config.GetString("redis.player.password"), + DB: config.GetInt("redis.player.db"), + PoolSize: config.GetInt("redis.player.poolSize"), + MinIdleConns: config.GetInt("redis.player.minIdleConns"), + MaxConnAge: config.GetDuration("redis.player.maxConnAge") * time.Second, + PoolTimeout: config.GetDuration("redis.player.poolTimeout") * time.Second, + IdleTimeout: config.GetDuration("redis.player.idleTimeout") * time.Second, + IdleCheckFrequency: config.GetDuration("redis.player.idleCheckFrequency") * time.Second, + }) + return c +} diff --git a/gamesrv/slotspkg/internal/generic/global/global_test.go b/gamesrv/slotspkg/internal/generic/global/global_test.go new file mode 100644 index 0000000..1b0a841 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/global/global_test.go @@ -0,0 +1,16 @@ +package global_test + +import ( + "qstar_server/internal/generic/global" + "testing" +) + +func TestVars(t *testing.T) { + t.Log(global.Runtime) + t.Log(global.ExecutableDirectory) + t.Log(global.WorkingDirectory) + t.Log(global.ProjectDirectory) + t.Log(global.ConfigDirectory) + t.Log(global.HTTPClient) + t.Log(global.Mock) +} diff --git a/gamesrv/slotspkg/internal/generic/global/globalmgr.go b/gamesrv/slotspkg/internal/generic/global/globalmgr.go new file mode 100644 index 0000000..4f99c00 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/global/globalmgr.go @@ -0,0 +1,87 @@ +package global + +import ( + "fmt" + "github.com/idealeak/goserver/core/logger" + "github.com/tomas-qstarrs/redimo" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/ddb" + "sync" + "time" +) + +var GlobalMgrSington = &GlobalMgr{ + globalUUID: make(map[string]uint64), +} +var rwMu sync.RWMutex + +const ( + GLOBAL_PLAYERUUID = "GLOBAL:PLAYERUUID" +) + +type GlobalMgr struct { + *redimo.Client + globalUUID map[string]uint64 + dirty bool +} + +func (r *GlobalMgr) ModuleName() string { + return "GlobalMgr" +} +func (r *GlobalMgr) getKey(key string) string { + return fmt.Sprintf("%s:%s:%s", Project, Game, key) +} +func (r *GlobalMgr) Init() { + r.Client = ddb.RedimoClient() + + key := r.getKey(GLOBAL_PLAYERUUID) + val, err := r.GET(key) + if err != nil { + logger.Logger.Warnf("GlobalMgr Init err: %v", err) + //这里表示表不存在,不影响后续执行 + //return + } + oldUid := val.Int() + if oldUid == 0 { + r.globalUUID[key] = 1000000000 + r.dirty = true + } else { + r.globalUUID[key] = uint64(oldUid) + } +} +func (r *GlobalMgr) GetUUID() uint64 { + rwMu.Lock() + defer rwMu.Unlock() + key := r.getKey(GLOBAL_PLAYERUUID) + r.globalUUID[key]++ + r.dirty = true + newUid := r.globalUUID[key] + _, err := r.SET(key, newUid) + if err != nil { + logger.Logger.Warnf("GlobalMgr GetUUID err: %v", err) + } + return newUid +} +func (r *GlobalMgr) saveUUID() { + if r.dirty { + r.dirty = false + key := r.getKey(GLOBAL_PLAYERUUID) + if oldUid, ok := r.globalUUID[key]; ok { + _, err := r.SET(key, oldUid) + if err != nil { + r.dirty = true + logger.Logger.Errorf("GlobalMgr SET redimoClient error: %v", err) + } + } + } +} +func (r *GlobalMgr) Update() { + //r.saveUUID() +} +func (r *GlobalMgr) Shutdown() { + //logger.Logger.Infof("===== saveData ======== [%v] Shutdown", r.ModuleName()) + //r.saveUUID() +} + +func init() { + module.RegisteModule(GlobalMgrSington, time.Hour, 0) +} diff --git a/gamesrv/slotspkg/internal/generic/key/access_type.go b/gamesrv/slotspkg/internal/generic/key/access_type.go new file mode 100644 index 0000000..8d804a6 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/access_type.go @@ -0,0 +1,8 @@ +package key + +const ( + AccessTypeNil = "Nil" + AccessTypeDevice = "Device" + AccessTypeFacebook = "Facebook" + AccessTypeGoogle = "Google" +) diff --git a/gamesrv/slotspkg/internal/generic/key/activity_type.go b/gamesrv/slotspkg/internal/generic/key/activity_type.go new file mode 100644 index 0000000..7f46b01 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/activity_type.go @@ -0,0 +1,5 @@ +package key + +const ( + ActivityTypePass = iota + int64(1) +) diff --git a/gamesrv/slotspkg/internal/generic/key/authenticate.go b/gamesrv/slotspkg/internal/generic/key/authenticate.go new file mode 100644 index 0000000..34267de --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/authenticate.go @@ -0,0 +1,17 @@ +package key + +const ( + AuthenticateTypeUserTag = "UserTag" + AuthenticateTypeLogin = "Login" + AuthenticateTypeSpin = "UserTagSpin" + AuthenticateTypeABTag = "ABTag" +) + +const ( + AuthenticateFlagValid = "valid" +) + +const ( + AuthenticateResultPass = "pass" + AuthenticateResultFail = "fail" +) diff --git a/gamesrv/slotspkg/internal/generic/key/branch.go b/gamesrv/slotspkg/internal/generic/key/branch.go new file mode 100644 index 0000000..caa92ac --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/branch.go @@ -0,0 +1,40 @@ +package key + +import "fmt" + +type Branch uint32 + +const ( + BranchBlaze Branch = iota + BranchStake + BranchBet365 + BranchFutemax + BranchBrabet +) + +var Branches = []Branch{ + BranchBlaze, + BranchStake, + BranchBet365, + BranchFutemax, + BranchBrabet, +} + +var branchNameMap = map[Branch]string{ + BranchBlaze: "Blaze", + BranchStake: "Stake", + BranchBet365: "Bet365", + BranchFutemax: "Futemax", + BranchBrabet: "Brabet", +} + +func (b Branch) Val() uint32 { + return uint32(b) +} + +func (b Branch) String() string { + if s, ok := branchNameMap[b]; ok { + return s + } + return fmt.Sprintf("branchName=%d?", b) +} diff --git a/gamesrv/slotspkg/internal/generic/key/broadcast_type.go b/gamesrv/slotspkg/internal/generic/key/broadcast_type.go new file mode 100644 index 0000000..e8bd4cb --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/broadcast_type.go @@ -0,0 +1,6 @@ +package key + +const ( + BroadcastTypeNone int64 = iota + BroadcastTypeWithdraw +) diff --git a/gamesrv/slotspkg/internal/generic/key/coin.go b/gamesrv/slotspkg/internal/generic/key/coin.go new file mode 100644 index 0000000..ddd9694 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/coin.go @@ -0,0 +1,14 @@ +package key + +const ( + CoinChangeBook = "Book" + CoinChangeBet = "Bet" + CoinChangeSettle = "Settle" +) + +const ( + FreeCoin int64 = iota + 1 + FreeWinCoin + RechargeCoin + RechargeWinCoin +) diff --git a/gamesrv/slotspkg/internal/generic/key/common.go b/gamesrv/slotspkg/internal/generic/key/common.go new file mode 100644 index 0000000..76e01e4 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/common.go @@ -0,0 +1,6 @@ +package key + +const ( + Base = "Base" + Default = "Default" +) diff --git a/gamesrv/slotspkg/internal/generic/key/ddb.go b/gamesrv/slotspkg/internal/generic/key/ddb.go new file mode 100644 index 0000000..5dba23c --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/ddb.go @@ -0,0 +1,43 @@ +package key + +const ( + // Game + DdbGameAccountResetCount = "Game.AccountResetCount[%v][%v][%v]" // String + DdbGameAccount = "Game.Account[%v][%v][%v]" // String + DdbGameAccountHistory = "Game.AccountHistory[%v][%v][%v]" // Hash + DdbGamePlayerSN = "Game.PlayerSN" // String + DdbGamePlayer = "Game.Player[%v]" // Hash + DdbGameSettle = "Game.Settle[%v]" // List + DdbGamePool = "Game.Pool" // Hash + DdbGameClusterPool = "Game.Pool[%v]" // Hash + DdbGamePlayerLoginTime = "Game.PlayerLoginTime" // Hash + + // Cheat + DdbCheatSlots = "Cheat.Slots[%v]" // Hash + + // System + DdbSystemMailSN = "System.MailSN" // String + DdbSystemMail = "System.Mail[%v]" // Hash + DdbSystemPaymentOrder = "System.PaymentOrder" // Hash + DdbSystemPaymentOrderDaily = "System.PaymentOrderDaily[%v]" // Hash 2006-01-02 + DdbSystemBroadcast = "System.Broadcast" // List + DdbSystemInviteReward = "System.InviteReward" // Hash + DdbSystemInviteRank = "System.InviteRank" // String + DdbSystemInviteCoin = "System.InviteCoin" // SortedSet + DdbSystemPix = "System.Pix" // Hash PIX账号使用次数记录 + DdbSystemCPF = "System.CPF" // Hash CPF账号使用次数记录 + DdbSystemPhoneNumber = "System.PhoneNumber" // Hash 手机号使用次数记录 + DdbSystemStatisticsDaily = "System.Statistics[%v]" // Hash 2006-01-02 + DdbSystemCustomerServiceDaily = "System.CustomerServiceDaily[%v]" // Hash 2006-01-02 + DdbSystemCustomerServiceTotal = "System.CustomerServiceTotal" // Hash + + // Opt + DdbOptOperate = "Opt.Operate" // Hash 记录一些标记 + DdbOptConfig = "Opt.Config" // Hash + DdbOptClusterConfig = "Opt.Config[%v]" // Hash + DdbOptPlayer = "Opt.Player[%v]" // Hash + DdbOptDevice = "Opt.Device" // Hash 设备管理 + DdbOptBanPlayer = "Opt.BanPlayer" // Hash 封禁管理 + DdbOptPermitLogin = "Opt.PermitLogin" // Hash Login表通行许可 + DdbOptPermitUserTag = "Opt.PermitUserTag" // Hash UserTag表通行许可 +) diff --git a/gamesrv/slotspkg/internal/generic/key/event.go b/gamesrv/slotspkg/internal/generic/key/event.go new file mode 100644 index 0000000..fdbdcd2 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/event.go @@ -0,0 +1,6 @@ +package key + +const ( + EventPaymentSuccess = "EventPaymentSuccess" + EventBetWin = "EventBetWin" +) diff --git a/gamesrv/slotspkg/internal/generic/key/group.go b/gamesrv/slotspkg/internal/generic/key/group.go new file mode 100644 index 0000000..fbc9259 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/group.go @@ -0,0 +1,14 @@ +package key + +const ( + GroupA = "A" + GroupB = "B" + GroupC = "C" + GroupD = "D" + GroupE = "E" + GroupF = "F" + GroupG = "G" + GroupH = "H" + GroupI = "I" + GroupJ = "J" +) diff --git a/gamesrv/slotspkg/internal/generic/key/invite_award_type.go b/gamesrv/slotspkg/internal/generic/key/invite_award_type.go new file mode 100644 index 0000000..d410416 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/invite_award_type.go @@ -0,0 +1,13 @@ +package key + +const ( + InviteAwardTypeRegister int64 = 1 + InviteAwardTypePayment int64 = 2 +) + +const ( + InviteAwardStatusIncomplete int64 = 0 // 未达到限制条件 + InviteAwardStatusClaimable int64 = 1 // 可以领取的 + InviteAwardStatusReceived int64 = 2 // 领取过的 + InviteAwardStatusExpired int64 = 3 // 已经过期的 +) diff --git a/gamesrv/slotspkg/internal/generic/key/log_type.go b/gamesrv/slotspkg/internal/generic/key/log_type.go new file mode 100644 index 0000000..d15f2da --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/log_type.go @@ -0,0 +1,15 @@ +package key + +const ( + LogTypeProcess = "Process" // 服务器进程Track日志,周期:进程启动关闭 + LogTypeServer = "Server" // 服务器用户Track日志,周期:Session生命周期 + LogTypeUser = "User" // 服务器用户UserSet日志,周期:Session生命周期 + LogTypeClient = "Client" // 客户端日志,周期:客户端启动关闭 +) + +const ( + LogContextTypeNil = "nil" + LogContextTypeSession = "session" + LogContextTypePlayer = "player" + LogContextTypeUID = "uid" +) diff --git a/gamesrv/slotspkg/internal/generic/key/machine_key.go b/gamesrv/slotspkg/internal/generic/key/machine_key.go new file mode 100644 index 0000000..c7b8e4d --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/machine_key.go @@ -0,0 +1,11 @@ +package key + +const ( + MachineAdjusted = "MachineAdjusted" // 看广告加FreeSpin等 + MachineClass = "MachineClass" // 改class + MachineFormationSeqsDesc = "MachineFormationSeqsDesc" // 改轴 + MachineNextNodeID = "MachineNextNodeID" // 改节点 + MachineRoundType = "MachineRoundType" // 改轮次类型 + MachineVector = "MachineVector" // 改随机数队列 + MachineSkipWinCheck = "MachineSkipWinCheck" // 标记跳过检查 +) diff --git a/gamesrv/slotspkg/internal/generic/key/machine_mode.go b/gamesrv/slotspkg/internal/generic/key/machine_mode.go new file mode 100644 index 0000000..3f3da39 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/machine_mode.go @@ -0,0 +1,7 @@ +package key + +const ( + MachineModeLive string = "live" + MachineModeRecorder string = "recorder" + MachineModePlayer string = "player" +) diff --git a/gamesrv/slotspkg/internal/generic/key/machine_ratio_type.go b/gamesrv/slotspkg/internal/generic/key/machine_ratio_type.go new file mode 100644 index 0000000..dd19b87 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/machine_ratio_type.go @@ -0,0 +1,8 @@ +package key + +const ( + MachineRatioTypeNil int64 = iota // 不开启Ratio + MachineRatioMoreCoinMoreBet // 花更多的钱,下更多的注 + MachineRatioMoreCoinSameBet // 花更多的钱,下同样的注 + MachineRatioSameCoinMoreBet // 花同样的钱,下更多的注 +) diff --git a/gamesrv/slotspkg/internal/generic/key/mail_type.go b/gamesrv/slotspkg/internal/generic/key/mail_type.go new file mode 100644 index 0000000..647aed1 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/mail_type.go @@ -0,0 +1,6 @@ +package key + +const ( + // 后台补单 + MailTypeOrderPay int64 = 1 +) diff --git a/gamesrv/slotspkg/internal/generic/key/pay_type.go b/gamesrv/slotspkg/internal/generic/key/pay_type.go new file mode 100644 index 0000000..2a6a65c --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/pay_type.go @@ -0,0 +1,6 @@ +package key + +const ( + PayTypeFree = "free" + PayTypePaid = "paid" +) diff --git a/gamesrv/slotspkg/internal/generic/key/payment.go b/gamesrv/slotspkg/internal/generic/key/payment.go new file mode 100644 index 0000000..8b9f437 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/payment.go @@ -0,0 +1,118 @@ +package key + +import "fmt" + +type PaymentType int64 + +const ( + PaymentTypeNone PaymentType = iota + PaymentTypeDirect + PaymentTypeApple + PaymentTypeGoogle + PaymentTypeHuawei + PaymentTypeAws + PaymentTypePix +) + +var paymentTypeNameMap = map[PaymentType]string{ + PaymentTypeDirect: "Direct", + PaymentTypeGoogle: "Google", + PaymentTypeApple: "Apple", + PaymentTypeAws: "Aws", + PaymentTypeHuawei: "Huawei", + PaymentTypePix: "Pix", +} + +var paymentTypeReasonMap = map[PaymentType]string{ + PaymentTypeDirect: ReasonDirectPay, + PaymentTypeApple: ReasonApplePay, + PaymentTypeGoogle: ReasonGooglePay, + PaymentTypeHuawei: ReasonHuaweiPay, + PaymentTypeAws: ReasonAwsPay, + PaymentTypePix: ReasonPixPay, +} + +func (p PaymentType) Val() int64 { + return int64(p) +} + +func (p PaymentType) Reason() string { + return paymentTypeReasonMap[p] +} + +func (p PaymentType) String() string { + if s, ok := paymentTypeNameMap[p]; ok { + return s + } + return fmt.Sprintf("paymentType=%d?", p) +} + +func (p *PaymentType) FromString(s string) PaymentType { + for k, v := range paymentTypeNameMap { + if v == s { + *p = k + return k + } + } + return PaymentTypeNone +} + +const ( + PaymentPlatformOnePay = "OnePay" + PaymentPlatformCashPay = "CashPay" + PaymentPlatformLambdaPay = "LambdaPay" +) + +const ( + PaymentCallbackStatusSuccess = "SUCCESS" + PaymentCallbackStatusFail = "FAIL" + PaymentCallbackStatusRefund = "REFUND" + PaymentCallbackStatusUnknown = "UNKNOWN" + PaymentCallbackStatusIgnore = "IGNORE" +) + +const TextPaymentOrderStateHeader = "TextPaymentOrderState" + +const ( + PaymentOrderStateCreated = "Created" // 支付订单状态:已创建 + PaymentOrderStateRemittanceInvokeFail = "RemittanceInvokeFail" // 支付订单状态:汇款下单失败 + PaymentOrderStateRemittanceInProgress = "RemittanceInProgress" // 支付订单状态:汇款进行中 + PaymentOrderStateRemittanceCallbackFail = "RemittanceCallbackFail" // 支付订单状态:汇款回调失败 + PaymentOrderStateRemittanceSuccess = "RemittanceSuccess" // 支付订单状态:汇款已验证 + PaymentOrderStateCompleted = "Completed" // 支付订单状态:用户到账 +) + +const ( + // Create order + StepPaymentServerCreateOrderStart = "ServerCreateOrderStart" // 服务器创建订单开始 + StepPaymentServerCreateOrderVerifyFail = "ServerCreateOrderVerifyFail" // 服务器创建订单参数错误 + StepPaymentServerCreateOrderVerifySuccess = "ServerCreateOrderVerifySuccess" // 服务器创建订单参数正确 + StepPaymentServerCreateOrderSuccess = "ServerCreateOrderSuccess" // 服务器创建订单成功 + + // Invoke + StepPaymentServerInvokeStart = "ServerInvokeStart" // 服务器发起第三方请求开始 + StepPaymentServerInvokeSuccess = "ServerInvokeSuccess" // 服务器发起第三方请求成功 + StepPaymentServerInvokeFail = "ServerInvokeFail" // 服务器发起第三方请求失败 + + // Callback + StepPaymentServerCallbackStart = "ServerCallbackStart" // 服务器收到第三方回调开始 + StepPaymentServerCallbackVerifyFail = "ServerCallbackVerifyFail" // 服务器收到第三方回调参数错误 + StepPaymentServerCallbackVerifySuccess = "ServerCallbackVerifySuccess" // 服务器收到第三方回调参数正确 + StepPaymentServerCallbackFail = "ServerCallbackFail" // 服务器收到第三方回调失败 + StepPaymentServerCallbackSuccess = "ServerCallbackSuccess" // 服务器收到第三方回调成功 + + // Settle + StepPaymentServerSettleSuccess = "ServerSettleSuccess" // 服务器结算成功 + + // Client + StepPaymentClientCreateOrder = "ClientCreateOrder" // 客户端创建订单 + StepPaymentClientCreateOrderSuccess = "ClientCreateOrderSuccess" // 客户端创建订单成功(展示二维码) + StepPaymentClientSettleSuccess = "ClientSettleSuccess" // 客户端结算成功 +) + +const ( + // Purchase + StepPaymentServerPurchaseStart = "ServerPurchaseStart" // 服务器发起购买开始 + StepPaymentServerPurchaseVerifyFail = "ServerPurchaseVerifyFail" // 服务器发起购买失败 + StepPaymentServerPurchaseSuccess = "ServerPurchaseSuccess" // 服务器发起购买成功 +) diff --git a/gamesrv/slotspkg/internal/generic/key/player_black.go b/gamesrv/slotspkg/internal/generic/key/player_black.go new file mode 100644 index 0000000..5254f5a --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/player_black.go @@ -0,0 +1,7 @@ +package key + +const ( + BlackMin int64 = 1 << iota + BlackG + BlackMax +) diff --git a/gamesrv/slotspkg/internal/generic/key/player_mode.go b/gamesrv/slotspkg/internal/generic/key/player_mode.go new file mode 100644 index 0000000..5fdd503 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/player_mode.go @@ -0,0 +1,7 @@ +package key + +const ( + PlayModeNormal = iota + PlayModeVector + PlayModeClass +) diff --git a/gamesrv/slotspkg/internal/generic/key/process_command.go b/gamesrv/slotspkg/internal/generic/key/process_command.go new file mode 100644 index 0000000..3388836 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/process_command.go @@ -0,0 +1,6 @@ +package key + +const ( + ProcessCmdSimulator = "simulator" + ProcessCmdDevelop = "develop" +) diff --git a/gamesrv/slotspkg/internal/generic/key/rate_mode.go b/gamesrv/slotspkg/internal/generic/key/rate_mode.go new file mode 100644 index 0000000..acabcef --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/rate_mode.go @@ -0,0 +1,7 @@ +package key + +const ( + RateModeBlaze = iota + int64(1) + RateModeStake + RateModeStake2 +) diff --git a/gamesrv/slotspkg/internal/generic/key/reasons.go b/gamesrv/slotspkg/internal/generic/key/reasons.go new file mode 100644 index 0000000..e3d9fa9 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/reasons.go @@ -0,0 +1,64 @@ +package key + +type Reason = string + +const ( + ReasonEnterInit = "ReasonEnterInit" + ReasonTurntableFree = "ReasonTurntableFree" + ReasonTurntablePay = "ReasonTurntablePay" + ReasonTurntableAd = "ReasonTurntableAd" + ReasonBindFaceBookAward = "ReasonBindFaceBookAward" + ReasonSignAward = "ReasonSignAward" + ReasonPraise = "ReasonPraise" + ReasonInitialAward = "ReasonInitialAward" + ReasonPixPay = "ReasonPixPay" + ReasonDirectPay = "ReasonDirectPay" + ReasonGooglePay = "ReasonGooglePay" + ReasonApplePay = "ReasonApplePay" + ReasonAwsPay = "ReasonAwsPay" + ReasonHuaweiPay = "ReasonHuaweiPay" + ReasonWithdrawApply = "ReasonWithdrawApply" + ReasonWithdrawRefund = "ReasonWithdrawRefund" + ReasonMailCollect = "ReasonMailCollect" + ReasonSlotsBet = "ReasonSlotsBet" + ReasonSlotsWin = "ReasonSlotsWin" + ReasonAirplaneSettle = "ReasonAirplaneSettle" + ReasonAirplaneJump = "ReasonAirplaneJump" + ReasonAirplaneBet = "ReasonAirplaneBet" + ReasonDiceBet = "ReasonDiceBet" + ReasonDiceSettle = "ReasonDiceSettle" + ReasonClubBet = "ReasonClubBet" + ReasonClubSettle = "ReasonClubSettle" + ReasonDoubleBet = "ReasonDoubleBet" + ReasonMinesBet = "ReasonMinesBet" + ReasonDoubleSettle = "ReasonDoubleSettle" + ReasonMinesSettle = "ReasonMinesSettle" + ReasonCheat = "ReasonCheat" + ReasonSimulatorDec = "ReasonSimulatorDec" + ReasonSimulatorInc = "ReasonSimulatorInc" + ReasonBetRefund = "ReasonBetRefund" + ReasonLuckyWheelBet = "ReasonLuckyWheelBet" + ReasonLuckyWheelWin = "ReasonLuckyWheelWin" + ReasonInvite = "ReasonInvite" + ReasonInviteRegister = "ReasonInviteRegister" + ReasonInviteCommission = "ReasonInviteCommission" + ReasonClearCoin = "ReasonClearCoin" + ReasonRechargeConvertFree = "ReasonRechargeConvertFree" + ReasonRechargeConvertPay = "ReasonRechargeConvertPay" + ReasonBonus = "ReasonBonus" + ReasonPlinkoBet = "ReasonPlinkoBet" + ReasonPlinkoWin = "ReasonPlinkoWin" + ReasonVipCashback = "ReasonVipCashback" + ReasonVipPromotion = "ReasonVipPromotion" + ReasonVipWeeklyReward = "ReasonVipWeeklyReward" + ReasonVipMonthlyReward = "ReasonVipMonthlyReward" + ReasonPhone = "ReasonPhone" + ReasonVipOver0 = "ReasonVipOver0" + ReasonMemberCardWeek = "ReasonMemberCardWeek" + ReasonMemberCardMonth = "ReasonMemberCardMonth" + ReasonMemberCardYear = "ReasonMemberCardYear" + ReasonPassLevelReward = "ReasonPassLevelReward" + ReasonLinearDiceBet = "ReasonLinearDiceBet" + ReasonLinearDiceWin = "ReasonLinearDiceWin" + ReasonLevelUp = "ReasonLevelUp" +) diff --git a/gamesrv/slotspkg/internal/generic/key/redimo_type.go b/gamesrv/slotspkg/internal/generic/key/redimo_type.go new file mode 100644 index 0000000..2618685 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/redimo_type.go @@ -0,0 +1,10 @@ +package key + +const ( + RedimoTypeString = "String" + RedimoTypeHash = "Hash" + RedimoTypeHashField = "HashField" + RedimoTypeList = "List" + RedimoTypeSet = "Set" + RedimoTypeZSet = "ZSet" +) diff --git a/gamesrv/slotspkg/internal/generic/key/room_type.go b/gamesrv/slotspkg/internal/generic/key/room_type.go new file mode 100644 index 0000000..5a4a50e --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/room_type.go @@ -0,0 +1,7 @@ +package key + +const ( + RoomTypeNone = "None" + RoomTypeFree = "Free" + RoomTypePaid = "Paid" +) diff --git a/gamesrv/slotspkg/internal/generic/key/second_stage_strategy.go b/gamesrv/slotspkg/internal/generic/key/second_stage_strategy.go new file mode 100644 index 0000000..8b39db8 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/second_stage_strategy.go @@ -0,0 +1,8 @@ +package key + +const ( + SecondStageStrategyNone = iota + SecondStageStrategyWithdraw + SecondStageStrategyBigWin + SecondStageStrategySpecialOffer +) diff --git a/gamesrv/slotspkg/internal/generic/key/service_name.go b/gamesrv/slotspkg/internal/generic/key/service_name.go new file mode 100644 index 0000000..5cd73d5 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/service_name.go @@ -0,0 +1,10 @@ +package key + +const ( + ServiceAirplane = "Airplane" + ServiceMines = "Mines" + ServiceSlots = "Slots" + ServiceLuckyWheel = "LuckyWheel" + ServicePlinko = "Plinko" + ServiceLinearDice = "LinearDice" +) diff --git a/gamesrv/slotspkg/internal/generic/key/session_callback_seq.go b/gamesrv/slotspkg/internal/generic/key/session_callback_seq.go new file mode 100644 index 0000000..550ed37 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/session_callback_seq.go @@ -0,0 +1,7 @@ +package key + +const ( + SessionOnClosedSeqScheduler = iota + SessionOnClosedSeqSessionCenter + SessionOnClosedSeqControlService +) diff --git a/gamesrv/slotspkg/internal/generic/key/session_key.go b/gamesrv/slotspkg/internal/generic/key/session_key.go new file mode 100644 index 0000000..687f9a8 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/session_key.go @@ -0,0 +1,9 @@ +package key + +const ( + SessionContext = "SessionContext" + SessionPlayer = "SessionPlayer" + SessionMachine = "SessionMachine" + SessionMachineSource = "SessionMachineLiveSource" + SessionReloadPlayer = "SessionReloadPlayer" +) diff --git a/gamesrv/slotspkg/internal/generic/key/spin_type.go b/gamesrv/slotspkg/internal/generic/key/spin_type.go new file mode 100644 index 0000000..23c0f74 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/spin_type.go @@ -0,0 +1,17 @@ +package key + +const ( + Root = "Root" + BaseSpin = "BaseSpin" + FreeSpin = "FreeSpin" + BonusGame = "BonusGame" + // Don't add other spin type here +) + +// respinstatus +const ( + RespinStatus = iota + RespinTrigger + RespinProcess + RespinFinish +) diff --git a/gamesrv/slotspkg/internal/generic/key/tag_hub.go b/gamesrv/slotspkg/internal/generic/key/tag_hub.go new file mode 100644 index 0000000..ec3122c --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/tag_hub.go @@ -0,0 +1,39 @@ +package key + +const ( + TagHubUser = "user" // 用户标签 + TagHubGuide = "guide" // 入口标签 + TagHubLog = "log" // 日志标签 + TagHubSecondStage = "second_stage" // 二阶段标签 +) + +const ( + NetworkPromotionOrganic = "organic" // 来自于自然量 +) + +const ( + UserTagUndefined = "" // 未定义 + UserTagReset = "0" // 重设用户 + UserTagTarget = "1" // 目标用户 + UserTagNature = "2" // 自然用户 + UserTagForceTarget = "-1" // 强制目标用户 + UserTagForceNature = "-2" // 强制自然用户 +) + +const ( + LogTagOpen = "1" // 打开 + LogTagClose = "0" // 关闭 +) + +const ( + GuideTagCrash = "crash" + GuideTagGatesOfOlympus = "gates_of_olympus" + GuideTagHall = "hall" +) + +const ( + SecondStageTagUndefined = "" + SecondStageTagWithdraw = "withdraw" + SecondStageTagBigWin = "big_win" + SecondStageTagSpecialOffer = "special_offer" +) diff --git a/gamesrv/slotspkg/internal/generic/key/theme.go b/gamesrv/slotspkg/internal/generic/key/theme.go new file mode 100644 index 0000000..7bcbc31 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/theme.go @@ -0,0 +1,42 @@ +package key + +const ( + FortuneTiger = "FortuneTiger" + FortuneDragon = "FortuneDragon" + FortuneRabbit = "FortuneRabbit" + FortuneOx = "FortuneOx" + FortuneMouse = "FortuneMouse" + CashMania = "CashMania" + Test = "Test" +) +const ( + GameId_Min uint = iota + GameId_Tiger + GameId_Dragon + GameId_Rabbit + GameId_OX + GameId_Mouse + GameId_Cash_Mania + + GameId_Max + GameId_Test = 999 +) + +var GameMap = map[uint]string{ + GameId_Tiger: FortuneTiger, + GameId_Dragon: FortuneDragon, + GameId_Rabbit: FortuneRabbit, + GameId_OX: FortuneOx, + GameId_Mouse: FortuneMouse, + GameId_Cash_Mania: CashMania, + GameId_Test: Test, +} +var GameMapTheme = map[string]uint{ + FortuneTiger: GameId_Tiger, + FortuneDragon: GameId_Dragon, + FortuneRabbit: GameId_Rabbit, + FortuneOx: GameId_OX, + FortuneMouse: GameId_Mouse, + CashMania: GameId_Cash_Mania, + Test: GameId_Test, +} diff --git a/gamesrv/slotspkg/internal/generic/key/unique.go b/gamesrv/slotspkg/internal/generic/key/unique.go new file mode 100644 index 0000000..5dd584b --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/unique.go @@ -0,0 +1,7 @@ +package key + +const ( + UniqueAdmit int64 = iota + UniqueKick + UniqueCanceled +) diff --git a/gamesrv/slotspkg/internal/generic/key/user_tag_system.go b/gamesrv/slotspkg/internal/generic/key/user_tag_system.go new file mode 100644 index 0000000..66e989a --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/user_tag_system.go @@ -0,0 +1,22 @@ +package key + +const ( + UserTagSystemPass = "Pass" + UserTagSystemPixShop = "PixShop" + UserTagSystemSpecialOffer = "SpecialOffer" + UserTagSystemMoneyToken = "MoneyToken" + UserTagSystemWithdraw = "Withdraw" + UserTagSystemFbIconSubscript = "FbIconSubscript" + UserTagSystemInvite = "Invite" + UserTagSystemBroadcast = "Broadcast" + UserTagSystemPraise = "Praise" + UserTagSystemGoogleShop = "GoogleShop" + UserTagSystemBonus = "Bonus" + UserTagSystemDailyDeals = "DailyDeals" + UserTagSystemWeeklyDeals = "WeeklyDeals" + UserTagSystemCashback = "Cashback" + UserTagSystemVip = "Vip" + UserTagSystemPhone = "Phone" + UserTagSystemWithdrawHistory = "WithdrawHistory" + UserTagSystemMemberCard = "MemberCard" +) diff --git a/gamesrv/slotspkg/internal/generic/key/win_type.go b/gamesrv/slotspkg/internal/generic/key/win_type.go new file mode 100644 index 0000000..e951cbb --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/key/win_type.go @@ -0,0 +1,27 @@ +package key + +const ( + WinTypeNil int64 = iota + WinTypeNormal + WinTypeBig + WinTypeMega + WinTypeEpic + WinTypeEnd +) + +const ( + WinMethodAll int64 = iota + WinMethodFormation + WinMethodFeature + WinMethodEnd +) + +const ( + SummaryGroupAll = "GroupAll" + SummaryGroupOthers = "GroupOthers" + SummaryGroupOthersBase = "GroupOthersBase" + SummaryGroupOthersFree = "GroupOthersFree" + SummaryAncestorNil = "AncestorNil" + SummaryAncestorBase = "AncestorBase" + SummaryAncestorFree = "AncestorFree" +) diff --git a/gamesrv/slotspkg/internal/generic/pkg/hashx/hash.go b/gamesrv/slotspkg/internal/generic/pkg/hashx/hash.go new file mode 100644 index 0000000..f9cf6a3 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/pkg/hashx/hash.go @@ -0,0 +1,111 @@ +package hashx + +import ( + "bytes" + "crypto/hmac" + "crypto/sha256" + "encoding/base64" + "encoding/hex" + "encoding/json" + "fmt" + "io" + "sort" + "strings" +) + +// GenerateSignature 生成 HMAC-SHA256 签名并进行 Base64 URL 编码 +func GenerateSignature(secret, timestamp string, entry map[string]interface{}) string { + content := computeSignature(entry, secret, timestamp) + sign := encrypt(secret, content) + return sign +} +func computeSignature(content map[string]interface{}, secret, timestamp string) []byte { + var ( + buf bytes.Buffer + entrySet = make([]string, 0, len(content)) + ) + + keys := make([]string, 0, len(content)) + for k, _ := range content { + keys = append(keys, k) + } + sort.Strings(keys) + + for _, k := range keys { + kv := fmt.Sprintf("%s=%v", k, content[k]) + entrySet = append(entrySet, kv) + } + buf.WriteString(strings.Join(entrySet, "&")) + buf.WriteString(":") + buf.Write([]byte(secret)) + buf.WriteString(timestamp) + + return buf.Bytes() +} + +func encrypt(secret string, message []byte) string { + hmacSha256 := hmac.New(sha256.New, []byte(secret)) + hmacSha256.Write(message) + + hash := hmacSha256.Sum(nil) + + // to hex + signature := make([]byte, hex.EncodedLen(len(hash))) + hex.Encode(signature, hash) + // to base64url + return base64.RawURLEncoding.EncodeToString(signature) +} + +// 计算数据的SHA-256哈希值并返回其十六进制表示 +func calculateHash(data string) string { + hasher := sha256.New() + hasher.Write([]byte(data)) + hashBytes := hasher.Sum(nil) + return hex.EncodeToString(hashBytes) +} + +// 验证数据的哈希值是否与预期的哈希值相匹配 +func VerifyHash(data string, expectedHash string) bool { + // 计算数据的哈希值 + dataHash := calculateHash(data) + // 比较计算得到的哈希值与预期的哈希值 + return dataHash == expectedHash +} + +// HMAC-SHA256增加了key +func Hs256(key string, body []byte) string { + h := hmac.New(sha256.New, []byte(key)) + io.WriteString(h, string(body)) + return base64.StdEncoding.EncodeToString(h.Sum(nil)) +} + +// 验证数据的哈希值是否与预期的哈希值相匹配 +func VerifyHashKey(key string, data []byte, expectedHash string) bool { + // 计算数据的哈希值 + dataHash := Hs256(key, data) + // 比较计算得到的哈希值与预期的哈希值 + return dataHash == expectedHash +} +func SortJson(in []byte) []byte { + var data map[string]interface{} + json.Unmarshal(in, &data) + + // 对 map 中的键进行排序 + keys := make([]string, 0, len(data)) + for key := range data { + keys = append(keys, key) + } + sort.Strings(keys) + // 构建新的有序的 map + sortedData := make(map[string]interface{}) + for _, key := range keys { + sortedData[key] = data[key] + } + + // 编码为 JSON 字符串 + newJSONData, err := json.Marshal(sortedData) + if err != nil { + //fmt.Println("JSON 编码错误:", err) + } + return newJSONData +} diff --git a/gamesrv/slotspkg/internal/generic/pkg/jwts/jwt.go b/gamesrv/slotspkg/internal/generic/pkg/jwts/jwt.go new file mode 100644 index 0000000..de4444c --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/pkg/jwts/jwt.go @@ -0,0 +1,91 @@ +package jwts + +import ( + "context" + "encoding/json" + "github.com/golang-jwt/jwt/v4" + "github.com/zeromicro/go-zero/rest/httpx" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "net/http" + "time" +) + +// JwtPayLoad jwt中payload数据 +type JwtPayLoad struct { + Uid uint64 `json:"uid"` + Expires int64 `json:"expires"` +} +type JwtManage struct { + AccessSecret string + AccessExpire int64 + ReplaceExpire int64 +} + +func NewJwtManage(secret string, exp, replaceExp int64) JwtManager { + return &JwtManage{secret, exp, replaceExp} +} +func (j *JwtManage) GetJwtUid(ctx context.Context) (uid int64, err error) { + uid, err = (ctx.Value("uid")).(json.Number).Int64() + if err != nil { + return + } + return +} + +func (j *JwtManage) CheckJwtExp(ctx context.Context) (newToken string, err error) { + exp, err := (ctx.Value("expires")).(json.Number).Int64() + if err != nil { + return + } + uid, _ := j.GetJwtUid(ctx) + if time.Now().Add(time.Duration(j.ReplaceExpire)*time.Minute).UnixMilli() > exp { + newToken, _ = j.GenToken(uint64(uid)) + } + return +} + +func (j *JwtManage) GenToken(uid uint64) (string, error) { + jpl := JwtPayLoad{Uid: uid} + exp := time.Now().Add(time.Minute * time.Duration(j.AccessExpire)) + jpl.Expires = exp.UnixMilli() + claim := CustomClaims{ + JwtPayLoad: jpl, + RegisteredClaims: jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(exp), + }, + } + + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim) + return token.SignedString([]byte(j.AccessSecret)) +} + +type CustomClaims struct { + JwtPayLoad + jwt.RegisteredClaims +} + +// ParseToken 解析 token +func ParseToken(tokenStr string, accessSecret string, expires int64) (*CustomClaims, error) { + token, err := jwt.ParseWithClaims(tokenStr, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { + return []byte(accessSecret), nil + }) + if err != nil { + return nil, err + } + if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid { + return claims, nil + } + return nil, errors.New("invalid token") +} +func JwtUnauthorizedResult(w http.ResponseWriter, r *http.Request, err error) { + //fmt.Println(err) // 具体的错误,没带token,token过期?伪造token? + type Error struct { + Code int `json:"code"` + Message string `json:"message"` + } + type Response struct { + Data interface{} `json:"data"` + Error *Error `json:"error"` + } + httpx.WriteJson(w, http.StatusOK, &Response{Error: &Error{int(errors.JwtErr), err.Error()}}) +} diff --git a/gamesrv/slotspkg/internal/generic/pkg/jwts/jwter.go b/gamesrv/slotspkg/internal/generic/pkg/jwts/jwter.go new file mode 100644 index 0000000..1feaddc --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/pkg/jwts/jwter.go @@ -0,0 +1,9 @@ +package jwts + +import "context" + +type JwtManager interface { + GetJwtUid(ctx context.Context) (uid int64, err error) + CheckJwtExp(ctx context.Context) (newToken string, err error) + GenToken(uid uint64) (string, error) +} diff --git a/gamesrv/slotspkg/internal/generic/pkg/slice.go b/gamesrv/slotspkg/internal/generic/pkg/slice.go new file mode 100644 index 0000000..54a8be5 --- /dev/null +++ b/gamesrv/slotspkg/internal/generic/pkg/slice.go @@ -0,0 +1,24 @@ +package pkg + +import ( + "reflect" + "strings" +) + +func StructToMap(obj interface{}) map[string]interface{} { + val := reflect.ValueOf(obj) + if val.Kind() == reflect.Ptr { + val = val.Elem() + } + + result := make(map[string]interface{}) + typ := val.Type() + + for i := 0; i < val.NumField(); i++ { + field := val.Field(i) + fieldName := strings.ToLower(typ.Field(i).Name) + result[fieldName] = field.Interface() + } + + return result +} diff --git a/gamesrv/slotspkg/internal/module/player/bet.go b/gamesrv/slotspkg/internal/module/player/bet.go new file mode 100644 index 0000000..03febcb --- /dev/null +++ b/gamesrv/slotspkg/internal/module/player/bet.go @@ -0,0 +1,106 @@ +package player + +import ( + "fmt" + "qstar_server/internal/dao/thinkingdata" + "qstar_server/internal/generic/global" + "qstar_server/internal/generic/key" + "qstar_server/internal/module/shared" + "strings" + + "github.com/tomas-qstarrs/boost/cast" +) + +func (b *Bet) Clear() { + game := ParseGameID(b.GameID.Get()) + if game == nil { + return + } + + coinChange := &thinkingdata.CoinChangeBet{} + coinChange.Reason = game.Contest + coinChange.Type = key.CoinChangeBet + coinChange.BeforeCoin = b.Coin.Get() + coinChange.DecCoin = b.Coin.Get() + defer func() { + coinChange.AfterCoin = b.Coin.Get() + //thinkingdata.Track(Context(nil, game), coinChange) + }() + + b.ProcessID.Set("") + b.GameID.Set("") + b.Coin.Set(0) +} + +func (b *Bet) Bet(game *shared.Game, betCoin DecCoin) { + gameID := GetGameID(game) + + if b.GameID.Get() == gameID { + coinChange := &thinkingdata.CoinChangeBet{} + coinChange.Reason = game.Contest + coinChange.Type = key.CoinChangeBet + coinChange.BeforeCoin = b.Coin.Get() + + coinChange.IncCoin = betCoin.Coin + + defer func() { + coinChange.AfterCoin = b.Coin.Get() + + //thinkingdata.Track(Context(nil, game), coinChange) + }() + + b.ProcessID.Set(global.ProcessID) + + } else { + b.Clear() + + coinChange := &thinkingdata.CoinChangeBet{} + coinChange.Reason = game.Contest + coinChange.Type = key.CoinChangeBet + coinChange.BeforeCoin = b.Coin.Get() + coinChange.IncCoin = betCoin.Coin + + defer func() { + coinChange.AfterCoin = b.Coin.Get() + + //thinkingdata.Track(Context(nil, game), coinChange) + }() + + b.GameID.Set(gameID) + b.ProcessID.Set(global.ProcessID) + } +} + +func GetGameID(game *shared.Game) string { + if game == nil { + return "" + } + return fmt.Sprintf("%v.%v.%v.%v.%v", + game.Contest, + game.ContestType, + game.RoomID, + game.RoomType, + game.RoundID, + ) +} + +func ParseGameID(gameID string) *shared.Game { + if gameID == "" { + return nil + } + + strs := strings.Split(gameID, ".") + if len(strs) != 5 { + return nil + } + + game := &shared.Game{ + Contest: strs[0], + ContestType: strs[1], + RoomID: cast.ToInt64(strs[2]), + RoomType: strs[3], + RoundID: cast.ToInt64(strs[4]), + } + + return game +} diff --git a/gamesrv/slotspkg/internal/module/player/coin.go b/gamesrv/slotspkg/internal/module/player/coin.go new file mode 100644 index 0000000..4a749f0 --- /dev/null +++ b/gamesrv/slotspkg/internal/module/player/coin.go @@ -0,0 +1,208 @@ +package player + +import ( + "github.com/tomas-qstarrs/boost/timex" + "mongo.games.com/game/gamesrv/slotspkg/internal/dao/thinkingdata" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/session" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "sync" +) + +type coinCenter struct { + imageMap sync.Map +} + +// CoinCenter 仅在Player协程使用 +var CoinCenter = &coinCenter{} + +// Range 遍历 +func (c *coinCenter) Range(f func(key, value any) bool) { + c.imageMap.Range(f) +} + +// Get 在线或者离线获取CoinBag +func (c *coinCenter) Get(v any) CoinCart { + return c.fetch(v) +} + +// Dec 下注 必须在线 +func (c *coinCenter) Dec(s *session.Session, game *shared.Game, reason key.Reason, decCoin DecCoin) { + p := Get(s) + if p.GM.LockCoin.Get() { + return + } + if decCoin.GetCoin() < 0 { + panic(errors.CoinNegative.ErrorWith(decCoin.GetCoin())) + } + + cc := c.fetch(s) + coinChange := &thinkingdata.CoinChange{} + coinChange.Reason = reason + coinChange.Type = key.CoinChangeBook + coinChange.BeforeCoin = cc.GetCoin() + coinChange.DecCoin = decCoin.GetCoin() + defer func() { + cc := c.fetch(s) + coinChange.AfterCoin = cc.GetCoin() + //thinkingdata.Track(Context(s, game), coinChange) + }() + + c.commit(s, c.fetch(s).dec(decCoin)) +} + +// Inc 结算 必须在线 +func (c *coinCenter) Inc(s *session.Session, game *shared.Game, reason key.Reason, incCoin IncCoin) { + p := Get(s) + if p.GM.LockCoin.Get() { + return + } + if incCoin.GetCoin() < 0 { + panic(errors.CoinNegative.ErrorWith(incCoin.GetCoin())) + } + + cc := c.fetch(s) + coinChange := &thinkingdata.CoinChange{} + coinChange.Reason = reason + coinChange.Type = key.CoinChangeBook + coinChange.BeforeCoin = cc.GetCoin() + coinChange.IncCoin = incCoin.GetCoin() + defer func() { + cc := c.fetch(s) + coinChange.AfterCoin = cc.GetCoin() + //thinkingdata.Track(Context(s, game), coinChange) + }() + + c.commit(s, c.fetch(s).inc(incCoin)) +} +func (c *coinCenter) Reset(s *session.Session, coinCart CoinCart) { + rp := Get(s) + rp.Book.Coin.Set(coinCart.Coin) + c.commit(s, c.fetch(s)) +} +func (c *coinCenter) Sync(s *session.Session) { + c.commit(s, c.fetch(s)) +} + +// fetch 获取CoinBag +func (c *coinCenter) fetch(v any) CoinCart { + switch v := v.(type) { + case int64: + uid := v + vv, ok := c.imageMap.Load(uid) + if !ok { + panic(errors.CoinBagNotFound.Error()) + } + return vv.(CoinCart) + case *session.Session: + s := v + rp := Get(s) + return CoinCart{ + Coin: rp.Book.Coin.Get(), + } + default: + panic(errors.CoinBagTypeError.ErrorWith(v)) + } +} + +func (c *coinCenter) commit(s *session.Session, cb CoinCart) { + rp := Get(s) + rp.Book.Coin.Set(cb.Coin) + + cb.UpdateTime = timex.Now().Unix() + c.imageMap.Store(s.UID(), cb) +} + +type CoinCart struct { + UpdateTime int64 // 更新时间 + Coin int64 +} + +func (cc CoinCart) GetCoin() int64 { + return cc.Coin +} + +func (cc CoinCart) IsCoinEnough(value int64) bool { + return cc.GetCoin() >= value +} + +// dec 下注 +func (cc CoinCart) dec(betCoin DecCoin) CoinCart { + cc.Coin -= betCoin.Coin + return cc +} + +// inc 增加 +func (cc CoinCart) inc(ic IncCoin) CoinCart { + cc.Coin += ic.Coin + return cc +} + +type IncCoin struct { + Coin int64 +} + +func (ic *IncCoin) GetCoin() int64 { + return ic.Coin +} + +func (ic IncCoin) Add(i IncCoin) IncCoin { + ic.Coin += i.Coin + return ic +} + +func (ic *IncCoin) Merge(i IncCoin) { + ic.Coin += i.Coin +} + +type DecCoin struct { + Coin int64 +} + +func NewDecCoin(cc CoinCart, value int64) DecCoin { + var fetch = func(value int64, coin int64) (int64, int64) { + if value > coin { + return coin, value - coin + } + return value, 0 + } + + bc := DecCoin{} + + if cc.GetCoin() < value { + return bc + } + + //coin + coinFetch, value := fetch(value, cc.Coin) + bc.Coin = coinFetch + + if value <= 0 { + return bc + } + return bc +} +func (bc DecCoin) GetCoin() int64 { + return bc.Coin +} + +func (bc DecCoin) Add(b DecCoin) DecCoin { + bc.Coin += b.Coin + return bc +} + +func (bc *DecCoin) Merge(b DecCoin) { + bc.Coin += b.Coin +} +func (bc DecCoin) Rate(isFree bool, rate float64) IncCoin { + win := int64(float64(bc.GetCoin())*rate + 0.5) + win -= win % 100 + if win <= 0 { + return IncCoin{} + } + var ic = IncCoin{ + Coin: win, + } + return ic +} diff --git a/gamesrv/slotspkg/internal/module/player/dataset.go b/gamesrv/slotspkg/internal/module/player/dataset.go new file mode 100644 index 0000000..1bd986d --- /dev/null +++ b/gamesrv/slotspkg/internal/module/player/dataset.go @@ -0,0 +1,26 @@ +package player + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/module/session" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shell" +) + +type dataSet struct { + *shell.Shell +} + +func DataSetName() string { + return "Player" +} + +func DataSet(s *session.Session) *dataSet { + return &dataSet{ + Shell: shell.Session(s, DataSetName(), CategoryName(s)), + } +} + +func ShellDataSet(sh *shell.Shell) *dataSet { + return &dataSet{ + Shell: sh, + } +} diff --git a/gamesrv/slotspkg/internal/module/player/db.go b/gamesrv/slotspkg/internal/module/player/db.go new file mode 100644 index 0000000..86584e6 --- /dev/null +++ b/gamesrv/slotspkg/internal/module/player/db.go @@ -0,0 +1,217 @@ +package player + +import ( + "encoding/json" + "github.com/tomas-qstarrs/boost/cast" + "github.com/tomas-qstarrs/boost/mathx" + "github.com/tomas-qstarrs/boost/mjson" + "github.com/tomas-qstarrs/boost/timex" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/ddb" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/global" +) + +type DB struct { +} + +var db DB + +func (db DB) PushPlayer(uid uint64, data map[string]string) { + if len(data) == 0 { + return + } + + c := ddb.RedimoClient() + if err := c.HMSET(global.DDB.GamePlayer(uid), data); err != nil { + panic(err) + } +} + +func (db DB) PullPlayer(uid uint64) map[string]string { + c := ddb.RedimoClient() + var ( + err error + playerMap = make(map[string]string) + rocksMap = make(map[string]string) + gameMap = make(map[string]string) + ) + + // Get game map + gameValMap, err := c.HGETALL(global.DDB.GamePlayer(uid)) + if err != nil { + panic(err) + } + for k, v := range gameValMap { + gameMap[k] = v.String() + } + + // Merge + mergeFields := []string{ + "Char.TagHub", + } + mergeField := func(m map[string]string, k string, v string) { + if mathx.In(k, mergeFields) { + srcData := []byte(m[k]) + dstData := []byte(v) + if json.Valid(srcData) && json.Valid(dstData) { + srcData, err := mjson.Merge(srcData, dstData) + if err != nil { + panic(err) + } + m[k] = string(srcData) + return + } + } + m[k] = v + } + + // merge game map + for k, v := range gameMap { + mergeField(playerMap, k, v) + } + + // merge rocks map + for k, v := range rocksMap { + mergeField(playerMap, k, v) + } + + return playerMap +} + +// 按key存储 +func (db DB) SaveHashTarget(k, f, v string) { + value := make(map[string]interface{}) + value[f] = v + c := ddb.RedimoClient() + _, err := c.HSET(k, value) + if err != nil { + panic(err) + } +} + +// 按key获取 +func (db DB) GetHashTarget(k, f string) string { + c := ddb.RedimoClient() + val, err := c.HGET(k, f) + if err != nil { + panic(err) + } + return val.String() +} + +// 判断是否存在key +func (db DB) Exist(k string) bool { + c := ddb.RedimoClient() + val, err := c.EXISTS(k) + if err != nil { + panic(err) + } + return val +} + +func (db DB) QueryPermission(keyType string, keys ...any) bool { + var strs []string + for _, key := range keys { + str := cast.ToString(key) + if len(str) == 0 { + continue + } + + strs = append(strs, str) + } + c := ddb.RedimoClient() + valMap, err := c.HMGET(keyType, strs...) + if err != nil { + panic(err) + } + + for _, val := range valMap { + if val.Present() { + return true + } + } + + return false +} + +func (db DB) IncrCustomerServiceIDTimes(id int64) { + c := ddb.RedimoClient() + _, err := c.HINCRBY(global.DDB.SystemCustomerServiceTotal(), cast.ToString(id), 1) + if err != nil { + panic(err) + } + + _, err = c.HINCRBY(global.DDB.SystemCustomerServiceDaily(timex.Now().Format("2006-01-02")), cast.ToString(id), 1) + if err != nil { + panic(err) + } +} + +func (db DB) GetCustomerServiceIDTimes(id int64) (int64, int64) { + c := ddb.RedimoClient() + total, err := c.HGET(global.DDB.SystemCustomerServiceTotal(), cast.ToString(id)) + if err != nil { + panic(err) + } + + daily, err := c.HGET(global.DDB.SystemCustomerServiceDaily(timex.Now().Format("2006-01-02")), cast.ToString(id)) + if err != nil { + panic(err) + } + + return total.Int(), daily.Int() +} + +// incrMailID 获取全局自增id +func (db DB) IncrMailID() int64 { + c := ddb.RedimoClient() + res, err := c.INCR(global.DDB.SystemMailSN()) + if err != nil { + panic(err) + } + return res +} + +// 获取list长度 +func (db DB) LLen(k string) int64 { + c := ddb.RedimoClient() + l, err := c.LLEN(k) + if err != nil { + panic(err) + } + return l +} + +// 获取List全部数据 +func (db DB) LAll(k string) []string { + c := ddb.RedimoClient() + vs, err := c.LRANGE(k, 0, -1) + if err != nil { + panic(err) + } + var res []string + for _, v := range vs { + res = append(res, v.String()) + } + return res +} + +// 移除list 指定数量成员 +func (db DB) LPop(k string, n int64) { + c := ddb.RedimoClient() + for n > 0 { + _, err := c.LPOP(k) + if err != nil { + panic(err) + } + n-- + } +} + +// list 新增item +func (db DB) RPush(k string, v string) { + c := ddb.RedimoClient() + _, err := c.RPUSH(k, v) + if err != nil { + panic(err) + } +} diff --git a/gamesrv/slotspkg/internal/module/player/lastbetid.go b/gamesrv/slotspkg/internal/module/player/lastbetid.go new file mode 100644 index 0000000..770e189 --- /dev/null +++ b/gamesrv/slotspkg/internal/module/player/lastbetid.go @@ -0,0 +1,16 @@ +package player + +func (p *Player) AddLastBetId(theme string, betId string) { + var oc = map[string]string{} + p.Cli.LastBetId.Get(&oc) + if oc == nil { + oc = map[string]string{} + } + oc[theme] = betId + p.Cli.LastBetId.Set(oc) +} +func (p *Player) GetLastBetId(theme string) string { + var oc = map[string]string{} + p.Cli.LastBetId.Get(&oc) + return oc[theme] +} diff --git a/gamesrv/slotspkg/internal/module/player/method.go b/gamesrv/slotspkg/internal/module/player/method.go new file mode 100644 index 0000000..25688d6 --- /dev/null +++ b/gamesrv/slotspkg/internal/module/player/method.go @@ -0,0 +1,326 @@ +package player + +import ( + "fmt" + "github.com/tomas-qstarrs/boost/dogfish" + "github.com/tomas-qstarrs/boost/timex" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/global" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/session" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/goserver/core/logger" +) + +// Get gets player from session +func Get(s *session.Session) *Player { + if s == nil { + return nil + } + v := s.Value(key.SessionPlayer) + if v == nil { + return nil + } + return v.(*Player) +} + +func Set(s *session.Session, p *Player) { + s.Set(key.SessionPlayer, p) +} +func GetOldPlayer(s *session.Session) *Player { + p := Get(s) + if p == nil { + hash := db.PullPlayer(s.UID()) + if hash == nil { + return nil + } + } + return PullPlayer(s) +} +func PullPlayer(s *session.Session) *Player { + p := Get(s) + if p == nil { + hash := db.PullPlayer(s.UID()) + + // Create a new player from hash strings + p = &Player{} + err := p.Load(p, hash) + if err != nil { + panic(err) + } + + Set(s, p) + + return p + } + + if s.Bool(key.SessionReloadPlayer) { + s.Set(key.SessionReloadPlayer, false) + hash := db.PullPlayer(s.UID()) + + // Reload old player from hash strings + err := p.Load(p, hash) + if err != nil { + panic(err) + } + + return p + } + + return p +} + +func PushPlayer(s *session.Session) { + p := Get(s) + + hash, err := p.Dump() + if err != nil { + panic(err) + } + + db.PushPlayer(s.UID(), hash) +} + +func Init(s *session.Session) { + p := Get(s) + if p == nil { + panic(errors.UIDInvalid.Error()) + } + + p.Init(s) +} + +func (p *Player) Init(s *session.Session) { + if p.UID.Get() == 0 { + p.handleCreate(s) + } + + p.handleLogin(s) + + CoinCenter.Sync(s) + +} + +func (p *Player) handleCreate(s *session.Session) { + uid := s.UID() + if uid == 0 { + panic(errors.UIDInvalid.Error()) + } + + p.UID.Set(int64(uid)) + p.Char.CreateTime.Set(timex.Now().Unix()) +} +func (p *Player) MarkBlack(flag int64) { + f := p.Cli.Black.Get() + f |= flag + p.Cli.Black.Set(f) +} +func (p *Player) UnmarkBlack(flag int64) { + f := p.Cli.Black.Get() + f &= ^flag + p.Cli.Black.Set(f) +} +func (p *Player) IsMarkBlack(flag int64) bool { + if (p.Cli.Black.Get() & flag) != 0 { + return true + } + return false +} +func (p *Player) CheckBlack() bool { + for i := key.BlackMin; i <= key.BlackMax; i <<= 1 { + if p.IsMarkBlack(i) { + return true + } + } + return false +} +func (p *Player) handleLogin(s *session.Session) { + p.updateCli(s) + p.updateChar(s) + p.updateOthers(s) +} +func UpdateToken(s *session.Session, token string) { + if token == "" { + return + } + p := Get(s) + if p == nil { + panic(errors.UIDInvalid.Error()) + } + logger.Logger.Infof("player UpdateToken %v-%v", s.UID(), token) + p.Cli.Token.Set(token) +} +func GetToken(s *session.Session) string { + p := Get(s) + if p == nil { + panic(errors.UIDInvalid.Error()) + } + return p.Cli.Token.Get() +} +func GetOps(s *session.Session) string { + p := Get(s) + if p == nil { + panic(errors.UIDInvalid.Error()) + } + return p.Cli.Ops.Get() +} +func GetIp(s *session.Session) string { + p := Get(s) + if p == nil { + panic(errors.UIDInvalid.Error()) + } + return p.Cli.Ip.Get() +} +func (p *Player) updateCli(s *session.Session) { + sessionContext := s.Value(key.SessionContext).(*shared.SessionContext) + // Cli + p.Cli.ThirdName.Set(sessionContext.ThirdName) + p.Cli.Language.Set(sessionContext.Language) + p.Cli.Ops.Set(sessionContext.Ops) + p.Cli.IsSimulator.Set(sessionContext.IsSimulator) + p.Cli.IsSimulator.Set(sessionContext.IsSimulator) + p.Cli.Ip.Set(sessionContext.Ip) + + p.Cli.Currency.Set(sessionContext.Currency) + p.Cli.TokenThird.Set(sessionContext.TokenThird) + p.Cli.PlayerName.Set(sessionContext.PlayerName) + p.Cli.Lobby.Set(sessionContext.Lobby) + p.Cli.Game.Set(sessionContext.Game) +} + +func (p *Player) updateChar(s *session.Session) { + DataSet(s).Update() + + p.Char.LastLoginTime.Set(p.Char.LoginTime.Get()) + p.Char.LoginTime.Set(timex.Now().Unix()) + p.Char.LastProcessTime.Set(p.Char.ProcessTime.Get()) + p.Char.ProcessTime.Set(global.ProcessTime) + if !timex.IsSameDay(p.Char.LoginTime.Get(), p.Char.LastLoginTime.Get()) { + p.Char.ActiveDays.Set(p.Char.ActiveDays.Get() + 1) + } + + var category string + if p.Char.Group.Get() == "" { + category = p.Char.BranchName.Get() + } else { + category = fmt.Sprintf("%s_%s", p.Char.BranchName.Get(), p.Char.Group.Get()) + } + p.Char.Category.Set(category) + DataSet(s).Update() +} + +func (p *Player) updateOthers(s *session.Session) { + if !timex.IsSameDay(p.Char.LoginTime.Get(), p.Char.LastLoginTime.Get()) { + p.Agg.SlotsDailyBet.Set(0) + p.Agg.SlotsDailyWin.Set(0) + p.Agg.SlotsDailySpins.Set(0) + } +} + +func (p *Player) GetTheme(theme string) *dogfish.JSON { + return (*dogfish.JSON)(p.Field("Slots", theme)) +} + +func (p *Player) GetCli() *shared.Cli { + return &shared.Cli{ + ThirdName: p.Cli.ThirdName.Get(), + Language: p.Cli.Language.Get(), + } +} + +func GetChar(s *session.Session) *shared.Char { + p := Get(s) + if p == nil { + panic(errors.UIDInvalid.Error()) + } + + return p.GetChar() +} + +func (p *Player) GetChar() *shared.Char { + return &shared.Char{ + Category: p.Char.Category.Get(), + Group: p.Char.Group.Get(), + GroupBatch: p.Char.GroupBatch.Get(), + CreateTime: p.Char.CreateTime.Get(), + LoginTime: p.Char.LoginTime.Get(), + LastLoginTime: p.Char.LastLoginTime.Get(), + ProcessTime: p.Char.ProcessTime.Get(), + LastProcessTime: p.Char.LastProcessTime.Get(), + ActiveDays: p.Char.ActiveDays.Get(), + Branch: p.Char.Branch.Get(), + BranchName: p.Char.BranchName.Get(), + } +} + +func GetBook(s *session.Session) *shared.Book { + p := Get(s) + if p == nil { + panic(errors.UIDInvalid.Error()) + } + + return p.GetBook() +} + +func (p *Player) GetBook() *shared.Book { + return &shared.Book{ + Coin: p.Book.Coin.Get(), + } +} + +func (p *Player) GetAgg() *shared.Agg { + return &shared.Agg{ + SlotsDailySpins: p.Agg.SlotsDailySpins.Get(), + SlotsDailyWin: p.Agg.SlotsDailyWin.Get(), + SlotsDailyBet: p.Agg.SlotsDailyBet.Get(), + PersonalPool: p.Agg.PersonalPool.Get(), + } +} + +func (p *Player) Coin() int64 { + return p.Book.Coin.Get() +} + +func (p *Player) QueryPermission(keyType string, info ...any) bool { + return db.QueryPermission(keyType, info...) +} + +func CategoryName(s *session.Session) string { + p := Get(s) + if p == nil { + return key.Base + } + return p.CategoryName() +} + +func (p *Player) CategoryName() string { + return p.Char.Category.Get() +} + +func BetWin(s *session.Session, betCoin DecCoin, winCoin IncCoin) { + p := Get(s) + if p == nil { + panic(errors.UIDInvalid.Error()) + } + p.BetWin(s, betCoin, winCoin) +} + +func (p *Player) BetWin(s *session.Session, betCoin DecCoin, winCoin IncCoin) { + if betCoin.GetCoin() > 0 { + //总统计 + p.Agg.BetSum.Set(p.Agg.BetSum.Get() + betCoin.GetCoin()) + p.Agg.BetTimes.Set(p.Agg.BetTimes.Get() + 1) + //p.Agg.PersonalPool.Set(p.Agg.PersonalPool.Get() + int64(float64(betCoin.GetCoin())*0.96)) + + //每日 + p.Agg.BetTimesDaily.Set(p.Agg.BetTimesDaily.Get() + 1) + p.Agg.BetSumDaily.Set(p.Agg.BetSumDaily.Get() + betCoin.GetCoin()) + } + if winCoin.GetCoin() > 0 { + //总统计 + p.Agg.WinSum.Set(p.Agg.WinSum.Get() + winCoin.GetCoin()) + //p.Agg.PersonalPool.Set(p.Agg.PersonalPool.Get() - winCoin.GetCoin()) + //每日 + p.Agg.WinSumDaily.Set(p.Agg.WinSumDaily.Get() + winCoin.GetCoin()) + } +} diff --git a/gamesrv/slotspkg/internal/module/player/player.go b/gamesrv/slotspkg/internal/module/player/player.go new file mode 100644 index 0000000..059cb82 --- /dev/null +++ b/gamesrv/slotspkg/internal/module/player/player.go @@ -0,0 +1,96 @@ +package player + +import ( + . "github.com/tomas-qstarrs/boost/dogfish" +) + +type ( + Player struct { + Root + UID Int64 + Cli struct { + ThirdName String + Language String + Ops String + IsSimulator Bool + Token String + Ip String + Currency String + TokenThird String + PlayerName String + Lobby String + Game String + Black Int64 + LastBetId JSON + } + Char struct { + GroupBatch Int64 // 批次(AB测试的批次) + Group String // 组(AB测试的组) + Category String // 类别(配置的分支) + Branch Uint32 // 分支(代码的分支) + BranchName String // 分支名称(代码的分支名称) + CreateTime Time // 创建时间 + LoginTime Time // 本次登录时间 + LastLoginTime Time // 上次登录时间 + ProcessTime Time // 上次进程时间 + LastProcessTime Time // 一次进程时间 + ActiveDays Int64 // 活跃天数 + } + Book struct { // 账本 (实时数据) + Coin Int64 + } + Agg struct { // 聚合 (累计数据) + ///////////////////////// Total //////////////////////// + //总 + BetSum Int64 // 累计下注金额 + BetTimes Int64 // 累计下注次数 + WinSum Int64 // 累计赢取金额 + //日 + BetSumDaily Int64 // 日下注金额 + WinSumDaily Int64 // 日累计赢取金额 + BetTimesDaily Int64 // 日下注次数 + ///////////////////////// Slots //////////////////////// + // Slots总统计 + SlotsBetCoin Int64 // 下注统计 + SlotsWinCoin Int64 // 赢取统计 + SlotsSpinTimes Int64 // 总下注次数 + + // Slots每日统计 + SlotsDailySpins Int64 // 每日Slots转动次数 + SlotsDailyWin Int64 // 每日Slots累计赢取 + SlotsDailyBet Int64 // 每日Slots累计下注 + //Slots其他 + SlotsContinuousZeroSpins Int64 // Slots连续转0次数 + ///////////////////////////////////////////////////////// + // Pool + PersonalPool Int64 // 个人奖池 + TotalForceWin Int64 // 必出赢的钱 + } + System struct { + Occupied struct { + CoinMap JSON + } + SpinUserTag struct { // spin usertag + GameSpinCount JSON + } + } + GM struct { + LockCoin Bool // (GM) 锁定金币 + } + Slots struct { + FortuneTiger JSON + FortuneOx JSON + FortuneRabbit JSON + FortuneDragon JSON + FortuneMouse JSON + CashMania JSON + Test JSON + } + } + + Bet struct { + ProcessID String // 用于退款Refund + GameID String // 用于清数据 Settle Bet + Coin Int64 + } +) diff --git a/gamesrv/slotspkg/internal/module/player/playermgr.go b/gamesrv/slotspkg/internal/module/player/playermgr.go new file mode 100644 index 0000000..fd763b1 --- /dev/null +++ b/gamesrv/slotspkg/internal/module/player/playermgr.go @@ -0,0 +1,59 @@ +package player + +import ( + "fmt" + "github.com/go-redis/redis" + "github.com/tomas-qstarrs/redimo" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/ddb" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/global" + "time" +) + +var PlayerMgrSington = &PlayerMgr{ + Client: ddb.RedimoClient(), +} + +const ( + PLAYER_INFO = "PLAYERINFO[%v-%v]" +) + +type PlayerMgr struct { + *redimo.Client + Redis *redis.Client +} + +func (p *PlayerMgr) ModuleName() string { + return "PlayerMgr" +} +func (p *PlayerMgr) Init() { + p.Redis = global.RedisClient +} +func (p *PlayerMgr) getKey(tn string) string { + return fmt.Sprintf("%v.%v.Platform[%v]", global.Project, global.Game, tn) +} +func (p *PlayerMgr) GetPlayerUid(tn, ops string) uint64 { + val, err := p.HGET(p.getKey(tn), ops) + if err != nil { + logger.Logger.Errorf("get player info error: %v", err) + return 0 + } + return uint64(val.Int()) +} +func (p *PlayerMgr) SetPlayer(tn, ops string, uid uint64) bool { + _, err := p.HSETNX(p.getKey(tn), ops, redimo.IntValue{I: int64(uid)}) + if err != nil { + logger.Logger.Errorf("set player err:%v", err) + return false + } + return true +} +func (p *PlayerMgr) Update() { + +} + +func (p *PlayerMgr) Shutdown() { + +} +func init() { + module.RegisteModule(PlayerMgrSington, time.Hour, 0) +} diff --git a/gamesrv/slotspkg/internal/module/session/session.go b/gamesrv/slotspkg/internal/module/session/session.go new file mode 100644 index 0000000..4ba5972 --- /dev/null +++ b/gamesrv/slotspkg/internal/module/session/session.go @@ -0,0 +1,87 @@ +package session + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "sync" + "sync/atomic" + "time" +) + +type Session struct { + sync.RWMutex + uid uint64 // binding user id + coin int64 + data map[string]interface{} // session data store + lastConnectTime time.Time + connectNum uint64 +} + +func NewSession(uid uint64, coin int64) *Session { + return &Session{ + uid: uid, + coin: coin, + data: make(map[string]interface{}), + } +} +func (s *Session) SetLastConnectTime() bool { + if time.Now().Sub(s.lastConnectTime) > time.Second { + s.connectNum = 1 + s.lastConnectTime = time.Now() + } else { + s.connectNum++ + if s.connectNum > 5 { + return false + } + } + return true +} +func (s *Session) GetLastConnectTime() time.Time { + return s.lastConnectTime +} +func (s *Session) UID() uint64 { + return atomic.LoadUint64(&s.uid) +} +func (s *Session) Coin() int64 { + return atomic.LoadInt64(&s.coin) +} +func (s *Session) SetSessionContext(sessionContext *shared.SessionContext) { + s.Set(key.SessionContext, sessionContext) +} +func (s *Session) Set(key string, value interface{}) { + s.Lock() + defer s.Unlock() + + if s.data == nil { + s.data = make(map[string]interface{}) + } + s.data[key] = value +} +func (s *Session) Remove(key string) { + s.Lock() + defer s.Unlock() + + delete(s.data, key) +} + +func (s *Session) Value(key string) interface{} { + s.RLock() + defer s.RUnlock() + + return s.data[key] +} +func (s *Session) Bool(key string) bool { + s.RLock() + defer s.RUnlock() + + v, ok := s.data[key] + if !ok { + return false + } + + value, ok := v.(bool) + if !ok { + return false + } + return value +} diff --git a/gamesrv/slotspkg/internal/module/shared/structs.go b/gamesrv/slotspkg/internal/module/shared/structs.go new file mode 100644 index 0000000..9790b43 --- /dev/null +++ b/gamesrv/slotspkg/internal/module/shared/structs.go @@ -0,0 +1,2804 @@ +package shared + +type Game struct { + Contest string + ContestType string + RoomID int64 + RoomType string + RoundID int64 + Branch uint32 +} + +func (x *Game) GetContest() string { + if x != nil { + return x.Contest + } + return "" +} + +func (x *Game) GetContestType() string { + if x != nil { + return x.ContestType + } + return "" +} + +func (x *Game) GetRoomID() int64 { + if x != nil { + return x.RoomID + } + return 0 +} + +func (x *Game) GetRoomType() string { + if x != nil { + return x.RoomType + } + return "" +} + +func (x *Game) GetRoundID() int64 { + if x != nil { + return x.RoundID + } + return 0 +} + +func (x *Game) GetBranch() uint32 { + if x != nil { + return x.Branch + } + return 0 +} + +type Srv struct { + Runtime string + Version string + SessionVersion string + SessionBranch uint32 + Cluster string +} + +func (x *Srv) GetRuntime() string { + if x != nil { + return x.Runtime + } + return "" +} + +func (x *Srv) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *Srv) GetSessionVersion() string { + if x != nil { + return x.SessionVersion + } + return "" +} + +func (x *Srv) GetSessionBranch() uint32 { + if x != nil { + return x.SessionBranch + } + return 0 +} + +func (x *Srv) GetCluster() string { + if x != nil { + return x.Cluster + } + return "" +} + +type Proc struct { + PublicGate string + CommitID string + BuildTime string + BootTime string +} + +func (x *Proc) GetPublicGate() string { + if x != nil { + return x.PublicGate + } + return "" +} + +func (x *Proc) GetCommitID() string { + if x != nil { + return x.CommitID + } + return "" +} + +func (x *Proc) GetBuildTime() string { + if x != nil { + return x.BuildTime + } + return "" +} + +func (x *Proc) GetBootTime() string { + if x != nil { + return x.BootTime + } + return "" +} + +type Identifier struct { + ContextType string + LogType string + GroupID string + BatchID string + SeqID int64 + LogID string + ProcessID string + SessionID int64 +} + +func (x *Identifier) GetContextType() string { + if x != nil { + return x.ContextType + } + return "" +} + +func (x *Identifier) GetLogType() string { + if x != nil { + return x.LogType + } + return "" +} + +func (x *Identifier) GetGroupID() string { + if x != nil { + return x.GroupID + } + return "" +} + +func (x *Identifier) GetBatchID() string { + if x != nil { + return x.BatchID + } + return "" +} + +func (x *Identifier) GetSeqID() int64 { + if x != nil { + return x.SeqID + } + return 0 +} + +func (x *Identifier) GetLogID() string { + if x != nil { + return x.LogID + } + return "" +} + +func (x *Identifier) GetProcessID() string { + if x != nil { + return x.ProcessID + } + return "" +} + +func (x *Identifier) GetSessionID() int64 { + if x != nil { + return x.SessionID + } + return 0 +} + +type Cli struct { + ThirdName string + Language string + IsSimulator bool + Token string + Ip string + Currency string + TokenThird string + Ops string //player + PlayerName string + Lobby string + Game string +} + +func (x *Cli) GetThirdName() string { + if x != nil { + return x.ThirdName + } + return "" +} +func (x *Cli) GetLanguage() string { + if x != nil { + return x.Language + } + return "" +} + +type User struct { + Nickname string + Avatar int64 + CPF string + PixType string + PixAccount string + Name string + PhoneNumber string +} + +func (x *User) GetNickname() string { + if x != nil { + return x.Nickname + } + return "" +} + +func (x *User) GetAvatar() int64 { + if x != nil { + return x.Avatar + } + return 0 +} + +func (x *User) GetCPF() string { + if x != nil { + return x.CPF + } + return "" +} + +func (x *User) GetPixType() string { + if x != nil { + return x.PixType + } + return "" +} + +func (x *User) GetPixAccount() string { + if x != nil { + return x.PixAccount + } + return "" +} + +func (x *User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *User) GetPhoneNumber() string { + if x != nil { + return x.PhoneNumber + } + return "" +} + +type Char struct { + Category string + Group string + GroupBatch int64 + CreateTime int64 + LoginTime int64 + LastLoginTime int64 + ProcessTime int64 + LastProcessTime int64 + Newbie bool + Novice bool + NetworkPromotion string + ActiveDays int64 + FirstRechargeTime int64 + LatestRechargeTime int64 + RechargeTimes int64 + RechargeCurrency int64 + PixRechargeCurrency int64 + Branch uint32 + BranchName string + Level int64 + Exp int64 +} + +func (x *Char) GetCategory() string { + if x != nil { + return x.Category + } + return "" +} + +func (x *Char) GetGroup() string { + if x != nil { + return x.Group + } + return "" +} + +func (x *Char) GetGroupBatch() int64 { + if x != nil { + return x.GroupBatch + } + return 0 +} + +func (x *Char) GetCreateTime() int64 { + if x != nil { + return x.CreateTime + } + return 0 +} + +func (x *Char) GetLoginTime() int64 { + if x != nil { + return x.LoginTime + } + return 0 +} + +func (x *Char) GetLastLoginTime() int64 { + if x != nil { + return x.LastLoginTime + } + return 0 +} + +func (x *Char) GetProcessTime() int64 { + if x != nil { + return x.ProcessTime + } + return 0 +} + +func (x *Char) GetLastProcessTime() int64 { + if x != nil { + return x.LastProcessTime + } + return 0 +} + +func (x *Char) GetNewbie() bool { + if x != nil { + return x.Newbie + } + return false +} + +func (x *Char) GetNovice() bool { + if x != nil { + return x.Novice + } + return false +} + +func (x *Char) GetNetworkPromotion() string { + if x != nil { + return x.NetworkPromotion + } + return "" +} + +func (x *Char) GetActiveDays() int64 { + if x != nil { + return x.ActiveDays + } + return 0 +} + +func (x *Char) GetFirstRechargeTime() int64 { + if x != nil { + return x.FirstRechargeTime + } + return 0 +} + +func (x *Char) GetLatestRechargeTime() int64 { + if x != nil { + return x.LatestRechargeTime + } + return 0 +} + +func (x *Char) GetRechargeTimes() int64 { + if x != nil { + return x.RechargeTimes + } + return 0 +} + +func (x *Char) GetRechargeCurrency() int64 { + if x != nil { + return x.RechargeCurrency + } + return 0 +} + +func (x *Char) GetPixRechargeCurrency() int64 { + if x != nil { + return x.PixRechargeCurrency + } + return 0 +} + +func (x *Char) GetBranch() uint32 { + if x != nil { + return x.Branch + } + return 0 +} + +func (x *Char) GetBranchName() string { + if x != nil { + return x.BranchName + } + return "" +} + +func (x *Char) GetLevel() int64 { + if x != nil { + return x.Level + } + return 0 +} + +func (x *Char) GetExp() int64 { + if x != nil { + return x.Exp + } + return 0 +} + +type Book struct { + Coin int64 +} + +func (x *Book) GetCoin() int64 { + if x != nil { + return x.Coin + } + return 0 +} + +type Agg struct { + SlotsDailySpins int64 + SlotsDailyWin int64 + SlotsDailyBet int64 + PersonalPool int64 +} + +func (x *Agg) GetSlotsDailySpins() int64 { + if x != nil { + return x.SlotsDailySpins + } + return 0 +} + +func (x *Agg) GetSlotsDailyWin() int64 { + if x != nil { + return x.SlotsDailyWin + } + return 0 +} + +func (x *Agg) GetSlotsDailyBet() int64 { + if x != nil { + return x.SlotsDailyBet + } + return 0 +} + +type GameSort struct { + Game string + Sort int64 + Type int64 + Flag int64 + Icon int64 + Size int64 + Jackpot bool + Switch bool + DisplayLimit int64 +} + +func (x *GameSort) GetGame() string { + if x != nil { + return x.Game + } + return "" +} + +func (x *GameSort) GetSort() int64 { + if x != nil { + return x.Sort + } + return 0 +} + +func (x *GameSort) GetType() int64 { + if x != nil { + return x.Type + } + return 0 +} + +func (x *GameSort) GetFlag() int64 { + if x != nil { + return x.Flag + } + return 0 +} + +func (x *GameSort) GetIcon() int64 { + if x != nil { + return x.Icon + } + return 0 +} + +func (x *GameSort) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *GameSort) GetJackpot() bool { + if x != nil { + return x.Jackpot + } + return false +} + +func (x *GameSort) GetSwitch() bool { + if x != nil { + return x.Switch + } + return false +} + +func (x *GameSort) GetDisplayLimit() int64 { + if x != nil { + return x.DisplayLimit + } + return 0 +} + +type Settle struct { + Game string + WinCoin int64 + Coin int64 +} + +func (x *Settle) GetGame() string { + if x != nil { + return x.Game + } + return "" +} + +func (x *Settle) GetWinCoin() int64 { + if x != nil { + return x.WinCoin + } + return 0 +} + +func (x *Settle) GetCoin() int64 { + if x != nil { + return x.Coin + } + return 0 +} + +// AwardStatus 奖励状态 +type AwardStatus struct { + Status int64 + Count int64 + AdCount int64 +} + +func (x *AwardStatus) GetStatus() int64 { + if x != nil { + return x.Status + } + return 0 +} + +func (x *AwardStatus) GetCount() int64 { + if x != nil { + return x.Count + } + return 0 +} + +func (x *AwardStatus) GetAdCount() int64 { + if x != nil { + return x.AdCount + } + return 0 +} + +// SigninAwardData 签到奖励状态 +type SigninAwardData struct { + DayStatus []*AwardStatus // 奖励状态 + NextAwardStartTime int64 // 下个奖励的开始时间 + ActivityEndTime int64 // 活动结束时间 +} + +func (x *SigninAwardData) GetDayStatus() []*AwardStatus { + if x != nil { + return x.DayStatus + } + return nil +} + +func (x *SigninAwardData) GetNextAwardStartTime() int64 { + if x != nil { + return x.NextAwardStartTime + } + return 0 +} + +func (x *SigninAwardData) GetActivityEndTime() int64 { + if x != nil { + return x.ActivityEndTime + } + return 0 +} + +type SimplifiedMail struct { + ID int64 // 邮件ID + Title string // 邮件标题 + Content string // 邮件内容 + EndTime int64 // 邮件最后有效时间戳 + Readed bool // 邮件是否已经查看过 + Coin int64 // 邮件奖励 +} + +func (x *SimplifiedMail) GetID() int64 { + if x != nil { + return x.ID + } + return 0 +} + +func (x *SimplifiedMail) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *SimplifiedMail) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +func (x *SimplifiedMail) GetEndTime() int64 { + if x != nil { + return x.EndTime + } + return 0 +} + +func (x *SimplifiedMail) GetReaded() bool { + if x != nil { + return x.Readed + } + return false +} + +func (x *SimplifiedMail) GetCoin() int64 { + if x != nil { + return x.Coin + } + return 0 +} + +type Reconnect struct { + Interval int64 + Times int64 +} + +func (x *Reconnect) GetInterval() int64 { + if x != nil { + return x.Interval + } + return 0 +} + +func (x *Reconnect) GetTimes() int64 { + if x != nil { + return x.Times + } + return 0 +} + +// ShopItem 商城物品 +type ShopItem struct { + GoodsID string // 商品ID + PictureID int64 // 图片ID + ProductID string // 计费点 + PayType string // 支付方式 + Pay int64 // 支付金额(10000) + ReceiptPay int64 // 到账付费金币(10000) + Receipt int64 // 到账免费金币(10000) + Scene string // 付费场景 + TriggerAfterSeconds int64 + GiftRatio int64 +} + +func (x *ShopItem) GetGoodsID() string { + if x != nil { + return x.GoodsID + } + return "" +} + +func (x *ShopItem) GetPictureID() int64 { + if x != nil { + return x.PictureID + } + return 0 +} + +func (x *ShopItem) GetProductID() string { + if x != nil { + return x.ProductID + } + return "" +} + +func (x *ShopItem) GetPayType() string { + if x != nil { + return x.PayType + } + return "" +} + +func (x *ShopItem) GetPay() int64 { + if x != nil { + return x.Pay + } + return 0 +} + +func (x *ShopItem) GetReceiptPay() int64 { + if x != nil { + return x.ReceiptPay + } + return 0 +} + +func (x *ShopItem) GetReceipt() int64 { + if x != nil { + return x.Receipt + } + return 0 +} + +func (x *ShopItem) GetScene() string { + if x != nil { + return x.Scene + } + return "" +} + +func (x *ShopItem) GetTriggerAfterSeconds() int64 { + if x != nil { + return x.TriggerAfterSeconds + } + return 0 +} + +func (x *ShopItem) GetGiftRatio() int64 { + if x != nil { + return x.GiftRatio + } + return 0 +} + +// PayType 支付方式 +type PayType struct { + Type string // 付款平台 "Pix" "Google" + ItemList []*ShopItem // 商城物品 +} + +func (x *PayType) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *PayType) GetItemList() []*ShopItem { + if x != nil { + return x.ItemList + } + return nil +} + +type InviteAwardItem struct { + AwardType int64 // 奖励类型 1:注册奖励 2:充值奖励 + AwardID string // 奖励ID + AwardTime int64 // 奖励时间 + Status int64 // 奖励状态 0:未达到限制条件 1:可领取 2:领取过 3:已过期 + GameID int64 // 被邀请玩家ID + PlayerName string // 被邀请玩家名称 + PlayerID int64 // 被邀请玩家ID + Bonus int64 // 奖励金额 + Recharge int64 // 充值金额 + Rebate int64 // 返利比例 + ID int64 // 该充值玩家的邀请人ID +} + +func (x *InviteAwardItem) GetAwardType() int64 { + if x != nil { + return x.AwardType + } + return 0 +} + +func (x *InviteAwardItem) GetAwardID() string { + if x != nil { + return x.AwardID + } + return "" +} + +func (x *InviteAwardItem) GetAwardTime() int64 { + if x != nil { + return x.AwardTime + } + return 0 +} + +func (x *InviteAwardItem) GetStatus() int64 { + if x != nil { + return x.Status + } + return 0 +} + +func (x *InviteAwardItem) GetGameID() int64 { + if x != nil { + return x.GameID + } + return 0 +} + +func (x *InviteAwardItem) GetPlayerName() string { + if x != nil { + return x.PlayerName + } + return "" +} + +func (x *InviteAwardItem) GetPlayerID() int64 { + if x != nil { + return x.PlayerID + } + return 0 +} + +func (x *InviteAwardItem) GetBonus() int64 { + if x != nil { + return x.Bonus + } + return 0 +} + +func (x *InviteAwardItem) GetRecharge() int64 { + if x != nil { + return x.Recharge + } + return 0 +} + +func (x *InviteAwardItem) GetRebate() int64 { + if x != nil { + return x.Rebate + } + return 0 +} + +func (x *InviteAwardItem) GetID() int64 { + if x != nil { + return x.ID + } + return 0 +} + +type InviteRankingItem struct { + Rank int64 // 上榜排名 + Icon string // 头像 + Name string // 姓名 + Coin int64 // 上榜金额 +} + +func (x *InviteRankingItem) GetRank() int64 { + if x != nil { + return x.Rank + } + return 0 +} + +func (x *InviteRankingItem) GetIcon() string { + if x != nil { + return x.Icon + } + return "" +} + +func (x *InviteRankingItem) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *InviteRankingItem) GetCoin() int64 { + if x != nil { + return x.Coin + } + return 0 +} + +type LinkPositions struct { + + // Indexes for Items that are linked + Positions []int64 +} + +func (x *LinkPositions) GetPositions() []int64 { + if x != nil { + return x.Positions + } + return nil +} + +type Feature struct { + NodeID int64 + // Type is auto generated by reflect + Type string // Feature type + ID int64 // Feature ID + SpinType int64 + FormationID int64 + NodeType string + SeqID int64 + Custom string // Feature Custom Info + Win int64 // Feature win coins + EffectiveWin int64 + TotalWin int64 + Lifetime int64 + // feature is not visiable by client while Visiable is false + Visiable bool + // feature will be recover to next node in same formation ID while imageable + // is true + Imageable bool + Special any +} + +func (x *Feature) GetNodeID() int64 { + if x != nil { + return x.NodeID + } + return 0 +} + +func (x *Feature) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Feature) GetID() int64 { + if x != nil { + return x.ID + } + return 0 +} + +func (x *Feature) GetSpinType() int64 { + if x != nil { + return x.SpinType + } + return 0 +} + +func (x *Feature) GetFormationID() int64 { + if x != nil { + return x.FormationID + } + return 0 +} + +func (x *Feature) GetNodeType() string { + if x != nil { + return x.NodeType + } + return "" +} + +func (x *Feature) GetSeqID() int64 { + if x != nil { + return x.SeqID + } + return 0 +} + +func (x *Feature) GetCustom() string { + if x != nil { + return x.Custom + } + return "" +} + +func (x *Feature) GetWin() int64 { + if x != nil { + return x.Win + } + return 0 +} + +func (x *Feature) GetEffectiveWin() int64 { + if x != nil { + return x.EffectiveWin + } + return 0 +} + +func (x *Feature) GetTotalWin() int64 { + if x != nil { + return x.TotalWin + } + return 0 +} + +func (x *Feature) GetLifetime() int64 { + if x != nil { + return x.Lifetime + } + return 0 +} + +func (x *Feature) GetVisiable() bool { + if x != nil { + return x.Visiable + } + return false +} + +func (x *Feature) GetImageable() bool { + if x != nil { + return x.Imageable + } + return false +} + +type Formation struct { + NodeID int64 + SpinType int64 + ID int64 + NodeType string + SeqID int64 + InitSymbols []int64 + DisplaySymbols []int64 + FinalSymbols []int64 + LinkPositions []*LinkPositions + Win int64 + EffectiveWin int64 + TotalWin int64 + ReelForm []int64 + MatrixForm []int64 + RandPositions []int64 + RewardInfo []*RewardInfo + NewNodeType string +} + +func (x *Formation) GetNodeID() int64 { + if x != nil { + return x.NodeID + } + return 0 +} + +func (x *Formation) GetSpinType() int64 { + if x != nil { + return x.SpinType + } + return 0 +} + +func (x *Formation) GetID() int64 { + if x != nil { + return x.ID + } + return 0 +} + +func (x *Formation) GetNodeType() string { + if x != nil { + return x.NodeType + } + return "" +} + +func (x *Formation) GetSeqID() int64 { + if x != nil { + return x.SeqID + } + return 0 +} + +func (x *Formation) GetInitSymbols() []int64 { + if x != nil { + return x.InitSymbols + } + return nil +} + +func (x *Formation) GetDisplaySymbols() []int64 { + if x != nil { + return x.DisplaySymbols + } + return nil +} + +func (x *Formation) GetFinalSymbols() []int64 { + if x != nil { + return x.FinalSymbols + } + return nil +} + +func (x *Formation) GetLinkPositions() []*LinkPositions { + if x != nil { + return x.LinkPositions + } + return nil +} + +func (x *Formation) GetWin() int64 { + if x != nil { + return x.Win + } + return 0 +} + +func (x *Formation) GetEffectiveWin() int64 { + if x != nil { + return x.EffectiveWin + } + return 0 +} + +func (x *Formation) GetTotalWin() int64 { + if x != nil { + return x.TotalWin + } + return 0 +} + +func (x *Formation) GetReelForm() []int64 { + if x != nil { + return x.ReelForm + } + return nil +} + +func (x *Formation) GetMatrixForm() []int64 { + if x != nil { + return x.MatrixForm + } + return nil +} + +func (x *Formation) GetRandPositions() []int64 { + if x != nil { + return x.RandPositions + } + return nil +} + +type Node struct { + ID int64 + Parent int64 + Children []int64 + Type string // eg: RootNode BaseNode etc. + SpinType int64 + Formations []*Formation // for formations in array + Features []*Feature + Win int64 + EffectiveWin int64 + TotalWin int64 + ChildrenWin int64 + ChildrenTotalWin int64 + ProgressValue int64 + ProgressMax int64 + Bet int64 + SingleBet int64 + NeedPrepare bool + Prepared bool + Class int64 + ForceBet int64 + BaseBet int64 + NoBase bool +} + +func (x *Node) GetID() int64 { + if x != nil { + return x.ID + } + return 0 +} + +func (x *Node) GetParent() int64 { + if x != nil { + return x.Parent + } + return 0 +} + +func (x *Node) GetChildren() []int64 { + if x != nil { + return x.Children + } + return nil +} + +func (x *Node) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Node) GetSpinType() int64 { + if x != nil { + return x.SpinType + } + return 0 +} + +func (x *Node) GetFormations() []*Formation { + if x != nil { + return x.Formations + } + return nil +} + +func (x *Node) GetFeatures() []*Feature { + if x != nil { + return x.Features + } + return nil +} + +func (x *Node) GetWin() int64 { + if x != nil { + return x.Win + } + return 0 +} + +func (x *Node) GetEffectiveWin() int64 { + if x != nil { + return x.EffectiveWin + } + return 0 +} + +func (x *Node) GetTotalWin() int64 { + if x != nil { + return x.TotalWin + } + return 0 +} + +func (x *Node) GetChildrenWin() int64 { + if x != nil { + return x.ChildrenWin + } + return 0 +} + +func (x *Node) GetChildrenTotalWin() int64 { + if x != nil { + return x.ChildrenTotalWin + } + return 0 +} + +func (x *Node) GetProgressValue() int64 { + if x != nil { + return x.ProgressValue + } + return 0 +} + +func (x *Node) GetProgressMax() int64 { + if x != nil { + return x.ProgressMax + } + return 0 +} + +func (x *Node) GetBet() int64 { + if x != nil { + return x.Bet + } + return 0 +} + +func (x *Node) GetSingleBet() int64 { + if x != nil { + return x.SingleBet + } + return 0 +} + +func (x *Node) GetNeedPrepare() bool { + if x != nil { + return x.NeedPrepare + } + return false +} + +func (x *Node) GetPrepared() bool { + if x != nil { + return x.Prepared + } + return false +} + +func (x *Node) GetClass() int64 { + if x != nil { + return x.Class + } + return 0 +} + +func (x *Node) GetForceBet() int64 { + if x != nil { + return x.ForceBet + } + return 0 +} + +func (x *Node) GetBaseBet() int64 { + if x != nil { + return x.BaseBet + } + return 0 +} + +type UserData struct { + RecorderResult string + BuySpinForceWin bool + ForceChoice int64 +} + +func (x *UserData) GetRecorderResult() string { + if x != nil { + return x.RecorderResult + } + return "" +} + +func (x *UserData) GetBuySpinForceWin() bool { + if x != nil { + return x.BuySpinForceWin + } + return false +} + +func (x *UserData) GetForceChoice() int64 { + if x != nil { + return x.ForceChoice + } + return 0 +} + +type Act struct { + BetSizeIndex int64 + BetLevelIndex int64 + BetLineIndex int64 + Choice int64 + Stay bool + // Ratio Type + // 1 : 花更多的钱,下更多的注 + // 2 : 花更多的钱,下同样的注 + // 3 : 花同样的钱,下更多的注 + RatioType int64 + // Ratio: + // if r == 0; then r = 1 end + Ratio float64 + Mode string // inner + Vector []int64 // inner + ExpectedWinCoin int64 // inner + EnableRandxTracker bool // inner + RecorderRandxTracker *RandxTracker // inner + VectorIndex int64 // inner + VectorType int64 // inner + Version int64 + ClassId int64 + PlayMode int +} + +func (x *Act) GetBetIndex() int64 { + if x != nil { + return x.BetSizeIndex + } + return 0 +} + +func (x *Act) GetCoinValueIndex() int64 { + if x != nil { + return x.BetLevelIndex + } + return 0 +} + +func (x *Act) GetChoice() int64 { + if x != nil { + return x.Choice + } + return 0 +} + +func (x *Act) GetStay() bool { + if x != nil { + return x.Stay + } + return false +} + +func (x *Act) GetRatioType() int64 { + if x != nil { + return x.RatioType + } + return 0 +} + +func (x *Act) GetRatio() float64 { + if x != nil { + return x.Ratio + } + return 0 +} + +func (x *Act) GetMode() string { + if x != nil { + return x.Mode + } + return "" +} + +func (x *Act) GetVector() []int64 { + if x != nil { + return x.Vector + } + return nil +} + +func (x *Act) GetExpectedWinCoin() int64 { + if x != nil { + return x.ExpectedWinCoin + } + return 0 +} + +func (x *Act) GetEnableRandxTracker() bool { + if x != nil { + return x.EnableRandxTracker + } + return false +} + +func (x *Act) GetRecorderRandxTracker() *RandxTracker { + if x != nil { + return x.RecorderRandxTracker + } + return nil +} + +func (x *Act) GetVectorIndex() int64 { + if x != nil { + return x.VectorIndex + } + return 0 +} + +func (x *Act) GetVectorType() int64 { + if x != nil { + return x.VectorType + } + return 0 +} + +func (x *Act) GetVersion() int64 { + if x != nil { + return x.Version + } + return 0 +} + +type Coin struct { + Coin int64 +} + +func (x *Coin) GetCoin() int64 { + if x != nil { + return x.Coin + } + return 0 +} + +type RandVector struct { + VectorType int64 + Vector []int64 + VectorIndex int64 // Vector 表里面的第index条记录 + Index int64 // 本Vector序列的第几个 + ExpectedWinCoin int64 + EnableRandxTracker bool + RandxTracker *RandxTracker + RecorderRandxTracker *RandxTracker +} + +func (x *RandVector) GetVectorType() int64 { + if x != nil { + return x.VectorType + } + return 0 +} + +func (x *RandVector) GetVector() []int64 { + if x != nil { + return x.Vector + } + return nil +} + +func (x *RandVector) GetVectorIndex() int64 { + if x != nil { + return x.VectorIndex + } + return 0 +} + +func (x *RandVector) GetIndex() int64 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *RandVector) GetExpectedWinCoin() int64 { + if x != nil { + return x.ExpectedWinCoin + } + return 0 +} + +func (x *RandVector) GetEnableRandxTracker() bool { + if x != nil { + return x.EnableRandxTracker + } + return false +} + +func (x *RandVector) GetRandxTracker() *RandxTracker { + if x != nil { + return x.RandxTracker + } + return nil +} + +func (x *RandVector) GetRecorderRandxTracker() *RandxTracker { + if x != nil { + return x.RecorderRandxTracker + } + return nil +} + +type NodeTree struct { + Act *Act + BetCoin *Coin + WinCoin *Coin + Mode string + RandVector *RandVector + UserData *UserData + Step int64 + Incr int64 + Cursor int64 + Next int64 + Root int64 + Closing []int64 + Nodes []*Node + ImageFormations []*Formation + ImageFeatures []*Feature + LastNodeSettled bool + Round int64 + RoundType int64 +} + +func (x *NodeTree) GetAct() *Act { + if x != nil { + return x.Act + } + return nil +} + +func (x *NodeTree) GetBetCoin() *Coin { + if x != nil { + return x.BetCoin + } + return nil +} + +func (x *NodeTree) GetWinCoin() *Coin { + if x != nil { + return x.WinCoin + } + return nil +} + +func (x *NodeTree) GetMode() string { + if x != nil { + return x.Mode + } + return "" +} + +func (x *NodeTree) GetRandVector() *RandVector { + if x != nil { + return x.RandVector + } + return nil +} + +func (x *NodeTree) GetUserData() *UserData { + if x != nil { + return x.UserData + } + return nil +} + +func (x *NodeTree) GetStep() int64 { + if x != nil { + return x.Step + } + return 0 +} + +func (x *NodeTree) GetIncr() int64 { + if x != nil { + return x.Incr + } + return 0 +} + +func (x *NodeTree) GetCursor() int64 { + if x != nil { + return x.Cursor + } + return 0 +} + +func (x *NodeTree) GetNext() int64 { + if x != nil { + return x.Next + } + return 0 +} + +func (x *NodeTree) GetRoot() int64 { + if x != nil { + return x.Root + } + return 0 +} + +func (x *NodeTree) GetClosing() []int64 { + if x != nil { + return x.Closing + } + return nil +} + +func (x *NodeTree) GetNodes() []*Node { + if x != nil { + return x.Nodes + } + return nil +} + +func (x *NodeTree) GetImageFormations() []*Formation { + if x != nil { + return x.ImageFormations + } + return nil +} + +func (x *NodeTree) GetImageFeatures() []*Feature { + if x != nil { + return x.ImageFeatures + } + return nil +} + +func (x *NodeTree) GetLastNodeSettled() bool { + if x != nil { + return x.LastNodeSettled + } + return false +} + +func (x *NodeTree) GetRound() int64 { + if x != nil { + return x.Round + } + return 0 +} + +func (x *NodeTree) GetRoundType() int64 { + if x != nil { + return x.RoundType + } + return 0 +} + +type LiteFeature struct { + NodeID int64 + FormationID int64 + Type string + Custom string + Win int64 +} + +func (x *LiteFeature) GetNodeID() int64 { + if x != nil { + return x.NodeID + } + return 0 +} + +func (x *LiteFeature) GetFormationID() int64 { + if x != nil { + return x.FormationID + } + return 0 +} + +func (x *LiteFeature) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *LiteFeature) GetCustom() string { + if x != nil { + return x.Custom + } + return "" +} + +func (x *LiteFeature) GetWin() int64 { + if x != nil { + return x.Win + } + return 0 +} + +type LiteFormation struct { + ID int64 + SpinType int64 + NodeType string + NodeID int64 + InitSymbols []int64 + DisplaySymbols []int64 + FinalSymbols []int64 + LinkPositions []*LinkPositions + Win int64 + RandPositions []int64 + MatrixForm []int64 + RewardInfo []*RewardInfo + NewNodeType string +} + +func (x *LiteFormation) GetID() int64 { + if x != nil { + return x.ID + } + return 0 +} + +func (x *LiteFormation) GetSpinType() int64 { + if x != nil { + return x.SpinType + } + return 0 +} + +func (x *LiteFormation) GetNodeID() int64 { + if x != nil { + return x.NodeID + } + return 0 +} + +func (x *LiteFormation) GetInitSymbols() []int64 { + if x != nil { + return x.InitSymbols + } + return nil +} + +func (x *LiteFormation) GetDisplaySymbols() []int64 { + if x != nil { + return x.DisplaySymbols + } + return nil +} + +func (x *LiteFormation) GetFinalSymbols() []int64 { + if x != nil { + return x.FinalSymbols + } + return nil +} + +func (x *LiteFormation) GetLinkPositions() []*LinkPositions { + if x != nil { + return x.LinkPositions + } + return nil +} + +func (x *LiteFormation) GetWin() int64 { + if x != nil { + return x.Win + } + return 0 +} + +func (x *LiteFormation) GetRandPositions() []int64 { + if x != nil { + return x.RandPositions + } + return nil +} + +type LiteNode struct { + ID int64 + Parent int64 + Children []int64 + Type string + SpinType int64 + Win int64 + TotalWin int64 + ChildrenTotalWin int64 + ProgressValue int64 + ProgressMax int64 + Bet int64 +} + +func (x *LiteNode) GetID() int64 { + if x != nil { + return x.ID + } + return 0 +} + +func (x *LiteNode) GetParent() int64 { + if x != nil { + return x.Parent + } + return 0 +} + +func (x *LiteNode) GetChildren() []int64 { + if x != nil { + return x.Children + } + return nil +} + +func (x *LiteNode) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *LiteNode) GetSpinType() int64 { + if x != nil { + return x.SpinType + } + return 0 +} + +func (x *LiteNode) GetWin() int64 { + if x != nil { + return x.Win + } + return 0 +} + +func (x *LiteNode) GetTotalWin() int64 { + if x != nil { + return x.TotalWin + } + return 0 +} + +func (x *LiteNode) GetChildrenTotalWin() int64 { + if x != nil { + return x.ChildrenTotalWin + } + return 0 +} + +func (x *LiteNode) GetProgressValue() int64 { + if x != nil { + return x.ProgressValue + } + return 0 +} + +func (x *LiteNode) GetProgressMax() int64 { + if x != nil { + return x.ProgressMax + } + return 0 +} + +func (x *LiteNode) GetBet() int64 { + if x != nil { + return x.Bet + } + return 0 +} + +type LiteNodeTree struct { + Step int64 + Cursor int64 + Next int64 + Closing []int64 + Theme string + Nodes []*LiteNode + Formations []*LiteFormation + Features []*LiteFeature + BetCoin *Coin +} + +func (x *LiteNodeTree) GetStep() int64 { + if x != nil { + return x.Step + } + return 0 +} + +func (x *LiteNodeTree) GetCursor() int64 { + if x != nil { + return x.Cursor + } + return 0 +} + +func (x *LiteNodeTree) GetNext() int64 { + if x != nil { + return x.Next + } + return 0 +} + +func (x *LiteNodeTree) GetClosing() []int64 { + if x != nil { + return x.Closing + } + return nil +} + +func (x *LiteNodeTree) GetNodes() []*LiteNode { + if x != nil { + return x.Nodes + } + return nil +} + +func (x *LiteNodeTree) GetFormations() []*LiteFormation { + if x != nil { + return x.Formations + } + return nil +} + +func (x *LiteNodeTree) GetFeatures() []*LiteFeature { + if x != nil { + return x.Features + } + return nil +} + +type SessionContext struct { + UID int64 + *Cli +} + +func (x *SessionContext) GetUID() int64 { + if x != nil { + return x.UID + } + return 0 +} + +type LogContext struct { + SessionContext *SessionContext + Identifier *Identifier + Game *Game + Srv *Srv + UID int64 + Cli *Cli + User *User + Char *Char + Book *Book + Agg *Agg +} + +func (x *LogContext) GetSessionContext() *SessionContext { + if x != nil { + return x.SessionContext + } + return nil +} + +func (x *LogContext) GetIdentifier() *Identifier { + if x != nil { + return x.Identifier + } + return nil +} + +func (x *LogContext) GetGame() *Game { + if x != nil { + return x.Game + } + return nil +} + +func (x *LogContext) GetSrv() *Srv { + if x != nil { + return x.Srv + } + return nil +} + +func (x *LogContext) GetUID() int64 { + if x != nil { + return x.UID + } + return 0 +} + +func (x *LogContext) GetCli() *Cli { + if x != nil { + return x.Cli + } + return nil +} + +func (x *LogContext) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *LogContext) GetChar() *Char { + if x != nil { + return x.Char + } + return nil +} + +func (x *LogContext) GetBook() *Book { + if x != nil { + return x.Book + } + return nil +} + +func (x *LogContext) GetAgg() *Agg { + if x != nil { + return x.Agg + } + return nil +} + +type Switch struct { + Name string + Switch int64 +} + +func (x *Switch) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Switch) GetSwitch() int64 { + if x != nil { + return x.Switch + } + return 0 +} + +type UserTagSwitch struct { + System string + UserTag1 bool + UserTag2 bool +} + +func (x *UserTagSwitch) GetSystem() string { + if x != nil { + return x.System + } + return "" +} + +func (x *UserTagSwitch) GetUserTag1() bool { + if x != nil { + return x.UserTag1 + } + return false +} + +func (x *UserTagSwitch) GetUserTag2() bool { + if x != nil { + return x.UserTag2 + } + return false +} + +type BonusConfig struct { + ID string + Bonus int64 + Countdown int64 + CompletionMultiple int64 +} + +func (x *BonusConfig) GetID() string { + if x != nil { + return x.ID + } + return "" +} + +func (x *BonusConfig) GetBonus() int64 { + if x != nil { + return x.Bonus + } + return 0 +} + +func (x *BonusConfig) GetCountdown() int64 { + if x != nil { + return x.Countdown + } + return 0 +} + +func (x *BonusConfig) GetCompletionMultiple() int64 { + if x != nil { + return x.CompletionMultiple + } + return 0 +} + +type OnlineDailyDealsConfig struct { + Duration int64 + ResetTime int64 +} + +func (x *OnlineDailyDealsConfig) GetDuration() int64 { + if x != nil { + return x.Duration + } + return 0 +} + +func (x *OnlineDailyDealsConfig) GetResetTime() int64 { + if x != nil { + return x.ResetTime + } + return 0 +} + +type OnlineWeeklyDealsConfig struct { + Duration int64 + ResetTime int64 +} + +func (x *OnlineWeeklyDealsConfig) GetDuration() int64 { + if x != nil { + return x.Duration + } + return 0 +} + +func (x *OnlineWeeklyDealsConfig) GetResetTime() int64 { + if x != nil { + return x.ResetTime + } + return 0 +} + +type OnlineVipConfigRow struct { + Grade int64 + RechargeAmount int64 + PromotionReward int64 + PromotionCoinType int64 + WeeklyReward int64 + WeeklyCoinType int64 + MonthReward int64 + MonthCoinType int64 + CashbackProportion int64 + CashbackDailyLimit int64 + CashbackCoinType int64 + ExclusiveCustomerService int64 +} + +func (x *OnlineVipConfigRow) GetGrade() int64 { + if x != nil { + return x.Grade + } + return 0 +} + +func (x *OnlineVipConfigRow) GetRechargeAmount() int64 { + if x != nil { + return x.RechargeAmount + } + return 0 +} + +func (x *OnlineVipConfigRow) GetPromotionReward() int64 { + if x != nil { + return x.PromotionReward + } + return 0 +} + +func (x *OnlineVipConfigRow) GetPromotionCoinType() int64 { + if x != nil { + return x.PromotionCoinType + } + return 0 +} + +func (x *OnlineVipConfigRow) GetWeeklyReward() int64 { + if x != nil { + return x.WeeklyReward + } + return 0 +} + +func (x *OnlineVipConfigRow) GetWeeklyCoinType() int64 { + if x != nil { + return x.WeeklyCoinType + } + return 0 +} + +func (x *OnlineVipConfigRow) GetMonthReward() int64 { + if x != nil { + return x.MonthReward + } + return 0 +} + +func (x *OnlineVipConfigRow) GetMonthCoinType() int64 { + if x != nil { + return x.MonthCoinType + } + return 0 +} + +func (x *OnlineVipConfigRow) GetCashbackProportion() int64 { + if x != nil { + return x.CashbackProportion + } + return 0 +} + +func (x *OnlineVipConfigRow) GetCashbackDailyLimit() int64 { + if x != nil { + return x.CashbackDailyLimit + } + return 0 +} + +func (x *OnlineVipConfigRow) GetCashbackCoinType() int64 { + if x != nil { + return x.CashbackCoinType + } + return 0 +} + +func (x *OnlineVipConfigRow) GetExclusiveCustomerService() int64 { + if x != nil { + return x.ExclusiveCustomerService + } + return 0 +} + +type OnlineVip3ConfigRow struct { + Grade int64 + RechargeAmount int64 + Bet int64 + PromotionReward int64 + PromotionCoinType int64 + WeeklyReward int64 + WeeklyCoinType int64 + MonthReward int64 + MonthCoinType int64 + CashbackProportion int64 + CashbackDailyLimit int64 + CashbackCoinType int64 + ExclusiveCustomerService int64 + LockLimit int64 +} + +func (x *OnlineVip3ConfigRow) GetGrade() int64 { + if x != nil { + return x.Grade + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetRechargeAmount() int64 { + if x != nil { + return x.RechargeAmount + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetBet() int64 { + if x != nil { + return x.Bet + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetPromotionReward() int64 { + if x != nil { + return x.PromotionReward + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetPromotionCoinType() int64 { + if x != nil { + return x.PromotionCoinType + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetWeeklyReward() int64 { + if x != nil { + return x.WeeklyReward + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetWeeklyCoinType() int64 { + if x != nil { + return x.WeeklyCoinType + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetMonthReward() int64 { + if x != nil { + return x.MonthReward + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetMonthCoinType() int64 { + if x != nil { + return x.MonthCoinType + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetCashbackProportion() int64 { + if x != nil { + return x.CashbackProportion + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetCashbackDailyLimit() int64 { + if x != nil { + return x.CashbackDailyLimit + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetCashbackCoinType() int64 { + if x != nil { + return x.CashbackCoinType + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetExclusiveCustomerService() int64 { + if x != nil { + return x.ExclusiveCustomerService + } + return 0 +} + +func (x *OnlineVip3ConfigRow) GetLockLimit() int64 { + if x != nil { + return x.LockLimit + } + return 0 +} + +type Heartbeat struct { + Interval int64 + Timeout int64 +} + +func (x *Heartbeat) GetInterval() int64 { + if x != nil { + return x.Interval + } + return 0 +} + +func (x *Heartbeat) GetTimeout() int64 { + if x != nil { + return x.Timeout + } + return 0 +} + +type RandxTrackerItem struct { + Tag string + Index int64 +} + +func (x *RandxTrackerItem) GetTag() string { + if x != nil { + return x.Tag + } + return "" +} + +func (x *RandxTrackerItem) GetIndex() int64 { + if x != nil { + return x.Index + } + return 0 +} + +type RandxTracker struct { + Items []*RandxTrackerItem +} + +func (x *RandxTracker) GetItems() []*RandxTrackerItem { + if x != nil { + return x.Items + } + return nil +} + +type GameConfigItem struct { + Game string + EnterRechargeLimit int64 + EnterCarryLimit int64 + BetRechargeLimit int64 + BetCarryLimit int64 + WinAtMost int64 +} + +func (x *GameConfigItem) GetGame() string { + if x != nil { + return x.Game + } + return "" +} + +func (x *GameConfigItem) GetEnterRechargeLimit() int64 { + if x != nil { + return x.EnterRechargeLimit + } + return 0 +} + +func (x *GameConfigItem) GetEnterCarryLimit() int64 { + if x != nil { + return x.EnterCarryLimit + } + return 0 +} + +func (x *GameConfigItem) GetBetRechargeLimit() int64 { + if x != nil { + return x.BetRechargeLimit + } + return 0 +} + +func (x *GameConfigItem) GetBetCarryLimit() int64 { + if x != nil { + return x.BetCarryLimit + } + return 0 +} + +func (x *GameConfigItem) GetWinAtMost() int64 { + if x != nil { + return x.WinAtMost + } + return 0 +} + +type RecorderResult struct { + NewPoolValue int64 + OldPoolValue int64 + ReservePump int64 + Poor bool + Cycle int64 + CycleOverload bool + Exception bool + ExceptionType int64 + Replay bool + Vector []int64 + VectorType int64 + VectorIndex int64 + VectorMinRatio float64 + VectorMaxRatio float64 + ExpectedBetCoin int64 + ExpectedWinCoin int64 + SkipWinCheck bool + NoviceForceWin bool + SecondStageForceWin bool + PaidForceWin bool + BuySpinForceWin bool + ContinousZeroForceWin bool + PlayMode int +} + +func (x *RecorderResult) GetNewPoolValue() int64 { + if x != nil { + return x.NewPoolValue + } + return 0 +} + +func (x *RecorderResult) GetOldPoolValue() int64 { + if x != nil { + return x.OldPoolValue + } + return 0 +} + +func (x *RecorderResult) GetReservePump() int64 { + if x != nil { + return x.ReservePump + } + return 0 +} + +func (x *RecorderResult) GetPoor() bool { + if x != nil { + return x.Poor + } + return false +} + +func (x *RecorderResult) GetCycle() int64 { + if x != nil { + return x.Cycle + } + return 0 +} + +func (x *RecorderResult) GetCycleOverload() bool { + if x != nil { + return x.CycleOverload + } + return false +} + +func (x *RecorderResult) GetException() bool { + if x != nil { + return x.Exception + } + return false +} + +func (x *RecorderResult) GetExceptionType() int64 { + if x != nil { + return x.ExceptionType + } + return 0 +} + +func (x *RecorderResult) GetReplay() bool { + if x != nil { + return x.Replay + } + return false +} + +func (x *RecorderResult) GetVector() []int64 { + if x != nil { + return x.Vector + } + return nil +} + +func (x *RecorderResult) GetVectorType() int64 { + if x != nil { + return x.VectorType + } + return 0 +} + +func (x *RecorderResult) GetVectorIndex() int64 { + if x != nil { + return x.VectorIndex + } + return 0 +} + +func (x *RecorderResult) GetVectorMinRatio() float64 { + if x != nil { + return x.VectorMinRatio + } + return 0 +} + +func (x *RecorderResult) GetVectorMaxRatio() float64 { + if x != nil { + return x.VectorMaxRatio + } + return 0 +} + +func (x *RecorderResult) GetExpectedBetCoin() int64 { + if x != nil { + return x.ExpectedBetCoin + } + return 0 +} + +func (x *RecorderResult) GetExpectedWinCoin() int64 { + if x != nil { + return x.ExpectedWinCoin + } + return 0 +} + +func (x *RecorderResult) GetSkipWinCheck() bool { + if x != nil { + return x.SkipWinCheck + } + return false +} + +func (x *RecorderResult) GetNoviceForceWin() bool { + if x != nil { + return x.NoviceForceWin + } + return false +} + +func (x *RecorderResult) GetSecondStageForceWin() bool { + if x != nil { + return x.SecondStageForceWin + } + return false +} + +func (x *RecorderResult) GetPaidForceWin() bool { + if x != nil { + return x.PaidForceWin + } + return false +} + +func (x *RecorderResult) GetBuySpinForceWin() bool { + if x != nil { + return x.BuySpinForceWin + } + return false +} + +func (x *RecorderResult) GetContinousZeroForceWin() bool { + if x != nil { + return x.ContinousZeroForceWin + } + return false +} + +type NoticeUpdate struct { + AppVersion string +} + +func (x *NoticeUpdate) GetAppVersion() string { + if x != nil { + return x.AppVersion + } + return "" +} + +type Broadcast struct { + Type int64 + Param []string +} + +func (x *Broadcast) GetType() int64 { + if x != nil { + return x.Type + } + return 0 +} + +func (x *Broadcast) GetParam() []string { + if x != nil { + return x.Param + } + return nil +} + +type Activity struct { + ActivityType int64 + StartTime int64 + EndTime int64 + Round int64 // 当前多少轮 +} + +func (x *Activity) GetActivityType() int64 { + if x != nil { + return x.ActivityType + } + return 0 +} + +func (x *Activity) GetStartTime() int64 { + if x != nil { + return x.StartTime + } + return 0 +} + +func (x *Activity) GetEndTime() int64 { + if x != nil { + return x.EndTime + } + return 0 +} + +func (x *Activity) GetRound() int64 { + if x != nil { + return x.Round + } + return 0 +} diff --git a/gamesrv/slotspkg/internal/module/shared/types.go b/gamesrv/slotspkg/internal/module/shared/types.go new file mode 100644 index 0000000..134e6fc --- /dev/null +++ b/gamesrv/slotspkg/internal/module/shared/types.go @@ -0,0 +1,76 @@ +package shared + +type TableInfoDto struct { + ArrSpin *ArrSpins `json:"arrSpin"` + Coin int64 `json:"coin"` + BetConfig *BetConfig `json:"betConfig"` +} +type BetConfig struct { + BetChangeList []float64 `json:"betChangeList"` + BetSize []float64 `json:"betSize"` //单注 + BetLevel []int `json:"betLevel"` //下注线数 + BetLines []int `json:"betLines"` //可选线数 + BetType int `json:"betType"` //total计算方式 1.显示成Lines betSize*betLevel*lines (lines) + BetSizeIndex int64 `json:"betSizeIndex"` //选中的单注下标 + BetLevelIndex int64 `json:"betLevelIndex"` //选中的等级下标 + LinesIndex int64 `json:"linesIndex"` //选中的线数下标 +} +type RewardInfo struct { + Type int `json:"type"` //0.指定线的数量 1.全线 + Index int `json:"index"` //线的id + Item int64 `json:"item"` //图标id + Reward float64 `json:"reward"` //单线奖励 + Pos [][]int `json:"pos"` //位置 +} +type ArrSpins struct { + GearID string `json:"gearID"` //"base","respin","freespin + Items [][]int64 `json:"items"` //当前元素 + FinalSymbols [][]int64 `json:"finalSymbols"` //最终元素 + Index []int64 `json:"index"` //reel索引 + Reward float64 `json:"reward"` //总奖(包含线的总奖) + LineReward float64 `json:"lineReward"` //线的总奖 + RewardInfo []*RewardInfo `json:"rewardInfo"` + Special interface{} `json:"special"` //null +} + +type Result struct { + ArrSpins []*ArrSpins `json:"arrSpins"` + WinStatus int `json:"winStatus"` //0.无特效 1.bigWin(5) 2.megaWin(10) 3.superWin(20) 4.epicWin(1000000000) + FreeStatus int `json:"freeStatus"` //0.正常 1.激活 2.再次激活 3.结束 + FreeNum int64 `json:"freeNum"` //剩余free数量 + FreeNumMax int64 `json:"freeNumMax"` //最大的free数量 + FreeNumTrigger int64 `json:"freeNumTrigger"` //新增的free数量 + TotalReward float64 `json:"totalReward"` //总奖 + TotalRewardBase float64 `json:"totalRewardBase"` //基础奖 只有连线 + BetMode int64 `json:"bm"` //0.常规 1.必中 +} +type GameEndDto struct { + Results []*Result `json:"results"` + RoundReward int64 `json:"roundReward"` //总奖 + BetSizeIndex int64 `json:"betSizeIndex"` //选中的单注下标 + BetLevelIndex int64 `json:"betLevelIndex"` //选中的等级下标 + LinesIndex int64 `json:"linesIndex"` //选中的线数下标 + TotalBet int64 `json:"totalBet"` //下注 + BetBeforeCoin int64 `json:"betBeforeCoin"` //下注前 + BetAfterCoin int64 `json:"betAfterCoin"` //下注后 + FinalCoin int64 `json:"finalCoin"` //结束 + ActualBet int64 `json:"actualBet"` + ActualWin int64 `json:"actualWin"` +} + +// Special +type SpinLock struct { + //tigerSpecial + ReSpinStatus int `json:"rs,omitempty"` //0.默认 1.第一次触发 2.进行中 3.结束 + ReSpinSymbol int64 `json:"rsy,omitempty"` //图标(respin) + Lock [][]int `json:"l,omitempty"` //原来锁定的位置 + AddLock [][]int `json:"al,omitempty"` //新增锁定的位置 + X10 int64 `json:"x10,omitempty"` //100.不同图标 88.wild 其他类型.按当前单一中奖图标类型 + WinLines map[int][][]int `json:"wls,omitempty"` + //FortuneDragon + MultipleAxis []int64 `json:"ma,omitempty"` //倍乘轴 + //FortuneRabbit + Prize [][]float64 `json:"pe,omitempty"` + //OXSpecial + NewSuperStack []int64 `json:"nss,omitempty"` +} diff --git a/gamesrv/slotspkg/internal/module/shell/mono.go b/gamesrv/slotspkg/internal/module/shell/mono.go new file mode 100644 index 0000000..5bc58d0 --- /dev/null +++ b/gamesrv/slotspkg/internal/module/shell/mono.go @@ -0,0 +1,20 @@ +package shell + +import "sync" + +type MonoShell struct { + sync.Map +} + +var monoShell = &MonoShell{} + +func Mono(name string) *Shell { + v, ok := monoShell.Load(name) + if ok { + return v.(*Shell) + } + + shell := Base() + monoShell.Store(name, shell) + return shell +} diff --git a/gamesrv/slotspkg/internal/module/shell/session.go b/gamesrv/slotspkg/internal/module/shell/session.go new file mode 100644 index 0000000..d0f1c40 --- /dev/null +++ b/gamesrv/slotspkg/internal/module/shell/session.go @@ -0,0 +1,29 @@ +package shell + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/module/session" + "sync" +) + +func Session(s *session.Session, key string, category string) *Shell { + var m *sync.Map + v := s.Value(key) + if v == nil { + m = &sync.Map{} + s.Set(key, m) + } else { + m = v.(*sync.Map) + } + + var shell *Shell + v, ok := m.Load(key) + if !ok { + shell = NewShell(category) + m.Store(key, shell) + } else { + shell = v.(*Shell) + shell.UpdateCategory(category) + } + + return shell +} diff --git a/gamesrv/slotspkg/internal/module/shell/shell.go b/gamesrv/slotspkg/internal/module/shell/shell.go new file mode 100644 index 0000000..1222dcc --- /dev/null +++ b/gamesrv/slotspkg/internal/module/shell/shell.go @@ -0,0 +1,60 @@ +package shell + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/dao/dataset" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" +) + +type Shell struct { + Category string + *dataset.DataSet +} + +func NewShell(category string) *Shell { + return &Shell{ + Category: category, + DataSet: shellStorage.DataSet(category), + } +} + +func Category(category string) *Shell { + return NewShell(category) +} + +func Base() *Shell { + return NewShell(key.Base) +} + +func (s *Shell) Update() { + s.DataSet = shellStorage.DataSet(s.Category) +} +func (s *Shell) Clone() *Shell { + return NewShell(s.Category) +} +func (s *Shell) UpdateCategory(category string) { + s.Category = category +} + +type OriginShell struct { + Category string + *dataset.DataSet +} + +func NewOriginShell(category string) *OriginShell { + return &OriginShell{ + Category: category, + DataSet: shellStorage.OriginDataSet(category), + } +} + +func OriginBase() *OriginShell { + return NewOriginShell(key.Base) +} + +func (s *OriginShell) Update() { + s.DataSet = shellStorage.OriginDataSet(s.Category) +} + +func (s *OriginShell) UpdateCategory(category string) { + s.Category = category +} diff --git a/gamesrv/slotspkg/internal/module/shell/storage.go b/gamesrv/slotspkg/internal/module/shell/storage.go new file mode 100644 index 0000000..c005234 --- /dev/null +++ b/gamesrv/slotspkg/internal/module/shell/storage.go @@ -0,0 +1,40 @@ +package shell + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/dao/dataset" + "sync" +) + +type ShellStorage struct { + sync.RWMutex + storage dataset.Storage + originStorage dataset.Storage + configMap map[string]string +} + +var shellStorage = &ShellStorage{} + +func init() { + shellStorage.Update() +} +func (ds *ShellStorage) Update() { + ds.Lock() + defer ds.Unlock() + + dataset.Load(nil) + ds.storage = dataset.Duplicate() + ds.originStorage = dataset.DuplicateOrigin() +} +func (ds *ShellStorage) DataSet(category string) *dataset.DataSet { + ds.RLock() + defer ds.RUnlock() + + return dataset.NewDataset(category, ds.storage) +} + +func (ds *ShellStorage) OriginDataSet(category string) *dataset.DataSet { + ds.RLock() + defer ds.RUnlock() + + return dataset.NewDataset(category, ds.originStorage) +} diff --git a/gamesrv/slotspkg/slots/dataset.go b/gamesrv/slotspkg/slots/dataset.go new file mode 100644 index 0000000..174fda2 --- /dev/null +++ b/gamesrv/slotspkg/slots/dataset.go @@ -0,0 +1,17 @@ +package slots + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/module/player" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/session" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shell" +) + +type dataSet struct { + *shell.Shell +} + +func DataSet(s *session.Session) *dataSet { + return &dataSet{ + Shell: shell.Session(s, ServiceName(), player.CategoryName(s)), + } +} diff --git a/gamesrv/slotspkg/slots/desc/formation_desc.go b/gamesrv/slotspkg/slots/desc/formation_desc.go new file mode 100644 index 0000000..116132f --- /dev/null +++ b/gamesrv/slotspkg/slots/desc/formation_desc.go @@ -0,0 +1,219 @@ +package desc + +import ( + "github.com/tomas-qstarrs/boost/stringx" + "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" +) + +type ( + // FormationDesc describes Formation related configs + FormationDesc struct { + NodeDesc *NodeDesc + FormationSeqDesc *FormationSeqDesc + SeqID int64 + ReelsDesc ReelsDesc + MatrixDesc MatrixDesc + SymbolsDesc SymbolsDesc + Empty bool + } + + // ReelsDesc describes all reels' weight and range's config + ReelsDesc = []*ReelDesc + + // ReelDesc describes one reel's weight and range's config + ReelDesc struct { + Reel []int64 + Weights []float64 + Range int64 + } + + // MatrixDesc describes links config + MatrixDesc *structs.Matrix + + // SymbolsDesc describes all symbols' config + SymbolsDesc = map[int64]*SymbolDesc + + // SymbolDesc describes one symbol's config + SymbolDesc struct { + ID int64 + Name string + IsWild bool + Group []int64 + PayRate []int64 + BetRatio [2]float64 + } +) + +// NewFormationDesc gets formation related config +func NewFormationDesc(n *NodeDesc, seqID int64) (*FormationDesc, error) { + var err error + + if seqID > int64(len(n.FormationSeqsDesc)) { + return nil, errors.FormationSeqIDNotFound.ErrorWith( + n.Theme, n.NodeType) + } + formationSeqDesc := n.FormationSeqsDesc[seqID-1] + f := &FormationDesc{ + NodeDesc: n, + SeqID: seqID, + FormationSeqDesc: formationSeqDesc, + } + + f.Empty = f.IsEmptyFormationDesc() + + if !f.Empty { + if f.ReelsDesc, err = f.GetReelsDesc(); err != nil { + return nil, err + } + if f.MatrixDesc, err = f.GetMatrixDesc(); err != nil { + return nil, err + } + if f.SymbolsDesc, err = f.GetSymbolDesc(); err != nil { + return nil, err + } + } + + return f, nil +} + +// IsEmptyFormationDesc checks if it's an empty formation +func (f *FormationDesc) IsEmptyFormationDesc() bool { + return f.FormationSeqDesc.Reel == "" && + f.FormationSeqDesc.Matrix == "" && + f.FormationSeqDesc.Symbol == "" +} + +// GetReelsDesc gets reels weight config +func (f *FormationDesc) GetReelsDesc() (ReelsDesc, error) { + var name string + if f.FormationSeqDesc.Reel != "Default" { + name = f.FormationSeqDesc.Reel + } + excelData := f.NodeDesc.Excel(stringx.Merge("Reel", name)) + + // get ranges + v, ok := excelData["Range"] + if !ok { + return nil, errors.ConfigSheetNotFound.ErrorWith(f.NodeDesc.Theme, f.NodeDesc.NodeType, "Reel.Range") + } + ranges, ok := v.([][]int64) + if !ok { + return nil, errors.ConfigTypeError.ErrorWith(f.NodeDesc.Theme, f.NodeDesc.NodeType, "Reel.Range") + } + if len(ranges) == 0 { + return nil, errors.ConfigSheetEmpty.ErrorWith(f.NodeDesc.Theme, f.NodeDesc.NodeType, "Reel.Range") + } + + // get weights + v, ok = excelData["Reel"] + if !ok { + return nil, errors.ConfigSheetNotFound.ErrorWith(f.NodeDesc.Theme, f.NodeDesc.NodeType, "Reel.Reel") + } + reels, ok := v.([][]int64) + if !ok { + return nil, errors.ConfigTypeError.ErrorWith(f.NodeDesc.Theme, f.NodeDesc.NodeType, "Reel.Reel") + } + v, ok = excelData["Weight"] + if !ok { + return nil, errors.ConfigSheetNotFound.ErrorWith(f.NodeDesc.Theme, f.NodeDesc.NodeType, "Reel.Weight") + } + weights, ok := v.([][]float64) + if !ok { + return nil, errors.ConfigTypeError.ErrorWith(f.NodeDesc.Theme, f.NodeDesc.NodeType, "Reel.Weight") + } + if len(reels) != len(weights) { + return nil, errors.FormationReelWeightNotMatch.ErrorWith(f.NodeDesc.Theme, f.NodeDesc.NodeType, "Reel.Weight") + } + for idx, reel := range reels { + if len(reel) != len(weights[idx]) { + return nil, errors.FormationReelWeightNotMatch.ErrorWith(f.NodeDesc.Theme, f.NodeDesc.NodeType, "Reel.Weight") + } + } + + reelsDesc := make(ReelsDesc, 0, len(reels)) + for reelIdx, reel := range reels { + reelsDesc = append(reelsDesc, &ReelDesc{ + Reel: reel, + Weights: weights[reelIdx], + Range: ranges[0][reelIdx], + }) + } + + return reelsDesc, nil +} + +// GetMatrixDesc gets matrix config +func (f *FormationDesc) GetMatrixDesc() (MatrixDesc, error) { + var name string + if f.FormationSeqDesc.Matrix == "Default" { + name = "" + } else { + name = f.FormationSeqDesc.Matrix + } + v := f.NodeDesc.DefaultSheet("Matrix" + name) + + matrixes, ok := v.([]*structs.Matrix) + if !ok { + return nil, errors.ConfigTypeError.ErrorWith( + f.NodeDesc.Theme, f.NodeDesc.NodeType, stringx.Merge("Matrix", name)) + } + + if len(matrixes) == 0 { + return nil, errors.ConfigSheetEmpty.ErrorWith( + f.NodeDesc.Theme, f.NodeDesc.NodeType, stringx.Merge("Matrix", name)) + } + + matrixDesc := MatrixDesc(matrixes[0]) + return matrixDesc, nil +} + +// GetSymbolDesc gets symbol related config +func (f *FormationDesc) GetSymbolDesc() (SymbolsDesc, error) { + var name string + if f.FormationSeqDesc.Symbol == "Default" { + name = "" + } else { + name = f.FormationSeqDesc.Symbol + } + v := f.NodeDesc.DefaultSheet("Symbol" + name) + symbolsMap, ok := v.(map[int64]*structs.Symbol) + if !ok { + return nil, errors.ConfigTypeError.ErrorWith( + f.NodeDesc.Theme, f.NodeDesc.NodeType, stringx.Merge("Symbol", name)) + } + + var betRatio [2]float64 + if f.NodeDesc.ExistSheet("Symbol", "BetRatio") { + v = f.NodeDesc.Sheet("Symbol", "BetRatio") + betRatioMap := v.([]*structs.SymbolBetRatio) + if len(betRatioMap) == 1 { + betRatio = [2]float64{betRatioMap[0].BetRatio, 1} + } else if len(betRatioMap) == 2 { + betRatio = [2]float64{betRatioMap[0].BetRatio, betRatioMap[1].BetRatio} + } + } + if betRatio[0] == 0 { + betRatio[0] = 1 + } + if betRatio[1] == 0 { + betRatio[1] = 1 + } + + symbolsDesc := make(SymbolsDesc) + for k, symbolDesc := range symbolsMap { + symbolsDesc[k] = &SymbolDesc{ + ID: symbolDesc.ID, + Name: symbolDesc.Name, + IsWild: symbolDesc.IsWild, + Group: symbolDesc.Group, + PayRate: symbolDesc.PayRate, + BetRatio: betRatio, + } + } + return symbolsDesc, nil +} + +func (s *SymbolDesc) Ratio(rate int64) float64 { + return float64(rate) * s.BetRatio[0] / s.BetRatio[1] +} diff --git a/gamesrv/slotspkg/slots/desc/machine_desc.go b/gamesrv/slotspkg/slots/desc/machine_desc.go new file mode 100644 index 0000000..5dc4e00 --- /dev/null +++ b/gamesrv/slotspkg/slots/desc/machine_desc.go @@ -0,0 +1,176 @@ +package desc + +import ( + "github.com/tomas-qstarrs/boost/config" + "github.com/tomas-qstarrs/boost/randx" + "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shell" +) + +type ( + MachineDesc struct { + Theme string + Category string + DataSet *shell.Shell + } +) + +func NewMachineDesc(theme, category string, shell *shell.Shell) *MachineDesc { + return &MachineDesc{ + Theme: theme, + Category: category, + DataSet: shell, + } +} + +// DefaultSheet gets default machine config by excel name +func (n *MachineDesc) DefaultSheet(excel string) interface{} { + return n.DataSet.GetMachineDefaultSheet(n.Theme, excel, 0) +} + +// Sheet gets machine config by excel name & sheet name +func (n *MachineDesc) Sheet(excel string, sheet string) interface{} { + return n.DataSet.GetMachineSheet(n.Theme, excel, sheet, 0) +} + +func (n *MachineDesc) GetLineBet(betSizeIndex int64, betLevelIndex int64) int64 { + betSizeRows, ok := n.Sheet("Bet", "BetSize").(map[int64]*structs.BetSize) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "BetSize")) + } + + betSizeRow, ok := betSizeRows[betSizeIndex] + if !ok { + panic(errors.ConfigRowNoMatch.ErrorWith(n.Theme, "BetSize", betSizeIndex)) + } + + betLevelRows, ok := n.Sheet("Bet", "BetLevel").(map[int64]*structs.BetLevel) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "BetLevel")) + } + + betLevelRow, ok := betLevelRows[betLevelIndex] + if !ok { + panic(errors.ConfigRowNoMatch.ErrorWith(n.Theme, "BetLevel", betLevelIndex)) + } + + return betSizeRow.BetSize * betLevelRow.BetLevel +} +func (n *MachineDesc) BetSizes() []int64 { + betSizeRows, ok := n.Sheet("Bet", "BetSize").(map[int64]*structs.BetSize) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "BetSize")) + } + var lists []int64 + for _, list := range betSizeRows { + lists = append(lists, list.BetSize) + } + return lists +} +func (n *MachineDesc) BetLevels() []int64 { + betChangeListRows, ok := n.Sheet("Bet", "BetLevel").(map[int64]*structs.BetLevel) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "BetLevel")) + } + var lists []int64 + for _, list := range betChangeListRows { + lists = append(lists, list.BetLevel) + } + return lists +} +func (n *MachineDesc) BetLines() []int64 { + betChangeListRows, ok := n.Sheet("Bet", "BetLine").(map[int64]*structs.BetLine) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "BetLine")) + } + var lists []int64 + for _, list := range betChangeListRows { + lists = append(lists, list.BetLine) + } + return lists +} +func (n *MachineDesc) BetChangeList() []float64 { + betChangeListRows, ok := n.Sheet("Bet", "BetChangeList").(map[int64]*structs.BetChangeList) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "BetChangeList")) + } + var lists []float64 + for _, list := range betChangeListRows { + lists = append(lists, list.BetChangeList) + } + return lists +} +func (n *MachineDesc) GetVector(choice int64, minRatio, maxRatio float64, isForceWin bool) (int64, []int64) { + if vectorIndex := config.GetInt64("slots.vectorIndex"); vectorIndex > 0 { + rows := n.DefaultSheet("Vector").([]*structs.Vector) + return vectorIndex, rows[vectorIndex].Vector + } + + if minRatio < 0 { + minRatio = 0 + } + + if maxRatio < 1 { + maxRatio = 1 + } + + if isForceWin { + rows := n.Sheet("Vector", "ForceWin").([]*structs.VectorForceWin) + var indexWeightMap = make(map[int]float64) + for index, row := range rows { + if choice == row.Choice && minRatio <= row.MinRatio && row.MaxRatio <= maxRatio { + indexWeightMap[index] = row.Weight + } + } + if len(indexWeightMap) == 0 { + return n.GetVector(choice, 0, maxRatio, false) + } + + index := randx.WeightMap(indexWeightMap) + return n.GetVector(choice, rows[index].MinRatio, rows[index].MaxRatio, false) + } else { + rows := n.DefaultSheet("Vector").([]*structs.Vector) + var indexes = make([]int, 0, len(rows)) + for index, row := range rows { + if choice == row.Choice && minRatio <= row.Ratio && row.Ratio <= maxRatio { + indexes = append(indexes, index) + } + } + + if len(indexes) == 0 { + if minRatio == 0 { + return n.GetVector(0, 0, maxRatio, false) + } + return n.GetVector(choice, 0, maxRatio, false) + } + + index := indexes[randx.Intn(len(indexes))] + return int64(index), rows[index].Vector + } +} + +// GetSpinType gets spin type by node type +func (n *MachineDesc) GetSpinType(typ string) int64 { + v := n.DefaultSheet("Formation") + formations, ok := v.([]*structs.Formation) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Formation")) + } + for _, formation := range formations { + if formation.NodeType == typ { + return formation.SpinType + } + } + panic(errors.ConfigRowNoMatch.ErrorWith(n.Theme, "Formation", typ)) +} + +func (n *MachineDesc) GetPrizeModel() map[int64]*structs.PrizeModel { + v := n.DefaultSheet("PrizeModel") + rows, ok := v.(map[int64]*structs.PrizeModel) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "PrizeModel")) + } + + return rows +} diff --git a/gamesrv/slotspkg/slots/desc/node_desc.go b/gamesrv/slotspkg/slots/desc/node_desc.go new file mode 100644 index 0000000..00cf62d --- /dev/null +++ b/gamesrv/slotspkg/slots/desc/node_desc.go @@ -0,0 +1,93 @@ +package desc + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shell" + "sort" +) + +type ( + // FormationSeqDesc describes a formation of node type + FormationSeqDesc = structs.Formation + + // FormationSeqsDesc describes all formation of node type + FormationSeqsDesc = []*structs.Formation + + // NodeDesc describes all machine related config + NodeDesc struct { + Theme string + Category string + NodeType string + DataSet *shell.Shell + Class int64 // set when `ResetClass` called + FormationSeqsDesc FormationSeqsDesc + } +) + +// NewNodeDesc gets config upgrade by player +func NewNodeDesc(theme, category, nodeType string, class int64, shell *shell.Shell) *NodeDesc { + return &NodeDesc{ + Theme: theme, + Category: category, + NodeType: nodeType, + DataSet: shell, + Class: class, + } +} + +func (n *NodeDesc) ExistSheet(excel string, sheet string) bool { + return n.DataSet.ExistMachineSheet(n.Theme, excel, sheet, n.Class) +} + +// DefaultSheet gets default machine config by excel name +func (n *NodeDesc) DefaultSheet(excel string) interface{} { + return n.DataSet.GetMachineDefaultSheet(n.Theme, excel, n.Class) +} + +// Sheet gets machine config by excel name & sheet name +func (n *NodeDesc) Sheet(excel string, sheet string) interface{} { + return n.DataSet.GetMachineSheet(n.Theme, excel, sheet, n.Class) +} + +// Sheet gets machine config by excel name & sheet name +func (n *NodeDesc) KeySheet(excel string, sheet string, keyName string) interface{} { + return n.DataSet.GetMachineKeySheet(n.Theme, excel, sheet, n.Class, keyName) +} + +// Excel gets machine excel config by excel name +func (n *NodeDesc) Excel(excel string) map[string]interface{} { + return n.DataSet.GetMachineExcel(n.Theme, excel, n.Class) +} + +// GetFormationSeqDescs gets nodeType related all formations +func (n *NodeDesc) GetFormationSeqDescs(typ string) FormationSeqsDesc { + formationSeqsDesc := make(FormationSeqsDesc, 0) + v := n.DefaultSheet("Formation") + formations, ok := v.([]*structs.Formation) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Formation")) + } + seqIndexes := make(map[int]int) + var seqs []int + for idx, formation := range formations { + if formation.NodeType == typ && formation.SeqID > 0 { + seqIndexes[int(formation.SeqID)] = idx + seqs = append(seqs, int(formation.SeqID)) + } + } + sort.Ints(seqs) + for _, seq := range seqs { + idx := seqIndexes[seq] + formationSeqsDesc = append(formationSeqsDesc, formations[idx]) + } + return formationSeqsDesc +} +func (n *NodeDesc) GetThemeRTPModes() map[int64]*structs.MapRTPMode { + v := n.Sheet("Map", "RTPMode") + rtpModeRows, ok := v.(map[int64]*structs.MapRTPMode) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Map", "RTPMode")) + } + return rtpModeRows +} diff --git a/gamesrv/slotspkg/slots/entity/cheat.go b/gamesrv/slotspkg/slots/entity/cheat.go new file mode 100644 index 0000000..c2bb83b --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/cheat.go @@ -0,0 +1,60 @@ +package entity + +import ( + "encoding/json" +) + +// CheatFormations replaces formation's symbols when its length is valid +func (e *Entity) CheatFormations() { + for _, originFormation := range e.OriginFormations { + + minLen := 0 + if len(originFormation.Symbols) > len(originFormation.CheatSymbols) { + minLen = len(originFormation.CheatSymbols) + } else { + minLen = len(originFormation.Symbols) + } + + for symbolIdx := int64(0); symbolIdx < int64(minLen); symbolIdx++ { + originFormation.Symbols[symbolIdx] = originFormation.CheatSymbols[symbolIdx] + } + } +} + +// PrepareCheatFormations gets all cheat formations from data +func (e *Entity) PrepareCheatFormations() { + v, ok := e.Data[e.NodeDesc.NodeType] + if !ok { + return + } + result := v.(string) + if result == "" { + return + } + + cheatSeqSymbols := make([][]int64, 0) + err := json.Unmarshal([]byte(result), &cheatSeqSymbols) + if err != nil { + cheatSeqSymbols = make([][]int64, 0) + symbols := make([]int64, 0) + err = json.Unmarshal([]byte(result), &symbols) + if err != nil { + panic(errors.Error(err)) + } + cheatSeqSymbols = append(cheatSeqSymbols, symbols) + } + + minLen := 0 + if len(cheatSeqSymbols) > len(e.OriginFormations) { + minLen = len(e.OriginFormations) + } else { + minLen = len(cheatSeqSymbols) + } + + for formationIdx := int64(0); formationIdx < int64(minLen); formationIdx++ { + cheatSymbols := cheatSeqSymbols[formationIdx] + originFormation := e.OriginFormations[formationIdx] + originFormation.CheatSymbols = make([]int64, len(cheatSymbols)) + copy(originFormation.CheatSymbols, cheatSymbols) + } +} diff --git a/gamesrv/slotspkg/slots/entity/custom.go b/gamesrv/slotspkg/slots/entity/custom.go new file mode 100644 index 0000000..07692da --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/custom.go @@ -0,0 +1,35 @@ +package entity + +import ( + "github.com/mohae/deepcopy" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "reflect" +) + +// GetCustom gets feature interface by feature ID +func (e *Entity) GetCustom(featureID int64) interface{} { + v, ok := e.Customs[featureID] + if !ok { + panic(errors.FeatureNotFound.Error()) + } + return v +} + +// AddFeatureCustom adds custom on feature +func (e *Entity) AddFeatureCustom(featureID int64, v interface{}) *shared.Feature { + v = deepcopy.Copy(v) + feature := e.GetFeature(featureID) + feature.Type = reflect.TypeOf(v).Elem().String() + _, ok := e.Customs[featureID] + if ok { + panic(errors.FeatureAlreadyExists.Error()) + } + e.Customs[featureID] = v + return feature +} + +// DeleteCustom deletes custom by feature id +func (e *Entity) DeleteCustom(featureID int64) { + delete(e.Customs, featureID) +} diff --git a/gamesrv/slotspkg/slots/entity/db.go b/gamesrv/slotspkg/slots/entity/db.go new file mode 100644 index 0000000..5dff427 --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/db.go @@ -0,0 +1,34 @@ +package entity + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/ddb" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/global" + "strings" +) + +type DB struct{} + +var db DB + +func (DB) GetCheatData(uid int64, theme string) map[string]interface{} { + c := ddb.RedimoClient() + + result, err := c.HGETALL(global.DDB.CheatSlots(uid)) + if err != nil { + panic(err) + } + + data := make(map[string]interface{}) + for key, value := range result { + index := strings.Index(key, theme) + if index != 0 { + continue + } + dataKey := key[len(theme)+1:] + if value.Present() { + data[dataKey] = value.Interface() + } + } + + return data +} diff --git a/gamesrv/slotspkg/slots/entity/entity.go b/gamesrv/slotspkg/slots/entity/entity.go new file mode 100644 index 0000000..350f2a8 --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/entity.go @@ -0,0 +1,62 @@ +package entity + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/player" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/session" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shell" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" + "mongo.games.com/game/gamesrv/slotspkg/slots/formation" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" +) + +// Entity holds a machine for player +type Entity struct { + Theme string + Shell *shell.Shell + MachineDesc *desc.MachineDesc + NodeDesc *desc.NodeDesc + NextNodeDesc *desc.NodeDesc + NodeTree *shared.NodeTree + OriginFormations []*formation.Formation // for storing origin formation.Formation + Session *session.Session + Player *player.Player + Customs map[int64]interface{} + Callback intf.Callback + Data map[string]interface{} // machine data store + RandState *RandState + IsFree bool +} + +// NewEntity creates a new entity +func NewEntity(s *session.Session, theme string, callback intf.Callback, shell *shell.Shell, isFree bool) *Entity { + return &Entity{ + Theme: theme, + Shell: shell, + MachineDesc: desc.NewMachineDesc(theme, key.Base, shell), + NodeDesc: nil, + NextNodeDesc: nil, + NodeTree: NewNodeTree(), + OriginFormations: make([]*formation.Formation, 0), + Session: s, + Player: player.Get(s), + Customs: make(map[int64]interface{}), + Callback: callback, + Data: make(map[string]interface{}), + RandState: NewRandState(), + IsFree: isFree, + } +} + +func NewNodeTree() *shared.NodeTree { + return &shared.NodeTree{ + RandVector: &shared.RandVector{}, + UserData: &shared.UserData{}, + Nodes: make([]*shared.Node, 0), + Closing: make([]int64, 0), + Act: &shared.Act{}, + BetCoin: &shared.Coin{}, + WinCoin: &shared.Coin{}, + } +} diff --git a/gamesrv/slotspkg/slots/entity/feature.go b/gamesrv/slotspkg/slots/entity/feature.go new file mode 100644 index 0000000..a6d2d00 --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/feature.go @@ -0,0 +1,286 @@ +package entity + +import ( + "github.com/mohae/deepcopy" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" +) + +// GetFeature finds feature by walking all nodes in node tree +func (e *Entity) GetFeature(featureID int64) *shared.Feature { + var f *shared.Feature + e.Walk(func(node *shared.Node) bool { + for _, feature := range node.Features { + if feature.ID == featureID { + f = feature + return true + } + } + return false + }) + + if f != nil { + return f + } + + for _, feature := range e.NodeTree.ImageFeatures { + if feature.ID == featureID { + return feature + } + } + + return nil +} + +// GetTypeFeatures finds features by walking all nodes in node tree +func (e *Entity) GetTypeFeatures(node *shared.Node, typ string) []*shared.Feature { + features := make([]*shared.Feature, 0) + for _, feature := range node.Features { + if feature.Type == typ { + features = append(features, feature) + } + } + return features +} + +// AddFeature adds feature to node features +func (e *Entity) AddFeature(node *shared.Node) int64 { + e.NodeTree.Incr++ + featureID := e.NodeTree.Incr + + node.Features = append(node.Features, &shared.Feature{ + NodeID: node.ID, + ID: featureID, + SpinType: node.SpinType, + NodeType: node.Type, + Lifetime: -1, + Visiable: true, + }) + + return featureID +} + +// PruneNodeFeatures prune features that has no lifetime +func (e *Entity) PruneNodeFeatures(node *shared.Node) { + for index := 0; index < len(node.Features); index++ { + feature := node.Features[index] + if feature.Lifetime == 0 { + node.Features = append(node.Features[:index], + node.Features[index+1:]...) + e.DeleteCustom(feature.ID) + index-- + } + } +} + +// FeaturesPassTime decreases features' lifetime on specific node +func (e *Entity) FeaturesPassTime(node *shared.Node, n int64) { + features := node.Features + for _, feature := range features { + if feature.Lifetime > 0 { + if feature.Lifetime > n { + feature.Lifetime -= n + } else { + feature.Lifetime = 0 + } + } + } +} + +// UpdateImageFeatures saves image info from features to image features +func (e *Entity) UpdateImageFeatures() { + e.updateImageFeaturesByNode() + e.updateImageFeaturesByFormation() +} + +func (e *Entity) updateImageFeaturesByNode() { + var features []*shared.Feature + for _, feature := range e.CursorNode().Features { + if feature.Imageable && feature.SeqID == 0 { + features = append(features, feature) + } + } + + nodeType := e.CursorNode().Type + for index := 0; index < len(e.NodeTree.ImageFeatures); index++ { + imageFeature := e.NodeTree.ImageFeatures[index] + if imageFeature.SeqID == 0 && imageFeature.NodeType == nodeType { + e.NodeTree.ImageFeatures = append( + e.NodeTree.ImageFeatures[:index], + e.NodeTree.ImageFeatures[index+1:]...) + e.DeleteCustom(imageFeature.ID) + index-- + } + } + + for _, feature := range features { + e.copyFeatureToImage(feature) + } +} + +func (e *Entity) updateImageFeaturesByFormation() { + var features []*shared.Feature + for _, feature := range e.CursorNode().Features { + if feature.Imageable && feature.SeqID > 0 { + features = append(features, feature) + } + } + + for _, feature := range features { + formationID := feature.FormationID + for index := 0; index < len(e.NodeTree.ImageFeatures); index++ { + imageFeature := e.NodeTree.ImageFeatures[index] + if imageFeature.SeqID > 0 && imageFeature.FormationID == formationID { + e.NodeTree.ImageFeatures = append( + e.NodeTree.ImageFeatures[:index], + e.NodeTree.ImageFeatures[index+1:]...) + e.DeleteCustom(imageFeature.ID) + index-- + } + } + } + + for _, feature := range features { + e.copyFeatureToImage(feature) + } +} + +func (e *Entity) copyFeatureToImage(feature *shared.Feature) { + custom := e.GetCustom(feature.ID) + + e.NodeTree.Incr++ + featureID := e.NodeTree.Incr + + // deep copy feature + newFeature := deepcopy.Copy(feature).(*shared.Feature) + newFeature.ID = featureID + + e.NodeTree.ImageFeatures = append(e.NodeTree.ImageFeatures, newFeature) + + e.AddFeatureCustom(featureID, deepcopy.Copy(custom)) +} + +func (e *Entity) copyFeatureToNode(node *shared.Node, feature *shared.Feature) { + custom := e.GetCustom(feature.ID) + + e.NodeTree.Incr++ + featureID := e.NodeTree.Incr + + // deep copy feature + newFeature := deepcopy.Copy(feature).(*shared.Feature) + newFeature.ID = featureID + newFeature.Imageable = false + newFeature.Lifetime = 0 + + node.Features = append(node.Features, newFeature) + + e.AddFeatureCustom(featureID, deepcopy.Copy(custom)) +} + +// AttachFeatureToFormation attaches feature to formation by seq ID +func (e *Entity) AttachFeatureToFormation(feature *shared.Feature, seqID int64) { + formation := e.GetFormation(feature.NodeID, seqID) + feature.SeqID = seqID + feature.FormationID = formation.ID +} + +// InitNextFeatures inits init symbols features for next node +func (e *Entity) InitNextFeatures() { + e.initNextFeaturesByNode() + e.initNextFeaturesByFormations() +} + +func (e *Entity) initNextFeaturesByNode() { + nextNodeType := e.NextNode().Type + cursorNodeType := e.CursorNode().Type + if nextNodeType == cursorNodeType { + return + } + for _, imageFeature := range e.NodeTree.ImageFeatures { + if imageFeature.SeqID == 0 && imageFeature.NodeType == nextNodeType { + e.copyFeatureToNode(e.NextNode(), imageFeature) + } + } +} + +func (e *Entity) initNextFeaturesByFormations() { + for _, nextFormation := range e.NextNode().Formations { + e.genFormationFeatures(nextFormation) + } +} + +func (e *Entity) genFormationFeatures(nextFormation *shared.Formation) { + var initFeatures []*shared.Feature + defer func() { + for _, initFeature := range initFeatures { + e.copyFeatureToNode(e.NextNode(), initFeature) + } + }() + + desc := e.getNextFormationDesc(nextFormation) + if desc == nil { // No formation in next node + return + } + + // Check same formation id form cursor node, no need to copy feature + for _, cursorFormation := range e.CursorNode().Formations { + if nextFormation.ID == cursorFormation.ID { + return + } + } + + // Next node is progressed, just read history + if e.NextNode().ProgressValue > 0 { + initFeatures = e.getImageFeatures(e.NextNode(), desc) + return + } + + method := e.getNexFormationMethod(e.NextNode(), desc) + + // Switch method to get all kinds of init symbols source + switch method { + case initSymbolsMethodNone: + // do nothing + case initSymbolsMethodConst: + // do nothing + case initSymbolsMethodRandom: + // do nothing + case initSymbolsMethodCopy: + initFeatures = e.getCopyFeatures(e.NextNode(), desc) + case initSymbolsMethodImage: + initFeatures = e.getImageFeatures(e.NextNode(), desc) + default: + panic(errors.With(method).Errorf("unsupported init symbols method")) + } +} + +func (e *Entity) getCopyFeatures(node *shared.Node, desc *desc.FormationSeqDesc) []*shared.Feature { + for { + node = e.GetNode(node.Parent) + if node.ID == e.NodeTree.Root { + return nil + } + if desc.SeqID > int64(len(node.Formations)) { + continue + } + var features []*shared.Feature + for _, feature := range node.Features { // Use seq ID + if feature.SeqID == node.Formations[desc.SeqID-1].SeqID { + features = append(features, feature) + } + } + return features + } +} + +func (e *Entity) getImageFeatures(node *shared.Node, desc *desc.FormationSeqDesc) []*shared.Feature { + var features []*shared.Feature + formation := node.Formations[desc.SeqID-1] + for _, imageFeature := range e.NodeTree.ImageFeatures { // Use formation ID + if imageFeature.SeqID > 0 && imageFeature.FormationID == formation.ID { + features = append(features, imageFeature) + } + } + return features +} diff --git a/gamesrv/slotspkg/slots/entity/formation.go b/gamesrv/slotspkg/slots/entity/formation.go new file mode 100644 index 0000000..d231402 --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/formation.go @@ -0,0 +1,335 @@ +package entity + +import ( + "github.com/tomas-qstarrs/boost/randx" + "github.com/tomas-qstarrs/boost/timex" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" + "mongo.games.com/game/gamesrv/slotspkg/slots/formation" +) + +const ( + initSymbolsMethodNone int64 = iota + initSymbolsMethodConst + initSymbolsMethodRandom + initSymbolsMethodCopy + initSymbolsMethodImage +) + +// GetFormation gets specific formation by node id & seq id +// panic if no formation +func (e *Entity) GetFormation(nodeID int64, seqID int64) *shared.Formation { + node := e.GetNode(nodeID) + if seqID > int64(len(node.Formations)) { + panic(errors.FormationNotFound.ErrorWith(seqID)) + } + return node.Formations[seqID-1] +} + +// GetFormations gets all formations by node id +func (e *Entity) GetFormations(nodeID int64) []*shared.Formation { + node := e.GetNode(nodeID) + return node.Formations +} + +// ConvertFormations sets formations into node formations +func (e *Entity) ConvertFormations() { + for idx, originFormation := range e.OriginFormations { + linkPositions := make([]*shared.LinkPositions, 0, len(originFormation.LinkPositions)) + for _, positions := range originFormation.LinkPositions { + linkPositions = append(linkPositions, &shared.LinkPositions{ + Positions: positions, + }) + } + + finalSymbols := make([]int64, len(originFormation.Symbols)) + copy(finalSymbols, originFormation.Symbols) + + cliFormation := e.CursorNode().Formations[idx] + cliFormation.SeqID = originFormation.SeqID + cliFormation.DisplaySymbols = originFormation.DisplaySymbols + cliFormation.FinalSymbols = finalSymbols + cliFormation.LinkPositions = linkPositions + cliFormation.Win = int64(originFormation.Pay * float64(e.CursorNode().SingleBet)) + cliFormation.ReelForm = originFormation.ReelForm + cliFormation.MatrixForm = originFormation.MatrixForm + cliFormation.RandPositions = originFormation.RandPositions + cliFormation.RewardInfo = originFormation.RewardInfo + for _, info := range cliFormation.RewardInfo { + info.Reward *= float64(e.CursorNode().SingleBet) + } + } +} + +// PrepareOriginFormations prepares origin Formations for current node +func (e *Entity) PrepareOriginFormations() { + e.OriginFormations = make([]*formation.Formation, 0) + for _, desc := range e.NodeDesc.FormationSeqsDesc { + formation, err := formation.NewFormation(e.NodeDesc, desc.SeqID) + if err != nil { + panic(err) + } + e.OriginFormations = append(e.OriginFormations, formation) + } +} + +// PrepareOriginFormations prepares origin Formations for next node +func (e *Entity) PrepareNextOriginFormations() { + e.OriginFormations = make([]*formation.Formation, 0) + for _, desc := range e.NextNodeDesc.FormationSeqsDesc { + formation, err := formation.NewFormation(e.NextNodeDesc, desc.SeqID) + if err != nil { + panic(err) + } + e.OriginFormations = append(e.OriginFormations, formation) + } +} + +// Rand rands for all origin formations +func (e *Entity) Rand() { + for _, formation := range e.OriginFormations { + if formation.Empty() { + continue + } + formation.Rand(e.RandState.randx) + } +} + +// Display sets formation for display +func (e *Entity) Display() { + for _, formation := range e.OriginFormations { + if formation.Empty() { + continue + } + formation.Display() + } +} + +// Link links for all origin formations +func (e *Entity) Link() { + for _, formation := range e.OriginFormations { + if formation.Empty() { + continue + } + formation.Link() + } +} + +// UpdateImageFormations saves image info from formations to image formations +func (e *Entity) UpdateImageFormations() { + for _, formation := range e.CursorNode().Formations { + for idx, imageFormation := range e.NodeTree.ImageFormations { + if imageFormation.ID == formation.ID { + e.NodeTree.ImageFormations[idx] = formation + return + } + } + e.NodeTree.ImageFormations = append(e.NodeTree.ImageFormations, formation) + } +} + +// InitNextFormations inits init symbols for next node +func (e *Entity) InitNextFormations() { + for _, nextFormation := range e.NextNode().Formations { + e.genInitSymbols(nextFormation) + } +} + +func (e *Entity) genInitSymbols(nextFormation *shared.Formation) { + var initSymbols []int64 + defer func() { + nextFormation.InitSymbols = make([]int64, len(initSymbols)) + copy(nextFormation.InitSymbols, initSymbols) + }() + + desc := e.getNextFormationDesc(nextFormation) + if desc == nil { // No formation in next node + return + } + + // Try to copy symbols from cursor node + for _, cursorFormation := range e.CursorNode().Formations { + if nextFormation.ID == cursorFormation.ID { + initSymbols = cursorFormation.FinalSymbols + return + } + } + + // Next node is progressed, just read history + if e.NextNode().ProgressValue > 0 { + initSymbols = e.getImageSymbols(e.NextNode(), desc) + return + } + + method := e.getNexFormationMethod(e.NextNode(), desc) + + // Switch method to get all kinds of init symbols source + switch method { + case initSymbolsMethodNone: + // do nothing + case initSymbolsMethodConst: + initSymbols = e.getConstSymbols(e.NextNode(), desc) + case initSymbolsMethodRandom: + initSymbols = e.getRandomSymbols(e.NextNode(), desc) + case initSymbolsMethodCopy: + initSymbols = e.getCopySymbols(e.NextNode(), desc) + case initSymbolsMethodImage: + initSymbols = e.getImageSymbols(e.NextNode(), desc) + default: + panic(errors.With(method).Errorf("unsupported init symbols method")) + } +} + +func (e *Entity) getNextFormationDesc(formation *shared.Formation) *desc.FormationSeqDesc { + for _, desc := range e.NextNodeDesc.FormationSeqsDesc { + if desc.NodeType == formation.NodeType && + desc.SeqID == formation.SeqID { + return desc + } + } + return nil +} + +func (e *Entity) getNexFormationMethod(node *shared.Node, desc *desc.FormationSeqDesc) int64 { + formation := node.Formations[desc.SeqID-1] + for _, imageFormation := range e.NodeTree.ImageFormations { + if imageFormation.ID == formation.ID { + return desc.OtherInitMethod + } + } + return desc.FirstInitMethod +} + +func (e *Entity) getConstSymbols(node *shared.Node, desc *desc.FormationSeqDesc) []int64 { + formation := node.Formations[desc.SeqID-1] + for _, imageFormation := range e.NodeTree.ImageFormations { + if imageFormation.ID == formation.ID { + return desc.OtherInitSymbols + } + } + return desc.FirstInitSymbols +} + +func (e *Entity) getRandomSymbols(_ *shared.Node, desc *desc.FormationSeqDesc) []int64 { + originFormation, err := formation.NewFormation(e.NextNodeDesc, desc.SeqID) + if err != nil { + panic(err) + } + originFormation.Rand(randx.New(timex.Now().UnixNano())) + return originFormation.Symbols +} + +func (e *Entity) getCopySymbols(node *shared.Node, desc *desc.FormationSeqDesc) []int64 { + for { + node = e.GetNode(node.Parent) + if node.ID == e.NodeTree.Root { + return nil + } + if desc.SeqID > int64(len(node.Formations)) { + continue + } + return node.Formations[desc.SeqID-1].FinalSymbols + } +} + +func (e *Entity) getImageSymbols(node *shared.Node, desc *desc.FormationSeqDesc) []int64 { + formation := node.Formations[desc.SeqID-1] + for _, imageFormation := range e.NodeTree.ImageFormations { + if imageFormation.ID == formation.ID { + return imageFormation.FinalSymbols + } + } + return nil +} + +func (e *Entity) getLineCount() int64 { + lineCount := int64(0) + for _, originFormation := range e.OriginFormations { + lineCount += originFormation.FormationDesc.MatrixDesc.LineCount + } + return lineCount +} + +func (e *Entity) GetLineCountByType(nodeType string) int64 { + nodeDesc := e.NewNodeDescWithNodeType(nodeType) + e.SelectFormationSeqsDesc(nodeDesc) + formationSeqsDesc := nodeDesc.GetFormationSeqDescs(key.BaseSpin) + var lineCount int64 = 0 + for _, desc := range formationSeqsDesc { + formation, err := formation.NewFormation(nodeDesc, desc.SeqID) + if err != nil { + panic(err) + } + + lineCount += formation.FormationDesc.MatrixDesc.LineCount + } + return lineCount +} + +// IsWinInBeforeDisplay must in BeforeDisplay +func (e *Entity) IsWinInBeforeDisplay() bool { + if e.OriginFormations != nil { + //newOriginFormations := deepcopy.Copy(e.OriginFormations).([]*formation.Formation) + //newOriginFormations := e.OriginFormations + for i := 1; i <= 100; i++ { + for _, formation := range e.OriginFormations { + if formation.Empty() { + continue + } + formation.Display() + formation.LinkOnWin() + //logx.Error("formation.Symbols----------- ", formation.Symbols) + if formation.Pay > 0 { + //logx.Error("formation.Symbols---22-------- ", formation.Symbols) + //e.OriginFormations[k].Symbols = make([]int64, len(formation.Symbols)) + //copy(e.OriginFormations[k].Symbols, formation.Symbols) + //if e.OriginFormations[k].Symbols[0] == 0 { + // fmt.Println() + //} + return true + } + formation.ResetRandSymbolsByIndex(e.Randx()) + } + } + } + return true +} + +// IsWinInBeforeDisplayBySymbols must in BeforeDisplay +func (e *Entity) IsWinInBeforeDisplayBySymbols(symbols [][]int64) int { + if e.OriginFormations != nil { + for _, f := range e.OriginFormations { + if f.Empty() { + continue + } + symbolsCopy := make([]int64, len(f.Symbols)) + copy(symbolsCopy, f.Symbols) + f.Symbols = formation.DeformatSymbols(symbols) + //f.Display() + f.LinkOnWin() + + f.Symbols = symbolsCopy + if f.Pay > 0 { + return 1 + } + } + //newOriginFormations := deepcopy.Copy(e.OriginFormations).([]*formation.Formation) + //for _, newOriginFormation := range newOriginFormations { + // if newOriginFormation.Empty() { + // continue + // } + // newOriginFormation.Symbols = formation.DeformatSymbols(symbols) + // + // newOriginFormation.DisplaySymbols = make([]int64, len(newOriginFormation.Symbols)) + // copy(newOriginFormation.DisplaySymbols, newOriginFormation.Symbols) + // + // newOriginFormation.Link() + // if newOriginFormation.Pay > 0 { + // return len(newOriginFormation.RewardInfo) + // } + //} + } + return 0 +} diff --git a/gamesrv/slotspkg/slots/entity/node.go b/gamesrv/slotspkg/slots/entity/node.go new file mode 100644 index 0000000..46336f3 --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/node.go @@ -0,0 +1,460 @@ +package entity + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/goserver/core/logger" + "strconv" +) + +const ( + // WalkRootFirst walks root first, recurses from root + WalkRootFirst int64 = 1 + // WalkRootLast walks root last, recurses from farest leaf + WalkRootLast int64 = 2 +) + +// GetNode finds node by nodeID +func (e *Entity) GetNode(nodeID int64) *shared.Node { + for _, node := range e.NodeTree.Nodes { + if node.ID == nodeID { + return node + } + } + panic(errors.NodeNotFound.ErrorWith(strconv.FormatInt(nodeID, 10))) +} + +// IsEmpty returns if the NodeTree is empty +func (e *Entity) IsEmpty() bool { + return len(e.NodeTree.Nodes) == 0 +} + +// IsClosing returns if node is in `NodeTree.Closing` slice +func (e *Entity) IsClosing(node *shared.Node) bool { + for _, closed := range e.NodeTree.Closing { + if node.ID == closed { + return true + } + } + return false +} + +// CursorNode returns the `Cursor` node in `NodeTree` +func (e *Entity) CursorNode() *shared.Node { + return e.GetNode(e.NodeTree.Cursor) +} + +// NextNode returns the `Next` node in `NodeTree` +func (e *Entity) NextNode() *shared.Node { + return e.GetNode(e.NodeTree.Next) +} + +// RootNode returns the `Root` node in `NodeTree` +func (e *Entity) RootNode() *shared.Node { + return e.GetNode(e.NodeTree.Root) +} + +// ParentNode returns the `Parent` node of `Cursor` node in `NodeTree` +func (e *Entity) ParentNode() *shared.Node { + return e.GetNode(e.GetNode(e.NodeTree.Cursor).Parent) +} + +// AncestorNode returns the `Ancestor` Node of `Cursor` Node in `NodeTree` +func (e *Entity) AncestorNode() *shared.Node { + switch e.CursorNode().Type { + case key.BaseSpin, key.FreeSpin, key.Root: + return e.RootNode() + default: + return e.recursiveGetAncestor(e.CursorNode()) + } +} + +func (e *Entity) recursiveGetAncestor(node *shared.Node) *shared.Node { + node = e.GetNode(node.GetParent()) + nodeType := node.GetType() + switch nodeType { + case key.BaseSpin, key.FreeSpin, key.Root: + return node + default: + return e.recursiveGetAncestor(node) + } +} + +// ClosingNodes returns the `Closing` node in `NodeTree` +func (e *Entity) ClosingNodes() []*shared.Node { + closingNodes := make([]*shared.Node, len(e.NodeTree.Closing)) + for i, closing := range e.NodeTree.Closing { + closingNodes[i] = e.GetNode(closing) + } + return closingNodes +} + +// InitRootNode add root node to node tree +func (e *Entity) InitRootNode() int64 { + ID := e.NodeTree.Incr + e.NodeTree.Cursor = ID + e.NodeTree.Next = ID + e.NodeTree.Root = ID + e.NodeTree.Nodes = append(e.NodeTree.Nodes, &shared.Node{ + ID: ID, + Parent: ID, + Children: make([]int64, 0), + Type: key.Root, + Formations: make([]*shared.Formation, 0), + Features: make([]*shared.Feature, 0), + }) + + return ID +} +func (e *Entity) InitAct() { + e.NodeTree.Act = &shared.Act{ + BetSizeIndex: 0, + BetLevelIndex: 0, + BetLineIndex: 0, + Ratio: 1, + } + FirstBet := e.Shell.DataSet.GetMachineSheet(e.Theme, "Bet", "FirstBet", 0) + if FirstBet != nil { + FirstBetMap := FirstBet.(map[int64]*structs.FirstBet) + e.NodeTree.Act.BetSizeIndex = FirstBetMap[1].BetSizeIndex + e.NodeTree.Act.BetLevelIndex = FirstBetMap[1].BetLevelIndex + } +} + +func (e *Entity) UpdateAct(act *shared.Act) { + e.NodeTree.Act = act +} + +func (e *Entity) addChildNodeBySide(parent int64, typ string, + progress int64, rightSide bool) *shared.Node { + if progress == 0 { + panic(errors.NewNodeZeroProgress.Error()) + } + e.NodeTree.Incr++ + nodeID := e.NodeTree.Incr + parentNode := e.GetNode(parent) + if rightSide { + parentNode.Children = append(parentNode.Children, nodeID) + } else { + parentNode.Children = append([]int64{nodeID}, parentNode.Children...) + } + formations := make([]*shared.Formation, 0) + + spinType := e.MachineDesc.GetSpinType(typ) + + formationSeqDescs := e.NodeDesc.GetFormationSeqDescs(typ) + + for _, desc := range formationSeqDescs { + formation := &shared.Formation{ + SpinType: desc.SpinType, + ID: desc.ID, + NodeType: desc.NodeType, + SeqID: desc.SeqID, + NodeID: nodeID, + } + formations = append(formations, formation) + } + + node := &shared.Node{ + ID: nodeID, + Parent: parent, + Children: make([]int64, 0), + Type: typ, + SpinType: spinType, + Formations: formations, + Features: make([]*shared.Feature, 0), + Bet: parentNode.Bet, + ProgressMax: progress, + NeedPrepare: false, + Prepared: false, + } + + e.NodeTree.Nodes = append(e.NodeTree.Nodes, node) + + return node +} + +// AddChildNode add new node to node tree +func (e *Entity) AddChildNode(parent int64, typ string, + progress int64) *shared.Node { + return e.addChildNodeBySide(parent, typ, progress, true) +} + +// AddChildNode add new node to node tree +func (e *Entity) AddChildNodeAtLeft(parent int64, typ string, + progress int64) *shared.Node { + return e.addChildNodeBySide(parent, typ, progress, false) +} + +// UpdateNode2NewType update cursor to new node +func (e *Entity) UpdateNode2NewType(nodeId int64, typ string, progress int64) *shared.Node { + node := e.GetNode(nodeId) + if node == nil { + logger.Logger.Errorf("UpdateNode2NewType err: node == nil nodeid=(%v)", nodeId) + return nil + } + node.Type = typ + node.SpinType = e.MachineDesc.GetSpinType(typ) + node.ProgressMax = progress + node.NoBase = true + + e.NextNodeDesc = e.GetNodeDesc(node) + + e.PrepareNextOriginFormations() + + formations := make([]*shared.Formation, 0) + formationSeqDescs := e.NodeDesc.GetFormationSeqDescs(typ) + for _, desc := range formationSeqDescs { + formation := &shared.Formation{ + SpinType: desc.SpinType, + ID: desc.ID, + NodeType: desc.NodeType, + SeqID: desc.SeqID, + NodeID: node.ID, + } + formations = append(formations, formation) + } + node.Formations = formations + + return node +} + +// PruneNode prunes a node from tree +func (e *Entity) PruneNode(node *shared.Node) { + for _, child := range node.Children { + childNode := e.GetNode(child) + e.PruneNode(childNode) + } + parentNode := e.GetNode(node.Parent) + for index, child := range parentNode.Children { + if child == node.ID { + parentNode.Children = append(parentNode.Children[:index], + parentNode.Children[index+1:]...) + break + } + } + for index, n := range e.NodeTree.Nodes { + if n.ID == node.ID { + e.NodeTree.Nodes = append(e.NodeTree.Nodes[:index], + e.NodeTree.Nodes[index+1:]...) + break + } + } +} + +// Walk walks all nodes in node tree +// return true means stopping right now; false means continuing +func (e *Entity) Walk(f func(node *shared.Node) bool) bool { + for _, node := range e.NodeTree.Nodes { + if f(node) { + return true + } + } + return false +} + +// WalkTree walks nodes from root node +func (e *Entity) WalkTree(direction int64, f func(node *shared.Node) bool) bool { + return e.WalkTreeNode(e.RootNode(), direction, f) +} + +// WalkTreeNode walks nodes from parent node +// return true means stopping right now; false means continuing +func (e *Entity) WalkTreeNode( + node *shared.Node, + direction int64, + f func(node *shared.Node) bool, +) bool { + switch direction { + case WalkRootFirst: + if f(node) { + return true + } + for _, child := range node.Children { + childNode := e.GetNode(child) + if e.WalkTreeNode(childNode, direction, f) { + return true + } + } + case WalkRootLast: + for _, child := range node.Children { + childNode := e.GetNode(child) + if e.WalkTreeNode(childNode, direction, f) { + return true + } + } + if f(node) { + return true + } + } + + return false +} + +// GetChildrenNodes gets children nodes of one nodes +func (e *Entity) GetChildrenNodes(node *shared.Node) []*shared.Node { + nodes := make([]*shared.Node, 0) + for _, childNodeID := range node.Children { + nodes = append(nodes, e.GetNode(childNodeID)) + } + return nodes +} + +// MustNext must return a node +// add a new node if all nodes is accomplished +func (e *Entity) MustNext() { + if next := e.Next(); next != nil { + if !e.CheatNextNodeOnMustNext() { + e.NodeTree.Next = next.ID + } + return + } + + e.AddChildNode(e.NodeTree.Root, key.BaseSpin, 1) + + if next := e.Next(); next != nil { + e.NodeTree.Next = next.ID + return + } + + panic(errors.NextNodeNotFound.Error()) +} + +// Next finds Next node in `NodeTree` +func (e *Entity) Next() *shared.Node { + node := e.CursorNode() + e.NodeTree.Closing = make([]int64, 0) + + if next := e.nextChildren(node); next != nil { + return next + } + if next := e.nextSelf(node); next != nil { + return next + } + if next := e.nextParent(node); next != nil { + return next + } + + return nil +} + +// nextChildren finds node in children that is not accomplished +func (e *Entity) nextChildren(node *shared.Node) (next *shared.Node) { + for _, child := range node.Children { + childNode := e.GetNode(child) + if e.IsClosing(childNode) { // Forbid repeated `next`. + continue + } + if next := e.nextChildren(childNode); next != nil { + return next + } + if next := e.nextSelf(childNode); next != nil { + return next + } + } + return nil +} + +// nextSelf finds node in self node that is not accomplished +func (e *Entity) nextSelf(node *shared.Node) (next *shared.Node) { + if e.IsClosing(node) { // Forbid repeated `next`. + return nil + } + if e.IsFinished(node) { + e.NodeTree.Closing = append(e.NodeTree.Closing, node.ID) + return nil + } + return node +} + +// nextParent recursively next every node below this node, +// including all descendents. +func (e *Entity) nextParent(node *shared.Node) (next *shared.Node) { + if node.ID == 0 || node.Type == key.Root { + return nil + } + nodeParent := e.GetNode(node.Parent) + if nodeParent == nil { + panic(errors.NodeNotFound.Error()) + } + if next := e.nextChildren(nodeParent); next != nil { + return next + } + if next := e.nextSelf(nodeParent); next != nil { + return next + } + if next := e.nextParent(nodeParent); next != nil { + return next + } + return nil +} + +// MoveNext move `Cursor` to `Next` when receive a request +func (e *Entity) MoveNext() { + e.PruneNodeFeatures(e.CursorNode()) + if !e.CheatNextNodeOnMoveNext() { + e.NodeTree.Cursor = e.NodeTree.Next + } + e.PruneNodeFeatures(e.CursorNode()) + for _, closingNode := range e.ClosingNodes() { + e.PruneNode(closingNode) + } +} + +func (e *Entity) RecheckClosing() { + closing := make([]int64, len(e.NodeTree.Closing)) + copy(closing, e.NodeTree.Closing) + e.NodeTree.Closing = make([]int64, 0) + for _, nodeID := range closing { + node := e.GetNode(nodeID) + if next := e.nextChildren(node); next != nil { + continue + } + if next := e.nextSelf(node); next != nil { + continue + } + } +} + +func (e *Entity) CheatNextNodeOnMoveNext() bool { + v, ok := e.Data[key.MachineNextNodeID] + if !ok { + return false + } + + nodeID := v.(int64) + if nodeID == 0 { + return false + } + + e.NodeTree.Cursor = nodeID + e.NodeTree.Next = nodeID + + e.RecheckClosing() + + delete(e.Data, key.MachineNextNodeID) + return true +} + +func (e *Entity) CheatNextNodeOnMustNext() bool { + v, ok := e.Data[key.MachineNextNodeID] + if !ok { + return false + } + + nodeID := v.(int64) + if nodeID == 0 { + return false + } + + e.NodeTree.Next = nodeID + + delete(e.Data, key.MachineNextNodeID) + return true +} + +func (e *Entity) PrepareStep() { + e.NodeTree.Step = e.NodeTree.Step + 1 +} diff --git a/gamesrv/slotspkg/slots/entity/node_desc.go b/gamesrv/slotspkg/slots/entity/node_desc.go new file mode 100644 index 0000000..fe374d8 --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/node_desc.go @@ -0,0 +1,74 @@ +package entity + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" +) + +// PrepareNodeDesc prepares node desc for current node +func (e *Entity) PrepareNodeDesc() { + e.NodeDesc = e.GetCursorNodeDesc() +} + +// PrepareNextNodeDesc prepares node desc for current node +func (e *Entity) PrepareNextNodeDesc() { + e.NextNodeDesc = e.GetNodeDesc(e.NextNode()) +} + +func (e *Entity) Desc() *desc.NodeDesc { + return e.NodeDesc +} + +// NewNodeDesc creates new NodeDesc +func (e *Entity) NewNodeDesc(node *shared.Node) *desc.NodeDesc { + theme := e.Theme + category := key.Base + nodeType := node.GetType() + class := node.GetClass() + return desc.NewNodeDesc(theme, category, nodeType, class, e.Shell) +} + +func (e *Entity) NewNodeDescWithNodeType(nodeType string) *desc.NodeDesc { + node := e.CursorNode() + theme := e.Theme + category := key.Base + class := node.GetClass() + return desc.NewNodeDesc(theme, category, nodeType, class, e.Shell) +} + +// GetCursorNodeDesc gets node desc for specific node with cheating +func (e *Entity) GetCursorNodeDesc() *desc.NodeDesc { + n := e.NewNodeDesc(e.CursorNode()) + + if !e.CheatFormationSeqsDesc(n) { + e.SelectFormationSeqsDesc(n) + } + + return n +} + +// GetNodeDesc gets node desc for specific node +func (e *Entity) GetNodeDesc(node *shared.Node) *desc.NodeDesc { + n := e.NewNodeDesc(node) + e.SelectFormationSeqsDesc(n) + return n +} + +func (e *Entity) CheatFormationSeqsDesc(n *desc.NodeDesc) bool { + v, ok := e.Data[key.MachineFormationSeqsDesc] + if !ok { + return false + } + nodeType := v.(string) + if nodeType == "" { + return false + } + n.FormationSeqsDesc = n.GetFormationSeqDescs(nodeType) + delete(e.Data, key.MachineFormationSeqsDesc) + return true +} + +func (e *Entity) SelectFormationSeqsDesc(n *desc.NodeDesc) { + n.FormationSeqsDesc = n.GetFormationSeqDescs(n.NodeType) +} diff --git a/gamesrv/slotspkg/slots/entity/progress.go b/gamesrv/slotspkg/slots/entity/progress.go new file mode 100644 index 0000000..5dc4c62 --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/progress.go @@ -0,0 +1,195 @@ +package entity + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/formation" +) + +// IsFinished returns if node progress is finished +func (e *Entity) IsFinished(node *shared.Node) bool { + return node.ProgressMax == node.ProgressValue +} + +// Progress add 1 progress to `Cursor` Node and updates features' lifetime +func (e *Entity) Progress() { + node := e.CursorNode() + if node.NeedPrepare && !node.Prepared { + node.Prepared = true + } else if node.ProgressValue < node.ProgressMax { + node.ProgressValue++ + e.FeaturesPassTime(e.CursorNode(), 1) + } +} + +func (e *Entity) SkipBaseSpin(nodeID int64) { + skipNode := e.GetNode(nodeID) + if skipNode.GetType() != key.BaseSpin { + return + } + + e.RootNode().ChildrenTotalWin = 0 + e.RootNode().ChildrenWin = 0 + + node := e.CursorNode() + for node.GetType() != key.BaseSpin { + node = e.GetNode(node.GetParent()) + } + + skipNode.SingleBet = node.SingleBet + skipNode.Bet = node.Bet + skipNode.BaseBet = node.BaseBet + skipNode.ProgressValue = node.ProgressValue + skipNode.ProgressMax = node.ProgressMax +} + +func (e *Entity) SkipBaseSpinWithBet(nodeID int64) { + skipNode := e.GetNode(nodeID) + if skipNode.GetType() != key.BaseSpin { + return + } + + e.RootNode().ChildrenTotalWin = 0 + e.RootNode().ChildrenWin = 0 + + node := e.CursorNode() + + bet := e.ActBet() + + if node.GetType() == key.Root { + var lineCount int64 + for _, desc := range e.NextNodeDesc.FormationSeqsDesc { + formation, err := formation.NewFormation(e.NextNodeDesc, desc.SeqID) + if err != nil { + panic(err) + } + lineCount += formation.FormationDesc.MatrixDesc.LineCount + } + + skipNode.SingleBet = bet / lineCount + skipNode.Bet = bet + skipNode.BaseBet = bet + skipNode.ProgressValue = 1 + skipNode.ProgressMax = 1 + + return + } + + for node.GetType() != key.BaseSpin { + node = e.GetNode(node.GetParent()) + } + + lineCount := node.Bet / node.SingleBet + + skipNode.SingleBet = bet / lineCount + skipNode.Bet = bet + skipNode.BaseBet = bet + skipNode.ProgressValue = node.ProgressValue + skipNode.ProgressMax = node.ProgressMax +} + +// Accomplish instantly finishes a node and updates features' lifetime +func (e *Entity) Accomplish() { + node := e.CursorNode() + node.ProgressValue = node.ProgressMax + + e.FeaturesPassTime(e.CursorNode(), node.ProgressMax) +} + +// AccomplishNext instantly finishes next node and updates features' lifetime +func (e *Entity) AccomplishNext() { + node := e.NextNode() + node.ProgressValue = node.ProgressMax + + e.FeaturesPassTime(e.NextNode(), node.ProgressMax) +} + +// AccomplishParent instantly finishes parent node and updates features' lifetime +func (e *Entity) AccomplishParent() { + node := e.ParentNode() + node.ProgressValue = node.ProgressMax + + e.FeaturesPassTime(e.ParentNode(), node.ProgressMax) +} + +// AddProgress adds progress max to a node +func (e *Entity) AddProgress(n int64) { + node := e.CursorNode() + node.ProgressMax += n +} + +// AddNextProgress adds progress max to next node +func (e *Entity) AddNextProgress(n int64) { + node := e.NextNode() + node.ProgressMax += n +} + +// AddParentProgress adds progress max to parent node +func (e *Entity) AddParentProgress(n int64) { + node := e.ParentNode() + node.ProgressMax += n +} + +// ProgressLeft gets left progress +func (e *Entity) ProgressLeft() int64 { + node := e.CursorNode() + return node.ProgressMax - node.ProgressValue +} + +// NextProgressLeft gets left progress of next node +func (e *Entity) NextProgressLeft() int64 { + node := e.NextNode() + return node.ProgressMax - node.ProgressValue +} + +// ParentProgressLeft gets left progress of parent node +func (e *Entity) ParentProgressLeft() int64 { + node := e.ParentNode() + return node.ProgressMax - node.ProgressValue +} + +// SetProgressLeft set left progress as specific value +func (e *Entity) SetProgressLeft(left int64) { + node := e.CursorNode() + if left > node.ProgressMax { + panic(errors.With(left, node.ProgressMax).Errorf( + "left progress can't be more than progress max")) + } + node.ProgressValue = node.ProgressMax - left +} + +// SetNextProgressLeft set left progress of next node as specific value +func (e *Entity) SetNextProgressLeft(left int64) { + node := e.NextNode() + if left > node.ProgressMax { + panic(errors.With(left, node.ProgressMax).Errorf( + "left progress can't be more than progress max")) + } + node.ProgressValue = node.ProgressMax - left +} + +// SetParentProgressLeft set left progress of parent node as specific value +func (e *Entity) SetParentProgressLeft(left int64) { + node := e.ParentNode() + if left > node.ProgressMax { + panic(errors.With(left, node.ProgressMax).Errorf( + "left progress can't be more than progress max")) + } + node.ProgressValue = node.ProgressMax - left +} + +// GetProgressValue gets progress value for cursor node +func (e *Entity) GetProgressValue() int64 { + return e.CursorNode().ProgressValue +} + +// GetNextProgressValue gets progress value for next node +func (e *Entity) GetNextProgressValue() int64 { + return e.NextNode().ProgressValue +} + +// GetParentProgressValue gets progress value for parent node +func (e *Entity) GetParentProgressValue() int64 { + return e.ParentNode().ProgressValue +} diff --git a/gamesrv/slotspkg/slots/entity/rand.go b/gamesrv/slotspkg/slots/entity/rand.go new file mode 100644 index 0000000..c047e91 --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/rand.go @@ -0,0 +1,169 @@ +package entity + +import ( + "github.com/tomas-qstarrs/boost/randx" + "math" + "math/rand" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" +) + +type RandState struct { + randx *randx.Randx + source rand.Source + tracker *shared.RandxTracker + enableTracker bool +} + +func NewRandState() *RandState { + return &RandState{ + tracker: &shared.RandxTracker{}, + } +} + +func (e *Entity) Randx() *randx.Randx { + return e.RandState.randx +} + +func (e *Entity) PrepareRand() { + var mode string + switch { + case e.NextNode().Type != key.BaseSpin: + mode = e.NodeTree.Mode // 不是BaseSpin 延续上一次的随机情况 + case e.NodeTree.Act.Stay: + mode = key.MachineModeLive + case e.NodeTree.Act.Mode == "": + mode = key.MachineModeLive + default: + mode = e.NodeTree.Act.Mode + } + + e.NodeTree.Mode = mode + + var source rand.Source + switch mode { + case key.MachineModeLive: + source = e.source() + case key.MachineModeRecorder: + if e.NextNode().Type == key.BaseSpin { + // 录制开始 + if e.NodeTree.Act.Vector != nil { + e.NodeTree.RandVector.Vector = e.NodeTree.Act.Vector + e.NodeTree.RandVector.VectorIndex = e.NodeTree.Act.VectorIndex + e.NodeTree.RandVector.VectorType = e.NodeTree.Act.VectorType + } else { + e.NodeTree.RandVector.Vector = []int64{e.source().Int63()} + } + e.NodeTree.Act.Vector = nil + e.NodeTree.Act.VectorIndex = 0 + e.NodeTree.Act.VectorType = 0 + e.NodeTree.RandVector.Index = 0 + } + source = randx.NewLcgVectorPlayer(e.NodeTree.RandVector.Vector, int(e.NodeTree.RandVector.Index)) + case key.MachineModePlayer: + if e.NextNode().Type == key.BaseSpin { + // 播放开始 + e.NodeTree.RandVector.Index = 0 + e.NodeTree.RandVector.Vector = e.NodeTree.Act.Vector + e.NodeTree.RandVector.VectorIndex = e.NodeTree.Act.VectorIndex + e.NodeTree.RandVector.VectorType = e.NodeTree.Act.VectorType + e.NodeTree.RandVector.ExpectedWinCoin = e.NodeTree.Act.ExpectedWinCoin + + e.NodeTree.Act.Vector = nil + e.NodeTree.Act.VectorIndex = 0 + e.NodeTree.Act.VectorType = 0 + e.NodeTree.Act.ExpectedWinCoin = 0 + } + source = randx.NewLcgVectorPlayer(e.NodeTree.RandVector.Vector, int(e.NodeTree.RandVector.Index)) + default: + logger.Logger.Errorf("slots unknown mode: %s", mode) + } + + e.RandState.source = source + e.RandState.randx = randx.New(source) + + switch mode { + case key.MachineModeLive: + e.NodeTree.RandVector.EnableRandxTracker = false + e.NodeTree.RandVector.RandxTracker = &shared.RandxTracker{} + e.NodeTree.RandVector.RecorderRandxTracker = &shared.RandxTracker{} + case key.MachineModeRecorder: + if e.NextNode().Type == key.BaseSpin { + e.NodeTree.RandVector.EnableRandxTracker = e.NodeTree.Act.EnableRandxTracker + e.NodeTree.Act.EnableRandxTracker = false + e.NodeTree.RandVector.RandxTracker = &shared.RandxTracker{} + e.NodeTree.RandVector.RecorderRandxTracker = &shared.RandxTracker{} + } + case key.MachineModePlayer: + if e.NextNode().Type == key.BaseSpin { + e.NodeTree.RandVector.EnableRandxTracker = e.NodeTree.Act.EnableRandxTracker + e.NodeTree.Act.EnableRandxTracker = false + e.NodeTree.RandVector.RandxTracker = &shared.RandxTracker{} + e.NodeTree.RandVector.RecorderRandxTracker = e.NodeTree.Act.RecorderRandxTracker + e.NodeTree.Act.RecorderRandxTracker = &shared.RandxTracker{} + } + default: + logger.Logger.Errorf("slots unknown mode: %s", mode) + } + + e.RandState.enableTracker = e.NodeTree.RandVector.EnableRandxTracker + e.RandState.tracker = e.NodeTree.RandVector.RandxTracker +} + +func (e *Entity) source() rand.Source { + var source rand.Source + if v := e.Session.Value(key.SessionMachineSource); v == nil { + seed := randx.Int63n(math.MaxInt64) + source = rand.NewSource(seed) + e.Session.Set(key.SessionMachineSource, source) + } else { + source = v.(rand.Source) + } + return source +} +func (e *Entity) RandxTracker() *shared.RandxTracker { + return e.RandState.tracker +} +func (e *Entity) CompareRandx() (bool, string, string) { + if !e.RandState.enableTracker { + return false, "", "" + } + playerTracker := e.RandState.tracker + recorderTracker := e.NodeTree.RandVector.RecorderRandxTracker + if len(recorderTracker.Items) < len(playerTracker.Items) { + for i, item := range recorderTracker.Items { + if item.Index != playerTracker.Items[i].Index { + return true, recorderTracker.Items[i-1].Tag, item.Tag + } + } + return true, playerTracker.Items[len(recorderTracker.Items)-1].Tag, playerTracker.Items[len(recorderTracker.Items)].Tag + } else if len(recorderTracker.Items) > len(playerTracker.Items) { + for i, item := range playerTracker.Items { + if item.Index != recorderTracker.Items[i].Index { + return true, playerTracker.Items[i-1].Tag, item.Tag + } + } + return true, recorderTracker.Items[len(playerTracker.Items)-1].Tag, recorderTracker.Items[len(playerTracker.Items)].Tag + } else { + for i, item := range recorderTracker.Items { + if item.Index != playerTracker.Items[i].Index { + return true, recorderTracker.Items[i-1].Tag, item.Tag + } + } + } + return false, "", "" +} + +func (e *Entity) SyncRand() { + switch e.NodeTree.Mode { + case key.MachineModeRecorder, key.MachineModePlayer: + e.NodeTree.RandVector.Vector = e.RandState.source.(*randx.LcgVectorPlayer).Vector + e.NodeTree.RandVector.Index = int64(e.RandState.source.(*randx.LcgVectorPlayer).Index) + e.NodeTree.RandVector.RandxTracker = e.RandState.tracker + e.NodeTree.RandVector.EnableRandxTracker = e.RandState.enableTracker + case key.MachineModeLive: + // Do nothing + default: + logger.Logger.Errorf("slots unknown mode: %s", e.NodeTree.Mode) + } +} diff --git a/gamesrv/slotspkg/slots/entity/reset.go b/gamesrv/slotspkg/slots/entity/reset.go new file mode 100644 index 0000000..a3dfa8c --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/reset.go @@ -0,0 +1,196 @@ +package entity + +import ( + "github.com/tomas-qstarrs/boost/randx" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" +) + +func (e *Entity) ResetFormations() { + for index, formationSeqDesc := range e.NodeDesc.FormationSeqsDesc { + e.CursorNode().Formations[index].ID = formationSeqDesc.ID + e.CursorNode().Formations[index].SeqID = formationSeqDesc.SeqID + } +} + +func (e *Entity) ResetBaseBet() { + if !e.CursorNode().NoBase { + if e.CursorNode().GetType() == key.BaseSpin { + e.CursorNode().BaseBet = e.ActBet() + } else { + e.CursorNode().BaseBet = e.ParentNode().BaseBet + } + } else { + if e.CursorNode().GetType() == key.FreeSpin && e.CursorNode().GetProgressValue() == 0 { + e.CursorNode().BaseBet = e.ActBet() + } + } +} + +func (e *Entity) ResetNextBaseBet() { + if !e.NextNode().NoBase { + if e.NextNode().GetType() == key.BaseSpin { + e.NextNode().BaseBet = e.ActBet() + } else { + e.NextNode().BaseBet = e.GetNode(e.NextNode().Parent).BaseBet + } + } else { + if e.NextNode().GetType() == key.FreeSpin && e.NextNode().GetProgressValue() == 0 { + e.NextNode().BaseBet = e.ActBet() + } + } +} + +// SelectNextClass gets map class for machine +func (e *Entity) SelectNextClass() { + //s := e.Session + //p := e.Player + + id := e.NodeTree.Act.ClassId + //logx.Error("================= SelectClass ==============", id) + + /////////////// + + rtpModes := e.NodeDesc.GetThemeRTPModes() + if r, ok := rtpModes[id]; ok { + var weight []int64 + var ids []int64 + for _, typeWeight := range r.TypeWeight { + ids = append(ids, typeWeight.ID) + weight = append(weight, typeWeight.Weight) + } + id3 := randx.RandWeight(e.Randx(), weight) + class := ids[id3] + e.NextNode().Class = class + } else if len(rtpModes) > 0 { + var weight []int64 + for _, typeWeight := range rtpModes[0].TypeWeight { + weight = append(weight, typeWeight.Weight) + } + e.NextNode().Class = rtpModes[0].TypeWeight[int64(randx.RandWeight(e.Randx(), weight))].ID + } else { + e.NextNode().Class = 0 + } +} + +// SelectClass gets map class for machine +func (e *Entity) SelectClass() { + //s := e.Session + //p := e.Player + + //todo + id := e.Randx().Int63n(3) + 1 + id = 2 + //logx.Error("================= SelectClass ==============", id) + + /////////////// + + rtpModes := e.NodeDesc.GetThemeRTPModes() + if r, ok := rtpModes[id]; ok { + var weight []int64 + var ids []int64 + for _, typeWeight := range r.TypeWeight { + ids = append(ids, typeWeight.ID) + weight = append(weight, typeWeight.Weight) + } + id3 := randx.RandWeight(e.Randx(), weight) + class := ids[id3] + e.CursorNode().Class = class + } else if len(rtpModes) > 0 { + var weight []int64 + for _, typeWeight := range rtpModes[0].TypeWeight { + weight = append(weight, typeWeight.Weight) + } + e.CursorNode().Class = rtpModes[0].TypeWeight[int64(randx.RandWeight(e.Randx(), weight))].ID + } else { + e.CursorNode().Class = 0 + } +} + +// ResetNextClass must be before origin formations +func (e *Entity) ResetNextClass() { + if e.NextNode().GetType() == key.BaseSpin && e.NodeTree.Act.PlayMode == key.PlayModeClass { + if !e.CheatNextClass() { + e.SelectNextClass() + } + } else { + e.NextNode().Class = e.ParentNode().Class + } + + e.NodeDesc.Class = e.NextNode().Class +} + +// ResetClass must be before origin formations +func (e *Entity) ResetClass() { + if e.CursorNode().GetType() == key.BaseSpin && e.NodeTree.Act.PlayMode == key.PlayModeClass { + if !e.CheatClass() { + e.SelectClass() + } + } else { + e.CursorNode().Class = e.ParentNode().Class + } + + e.NodeDesc.Class = e.CursorNode().Class +} + +func (e *Entity) ResetSingleBet() { + if !e.CursorNode().NoBase { + if e.CursorNode().ForceBet > 0 { + e.CursorNode().SingleBet = e.ParentNode().SingleBet * e.CursorNode().ForceBet / e.CursorNode().BaseBet + } else if e.CursorNode().Type == key.BaseSpin { + e.CursorNode().SingleBet = e.CursorNode().BaseBet / e.getLineCount() + } else { + e.CursorNode().SingleBet = e.ParentNode().SingleBet + } + } else { + if e.CursorNode().GetType() == key.FreeSpin && e.CursorNode().GetProgressValue() == 0 { + e.CursorNode().SingleBet = e.CursorNode().BaseBet / e.getLineCount() + } + } +} + +// ResetBet using in client display & big win +func (e *Entity) ResetBet() { + if e.CursorNode().Bet > 0 { + return + } + if !e.CursorNode().NoBase { + if e.CursorNode().ForceBet > 0 { + e.CursorNode().Bet = e.CursorNode().ForceBet + } else if e.CursorNode().Type == key.BaseSpin { + e.CursorNode().Bet = e.CursorNode().BaseBet + } else { + e.CursorNode().Bet = e.ParentNode().Bet + } + } else { + if e.CursorNode().GetType() == key.FreeSpin && e.CursorNode().GetProgressValue() == 0 { + e.CursorNode().Bet = e.CursorNode().BaseBet + } + } +} + +func (e *Entity) CheatClass() bool { + v, ok := e.Data[key.MachineClass] + if !ok { + return false + } + class := v.(int64) + if class == 0 { + return false + } + e.CursorNode().Class = class + delete(e.Data, key.MachineClass) + return true +} +func (e *Entity) CheatNextClass() bool { + v, ok := e.Data[key.MachineClass] + if !ok { + return false + } + class := v.(int64) + if class == 0 { + return false + } + e.NextNode().Class = class + delete(e.Data, key.MachineClass) + return true +} diff --git a/gamesrv/slotspkg/slots/entity/round.go b/gamesrv/slotspkg/slots/entity/round.go new file mode 100644 index 0000000..9b7c171 --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/round.go @@ -0,0 +1,18 @@ +package entity + +import ( + "github.com/spf13/cast" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" +) + +func (e *Entity) UpdateRound() { + if e.CursorNode().Type == key.BaseSpin { + e.NodeTree.Round++ + roundType := int64(0) + v, ok := e.Data[key.MachineRoundType] + if !ok { + roundType = cast.ToInt64(v) + } + e.NodeTree.RoundType = roundType + } +} diff --git a/gamesrv/slotspkg/slots/entity/serializer.go b/gamesrv/slotspkg/slots/entity/serializer.go new file mode 100644 index 0000000..d452879 --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/serializer.go @@ -0,0 +1,83 @@ +package entity + +import ( + "encoding/json" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/reg" + "reflect" +) + +// Deserialize deserializes `Data` into `NodeTree` +func (e *Entity) Deserialize() { + data := e.Player.GetTheme(e.Theme) + if data == nil { + panic(errors.LeakThemeData.ErrorWith(e.Theme)) + } + data.Get(e.NodeTree) + e.Customs = make(map[int64]interface{}) + for _, node := range e.NodeTree.Nodes { + for _, feature := range node.Features { + if v := e.deserializeCustom(feature); v != nil { + e.Customs[feature.ID] = v + } + } + } + for _, feature := range e.NodeTree.ImageFeatures { + if v := e.deserializeCustom(feature); v != nil { + e.Customs[feature.ID] = v + } + } +} + +// Serialize serializes `NodeTree` into `Data` +func (e *Entity) Serialize() { + for _, node := range e.NodeTree.Nodes { + for _, feature := range node.Features { + feature.Custom = e.serializeCustom(feature) + } + } + + for _, feature := range e.NodeTree.ImageFeatures { + feature.Custom = e.serializeCustom(feature) + } + + data := e.Player.GetTheme(e.Theme) + if data == nil { + panic(errors.LeakThemeData.ErrorWith(e.Theme)) + } + data.Set(e.NodeTree) +} + +func (e *Entity) deserializeCustom(feature *shared.Feature) interface{} { + if feature.Type == "" { + return nil + } + + t, ok := reg.Customs[feature.Type] + if !ok { + panic(errors.FeatureTypeNotFound.ErrorWith(feature.Type)) + } + v := reflect.New(t.Elem()).Interface() + + err := json.Unmarshal([]byte(feature.Custom), v) + if err != nil { + panic(err) + } + return v +} + +func (e *Entity) serializeCustom(feature *shared.Feature) string { + custom, ok := e.Customs[feature.ID] + if !ok { + panic(errors.CustomNotFound.ErrorWith(feature.ID)) + } + if custom == nil { + panic(errors.CustomNil.ErrorWith(feature.ID)) + } + data, err := json.Marshal(custom) + if err != nil { + panic(err) + } + return string(data) +} diff --git a/gamesrv/slotspkg/slots/entity/spin.go b/gamesrv/slotspkg/slots/entity/spin.go new file mode 100644 index 0000000..456b194 --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/spin.go @@ -0,0 +1,129 @@ +package entity + +// Init inits entity +func (e *Entity) Init() { + e.Deserialize() + + // In case of Revert, check empty every time when doing `Deserialize` + if e.IsEmpty() { + e.InitAct() + + e.InitRootNode() + + e.PrepareNodeDesc() + + e.MustNext() + + e.PrepareRand() + + e.PrepareNextNodeDesc() + + e.PrepareNextOriginFormations() + + e.InitNextFormations() + + e.InitNextFeatures() + + e.Callback.OnInit() + } +} + +// Step moves a step on node tree +func (e *Entity) Step() { + e.StepInitialize() + + e.MoveNext() + + e.PreProcessing() + + e.Spin() + + e.PostProcessing() + + e.MustNext() + + e.StepFinalize() +} + +// StepInitialize processes node tree before `MoveNext` +func (e *Entity) StepInitialize() { + e.PrepareStep() + e.PrepareRand() + e.PrepareNodeDesc() + e.ResetNextClass() + e.Callback.OnStepBegin() +} + +// PreProcessing prepocesses before `Spin` +func (e *Entity) PreProcessing() { + e.ResetNextBaseBet() + + e.ConsumeCoins() + + e.PrepareNodeDesc() + + e.ResetFormations() + + e.ResetBaseBet() + + //e.ResetClass() + + e.PrepareOriginFormations() + + e.PrepareCheatFormations() + + e.ResetSingleBet() + + e.ResetBet() + + e.ResetWin() + + e.Callback.BeforeSpin() +} + +// Spin reads configs and spins current node +func (e *Entity) Spin() { + e.UpdateRound() + + e.Rand() + + e.CheatFormations() + + e.Callback.BeforeDisplay() + + e.Display() + + e.Callback.AfterDisplay() + + e.Link() + + e.ConvertFormations() +} + +// PostProcessing post-processes after `Spin` +func (e *Entity) PostProcessing() { + e.Callback.AfterSpin() + + e.UpdateImageFormations() + + e.UpdateImageFeatures() + + e.UpdateWin() + + e.Progress() +} + +// StepFinalize processes node tree after `MustNext` +func (e *Entity) StepFinalize() { + e.PrepareNextNodeDesc() + + e.InitNextFormations() + + e.InitNextFeatures() + + e.Callback.OnStepEnd() + + e.ObtainCoins() + + e.SyncRand() +} diff --git a/gamesrv/slotspkg/slots/entity/win.go b/gamesrv/slotspkg/slots/entity/win.go new file mode 100644 index 0000000..5254acc --- /dev/null +++ b/gamesrv/slotspkg/slots/entity/win.go @@ -0,0 +1,326 @@ +package entity + +import ( + "github.com/tomas-qstarrs/boost/mathx" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/player" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" +) + +// ActBet calcs bet of act value +func (e *Entity) ActBet() int64 { + lineBet := e.GetLineBetByType(key.BaseSpin) + lineCount := e.GetLineCountByType(key.BaseSpin) + ratioType := e.NodeTree.Act.RatioType + ratio := e.NodeTree.Act.Ratio + if ratio == 0 { + ratio = 1 + } + switch ratioType { + case key.MachineRatioTypeNil: + return lineBet * lineCount + case key.MachineRatioMoreCoinMoreBet: + return int64(float64(lineBet*lineCount) * ratio) + case key.MachineRatioMoreCoinSameBet: + return lineBet * lineCount + case key.MachineRatioSameCoinMoreBet: + return int64(float64(lineBet*lineCount) * ratio) + default: + panic(errors.Errorf("unknown ratio type: %v", ratioType)) + } +} + +func (e *Entity) MinBet() int64 { + return e.GetMinLineBet(key.BaseSpin) * e.GetLineCountByType(key.BaseSpin) +} + +// ConsumeCoins consume coins when cursor node is base spin +func (e *Entity) ConsumeCoins() { + if e.CursorNode().GetType() != key.BaseSpin { + if !e.CursorNode().NoBase { + return + } + if e.CursorNode().GetType() == key.FreeSpin && e.CursorNode().GetProgressValue() != 0 { + return + } + } + cc := player.CoinCenter.Get(e.Session) + + lineBet := e.GetLineBetByType(key.BaseSpin) + lineCount := e.GetLineCountByType(key.BaseSpin) + + ratioType := e.NodeTree.Act.RatioType + ratio := e.NodeTree.Act.Ratio + if ratio == 0 { + ratio = 1 + } + var coin int64 + switch ratioType { + case key.MachineRatioTypeNil: + coin = lineBet * lineCount + case key.MachineRatioMoreCoinMoreBet: + coin = int64(float64(lineBet*lineCount) * ratio) + case key.MachineRatioMoreCoinSameBet: + coin = int64(float64(lineBet*lineCount) * ratio) + case key.MachineRatioSameCoinMoreBet: + coin = lineBet * lineCount + default: + panic(errors.Errorf("unknown ratio type: %v", ratioType)) + } + + betCoin := player.NewDecCoin(cc, coin) + e.SetBetCoin(betCoin) + + winCoin := betCoin.Rate(e.IsFree, 0) + e.SetWinCoin(winCoin) + + // Recorder 模式 + if e.NodeTree.Mode != key.MachineModeRecorder { + var roomType string + if e.IsFree { + roomType = key.RoomTypeFree + } else { + roomType = key.RoomTypePaid + } + game := &shared.Game{ + Contest: "Slots", + ContestType: e.Theme, + RoomID: int64(e.Session.UID()), + RoomType: roomType, + RoundID: e.NextNode().GetID(), + } + player.CoinCenter.Dec(e.Session, game, key.ReasonSlotsBet, betCoin) + + player.BetWin(e.Session, betCoin, player.IncCoin{}) + + e.Player.Agg.SlotsSpinTimes.Set(e.Player.Agg.SlotsSpinTimes.Get() + 1) + e.Player.Agg.SlotsBetCoin.Set(e.Player.Agg.SlotsBetCoin.Get() + betCoin.GetCoin()) + + e.Player.Agg.SlotsDailySpins.Set(e.Player.Agg.SlotsDailySpins.Get() + 1) + e.Player.Agg.SlotsDailyBet.Set(e.Player.Agg.SlotsDailyBet.Get() + betCoin.GetCoin()) + } +} + +// ObtainCoins obtains coins after next node is chosen +func (e *Entity) ObtainCoins() { + var closingBaseSpin = false + for _, closingNode := range e.ClosingNodes() { + if closingNode.Type == key.BaseSpin { + closingBaseSpin = true + break + } + } + if e.NextNode().GetType() != key.BaseSpin && !closingBaseSpin { + e.NodeTree.LastNodeSettled = false + } else { + rate := float64(e.TotalWin()) / float64(e.TotalBet()) + winCoin := e.GetBetCoin().Rate(e.IsFree, rate) + e.SetWinCoin(winCoin) + + // 非Recorder 模式 + if e.NodeTree.Mode != key.MachineModeRecorder { + var roomType string + if e.IsFree { + roomType = key.RoomTypeFree + } else { + roomType = key.RoomTypePaid + } + game := &shared.Game{ + Contest: "Slots", + ContestType: e.Theme, + RoomID: int64(e.Session.UID()), + RoomType: roomType, + RoundID: e.CursorNode().GetID(), + } + + player.CoinCenter.Inc(e.Session, game, key.ReasonSlotsWin, winCoin) + + player.BetWin(e.Session, player.DecCoin{}, winCoin) + + e.Player.Agg.SlotsWinCoin.Set(e.Player.Agg.SlotsWinCoin.Get() + winCoin.GetCoin()) + e.Player.Agg.SlotsDailyWin.Set(e.Player.Agg.SlotsDailyWin.Get() + winCoin.GetCoin()) + + if winCoin.GetCoin() == 0 { + e.Player.Agg.SlotsContinuousZeroSpins.Set(e.Player.Agg.SlotsContinuousZeroSpins.Get() + 1) + } else { + e.Player.Agg.SlotsContinuousZeroSpins.Set(0) + } + } + + e.NodeTree.LastNodeSettled = true + } +} + +// ResetWin resets win fields before each spin +func (e *Entity) ResetWin() { + for _, node := range e.NodeTree.Nodes { + for _, formation := range node.Formations { + formation.Win = 0 + } + for _, feature := range node.Features { + feature.Win = 0 + } + node.Win = 0 + node.ChildrenWin = 0 + } + if e.NodeTree.LastNodeSettled { + e.RootNode().ChildrenTotalWin = 0 + e.RootNode().TotalWin = 0 + } +} + +// UpdateWin updates all win info +// Win is win amount for this spin win +// EffectiveWin is win amount for lastest effective spin win +// TotalWin is the sum of current node win +// ChildrenWin is the sum of children node wins +func (e *Entity) UpdateWin() { + e.WalkTree(WalkRootLast, func(node *shared.Node) bool { + e.updateFormationWin(node) + e.updateFeatureWin(node) + e.updateNodeWin(node) + e.updateChildrenWin(node) + return false + }) +} + +func (e *Entity) updateFormationWin(node *shared.Node) { + for _, formation := range node.Formations { + if formation.Win > 0 { + formation.EffectiveWin = formation.Win + } + formation.TotalWin += formation.Win + } +} + +func (e *Entity) updateFeatureWin(node *shared.Node) { + for _, feature := range node.Features { + if feature.Win > 0 { + feature.EffectiveWin = feature.Win + } + feature.TotalWin += feature.Win + } +} + +func (e *Entity) updateNodeWin(node *shared.Node) { + for _, formation := range node.Formations { + node.Win += formation.Win + } + + for _, feature := range node.Features { + node.Win += feature.Win + } + + if node.Win > 0 { + node.EffectiveWin = node.Win + } + node.TotalWin += node.Win +} + +func (e *Entity) updateChildrenWin(node *shared.Node) { + for _, child := range node.Children { + childNode := e.GetNode(child) + node.ChildrenWin += (childNode.Win + childNode.ChildrenWin) + node.ChildrenTotalWin += (childNode.Win + childNode.ChildrenWin) + } +} + +func (e *Entity) Win() int64 { + return e.RootNode().Win + e.RootNode().ChildrenWin +} + +func (e *Entity) NodeTotalWin() int64 { + return e.CursorNode().TotalWin +} + +// TotalWin returns total win of this spin +func (e *Entity) TotalWin() int64 { + return e.RootNode().ChildrenTotalWin + e.RootNode().TotalWin +} + +func (e *Entity) ActualWin() int64 { + if e.NextNode().Type != key.BaseSpin { + return 0 + } + return e.TotalWin() +} + +func (e *Entity) ActualWinType() int64 { + if e.NextNode().Type != key.BaseSpin { + return key.WinTypeNil + } + + actualWin := e.TotalWin() + + multi := mathx.SafeDiv(actualWin, e.CursorNode().Bet) + + return e.CalcWinType(multi) +} + +func (e *Entity) CalcWinType(multi float64) int64 { + prizeModels := e.MachineDesc.GetPrizeModel() + + for winType, prizeModel := range prizeModels { + if (prizeModel.MinMultiple < 0 || multi >= float64(prizeModel.MinMultiple)) && + (prizeModel.MaxMultiple < 0 || multi < float64(prizeModel.MaxMultiple)) { + switch winType { + case 1: + return key.WinTypeBig + case 2: + return key.WinTypeMega + case 3: + return key.WinTypeEpic + } + } + } + if multi > 0 { + return key.WinTypeNormal + } + return key.WinTypeNil +} + +func (e *Entity) GetLineBetByType(nodeType string) int64 { + return e.MachineDesc.GetLineBet(e.NodeTree.Act.BetSizeIndex, e.NodeTree.Act.BetLevelIndex) +} + +func (e *Entity) GetMinLineBet(nodeType string) int64 { + return e.MachineDesc.GetLineBet(1, 1) +} + +func (e *Entity) SetBetCoin(betCoin player.DecCoin) { + e.NodeTree.BetCoin.Coin = betCoin.Coin +} + +func (e *Entity) GetBetCoin() player.DecCoin { + return player.DecCoin{ + Coin: e.NodeTree.BetCoin.Coin, + } +} + +func (e *Entity) SetWinCoin(winCoin player.IncCoin) { + e.NodeTree.WinCoin.Coin = winCoin.Coin +} + +func (e *Entity) GetWinCoin() player.IncCoin { + return player.IncCoin{ + Coin: e.NodeTree.WinCoin.Coin, + } +} + +func (e *Entity) TotalBet() int64 { + betCoin := e.NodeTree.BetCoin + return betCoin.Coin +} + +func (e *Entity) ActualBet() int64 { + if e.CursorNode().GetType() != key.BaseSpin { + if !e.CursorNode().NoBase { + return 0 + } + if e.CursorNode().GetType() == key.FreeSpin && e.CursorNode().GetProgressValue() != 1 { + return 0 + } + } + return e.TotalBet() +} diff --git a/gamesrv/slotspkg/slots/formation/coords.go b/gamesrv/slotspkg/slots/formation/coords.go new file mode 100644 index 0000000..40d5d71 --- /dev/null +++ b/gamesrv/slotspkg/slots/formation/coords.go @@ -0,0 +1,31 @@ +package formation + +// Coords is the coordinates version of pos +// Row & Col are from 0 +type Coords struct { + Row int64 // start from 0 + Col int64 // start from 0 +} + +// ToPos convert coordinates to int64 pos +func (c Coords) ToPos(form []int64) int64 { + var pos int64 = 0 + for i := int64(0); i < c.Col; i++ { + pos += form[i] + } + pos += c.Row + return pos +} + +// FromPos convert int64 pos to coordinates +func (c *Coords) FromPos(form []int64, pos int64) { + for i, l := range form { + if pos < l { + c.Col = int64(i) + c.Row = pos + break + } else { + pos -= l + } + } +} diff --git a/gamesrv/slotspkg/slots/formation/formation.go b/gamesrv/slotspkg/slots/formation/formation.go new file mode 100644 index 0000000..627732c --- /dev/null +++ b/gamesrv/slotspkg/slots/formation/formation.go @@ -0,0 +1,187 @@ +package formation + +import ( + "github.com/tomas-qstarrs/boost/randx" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" +) + +// Formation contains symbols, col count, row count, formation type +type Formation struct { + SeqID int64 + NodeType string + FormationDesc *desc.FormationDesc + Symbols []int64 + RandPositions []int64 + CheatSymbols []int64 + DisplaySymbols []int64 + LinkPositions [][]int64 + LineSymbols [][]int64 + LinePays []float64 + SymbolLinkPay map[int64]map[int64]float64 + Pay float64 + ReelForm []int64 + MatrixForm []int64 + RewardInfo []*shared.RewardInfo +} + +const ( + // LinesPay pays use lines config + LinesPay int64 = iota + // WaysPay pays use all possible ways + WaysPay + // FeaturePay pays use feature pay + FeaturePay + // SamePay pays use same pay + SamePay + // + MatchPay +) + +const ( + // LeftToRight links from left to right + LeftToRight = iota + // RightToLeft links from right to left + RightToLeft + // BothDirection gets max link of LeftToRight & RightToLeft + BothDirection +) + +// NewFormation creates new formation without generate symbols +func NewFormation(n *desc.NodeDesc, seqID int64) (*Formation, error) { + formationDesc, err := desc.NewFormationDesc(n, seqID) + if err != nil { + return nil, err + } + + reelForm := make([]int64, 0) + if formationDesc.ReelsDesc != nil { + for _, reelDesc := range formationDesc.ReelsDesc { + reelForm = append(reelForm, reelDesc.Range) + } + } + + matrixForm := make([]int64, 0) + if formationDesc.MatrixDesc != nil { + matrixForm = append(matrixForm, formationDesc.MatrixDesc.Form...) + } + + return &Formation{ + SeqID: seqID, + NodeType: n.NodeType, + FormationDesc: formationDesc, + Symbols: nil, + RandPositions: nil, + CheatSymbols: nil, + DisplaySymbols: nil, + LinkPositions: nil, + LineSymbols: nil, + LinePays: nil, + SymbolLinkPay: make(map[int64]map[int64]float64), + Pay: 0, + ReelForm: reelForm, + MatrixForm: matrixForm, + }, nil +} + +// Rand generates symbols by weight +func (f *Formation) Rand(r *randx.Randx) { + for _, reelDesc := range f.FormationDesc.ReelsDesc { + // 经测试:缓存权重 和 二分查找 对权重随机性能的提升微乎其微,没必要优化 + startIdx := int64(randx.RandWeight(r, reelDesc.Weights)) + f.RandPositions = append(f.RandPositions, startIdx) + length := int64(len(reelDesc.Reel)) + for symbolIdx := startIdx; symbolIdx < startIdx+reelDesc.Range; symbolIdx++ { + symbol := reelDesc.Reel[symbolIdx%length] + f.Symbols = append(f.Symbols, symbol) + } + } +} + +func (f *Formation) ResetRandSymbols(r *randx.Randx) { + f.RandPositions = nil + f.Symbols = nil + for _, reelDesc := range f.FormationDesc.ReelsDesc { + // 经测试:缓存权重 和 二分查找 对权重随机性能的提升微乎其微,没必要优化 + startIdx := int64(randx.RandWeight(r, reelDesc.Weights)) + f.RandPositions = append(f.RandPositions, startIdx) + length := int64(len(reelDesc.Reel)) + for symbolIdx := startIdx; symbolIdx < startIdx+reelDesc.Range; symbolIdx++ { + symbol := reelDesc.Reel[symbolIdx%length] + f.Symbols = append(f.Symbols, symbol) + } + } +} +func (f *Formation) ResetRandSymbolsByIndex(r *randx.Randx) { + f.RandPositions = nil + f.Symbols = nil + for _, reelDesc := range f.FormationDesc.ReelsDesc { + // 经测试:缓存权重 和 二分查找 对权重随机性能的提升微乎其微,没必要优化 + startIdx := int64(r.Intn(len(reelDesc.Weights))) + f.RandPositions = append(f.RandPositions, startIdx) + length := int64(len(reelDesc.Reel)) + for symbolIdx := startIdx; symbolIdx < startIdx+reelDesc.Range; symbolIdx++ { + symbol := reelDesc.Reel[symbolIdx%length] + f.Symbols = append(f.Symbols, symbol) + } + } +} + +// Display sets symbols for display +func (f *Formation) Display() { + f.DisplaySymbols = make([]int64, len(f.Symbols)) + copy(f.DisplaySymbols, f.Symbols) +} + +// Link links symbols with specific regular +func (f *Formation) Link() { + switch f.FormationDesc.MatrixDesc.LinkType { + case LinesPay: + f.GenerateSymbolLines() + case WaysPay: + f.GenerateSymbolWays() + case FeaturePay: + // do nothing + case SamePay: + f.GenerateSymbolSame() + case MatchPay: + f.GenerateSymbolMatch() + default: + panic(errors.Errorf("formation link type %d is not integrated yet", + f.FormationDesc.MatrixDesc.LinkType)) + } +} + +// Link links symbols with specific regular +func (f *Formation) LinkOnWin() { + switch f.FormationDesc.MatrixDesc.LinkType { + case LinesPay: + f.GenerateSymbolLinesOnWin() + case WaysPay: + f.GenerateSymbolWays() + case FeaturePay: + // do nothing + case SamePay: + f.GenerateSymbolSame() + case MatchPay: + f.GenerateSymbolMatch() + default: + panic(errors.Errorf("formation link type %d is not integrated yet", + f.FormationDesc.MatrixDesc.LinkType)) + } +} + +// Empty returns if the formation is empty +func (f *Formation) Empty() bool { + return f.FormationDesc.Empty +} + +func (f *Formation) addSymbolPay(symbol int64, link int64, pay float64) { + linkPay, ok := f.SymbolLinkPay[symbol] + if !ok { + linkPay = make(map[int64]float64) + f.SymbolLinkPay[symbol] = linkPay + } + linkPay[link] += pay / float64(f.FormationDesc.MatrixDesc.LineCount) +} diff --git a/gamesrv/slotspkg/slots/formation/helper.go b/gamesrv/slotspkg/slots/formation/helper.go new file mode 100644 index 0000000..172a5f3 --- /dev/null +++ b/gamesrv/slotspkg/slots/formation/helper.go @@ -0,0 +1,35 @@ +package formation + +// Cell returns one cell by row col index +// row is from 1, col is from 1 +// If idx is over range, auto fix with symbols of 0 +// compatible with reel's range is not equals to matrix's form +func Cell(row, col int64, symbols []int64, form []int64) int64 { + pos := Coords{row - 1, col - 1}.ToPos(form) + if pos >= int64(len(symbols)) { + return 0 + } + return symbols[pos] +} + +// FormatSymbols distribute symbols into form +func FormatSymbols(symbols []int64, form []int64) [][]int64 { + formattedSymbols := make([][]int64, 0) + for col, sz := range form { + colSymbols := make([]int64, 0) + for row := 0; row < int(sz); row++ { + colSymbols = append(colSymbols, Cell(int64(row)+1, int64(col)+1, symbols, form)) + } + formattedSymbols = append(formattedSymbols, colSymbols) + } + return formattedSymbols +} + +// DeformatSymbols puts symbols together +func DeformatSymbols(symbols [][]int64) []int64 { + deformattedSymbols := make([]int64, 0) + for _, colSymbols := range symbols { + deformattedSymbols = append(deformattedSymbols, colSymbols...) + } + return deformattedSymbols +} diff --git a/gamesrv/slotspkg/slots/formation/symbol_line.go b/gamesrv/slotspkg/slots/formation/symbol_line.go new file mode 100644 index 0000000..cc7cf58 --- /dev/null +++ b/gamesrv/slotspkg/slots/formation/symbol_line.go @@ -0,0 +1,441 @@ +package formation + +import ( + "github.com/tomas-qstarrs/boost/mathx" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" + "mongo.games.com/game/gamesrv/slotspkg/slots/types/cli" +) + +// Link is the link status for every line & every symbol +type Link struct { + Symbol int64 // Symbol that links + LinkStart int64 // Start from 0 + LinkCount int64 // Max link count + LinkEnd int64 // Start form 0 + Pay float64 // Pay of this link +} + +// SymbolLine is the symbols in one line +type SymbolLine struct { + LineId int + Line []int64 // A specific Line + Symbols []int64 // The symbols in line + SymbolsDesc desc.SymbolsDesc // Reference of SymbolsDesc + MatrixDesc desc.MatrixDesc // Reference of MatrixDesc + Link *Link // Max link result on current line + LinkPositions []int64 // The positions of max link result + LinkDirection int64 // Link direction for this symbols line + GroupSymbolsDesc map[int64][]*desc.SymbolDesc // Group Symbols desc +} + +// GenerateSymbolLines generates all symbol lines and sum pays and links +func (f *Formation) GenerateSymbolLines() { + f.LinkPositions = make([][]int64, 0, len(f.FormationDesc.MatrixDesc.Lines)) + f.LineSymbols = make([][]int64, 0, len(f.FormationDesc.MatrixDesc.Lines)) + f.LinePays = make([]float64, 0, len(f.FormationDesc.MatrixDesc.Lines)) + f.Pay = 0 + f.RewardInfo = nil + groupSymbolsDesc := f.calculateGroupSymbolsDesc() + for lineId, line := range f.FormationDesc.MatrixDesc.Lines { + symbols := make([]int64, 0, len(line)) + for index, row := range line { + symbols = append(symbols, Cell(row, int64(index)+1, f.Symbols, + f.FormationDesc.MatrixDesc.Form)) + } + linkDirections := f.generateLinkDirections(f.FormationDesc.MatrixDesc.Direction) + for _, linkDirection := range linkDirections { + symbolLine := NewSymbolLine( + lineId, + line, + symbols, + f.FormationDesc.SymbolsDesc, + f.FormationDesc.MatrixDesc, + groupSymbolsDesc, + linkDirection, + ) + symbolLine.SelectLink() + if symbolLine.Win() { + f.LinkPositions = append(f.LinkPositions, symbolLine.LinkPositions) + f.Pay += symbolLine.Link.Pay + f.LineSymbols = append(f.LineSymbols, symbolLine.Symbols) + f.LinePays = append(f.LinePays, symbolLine.Link.Pay) + f.addSymbolPay(symbolLine.Link.Symbol, symbolLine.Link.LinkCount, + symbolLine.Link.Pay) + //2024-5-21 add + f.RewardInfo = append(f.RewardInfo, &shared.RewardInfo{ + Type: 1, + Index: lineId, + Item: symbolLine.Link.Symbol, + Reward: symbolLine.Link.Pay, + Pos: cli.ToPoss(f.MatrixForm, symbolLine.LinkPositions), + }) + } + } + } +} + +// GenerateSymbolLines generates all symbol lines and sum pays and links +func (f *Formation) GenerateSymbolLinesOnWin() { + f.LinkPositions = make([][]int64, 0, len(f.FormationDesc.MatrixDesc.Lines)) + f.LineSymbols = make([][]int64, 0, len(f.FormationDesc.MatrixDesc.Lines)) + f.LinePays = make([]float64, 0, len(f.FormationDesc.MatrixDesc.Lines)) + f.RewardInfo = nil + groupSymbolsDesc := f.calculateGroupSymbolsDesc() + for lineId, line := range f.FormationDesc.MatrixDesc.Lines { + symbols := make([]int64, 0, len(line)) + for index, row := range line { + symbols = append(symbols, Cell(row, int64(index)+1, f.Symbols, + f.FormationDesc.MatrixDesc.Form)) + } + linkDirections := f.generateLinkDirections(f.FormationDesc.MatrixDesc.Direction) + for _, linkDirection := range linkDirections { + symbolLine := NewSymbolLine( + lineId, + line, + symbols, + f.FormationDesc.SymbolsDesc, + f.FormationDesc.MatrixDesc, + groupSymbolsDesc, + linkDirection, + ) + symbolLine.SelectLink() + if symbolLine.Win() { + f.LinkPositions = append(f.LinkPositions, symbolLine.LinkPositions) + f.Pay += symbolLine.Link.Pay + f.LineSymbols = append(f.LineSymbols, symbolLine.Symbols) + f.LinePays = append(f.LinePays, symbolLine.Link.Pay) + f.addSymbolPay(symbolLine.Link.Symbol, symbolLine.Link.LinkCount, + symbolLine.Link.Pay) + //2024-5-21 add + f.RewardInfo = append(f.RewardInfo, &shared.RewardInfo{ + Type: 1, + Index: lineId + 1, + Item: symbolLine.Link.Symbol, + Reward: symbolLine.Link.Pay, + Pos: cli.ToPoss(f.MatrixForm, symbolLine.LinkPositions), + }) + return + } + } + } +} + +// generateLinkDirections handle directions: LeftToRight, RightToLeft, BothDirection +func (f *Formation) generateLinkDirections(matrixDirection int64) []int64 { + var linkDirections []int64 + switch matrixDirection { + case LeftToRight: + linkDirections = []int64{LeftToRight} + case RightToLeft: + linkDirections = []int64{RightToLeft} + case BothDirection: + linkDirections = []int64{LeftToRight, RightToLeft} + default: + panic(errors.FormationDirectionNotSupport.ErrorWith(matrixDirection)) + } + return linkDirections +} + +func (f *Formation) calculateGroupSymbolsDesc() map[int64][]*desc.SymbolDesc { + var groupSymbolsDesc = make(map[int64][]*desc.SymbolDesc) + for _, desc := range f.FormationDesc.SymbolsDesc { + if len(desc.Group) <= 1 { + continue + } + for _, groupSymbol := range desc.Group { + groupSymbolsDesc[groupSymbol] = append(groupSymbolsDesc[groupSymbol], desc) + } + } + return groupSymbolsDesc +} + +// NewSymbolLine creates a new SymbolLine +func NewSymbolLine( + lineId int, + line []int64, + symbols []int64, + symbolsDesc desc.SymbolsDesc, + matrixDesc desc.MatrixDesc, + groupSymbolsDesc map[int64][]*desc.SymbolDesc, + direction int64, +) *SymbolLine { + return &SymbolLine{ + LineId: lineId, + Line: line, + Symbols: symbols, + SymbolsDesc: symbolsDesc, + MatrixDesc: matrixDesc, + Link: nil, + LinkPositions: nil, + GroupSymbolsDesc: groupSymbolsDesc, + LinkDirection: direction, + } +} + +// SelectLink calculates link result in link type. +func (s *SymbolLine) SelectLink() { + s.selectMaxLink(s.calculateLinks()) +} + +// Win returns if the symbol line wins +func (s *SymbolLine) Win() bool { + return s.Link != nil && s.Link.Pay > 0 +} + +func (s *SymbolLine) selectMaxLink(links []*Link) { + var maxPay float64 + var maxPayLinkCount int64 + for _, link := range links { + if maxPay < link.Pay { + maxPay = link.Pay + maxPayLinkCount = link.LinkCount + s.Link = link + } else if maxPay == link.Pay { + if maxPayLinkCount < link.LinkCount { + s.Link = link + } + } + } + if maxPay > 0 { + if s.Link.LinkEnd > s.Link.LinkStart { + s.LinkPositions = make([]int64, 0, s.Link.LinkEnd-s.Link.LinkStart+1) + for idx := s.Link.LinkStart; idx <= s.Link.LinkEnd; idx++ { + position := Coords{ + Row: s.Line[idx] - 1, + Col: idx, + }.ToPos(s.MatrixDesc.Form) + s.LinkPositions = append(s.LinkPositions, position) + } + } else { + s.LinkPositions = make([]int64, 0, s.Link.LinkStart-s.Link.LinkEnd+1) + for idx := s.Link.LinkStart; idx >= s.Link.LinkEnd; idx-- { + position := Coords{ + Row: s.Line[idx] - 1, + Col: idx, + }.ToPos(s.MatrixDesc.Form) + s.LinkPositions = append(s.LinkPositions, position) + } + } + } +} + +func (s *SymbolLine) pay(symbol, linkCount int64) float64 { + if linkCount == 0 { + return 0 + } + symbolDesc, ok := s.SymbolsDesc[symbol] + if !ok { + panic(errors.FormationSymbolNotFound.ErrorWith(symbol)) + } + if linkCount > int64(len(symbolDesc.PayRate)) { + panic(errors.FormationLinkPayIsNotFound.ErrorWith(linkCount)) + } + + return symbolDesc.Ratio(symbolDesc.PayRate[linkCount-1]) +} + +func (s *SymbolLine) getSymbolDesc(symbol int64) *desc.SymbolDesc { + symbolDesc, ok := s.SymbolsDesc[symbol] + if !ok { + panic(errors.FormationSymbolNotFound.ErrorWith(symbol)) + } + return symbolDesc +} + +func (s *SymbolLine) getGroupSymbolDesc(symbol int64) []*desc.SymbolDesc { + symbolDescs, ok := s.GroupSymbolsDesc[symbol] + if !ok { + return nil + } + return symbolDescs +} + +func (s *SymbolLine) calculateLinks() []*Link { + switch s.LinkDirection { + case LeftToRight: + return s.linkFromLeftToRight(s.replaceFromLeftToRight()) + case RightToLeft: + return s.linkFromRightToLeft(s.replaceFromRightToLeft()) + default: + panic(errors.FormationDirectionNotSupport.ErrorWith(s.LinkDirection)) + } +} + +func (s *SymbolLine) linkFromLeftToRight(symbolsList [][]int64) []*Link { + links := make([]*Link, 0, len(symbolsList)) + + for _, symbols := range symbolsList { + linkSymbol := symbols[0] + var linkCount int64 + for index := 0; index < len(symbols); index++ { + if linkSymbol == symbols[index] { + linkCount++ + } else { + break + } + } + + links = append(links, &Link{ + Symbol: linkSymbol, + LinkStart: 0, + LinkCount: linkCount, + LinkEnd: linkCount - 1, + Pay: s.pay(linkSymbol, linkCount), + }) + } + + return links +} + +func (s *SymbolLine) linkFromRightToLeft(symbolsList [][]int64) []*Link { + links := make([]*Link, 0, len(symbolsList)) + + for _, symbols := range symbolsList { + linkSymbol := symbols[len(symbols)-1] + var linkCount int64 + for index := len(symbols) - 1; index >= 0; index-- { + if linkSymbol == symbols[index] { + linkCount++ + } else { + break + } + } + + links = append(links, &Link{ + Symbol: linkSymbol, + LinkStart: int64(len(symbols)) - linkCount, + LinkCount: linkCount, + LinkEnd: int64(len(symbols)) - 1, + Pay: s.pay(linkSymbol, linkCount), + }) + } + + return links +} + +func (s *SymbolLine) replaceFromLeftToRight() [][]int64 { + symbolsList := make([][]int64, 0, 2) + + // Find link symbol + var linkSymbol int64 + for index := 0; index < len(s.Symbols); index++ { + symbol := s.Symbols[index] + symbolDesc := s.getSymbolDesc(symbol) + if !symbolDesc.IsWild { + linkSymbol = symbolDesc.Group[0] + break + } + } + if linkSymbol == 0 { + linkSymbol = s.Symbols[0] + } + if linkSymbol == 0 { + panic(errors.FormationSymbolNotFound.ErrorWith(linkSymbol)) + } + + // Replace wild as link symbol + symbols := make([]int64, len(s.Symbols)) + copy(symbols, s.Symbols) + for index := 0; index < len(symbols); index++ { + symbol := symbols[index] + symbolDesc := s.getSymbolDesc(symbol) + if symbolDesc.IsWild { + symbolDesc = s.getSymbolDesc(linkSymbol) + } + symbols[index] = symbolDesc.Group[0] + } + symbolsList = append(symbolsList, symbols) + + // If line can link as group + groupSymbolDescs := s.getGroupSymbolDesc(linkSymbol) + for _, groupSymbolDesc := range groupSymbolDescs { + groupSymbols := make([]int64, len(symbols)) + copy(groupSymbols, symbols) + for index := 0; index < len(groupSymbols); index++ { + symbol := symbols[index] + symbolDesc := s.getSymbolDesc(symbol) + if s.groupEqual(symbolDesc, groupSymbolDesc) { + groupSymbols[index] = groupSymbolDesc.ID + } + } + symbolsList = append(symbolsList, groupSymbols) + } + + // If line starts from wild, try linking as wild + firstSymbol := s.Symbols[0] + firstSymbolDesc := s.getSymbolDesc(firstSymbol) + if firstSymbolDesc.IsWild { + wildSymbols := make([]int64, len(s.Symbols)) + copy(wildSymbols, s.Symbols) + for index := 0; index < len(wildSymbols); index++ { + symbol := wildSymbols[index] + symbolDesc := s.getSymbolDesc(symbol) + wildSymbols[index] = symbolDesc.Group[0] + } + symbolsList = append(symbolsList, wildSymbols) + } + + return symbolsList +} + +func (s *SymbolLine) replaceFromRightToLeft() [][]int64 { + symbolsList := make([][]int64, 0) + + // Find link symbol + var linkSymbol int64 + for index := len(s.Symbols) - 1; index >= 0; index-- { + symbol := s.Symbols[index] + symbolDesc := s.getSymbolDesc(symbol) + if !symbolDesc.IsWild { + linkSymbol = symbolDesc.Group[0] + break + } + } + if linkSymbol == 0 { + linkSymbol = s.Symbols[len(s.Symbols)-1] + } + if linkSymbol == 0 { + panic(errors.FormationSymbolNotFound.ErrorWith(linkSymbol)) + } + + // Replace wild as link symbol + symbols := make([]int64, len(s.Symbols)) + copy(symbols, s.Symbols) + for index := len(s.Symbols) - 1; index >= 0; index-- { + symbol := symbols[index] + symbolDesc := s.getSymbolDesc(symbol) + if symbolDesc.IsWild { + symbolDesc = s.getSymbolDesc(linkSymbol) + } + symbols[index] = symbolDesc.Group[0] + } + symbolsList = append(symbolsList, symbols) + + // If line starts from wild, try linking as wild + firstSymbol := s.Symbols[len(s.Symbols)-1] + firstSymbolDesc := s.getSymbolDesc(firstSymbol) + if firstSymbolDesc.IsWild { + symbols := make([]int64, len(s.Symbols)) + copy(symbols, s.Symbols) + for index := len(s.Symbols) - 1; index >= 0; index-- { + symbol := symbols[index] + symbolDesc := s.getSymbolDesc(symbol) + symbols[index] = symbolDesc.Group[0] + } + symbolsList = append(symbolsList, symbols) + } + + return symbolsList +} + +func (s *SymbolLine) groupEqual(hostDesc *desc.SymbolDesc, + guestDesc *desc.SymbolDesc) bool { + for _, hostSymbol := range hostDesc.Group { + if mathx.In(hostSymbol, guestDesc.Group) { + return true + } + } + return false +} diff --git a/gamesrv/slotspkg/slots/formation/symbol_match.go b/gamesrv/slotspkg/slots/formation/symbol_match.go new file mode 100644 index 0000000..1ecd303 --- /dev/null +++ b/gamesrv/slotspkg/slots/formation/symbol_match.go @@ -0,0 +1,215 @@ +package formation + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" +) + +type SymbolMatch struct { + Symbol int64 + Symbols []int64 + SymbolsDesc desc.SymbolsDesc + MatrixDesc desc.MatrixDesc + LinkCount int64 + Pay int64 + LinkPositions []int64 +} + +func (f *Formation) GetReelFormattedSymbols() [][]int64 { + return FormatSymbols(f.Symbols, f.ReelForm) +} + +func (f *Formation) searchSymbols(i int64, j int64, itemID int64, symbols [][]int64, rowSize int64, colSize int64) { + if i < 0 || i >= colSize || j < 0 || j >= rowSize { + return + } + + if symbols[i][j] == 0 || symbols[i][j] == 100 || symbols[i][j] == 101 || symbols[i][j] >= 1000 { + return + } + + if symbols[i][j] != itemID { + if f.IsWild(symbols[i][j]) { + + } else { + return + } + } + + if f.IsWild(symbols[i][j]) { + symbols[i][j] = 101 + } else { + symbols[i][j] = 100 + } + + f.searchSymbols(i-1, j, itemID, symbols, rowSize, colSize) + f.searchSymbols(i+1, j, itemID, symbols, rowSize, colSize) + f.searchSymbols(i, j-1, itemID, symbols, rowSize, colSize) + f.searchSymbols(i, j+1, itemID, symbols, rowSize, colSize) +} + +func getSymbolMatch(symbols [][]int64, rowSize int64, colSize int64) int64 { + n := int64(0) + for i := int64(0); i < colSize; i++ { + for j := int64(0); j < rowSize; j++ { + if symbols[i][j] == 100 || symbols[i][j] == 101 { + n++ + } + } + } + return n +} + +func symbolRevert(itemID int64, symbols [][]int64, rowSize int64, colSize int64, rawSymbols [][]int64) { + for i := int64(0); i < colSize; i++ { + for j := int64(0); j < rowSize; j++ { + if symbols[i][j] == 100 { + symbols[i][j] = itemID + } + if symbols[i][j] == 101 { + symbols[i][j] = rawSymbols[i][j] + } + } + } +} + +func symbolUpgrade(itemID int64, symbols [][]int64, rowSize int64, colSize int64, rawSymbols [][]int64) { + for i := int64(0); i < colSize; i++ { + for j := int64(0); j < rowSize; j++ { + if symbols[i][j] == 100 { + symbols[i][j] = 1000 + itemID + } + } + } +} + +func calcWin(f *Formation, itemID int64, symbols [][]int64, records [][]int64, rowSize int64, colSize int64, count int64) { + positions := make([]int64, 0) + + for i := int64(0); i < colSize; i++ { + for j := int64(0); j < rowSize; j++ { + if symbols[i][j] == 1000+itemID && records[i][j] == 0 { + positions = append(positions, i*rowSize+j) + records[i][j] = 1 + } + if symbols[i][j] == 101 { + positions = append(positions, i*rowSize+j) + } + } + } + + winPay := float64(f.FormationDesc.SymbolsDesc[itemID].PayRate[count-1]) + + f.LinkPositions = append(f.LinkPositions, positions) + f.Pay += winPay + f.LinePays = append(f.LinePays, winPay) + link := int64(len(positions)) + f.addSymbolPay(itemID, link, winPay) +} + +func (f *Formation) IsWild(itemID int64) bool { + linkSymbolDesc := f.getSymbolDesc(itemID) + return linkSymbolDesc.IsWild +} + +func (f *Formation) IsZeroPay(itemID int64) bool { + linkSymbolDesc := f.getSymbolDesc(itemID) + pay := int64(0) + for _, p := range linkSymbolDesc.PayRate { + pay += p + } + return pay == 0 +} + +func (f *Formation) getSymbolDesc(symbol int64) *desc.SymbolDesc { + s := f.FormationDesc + symbolDesc, ok := s.SymbolsDesc[symbol] + if !ok { + panic(errors.FormationSymbolNotFound.ErrorWith(symbol)) + } + return symbolDesc +} + +func (f *Formation) GenerateSymbolMatch() { + // 仅支持矩形formation + rowSize := int64(f.ReelForm[0]) + colSize := int64(len(f.ReelForm)) + symbols := f.GetReelFormattedSymbols() + rawSymbols := f.GetReelFormattedSymbols() + records := make([][]int64, 0) + for i := int64(0); i < colSize; i++ { + records = append(records, make([]int64, rowSize)) + } + + for i := int64(0); i < colSize; i++ { + for j := int64(0); j < rowSize; j++ { + if symbols[i][j] == 0 { + continue + } + + itemID := symbols[i][j] + if itemID > 1000 || f.IsWild(itemID) || f.IsZeroPay(itemID) { + continue + } + + // 从位置 ij 开始搜索标记相邻的相同元素 + f.searchSymbols(i, j, itemID, symbols, rowSize, colSize) + count := getSymbolMatch(symbols, rowSize, colSize) + + if count >= 5 { + // 存在5个相同元素 + symbolUpgrade(itemID, symbols, rowSize, colSize, rawSymbols) + calcWin(f, itemID, symbols, records, rowSize, colSize, count) + symbolRevert(itemID, symbols, rowSize, colSize, rawSymbols) + f.Symbols = DeformatSymbols(symbols) + } else { + // 不存在5个相同元素,恢复原始轴 + symbolRevert(itemID, symbols, rowSize, colSize, rawSymbols) + } + } + } +} + +func NewSymbolMatch(symbol int64, + symbols []int64, + symbolsDesc desc.SymbolsDesc, + matrixDesc desc.MatrixDesc, +) *SymbolMatch { + return &SymbolMatch{ + Symbol: symbol, + Symbols: symbols, + SymbolsDesc: symbolsDesc, + MatrixDesc: matrixDesc, + LinkCount: 0, + Pay: 0, + LinkPositions: make([]int64, 0), + } +} + +func (s *SymbolMatch) Win() bool { + return s.Pay > 0 +} + +func (s *SymbolMatch) pay() int64 { + linkCount := s.LinkCount + symbol := s.Symbol + if linkCount == 0 { + return 0 + } + symbolDesc, ok := s.SymbolsDesc[s.Symbol] + if !ok { + panic(errors.FormationSymbolNotFound.ErrorWith(symbol)) + } + if linkCount > int64(len(symbolDesc.PayRate)) { + panic(errors.FormationLinkPayIsNotFound.ErrorWith(linkCount)) + } + return symbolDesc.PayRate[linkCount-1] +} + +func (s *SymbolMatch) getSymbolDesc(symbol int64) *desc.SymbolDesc { + symbolDesc, ok := s.SymbolsDesc[symbol] + if !ok { + panic(errors.FormationSymbolNotFound.ErrorWith(symbol)) + } + return symbolDesc +} diff --git a/gamesrv/slotspkg/slots/formation/symbol_same.go b/gamesrv/slotspkg/slots/formation/symbol_same.go new file mode 100644 index 0000000..dad5320 --- /dev/null +++ b/gamesrv/slotspkg/slots/formation/symbol_same.go @@ -0,0 +1,146 @@ +package formation + +import ( + "github.com/tomas-qstarrs/boost/mathx" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" +) + +type SymbolSame struct { + Symbol int64 + Symbols []int64 + SymbolsDesc desc.SymbolsDesc + MatrixDesc desc.MatrixDesc + LinkCount int64 + Pay float64 + LinkPositions []int64 +} + +func (f *Formation) GenerateSymbolSame() { + for _, symbolDesc := range f.FormationDesc.SymbolsDesc { + symbolSame := NewSymbolSame( + symbolDesc.ID, + f.Symbols, + f.FormationDesc.SymbolsDesc, + f.FormationDesc.MatrixDesc, + ) + symbolSame.SelectLink() + if symbolSame.Win() { + f.LinkPositions = append(f.LinkPositions, symbolSame.LinkPositions) + f.Pay += float64(symbolSame.Pay) + f.LinePays = append(f.LinePays, float64(symbolSame.Pay)) + f.addSymbolPay(symbolSame.Symbol, symbolSame.LinkCount, float64(symbolSame.Pay)) + } + } +} + +func NewSymbolSame(symbol int64, + symbols []int64, + symbolsDesc desc.SymbolsDesc, + matrixDesc desc.MatrixDesc, +) *SymbolSame { + return &SymbolSame{ + Symbol: symbol, + Symbols: symbols, + SymbolsDesc: symbolsDesc, + MatrixDesc: matrixDesc, + LinkCount: 0, + Pay: 0, + LinkPositions: make([]int64, 0), + } +} + +func (s *SymbolSame) SelectLink() { + s.calculateLinks() +} + +func (s *SymbolSame) Win() bool { + return s.Pay > 0 +} + +func (s *SymbolSame) pay() float64 { + linkCount := s.LinkCount + symbol := s.Symbol + if linkCount == 0 { + return 0 + } + symbolDesc, ok := s.SymbolsDesc[s.Symbol] + if !ok { + panic(errors.FormationSymbolNotFound.ErrorWith(symbol)) + } + if linkCount > int64(len(symbolDesc.PayRate)) { + panic(errors.FormationLinkPayIsNotFound.ErrorWith(linkCount)) + } + return symbolDesc.Ratio(symbolDesc.PayRate[linkCount-1]) +} + +func (s *SymbolSame) getSymbolDesc(symbol int64) *desc.SymbolDesc { + symbolDesc, ok := s.SymbolsDesc[symbol] + if !ok { + panic(errors.FormationSymbolNotFound.ErrorWith(symbol)) + } + return symbolDesc +} + +func (s *SymbolSame) calculateLinks() { + s.calculatePay(s.selectPositions()) +} + +func (s *SymbolSame) calculatePay(positions []int64, allPositions []int64) { + if len(positions) == 0 { + s.LinkPositions = nil + s.LinkCount = 0 + s.Pay = 0 + return + } + s.LinkPositions = allPositions + s.LinkCount = int64(len(allPositions)) + s.Pay = s.pay() +} + +func (s *SymbolSame) selectPositions() ([]int64, []int64) { + linkSymbol := s.Symbol + linkSymbolDesc := s.getSymbolDesc(linkSymbol) + if linkSymbolDesc.IsWild { + return s.selectWildPositions() + } + + return s.selectNormalPositions() +} + +func (s *SymbolSame) selectNormalPositions() ([]int64, []int64) { + linkSymbolDesc := s.getSymbolDesc(s.Symbol) + positions := make([]int64, 0, len(s.Symbols)) + allPositions := make([]int64, 0, len(s.Symbols)) + for index, symbol := range s.Symbols { + symbolDesc := s.getSymbolDesc(symbol) + if symbolDesc.IsWild { + allPositions = append(allPositions, int64(index)) + } else if s.groupEqual(linkSymbolDesc, symbolDesc) { + positions = append(positions, int64(index)) + allPositions = append(allPositions, int64(index)) + } + } + return positions, allPositions +} + +func (s *SymbolSame) selectWildPositions() ([]int64, []int64) { + positions := make([]int64, 0, len(s.Symbols)) + for index, symbol := range s.Symbols { + symbolDesc := s.getSymbolDesc(symbol) + if symbolDesc.IsWild { + positions = append(positions, int64(index)) + } + } + return positions, positions +} + +func (s *SymbolSame) groupEqual(hostDesc *desc.SymbolDesc, + guestDesc *desc.SymbolDesc) bool { + for _, hostSymbol := range hostDesc.Group { + if mathx.In(hostSymbol, guestDesc.Group) { + return true + } + } + return false +} diff --git a/gamesrv/slotspkg/slots/formation/symbol_way.go b/gamesrv/slotspkg/slots/formation/symbol_way.go new file mode 100644 index 0000000..f9b43c0 --- /dev/null +++ b/gamesrv/slotspkg/slots/formation/symbol_way.go @@ -0,0 +1,250 @@ +package formation + +import ( + "github.com/tomas-qstarrs/boost/mathx" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" +) + +// SymbolWay is the symbols of same symbol id +type SymbolWay struct { + Symbol int64 // The symbol to be matched + Symbols []int64 // The result symbols of rand + SymbolsDesc desc.SymbolsDesc // Reference of SymbolsDesc + MatrixDesc desc.MatrixDesc // Reference of MatrixDesc + LinkCount int64 // Link count of same symbol + Pay float64 // Pay of this symbol way + LinkPositions []int64 // Link result + LinkDirection int64 // Link direction for this Symbol way +} + +// GenerateSymbolWays genertates all symbols ways and sum pays and links +func (f *Formation) GenerateSymbolWays() { + for _, symbolDesc := range f.FormationDesc.SymbolsDesc { + linkDirections := f.generateLinkDirections(f.FormationDesc.MatrixDesc.Direction) + for _, linkDirection := range linkDirections { + symbolway := NewSymbolWay( + symbolDesc.ID, + f.Symbols, + f.FormationDesc.SymbolsDesc, + f.FormationDesc.MatrixDesc, + linkDirection, + ) + symbolway.SelectLink() + if symbolway.Win() { + f.LinkPositions = append(f.LinkPositions, symbolway.LinkPositions) + f.Pay += float64(symbolway.Pay) + f.LinePays = append(f.LinePays, float64(symbolway.Pay)) + f.addSymbolPay(symbolway.Symbol, symbolway.LinkCount, float64(symbolway.Pay)) + } + } + } +} + +// NewSymbolWay creates a new SymbolLine +func NewSymbolWay(symbol int64, + symbols []int64, + symbolsDesc desc.SymbolsDesc, + matrixDesc desc.MatrixDesc, + linkDirection int64, +) *SymbolWay { + return &SymbolWay{ + Symbol: symbol, + Symbols: symbols, + SymbolsDesc: symbolsDesc, + MatrixDesc: matrixDesc, + LinkCount: 0, + Pay: 0, + LinkPositions: make([]int64, 0), + LinkDirection: linkDirection, + } +} + +// SelectLink calculates the smallest symbols with the most links +func (s *SymbolWay) SelectLink() { + s.calculateLinks() +} + +// Win returns if the symbol way wins +func (s *SymbolWay) Win() bool { + return s.Pay > 0 +} + +func (s *SymbolWay) pay(colCounts []int64) (float64, int64) { + if colCounts[0] == 0 { + return 0, 0 + } + symbolDesc, ok := s.SymbolsDesc[s.Symbol] + if !ok { + panic(errors.Errorf("Symbol %d not found", s.Symbol)) + } + var linkCount int64 = 0 + var times int64 = 1 + for _, count := range colCounts { + if count == 0 { + break + } + times *= count + linkCount++ + } + if linkCount > int64(len(symbolDesc.PayRate)) { + panic(errors.Errorf("link %d pay is not found", linkCount)) + } + return symbolDesc.Ratio(times * symbolDesc.PayRate[linkCount-1]), linkCount +} + +func (s *SymbolWay) getSymbolDesc(symbol int64) *desc.SymbolDesc { + symbolDesc, ok := s.SymbolsDesc[symbol] + if !ok { + panic(errors.FormationSymbolNotFound.ErrorWith(symbol)) + } + return symbolDesc +} + +func (s *SymbolWay) calculateLinks() { + switch s.LinkDirection { + case LeftToRight: + s.calculatePayFromLeftToRight(s.selectPositions()) + case RightToLeft: + s.calculatePayFromRightToLeft(s.selectPositions()) + default: + panic(errors.FormationDirectionNotSupport.ErrorWith(s.LinkDirection)) + } +} + +func (s *SymbolWay) selectPositions() ([]int64, []int64) { + linkSymbol := s.Symbol + linkSymbolDesc := s.getSymbolDesc(linkSymbol) + if linkSymbolDesc.IsWild { + return s.selectWildPositions() + } + + return s.selectNormalPositions() +} + +func (s *SymbolWay) selectNormalPositions() ([]int64, []int64) { + linkSymbolDesc := s.getSymbolDesc(s.Symbol) + positions := make([]int64, 0, len(s.Symbols)) + allPositions := make([]int64, 0, len(s.Symbols)) + for index, symbol := range s.Symbols { + symbolDesc := s.getSymbolDesc(symbol) + if symbolDesc.IsWild { + allPositions = append(allPositions, int64(index)) + } else if s.groupEqual(linkSymbolDesc, symbolDesc) { + positions = append(positions, int64(index)) + allPositions = append(allPositions, int64(index)) + } + } + return positions, allPositions +} + +func (s *SymbolWay) selectWildPositions() ([]int64, []int64) { + positions := make([]int64, 0, len(s.Symbols)) + for index, symbol := range s.Symbols { + symbolDesc := s.getSymbolDesc(symbol) + if symbolDesc.IsWild { + positions = append(positions, int64(index)) + } + } + return positions, positions +} + +func (s *SymbolWay) calculatePayFromLeftToRight(positions []int64, allPositions []int64) { + colCounts := make([]int64, len(s.MatrixDesc.Form)) + end := int64(0) + for index := 0; index < len(allPositions); index++ { + position := allPositions[index] + coords := &Coords{} + coords.FromPos(s.MatrixDesc.Form, position) + switch { + case coords.Col == end: + colCounts[coords.Col]++ + s.LinkPositions = append(s.LinkPositions, position) + end++ + case coords.Col < end: + colCounts[coords.Col]++ + s.LinkPositions = append(s.LinkPositions, position) + case coords.Col > end: + break + } + } + + s.Pay, s.LinkCount = s.pay(colCounts) + + var hasSymbol bool + for index := 0; index < len(positions); index++ { + position := positions[index] + coords := &Coords{} + coords.FromPos(s.MatrixDesc.Form, position) + if coords.Col < s.LinkCount { + hasSymbol = true + break + } + } + + if !hasSymbol { + s.LinkPositions = nil + s.Pay = 0 + s.LinkCount = 0 + } +} + +func (s *SymbolWay) calculatePayFromRightToLeft(positions []int64, allPositions []int64) { + colCounts := make([]int64, len(s.MatrixDesc.Form)) + var end = int64(len(allPositions) - 1) + for index := len(allPositions) - 1; index >= 0; index-- { + position := allPositions[index] + coords := &Coords{} + coords.FromPos(s.MatrixDesc.Form, position) + switch { + case coords.Col == end: + colCounts[coords.Col]++ + s.LinkPositions = append(s.LinkPositions, position) + end-- + case coords.Col < end: + colCounts[coords.Col]++ + s.LinkPositions = append(s.LinkPositions, position) + case coords.Col > end: + break + } + } + + s.Pay, s.LinkCount = s.pay(colCounts) + + colCounts = make([]int64, len(s.MatrixDesc.Form)) + end = int64(len(positions) - 1) + for index := len(positions) - 1; index >= 0; index-- { + position := positions[index] + coords := &Coords{} + coords.FromPos(s.MatrixDesc.Form, position) + switch { + case coords.Col == end: + colCounts[coords.Col]++ + end-- + case coords.Col < end: + colCounts[coords.Col]++ + case coords.Col > end: + break + } + } + + sumColCount := int64(0) + for index := 0; index < int(s.LinkCount); index++ { + sumColCount += colCounts[index] + } + if sumColCount == 0 { + s.LinkPositions = nil + s.Pay = 0 + s.LinkCount = 0 + } +} + +func (s *SymbolWay) groupEqual(hostDesc *desc.SymbolDesc, + guestDesc *desc.SymbolDesc) bool { + for _, hostSymbol := range hostDesc.Group { + if mathx.In(hostSymbol, guestDesc.Group) { + return true + } + } + return false +} diff --git a/gamesrv/slotspkg/slots/handler.go b/gamesrv/slotspkg/slots/handler.go new file mode 100644 index 0000000..2c24ee9 --- /dev/null +++ b/gamesrv/slotspkg/slots/handler.go @@ -0,0 +1,129 @@ +package slots + +import ( + "github.com/idealeak/goserver/core/logger" + _struct "mongo.games.com/game/gamesrv/slotspkg/internal/dao/struct" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/global" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/player" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/session" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/machine" + "mongo.games.com/game/gamesrv/slotspkg/slots/types/cli" +) + +func (sm *SlotsMgr) Enter(s *session.Session, gameId int64) (*cli.SlotsEnterResponse, error) { + theme := key.GameMap[uint(gameId)] + + m := machine.NewMachine(s, theme, DataSet(s).Shell, false) + if m == nil { + logger.Logger.Error("[slotsMgr.enter] module is nil") + return nil, errors.New("module is nil") + } + defer func() { + if m.Next().GetType() == key.BaseSpin { + DataSet(s).Update() + } + }() + Response := &cli.SlotsEnterResponse{ + Code: errors.Nil.Code(), + NodeTree: m.PlayLiteClose(), + Coin: player.CoinCenter.Get(s).GetCoin(), + BetSizeIndex: m.BetSizeIndex(), + BetLevelIndex: m.BetLevelIndex(), + BetLineIndex: m.BetLineIndex(), + BetSizes: m.BetSizes(), + BetLevels: m.BetLevels(), + BetLines: m.BetLines(), + BetChangeList: m.BetChangeList(), + } + return Response, nil +} + +func (sm *SlotsMgr) Play(uid uint64, req *_struct.SpinReq) (*cli.SlotsPlayResponse, error) { + s := sm.GetSession(uid) + if s == nil { + logger.Logger.Error("[slotsMgr.play] session is nil") + return nil, errors.New("session is nil") + } + + if req.BetSizeIndex < 0 { + logger.Logger.Error("[slotsMgr.play] msg.BetSizeIndex < 0") + return nil, errors.New("msg.BetSizeIndex < 0") + } + + if req.BetLevelIndex < 0 { + logger.Logger.Error("[slotsMgr.play] msg.BetLevelIndex < 0") + return nil, errors.New("msg.BetLevelIndex < 0") + } + theme := key.GameMap[uint(req.GameId)] + m := machine.NewMachine(s, theme, DataSet(s).Shell, false) + if m == nil { + logger.Logger.Error("[slotsMgr.play] module is nil") + return nil, errors.New("module is nil") + } + + defer func() { + if m.Next().GetType() == key.BaseSpin { + DataSet(s).Update() + } + }() + + var recorderResult = &shared.RecorderResult{} + if m.Next().GetType() == key.BaseSpin { + recorderResult = NewPlayAsRecorder(s) + m.Play(&shared.Act{ + BetSizeIndex: req.BetSizeIndex, + BetLevelIndex: req.BetLevelIndex, + BetLineIndex: req.BetLineIndex, + Ratio: 1, + Mode: key.MachineModePlayer, + Vector: recorderResult.Vector, + //ExpectedWinCoin: recorderResult.ExpectedWinCoin, + Choice: req.BetMode, + PlayMode: recorderResult.PlayMode, + }) + } else { + m.Play(&shared.Act{ + BetSizeIndex: req.BetSizeIndex, + BetLevelIndex: req.BetLevelIndex, + BetLineIndex: req.BetLineIndex, + Ratio: 1, + Mode: key.MachineModePlayer, + Choice: req.BetMode, + }) + } + res := &cli.SlotsPlayResponse{ + Code: errors.Nil.Code(), + NodeTree: m.PlayLiteClose(), + ActualBet: m.ActualBet(), + ActualWin: m.ActualWin(), + Coin: player.CoinCenter.Get(s).GetCoin(), + IsEnd: m.Next().GetType() == key.BaseSpin, + } + //if !global.Mock { + // defer player.PushPlayer(s) + //} + return res, nil +} +func (*SlotsMgr) Leave(s *session.Session) (*cli.SlotsLeaveResponse, error) { + + m := machine.NewMachine(s, "s.Theme", DataSet(s).Shell, false) + + defer func() { + if m.Next().GetType() == key.BaseSpin { + DataSet(s).Update() + } + }() + + m.QuitLiteClose() + Response := &cli.SlotsLeaveResponse{ + Code: errors.Nil.Code(), + Coin: player.CoinCenter.Get(s).GetCoin(), + } + if !global.Mock { + defer player.PushPlayer(s) + } + return Response, nil +} diff --git a/gamesrv/slotspkg/slots/intf/callback.go b/gamesrv/slotspkg/slots/intf/callback.go new file mode 100644 index 0000000..b249f62 --- /dev/null +++ b/gamesrv/slotspkg/slots/intf/callback.go @@ -0,0 +1,13 @@ +package intf + +// Callback is the interface to insert procedure to entity +type Callback interface { + OnInit() + OnStepBegin() + BeforeSpin() + BeforeDisplay() + AfterDisplay() + AfterSpin() + OnStepEnd() + OnStay() +} diff --git a/gamesrv/slotspkg/slots/intf/feature.go b/gamesrv/slotspkg/slots/intf/feature.go new file mode 100644 index 0000000..8df2ae5 --- /dev/null +++ b/gamesrv/slotspkg/slots/intf/feature.go @@ -0,0 +1,16 @@ +package intf + +// Feature is the interface for operating shared.Feature +type Feature interface { + GetID() int64 + GetWin() int64 + SetWin(win int64) Feature + GetSeqID() int64 + SetSeqID(seqID int64) Feature + GetLifetime() int64 + SetLifetime(lifetime int64) Feature + GetVisiable() bool + SetVisiable(visiable bool) Feature + GetImageable() bool + SetImageable(imageable bool) Feature +} diff --git a/gamesrv/slotspkg/slots/intf/formation.go b/gamesrv/slotspkg/slots/intf/formation.go new file mode 100644 index 0000000..7c0ee73 --- /dev/null +++ b/gamesrv/slotspkg/slots/intf/formation.go @@ -0,0 +1,68 @@ +package intf + +import ( + "github.com/tomas-qstarrs/boost/randx" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" +) + +// Formation is the interface for operating shared.Formation +type Formation interface { + GetWin() int64 + SetWin(win int64) Formation + + GetInitSymbols() []int64 + SetInitSymbols(symbols []int64) Formation + GetInitMatrixFormattedSymbols() [][]int64 + SetInitFormattedSymbols(symbols [][]int64) Formation + + GetSymbols() []int64 + SetSymbols(symbols []int64) Formation + GetReelFormattedSymbols() [][]int64 + GetMatrixFormattedSymbols() [][]int64 + SetFormattedSymbols(symbols [][]int64) Formation + + GetCheatSymbols() []int64 + SetCheatSymbols(symbols []int64) Formation + GetReelFormattedCheatSymbols() [][]int64 + SetFormattedCheatSymbols(symbols [][]int64) Formation + + GetDisplaySymbols() []int64 + SetDisplaySymbols(symbols []int64) Formation + GetReelFormattedDisplaySymbols() [][]int64 + SetFormattedDisplaySymbols(symbols [][]int64) Formation + + GetOriginDisplaySymbols() []int64 + SetOriginDisplaySymbols(symbols []int64) Formation + GetReelFormattedOriginDisplaySymbols() [][]int64 + SetFormattedOriginDisplaySymbols(symbols [][]int64) Formation + + GetFinalSymbols() []int64 + SetFinalSymbols(symbols []int64) Formation + GetMatrixFormattedFinalSymbols() [][]int64 + SetFormattedFinalSymbols(symbols [][]int64) Formation + + GetLinkPositions() []*shared.LinkPositions + SetLinkPositions(linkPositions []*shared.LinkPositions) Formation + + CoordsToPosition(row int64, col int64) int64 + PositionToCoords(position int64) (int64, int64) + + GetLineSymbols() [][]int64 + GetLinePays() []float64 + GetLineCount() int64 + GetLineLines() [][]int64 + + GetRandPositions() []int64 + GetReelSymbols(reelIndex int64, startIdx int64, size int64) []int64 + + GetMatrixForm() []int64 + + ResetRandSymbols(r *randx.Randx) + ResetRandSymbolsByIndex(r *randx.Randx) + + GetRewardInfo() []*shared.RewardInfo + SetRewardInfo(ri []*shared.RewardInfo) + + SetNewNodeType(nodeType string) + GetNewNodeType() string +} diff --git a/gamesrv/slotspkg/slots/intf/master.go b/gamesrv/slotspkg/slots/intf/master.go new file mode 100644 index 0000000..c128382 --- /dev/null +++ b/gamesrv/slotspkg/slots/intf/master.go @@ -0,0 +1,140 @@ +package intf + +import ( + "github.com/tomas-qstarrs/boost/randx" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/player" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" +) + +// Master is the interface for mastering machine +type Master interface { + Randx() *randx.Randx + UID() int64 + SetRatio(int64, float64) + SetSummary(s string) + TryLink(seqID int64, symbols []int64) ([]*shared.LinkPositions, [][]int64, []float64) // 返回linkPositions, LineSymbols, LinePays + TryLinkMatrixSymbols(seqID int64, matSymbols [][]int64) ([]*shared.LinkPositions, [][]int64, []float64) // 返回linkPositions, LineSymbols, LinePays + TryRand(nodeType string, seqID int64) []int64 + SkipBaseSpin(nodeID int64) + SkipBaseSpinWithBet(nodeID int64) + Desc() *desc.NodeDesc + UserData() *shared.UserData + MustNext() + RandVector() *shared.RandVector + RandxTracker() *shared.RandxTracker + CompareRandx() (bool, string, string) + + BetSizeIndex() int64 + BetLevelIndex() int64 + BetLineIndex() int64 + Choice() int64 + Stay() bool + Version() int64 + Ratio() float64 + Mode() string + GetBetCoin() player.DecCoin + GetWinCoin() player.IncCoin + + Bet() int64 // 当前Node参与计算的下注值(拷贝自Base,可临时被更改) + ActBet() int64 // 通过Base节点信息和Act信息实时计算的最新Bet值 + TotalBet() int64 // 一轮Base节点实际付款金币 + ActualBet() int64 // 当前Spin实际付款金币 + Win() int64 // 当前Spin中奖金额 + NodeTotalWin() int64 // 当前Node中奖金额 + TotalWin() int64 // 一轮Base总中奖金额 + ActualWin() int64 // 当前Spin实际获奖金额 + ActualWinType() int64 // 当前Spin实际获奖类型 + + Accomplish() + AccomplishNext() + AccomplishParent() + AddProgress(n int64) + AddNextProgress(n int64) + AddParentProgress(n int64) + ProgressLeft() int64 + NextProgressLeft() int64 + ParentProgressLeft() int64 + SetProgressLeft(left int64) + SetNextProgressLeft(left int64) + SetParentProgressLeft(left int64) + GetProgressValue() int64 + GetNextProgressValue() int64 + GetParentProgressValue() int64 + + Node(nodeID int64) Node + Cursor() Node + Root() Node + Next() Node + AddNode(nodeID int64, nodeType string, progress int64) Node + AddNodeOnCursor(nodeType string, progress int64) Node + AddNodeOnRoot(nodeType string, progress int64) Node + AddNodeAtLeft(nodeID int64, nodeType string, progress int64) Node + AddNodeOnCursorAtLeft(nodeType string, progress int64) Node + AddNodeOnRootAtLeft(nodeType string, progress int64) Node + + //////////////////////////////////////////////////////// + UpdateCursor2NewType(nodeType string, progress int64) Node + + IsWinInBeforeDisplay() bool + + IsWinInBeforeDisplayBySymbols(symbols [][]int64) int + //////////////////////////////////////////////////////// + + CursorFormation() Formation + CursorFormations() []Formation + CursorSeqFormation(seqID int64) Formation + NodeFormation(nodeID int64) Formation + NodeFormations(nodeID int64) []Formation + NodeSeqFormation(nodeID int64, seqID int64) Formation + + Feature(featureID int64) Feature + CursorFeature(v interface{}) Feature + CursorFeatures(v interface{}) []Feature + CursorFormationFeature(seqID int64, v interface{}) Feature + CursorFormationFeatures(seqID int64, v interface{}) []Feature + RootFeature(v interface{}) Feature + RootFeatures(v interface{}) []Feature + NodeFeature(nodeID int64, v interface{}) Feature + NodeFeatures(nodeID int64, v interface{}) []Feature + NodeFormationFeature(nodeID int64, seqID int64, v interface{}) Feature + NodeFormationFeatures(nodeID int64, seqID int64, v interface{}) []Feature + AddCursorFeature(v interface{}) Feature + AddRootFeature(v interface{}) Feature + AddNodeFeature(nodeID int64, v interface{}) Feature + + Custom(featureID int64) interface{} + CursorCustom(v interface{}) interface{} + CursorCustoms(v interface{}) []interface{} + CursorFormationCustom(seqID int64, v interface{}) interface{} + CursorFormationCustoms(seqID int64, v interface{}) []interface{} + RootCustom(v interface{}) interface{} + RootCustoms(v interface{}) []interface{} + NodeCustom(nodeID int64, v interface{}) interface{} + NodeCustoms(nodeID int64, v interface{}) []interface{} + NodeFormationCustom(nodeID int64, seqID int64, v interface{}) interface{} + NodeFormationCustoms(nodeID int64, seqID int64, v interface{}) []interface{} + + Remove(key interface{}) + Set(key interface{}, value interface{}) + Exists(key interface{}) bool + Int(key interface{}) int + Int8(key interface{}) int8 + Int16(key interface{}) int16 + Int32(key interface{}) int32 + Int64(key interface{}) int64 + Uint(key interface{}) uint + Uint8(key interface{}) uint8 + Uint16(key interface{}) uint16 + Uint32(key interface{}) uint32 + Uint64(key interface{}) uint64 + Incr(Key interface{}) + Float32(key interface{}) float32 + Float64(key interface{}) float64 + String(key interface{}) string + Bool(key interface{}) bool + Value(key interface{}) interface{} + State() map[string]interface{} + Restore(data map[string]interface{}) + Clear() +} diff --git a/gamesrv/slotspkg/slots/intf/node.go b/gamesrv/slotspkg/slots/intf/node.go new file mode 100644 index 0000000..70fae8f --- /dev/null +++ b/gamesrv/slotspkg/slots/intf/node.go @@ -0,0 +1,22 @@ +package intf + +import "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + +// Node is the interface for operating shared.Node +type Node interface { + GetID() int64 + GetParent() int64 + GetType() string + GetBet() int64 + SetBet(bet int64) Node + AddPrepare() Node + GetFormationWin() int64 // 节点矩阵中奖金额 + GetFeatureWin() int64 // 节点Feature中奖金额 + GetWin() int64 + GetTotalWin() int64 + GetProgressValue() int64 + GetProgressMax() int64 + GetFormations() []*shared.Formation + GetSingleBet() int64 + GetNoBase() bool +} diff --git a/gamesrv/slotspkg/slots/intf/plugin.go b/gamesrv/slotspkg/slots/intf/plugin.go new file mode 100644 index 0000000..c8f2ceb --- /dev/null +++ b/gamesrv/slotspkg/slots/intf/plugin.go @@ -0,0 +1,18 @@ +package intf + +// Plugin is the interface that represents a feature plugin +type Plugin interface { + Theme() string + Customs() []interface{} + OnInit(Master) + OnStepBegin(Master) + OnEnterNode(Master) + BeforeSpin(Master) + BeforeDisplay(Master) + AfterDisplay(Master) + AfterSpin(Master) + OnLeaveNode(Master) + OnStepEnd(Master) + OnSummary(Master) + OnStay(Master) +} diff --git a/gamesrv/slotspkg/slots/intf/spinner.go b/gamesrv/slotspkg/slots/intf/spinner.go new file mode 100644 index 0000000..f3da082 --- /dev/null +++ b/gamesrv/slotspkg/slots/intf/spinner.go @@ -0,0 +1,72 @@ +package intf + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/module/player" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" +) + +// Spinner is the interface for dispatching entity +type Spinner interface { + Close() *shared.NodeTree + PlayClose() *shared.NodeTree + SyncLiteClose() *shared.LiteNodeTree + PlayLiteClose() *shared.LiteNodeTree + QuitLiteClose() *shared.LiteNodeTree + GetNodeTree() *shared.NodeTree + Play(*shared.Act) + + Summary() string + GetSymbolLinkPays() []map[int64]map[int64]float64 + CalcWinType(multi float64) int64 + Cursor() Node + Next() Node + Parent() Node + Ancestor() Node + Node(nodeID int64) Node + CursorType() string + NextType() string + ParentType() string + AncestorType() string + UserData() *shared.UserData + Desc() *desc.NodeDesc + Value(key interface{}) interface{} + RandVector() *shared.RandVector + CompareRandx() (bool, string, string) + RandxTracker() *shared.RandxTracker + MinBet() int64 + + BetSizeIndex() int64 + BetLevelIndex() int64 + BetLineIndex() int64 + BetSizes() []int64 + BetLevels() []int64 + BetLines() []int64 + BetChangeList() []float64 + + Choice() int64 + Stay() bool + Version() int64 + Ratio() float64 + Mode() string + Vector() []int64 + GetBetCoin() player.DecCoin + GetWinCoin() player.IncCoin + Round() int64 + + Bet() int64 // 当前Node参与计算的下注值(拷贝自Base,可临时被更改) + ActBet() int64 // 通过Base节点信息和Act信息实时计算的最新Bet值 + TotalBet() int64 // 一轮Base节点实际付款金币 + ActualBet() int64 // 当前Spin实际付款金币 + Win() int64 // 当前Spin中奖金额 + NodeTotalWin() int64 // 当前Node中奖金额 + TotalWin() int64 // 一轮Base总中奖金额 + ActualWin() int64 // 当前Spin实际获奖金额 + ActualWinType() int64 // 当前Spin实际获奖类型 + + GetVector(float64, float64, bool) (int64, []int64) + + GetDisplaySymbolsListString() string + GetFinalSymbolsListString() string + GetFeaturesString() string +} diff --git a/gamesrv/slotspkg/slots/machine/feature.go b/gamesrv/slotspkg/slots/machine/feature.go new file mode 100644 index 0000000..e43c8d2 --- /dev/null +++ b/gamesrv/slotspkg/slots/machine/feature.go @@ -0,0 +1,49 @@ +package machine + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" +) + +// Feature implements intf.Feature +type Feature struct { + *shared.Feature + Machine *Machine +} + +func asFeatureIntf(m *Machine, f *shared.Feature) intf.Feature { + return &Feature{ + Feature: f, + Machine: m, + } +} + +// SetSeqID implements intf.Feature.SetSeqID +func (f *Feature) SetSeqID(seqID int64) intf.Feature { + f.Machine.AttachFeatureToFormation(f.Feature, seqID) + return f +} + +// SetWin implements intf.Feature.SetWin +func (f *Feature) SetWin(win int64) intf.Feature { + f.Feature.Win = win + return f +} + +// SetLifetime implements intf.Feature.SetLifetime +func (f *Feature) SetLifetime(lifetime int64) intf.Feature { + f.Feature.Lifetime = lifetime + return f +} + +// SetVisiable implements intf.Feature.SetVisiable +func (f *Feature) SetVisiable(visiable bool) intf.Feature { + f.Feature.Visiable = visiable + return f +} + +// SetImageable implements intf.Feature.SetImageable +func (f *Feature) SetImageable(imageable bool) intf.Feature { + f.Feature.Imageable = imageable + return f +} diff --git a/gamesrv/slotspkg/slots/machine/formation.go b/gamesrv/slotspkg/slots/machine/formation.go new file mode 100644 index 0000000..b5ef770 --- /dev/null +++ b/gamesrv/slotspkg/slots/machine/formation.go @@ -0,0 +1,289 @@ +package machine + +import ( + "github.com/mohae/deepcopy" + "github.com/tomas-qstarrs/boost/randx" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/formation" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" +) + +// Formation implements intf.Formation +type Formation struct { + *shared.Formation + OriginFormation *formation.Formation + Machine *Machine +} + +func asFormationIntf(m *Machine, f *shared.Formation, o *formation.Formation) intf.Formation { + formation := &Formation{ + Formation: f, + OriginFormation: o, + Machine: m, + } + return formation +} + +// GetWin gets formation win in after spin +func (f *Formation) GetWin() int64 { + return f.Win +} + +// SetWin sets formation win in after spin +func (f *Formation) SetWin(win int64) intf.Formation { + f.Win = win + return f +} + +// GetInitSymbols gets origin symbols +func (f *Formation) GetInitSymbols() []int64 { + initSymbols := make([]int64, len(f.InitSymbols)) + copy(initSymbols, f.InitSymbols) + return initSymbols +} + +func (f *Formation) GetInitMatrixFormattedSymbols() [][]int64 { + return formation.FormatSymbols(f.InitSymbols, + f.OriginFormation.MatrixForm) +} + +// SetInitSymbols sets origin symbols +func (f *Formation) SetInitSymbols(symbols []int64) intf.Formation { + f.InitSymbols = symbols + return f +} + +func (f *Formation) SetInitFormattedSymbols(symbols [][]int64) intf.Formation { + f.InitSymbols = formation.DeformatSymbols(symbols) + return f +} + +// GetSymbols gets origin symbols +func (f *Formation) GetSymbols() []int64 { + symbols := make([]int64, len(f.OriginFormation.Symbols)) + copy(symbols, f.OriginFormation.Symbols) + return symbols +} + +// SetSymbols sets origin symbols +func (f *Formation) SetSymbols(symbols []int64) intf.Formation { + f.OriginFormation.Symbols = symbols + return f +} + +// GetReelFormattedSymbols gets origin symbols and places them into specific form +func (f *Formation) GetReelFormattedSymbols() [][]int64 { + return formation.FormatSymbols(f.OriginFormation.Symbols, + f.OriginFormation.ReelForm) +} + +// GetMatrixFormattedSymbols gets origin symbols and places them into specific form +func (f *Formation) GetMatrixFormattedSymbols() [][]int64 { + return formation.FormatSymbols(f.OriginFormation.Symbols, + f.OriginFormation.MatrixForm) +} + +// SetFormattedSymbols sets formed origin symbols +func (f *Formation) SetFormattedSymbols(symbols [][]int64) intf.Formation { + f.OriginFormation.Symbols = formation.DeformatSymbols(symbols) + return f +} + +// GetCheatSymbols gets cheat symbols +func (f *Formation) GetCheatSymbols() []int64 { + cheatSymbols := make([]int64, len(f.OriginFormation.CheatSymbols)) + copy(cheatSymbols, f.OriginFormation.CheatSymbols) + return cheatSymbols +} + +// SetCheatSymbols sets cheat symbols +func (f *Formation) SetCheatSymbols(symbols []int64) intf.Formation { + f.OriginFormation.CheatSymbols = symbols + return f +} + +// GetReelFormattedCheatSymbols gets cheat symbols and places them into specific form +func (f *Formation) GetReelFormattedCheatSymbols() [][]int64 { + return formation.FormatSymbols(f.OriginFormation.CheatSymbols, + f.OriginFormation.ReelForm) +} + +// SetFormattedCheatSymbols sets formed cheat symbols +func (f *Formation) SetFormattedCheatSymbols(symbols [][]int64) intf.Formation { + f.OriginFormation.CheatSymbols = formation.DeformatSymbols(symbols) + return f +} + +// GetDisplaySymbols gets display symbols +func (f *Formation) GetDisplaySymbols() []int64 { + displaySymbols := make([]int64, len(f.Formation.DisplaySymbols)) + copy(displaySymbols, f.Formation.DisplaySymbols) + return displaySymbols +} + +// SetDisplaySymbols sets display symbols +func (f *Formation) SetDisplaySymbols(symbols []int64) intf.Formation { + f.Formation.DisplaySymbols = symbols + return f +} + +// GetReelFormattedDisplaySymbols gets display symbols and places them into specific form +func (f *Formation) GetReelFormattedDisplaySymbols() [][]int64 { + return formation.FormatSymbols(f.Formation.DisplaySymbols, + f.OriginFormation.ReelForm) +} + +// SetFormattedDisplaySymbols sets formed origin symbols +func (f *Formation) SetFormattedDisplaySymbols(symbols [][]int64) intf.Formation { + f.Formation.DisplaySymbols = formation.DeformatSymbols(symbols) + return f +} + +// GetOriginDisplaySymbols gets display symbols +func (f *Formation) GetOriginDisplaySymbols() []int64 { + displaySymbols := make([]int64, len(f.OriginFormation.DisplaySymbols)) + copy(displaySymbols, f.OriginFormation.DisplaySymbols) + return displaySymbols +} + +// SetOriginDisplaySymbols sets display symbols +func (f *Formation) SetOriginDisplaySymbols(symbols []int64) intf.Formation { + f.OriginFormation.DisplaySymbols = symbols + return f +} + +// GetReelFormattedOriginDisplaySymbols gets display symbols and places them into specific form +func (f *Formation) GetReelFormattedOriginDisplaySymbols() [][]int64 { + return formation.FormatSymbols(f.OriginFormation.DisplaySymbols, + f.OriginFormation.ReelForm) +} + +// SetFormattedOriginDisplaySymbols sets formed origin symbols +func (f *Formation) SetFormattedOriginDisplaySymbols(symbols [][]int64) intf.Formation { + f.OriginFormation.DisplaySymbols = formation.DeformatSymbols(symbols) + return f +} + +// GetFinalSymbols gets origin symbols +func (f *Formation) GetFinalSymbols() []int64 { + finalSymbols := make([]int64, len(f.Formation.FinalSymbols)) + copy(finalSymbols, f.Formation.FinalSymbols) + return finalSymbols +} + +// SetFinalSymbols sets final symbols +func (f *Formation) SetFinalSymbols(symbols []int64) intf.Formation { + f.Formation.FinalSymbols = symbols + return f +} + +// GetMatrixFormattedFinalSymbols gets final symbols and places them into specific form +func (f *Formation) GetMatrixFormattedFinalSymbols() [][]int64 { + return formation.FormatSymbols(f.FinalSymbols, + f.OriginFormation.MatrixForm) +} + +// SetFormattedFinalSymbols sets formed final symbols +func (f *Formation) SetFormattedFinalSymbols(symbols [][]int64) intf.Formation { + f.Formation.FinalSymbols = formation.DeformatSymbols(symbols) + return f +} + +// GetLinkPositions gets link positions +func (f *Formation) GetLinkPositions() []*shared.LinkPositions { + return deepcopy.Copy(f.Formation.LinkPositions).([]*shared.LinkPositions) +} + +// SetLinkPositions sets link positions +func (f *Formation) SetLinkPositions(linkPositions []*shared.LinkPositions) intf.Formation { + f.Formation.LinkPositions = linkPositions + return f +} + +// CoordsToPosition converts row & col to pos +func (f *Formation) CoordsToPosition(row int64, col int64) int64 { + coords := formation.Coords{ + Row: row, + Col: col, + } + form := f.OriginFormation.FormationDesc.MatrixDesc.Form + return coords.ToPos(form) +} + +// PositionToCoords converts pos to row & col +func (f *Formation) PositionToCoords(position int64) (int64, int64) { + form := f.OriginFormation.FormationDesc.MatrixDesc.Form + coords := &formation.Coords{} + coords.FromPos(form, position) + + return coords.Row, coords.Col +} + +// GetLineSymbols gets line symbols +func (f *Formation) GetLineSymbols() [][]int64 { + return f.OriginFormation.LineSymbols +} + +// GetLinePays gets line pays +func (f *Formation) GetLinePays() []float64 { + return f.OriginFormation.LinePays +} + +// GetLineCount gets line count +func (f *Formation) GetLineCount() int64 { + return f.OriginFormation.FormationDesc.MatrixDesc.LineCount +} + +// GetLineCount gets all Lines +func (f *Formation) GetLineLines() [][]int64 { + return f.OriginFormation.FormationDesc.MatrixDesc.Lines +} + +// GetRandPositions gets RandPositions +func (f *Formation) GetRandPositions() []int64 { + return f.OriginFormation.RandPositions +} + +// GetReelSymbols gets ReelSymbols +func (f *Formation) GetReelSymbols(reelIndex int64, startIdx int64, size int64) []int64 { + if size == 0 { + return []int64{} + } + + reelDesc := f.OriginFormation.FormationDesc.ReelsDesc[int(reelIndex)] + length := int64(len(reelDesc.Reel)) + for startIdx < 0 { + startIdx += length + } + var symbols = make([]int64, 0) + for symbolIdx := startIdx; symbolIdx < startIdx+size; symbolIdx++ { + symbol := reelDesc.Reel[symbolIdx%length] + symbols = append(symbols, symbol) + } + return symbols +} +func (f *Formation) GetMatrixForm() []int64 { + return f.OriginFormation.MatrixForm +} +func (f *Formation) ResetRandSymbols(r *randx.Randx) { + f.OriginFormation.ResetRandSymbols(r) +} + +func (f *Formation) ResetRandSymbolsByIndex(r *randx.Randx) { + f.OriginFormation.ResetRandSymbolsByIndex(r) +} + +func (f *Formation) GetRewardInfo() []*shared.RewardInfo { + RewardInfo := make([]*shared.RewardInfo, len(f.Formation.RewardInfo)) + copy(RewardInfo, f.Formation.RewardInfo) + return RewardInfo +} +func (f *Formation) SetRewardInfo(ri []*shared.RewardInfo) { + f.Formation.RewardInfo = ri +} +func (f *Formation) GetNewNodeType() string { + return f.NewNodeType +} +func (f *Formation) SetNewNodeType(nodeType string) { + f.NewNodeType = nodeType +} diff --git a/gamesrv/slotspkg/slots/machine/machine.go b/gamesrv/slotspkg/slots/machine/machine.go new file mode 100644 index 0000000..7fef7d6 --- /dev/null +++ b/gamesrv/slotspkg/slots/machine/machine.go @@ -0,0 +1,58 @@ +package machine + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/player" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/session" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shell" + "mongo.games.com/game/gamesrv/slotspkg/slots/entity" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" +) + +// Machine is wrapper for entity +type Machine struct { + *entity.Entity +} + +// NewMachine creates a new machine with Spinner interface +func NewMachine(s *session.Session, theme string, shell *shell.Shell, isFree bool) intf.Spinner { + p := player.Get(s) + if theme == "" { + panic(errors.LeakTheme.ErrorWith(p.UID.Get())) + } + m := &Machine{} + m.Entity = entity.NewEntity(s, theme, m, shell, isFree) + m.Init() + m.Session.Set(key.SessionMachine, m) + return m +} + +// Node gets specific node +func (m *Machine) Node(nodeID int64) intf.Node { + return asNodeIntf(m, m.GetNode(nodeID)) +} + +// Cursor gets cursor node +func (m *Machine) Cursor() intf.Node { + return asNodeIntf(m, m.CursorNode()) +} + +// Root gets root node +func (m *Machine) Root() intf.Node { + return asNodeIntf(m, m.RootNode()) +} + +// Root gets root node +func (m *Machine) Next() intf.Node { + return asNodeIntf(m, m.NextNode()) +} + +// GetParentNode gets cursor node +func (m *Machine) Parent() intf.Node { + return asNodeIntf(m, m.ParentNode()) +} + +func (m *Machine) Ancestor() intf.Node { + return asNodeIntf(m, m.AncestorNode()) +} diff --git a/gamesrv/slotspkg/slots/machine/machine_callback.go b/gamesrv/slotspkg/slots/machine/machine_callback.go new file mode 100644 index 0000000..09286af --- /dev/null +++ b/gamesrv/slotspkg/slots/machine/machine_callback.go @@ -0,0 +1,107 @@ +package machine + +import ( + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "mongo.games.com/game/gamesrv/slotspkg/slots/reg" + "reflect" +) + +// OnInit is called after Init +func (m *Machine) OnInit() { + if _, ok := reg.Plugins[m.Theme]; !ok { + return + } + + for _, t := range reg.Plugins[m.Theme] { + reflect.New(t.Elem()).Interface().(intf.Plugin).OnInit(m) + } +} + +// OnStepBegin is called on step initializing +func (m *Machine) OnStepBegin() { + if _, ok := reg.Plugins[m.Theme]; !ok { + return + } + + for _, t := range reg.Plugins[m.Theme] { + reflect.New(t.Elem()).Interface().(intf.Plugin).OnStepBegin(m) + } +} + +// BeforeSpin is called before Spin +func (m *Machine) BeforeSpin() { + if _, ok := reg.Plugins[m.Theme]; !ok { + return + } + + if m.CursorNode().ProgressValue == 0 && !m.CursorNode().Prepared { + for _, t := range reg.Plugins[m.Theme] { + reflect.New(t.Elem()).Interface().(intf.Plugin).OnEnterNode(m) + } + } + + for _, t := range reg.Plugins[m.Theme] { + reflect.New(t.Elem()).Interface().(intf.Plugin).BeforeSpin(m) + } +} + +// BeforeDisplay is call before display +func (m *Machine) BeforeDisplay() { + if _, ok := reg.Plugins[m.Theme]; !ok { + return + } + + for _, t := range reg.Plugins[m.Theme] { + reflect.New(t.Elem()).Interface().(intf.Plugin).BeforeDisplay(m) + } +} + +// AfterDisplay is call after display +func (m *Machine) AfterDisplay() { + if _, ok := reg.Plugins[m.Theme]; !ok { + return + } + + for _, t := range reg.Plugins[m.Theme] { + reflect.New(t.Elem()).Interface().(intf.Plugin).AfterDisplay(m) + } +} + +// AfterSpin is called before Spin +func (m *Machine) AfterSpin() { + if _, ok := reg.Plugins[m.Theme]; !ok { + return + } + + for _, t := range reg.Plugins[m.Theme] { + reflect.New(t.Elem()).Interface().(intf.Plugin).AfterSpin(m) + } + + if m.CursorNode().ProgressValue+1 >= m.CursorNode().ProgressMax { + for _, t := range reg.Plugins[m.Theme] { + reflect.New(t.Elem()).Interface().(intf.Plugin).OnLeaveNode(m) + } + } +} + +// OnStepEnd is called on step finalizing +func (m *Machine) OnStepEnd() { + if _, ok := reg.Plugins[m.Theme]; !ok { + return + } + + for _, t := range reg.Plugins[m.Theme] { + reflect.New(t.Elem()).Interface().(intf.Plugin).OnStepEnd(m) + } +} + +// OnStay is called to do something out of normal step +func (m *Machine) OnStay() { + if _, ok := reg.Plugins[m.Theme]; !ok { + return + } + + for _, t := range reg.Plugins[m.Theme] { + reflect.New(t.Elem()).Interface().(intf.Plugin).OnStay(m) + } +} diff --git a/gamesrv/slotspkg/slots/machine/machine_master_custom.go b/gamesrv/slotspkg/slots/machine/machine_master_custom.go new file mode 100644 index 0000000..653ff31 --- /dev/null +++ b/gamesrv/slotspkg/slots/machine/machine_master_custom.go @@ -0,0 +1,118 @@ +package machine + +import "reflect" + +// Custom gets specific feature's custom +func (m *Machine) Custom(id int64) interface{} { + return m.GetCustom(id) +} + +// CursorCustom gets the first feature's custom in specific type +// on current node +func (m *Machine) CursorCustom(v interface{}) interface{} { + featureID := m.GetTypeFeatures(m.CursorNode(), reflect.TypeOf(v).Elem().String())[0].ID + return m.GetCustom(featureID) +} + +// CursorCustoms gets all features' customs in specific type +// on cursor node +func (m *Machine) CursorCustoms(v interface{}) []interface{} { + r := make([]interface{}, 0) + features := m.GetTypeFeatures(m.CursorNode(), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + r = append(r, m.GetCustom(feature.ID)) + } + return r +} + +// CursorFormationCustom gets the first features' custom in specific type +// in specific formation on cursor node +func (m *Machine) CursorFormationCustom(seqID int64, v interface{}, +) interface{} { + r := make([]interface{}, 0) + features := m.GetTypeFeatures(m.CursorNode(), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + if feature.SeqID == seqID { + r = append(r, m.GetCustom(feature.ID)) + } + } + return r[0] +} + +// CursorFormationCustoms gets all features' customs in specific type +// in specific formation on cursor node +func (m *Machine) CursorFormationCustoms(seqID int64, v interface{}, +) []interface{} { + r := make([]interface{}, 0) + features := m.GetTypeFeatures(m.CursorNode(), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + if feature.SeqID == seqID { + r = append(r, m.GetCustom(feature.ID)) + } + } + return r +} + +// RootCustom gets the first feature's custom in specific type +// on root node +func (m *Machine) RootCustom(v interface{}) interface{} { + featureID := m.GetTypeFeatures(m.RootNode(), reflect.TypeOf(v).Elem().String())[0].ID + return m.GetCustom(featureID) +} + +// RootCustoms gets all features' customs in specific type +// on root node +func (m *Machine) RootCustoms(v interface{}) []interface{} { + r := make([]interface{}, 0) + features := m.GetTypeFeatures(m.RootNode(), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + r = append(r, m.GetCustom(feature.ID)) + } + return r +} + +// NodeCustom gets the first feature's custom in specific type +// on specific node +func (m *Machine) NodeCustom(nodeID int64, v interface{}) interface{} { + featureID := m.GetTypeFeatures(m.GetNode(nodeID), reflect.TypeOf(v).Elem().String())[0].ID + return m.GetCustom(featureID) +} + +// NodeCustoms gets all features' customs in specific type +// on specific node +func (m *Machine) NodeCustoms(nodeID int64, v interface{}) []interface{} { + r := make([]interface{}, 0) + features := m.GetTypeFeatures(m.GetNode(nodeID), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + r = append(r, m.GetCustom(feature.ID)) + } + return r +} + +// NodeFormationCustom gets the first feature's custom in specific type +// in specific formation on specific node +func (m *Machine) NodeFormationCustom(nodeID int64, seqID int64, v interface{}, +) interface{} { + r := make([]interface{}, 0) + features := m.GetTypeFeatures(m.GetNode(nodeID), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + if feature.SeqID == seqID { + r = append(r, m.GetCustom(feature.ID)) + } + } + return r[0] +} + +// NodeFormationCustoms gets all features' customs in specific type +// in specific formation on specific node +func (m *Machine) NodeFormationCustoms(nodeID int64, seqID int64, v interface{}, +) []interface{} { + r := make([]interface{}, 0) + features := m.GetTypeFeatures(m.GetNode(nodeID), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + if feature.SeqID == seqID { + r = append(r, m.GetCustom(feature.ID)) + } + } + return r +} diff --git a/gamesrv/slotspkg/slots/machine/machine_master_data.go b/gamesrv/slotspkg/slots/machine/machine_master_data.go new file mode 100644 index 0000000..39c25b8 --- /dev/null +++ b/gamesrv/slotspkg/slots/machine/machine_master_data.go @@ -0,0 +1,218 @@ +package machine + +import ( + "github.com/tomas-qstarrs/boost/cast" +) + +// Remove delete data associated with the key from machine storage +func (m *Machine) Remove(k any) { + delete(m.Data, cast.ToString(k)) +} + +// Set associates v with the key in machine storage +func (m *Machine) Set(k any, v any) { + m.Data[cast.ToString(k)] = v +} + +// Exists decides whether a key has associated v +func (m *Machine) Exists(k any) bool { + _, exists := m.Data[cast.ToString(k)] + return exists +} + +// Int returns the v associated with the key as a int. +func (m *Machine) Int(k any) int { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return 0 + } + return cast.ToInt(v) +} + +// Int8 returns the v associated with the key as a int8. +func (m *Machine) Int8(k any) int8 { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return 0 + } + return cast.ToInt8(v) +} + +// Int16 returns the v associated with the key as a int16. +func (m *Machine) Int16(k any) int16 { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return 0 + } + return cast.ToInt16(v) +} + +// Int32 returns the v associated with the key as a int32. +func (m *Machine) Int32(k any) int32 { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return 0 + } + return cast.ToInt32(v) +} + +// Int64 returns the v associated with the key as a int64. +func (m *Machine) Int64(k any) int64 { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return 0 + } + return cast.ToInt64(v) +} + +// Uint returns the v associated with the key as a uint. +func (m *Machine) Uint(k any) uint { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return 0 + } + return cast.ToUint(v) +} + +// Uint8 returns the v associated with the key as a uint8. +func (m *Machine) Uint8(k any) uint8 { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return 0 + } + return cast.ToUint8(v) +} + +// Uint16 returns the v associated with the key as a uint16. +func (m *Machine) Uint16(k any) uint16 { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return 0 + } + return cast.ToUint16(v) +} + +// Uint32 returns the v associated with the key as a uint32. +func (m *Machine) Uint32(k any) uint32 { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return 0 + } + return cast.ToUint32(v) +} + +// Uint64 returns the v associated with the key as a uint64. +func (m *Machine) Uint64(k any) uint64 { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return 0 + } + return cast.ToUint64(v) +} + +// Float32 returns the v associated with the key as a float32. +func (m *Machine) Float32(k any) float32 { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return 0 + } + return cast.ToFloat32(v) +} + +// Float64 returns the v associated with the key as a int64. +func (m *Machine) Float64(k any) float64 { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return 0 + } + return cast.ToFloat64(v) +} + +// String returns the v associated with the key as a string. +func (m *Machine) String(k any) string { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return "" + } + return cast.ToString(v) +} + +// Bool returns the v associated with the key as a bool. +func (m *Machine) Bool(k any) bool { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return false + } + return cast.ToBool(v) +} + +// Value returns the v associated with the key as a any. +func (m *Machine) Value(k any) any { + v, ok := m.Data[cast.ToString(k)] + if !ok { + return nil + } + return v +} + +// State returns all machine state +func (m *Machine) State() map[string]any { + return m.Data +} + +// Restore machine state after reconnect +func (m *Machine) Restore(data map[string]any) { + m.Data = data +} + +// Clear releases all data related to current machine +func (m *Machine) Clear() { + m.Data = map[string]any{} +} + +// Incr increases v by 1 +func (m *Machine) Incr(k any) { + s := cast.ToString(k) + v, ok := m.Data[s] + if !ok { + m.Data[s] = 1 + return + } + + switch n := v.(type) { + case int: + n++ + m.Data[s] = n + case int8: + n++ + m.Data[s] = n + case int16: + n++ + m.Data[s] = n + case int32: + n++ + m.Data[s] = n + case int64: + n++ + m.Data[s] = n + case uint: + n++ + m.Data[s] = n + case uint8: + n++ + m.Data[s] = n + case uint16: + n++ + m.Data[s] = n + case uint32: + n++ + m.Data[s] = n + case uint64: + n++ + m.Data[s] = n + default: + m.Data[s] = 1 + } + + return +} diff --git a/gamesrv/slotspkg/slots/machine/machine_master_feature.go b/gamesrv/slotspkg/slots/machine/machine_master_feature.go new file mode 100644 index 0000000..a4701a1 --- /dev/null +++ b/gamesrv/slotspkg/slots/machine/machine_master_feature.go @@ -0,0 +1,126 @@ +package machine + +import ( + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "reflect" +) + +// Feature gets specific feature +func (m *Machine) Feature(featureID int64) intf.Feature { + return asFeatureIntf(m, m.GetFeature(featureID)) +} + +// CursorFeature gets the first feature in specific type on cursor node +func (m *Machine) CursorFeature(v interface{}) intf.Feature { + return asFeatureIntf(m, m.GetTypeFeatures(m.CursorNode(), reflect.TypeOf(v).Elem().String())[0]) +} + +// CursorFeatures gets all features in specific type on cursor node +func (m *Machine) CursorFeatures(v interface{}) []intf.Feature { + r := make([]intf.Feature, 0) + features := m.GetTypeFeatures(m.CursorNode(), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + r = append(r, asFeatureIntf(m, feature)) + } + return r +} + +// CursorFormationFeature gets the first feature in specific type +// in specific formation on cursor node +func (m *Machine) CursorFormationFeature(seqID int64, v interface{}, +) intf.Feature { + r := make([]intf.Feature, 0) + features := m.GetTypeFeatures(m.CursorNode(), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + if feature.SeqID == seqID { + r = append(r, asFeatureIntf(m, feature)) + } + } + return r[0] +} + +// CursorFormationFeatures gets all features in specific type +// in specific formation on cursor node +func (m *Machine) CursorFormationFeatures(seqID int64, v interface{}) []intf.Feature { + r := make([]intf.Feature, 0) + features := m.GetTypeFeatures(m.CursorNode(), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + if feature.SeqID == seqID { + r = append(r, asFeatureIntf(m, feature)) + } + } + return r +} + +// RootFeature gets the first feature in specific type on root node +func (m *Machine) RootFeature(v interface{}) intf.Feature { + return asFeatureIntf(m, m.GetTypeFeatures(m.RootNode(), reflect.TypeOf(v).Elem().String())[0]) +} + +// RootFeatures gets all features in specific type on root node +func (m *Machine) RootFeatures(v interface{}) []intf.Feature { + r := make([]intf.Feature, 0) + features := m.GetTypeFeatures(m.RootNode(), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + r = append(r, asFeatureIntf(m, feature)) + } + return r +} + +// NodeFeature gets the first feature in specific type on specific node +func (m *Machine) NodeFeature(nodeID int64, v interface{}) intf.Feature { + return asFeatureIntf(m, m.GetTypeFeatures(m.GetNode(nodeID), reflect.TypeOf(v).Elem().String())[0]) +} + +// NodeFeatures gets all features in specific type on specific node +func (m *Machine) NodeFeatures(nodeID int64, v interface{}) []intf.Feature { + r := make([]intf.Feature, 0) + features := m.GetTypeFeatures(m.GetNode(nodeID), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + r = append(r, asFeatureIntf(m, feature)) + } + return r +} + +// NodeFormationFeature gets the first feature in specific type +// in specific formation on specific node +func (m *Machine) NodeFormationFeature(nodeID int64, seqID int64, v interface{}, +) intf.Feature { + r := make([]intf.Feature, 0) + features := m.GetTypeFeatures(m.GetNode(nodeID), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + if feature.SeqID == seqID { + r = append(r, asFeatureIntf(m, feature)) + } + } + return r[0] +} + +// NodeFormationFeatures gets all feature in specific type +// in specific formation on specific node +func (m *Machine) NodeFormationFeatures(nodeID int64, seqID int64, v interface{}, +) []intf.Feature { + r := make([]intf.Feature, 0) + features := m.GetTypeFeatures(m.GetNode(nodeID), reflect.TypeOf(v).Elem().String()) + for _, feature := range features { + if feature.SeqID == seqID { + r = append(r, asFeatureIntf(m, feature)) + } + } + return r +} + +// AddCursorFeature adds new feature to cursor node +func (m *Machine) AddCursorFeature(v interface{}) intf.Feature { + return asFeatureIntf(m, m.AddFeatureCustom(m.AddFeature(m.CursorNode()), v)) +} + +// AddRootFeature adds new feature to root node +func (m *Machine) AddRootFeature(v interface{}) intf.Feature { + return asFeatureIntf(m, m.AddFeatureCustom(m.AddFeature(m.RootNode()), v)) +} + +// AddNodeFeature adds new feature to specific node +func (m *Machine) AddNodeFeature(nodeID int64, v interface{}) intf.Feature { + return asFeatureIntf(m, m.AddFeatureCustom(m.AddFeature(m.GetNode(nodeID)), v)) +} diff --git a/gamesrv/slotspkg/slots/machine/machine_master_formation.go b/gamesrv/slotspkg/slots/machine/machine_master_formation.go new file mode 100644 index 0000000..e717ea0 --- /dev/null +++ b/gamesrv/slotspkg/slots/machine/machine_master_formation.go @@ -0,0 +1,79 @@ +package machine + +import ( + "mongo.games.com/game/gamesrv/slotspkg/slots/formation" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" +) + +// CursorFormation gets the first formation on cursor node +func (m *Machine) CursorFormation() intf.Formation { + return asFormationIntf(m, m.GetFormation(m.NodeTree.Cursor, 1), + m.OriginFormations[0]) +} + +// CursorFormations gets all formations on cursor node +func (m *Machine) CursorFormations() []intf.Formation { + formations := make([]intf.Formation, 0) + for _, cliFormation := range m.GetFormations(m.NodeTree.Cursor) { + formations = append(formations, asFormationIntf(m, cliFormation, + m.OriginFormations[cliFormation.SeqID-1])) + } + return formations +} + +// CursorSeqFormation gets specific formation on cursor node +func (m *Machine) CursorSeqFormation(seqID int64) intf.Formation { + return asFormationIntf(m, m.GetFormation(m.NodeTree.Cursor, seqID), + m.OriginFormations[seqID-1]) +} + +// NodeFormation gets the first formation on specific node +func (m *Machine) NodeFormation(nodeID int64) intf.Formation { + if nodeID == m.NodeTree.Cursor { + return asFormationIntf(m, m.GetFormation(nodeID, 1), m.OriginFormations[0]) + } + nodeDesc := m.GetNodeDesc(m.GetNode(nodeID)) + originFormation, err := formation.NewFormation(nodeDesc, 1) + if err != nil { + panic(err) + } + return asFormationIntf(m, m.GetFormation(nodeID, 1), originFormation) +} + +// NodeFormations gets all formations on all nodes +func (m *Machine) NodeFormations(nodeID int64) []intf.Formation { + if nodeID == m.NodeTree.Cursor { + formations := make([]intf.Formation, 0) + for _, cliFormation := range m.GetFormations(nodeID) { + formations = append(formations, asFormationIntf(m, cliFormation, + m.OriginFormations[cliFormation.SeqID-1])) + } + return formations + } + nodeDesc := m.GetNodeDesc(m.GetNode(nodeID)) + formations := make([]intf.Formation, 0) + for _, cliFormation := range m.GetFormations(nodeID) { + originFormation, err := formation.NewFormation(nodeDesc, cliFormation.SeqID) + if err != nil { + panic(err) + } + formations = append(formations, asFormationIntf(m, cliFormation, + originFormation)) + } + return formations +} + +// NodeSeqFormation gets specific formation on specific node +func (m *Machine) NodeSeqFormation(nodeID int64, seqID int64) intf.Formation { + if nodeID == m.NodeTree.Cursor { + return asFormationIntf(m, m.GetFormation(nodeID, seqID), + m.OriginFormations[seqID-1]) + } + nodeDesc := m.GetNodeDesc(m.GetNode(nodeID)) + originFormation, err := formation.NewFormation(nodeDesc, seqID) + if err != nil { + panic(err) + } + return asFormationIntf(m, m.GetFormation(nodeID, seqID), + originFormation) +} diff --git a/gamesrv/slotspkg/slots/machine/machine_master_misc.go b/gamesrv/slotspkg/slots/machine/machine_master_misc.go new file mode 100644 index 0000000..49be731 --- /dev/null +++ b/gamesrv/slotspkg/slots/machine/machine_master_misc.go @@ -0,0 +1,126 @@ +package machine + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/formation" +) + +// Bet gets bet of lastest play +func (m *Machine) Bet() int64 { + bet := m.CursorNode().Bet + if bet == 0 { + panic(errors.BetIsZero.ErrorWith(m.Theme, m.CursorNode().Type)) + } + return bet +} + +func (m *Machine) SetRatio(ratioType int64, ratio float64) { + m.NodeTree.Act.RatioType = ratioType + m.NodeTree.Act.Ratio = ratio +} + +func (m *Machine) BetSizeIndex() int64 { + return m.NodeTree.Act.BetSizeIndex +} + +func (m *Machine) BetLevelIndex() int64 { + return m.NodeTree.Act.BetLevelIndex +} +func (m *Machine) BetLineIndex() int64 { + return m.NodeTree.Act.BetLineIndex +} +func (m *Machine) BetSizes() []int64 { + return m.MachineDesc.BetSizes() +} +func (m *Machine) BetLevels() []int64 { + return m.MachineDesc.BetLevels() +} +func (m *Machine) BetLines() []int64 { + return m.MachineDesc.BetLines() +} +func (m *Machine) BetChangeList() []float64 { + return m.MachineDesc.BetChangeList() +} +func (m *Machine) Choice() int64 { + if m.UserData().ForceChoice > 0 { + return m.UserData().ForceChoice + } + return m.NodeTree.Act.Choice +} + +func (m *Machine) Stay() bool { + return m.NodeTree.Act.Stay +} + +func (m *Machine) Version() int64 { + return m.NodeTree.Act.Version +} + +func (m *Machine) Ratio() float64 { + return m.NodeTree.Act.Ratio +} + +func (m *Machine) Mode() string { + return m.NodeTree.Act.Mode +} + +func (m *Machine) Vector() []int64 { + return m.NodeTree.Act.Vector +} + +func (m *Machine) RandVector() *shared.RandVector { + return m.NodeTree.RandVector +} + +// Class gets class of cursor node +func (m *Machine) Class() int64 { + return m.NodeDesc.Class +} + +// SetSummary sets feature summary to simulator +func (m *Machine) SetSummary(s string) { + m.Set("Summary", s) +} + +func (m *Machine) TryLinkMatrixSymbols(seqID int64, matSymbols [][]int64) ([]*shared.LinkPositions, [][]int64, []float64) { + symbols := formation.DeformatSymbols(matSymbols) + return m.TryLink(seqID, symbols) +} + +func (m *Machine) TryLink(seqID int64, symbols []int64) ([]*shared.LinkPositions, [][]int64, []float64) { + f, err := formation.NewFormation(m.NodeDesc, seqID) + if err != nil { + panic(err) + } + f.Symbols = symbols + f.Link() + + linkPositions := make([]*shared.LinkPositions, 0) + for _, positions := range f.LinkPositions { + linkPositions = append(linkPositions, &shared.LinkPositions{ + Positions: positions, + }) + } + + return linkPositions, f.LineSymbols, f.LinePays +} + +func (m *Machine) TryRand(nodeType string, seqID int64) []int64 { + nodeDesc := m.NewNodeDescWithNodeType(nodeType) + nodeDesc.FormationSeqsDesc = nodeDesc.GetFormationSeqDescs(nodeType) + f, err := formation.NewFormation(nodeDesc, seqID) + if err != nil { + panic(err) + } + f.Rand(m.Randx()) + return f.Symbols +} + +func (m *Machine) UID() int64 { + return m.Player.UID.Get() +} + +func (m *Machine) Round() int64 { + return m.NodeTree.Round +} diff --git a/gamesrv/slotspkg/slots/machine/machine_master_node.go b/gamesrv/slotspkg/slots/machine/machine_master_node.go new file mode 100644 index 0000000..397ccdb --- /dev/null +++ b/gamesrv/slotspkg/slots/machine/machine_master_node.go @@ -0,0 +1,38 @@ +package machine + +import "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + +// AddNode adds node to specific node +func (m *Machine) AddNode(nodeID int64, nodeType string, progress int64) intf.Node { + return asNodeIntf(m, m.AddChildNode(nodeID, nodeType, progress)) +} + +// AddNodeOnCursor adds node to cursor node +func (m *Machine) AddNodeOnCursor(nodeType string, progress int64) intf.Node { + return asNodeIntf(m, m.AddChildNode(m.CursorNode().ID, nodeType, progress)) +} + +// AddNodeOnRoot adds node to root node +func (m *Machine) AddNodeOnRoot(nodeType string, progress int64) intf.Node { + return asNodeIntf(m, m.AddChildNode(m.RootNode().ID, nodeType, progress)) +} + +// AddNode adds node to specific node +func (m *Machine) AddNodeAtLeft(nodeID int64, nodeType string, progress int64) intf.Node { + return asNodeIntf(m, m.AddChildNodeAtLeft(nodeID, nodeType, progress)) +} + +// AddNodeOnCursor adds node to cursor node +func (m *Machine) AddNodeOnCursorAtLeft(nodeType string, progress int64) intf.Node { + return asNodeIntf(m, m.AddChildNodeAtLeft(m.CursorNode().ID, nodeType, progress)) +} + +// AddNodeOnRoot adds node to root node +func (m *Machine) AddNodeOnRootAtLeft(nodeType string, progress int64) intf.Node { + return asNodeIntf(m, m.AddChildNodeAtLeft(m.RootNode().ID, nodeType, progress)) +} + +// UpdateCursor2NewType update cursor node to new node must in OnStepBegin +func (m *Machine) UpdateCursor2NewType(nodeType string, progress int64) intf.Node { + return asNodeIntf(m, m.UpdateNode2NewType(m.Next().GetID(), nodeType, progress)) +} diff --git a/gamesrv/slotspkg/slots/machine/machine_spinner.go b/gamesrv/slotspkg/slots/machine/machine_spinner.go new file mode 100644 index 0000000..87897a9 --- /dev/null +++ b/gamesrv/slotspkg/slots/machine/machine_spinner.go @@ -0,0 +1,426 @@ +package machine + +import ( + "encoding/json" + "github.com/tomas-qstarrs/boost/mathx" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/entity" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "mongo.games.com/game/gamesrv/slotspkg/slots/reg" + "reflect" +) + +// Close serialize the machine +func (m *Machine) Close() *shared.NodeTree { + m.Serialize() + m.Session.Remove(key.SessionMachine) + return m.NodeTree +} + +// Close serialize the machine +func (m *Machine) PlayClose() *shared.NodeTree { + m.Serialize() + m.Session.Remove(key.SessionMachine) + return m.NodeTree +} + +// SyncLiteClose serialize the machine and transform into lite node tree for sync +func (m *Machine) SyncLiteClose() *shared.LiteNodeTree { + m.Serialize() + m.Session.Remove(key.SessionMachine) + + liteNodeTree := &shared.LiteNodeTree{ + Step: m.NodeTree.Step, + Cursor: m.NodeTree.Cursor, + Next: m.NodeTree.Next, + Closing: m.NodeTree.Closing, + Theme: m.Theme, + } + + liteNodeTree.Features = make([]*shared.LiteFeature, 0) + m.WalkTree(entity.WalkRootFirst, func(node *shared.Node) bool { + for _, feature := range node.Features { + switch node.ID { + case m.NodeTree.Cursor, m.NodeTree.Next, m.NodeTree.Root: + liteNodeTree.Features = append(liteNodeTree.Features, + &shared.LiteFeature{ + NodeID: feature.NodeID, + FormationID: feature.FormationID, + Type: feature.Type, + Custom: feature.Custom, + Win: feature.Win, + }) + } + } + + // Continue collecting. + return false + }) + + formationIDs := make([]int64, 0) + liteNodeTree.Formations = make([]*shared.LiteFormation, 0) + for _, formation := range m.NextNode().Formations { + formationIDs = append(formationIDs, formation.ID) + liteNodeTree.Formations = append(liteNodeTree.Formations, + &shared.LiteFormation{ + ID: formation.ID, + SpinType: formation.SpinType, + NodeType: formation.NodeType, + NodeID: formation.NodeID, + InitSymbols: formation.InitSymbols, + LinkPositions: formation.LinkPositions, + FinalSymbols: formation.FinalSymbols, + Win: formation.Win, + RandPositions: formation.RandPositions, + MatrixForm: formation.MatrixForm, + NewNodeType: formation.NewNodeType, + }) + } + for _, formation := range m.NodeTree.ImageFormations { + if mathx.In(formation.ID, formationIDs) { + continue + } + liteNodeTree.Formations = append(liteNodeTree.Formations, + &shared.LiteFormation{ + ID: formation.ID, + SpinType: formation.SpinType, + NodeType: formation.NodeType, + NodeID: formation.NodeID, + FinalSymbols: formation.FinalSymbols, + LinkPositions: formation.LinkPositions, + Win: formation.Win, + RandPositions: formation.RandPositions, + MatrixForm: formation.MatrixForm, + NewNodeType: formation.NewNodeType, + }) + } + + liteNodeTree.Nodes = make([]*shared.LiteNode, 0) + for _, node := range m.NodeTree.Nodes { + liteNodeTree.Nodes = append(liteNodeTree.Nodes, + &shared.LiteNode{ + ID: node.ID, + Parent: node.Parent, + Children: node.Children, + Type: node.Type, + SpinType: node.SpinType, + Win: node.Win, + TotalWin: node.TotalWin, + ChildrenTotalWin: node.ChildrenTotalWin, + ProgressValue: node.ProgressValue, + ProgressMax: node.ProgressMax, + Bet: node.Bet, + }) + } + + return liteNodeTree +} + +// PlayLiteClose serialize the machine and transform into lite node tree for play +func (m *Machine) PlayLiteClose() *shared.LiteNodeTree { + m.Serialize() + m.Session.Remove(key.SessionMachine) + + liteNodeTree := &shared.LiteNodeTree{ + Step: m.NodeTree.Step, + Cursor: m.NodeTree.Cursor, + Next: m.NodeTree.Next, + Closing: m.NodeTree.Closing, + BetCoin: m.NodeTree.BetCoin, + Theme: m.Theme, + } + + liteNodeTree.Features = make([]*shared.LiteFeature, 0) + m.WalkTree(entity.WalkRootFirst, func(node *shared.Node) bool { + for _, feature := range node.Features { + if !feature.Visiable { + // Prune invisiable feature. + continue + } + switch node.ID { + case m.NodeTree.Cursor, m.NodeTree.Next, m.NodeTree.Root: + liteNodeTree.Features = append(liteNodeTree.Features, + &shared.LiteFeature{ + NodeID: feature.NodeID, + FormationID: feature.FormationID, + Type: feature.Type, + Custom: feature.Custom, + Win: feature.Win, + }) + } + } + + // Continue collecting. + return false + }) + + formationIDs := make([]int64, 0) + liteNodeTree.Formations = make([]*shared.LiteFormation, 0) + for _, formation := range m.CursorNode().Formations { + formationIDs = append(formationIDs, formation.ID) + liteNodeTree.Formations = append(liteNodeTree.Formations, + &shared.LiteFormation{ + ID: formation.ID, + SpinType: formation.SpinType, + NodeType: formation.NodeType, + NodeID: formation.NodeID, + DisplaySymbols: formation.DisplaySymbols, + FinalSymbols: formation.FinalSymbols, + LinkPositions: formation.LinkPositions, + Win: formation.Win, + RandPositions: formation.RandPositions, + MatrixForm: formation.MatrixForm, + RewardInfo: formation.RewardInfo, + NewNodeType: formation.NewNodeType, + }) + } + for _, formation := range m.NextNode().Formations { + if mathx.In(formation.ID, formationIDs) { + continue + } + liteNodeTree.Formations = append(liteNodeTree.Formations, + &shared.LiteFormation{ + ID: formation.ID, + SpinType: formation.SpinType, + NodeType: formation.NodeType, + NodeID: formation.NodeID, + InitSymbols: formation.InitSymbols, + LinkPositions: formation.LinkPositions, + FinalSymbols: formation.FinalSymbols, + Win: formation.Win, + RandPositions: formation.RandPositions, + MatrixForm: formation.MatrixForm, + RewardInfo: formation.RewardInfo, + NewNodeType: formation.NewNodeType, + }) + } + + liteNodeTree.Nodes = make([]*shared.LiteNode, 0) + for _, node := range m.NodeTree.Nodes { + liteNodeTree.Nodes = append(liteNodeTree.Nodes, + &shared.LiteNode{ + ID: node.ID, + Parent: node.Parent, + Children: node.Children, + Type: node.Type, + SpinType: node.SpinType, + Win: node.Win, + TotalWin: node.TotalWin, + ChildrenTotalWin: node.ChildrenTotalWin, + ProgressValue: node.ProgressValue, + ProgressMax: node.ProgressMax, + Bet: node.Bet, + }) + } + + return liteNodeTree +} + +// QuitLiteClose serialize the machine +func (m *Machine) QuitLiteClose() *shared.LiteNodeTree { + m.Serialize() + m.Session.Remove(key.SessionMachine) + + liteNodeTree := &shared.LiteNodeTree{ + Step: m.NodeTree.Step, + Cursor: m.NodeTree.Cursor, + Next: m.NodeTree.Next, + Closing: m.NodeTree.Closing, + Theme: m.Theme, + } + + liteNodeTree.Features = make([]*shared.LiteFeature, 0) + m.WalkTree(entity.WalkRootFirst, func(node *shared.Node) bool { + for _, feature := range node.Features { + if !feature.Visiable { + // Prune invisiable feature. + continue + } + switch node.ID { + case m.NodeTree.Cursor, m.NodeTree.Next, m.NodeTree.Root: + liteNodeTree.Features = append(liteNodeTree.Features, + &shared.LiteFeature{ + NodeID: feature.NodeID, + FormationID: feature.FormationID, + Type: feature.Type, + Custom: feature.Custom, + Win: feature.Win, + }) + } + } + + // Continue collecting. + return false + }) + + formationIDs := make([]int64, 0) + liteNodeTree.Formations = make([]*shared.LiteFormation, 0) + for _, formation := range m.NextNode().Formations { + formationIDs = append(formationIDs, formation.ID) + liteNodeTree.Formations = append(liteNodeTree.Formations, + &shared.LiteFormation{ + ID: formation.ID, + SpinType: formation.SpinType, + NodeType: formation.NodeType, + NodeID: formation.NodeID, + InitSymbols: formation.InitSymbols, + LinkPositions: formation.LinkPositions, + FinalSymbols: formation.FinalSymbols, + Win: formation.Win, + RandPositions: formation.RandPositions, + NewNodeType: formation.NewNodeType, + }) + } + for _, formation := range m.NodeTree.ImageFormations { + if mathx.In(formation.ID, formationIDs) { + continue + } + liteNodeTree.Formations = append(liteNodeTree.Formations, + &shared.LiteFormation{ + ID: formation.ID, + SpinType: formation.SpinType, + NodeType: formation.NodeType, + NodeID: formation.NodeID, + FinalSymbols: formation.FinalSymbols, + LinkPositions: formation.LinkPositions, + Win: formation.Win, + RandPositions: formation.RandPositions, + NewNodeType: formation.NewNodeType, + }) + } + + liteNodeTree.Nodes = make([]*shared.LiteNode, 0) + for _, node := range m.NodeTree.Nodes { + liteNodeTree.Nodes = append(liteNodeTree.Nodes, + &shared.LiteNode{ + ID: node.ID, + Parent: node.Parent, + Children: node.Children, + Type: node.Type, + SpinType: node.SpinType, + Win: node.Win, + TotalWin: node.TotalWin, + ChildrenTotalWin: node.ChildrenTotalWin, + ProgressValue: node.ProgressValue, + ProgressMax: node.ProgressMax, + Bet: node.Bet, + }) + } + + return liteNodeTree +} + +// GetNodeTree returns raw node tree +func (m *Machine) GetNodeTree() *shared.NodeTree { + return m.NodeTree +} + +// Play plays once +func (m *Machine) Play(act *shared.Act) { + m.UpdateAct(act) + + if m.NodeTree.Act.Stay { + m.Stay() + } else { + m.Step() + } +} + +// Summary is called on simulator summary +func (m *Machine) Summary() string { + if _, ok := reg.Plugins[m.Theme]; !ok { + return "" + } + for _, t := range reg.Plugins[m.Theme] { + reflect.New(t.Elem()).Interface().(intf.Plugin).OnSummary(m) + } + return m.String("Summary") +} + +// GetSymbolLinkPays passes formation symbol link pay info to simulator +func (m *Machine) GetSymbolLinkPays() []map[int64]map[int64]float64 { + symbolLinkPays := make([]map[int64]map[int64]float64, 0) + for _, originFormation := range m.OriginFormations { + symbolLinkPays = append(symbolLinkPays, originFormation.SymbolLinkPay) + } + return symbolLinkPays +} + +// CursorType gets cursor node type +func (m *Machine) CursorType() string { + return m.CursorNode().Type +} + +// NextType gets next node type +func (m *Machine) NextType() string { + return m.NextNode().Type +} + +// ParentType gets parent node type +func (m *Machine) ParentType() string { + return m.ParentNode().Type +} + +// AncestorType gets ancestor node type +func (m *Machine) AncestorType() string { + return m.AncestorNode().Type +} + +func (m *Machine) UserData() *shared.UserData { + return m.NodeTree.UserData +} + +func (m *Machine) GetVector(minRatio, maxRatio float64, isForceWin bool) (int64, []int64) { + return m.MachineDesc.GetVector(m.Choice(), minRatio, maxRatio, isForceWin) +} + +func (m *Machine) GetDisplaySymbolsListString() string { + var dispaySymbolsList [][]int64 + for _, formation := range m.CursorNode().Formations { + dispaySymbolsList = append(dispaySymbolsList, formation.DisplaySymbols) + } + dispaySymbolsListBytes, err := json.Marshal(dispaySymbolsList) + if err != nil { + panic(err) + } + return string(dispaySymbolsListBytes) +} + +func (m *Machine) GetFinalSymbolsListString() string { + var finalSymbolsList [][]int64 + for _, formation := range m.CursorNode().Formations { + finalSymbolsList = append(finalSymbolsList, formation.FinalSymbols) + } + finalSymbolsListBytes, err := json.Marshal(finalSymbolsList) + if err != nil { + panic(err) + } + return string(finalSymbolsListBytes) +} + +func (m *Machine) GetFeaturesString() string { + var features []string + m.WalkTree(entity.WalkRootFirst, func(node *shared.Node) bool { + for _, feature := range node.Features { + if !feature.Visiable { + continue + } + + if mathx.In(feature.Type, features) { + continue + } + + features = append(features, feature.Type) + } + + return false + }) + + featuresBytes, err := json.Marshal(features) + if err != nil { + panic(err) + } + + return string(featuresBytes) +} diff --git a/gamesrv/slotspkg/slots/machine/node.go b/gamesrv/slotspkg/slots/machine/node.go new file mode 100644 index 0000000..9d9aa72 --- /dev/null +++ b/gamesrv/slotspkg/slots/machine/node.go @@ -0,0 +1,56 @@ +package machine + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "mongo.games.com/goserver/core/logger" +) + +// Node implements intf.Node +type Node struct { + *shared.Node + Machine *Machine +} + +func asNodeIntf(m *Machine, n *shared.Node) *Node { + return &Node{ + Node: n, + Machine: m, + } +} + +// SetBet implements intf.Node.SetBet +func (n *Node) SetBet(bet int64) intf.Node { + if n.GetID() == n.Machine.Cursor().GetID() { + logger.Logger.Warnf("It's too late to set bet in theme:%s, node type:%s", + n.Machine.Theme, n.Machine.Cursor().GetType()) + } + n.ForceBet = bet + n.Bet = bet + return n +} + +// AddPrepare implements intf.Node.AddPrepare +func (n *Node) AddPrepare() intf.Node { + n.NeedPrepare = true + return n +} + +func (n *Node) GetFormationWin() int64 { + var win int64 + for _, formation := range n.Formations { + win += formation.Win + } + return win +} + +func (n *Node) GetFeatureWin() int64 { + var featureWin int64 + for _, feature := range n.Features { + featureWin += feature.Win + } + return featureWin +} +func (n *Node) GetNoBase() bool { + return n.NoBase +} diff --git a/gamesrv/slotspkg/slots/playasrecorder.go b/gamesrv/slotspkg/slots/playasrecorder.go new file mode 100644 index 0000000..aaaa620 --- /dev/null +++ b/gamesrv/slotspkg/slots/playasrecorder.go @@ -0,0 +1,91 @@ +package slots + +import ( + "github.com/tomas-qstarrs/boost/cast" + "github.com/tomas-qstarrs/boost/randx" + "math" + "math/rand" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/session" + "mongo.games.com/game/gamesrv/slotspkg/internal/module/shared" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "mongo.games.com/game/gamesrv/slotspkg/slots/machine" +) + +func PlayAsRecorder(s *session.Session, betSizeIndex, betLevelIndex, betLineIndex int64) (r *shared.RecorderResult) { + r = &shared.RecorderResult{} + + var m intf.Spinner + genMachine := func() { + m = machine.NewMachine(s, "s.Theme", DataSet(s).Shell, false) + } + play := func() bool { + var vectorIndex int64 + var vector []int64 + act := &shared.Act{ + BetSizeIndex: betSizeIndex, + BetLevelIndex: betLevelIndex, + BetLineIndex: betLineIndex, + Vector: vector, + Mode: key.MachineModeRecorder, + VectorIndex: vectorIndex, + } + + genMachine() + + m.Play(act) + + for m.Next().GetType() != key.BaseSpin { + m.Play(act) + } + + //if m.TotalBet() == 0 { + // r.Poor = true + // return false + //} + return true + } + update := func() { + r.VectorType = m.RandVector().VectorType + r.VectorIndex = m.RandVector().VectorIndex + r.Vector = m.RandVector().Vector + r.ExpectedWinCoin = m.TotalWin() + r.ExpectedBetCoin = m.TotalBet() + r.SkipWinCheck = cast.ToBool(m.Value(key.MachineSkipWinCheck)) + + //p := player.Get(s) + //if isFree { + // //r.NewPoolValue = pool.Service(ServiceName(), s.Branch()).Get() + // //r.OldPoolValue = r.NewPoolValue + //} else { + // //betCoin := m.GetBetCoin() + // //win := m.TotalWin() + // //r.ReservePump = int64(float64(betCoin.GetRechargeCoin()) * DataSet(s).GetReservePumpRatio()) + // //delta := betCoin.GetRechargeCoin() - win - r.ReservePump + // //pool.Service(ServiceName(), s.Branch()).Inc(delta) + // + // //p.AddPersonalPool(s, betCoin, win) + // + // //r.NewPoolValue = pool.Service(ServiceName(), s.Branch()).Get() // 非精确值 TODO + // //r.OldPoolValue = r.NewPoolValue - delta + //} + } + if !play() { + return + } + update() + return +} +func NewPlayAsRecorder(s *session.Session) (r *shared.RecorderResult) { + r = &shared.RecorderResult{} + r.VectorIndex = 0 + r.Vector = []int64{rand.NewSource(randx.Int63n(math.MaxInt64)).Int63()} + //num := randx.Intn(100) + //if num < 20 { + // r.PlayMode = key.PlayModeVector + //} else if num < 60 { + // r.PlayMode = key.PlayModeClass + //} + //r.PlayMode = key.PlayModeClass + return +} diff --git a/gamesrv/slotspkg/slots/plugin/cashmania/base.go b/gamesrv/slotspkg/slots/plugin/cashmania/base.go new file mode 100644 index 0000000..ee73b7e --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/cashmania/base.go @@ -0,0 +1,279 @@ +package cashmania + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "mongo.games.com/game/gamesrv/slotspkg/slots/plugin/generic" +) + +type PluginBase struct { + generic.PluginBase +} + +// 特性数据 +type CustomMidInfo struct { + // 本次的symbol + ItemId int64 + // FreeSpin次数 + FreeSpinCount int64 + // 倍乘多少倍 + Multi int64 +} + +type CustomNudge struct { + // 本次的symbol + ItemId int64 +} + +type CustomRespin struct { + // 本次的symbol + ItemId int64 +} +type CustomFortune struct { + ForceRound int64 `json:"fr"` //第n次 +} + +// Theme is called to get feature theme +func (p *PluginBase) Theme() string { + return key.CashMania +} + +// Customs is called to get feature customs +func (p *PluginBase) Customs() []interface{} { + return append(p.PluginBase.Customs(), + &CustomMidInfo{}, + &CustomNudge{}, + &CustomRespin{}, + &Special{}, + &CustomFortune{}) +} + +// OnStepBegin is called on initializing a step +func (p *PluginBase) OnStepBegin(m intf.Master) { + +} + +func (p *PluginBase) BeforeDisplay(m intf.Master) { + switch m.Cursor().GetType() { + case key.BaseSpin: + p.changeItem(m, false) + case key.FreeSpin: + p.changeItem(m, true) + } + +} + +func (p *PluginBase) AfterDisplay(m intf.Master) { + isFreeSpin := m.Cursor().GetType() == key.FreeSpin + cursorFormation := m.CursorFormation() + symbols := cursorFormation.GetSymbols() + if m.Bool("Nudge") { + //todo 如果当前是nudge + if m.Bool("NudgeDown") { + symbols[9] = symbols[8] + symbols[8] = symbols[7] + symbols[7] = symbols[6] + symbols[6] = symbols[5] + symbols[5] = Descx(m).RandomMidItems(isFreeSpin, 1)[0] + m.Remove("NudgeDown") + } else if m.Bool("NudgeUp") { + symbols[5] = symbols[6] + symbols[6] = symbols[7] + symbols[7] = symbols[8] + symbols[8] = symbols[9] + symbols[9] = Descx(m).RandomMidItems(isFreeSpin, 1)[0] + m.Remove("NudgeUp") + } + m.Remove("Nudge") + } else if m.Bool("Respin") { + //todo 如果当前是respin + if m.Int64("respinsymbols") > 0 { + symbols[2] = m.Int64("respinsymbols") + symbols[12] = m.Int64("respinsymbols") + p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14) + m.Remove("respinsymbols") + } else if m.Bool("respinnohit") { + //生成左右不相同 中间有图标的不中奖结果 + p.Set2And12(m, isFreeSpin, symbols) + p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14) + m.Remove("respinnohit") + } + m.Remove("Respin") + } + cursorFormation.SetSymbols(symbols) +} + +func (p *PluginBase) AfterSpin(m intf.Master) { + switch m.Cursor().GetType() { + case key.BaseSpin: + p.checkMid(m, false) + case key.FreeSpin: + p.checkMid(m, true) + } +} + +func (p *PluginBase) Nudge(m intf.Master, symbols []int64) { + m.Set("Nudge", true) + if m.Randx().PR(0.5) { + //向下 + symbols[5] = symbols[6] + symbols[6] = symbols[7] + symbols[7] = symbols[8] + symbols[8] = symbols[9] + symbols[9] = 200 + m.Set("NudgeDown", true) + } else { + //向上 + symbols[9] = symbols[8] + symbols[8] = symbols[7] + symbols[7] = symbols[6] + symbols[6] = symbols[5] + symbols[5] = 200 + m.Set("NudgeUp", true) + } +} + +// 获取特性数据 +func (p *PluginBase) getCustomFortune(m intf.Master) *CustomFortune { + customFortune := new(CustomFortune) + if len(m.CursorCustoms(customFortune)) == 0 { + m.AddCursorFeature(customFortune) + } + return m.CursorCustom(customFortune).(*CustomFortune) +} +func (p *PluginBase) changeItem(m intf.Master, isFreeSpin bool) { + curFormation := m.CursorFormation() + symbols := curFormation.GetSymbols() + isWin := Descx(m).CheckWin(isFreeSpin) + + if isFreeSpin { + Fortune := p.getCustomFortune(m) + if Fortune.ForceRound == m.GetProgressValue() { + isWin = true + } + } + isNudge, isReSpin := Descx(m).GetNudgeAndReSpin(isWin) + if isWin { + itemId := Descx(m).GetWinItem(isFreeSpin) + symbols[2] = itemId + symbols[12] = itemId + + midItemId := Descx(m).GetWinMidItem(isFreeSpin) + symbols[7] = midItemId + + p.RandomItemsByMid(m, isFreeSpin, symbols, 5, 9) + p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14) + //base 触发nudge 中奖 + if isNudge { + p.Nudge(m, symbols) + } else if isReSpin { + //respin 触发respin 中奖 + m.Set("Respin", true) + p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14) + p.Set2And12(m, isFreeSpin, symbols) + m.Set("respinsymbols", itemId) + } + } else { + //base 触发nudge not hit + if isNudge { + leftRightItemId := Descx(m).RandomItems(isFreeSpin, 1)[0] + symbols[2] = leftRightItemId + symbols[12] = leftRightItemId + + p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14) + p.RandomItemsByMid(m, isFreeSpin, symbols, 6, 8) + } else if isReSpin { + m.Set("Respin", true) + //生成左右不相同 中间有图标的不中奖结果 + p.RandomItemsByMid(m, isFreeSpin, symbols, 5, 7, 9) + p.Set2And12(m, isFreeSpin, symbols) + p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14) + m.Set("respinnohit", true) + } else { + //随机0-2列中间有图标 + hit := m.Randx().Int63n(3) + switch hit { + case 0: + //中间没有图标 + p.RandomItemsByOther(m, isFreeSpin, symbols, 1, 3, 11, 13) + p.RandomItemsByMid(m, isFreeSpin, symbols, 6, 8) + case 1: + //中间一个图标 然后随机列的位置 + idx := m.Randx().Int63n(3) + 1 + if idx == 1 { + //第一列中间出 + //0,2,4,6,8,11,13 + p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 2, 4, 11, 13) + p.RandomItemsByMid(m, isFreeSpin, symbols, 6, 8) + } else if idx == 2 { + //第二列中间出 + //1,3,5,7,9,11,13 + p.RandomItemsByOther(m, isFreeSpin, symbols, 1, 3, 11, 13) + p.RandomItemsByMid(m, isFreeSpin, symbols, 5, 7, 9) + } else if idx == 3 { + //第三列中间出 + //1,3,6,8,10,12,14 + p.RandomItemsByOther(m, isFreeSpin, symbols, 1, 3, 10, 12, 14) + p.RandomItemsByMid(m, isFreeSpin, symbols, 6, 8) + } + case 2: + //两列出图标 随机一列不出 + notidx := m.Randx().Int63n(3) + 1 + if notidx == 1 { + //第一列中间不出 + //1,3,5,7,9,10,12,14 + p.RandomItemsByOther(m, isFreeSpin, symbols, 1, 3, 10, 12, 14) + p.RandomItemsByMid(m, isFreeSpin, symbols, 5, 7, 9) + } else if notidx == 2 { + //第二列中间不出 + //0,2,4,6,8,10,12,14 + p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 4, 10, 14) + p.Set2And12(m, isFreeSpin, symbols) + p.RandomItemsByMid(m, isFreeSpin, symbols, 6, 8) + } else if notidx == 3 { + //第三列中间不出 + //0,2,4,5,7,9,11,13 + p.RandomItemsByOther(m, isFreeSpin, symbols, 0, 2, 4, 11, 13) + p.RandomItemsByMid(m, isFreeSpin, symbols, 5, 7, 9) + } + } + } + } + curFormation.SetSymbols(symbols) +} +func (p *PluginBase) Set2And12(m intf.Master, isFreeSpin bool, symbols []int64) { + items := Descx(m).RandomTwoDifItem(isFreeSpin) + symbols[2] = items[0] + symbols[12] = items[1] +} + +func (p *PluginBase) checkMid(m intf.Master, isFreeSpin bool) { + curFormation := m.CursorFormation() + win := curFormation.GetWin() + if win <= 0 { + return + } + + symbols := curFormation.GetSymbols() + multi, freeSpinCount := Descx(m).GetMidItemInfo(symbols[7]) + + //if multi > 1 { + // curFormation.SetWin(win * multi) + //} + + m.AddCursorFeature(&CustomMidInfo{ + ItemId: symbols[7], + Multi: multi, + FreeSpinCount: freeSpinCount, + }).SetWin(win * (multi - 1)) + + if freeSpinCount > 0 { + if isFreeSpin { + m.AddProgress(freeSpinCount) + m.AddCursorFeature(&generic.CustomExtraFreeSpin{ExtraTimes: freeSpinCount}).SetLifetime(1) + } else { + ForceRound := m.Randx().Int63n(freeSpinCount) + m.AddNodeFeature(m.AddNodeOnCursor(key.FreeSpin, freeSpinCount).GetID(), &CustomFortune{ForceRound: ForceRound}) + } + } +} diff --git a/gamesrv/slotspkg/slots/plugin/cashmania/common.go b/gamesrv/slotspkg/slots/plugin/cashmania/common.go new file mode 100644 index 0000000..d9bbe15 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/cashmania/common.go @@ -0,0 +1,16 @@ +package cashmania + +import "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + +func (p *PluginBase) RandomItemsByMid(m intf.Master, isFreeSpin bool, symbols []int64, poss ...int) { + items := Descx(m).RandomMidItems(isFreeSpin, len(poss)) + for i, pos := range poss { + symbols[pos] = items[i] + } +} +func (p *PluginBase) RandomItemsByOther(m intf.Master, isFreeSpin bool, symbols []int64, poss ...int) { + items := Descx(m).RandomItems(isFreeSpin, len(poss)) + for i, pos := range poss { + symbols[pos] = items[i] + } +} diff --git a/gamesrv/slotspkg/slots/plugin/cashmania/descx.go b/gamesrv/slotspkg/slots/plugin/cashmania/descx.go new file mode 100644 index 0000000..bc71eac --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/cashmania/descx.go @@ -0,0 +1,197 @@ +package cashmania + +import ( + "github.com/tomas-qstarrs/boost/randx" + "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" +) + +type descx struct { + *randx.Randx + *desc.NodeDesc +} + +func Descx(m intf.Master) *descx { + return &descx{ + Randx: m.Randx(), + NodeDesc: m.Desc(), + } +} + +// 判断是否触发respin +func (n descx) CheckWin(isFreeSpin bool) bool { + // 读取配置 + sheet := n.DefaultSheet("Others") + // 转化数据 + rows, ok := sheet.([]*structs.CashManiaOthers) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "CashMania", "Others")) + } + + if isFreeSpin { + return randx.RandPR(n.Randx, rows[0].FreeWinPro) + } else { + return randx.RandPR(n.Randx, rows[0].BaseWinPro) + } +} + +// 获取中奖图标id +func (n descx) GetWinItem(isFreeSpin bool) int64 { + // 读取配置 + sheet := n.Sheet("WinItem", "Weight") + // 转化数据 + rows, ok := sheet.([]*structs.CashManiaWinItemWeight) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "CashMania", "WinItem")) + } + + weights := make([]float64, 0) + for _, v := range rows { + var weight float64 + if isFreeSpin { + weight = v.FreeWeight + } else { + weight = v.BaseWeight + } + weights = append(weights, weight) + } + index := randx.RandWeight(n.Randx, weights) + + return rows[index].ItemID +} + +func (n descx) RandomItems(isFreeSpin bool, num int) []int64 { + // 读取配置 + sheet := n.Sheet("RandomItem", "Weight") + // 转化数据 + rows, ok := sheet.([]*structs.CashManiaRandomItemWeight) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "CashMania", "RandomItem")) + } + + weights := make([]float64, 0) + for _, v := range rows { + var weight float64 + if isFreeSpin { + weight = v.FreeWeight + } else { + weight = v.BaseWeight + } + weights = append(weights, weight) + } + var items []int64 + for i := 0; i < num; i++ { + index := randx.RandWeight(n.Randx, weights) + items = append(items, rows[index].ItemID) + } + return items +} + +// 随机图标id +func (n descx) RandomTwoDifItem(isFreeSpin bool) []int64 { + // 读取配置 + sheet := n.Sheet("RandomItem", "Weight") + // 转化数据 + rows, ok := sheet.([]*structs.CashManiaRandomItemWeight) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "CashMania", "RandomItem")) + } + + weights := make([]float64, 0) + for _, v := range rows { + var weight float64 + if isFreeSpin { + weight = v.FreeWeight + } else { + weight = v.BaseWeight + } + weights = append(weights, weight) + } + indices := randx.RandShuffleWeights(n.Randx, 2, weights) + var vals = make([]int64, len(indices)) + for i, v := range indices { + vals[i] = rows[v].ItemID + } + return vals +} +func (n descx) GetWinMidItem(isFreeSpin bool) int64 { + // 读取配置 + sheet := n.Sheet("WinMid", "Weight") + // 转化数据 + rows, ok := sheet.([]*structs.CashManiaWinMidWeight) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "CashMania", "WinMid")) + } + + weights := make([]float64, 0) + for _, v := range rows { + var weight float64 + if isFreeSpin { + weight = v.FreeWeight + } else { + weight = v.BaseWeight + } + weights = append(weights, weight) + } + index := randx.RandWeight(n.Randx, weights) + + return rows[index].ItemID +} +func (n descx) RandomMidItems(isFreeSpin bool, num int) []int64 { + // 读取配置 + sheet := n.Sheet("RandomMid", "Weight") + // 转化数据 + rows, ok := sheet.([]*structs.CashManiaRandomMidWeight) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "CashMania", "RandomMid")) + } + + weights := make([]float64, 0) + for _, v := range rows { + var weight float64 + if isFreeSpin { + weight = v.FreeWeight + } else { + weight = v.BaseWeight + } + weights = append(weights, weight) + } + var items []int64 + for i := 0; i < num; i++ { + index := randx.RandWeight(n.Randx, weights) + items = append(items, rows[index].ItemID) + } + return items +} +func (n descx) GetMidItemInfo(itemId int64) (int64, int64) { + // 读取配置 + sheet := n.DefaultSheet("MidItemInfo") + // 转化数据 + rows, ok := sheet.(map[int64]*structs.CashManiaMidItemInfo) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "CashMania", "MidItemInfo")) + } + + row, ok := rows[itemId] + if !ok { + panic(errors.ConfigKeyNotFound.ErrorWith(n.Theme, "CashMania", itemId)) + } + + return row.Multi, row.FreeSpinCount +} +func (n descx) GetNudgeAndReSpin(isWin bool) (bool, bool) { + // 读取配置 + sheet := n.DefaultSheet("Others") + // 转化数据 + rows, ok := sheet.([]*structs.CashManiaOthers) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "CashMania", "Others")) + } + if isWin { + return randx.RandPR(n.Randx, rows[0].WinNudgePro), randx.RandPR(n.Randx, rows[0].WinRespinPro) + } else { + return randx.RandPR(n.Randx, rows[0].NoWinNudgePro), randx.RandPR(n.Randx, rows[0].NoWinRespinPro) + } +} diff --git a/gamesrv/slotspkg/slots/plugin/cashmania/init.go b/gamesrv/slotspkg/slots/plugin/cashmania/init.go new file mode 100644 index 0000000..6ff10cc --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/cashmania/init.go @@ -0,0 +1,9 @@ +package cashmania + +var Plugins = []interface{}{ + &PluginBase{}, +} + +var SimulatorPlugins = []interface{}{ + &PluginSimulator{}, +} diff --git a/gamesrv/slotspkg/slots/plugin/cashmania/simulator.go b/gamesrv/slotspkg/slots/plugin/cashmania/simulator.go new file mode 100644 index 0000000..b44ad1c --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/cashmania/simulator.go @@ -0,0 +1,65 @@ +package cashmania + +import ( + "bytes" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "mongo.games.com/game/gamesrv/slotspkg/slots/plugin/generic" +) + +// PluginSimulator is derived from generic.PluginBase +type PluginSimulator struct { + generic.PluginBase +} + +// SimulatorSummary is to store simulator info +type SimulatorSummary struct { + TotalBet int64 +} + +// Theme implements generic.PluginBase.Theme +func (p *PluginSimulator) Theme() string { + return key.CashMania +} + +// Customs implements generic.PluginBase.Customs +func (p *PluginSimulator) Customs() []interface{} { + return []interface{}{ + &SimulatorSummary{}, + } +} +func (p *PluginSimulator) getSummary(m intf.Master) *SimulatorSummary { + if len(m.RootFeatures(&SimulatorSummary{})) == 0 { + m.AddRootFeature(&SimulatorSummary{}).SetVisiable(false) + } + return m.RootCustom(&SimulatorSummary{}).(*SimulatorSummary) +} + +func (p *PluginSimulator) expireSummary(m intf.Master) { + features := m.RootFeatures(&SimulatorSummary{}) + for _, feature := range features { + feature.SetLifetime(0) + } +} + +func (p *PluginSimulator) OnStepEnd(m intf.Master) { + summary := p.getSummary(m) + curType := m.Cursor().GetType() + + if curType == key.BaseSpin { + summary.TotalBet += m.Bet() + } + +} + +// OnSummary implements generic.PluginBase.OnSummary +func (p *PluginSimulator) OnSummary(m intf.Master) { + //summary := p.getSummary(m) + defer p.expireSummary(m) + + var b bytes.Buffer + + b.WriteString("----------------------------------- \n") + + m.SetSummary(b.String()) +} diff --git a/gamesrv/slotspkg/slots/plugin/cashmania/tospecial.go b/gamesrv/slotspkg/slots/plugin/cashmania/tospecial.go new file mode 100644 index 0000000..6f6a33f --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/cashmania/tospecial.go @@ -0,0 +1,32 @@ +package cashmania + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "mongo.games.com/game/gamesrv/slotspkg/slots/plugin/generic" +) + +type PluginSpecial struct { + generic.PluginBase +} + +// Theme implements generic.PluginBase.Theme +func (p *PluginSpecial) Theme() string { + return key.CashMania +} + +// Special +type Special struct { +} + +// 获取特性数据 +func (p *PluginSpecial) getCustomSpecial(m intf.Master) *Special { + customSpecial := new(Special) + if len(m.CursorCustoms(customSpecial)) == 0 { + m.AddCursorFeature(customSpecial) + } + return m.CursorCustom(customSpecial).(*Special) +} +func (p *PluginSpecial) AfterSpin(m intf.Master) { + +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunedragon/base.go b/gamesrv/slotspkg/slots/plugin/fortunedragon/base.go new file mode 100644 index 0000000..9e78828 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunedragon/base.go @@ -0,0 +1,142 @@ +package fortunedragon + +import ( + "github.com/tomas-qstarrs/boost/randx" + "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "mongo.games.com/game/gamesrv/slotspkg/slots/plugin/generic" +) + +type PluginBase struct { + generic.PluginBase +} + +// Theme is called to get feature theme +func (p *PluginBase) Theme() string { + return key.FortuneDragon +} + +// Customs is called to get feature customs +func (p *PluginBase) Customs() []interface{} { + return append(p.PluginBase.Customs(), + &CustomFortune{}, + &Special{}) +} + +func (p *PluginBase) OnStepBegin(m intf.Master) { + if m.Next().GetType() == key.BaseSpin { + isFreeSpin, addTimes := Descx(m).TiggerFreeSpin(m.Choice()) + if isFreeSpin { + m.Set(key.MachineFormationSeqsDesc, key.FreeSpin) + m.Set(TriggerFreespin, true) + node := m.UpdateCursor2NewType(key.FreeSpin, addTimes) + Fortune := &CustomFortune{} + Fortune.FreeNumMax = addTimes + Fortune.FreeNumTrigger = addTimes + Fortune.FreeSpinNum = addTimes + Fortune.ForceRound = m.Randx().Int63n(addTimes-1) + 1 + m.AddNodeFeature(node.GetID(), Fortune).SetLifetime(addTimes) + } + } else { + Fortune := getCustomFortune(m) + if m.GetProgressValue() == Fortune.ForceRound { + m.Set(key.MachineFormationSeqsDesc, SureWinFreeSpin) + } + } +} + +func (p *PluginBase) BeforeDisplay(m intf.Master) { + p.getMustHitLine(m) +} +func (p *PluginBase) getMustHitLine(m intf.Master) { + if m.Cursor().GetType() == key.BaseSpin && m.Choice() == RoundTypeMustHitMoreCost { + if !m.IsWinInBeforeDisplay() { + m.CursorFormation().SetSymbols([]int64{3, 7, 2, 5, 7, 5, 5, 7, 7}) + } + } +} + +func (p *PluginBase) AfterSpin(m intf.Master) { + switch m.Cursor().GetType() { + case key.BaseSpin: + p.getBaseSpinMultiplier(m) + case key.FreeSpin: + p.getFreeSpinMultiplier(m) + } + Fortune := getCustomFortune(m) + Fortune.FreeSpinNum-- + if !m.Bool(TriggerFreespin) { + Fortune.FreeNumTrigger = 0 + } else { + m.Set(TriggerFreespin, false) + } +} +func (p *PluginBase) getBaseSpinMultiplier(m intf.Master) { + FortuneDragonBaseMultiplier := m.Desc().DefaultSheet("BaseMultiplier").([]*structs.FortuneDragonBaseMultiplier) + hit := float64(m.CursorFormation().GetWin()) / float64(m.Bet()) + var hitEle = SymbolEmpty + for _, multiplier := range FortuneDragonBaseMultiplier { + if hit >= multiplier.WinRateMin && hit < multiplier.WinRateMax { + eleIdx := randx.RandWeight(m.Randx(), multiplier.MultiplierWeights) + hitEle = multiplier.ItemIds[eleIdx] + break + } + } + var MultipleAxis []int64 + switch hitEle { + case SymbolX2, SymbolX5, SymbolX10: + MultipleAxis = []int64{SymbolEmpty, hitEle, SymbolEmpty} + case SymbolEmpty: + MultipleAxis = []int64{m.Randx().Int63n(3) + SymbolX2, hitEle, m.Randx().Int63n(3) + SymbolX2} + } + + var totalMultiple int64 = 1 + if len(MultipleAxis) == 3 { + if multi, ok := SymbolMap[MultipleAxis[1]]; ok { + if multi != 0 { + totalMultiple = multi + } + } + } + win := m.CursorFormation().GetWin() + sp := getCustomFortune(m) + sp.MultipleAxis = MultipleAxis + m.CursorFeature(sp).SetWin(win * (totalMultiple - 1)) +} +func (p *PluginBase) getFreeSpinMultiplier(m intf.Master) { + FreeMultiplierCount := m.Desc().DefaultSheet("FreeMultiplierCount").([]*structs.FortuneDragonFreeMultiplierCount) + var FreeMultiplierWeight []int64 + for _, i2 := range FreeMultiplierCount { + FreeMultiplierWeight = append(FreeMultiplierWeight, i2.Weight) + } + FreeMultiplierIdx := randx.RandWeight(m.Randx(), FreeMultiplierWeight) + UseFreeMultiplier := FreeMultiplierCount[FreeMultiplierIdx] + FortuneDragonFreeMultiplier := m.Desc().DefaultSheet("FreeMultiplier").([]*structs.FortuneDragonFreeMultiplier) + var FortuneDragonFreeMultiplierWeight []int64 + for _, multiplier := range FortuneDragonFreeMultiplier { + FortuneDragonFreeMultiplierWeight = append(FortuneDragonFreeMultiplierWeight, multiplier.Weight) + } + count := int(UseFreeMultiplier.MultiplierCount) + var MultiplierArr = []int64{SymbolEmpty, SymbolEmpty, SymbolEmpty, SymbolEmpty, SymbolEmpty} + for i := 0; i < count; i++ { + idx := randx.RandWeight(m.Randx(), FortuneDragonFreeMultiplierWeight) + if count == 2 { + MultiplierArr[i*2+1] = FortuneDragonFreeMultiplier[idx].ItemID + } else { + MultiplierArr[i*2] = FortuneDragonFreeMultiplier[idx].ItemID + } + } + var totalMultiple int64 + if len(MultiplierArr) == 5 { + for _, axi := range MultiplierArr { + if multi, ok := SymbolMap[axi]; ok { + totalMultiple += multi + } + } + } + win := m.CursorFormation().GetWin() + sp := getCustomFortune(m) + sp.MultipleAxis = MultiplierArr + m.CursorFeature(sp).SetWin(win * (totalMultiple - 1)) +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunedragon/choose_wheel.go b/gamesrv/slotspkg/slots/plugin/fortunedragon/choose_wheel.go new file mode 100644 index 0000000..1846355 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunedragon/choose_wheel.go @@ -0,0 +1,28 @@ +package fortunedragon + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "mongo.games.com/game/gamesrv/slotspkg/slots/plugin/generic" +) + +type PluginChooseWheel struct { + generic.PluginBase +} + +func (p *PluginChooseWheel) Theme() string { + return key.FortuneDragon +} + +func (p *PluginChooseWheel) OnStepBegin(m intf.Master) { + if m.Choice() != RoundTypeMustHitMoreCost { + return + } + if !m.Next().GetNoBase() || m.Next().GetProgressValue() == 0 { + m.SetRatio(key.MachineRatioMoreCoinSameBet, float64(Descx(m).GetSureWinBetMultiplier())) + } + if m.Next().GetType() == key.BaseSpin { + m.Set(key.MachineFormationSeqsDesc, "SureWinBaseSpin") + } + +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunedragon/common.go b/gamesrv/slotspkg/slots/plugin/fortunedragon/common.go new file mode 100644 index 0000000..8fe5f33 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunedragon/common.go @@ -0,0 +1,33 @@ +package fortunedragon + +const ( + SymbolWild int64 = 1 + SymbolX2 int64 = 8 + SymbolX5 int64 = 9 + SymbolX10 int64 = 10 + SymbolEmpty int64 = 200 +) + +var SymbolMap = map[int64]int64{ + SymbolX2: 2, + SymbolX5: 5, + SymbolX10: 10, + SymbolEmpty: 0, +} + +const ( + TriggerFreespin string = "TriggerFreespin" + SureWinFreeSpin string = "SureWinFreeSpin" +) +const ( + RoundTypeBaseSpin = iota + RoundTypeMustHitMoreCost // 100% 必中模式 花费更多 +) + +type CustomFortune struct { + FreeSpinNum int64 `json:"fsn"` //剩余freespin + FreeNumMax int64 `json:"fnm"` //总次数 + FreeNumTrigger int64 `json:"fnt"` //新增freespin + ForceRound int64 `json:"fr"` //第n次 + MultipleAxis []int64 `json:"ma,omitempty"` //倍乘轴 +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunedragon/descx.go b/gamesrv/slotspkg/slots/plugin/fortunedragon/descx.go new file mode 100644 index 0000000..9653717 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunedragon/descx.go @@ -0,0 +1,55 @@ +package fortunedragon + +import ( + "github.com/tomas-qstarrs/boost/randx" + "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/errors" + "mongo.games.com/game/gamesrv/slotspkg/slots/desc" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" +) + +type descx struct { + *randx.Randx + *desc.NodeDesc +} + +func Descx(m intf.Master) *descx { + return &descx{ + Randx: m.Randx(), + NodeDesc: m.Desc(), + } +} + +// 判断是否触发FreeSpin +func (n descx) TiggerFreeSpin(choice int64) (bool, int64) { + // 读取配置 + sheet := n.DefaultSheet("Others") + // 转化数据 + rows, ok := sheet.([]*structs.FortuneDragonOthers) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "FortuneDragon", "Others")) + } + if choice == RoundTypeMustHitMoreCost { + return randx.RandPR(n.Randx, rows[0].SureWinFreespinTriggerPro), rows[0].FreeSpinCount + } else { + return randx.RandPR(n.Randx, rows[0].FreespinTriggerPro), rows[0].FreeSpinCount + } +} +func (n descx) GetSureWinBetMultiplier() int64 { + sheet := n.DefaultSheet("Others") + // 转化数据 + rows, ok := sheet.([]*structs.FortuneDragonOthers) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "FortuneDragon", "Others")) + } + return rows[0].SureWinBetMultiplier +} + +// 获取特性数据 +func getCustomFortune(m intf.Master) *CustomFortune { + customFortune := new(CustomFortune) + if len(m.CursorCustoms(customFortune)) == 0 { + m.AddCursorFeature(customFortune) + } + return m.CursorCustom(customFortune).(*CustomFortune) +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunedragon/init.go b/gamesrv/slotspkg/slots/plugin/fortunedragon/init.go new file mode 100644 index 0000000..2e61e98 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunedragon/init.go @@ -0,0 +1,10 @@ +package fortunedragon + +var Plugins = []interface{}{ + &PluginBase{}, + &PluginChooseWheel{}, + &PluginSpecial{}, +} +var SimulatorPlugins = []interface{}{ + &PluginSimulator{}, +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunedragon/simulator.go b/gamesrv/slotspkg/slots/plugin/fortunedragon/simulator.go new file mode 100644 index 0000000..56f5a49 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunedragon/simulator.go @@ -0,0 +1,69 @@ +package fortunedragon + +import ( + "bytes" + "fmt" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "mongo.games.com/game/gamesrv/slotspkg/slots/plugin/generic" +) + +// PluginSimulator is derived from generic.PluginBase +type PluginSimulator struct { + generic.PluginBase +} + +// SimulatorSummary is to store simulator info +type SimulatorSummary struct { + FreeZeroCount int +} + +// Theme implements generic.PluginBase.Theme +func (p *PluginSimulator) Theme() string { + return key.FortuneDragon +} + +// Customs implements generic.PluginBase.Customs +func (p *PluginSimulator) Customs() []interface{} { + return []interface{}{ + &SimulatorSummary{}, + } +} +func (p *PluginSimulator) getSummary(m intf.Master) *SimulatorSummary { + if len(m.RootFeatures(&SimulatorSummary{})) == 0 { + m.AddRootFeature(&SimulatorSummary{}).SetVisiable(false) + } + return m.RootCustom(&SimulatorSummary{}).(*SimulatorSummary) +} + +func (p *PluginSimulator) expireSummary(m intf.Master) { + features := m.RootFeatures(&SimulatorSummary{}) + for _, feature := range features { + feature.SetLifetime(0) + } +} + +func (p *PluginSimulator) OnStepEnd(m intf.Master) { + summary := p.getSummary(m) + Fortune := getCustomFortune(m) + if Fortune.FreeSpinNum == 0 && m.Cursor().GetType() == key.FreeSpin { + win := m.Cursor().GetTotalWin() + if win == 0 { + summary.FreeZeroCount++ + } + } +} + +// OnSummary implements generic.PluginBase.OnSummary +func (p *PluginSimulator) OnSummary(m intf.Master) { + summary := p.getSummary(m) + defer p.expireSummary(m) + + var b bytes.Buffer + + b.WriteString("----------------------------------- \n") + + b.WriteString(fmt.Sprintf("FreeZeroCount: %v \n", summary.FreeZeroCount)) + + m.SetSummary(b.String()) +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunedragon/tospecial.go b/gamesrv/slotspkg/slots/plugin/fortunedragon/tospecial.go new file mode 100644 index 0000000..3b830c8 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunedragon/tospecial.go @@ -0,0 +1,43 @@ +package fortunedragon + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "mongo.games.com/game/gamesrv/slotspkg/slots/plugin/generic" +) + +type PluginSpecial struct { + generic.PluginBase +} + +// Theme implements generic.PluginBase.Theme +func (p *PluginSpecial) Theme() string { + return key.FortuneDragon +} + +// Special +type Special struct { + FreeSpinNum int64 `json:"fsn,omitempty"` //剩余freespin + FreeNumMax int64 `json:"fnm,omitempty"` //总次数 + FreeNumTrigger int64 `json:"fnt,omitempty"` //新增freespin + MultipleAxis []int64 `json:"ma,omitempty"` //倍乘轴 +} + +// 获取特性数据 +func (p *PluginSpecial) getCustomSpecial(m intf.Master) *Special { + customSpecial := new(Special) + if len(m.CursorCustoms(customSpecial)) == 0 { + m.AddCursorFeature(customSpecial) + } + return m.CursorCustom(customSpecial).(*Special) +} +func (p *PluginSpecial) AfterSpin(m intf.Master) { + Fortune := getCustomFortune(m) + sp := p.getCustomSpecial(m) + sp.MultipleAxis = Fortune.MultipleAxis + if Fortune.FreeNumMax > 0 { + sp.FreeSpinNum = Fortune.FreeSpinNum + sp.FreeNumMax = Fortune.FreeNumMax + sp.FreeNumTrigger = Fortune.FreeNumTrigger + } +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunemouse/base.go b/gamesrv/slotspkg/slots/plugin/fortunemouse/base.go new file mode 100644 index 0000000..f0dd523 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunemouse/base.go @@ -0,0 +1,125 @@ +package fortunemouse + +import ( + "github.com/tomas-qstarrs/boost/randx" + "mongo.games.com/game/gamesrv/slotspkg/internal/generic/key" + "mongo.games.com/game/gamesrv/slotspkg/slots/intf" + "mongo.games.com/game/gamesrv/slotspkg/slots/plugin/generic" +) + +type PluginBase struct { + generic.PluginBase +} + +type CustomMultiple struct { +} + +type CustomRespin struct { + // 是否触发Respin + IsTrigger bool +} + +func (p *PluginBase) getCustomRespin(m intf.Master) *CustomRespin { + customRespin := new(CustomRespin) + if len(m.CursorCustoms(customRespin)) == 0 { + m.AddCursorFeature(customRespin) + } + return m.CursorCustom(customRespin).(*CustomRespin) +} + +// Theme is called to get feature theme +func (p *PluginBase) Theme() string { + return key.FortuneMouse +} + +// Customs is called to get feature customs +func (p *PluginBase) Customs() []interface{} { + return append(p.PluginBase.Customs(), + &CustomRespin{}, + &CustomMultiple{}, + &CustomSuperStack{}, + &Special{}) +} + +// OnStepBegin is called on initializing a step +func (p *PluginBase) OnStepBegin(m intf.Master) { + m.Set(IsTriggerRespin, false) + switch m.Next().GetType() { + case key.BaseSpin: + if Descx(m).TriggerRespin() { + m.Set(key.MachineFormationSeqsDesc, ReSpin) + m.Set(IsTriggerRespin, true) + } + } +} + +// BeforeDisplay is called before display +func (p *PluginBase) BeforeDisplay(m intf.Master) { + trigger := m.Bool(IsTriggerRespin) + typ := m.Cursor().GetType() + if !(trigger || typ == ReSpin) { + return + } + // 保证Respin一三轴图标完全相同 + formation := m.CursorFormation() + symbols := formation.GetSymbols() + if trigger || m.Randx().PR(0.3) { + var randints = []int64{2, 3, 4, 5, 6, 7} + randints = randx.RandShuffle(m.Randx(), randints) + idx1, idx2 := randints[0], randints[1] + symbols[0], symbols[1], symbols[2] = idx1, idx1, idx1 + symbols[6], symbols[7], symbols[8] = idx2, idx2, idx2 + } + formation.SetSymbols(symbols) +} + +// AfterSpin is called after spin +func (p *PluginBase) AfterSpin(m intf.Master) { + p.checkKeepRespin(m) + p.checkMultipleWin(m) +} + +// 中奖则结束Respin +func (p *PluginBase) checkKeepRespin(m intf.Master) { + trigger := m.Bool(IsTriggerRespin) + curType := m.Cursor().GetType() + if !(trigger || curType == ReSpin) { + return + } + + feature := p.getCustomRespin(m) + feature.IsTrigger = trigger + + // 中奖了就结束 + formation := m.CursorFormation() + win := formation.GetWin() + if win > 0 { + return + } + // 没中奖则添加Respin节点 + switch curType { + case key.BaseSpin: + m.AddNodeOnCursor(ReSpin, 1) + case ReSpin: + m.AddProgress(1) + } +} + +// 全屏wild +func (p *PluginBase) checkMultipleWin(m intf.Master) { + formation := m.CursorFormation() + win := formation.GetWin() + if win <= 0 { + return + } + symbols := m.CursorFormation().GetSymbols() + count := 0 + for _, i2 := range symbols { + if i2 == SymbolWild { + count++ + } + } + if count == len(symbols) { + m.AddCursorFeature(&CustomMultiple{}).SetWin(Descx(m).GetExtraWin() * m.GetBetCoin().Coin) + } +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunemouse/common.go b/gamesrv/slotspkg/slots/plugin/fortunemouse/common.go new file mode 100644 index 0000000..a53a66d --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunemouse/common.go @@ -0,0 +1,15 @@ +package fortunemouse + +const ( + SymbolWild int64 = 1 + SymbolSuperStack1 int64 = 8 +) + +const ( + ReSpin string = "ReSpin" +) + +const ( + IsTriggerRespin string = "IsTriggerRespin" + CheatTriggerRespin string = "CheatTriggerRespin" +) diff --git a/gamesrv/slotspkg/slots/plugin/fortunemouse/descx.go b/gamesrv/slotspkg/slots/plugin/fortunemouse/descx.go new file mode 100644 index 0000000..75bf5b4 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunemouse/descx.go @@ -0,0 +1,39 @@ +package fortunemouse + +import ( + "github.com/tomas-qstarrs/boost/randx" + "qstar_server/internal/exported/excel2go/structs" + "qstar_server/internal/generic/errors" + "qstar_server/service/slots/desc" + "qstar_server/service/slots/intf" +) + +type descx struct { + *randx.Randx + *desc.NodeDesc +} + +func Descx(m intf.Master) *descx { + return &descx{ + Randx: m.Randx(), + NodeDesc: m.Desc(), + } +} + +// 是否触发Respin +func (n descx) TriggerRespin() bool { + sheet := n.DefaultSheet("Others") + rows, ok := sheet.([]*structs.FortuneMouseOthers) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "FortuneMouse", "Others")) + } + return randx.RandPR(n.Randx, rows[0].RespinTriggerPro) +} +func (n descx) GetExtraWin() int64 { + sheet := n.DefaultSheet("Others") + rows, ok := sheet.([]*structs.FortuneMouseOthers) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "FortuneMouse", "Others")) + } + return rows[0].ExtraWin +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunemouse/init.go b/gamesrv/slotspkg/slots/plugin/fortunemouse/init.go new file mode 100644 index 0000000..95fea77 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunemouse/init.go @@ -0,0 +1,7 @@ +package fortunemouse + +var Plugins = []interface{}{ + &PluginBase{}, + &PluginSuperStack{}, + &PluginSpecial{}, +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunemouse/super_stack.go b/gamesrv/slotspkg/slots/plugin/fortunemouse/super_stack.go new file mode 100644 index 0000000..6e5b2a0 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunemouse/super_stack.go @@ -0,0 +1,68 @@ +package fortunemouse + +import ( + "github.com/tomas-qstarrs/boost/mathx" + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" +) + +type CustomSuperStack struct { + SrcSymbol1 int64 + FinalSymbol1 int64 +} + +type PluginSuperStack struct { + generic.PluginBase +} + +// Theme implements generic.PluginBase.Theme +func (p *PluginSuperStack) Theme() string { + return key.FortuneMouse +} + +// OnInit implements generic.PluginBase.OnInit +func (p *PluginSuperStack) OnInit(m intf.Master) { + p.initStack(m) +} + +// BeforeDisplay is called before display +func (p *PluginSuperStack) BeforeDisplay(m intf.Master) { + trigger := m.Bool(IsTriggerRespin) + typ := p.GetCurStatus(m) + if !(trigger || typ == ReSpin) { + return + } + // 生成本轮需要替换的图标 + p.initStack(m) + superStack := m.RootCustom(&CustomSuperStack{}).(*CustomSuperStack) + p.TranslateFormation(m, superStack) +} + +// TranslateFormation translate formation +func (p *PluginSuperStack) TranslateFormation(m intf.Master, stacks *CustomSuperStack) { + formations := m.CursorFormations() + for _, f := range formations { + symbols := f.GetSymbols() + symbols = mathx.Replace(symbols, stacks.SrcSymbol1, stacks.FinalSymbol1) + f.SetSymbols(symbols) + } +} + +// 生成SuperStack(注意:不能和Party一样在onStepEnd里生成) +func (p *PluginSuperStack) initStack(m intf.Master) { + if len(m.RootFeatures(&CustomSuperStack{})) == 0 { + m.AddRootFeature(&CustomSuperStack{}) + } + feature := m.RootCustom(&CustomSuperStack{}).(*CustomSuperStack) + feature.SrcSymbol1 = SymbolSuperStack1 + feature.FinalSymbol1 = generic.Descx(m).SuperStackSymbol("") +} + +func (p *PluginSuperStack) GetCurStatus(m intf.Master) string { + t := m.Cursor().GetType() + if t == "Root" { + return key.BaseSpin + } + return t +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunemouse/tospecial.go b/gamesrv/slotspkg/slots/plugin/fortunemouse/tospecial.go new file mode 100644 index 0000000..affb7d9 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunemouse/tospecial.go @@ -0,0 +1,57 @@ +package fortunemouse + +import ( + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" +) + +type PluginSpecial struct { + generic.PluginBase +} + +// Theme implements generic.PluginBase.Theme +func (p *PluginSpecial) Theme() string { + return key.FortuneMouse +} + +// Special +type Special struct { + ReSpinStatus int `json:"rs,omitempty"` //0.默认 1.第一次触发 2.进行中 3.结束 + NewSuperStack []int64 `json:"nss,omitempty"` +} + +// 获取特性数据 +func (p *PluginSpecial) getCustomSpecial(m intf.Master) *Special { + customSpecial := new(Special) + if len(m.CursorCustoms(customSpecial)) == 0 { + m.AddCursorFeature(customSpecial) + } + return m.CursorCustom(customSpecial).(*Special) +} + +func (p *PluginSpecial) BeforeDisplay(m intf.Master) { + if !(m.Bool(IsTriggerRespin) || m.Cursor().GetType() == ReSpin) { + return + } + superStack := m.RootCustom(&CustomSuperStack{}).(*CustomSuperStack) + sp := p.getCustomSpecial(m) + sp.NewSuperStack = nil + sp.NewSuperStack = []int64{superStack.FinalSymbol1} +} +func (p *PluginSpecial) AfterSpin(m intf.Master) { + trigger := m.Bool(IsTriggerRespin) + curType := m.Cursor().GetType() + if m.Bool(IsTriggerRespin) || curType == ReSpin { + sp := p.getCustomSpecial(m) + if m.CursorFormation().GetWin() > 0 { + sp.ReSpinStatus = key.RespinFinish + return + } + if trigger { + sp.ReSpinStatus = key.RespinTrigger + } else { + sp.ReSpinStatus = key.RespinProcess + } + } +} diff --git a/gamesrv/slotspkg/slots/plugin/fortuneox/base.go b/gamesrv/slotspkg/slots/plugin/fortuneox/base.go new file mode 100644 index 0000000..f74d3d0 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortuneox/base.go @@ -0,0 +1,143 @@ +package fortuneox + +import ( + "github.com/tomas-qstarrs/boost/randx" + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" +) + +type PluginBase struct { + generic.PluginBase +} + +type CustomMultiple struct { + // 是否全线倍乘 + Multi int64 +} + +type CustomRespin struct { + // 是否触发Respin + IsTrigger bool +} + +func (p *PluginBase) getCustomRespin(m intf.Master) *CustomRespin { + customRespin := new(CustomRespin) + if len(m.CursorCustoms(customRespin)) == 0 { + m.AddCursorFeature(customRespin) + } + return m.CursorCustom(customRespin).(*CustomRespin) +} + +// Theme is called to get feature theme +func (p *PluginBase) Theme() string { + return key.FortuneOx +} + +// Customs is called to get feature customs +func (p *PluginBase) Customs() []interface{} { + return append(p.PluginBase.Customs(), + &CustomRespin{}, + &CustomMultiple{}, + &CustomSuperStack{}, + &Special{}) +} + +// OnStepBegin is called on initializing a step +func (p *PluginBase) OnStepBegin(m intf.Master) { + m.Set(IsTriggerRespin, false) + switch m.Next().GetType() { + case key.BaseSpin: + if m.Bool(CheatTriggerRespin) || Descx(m).TriggerRespin() { + m.Set(key.MachineFormationSeqsDesc, ReSpin) + m.Set(IsTriggerRespin, true) + } + } +} + +// BeforeDisplay is called before display +func (p *PluginBase) BeforeDisplay(m intf.Master) { + trigger := m.Bool(IsTriggerRespin) + typ := m.Cursor().GetType() + if !(trigger || typ == ReSpin) { + return + } + // 保证Respin一三轴图标完全相同 + formation := m.CursorFormation() + symbols := formation.GetSymbols() + if trigger { + var randints = []int64{2, 3, 4, 5, 6, 7} + randints = randx.RandShuffle(m.Randx(), randints) + idx1, idx2 := randints[0], randints[1] + symbols[0], symbols[1], symbols[2] = idx1, idx1, idx1 + symbols[3], symbols[4], symbols[5], symbols[6] = idx2, idx2, idx2, idx2 + } + for i := 0; i < 3; i++ { + symbols[7+i] = symbols[i] + } + formation.SetSymbols(symbols) +} + +// AfterSpin is called after spin +func (p *PluginBase) AfterSpin(m intf.Master) { + p.checkKeepRespin(m) + p.checkMultipleWin(m) +} + +// 中奖则结束Respin +func (p *PluginBase) checkKeepRespin(m intf.Master) { + trigger := m.Bool(IsTriggerRespin) + curType := m.Cursor().GetType() + if !(trigger || curType == ReSpin) { + return + } + + feature := p.getCustomRespin(m) + feature.IsTrigger = trigger + + // 中奖了就结束 + formation := m.CursorFormation() + win := formation.GetWin() + if win > 0 { + return + } + // 没中奖则添加Respin节点 + switch curType { + case key.BaseSpin: + m.AddNodeOnCursor(ReSpin, 1) + case ReSpin: + m.AddProgress(1) + } +} + +// 全图标相同则触发x10特性 +func (p *PluginBase) checkMultipleWin(m intf.Master) { + formation := m.CursorFormation() + win := formation.GetWin() + if win <= 0 { + return + } + + mx10 := true + onlySymbol := SymbolWild + symbols := formation.GetSymbols() + for _, s := range symbols { + if s != SymbolWild { + if onlySymbol == SymbolWild { + onlySymbol = s + } + if onlySymbol != s { + mx10 = false + break + } + } + } + + if mx10 { + multi := Descx(m).FullMulti() + //formation.SetWin(win * multi) + m.AddCursorFeature(&CustomMultiple{ + Multi: multi, + }).SetWin(win * (multi - 1)) + } +} diff --git a/gamesrv/slotspkg/slots/plugin/fortuneox/common.go b/gamesrv/slotspkg/slots/plugin/fortuneox/common.go new file mode 100644 index 0000000..cc2217a --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortuneox/common.go @@ -0,0 +1,16 @@ +package fortuneox + +const ( + SymbolWild int64 = 1 + SymbolSuperStack1 int64 = 8 + SymbolSuperStack2 int64 = 9 +) + +const ( + ReSpin string = "ReSpin" +) + +const ( + IsTriggerRespin string = "IsTriggerRespin" + CheatTriggerRespin string = "CheatTriggerRespin" +) diff --git a/gamesrv/slotspkg/slots/plugin/fortuneox/descx.go b/gamesrv/slotspkg/slots/plugin/fortuneox/descx.go new file mode 100644 index 0000000..671338b --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortuneox/descx.go @@ -0,0 +1,41 @@ +package fortuneox + +import ( + "github.com/tomas-qstarrs/boost/randx" + "qstar_server/internal/exported/excel2go/structs" + "qstar_server/internal/generic/errors" + "qstar_server/service/slots/desc" + "qstar_server/service/slots/intf" +) + +type descx struct { + *randx.Randx + *desc.NodeDesc +} + +func Descx(m intf.Master) *descx { + return &descx{ + Randx: m.Randx(), + NodeDesc: m.Desc(), + } +} + +// 是否触发Respin +func (n descx) TriggerRespin() bool { + sheet := n.DefaultSheet("Others") + rows, ok := sheet.([]*structs.FortuneOxOthers) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "FortuneOx", "Others")) + } + return randx.RandPR(n.Randx, rows[0].RespinTriggerPro) +} + +// 全屏倍乘倍数 +func (n descx) FullMulti() int64 { + sheet := n.DefaultSheet("Others") + rows, ok := sheet.([]*structs.FortuneOxOthers) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "FortuneOx", "Others")) + } + return rows[0].Multiplier +} diff --git a/gamesrv/slotspkg/slots/plugin/fortuneox/init.go b/gamesrv/slotspkg/slots/plugin/fortuneox/init.go new file mode 100644 index 0000000..6fc555e --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortuneox/init.go @@ -0,0 +1,11 @@ +package fortuneox + +var Plugins = []interface{}{ + &PluginBase{}, + &PluginSuperStack{}, + &PluginSpecial{}, +} + +var SimulatorPlugins = []interface{}{ + &PluginSimulator{}, +} diff --git a/gamesrv/slotspkg/slots/plugin/fortuneox/simulator.go b/gamesrv/slotspkg/slots/plugin/fortuneox/simulator.go new file mode 100644 index 0000000..f84b932 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortuneox/simulator.go @@ -0,0 +1,78 @@ +package fortuneox + +import ( + "bytes" + "fmt" + "github.com/tomas-qstarrs/boost/mathx" + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" +) + +// PluginSimulator is derived from generic.PluginBase +type PluginSimulator struct { + generic.PluginBase +} + +// SimulatorSummary is to store simulator info +type SimulatorSummary struct { + TotalBet int64 + RespinWin int64 + BaseWin int64 +} + +// Theme implements generic.PluginBase.Theme +func (p *PluginSimulator) Theme() string { + return key.FortuneOx +} + +// Customs implements generic.PluginBase.Customs +func (p *PluginSimulator) Customs() []interface{} { + return []interface{}{ + &SimulatorSummary{}, + } +} +func (p *PluginSimulator) getSummary(m intf.Master) *SimulatorSummary { + if len(m.RootFeatures(&SimulatorSummary{})) == 0 { + m.AddRootFeature(&SimulatorSummary{}).SetVisiable(false) + } + return m.RootCustom(&SimulatorSummary{}).(*SimulatorSummary) +} + +func (p *PluginSimulator) expireSummary(m intf.Master) { + features := m.RootFeatures(&SimulatorSummary{}) + for _, feature := range features { + feature.SetLifetime(0) + } +} + +func (p *PluginSimulator) OnStepEnd(m intf.Master) { + summary := p.getSummary(m) + curType := m.Cursor().GetType() + trigger := m.Bool(IsTriggerRespin) + + if curType == key.BaseSpin { + summary.TotalBet += m.Bet() + } + + if trigger || curType == ReSpin { + summary.RespinWin += m.Win() + } else { + summary.BaseWin += m.Win() + } +} + +// OnSummary implements generic.PluginBase.OnSummary +func (p *PluginSimulator) OnSummary(m intf.Master) { + summary := p.getSummary(m) + defer p.expireSummary(m) + + var b bytes.Buffer + + b.WriteString("----------------------------------- \n") + + b.WriteString(fmt.Sprintf("纯Base返奖率: %v \n", mathx.SafeDiv(summary.BaseWin, summary.TotalBet))) + b.WriteString(fmt.Sprintf("Respin返奖率: %v \n", mathx.SafeDiv(summary.RespinWin, summary.TotalBet))) + + m.SetSummary(b.String()) +} diff --git a/gamesrv/slotspkg/slots/plugin/fortuneox/super_stack.go b/gamesrv/slotspkg/slots/plugin/fortuneox/super_stack.go new file mode 100644 index 0000000..f2bc641 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortuneox/super_stack.go @@ -0,0 +1,73 @@ +package fortuneox + +import ( + "github.com/tomas-qstarrs/boost/mathx" + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" +) + +type CustomSuperStack struct { + SrcSymbol1 int64 + FinalSymbol1 int64 + SrcSymbol2 int64 + FinalSymbol2 int64 +} + +type PluginSuperStack struct { + generic.PluginBase +} + +// Theme implements generic.PluginBase.Theme +func (p *PluginSuperStack) Theme() string { + return key.FortuneOx +} + +// OnInit implements generic.PluginBase.OnInit +func (p *PluginSuperStack) OnInit(m intf.Master) { + p.initStack(m) +} + +// BeforeDisplay is called before display +func (p *PluginSuperStack) BeforeDisplay(m intf.Master) { + trigger := m.Bool(IsTriggerRespin) + typ := p.GetCurStatus(m) + if !(trigger || typ == ReSpin) { + return + } + // 生成本轮需要替换的图标 + p.initStack(m) + superStack := m.RootCustom(&CustomSuperStack{}).(*CustomSuperStack) + p.TranslateFormation(m, superStack) +} + +// TranslateFormation translate formation +func (p *PluginSuperStack) TranslateFormation(m intf.Master, stacks *CustomSuperStack) { + formations := m.CursorFormations() + for _, f := range formations { + symbols := f.GetSymbols() + symbols = mathx.Replace(symbols, stacks.SrcSymbol1, stacks.FinalSymbol1) + symbols = mathx.Replace(symbols, stacks.SrcSymbol2, stacks.FinalSymbol2) + f.SetSymbols(symbols) + } +} + +// 生成SuperStack(注意:不能和Party一样在onStepEnd里生成) +func (p *PluginSuperStack) initStack(m intf.Master) { + if len(m.RootFeatures(&CustomSuperStack{})) == 0 { + m.AddRootFeature(&CustomSuperStack{}) + } + feature := m.RootCustom(&CustomSuperStack{}).(*CustomSuperStack) + feature.SrcSymbol1 = SymbolSuperStack1 + feature.SrcSymbol2 = SymbolSuperStack2 + feature.FinalSymbol1 = generic.Descx(m).SuperStackSymbol("1") + feature.FinalSymbol2 = generic.Descx(m).SuperStackSymbol("2") +} + +func (p *PluginSuperStack) GetCurStatus(m intf.Master) string { + t := m.Cursor().GetType() + if t == "Root" { + return key.BaseSpin + } + return t +} diff --git a/gamesrv/slotspkg/slots/plugin/fortuneox/tospecial.go b/gamesrv/slotspkg/slots/plugin/fortuneox/tospecial.go new file mode 100644 index 0000000..d38b214 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortuneox/tospecial.go @@ -0,0 +1,57 @@ +package fortuneox + +import ( + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" +) + +type PluginSpecial struct { + generic.PluginBase +} + +// Theme implements generic.PluginBase.Theme +func (p *PluginSpecial) Theme() string { + return key.FortuneOx +} + +// Special +type Special struct { + ReSpinStatus int `json:"rs,omitempty"` //0.默认 1.第一次触发 2.进行中 3.结束 + NewSuperStack []int64 `json:"nss,omitempty"` +} + +// 获取特性数据 +func (p *PluginSpecial) getCustomSpecial(m intf.Master) *Special { + customSpecial := new(Special) + if len(m.CursorCustoms(customSpecial)) == 0 { + m.AddCursorFeature(customSpecial) + } + return m.CursorCustom(customSpecial).(*Special) +} + +func (p *PluginSpecial) BeforeDisplay(m intf.Master) { + if !(m.Bool(IsTriggerRespin) || m.Cursor().GetType() == ReSpin) { + return + } + superStack := m.RootCustom(&CustomSuperStack{}).(*CustomSuperStack) + sp := p.getCustomSpecial(m) + sp.NewSuperStack = nil + sp.NewSuperStack = []int64{superStack.FinalSymbol1, superStack.FinalSymbol2} +} +func (p *PluginSpecial) AfterSpin(m intf.Master) { + trigger := m.Bool(IsTriggerRespin) + curType := m.Cursor().GetType() + if m.Bool(IsTriggerRespin) || curType == ReSpin { + sp := p.getCustomSpecial(m) + if m.CursorFormation().GetWin() > 0 { + sp.ReSpinStatus = key.RespinFinish + return + } + if trigger { + sp.ReSpinStatus = key.RespinTrigger + } else { + sp.ReSpinStatus = key.RespinProcess + } + } +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunerabbit/base.go b/gamesrv/slotspkg/slots/plugin/fortunerabbit/base.go new file mode 100644 index 0000000..c07a1e4 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunerabbit/base.go @@ -0,0 +1,166 @@ +package fortunerabbit + +import ( + "github.com/tomas-qstarrs/boost/randx" + "qstar_server/internal/exported/excel2go/structs" + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" + "qstar_server/service/slots/types/cli" +) + +type PluginBase struct { + generic.PluginBase +} + +// Theme is called to get feature theme +func (p *PluginBase) Theme() string { + return key.FortuneRabbit +} + +// Customs is called to get feature customs +func (p *PluginBase) Customs() []interface{} { + return append(p.PluginBase.Customs(), + &CustomFortune{}, + &Special{}) +} + +// 获取特性数据 +func getCustomFortune(m intf.Master) *CustomFortune { + customFortune := new(CustomFortune) + if len(m.CursorCustoms(customFortune)) == 0 { + m.AddCursorFeature(customFortune) + } + return m.CursorCustom(customFortune).(*CustomFortune) +} + +func (p *PluginBase) OnStepBegin(m intf.Master) { + if m.Next().GetType() == key.BaseSpin { + isFreeSpin, addTimes := Descx(m).TiggerFreeSpin() + if isFreeSpin { + //logx.Error("OnStepBegin.isFreeSpin") + m.Set(key.MachineFormationSeqsDesc, key.FreeSpin) + m.Set(TriggerFreespin, true) + node := m.UpdateCursor2NewType(key.FreeSpin, addTimes) + Fortune := &CustomFortune{} + Fortune.FreeNumMax = addTimes + Fortune.FreeNumTrigger = addTimes + Fortune.ForceRound = m.Randx().Int63n(addTimes) + Fortune.FreeSpinNum = addTimes + m.AddNodeFeature(node.GetID(), Fortune).SetLifetime(addTimes) + } + } +} + +func (p *PluginBase) BeforeDisplay(m intf.Master) { + p.forceRound(m) + p.randCash(m) +} + +func (p *PluginBase) forceRound(m intf.Master) { + if m.Next().GetType() == key.FreeSpin { + Fortune := getCustomFortune(m) + //logx.Errorf("%v ----- %v ", m.GetProgressValue(), Fortune.ForceRound) + if m.GetProgressValue() == Fortune.ForceRound { + ForceCashCountWeight := m.Desc().DefaultSheet("ForceCashCountWeight").([]*structs.FortuneRabbitForceCashCountWeight) + var weight []float64 + for _, fcc := range ForceCashCountWeight { + weight = append(weight, fcc.Weight) + } + idx := randx.RandWeight(m.Randx(), weight) + useConf := ForceCashCountWeight[idx] + var reelRand = [3]int64{m.Randx().RangeInt63n(0, 1), m.Randx().RangeInt63n(0, 1), m.Randx().RangeInt63n(0, 1)} + var reelCount = [3]int64{} + var slots_result = [][]int64{ + {SymbolEmpty, SymbolEmpty, SymbolEmpty}, + {SymbolEmpty, SymbolEmpty, SymbolEmpty, SymbolEmpty}, + {SymbolEmpty, SymbolEmpty, SymbolEmpty}} + MatrixForm := m.CursorFormation().GetMatrixForm() + for i := 0; i < int(useConf.Count); i++ { + random_idx := m.Randx().Int63n(3) + //logx.Error("========forceRound=====77=====", random_idx) + //logx.Errorf("========forceRound=====77=%v===%v=", reelCount[random_idx], MatrixForm[random_idx]) + if reelCount[random_idx] == MatrixForm[random_idx] { + i-- + } else { + fromIdx := MatrixForm[random_idx] + if reelRand[random_idx] == 0 { + slots_result[random_idx][fromIdx-1-reelCount[random_idx]] = SymbolCash + } else { + slots_result[random_idx][reelCount[random_idx]] = SymbolCash + } + reelCount[random_idx]++ + } + } + var items []int64 + for _, int64s := range slots_result { + for _, i3 := range int64s { + items = append(items, i3) + } + } + m.CursorFormation().SetSymbols(items) + } + } +} +func (p *PluginBase) randCash(m intf.Master) { + symbols := m.CursorFormation().GetSymbols() + var prize = make([]float64, len(symbols)) + var count int + for i, symbol := range symbols { + if symbol == SymbolCash { + count++ + prize[i] = 1 + } + } + CashPrizeWeight := m.Desc().DefaultSheet("CashPrizeWeight").([]*structs.FortuneRabbitCashPrizeWeight) + var Weight, NoWinWeight, PrizeValue []float64 + for _, prizeWeight := range CashPrizeWeight { + Weight = append(Weight, prizeWeight.Weight) + NoWinWeight = append(NoWinWeight, prizeWeight.NoWinWeight) + PrizeValue = append(PrizeValue, prizeWeight.PrizeValue) + } + for i, i2 := range prize { + if i2 == 1 { + var idx int + if count >= 5 { + idx = randx.RandWeight(m.Randx(), Weight) + } else { + idx = randx.RandWeight(m.Randx(), NoWinWeight) + } + prize[i] = PrizeValue[idx] + } + } + Fortune := getCustomFortune(m) + Fortune.Prize = cli.ToItemsFloat64(m.CursorFormation().GetMatrixForm(), prize) +} +func (p *PluginBase) AfterSpin(m intf.Master) { + Fortune := getCustomFortune(m) + if m.Cursor().GetType() == key.FreeSpin { + //logx.Error("FreeSpinNum --- ", Fortune.FreeSpinNum) + Fortune.FreeSpinNum-- + if !m.Bool(TriggerFreespin) { + Fortune.FreeNumTrigger = 0 + } + } + var cash_item_total_prize float64 + var count int + for _, float64s := range Fortune.Prize { + for _, f := range float64s { + if f > 0 { + cash_item_total_prize += f + count++ + } + } + } + if count < 5 { + cash_item_total_prize = 0 + } + if cash_item_total_prize > 0 { + Reward := int64(cash_item_total_prize * float64(m.GetBetCoin().GetCoin())) + if m.Cursor().GetType() == key.FreeSpin { + m.CursorFeature(&CustomFortune{}).SetWin(Reward) + } else { + m.AddCursorFeature(&CustomFortune{}).SetWin(Reward) + } + } +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunerabbit/common.go b/gamesrv/slotspkg/slots/plugin/fortunerabbit/common.go new file mode 100644 index 0000000..4f162f7 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunerabbit/common.go @@ -0,0 +1,17 @@ +package fortunerabbit + +const ( + TriggerFreespin string = "TriggerFreespin" +) +const ( + SymbolCash int64 = 8 + SymbolEmpty int64 = 200 +) + +type CustomFortune struct { + FreeSpinNum int64 `json:"fsn"` //剩余freespin + FreeNumMax int64 `json:"fnm"` //总次数 + FreeNumTrigger int64 `json:"fnt"` //新增freespin + ForceRound int64 `json:"fr"` //第n次 + Prize [][]float64 `json:"pe,omitempty"` +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunerabbit/descx.go b/gamesrv/slotspkg/slots/plugin/fortunerabbit/descx.go new file mode 100644 index 0000000..b39fb79 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunerabbit/descx.go @@ -0,0 +1,34 @@ +package fortunerabbit + +import ( + "github.com/tomas-qstarrs/boost/randx" + "qstar_server/internal/exported/excel2go/structs" + "qstar_server/internal/generic/errors" + "qstar_server/service/slots/desc" + "qstar_server/service/slots/intf" +) + +type descx struct { + *randx.Randx + *desc.NodeDesc +} + +func Descx(m intf.Master) *descx { + return &descx{ + Randx: m.Randx(), + NodeDesc: m.Desc(), + } +} + +// 判断是否触发FreeSpin +func (n descx) TiggerFreeSpin() (bool, int64) { + // 读取配置 + sheet := n.DefaultSheet("Others") + // 转化数据 + rows, ok := sheet.([]*structs.FortuneRabbitOthers) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "FortuneRabbit", "Others")) + } + //logx.Error("TiggerFreeSpin FreespinTriggerPro: ", rows[0].FreespinTriggerPro) + return randx.RandPR(n.Randx, rows[0].FreespinTriggerPro), rows[0].FreeSpinCount +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunerabbit/init.go b/gamesrv/slotspkg/slots/plugin/fortunerabbit/init.go new file mode 100644 index 0000000..24e4f67 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunerabbit/init.go @@ -0,0 +1,8 @@ +package fortunerabbit + +var Plugins = []interface{}{ + &PluginBase{}, + &PluginSpecial{}, +} + +var SimulatorPlugins = []interface{}{} diff --git a/gamesrv/slotspkg/slots/plugin/fortunerabbit/tospecial.go b/gamesrv/slotspkg/slots/plugin/fortunerabbit/tospecial.go new file mode 100644 index 0000000..874e790 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunerabbit/tospecial.go @@ -0,0 +1,54 @@ +package fortunerabbit + +import ( + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" +) + +type PluginSpecial struct { + generic.PluginBase +} + +// Theme implements generic.PluginBase.Theme +func (p *PluginSpecial) Theme() string { + return key.FortuneRabbit +} + +// Special +type Special struct { + FreeSpinNum int64 `json:"fsn,omitempty"` //剩余freespin + FreeNumMax int64 `json:"fnm,omitempty"` //总次数 + FreeNumTrigger int64 `json:"fnt,omitempty"` //新增freespin + Prize [][]float64 `json:"pe,omitempty"` +} + +// 获取特性数据 +func (p *PluginSpecial) getCustomSpecial(m intf.Master) *Special { + customSpecial := new(Special) + if len(m.CursorCustoms(customSpecial)) == 0 { + m.AddCursorFeature(customSpecial) + } + return m.CursorCustom(customSpecial).(*Special) +} +func (p *PluginSpecial) BeforeDisplay(m intf.Master) { + Fortune := getCustomFortune(m) + for _, float64s := range Fortune.Prize { + for _, f := range float64s { + if f > 0 { + sp := p.getCustomSpecial(m) + sp.Prize = Fortune.Prize + return + } + } + } +} +func (p *PluginSpecial) AfterSpin(m intf.Master) { + Fortune := getCustomFortune(m) + if Fortune.FreeNumMax > 0 { + sp := p.getCustomSpecial(m) + sp.FreeSpinNum = Fortune.FreeSpinNum + sp.FreeNumMax = Fortune.FreeNumMax + sp.FreeNumTrigger = Fortune.FreeNumTrigger + } +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunetiger/base.go b/gamesrv/slotspkg/slots/plugin/fortunetiger/base.go new file mode 100644 index 0000000..f440678 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunetiger/base.go @@ -0,0 +1,273 @@ +package fortunetiger + +import ( + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" + "qstar_server/service/slots/types/cli" +) + +type PluginBase struct { + generic.PluginBase +} + +// Theme is called to get feature theme +func (p *PluginBase) Theme() string { + return key.FortuneTiger +} + +// Customs is called to get feature customs +func (p *PluginBase) Customs() []interface{} { + return append(p.PluginBase.Customs(), + &CustomFortune{}, + &Special{}) +} + +// OnStepBegin is called on initializing a step +func (p *PluginBase) OnStepBegin(m intf.Master) { + m.Remove(NewCollect) + typ := m.Next().GetType() + if typ == key.BaseSpin && (m.Bool(TriggerRespin) || Descx(m).TiggerRespin()) { + m.Set(key.MachineFormationSeqsDesc, ReSpin) + m.Set(TriggerRespin, true) + } else { + m.Set(TriggerRespin, false) + } +} + +func (p *PluginBase) BeforeDisplay(m intf.Master) { + typ := m.Cursor().GetType() + if typ == key.BaseSpin { + //todo base + p.InitRespinData(m) + } else if typ == ReSpin { + //todo respin + p.isRespinEnd(m) + p.SuperStack(m) + p.IsCollect(m) + } + +} + +func (p *PluginBase) AfterDisplay(m intf.Master) { + typ := m.Cursor().GetType() + tr := m.Bool(TriggerRespin) + + if typ == key.BaseSpin { + + } else if typ == ReSpin { + if m.Bool(IsRespinEnd) { + p.IsCollect(m) + } + p.UpdateCollect(m) + p.UpdateSymbols(m) + } + + if tr || typ == ReSpin { + p.UpdateRespinStatus(m) + } + +} + +func (p *PluginBase) AfterSpin(m intf.Master) { + p.CheckMulti(m) +} + +func (p *PluginBase) isRespinEnd(m intf.Master) { + if m.Bool(IsRespinEnd) { + m.CursorFormation().SetSymbols([]int64{ + SymbolEmpty, SymbolEmpty, SymbolEmpty, + SymbolEmpty, SymbolEmpty, SymbolEmpty, + SymbolEmpty, SymbolEmpty, SymbolEmpty}) + m.Remove(IsRespinEnd) + } +} + +func (p *PluginBase) InitRespinData(m intf.Master) { + // basespin触发respin初始化数据 + if m.Bool(TriggerRespin) { + fortune := getCustomFortune(m) + curFormation := m.CursorFormation() + fortune.Symbol = generic.Descx(m).SuperStackSymbol("") + fortune.Status = m.Bool(TriggerRespin) + fortune.Collects = make([]int64, 9) + p.SuperStack(m) + //触发时锁的图标 + symbols := curFormation.GetSymbols() + for i := 0; i < len(symbols); i++ { + if fortune.Collects[i] == 0 { + if symbols[i] == fortune.Symbol { + fortune.Collects[i] = fortune.Symbol + } + if symbols[i] == SymbolWild { + fortune.Collects[i] = SymbolWild + } + } + } + nowSymbols := m.CursorFormation().GetMatrixFormattedSymbols() + fortune.LastSymbols = nowSymbols + for i, symbol := range nowSymbols { + for i2, i3 := range symbol { + if i3 != SymbolEmpty { + fortune.AddLock = append(fortune.AddLock, []int{i, i2}) + } + } + } + } +} + +func (p *PluginBase) SuperStack(m intf.Master) { + fortune := getCustomFortune(m) + // basespin初始化数据 + curFormation := m.CursorFormation() + symbols := curFormation.GetSymbols() + for i := 0; i < len(symbols); i++ { + if symbols[i] == SymbolSuperStck { + symbols[i] = fortune.Symbol + } + } + curFormation.SetSymbols(symbols) +} + +func (p *PluginBase) IsCollect(m intf.Master) { + fortune := getCustomFortune(m) + // basespin初始化数据 + curFormation := m.CursorFormation() + // 收集 + newCollect := false + symbols := curFormation.GetSymbols() + var needSet bool + for i := 0; i < len(symbols); i++ { + if fortune.Collects[i] == 0 { + if (symbols[i] == fortune.Symbol || symbols[i] == SymbolWild) && !newCollect { + newCollect = true + } + } else if fortune.Collects[i] == fortune.Symbol && symbols[i] == SymbolWild { + symbols[i] = fortune.Symbol + needSet = true + } + } + if needSet { + curFormation.SetSymbols(symbols) + } + m.Set(NewCollect, newCollect) +} + +func (p *PluginBase) UpdateCollect(m intf.Master) { + // basespin初始化数据 + // 收集 + if m.Bool(NewCollect) { + fortune := getCustomFortune(m) + curFormation := m.CursorFormation() + symbols := curFormation.GetSymbols() + fortune.Lock = append(fortune.Lock, fortune.AddLock...) + var addLock []int64 + for i := 0; i < len(symbols); i++ { + if fortune.Collects[i] == 0 { + if symbols[i] == fortune.Symbol { + fortune.Collects[i] = fortune.Symbol + addLock = append(addLock, int64(i)) + } + if symbols[i] == SymbolWild { + fortune.Collects[i] = SymbolWild + addLock = append(addLock, int64(i)) + } + } + } + fortune.AddLock = cli.ToPoss(m.CursorFormation().GetMatrixForm(), addLock) + } + +} + +func (p *PluginBase) UpdateRespinStatus(m intf.Master) { + fortune := getCustomFortune(m) + curType := m.Cursor().GetType() + // 判断是否收满 + if !fortune.IsFull() { + if curType == key.BaseSpin && fortune.Status { + fortune.ReSpinStatus = key.RespinTrigger + m.AddNodeFeature(m.AddNodeOnCursor(ReSpin, 1).GetID(), &CustomFortune{ + Symbol: fortune.Symbol, + Collects: fortune.Collects, + LastSymbols: fortune.LastSymbols, + AddLock: fortune.AddLock, + }) + } + if curType == ReSpin { + if m.Bool(NewCollect) { + m.AddProgress(1) + fortune.ReSpinStatus = key.RespinProcess + } else { + fortune.ReSpinStatus = key.RespinFinish + } + } + } else { + // 如果收满了 就不触发了 + fortune.Status = false + fortune.ReSpinStatus = key.RespinFinish + } +} + +func (p *PluginBase) UpdateSymbols(m intf.Master) { + fortune := getCustomFortune(m) + curFormation := m.CursorFormation() + symbols := curFormation.GetSymbols() + // 替换最终图标 + for i := 0; i < len(symbols); i++ { + if fortune.Collects[i] > 0 { + symbols[i] = fortune.Collects[i] + } + } + curFormation.SetSymbols(symbols) + + fortune.LastSymbols = m.CursorFormation().GetMatrixFormattedSymbols() +} + +func (p *PluginBase) CheckMulti(m intf.Master) { + //判定是否全屏图标都一样 + fortune := getCustomFortune(m) + curFormation := m.CursorFormation() + fortune.LinePays = curFormation.GetLinePays() + fortune.Multi = 1 + win := curFormation.GetWin() + if win <= 0 { + return + } + if m.ProgressLeft() == 1 && !fortune.Status { + // 如果所有图标都在连线上 + payPos := make([]bool, 9) + payLines := curFormation.GetLinkPositions() + for _, line := range payLines { + for _, pos := range line.Positions { + payPos[pos] = true + } + } + mx10 := true + for _, val := range payPos { + if !val { + mx10 = false + break + } + } + if mx10 { + var X10 = SymbolWild + for _, val := range curFormation.GetSymbols() { + if X10 == SymbolWild && X10 != val { + X10 = val + } else if X10 != val && val != SymbolWild { + X10 = 100 + break + } + } + if X10 == SymbolWild { + X10 = 88 + } + fortune.Multi = Descx(m).FullMulti() + fortune.SpX10 = X10 + } + //curFormation.SetWin(win * fortune.Multi) + m.CursorFeature(fortune).SetWin(win * (fortune.Multi - 1)) + } else { + curFormation.SetWin(0) + } +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunetiger/common.go b/gamesrv/slotspkg/slots/plugin/fortunetiger/common.go new file mode 100644 index 0000000..ecca6fe --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunetiger/common.go @@ -0,0 +1,62 @@ +package fortunetiger + +import "qstar_server/service/slots/intf" + +// 图标 +const ( + SymbolWild int64 = 1 + SymbolSuperStck int64 = 8 + SymbolEmpty int64 = 200 +) + +// spin Type +const ReSpin string = "ReSpin" + +const TriggerRespin string = "TriggerRespin" +const NewCollect string = "NewCollect" + +const IsRespinEnd string = "IsRespinEnd" + +// 特性数据 +type CustomFortune struct { + // 本次的symbol + Symbol int64 `json:"symbol,omitempty"` + // 是否Respin + Status bool `json:"status,omitempty"` + // 是否5线全满倍乘 + Multi int64 `json:"multi,omitempty"` + // 已收集的图标 + Collects []int64 `json:"collects,omitempty"` + // 每线赔率 + LinePays []float64 `json:"linePays,omitempty"` + + ReSpinStatus int `json:"rss,omitempty"` + + SpX10 int64 `json:"sp_x10,omitempty"` + + LastSymbols [][]int64 `json:"last_symbols,omitempty"` + + Lock [][]int `json:"lock,omitempty"` + AddLock [][]int `json:"add_lock,omitempty"` +} + +// ReSpint特性判定是否全部满了 +func (fortune *CustomFortune) IsFull() bool { + isFull := true + for _, symbol := range fortune.Collects { + if symbol <= 0 { + isFull = false + break + } + } + return isFull +} + +// 获取特性数据 +func getCustomFortune(m intf.Master) *CustomFortune { + customFortune := new(CustomFortune) + if len(m.CursorCustoms(customFortune)) == 0 { + m.AddCursorFeature(customFortune) + } + return m.CursorCustom(customFortune).(*CustomFortune) +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunetiger/descx.go b/gamesrv/slotspkg/slots/plugin/fortunetiger/descx.go new file mode 100644 index 0000000..ce2104b --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunetiger/descx.go @@ -0,0 +1,45 @@ +package fortunetiger + +import ( + "github.com/tomas-qstarrs/boost/randx" + "qstar_server/internal/exported/excel2go/structs" + "qstar_server/internal/generic/errors" + "qstar_server/service/slots/desc" + "qstar_server/service/slots/intf" +) + +type descx struct { + *randx.Randx + *desc.NodeDesc +} + +func Descx(m intf.Master) *descx { + return &descx{ + Randx: m.Randx(), + NodeDesc: m.Desc(), + } +} + +// 判断是否触发respin +func (n descx) TiggerRespin() bool { + // 读取配置 + sheet := n.DefaultSheet("Others") + // 转化数据 + rows, ok := sheet.([]*structs.FortuneTigerOthers) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "FortuneTiger", "Others")) + } + return randx.RandPR(n.Randx, rows[0].RespinTriggerPro) +} + +// 获取全屏倍乘 +func (n descx) FullMulti() int64 { + // 读取配置 + sheet := n.DefaultSheet("Others") + // 转化数据 + rows, ok := sheet.([]*structs.FortuneTigerOthers) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "FortuneTiger", "Others")) + } + return rows[0].Multiplier +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunetiger/init.go b/gamesrv/slotspkg/slots/plugin/fortunetiger/init.go new file mode 100644 index 0000000..cca8600 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunetiger/init.go @@ -0,0 +1,11 @@ +package fortunetiger + +var Plugins = []interface{}{ + &PluginBase{}, + &PluginSpecialRespin{}, + &PluginSpecial{}, +} + +var SimulatorPlugins = []interface{}{ + &PluginSimulator{}, +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunetiger/simulator.go b/gamesrv/slotspkg/slots/plugin/fortunetiger/simulator.go new file mode 100644 index 0000000..935f24b --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunetiger/simulator.go @@ -0,0 +1,90 @@ +package fortunetiger + +import ( + "bytes" + "fmt" + "github.com/tomas-qstarrs/boost/mathx" + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" +) + +// PluginSimulator is derived from generic.PluginBase +type PluginSimulator struct { + generic.PluginBase +} + +// SimulatorSummary is to store simulator info +type SimulatorSummary struct { + TotalBet int64 + RespinWin int64 + BaseWin int64 + RespinTriggerCount int64 + RespinWinCount int64 +} + +// Theme implements generic.PluginBase.Theme +func (p *PluginSimulator) Theme() string { + return key.FortuneTiger +} + +// Customs implements generic.PluginBase.Customs +func (p *PluginSimulator) Customs() []interface{} { + return []interface{}{ + &SimulatorSummary{}, + } +} +func (p *PluginSimulator) getSummary(m intf.Master) *SimulatorSummary { + if len(m.RootFeatures(&SimulatorSummary{})) == 0 { + m.AddRootFeature(&SimulatorSummary{}).SetVisiable(false) + } + return m.RootCustom(&SimulatorSummary{}).(*SimulatorSummary) +} + +func (p *PluginSimulator) expireSummary(m intf.Master) { + features := m.RootFeatures(&SimulatorSummary{}) + for _, feature := range features { + feature.SetLifetime(0) + } +} + +func (p *PluginSimulator) OnStepEnd(m intf.Master) { + summary := p.getSummary(m) + curType := m.Cursor().GetType() + trigger := m.Bool(TriggerRespin) + + if curType == key.BaseSpin { + summary.TotalBet += m.Bet() + } + + if trigger || curType == ReSpin { + summary.RespinWin += m.Win() + if m.Win() > 0 { + summary.RespinWinCount++ + } + } else { + summary.BaseWin += m.Win() + } + + if trigger { + summary.RespinTriggerCount++ + } +} + +// OnSummary implements generic.PluginBase.OnSummary +func (p *PluginSimulator) OnSummary(m intf.Master) { + summary := p.getSummary(m) + defer p.expireSummary(m) + + var b bytes.Buffer + + b.WriteString("----------------------------------- \n") + + b.WriteString(fmt.Sprintf("纯Base返奖率: %v \n", mathx.SafeDiv(summary.BaseWin, summary.TotalBet))) + b.WriteString(fmt.Sprintf("Respin返奖率: %v \n", mathx.SafeDiv(summary.RespinWin, summary.TotalBet))) + b.WriteString(fmt.Sprintf("respin触发次数: %v \n", summary.RespinTriggerCount)) + b.WriteString(fmt.Sprintf("respin中奖次数: %v \n", summary.RespinWinCount)) + b.WriteString(fmt.Sprintf("respin不中奖概率: %v \n", 1-mathx.SafeDiv(summary.RespinWinCount, summary.RespinTriggerCount))) + + m.SetSummary(b.String()) +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunetiger/specialrespin.go b/gamesrv/slotspkg/slots/plugin/fortunetiger/specialrespin.go new file mode 100644 index 0000000..bd5fc1f --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunetiger/specialrespin.go @@ -0,0 +1,67 @@ +package fortunetiger + +import ( + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" + "qstar_server/service/slots/types/cli" +) + +type PluginSpecialRespin struct { + generic.PluginBase +} + +// Theme is called to get feature theme +func (p *PluginSpecialRespin) Theme() string { + return key.FortuneTiger +} +func (p *PluginSpecialRespin) GetNowSymbols(m intf.Master) [][]int64 { + fortune := getCustomFortune(m) + symbols := m.CursorFormation().GetSymbols() + for i := 0; i < len(symbols); i++ { + if fortune.Collects[i] > 0 { + symbols[i] = fortune.Collects[i] + } + } + return cli.ToItems(m.CursorFormation().GetMatrixForm(), symbols) +} +func (p *PluginSpecialRespin) BeforeDisplay(m intf.Master) { + if m.Cursor().GetType() == ReSpin && !m.Bool(NewCollect) { + symbolsarr := p.GetNowSymbols(m) + fortune := getCustomFortune(m) + win := m.IsWinInBeforeDisplayBySymbols(symbolsarr) + if win == 0 { + var lines = []int{0, 1, 2, 3, 4} + idx := m.Randx().Intn(len(lines)) + lineId := lines[idx] + + val200 := make(map[int][][]int) + allLines := m.CursorFormation().GetLineLines() + for id, line := range allLines { + if id == lineId { + for i2, i3 := range line { + if symbolsarr[i2][i3-1] == SymbolEmpty { + val200[id] = append(val200[id], []int{i2, int(i3) - 1}) + } + } + break + } + } + + newItem := [][]int64{{SymbolEmpty, SymbolEmpty, SymbolEmpty}, {SymbolEmpty, SymbolEmpty, SymbolEmpty}, + {SymbolEmpty, SymbolEmpty, SymbolEmpty}} + + for _, ints := range val200[lineId] { + newItem[ints[0]][ints[1]] = fortune.Symbol + } + + newSymbols := make([]int64, 0) + for _, colSymbols := range newItem { + newSymbols = append(newSymbols, colSymbols...) + } + fortune.ReSpinStatus = key.RespinProcess + m.CursorFormation().SetSymbols(newSymbols) + m.Set(IsRespinEnd, true) + } + } +} diff --git a/gamesrv/slotspkg/slots/plugin/fortunetiger/tospecial.go b/gamesrv/slotspkg/slots/plugin/fortunetiger/tospecial.go new file mode 100644 index 0000000..1a1212d --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/fortunetiger/tospecial.go @@ -0,0 +1,85 @@ +package fortunetiger + +import ( + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" +) + +type PluginSpecial struct { + generic.PluginBase +} + +// Theme implements generic.PluginBase.Theme +func (p *PluginSpecial) Theme() string { + return key.FortuneTiger +} + +// Special +type Special struct { + ReSpinStatus int `json:"rs,omitempty"` //0.默认 1.第一次触发 2.进行中 3.结束 + ReSpinSymbol int64 `json:"rsy,omitempty"` //图标(respin) + Lock [][]int `json:"l,omitempty"` //原来锁定的位置 + AddLock [][]int `json:"al,omitempty"` //新增锁定的位置 + X10 int64 `json:"x10,omitempty"` //100.不同图标 88.wild 其他类型.按当前单一中奖图标类型 + WinLines map[int][][]int `json:"wls,omitempty"` +} + +// 获取特性数据 +func (p *PluginSpecial) getCustomSpecial(m intf.Master) *Special { + customSpecial := new(Special) + if len(m.CursorCustoms(customSpecial)) == 0 { + m.AddCursorFeature(customSpecial) + } + return m.CursorCustom(customSpecial).(*Special) +} +func (p *PluginSpecial) AfterSpin(m intf.Master) { + if m.Bool(TriggerRespin) || m.Cursor().GetType() == ReSpin { + fortune := getCustomFortune(m) + sp := p.getCustomSpecial(m) + sp.ReSpinStatus = fortune.ReSpinStatus + sp.ReSpinSymbol = fortune.Symbol + sp.Lock = fortune.Lock + sp.AddLock = fortune.AddLock + sp.X10 = fortune.SpX10 + rewardInfo := m.CursorFormation().GetRewardInfo() + if rewardInfo != nil { + sp.WinLines = make(map[int][][]int) + for _, info := range rewardInfo { + sp.WinLines[info.Index] = info.Pos + } + } + + if sp.ReSpinStatus != key.RespinFinish { + m.CursorFormation().SetRewardInfo(nil) + } + + if m.Bool(TriggerRespin) { + m.CursorFormation().SetNewNodeType(ReSpin) + } + + //logx.Error("ReSpinStatus", sp.ReSpinStatus) + //logx.Error("LastSymbols", fortune.LastSymbols) + //logx.Error("Lock", sp.Lock) + //logx.Error("AddLock", sp.AddLock) + } else { + fortune := getCustomFortune(m) + sp := p.getCustomSpecial(m) + sp.X10 = fortune.SpX10 + } + displaySymbols := m.CursorFormation().GetDisplaySymbols() + for i, symbol := range displaySymbols { + if symbol == SymbolWild { + displaySymbols[i] = 0 + } + } + m.CursorFormation().SetDisplaySymbols(displaySymbols) + + finalSymbols := m.CursorFormation().GetFinalSymbols() + for i, symbol := range finalSymbols { + if symbol == SymbolWild { + finalSymbols[i] = 0 + } + } + m.CursorFormation().SetFinalSymbols(finalSymbols) +} diff --git a/gamesrv/slotspkg/slots/plugin/generic/base.go b/gamesrv/slotspkg/slots/plugin/generic/base.go new file mode 100644 index 0000000..27c2e02 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/generic/base.go @@ -0,0 +1,48 @@ +package generic + +import ( + "qstar_server/service/slots/intf" +) + +// PluginBase implements a default plugin for Plugin. +type PluginBase struct{} + +// Theme is called to get feature theme +func (p *PluginBase) Theme() string { return "" } + +// Customs is called to get feature customs +func (p *PluginBase) Customs() []interface{} { return []interface{}{} } + +// OnInit is called on initializing a theme +func (p *PluginBase) OnInit(intf.Master) {} + +// OnStepBegin is called on initializing a step +func (p *PluginBase) OnStepBegin(m intf.Master) {} + +// OnEnterNode is called after entering a node +func (p *PluginBase) OnEnterNode(intf.Master) {} + +// BeforeSpin is called before spin +func (p *PluginBase) BeforeSpin(intf.Master) {} + +// BeforeDisplay is called before display +func (p *PluginBase) BeforeDisplay(intf.Master) {} + +// AfterDisplay is called after display +func (p *PluginBase) AfterDisplay(intf.Master) {} + +// AfterSpin is called after spin +func (p *PluginBase) AfterSpin(intf.Master) {} + +// OnLeaveNode is called before leaving a node +func (p *PluginBase) OnLeaveNode(intf.Master) {} + +// OnStepEnd is called on finalizing a step +func (p *PluginBase) OnStepEnd(intf.Master) {} + +// OnSummary is called on simulator summary +func (p *PluginBase) OnSummary(intf.Master) {} + +// OnStay is called to do something out of normal step +func (p *PluginBase) OnStay(m intf.Master) { +} diff --git a/gamesrv/slotspkg/slots/plugin/generic/descx.go b/gamesrv/slotspkg/slots/plugin/generic/descx.go new file mode 100644 index 0000000..1882f0a --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/generic/descx.go @@ -0,0 +1,20 @@ +package generic + +import ( + "qstar_server/service/slots/desc" + "qstar_server/service/slots/intf" + + "github.com/tomas-qstarrs/boost/randx" +) + +type descx struct { + *randx.Randx + *desc.NodeDesc +} + +func Descx(m intf.Master) *descx { + return &descx{ + Randx: m.Randx(), + NodeDesc: m.Desc(), + } +} diff --git a/gamesrv/slotspkg/slots/plugin/generic/descx_jackpot.go b/gamesrv/slotspkg/slots/plugin/generic/descx_jackpot.go new file mode 100644 index 0000000..80424fe --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/generic/descx_jackpot.go @@ -0,0 +1,83 @@ +package generic + +import ( + "qstar_server/internal/exported/excel2go/structs" + "qstar_server/internal/generic/errors" +) + +func (n descx) JackpotBaseWin(typ int64, bet int64) int64 { + v := n.Sheet("Jackpot", "Prize") + rows, ok := v.([]*structs.JackpotPrize) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Jackpot", "Prize")) + } + for _, row := range rows { + if row.PrizeType == typ { + return row.StartPoint * bet + } + } + + return 0 +} + +func (n descx) JackpotStartPoints() map[int64]int64 { + v := n.Sheet("Jackpot", "Prize") + prizes, ok := v.([]*structs.JackpotPrize) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Jackpot", "Prize")) + } + startPoints := make(map[int64]int64) + for _, prize := range prizes { + startPoints[prize.PrizeType] = prize.StartPoint + } + return startPoints +} + +func (n descx) JackpotHasPipeIn(typ int64, bet int64) bool { + v := n.Sheet("Jackpot", "Prize") + prizes, ok := v.([]*structs.JackpotPrize) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Jackpot", "Prize")) + } + + for _, prize := range prizes { + if prize.PrizeType == typ { + return true + } + } + return false +} + +func (n descx) JackpotPipeIn(typ int64, bet int64) int64 { + v := n.Sheet("Jackpot", "Prize") + prizes, ok := v.([]*structs.JackpotPrize) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Jackpot", "Prize")) + } + + for _, prize := range prizes { + if prize.PrizeType == typ { + return prize.PipeIn * bet / 10000 + } + } + return 0 +} + +// GenericJackpotPrizeTypes returns all prize types +func (n descx) JackpotPrizeTypes() []int64 { + if !n.ExistSheet("Jackpot", "Prize") { + return nil + } + + v := n.Sheet("Jackpot", "Prize") + prizes, ok := v.([]*structs.JackpotPrize) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Jackpot", "Prize")) + } + types := make([]int64, 0, len(prizes)) + for _, prize := range prizes { + types = append(types, prize.PrizeType) + } + + return types +} diff --git a/gamesrv/slotspkg/slots/plugin/generic/descx_scatter.go b/gamesrv/slotspkg/slots/plugin/generic/descx_scatter.go new file mode 100644 index 0000000..463dddf --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/generic/descx_scatter.go @@ -0,0 +1,97 @@ +package generic + +import ( + "qstar_server/internal/exported/excel2go/structs" + "qstar_server/internal/generic/errors" +) + +const ( + // ScatterName freespin scatterName + ScatterName string = "Scatter" +) + +// GenericFreeSpin gets freespin bouts +func (n descx) FreeSpin(isFreeSpin bool, + count int64) int64 { + v := n.DefaultSheet("Scatter") + rows, ok := v.(map[int64]*structs.Scatter) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Scatter")) + } + + var index int64 = 0 + + for i, s := range rows { + if count >= s.ScatterCount { + if i > index { + index = i + } + } + } + + row, ok := rows[index] + if !ok { + panic(errors.ConfigKeyNotFound.ErrorWith(n.Theme, "Scatter", count)) + } + + var bout int64 + if isFreeSpin { + bout = row.FreeSpinExtraBouts + } else { + bout = row.FreeSpinBouts + } + + return bout +} + +// GenericScatterSymbol get scaatterSymbol +func (n descx) ScatterSymbol() []int64 { + sheet := n.DefaultSheet("Symbol") + content, ok := sheet.(map[int64]*structs.Symbol) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Symbol")) + } + scatterSymbols := make([]int64, 0) + for _, v := range content { + if v.Name == ScatterName { + scatterSymbols = append(scatterSymbols, v.ID) + } + } + if len(scatterSymbols) == 0 { + panic(errors.ConfigSheetNotFound.ErrorWith(n.Theme, "Symbol")) + } + return scatterSymbols +} + +// GenericScatterPayRate gets scatter pay rate +func (n descx) ScatterPayRate(isFreeSpin bool, count int64) int64 { + v := n.DefaultSheet("Scatter") + rows, ok := v.(map[int64]*structs.Scatter) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Scatter")) + } + + var index int64 = 0 + + for i, s := range rows { + if count >= s.ScatterCount { + if i > index { + index = i + } + } + } + + row, ok := rows[index] + if !ok { + panic(errors.ConfigKeyNotFound.ErrorWith(n.Theme, "Scatter", count)) + } + + var payRate int64 + if isFreeSpin { + payRate = row.FreePayrate + } else { + payRate = row.BasePayrate + } + + return payRate +} diff --git a/gamesrv/slotspkg/slots/plugin/generic/descx_super_stack.go b/gamesrv/slotspkg/slots/plugin/generic/descx_super_stack.go new file mode 100644 index 0000000..2349bcf --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/generic/descx_super_stack.go @@ -0,0 +1,40 @@ +package generic + +import ( + "fmt" + + "qstar_server/internal/exported/excel2go/structs" + "qstar_server/internal/generic/errors" + + "github.com/tomas-qstarrs/boost/randx" +) + +func (n descx) SuperStackSymbol(status string) int64 { + path := fmt.Sprintf("%s%s", "SuperStack", status) + v := n.Sheet(path, "Weight") + content, ok := v.([]*structs.SuperStackWeight) + if !ok { + panic(errors.ConfigTypeError.Error()) + } + var weights = make([]float64, 0, len(content)) + for _, v := range content { + weights = append(weights, v.Weight) + } + index := randx.RandWeight(n.Randx, weights) + return content[index].ItemID +} + +func (n descx) SuperStackStarSymbol(status string) int64 { + path := fmt.Sprintf("%s%s", "SuperStackStar", status) + v := n.Sheet(path, "Weight") + content, ok := v.([]*structs.SuperStackWeight) + if !ok { + panic(errors.ConfigTypeError.Error()) + } + var weights = make([]float64, 0, len(content)) + for _, v := range content { + weights = append(weights, v.Weight) + } + index := randx.RandWeight(n.Randx, weights) + return content[index].ItemID +} diff --git a/gamesrv/slotspkg/slots/plugin/generic/jackpot.go b/gamesrv/slotspkg/slots/plugin/generic/jackpot.go new file mode 100644 index 0000000..d99fba5 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/generic/jackpot.go @@ -0,0 +1,156 @@ +package generic + +import ( + "qstar_server/service/slots/intf" +) + +// PluginJackpot is derived from generic.PluginBase +type PluginJackpot struct { + PluginBase +} + +// CustomJackpotPools stores jackpot pools +type CustomJackpotPools struct { + Pools map[int64]int64 + StartPoints map[int64]int64 +} + +// CustomJackpotWin stores jackpot win results +type CustomJackpotWin struct { + Type int64 +} + +// Customs implements generic.PluginBase.Customs +func (p *PluginJackpot) Customs() []interface{} { + return []interface{}{ + &CustomJackpotPools{}, + &CustomJackpotWin{}, + } +} + +// OnInit implements generic.PluginBase.OnInit +func (p *PluginJackpot) OnInit(m intf.Master) { + if !p.Inited(m) { + p.InitPools(m) + } + custom := m.RootCustom(&CustomJackpotPools{}).(*CustomJackpotPools) + if custom.Pools == nil { + custom.Pools = map[int64]int64{} + } + p.setStartPoints(m) +} + +// BeforeSpin implements generic.PluginBase.BeforeSpin +func (p *PluginJackpot) BeforeSpin(m intf.Master) { + if !p.Inited(m) { + p.InitPools(m) + } +} + +// Inited returns if jackpot is inited +func (p *PluginJackpot) Inited(m intf.Master) bool { + return len(m.RootFeatures(&CustomJackpotPools{})) > 0 +} + +// InitPools inits all pools before spin +func (p *PluginJackpot) InitPools(m intf.Master) { + pools := make(map[int64]int64) + + types := Descx(m).JackpotPrizeTypes() + for _, typ := range types { + pools[typ] = 0 + } + + m.AddRootFeature(&CustomJackpotPools{ + Pools: pools, + }) +} + +func (p *PluginJackpot) OnStepEnd(m intf.Master) { +} + +// PipeInPools add some value to pool after bet +func (p *PluginJackpot) PipeInPools(m intf.Master) { + types := Descx(m).JackpotPrizeTypes() + for _, typ := range types { + if Descx(m).JackpotHasPipeIn(typ, m.Bet()) { + pipeIn := p.GetPipeIn(m, typ) + p.AppendPool(m, typ, pipeIn) + } + } +} + +// WinPool wins a specific type pool +func (p *PluginJackpot) WinPool(m intf.Master, typ int64) int64 { + return p.kernelWinPool(m, typ, 1, true, true, m.Bet()) +} + +func (p *PluginJackpot) WinPoolWithMulti(m intf.Master, typ int64, multi int64) int64 { + return p.kernelWinPool(m, typ, multi, true, true, m.Bet()) +} + +func (p *PluginJackpot) PureWinPool(m intf.Master, typ int64) int64 { + return p.kernelWinPool(m, typ, 1, false, true, m.Bet()) +} + +func (p *PluginJackpot) CalcWinPool(m intf.Master, typ int64) int64 { + return p.kernelWinPool(m, typ, 1, false, false, m.Bet()) +} + +func (p *PluginJackpot) CalcWinPoolWithBet(m intf.Master, typ int64, bet int64) int64 { + return p.kernelWinPool(m, typ, 1, false, false, bet) +} + +// kernelWinPool +// typ: 赢取挡位 +// multi: 额外倍数 +// withFeature: 是否添加Feature,也就是是否内置赢钱 +// withClear: 是否清空池子 + +func (p *PluginJackpot) kernelWinPool(m intf.Master, typ int64, multi int64, withFeature bool, withClear bool, bet int64) int64 { + hasPipeIn := Descx(m).JackpotHasPipeIn(typ, bet) + + basePrize := Descx(m).JackpotBaseWin(typ, bet) * multi + poolPrize := int64(0) + if hasPipeIn { + poolPrize = p.GetPool(m, typ) * multi + if withClear { + p.ClearPool(m, typ) + } + } + + prize := basePrize + poolPrize + + if withFeature { + m.AddCursorFeature(&CustomJackpotWin{Type: typ}).SetWin(prize).SetLifetime(1) + } + + return prize +} + +// GetPool gets a specific type pool's value +func (p *PluginJackpot) GetPool(m intf.Master, typ int64) int64 { + pools := m.RootCustom(&CustomJackpotPools{}).(*CustomJackpotPools).Pools + return pools[typ] +} + +// ClearPool sets a specific type pool's value +func (p *PluginJackpot) ClearPool(m intf.Master, typ int64) { + pools := m.RootCustom(&CustomJackpotPools{}).(*CustomJackpotPools).Pools + pools[typ] = 0 +} + +func (p *PluginJackpot) AppendPool(m intf.Master, typ int64, n int64) { + pools := m.RootCustom(&CustomJackpotPools{}).(*CustomJackpotPools).Pools + pools[typ] += n +} + +func (p *PluginJackpot) GetPipeIn(m intf.Master, typ int64) int64 { + return Descx(m).JackpotPipeIn(typ, m.Bet()) +} + +// setStartPoints sets start points into CustomJackpotPools +func (p *PluginJackpot) setStartPoints(m intf.Master) { + startPoints := Descx(m).JackpotStartPoints() + m.RootCustom(&CustomJackpotPools{}).(*CustomJackpotPools).StartPoints = startPoints +} diff --git a/gamesrv/slotspkg/slots/plugin/generic/scatter.go b/gamesrv/slotspkg/slots/plugin/generic/scatter.go new file mode 100644 index 0000000..b12258f --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/generic/scatter.go @@ -0,0 +1,91 @@ +package generic + +import ( + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + + "github.com/tomas-qstarrs/boost/mathx" +) + +// PluginScatter is derived from generic.PluginBase +type PluginScatter struct { + PluginBase +} + +// CustomExtraFreeSpin stores extra freespin +type CustomExtraFreeSpin struct { + ExtraTimes int64 +} + +// CustomScatterWin stores scatter win +type CustomScatterWin struct { +} + +// Customs implements generic.PluginBase.Customs +func (p *PluginScatter) Customs() []interface{} { + return []interface{}{ + &CustomExtraFreeSpin{}, + &CustomScatterWin{}, + } +} + +// AfterBaseSpin is called after base spin +func (p *PluginScatter) AfterBaseSpin(m intf.Master) { + addTimes, win := p.GetScatterInfo(m, false) + if addTimes > 0 { + m.AddNodeOnCursor(key.FreeSpin, addTimes) + } + if win > 0 { + m.AddCursorFeature(&CustomScatterWin{}).SetWin(win) + } +} + +// AfterSpin implements generic.PluginBase.AfterSpin +func (p *PluginScatter) AfterSpin(m intf.Master) { + switch m.Cursor().GetType() { + case key.BaseSpin: + p.AfterBaseSpin(m) + case key.FreeSpin: + p.AfterFreeSpin(m) + } +} + +// AfterFreeSpin is called after free spin +func (p *PluginScatter) AfterFreeSpin(m intf.Master) { + addTimes, win := p.GetScatterInfo(m, true) + if addTimes > 0 { + m.AddProgress(addTimes) + m.AddCursorFeature(&CustomExtraFreeSpin{ExtraTimes: addTimes}).SetLifetime(1) + } + if win > 0 { + m.AddCursorFeature(&CustomScatterWin{}).SetWin(win) + } +} + +// GetScatterInfo gets add free spin times & pay rate +func (p *PluginScatter) GetScatterInfo(m intf.Master, inFreeSpin bool) (int64, int64) { + var scatterCount int64 + symbols := m.CursorFormation().GetSymbols() + scatterSymbols := p.Scatters(m) + for _, scatterSymbol := range scatterSymbols { + scatterCount += int64(mathx.Count(scatterSymbol, symbols)) + } + + if scatterCount == 0 { + return 0, 0 + } + + freeSpinCount := Descx(m).FreeSpin(inFreeSpin, scatterCount) + + payRate := Descx(m).ScatterPayRate(inFreeSpin, scatterCount) + + win := m.Bet() * payRate + + return freeSpinCount, win +} + +// sscatters sets specific scatter symbols +// Default is find symbols named Scatter +func (p *PluginScatter) Scatters(m intf.Master) []int64 { + return Descx(m).ScatterSymbol() +} diff --git a/gamesrv/slotspkg/slots/plugin/generic/super_stack.go b/gamesrv/slotspkg/slots/plugin/generic/super_stack.go new file mode 100644 index 0000000..3272efd --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/generic/super_stack.go @@ -0,0 +1,79 @@ +package generic + +import ( + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + + "github.com/tomas-qstarrs/boost/mathx" +) + +const ( + // SuperStackOne2One means 1 replace 1 + SuperStackOne2One int64 = iota + // SuperStackOne2Col means 1 replace 1 col + SuperStackOne2Col +) + +// PluginSuperStack is derived from generic.PluginBase +type PluginSuperStack struct { + PluginBase +} + +// CustomSuperStack superstack feature +type CustomSuperStack struct { + SuperStack []*CustomSuperStackSymbol +} + +// CustomSuperStackSymbol spuerstack symbol +type CustomSuperStackSymbol struct { + SrcSymbol int64 + ReelRule int64 + FinalSymbols []int64 + FinalSymbol int64 +} + +// Customs implements generic.PluginBase.Customs +func (p *PluginSuperStack) Customs() []interface{} { + return []interface{}{ + &CustomSuperStack{}, + &CustomSuperStackSymbol{}, + } +} + +// TranslateFormation translate formation +func (p *PluginSuperStack) TranslateFormation(m intf.Master, stacks *CustomSuperStackSymbol) { + if stacks.ReelRule == SuperStackOne2One { + formations := m.CursorFormations() + for _, f := range formations { + symbols := f.GetSymbols() + symbols = mathx.Replace(symbols, stacks.SrcSymbol, stacks.FinalSymbol) + f.SetSymbols(symbols) + } + } else if stacks.ReelRule == SuperStackOne2Col { + formations := m.CursorFormations() + for _, f := range formations { + symbols := f.GetReelFormattedSymbols() + col := len(symbols) + for i := 0; i < col; i++ { + symbols[i] = mathx.Replace(symbols[i], stacks.SrcSymbol, stacks.FinalSymbols[i]) + } + f.SetFormattedSymbols(symbols) + } + } +} + +func (p *PluginSuperStack) GetNextStatus(m intf.Master) string { + t := m.Next().GetType() + if t == "Root" { + return key.BaseSpin + } + return t +} + +func (p *PluginSuperStack) GetCurStatus(m intf.Master) string { + t := m.Cursor().GetType() + if t == "Root" { + return key.BaseSpin + } + return t +} diff --git a/gamesrv/slotspkg/slots/plugin/init.go b/gamesrv/slotspkg/slots/plugin/init.go new file mode 100644 index 0000000..ab7fa8e --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/init.go @@ -0,0 +1,49 @@ +package plugin + +import ( + "qstar_server/internal/generic/global" + "qstar_server/service/slots/plugin/cashmania" + "qstar_server/service/slots/plugin/fortunedragon" + "qstar_server/service/slots/plugin/fortunemouse" + "qstar_server/service/slots/plugin/fortuneox" + "qstar_server/service/slots/plugin/fortunerabbit" + "qstar_server/service/slots/plugin/fortunetiger" + "qstar_server/service/slots/plugin/test" + "qstar_server/service/slots/reg" +) + +// Init registers all theme plugins to machine +func Init() { + reg.Register(fortuneox.Plugins...) + reg.Register(fortunetiger.Plugins...) + reg.Register(fortunerabbit.Plugins...) + reg.Register(fortunedragon.Plugins...) + reg.Register(fortunemouse.Plugins...) + reg.Register(cashmania.Plugins...) + reg.Register(test.Plugins...) + + if global.Mock { + reg.Register(fortuneox.SimulatorPlugins...) + reg.Register(fortunetiger.SimulatorPlugins...) + reg.Register(fortunerabbit.SimulatorPlugins...) + reg.Register(fortunedragon.SimulatorPlugins...) + reg.Register(cashmania.SimulatorPlugins...) + } +} + +// Close unregisters all theme plugins from machine +func Close() { + reg.Deregister(fortuneox.Plugins...) + reg.Deregister(fortunetiger.Plugins...) + reg.Deregister(fortunerabbit.Plugins...) + reg.Deregister(fortunedragon.Plugins...) + reg.Deregister(fortunemouse.Plugins...) + reg.Deregister(cashmania.Plugins...) + if global.Mock { + reg.Deregister(fortuneox.SimulatorPlugins...) + reg.Deregister(fortunetiger.SimulatorPlugins...) + reg.Deregister(fortunerabbit.SimulatorPlugins...) + reg.Deregister(fortunedragon.SimulatorPlugins...) + reg.Deregister(cashmania.SimulatorPlugins...) + } +} diff --git a/gamesrv/slotspkg/slots/plugin/test/base.go b/gamesrv/slotspkg/slots/plugin/test/base.go new file mode 100644 index 0000000..65cca57 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/test/base.go @@ -0,0 +1,69 @@ +package test + +import ( + "github.com/tomas-qstarrs/boost/randx" + "math" + "qstar_server/internal/exported/excel2go/structs" + "qstar_server/internal/generic/key" + "qstar_server/service/slots/intf" + "qstar_server/service/slots/plugin/generic" +) + +// PluginBase is derived from generic.PluginBase +type PluginBase struct { + generic.PluginBase +} + +const ( + PrizeTypeNormal = 1 + PrizeTypeJackpot = 2 +) + +// Theme implements generic.PluginBase.Theme +func (p *PluginBase) Theme() string { + return key.Test +} + +// Customs implements generic.PluginBase.Customs +func (p *PluginBase) Customs() []interface{} { + return append(p.PluginBase.Customs(), + &Test{}) +} + +// OnInit implements generic.PluginBase.OnInit +func (p *PluginBase) OnInit(m intf.Master) { +} + +// BeforeSpin implements generic.PluginBase.BeforeSpin +func (p *PluginBase) BeforeSpin(m intf.Master) { +} + +func (p *PluginBase) BeforeDisplay(m intf.Master) { +} + +func (p *PluginBase) AfterDisplay(m intf.Master) { + +} + +// AfterSpin implements generic.PluginBase.AfterSpin +func (p *PluginBase) AfterSpin(m intf.Master) { + var M float64 = 1.087 + var win float64 = 0 + TestRandomWeight := m.Desc().Sheet("Random", "Weight").([]*structs.TestRandomWeight) + var weight []float64 + for _, randomWeight := range TestRandomWeight { + weight = append(weight, randomWeight.Weight) + } + idx := randx.RandWeight(m.Randx(), weight) + var tx float64 = float64(m.Randx().Intn(500)+1) / 10 + if tx <= TestRandomWeight[idx].Time { + win = math.Pow(M, tx) * float64(m.Cursor().GetBet()) + } + m.AddCursorFeature(&Test{}).SetWin(int64(win)) +} + +type Test struct { +} + +func (p *PluginBase) OnStepEnd(m intf.Master) { +} diff --git a/gamesrv/slotspkg/slots/plugin/test/common.go b/gamesrv/slotspkg/slots/plugin/test/common.go new file mode 100644 index 0000000..4e28d43 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/test/common.go @@ -0,0 +1,5 @@ +package test + +const ( + TypeWild = 2 +) diff --git a/gamesrv/slotspkg/slots/plugin/test/init.go b/gamesrv/slotspkg/slots/plugin/test/init.go new file mode 100644 index 0000000..cd3fb69 --- /dev/null +++ b/gamesrv/slotspkg/slots/plugin/test/init.go @@ -0,0 +1,7 @@ +package test + +var Plugins = []interface{}{ + &PluginBase{}, +} + +var SimulatorPlugins = []interface{}{} diff --git a/gamesrv/slotspkg/slots/reg/customs.go b/gamesrv/slotspkg/slots/reg/customs.go new file mode 100644 index 0000000..2d2ec01 --- /dev/null +++ b/gamesrv/slotspkg/slots/reg/customs.go @@ -0,0 +1,20 @@ +package reg + +import ( + "reflect" +) + +// Customs stores customs type name +var Customs = make(map[string]reflect.Type) + +// RegisterCustom registers custom in machine +func RegisterCustom(v interface{}) { + eleTypeName := reflect.TypeOf(v).Elem().String() + Customs[eleTypeName] = reflect.TypeOf(v) +} + +// DeregisterCustom deregisters custom in machine +func DeregisterCustom(v interface{}) { + eleTypeName := reflect.TypeOf(v).Elem().String() + delete(Customs, eleTypeName) +} diff --git a/gamesrv/slotspkg/slots/reg/plugins.go b/gamesrv/slotspkg/slots/reg/plugins.go new file mode 100644 index 0000000..ee3a671 --- /dev/null +++ b/gamesrv/slotspkg/slots/reg/plugins.go @@ -0,0 +1,34 @@ +package reg + +import ( + "reflect" + + "qstar_server/service/slots/intf" +) + +// Plugins stores plugins mapped by theme name +var Plugins = make(map[string][]reflect.Type) + +// RegisterPlugin registers plugins in machine +func RegisterPlugin(plugin intf.Plugin) { + theme := plugin.Theme() + if _, ok := Plugins[theme]; !ok { + Plugins[theme] = make([]reflect.Type, 0) + } + Plugins[theme] = append(Plugins[theme], reflect.TypeOf(plugin)) +} + +// DeregisterPlugin deregisters plugins in machine +func DeregisterPlugin(plugin intf.Plugin) { + theme := plugin.Theme() + if _, ok := Plugins[theme]; !ok { + return + } + for index := 0; index < len(Plugins[theme]); index++ { + if Plugins[theme][index] == reflect.TypeOf(plugin) { + Plugins[theme] = append(Plugins[theme][:index], + Plugins[theme][index+1:]...) + index-- + } + } +} diff --git a/gamesrv/slotspkg/slots/reg/register.go b/gamesrv/slotspkg/slots/reg/register.go new file mode 100644 index 0000000..5c74fbd --- /dev/null +++ b/gamesrv/slotspkg/slots/reg/register.go @@ -0,0 +1,71 @@ +package reg + +import ( + "reflect" + + "qstar_server/internal/generic/errors" + "qstar_server/service/slots/intf" +) + +// Register register multiple plugins to global map +func Register(s ...interface{}) { + for _, v := range s { + plugin := getValidPlugin(v) + RegisterPlugin(plugin) + + for _, custom := range plugin.Customs() { + RegisterCustom(custom) + } + } +} + +// RegisterCustoms register customs to global map +func RegisterCustoms(s ...interface{}) { + for _, v := range s { + plugin := getValidPlugin(v) + for _, custom := range plugin.Customs() { + RegisterCustom(custom) + } + } +} + +// Deregister deregisters multiple plugins from global map +func Deregister(s ...interface{}) { + for _, v := range s { + plugin := getValidPlugin(v) + DeregisterPlugin(plugin) + for _, custom := range plugin.Customs() { + DeregisterCustom(custom) + } + } +} + +// DeregisterCustoms deregisters customs to global map +func DeregisterCustoms(s ...interface{}) { + for _, v := range s { + plugin := getValidPlugin(v) + for _, custom := range plugin.Customs() { + DeregisterCustom(custom) + } + } +} + +// getValidPlugin gets valid plugin or panic an error +func getValidPlugin(v interface{}) intf.Plugin { + plugin, ok := v.(intf.Plugin) + if !ok { + panic(errors.Errorf("plugin is not derived from Plugin: %s", reflect.TypeOf(v))) + } + + theme := plugin.Theme() + if theme == "" { + panic(errors.Errorf("theme can't be empty when register theme: %s", reflect.TypeOf(v))) + } + + customs := plugin.Customs() + if customs == nil { + panic(errors.Errorf("customs can't be nil")) + } + + return plugin +} diff --git a/gamesrv/slotspkg/slots/slotsmgr.go b/gamesrv/slotspkg/slots/slotsmgr.go new file mode 100644 index 0000000..57eb6af --- /dev/null +++ b/gamesrv/slotspkg/slots/slotsmgr.go @@ -0,0 +1,41 @@ +package slots + +import ( + "mongo.games.com/game/gamesrv/slotspkg/internal/module/session" + "mongo.games.com/game/gamesrv/slotspkg/slots/plugin" + "time" +) + +var SlotsMgrSington = &SlotsMgr{} + +type SlotsMgr struct { +} + +func (sm *SlotsMgr) ModuleName() string { + return "slots" +} +func ServiceName() string { + return "slots" +} +func (sm *SlotsMgr) Init() { + plugin.Init() +} + +func (sm *SlotsMgr) GetSession(uid uint64) *session.Session { + s := managermgr.SessionMgrSington.GetSession(uid) + return s +} +func (sm *SlotsMgr) GetSessionSimulator(uid uint64) *session.Session { + s := managermgr.SessionMgrSington.GetSessionSimulator(uid) + return s +} +func (sm *SlotsMgr) Update() { + +} + +func (sm *SlotsMgr) Shutdown() { + plugin.Close() +} +func init() { + module.RegisteModule(SlotsMgrSington, time.Hour, 0) +} diff --git a/gamesrv/slotspkg/slots/types/cli/1to2array.go b/gamesrv/slotspkg/slots/types/cli/1to2array.go new file mode 100644 index 0000000..ba4ef91 --- /dev/null +++ b/gamesrv/slotspkg/slots/types/cli/1to2array.go @@ -0,0 +1,55 @@ +package cli + +// ToPoss 一维数组根据矩阵转二维坐标 +func ToPoss(style []int64, pos []int64) [][]int { + var poss [][]int + var index int64 + for rowIdx, length := range style { + row := make([]int64, length) + for colIdx := range row { + for _, val := range pos { + if val == index { + poss = append(poss, []int{rowIdx, colIdx}) + } + } + index++ + } + } + return poss +} + +// ToItems transforms style and item slices into a 2D array +func ToItems(style []int64, item []int64) [][]int64 { + var items [][]int64 + var itemIndex int + for _, length := range style { + row := make([]int64, length) + for colIdx := range row { + if itemIndex < len(item) { + row[colIdx] = item[itemIndex] + itemIndex++ + } else { + break + } + } + items = append(items, row) + } + return items +} +func ToItemsFloat64(style []int64, item []float64) [][]float64 { + var items [][]float64 + var itemIndex int + for _, length := range style { + row := make([]float64, length) + for colIdx := range row { + if itemIndex < len(item) { + row[colIdx] = item[itemIndex] + itemIndex++ + } else { + break + } + } + items = append(items, row) + } + return items +} diff --git a/gamesrv/slotspkg/slots/types/cli/cli.go b/gamesrv/slotspkg/slots/types/cli/cli.go new file mode 100644 index 0000000..e07cf18 --- /dev/null +++ b/gamesrv/slotspkg/slots/types/cli/cli.go @@ -0,0 +1,48 @@ +package cli + +import ( + "qstar_server/internal/module/shared" +) + +type SlotsEnterRequest struct { + Theme string +} +type SlotsEnterResponse struct { + Code int64 + NodeTree *shared.LiteNodeTree + Coin int64 + BetSizeIndex int64 + BetLevelIndex int64 + BetLineIndex int64 + BetChangeList []float64 + BetSizes []int64 + BetLevels []int64 + BetLines []int64 +} +type SlotsPlayRequest struct { + Theme string + BetLevelIndex int64 + BetSizeIndex int64 + BetLineIndex int64 + Choice int64 + Stay bool + Version int64 +} +type SlotsPlayResponse struct { + NodeTree *shared.LiteNodeTree + Code int64 + ActualBet int64 + ActualWin int64 + Coin int64 + DebugInfo string + IsEnd bool +} + +type SlotsLeaveRequest struct { + Theme string +} + +type SlotsLeaveResponse struct { + Code int64 + Coin int64 +} diff --git a/gamesrv/slotspkg/slots/types/cli/simulator.go b/gamesrv/slotspkg/slots/types/cli/simulator.go new file mode 100644 index 0000000..8196391 --- /dev/null +++ b/gamesrv/slotspkg/slots/types/cli/simulator.go @@ -0,0 +1,930 @@ +package cli + +// base options +type SimulatorBaseOption struct { + LineID int64 + Name string + Comment string + MaxRunTime int64 +} + +func (x *SimulatorBaseOption) GetLineID() int64 { + if x != nil { + return x.LineID + } + return 0 +} + +func (x *SimulatorBaseOption) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SimulatorBaseOption) GetComment() string { + if x != nil { + return x.Comment + } + return "" +} + +func (x *SimulatorBaseOption) GetMaxRunTime() int64 { + if x != nil { + return x.MaxRunTime + } + return 0 +} + +// request Options +type SimulatorRequestOption struct { + Theme string + + BetIndex int64 + + CoinValueIndex int64 + + Choice int64 + + Stay bool + + Version int64 + + ClassId int64 + + CycleTimes int64 + + BetStrategy int64 + + Cycles int64 + + RecorderStrategy int64 +} + +func (x *SimulatorRequestOption) GetTheme() string { + if x != nil { + return x.Theme + } + return "" +} + +func (x *SimulatorRequestOption) GetBetIndex() int64 { + if x != nil { + return x.BetIndex + } + return 0 +} + +func (x *SimulatorRequestOption) GetCoinValueIndex() int64 { + if x != nil { + return x.CoinValueIndex + } + return 0 +} + +func (x *SimulatorRequestOption) GetChoice() int64 { + if x != nil { + return x.Choice + } + return 0 +} + +func (x *SimulatorRequestOption) GetStay() bool { + if x != nil { + return x.Stay + } + return false +} + +func (x *SimulatorRequestOption) GetVersion() int64 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *SimulatorRequestOption) GetCycleTimes() int64 { + if x != nil { + return x.CycleTimes + } + return 0 +} + +func (x *SimulatorRequestOption) GetBetStrategy() int64 { + if x != nil { + return x.BetStrategy + } + return 0 +} + +func (x *SimulatorRequestOption) GetCycles() int64 { + if x != nil { + return x.Cycles + } + return 0 +} + +func (x *SimulatorRequestOption) GetRecorderStrategy() int64 { + if x != nil { + return x.RecorderStrategy + } + return 0 +} + +type SimulatorPlayerOption struct { + Coins int64 +} + +func (x *SimulatorPlayerOption) GetCoins() int64 { + if x != nil { + return x.Coins + } + return 0 +} + +type SimulatorGMOption struct { + LockCoin bool +} + +func (x *SimulatorGMOption) GetLockCoin() bool { + if x != nil { + return x.LockCoin + } + return false +} + +type SimulatorStatsOption struct { + Machine bool + + Summary bool + + Custom bool + + History bool + + Chart bool +} + +func (x *SimulatorStatsOption) GetMachine() bool { + if x != nil { + return x.Machine + } + return false +} + +func (x *SimulatorStatsOption) GetSummary() bool { + if x != nil { + return x.Summary + } + return false +} + +func (x *SimulatorStatsOption) GetCustom() bool { + if x != nil { + return x.Custom + } + return false +} + +func (x *SimulatorStatsOption) GetHistory() bool { + if x != nil { + return x.History + } + return false +} + +func (x *SimulatorStatsOption) GetChart() bool { + if x != nil { + return x.Chart + } + return false +} + +type SimulatorLine struct { + Base *SimulatorBaseOption + + Request *SimulatorRequestOption + + Player *SimulatorPlayerOption + + GM *SimulatorGMOption + + Stats *SimulatorStatsOption +} + +func (x *SimulatorLine) GetBase() *SimulatorBaseOption { + if x != nil { + return x.Base + } + return nil +} + +func (x *SimulatorLine) GetRequest() *SimulatorRequestOption { + if x != nil { + return x.Request + } + return nil +} + +func (x *SimulatorLine) GetPlayer() *SimulatorPlayerOption { + if x != nil { + return x.Player + } + return nil +} + +func (x *SimulatorLine) GetGM() *SimulatorGMOption { + if x != nil { + return x.GM + } + return nil +} + +func (x *SimulatorLine) GetStats() *SimulatorStatsOption { + if x != nil { + return x.Stats + } + return nil +} + +type SimulatorStatus struct { + PlayID int64 + + CreateTime string + + FinishTime string + + Progress int64 + + ProgressTime string + + State int64 +} + +func (x *SimulatorStatus) GetPlayID() int64 { + if x != nil { + return x.PlayID + } + return 0 +} + +func (x *SimulatorStatus) GetCreateTime() string { + if x != nil { + return x.CreateTime + } + return "" +} + +func (x *SimulatorStatus) GetFinishTime() string { + if x != nil { + return x.FinishTime + } + return "" +} + +func (x *SimulatorStatus) GetProgress() int64 { + if x != nil { + return x.Progress + } + return 0 +} + +func (x *SimulatorStatus) GetProgressTime() string { + if x != nil { + return x.ProgressTime + } + return "" +} + +func (x *SimulatorStatus) GetState() int64 { + if x != nil { + return x.State + } + return 0 +} + +// Storing stats id +type SimulatorStats struct { + Machine int64 + + Summary int64 + + Custom int64 + + History int64 + + Chart int64 +} + +func (x *SimulatorStats) GetMachine() int64 { + if x != nil { + return x.Machine + } + return 0 +} + +func (x *SimulatorStats) GetSummary() int64 { + if x != nil { + return x.Summary + } + return 0 +} + +func (x *SimulatorStats) GetCustom() int64 { + if x != nil { + return x.Custom + } + return 0 +} + +func (x *SimulatorStats) GetHistory() int64 { + if x != nil { + return x.History + } + return 0 +} + +func (x *SimulatorStats) GetChart() int64 { + if x != nil { + return x.Chart + } + return 0 +} + +type SimulatorPlay struct { + Line *SimulatorLine + + Status *SimulatorStatus + + Stats *SimulatorStats +} + +func (x *SimulatorPlay) GetLine() *SimulatorLine { + if x != nil { + return x.Line + } + return nil +} + +func (x *SimulatorPlay) GetStatus() *SimulatorStatus { + if x != nil { + return x.Status + } + return nil +} + +func (x *SimulatorPlay) GetStats() *SimulatorStats { + if x != nil { + return x.Stats + } + return nil +} + +type SimulatorPlayerStatus struct { + Time int64 + Coins int64 +} + +func (x *SimulatorPlayerStatus) GetTime() int64 { + if x != nil { + return x.Time + } + return 0 +} + +func (x *SimulatorPlayerStatus) GetCoins() int64 { + if x != nil { + return x.Coins + } + return 0 +} + +type SimulatorSetPlayerRequest struct { + Line *SimulatorLine + Uid uint64 +} + +func (x *SimulatorSetPlayerRequest) GetLine() *SimulatorLine { + if x != nil { + return x.Line + } + return nil +} + +type SimulatorSetPlayerResponse struct { + Code int64 +} + +func (x *SimulatorSetPlayerResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +type SimulatorPlayRequest struct { + Play *SimulatorPlay + Uid uint64 +} + +func (x *SimulatorPlayRequest) GetPlay() *SimulatorPlay { + if x != nil { + return x.Play + } + return nil +} + +type SimulatorPlayResponse struct { + Code int64 +} + +func (x *SimulatorPlayResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +type SimulatorRegisterRequest struct { + Username string + Password string +} + +func (x *SimulatorRegisterRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *SimulatorRegisterRequest) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +type SimulatorRegisterResponse struct { + Code int64 +} + +func (x *SimulatorRegisterResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +type SimulatorLoginRequest struct { + Username string + Password string +} + +func (x *SimulatorLoginRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *SimulatorLoginRequest) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +type SimulatorLoginResponse struct { + Code int64 +} + +func (x *SimulatorLoginResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +type SimulatorInsertLineRequest struct { + Username string + Theme string + Name string +} + +func (x *SimulatorInsertLineRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *SimulatorInsertLineRequest) GetTheme() string { + if x != nil { + return x.Theme + } + return "" +} + +func (x *SimulatorInsertLineRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type SimulatorInsertLineResponse struct { + Code int64 + Line *SimulatorLine +} + +func (x *SimulatorInsertLineResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *SimulatorInsertLineResponse) GetLine() *SimulatorLine { + if x != nil { + return x.Line + } + return nil +} + +type SimulatorReviseLineRequest struct { + Username string + Line *SimulatorLine +} + +func (x *SimulatorReviseLineRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *SimulatorReviseLineRequest) GetLine() *SimulatorLine { + if x != nil { + return x.Line + } + return nil +} + +type SimulatorReviseLineResponse struct { + Code int64 +} + +func (x *SimulatorReviseLineResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +type SimulatorDeleteLinesRequest struct { + Username string + LineIDs []int64 +} + +func (x *SimulatorDeleteLinesRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *SimulatorDeleteLinesRequest) GetLineIDs() []int64 { + if x != nil { + return x.LineIDs + } + return nil +} + +type SimulatorDeleteLinesResponse struct { + Code int64 +} + +func (x *SimulatorDeleteLinesResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +type SimulatorQueryLinesRequest struct { + Username string +} + +func (x *SimulatorQueryLinesRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +type SimulatorQueryLinesResponse struct { + Code int64 + Lines []*SimulatorLine +} + +func (x *SimulatorQueryLinesResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *SimulatorQueryLinesResponse) GetLines() []*SimulatorLine { + if x != nil { + return x.Lines + } + return nil +} + +type SimulatorStartPlayRequest struct { + Username string + LineID int64 +} + +func (x *SimulatorStartPlayRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *SimulatorStartPlayRequest) GetLineID() int64 { + if x != nil { + return x.LineID + } + return 0 +} + +type SimulatorStartPlayResponse struct { + Code int64 + PlayID int64 +} + +func (x *SimulatorStartPlayResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *SimulatorStartPlayResponse) GetPlayID() int64 { + if x != nil { + return x.PlayID + } + return 0 +} + +type SimulatorQueryPlaysRequest struct { + Username string + States []int64 + LineID int64 + PageSize int64 + PageNum int64 +} + +func (x *SimulatorQueryPlaysRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *SimulatorQueryPlaysRequest) GetStates() []int64 { + if x != nil { + return x.States + } + return nil +} + +func (x *SimulatorQueryPlaysRequest) GetLineID() int64 { + if x != nil { + return x.LineID + } + return 0 +} + +func (x *SimulatorQueryPlaysRequest) GetPageSize() int64 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *SimulatorQueryPlaysRequest) GetPageNum() int64 { + if x != nil { + return x.PageNum + } + return 0 +} + +type SimulatorQueryPlaysResponse struct { + Code int64 + Plays []*SimulatorPlay + Count int64 +} + +func (x *SimulatorQueryPlaysResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *SimulatorQueryPlaysResponse) GetPlays() []*SimulatorPlay { + if x != nil { + return x.Plays + } + return nil +} + +func (x *SimulatorQueryPlaysResponse) GetCount() int64 { + if x != nil { + return x.Count + } + return 0 +} + +type SimulatorDeletePlaysRequest struct { + Username string + PlayIDs []int64 +} + +func (x *SimulatorDeletePlaysRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *SimulatorDeletePlaysRequest) GetPlayIDs() []int64 { + if x != nil { + return x.PlayIDs + } + return nil +} + +type SimulatorDeletePlaysResponse struct { + Code int64 +} + +func (x *SimulatorDeletePlaysResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +type SimulatorInsertThemeRequest struct { + Username string + Theme string +} + +func (x *SimulatorInsertThemeRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *SimulatorInsertThemeRequest) GetTheme() string { + if x != nil { + return x.Theme + } + return "" +} + +type SimulatorInsertThemeResponse struct { + Code int64 +} + +func (x *SimulatorInsertThemeResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +type SimulatorDeleteThemesRequest struct { + Username string + Themes []string +} + +func (x *SimulatorDeleteThemesRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *SimulatorDeleteThemesRequest) GetThemes() []string { + if x != nil { + return x.Themes + } + return nil +} + +type SimulatorDeleteThemesResponse struct { + Code int64 +} + +func (x *SimulatorDeleteThemesResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +type SimulatorQueryThemesRequest struct { + Username string +} + +func (x *SimulatorQueryThemesRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +type SimulatorQueryThemesResponse struct { + Code int64 + Themes []string +} + +func (x *SimulatorQueryThemesResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *SimulatorQueryThemesResponse) GetThemes() []string { + if x != nil { + return x.Themes + } + return nil +} + +type SimulatorQueryStatsRequest struct { + StatsIDs []int64 +} + +func (x *SimulatorQueryStatsRequest) GetStatsIDs() []int64 { + if x != nil { + return x.StatsIDs + } + return nil +} + +type SimulatorQueryStatsResponse struct { + Code int64 + StatsList []string +} + +func (x *SimulatorQueryStatsResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *SimulatorQueryStatsResponse) GetStatsList() []string { + if x != nil { + return x.StatsList + } + return nil +} + +type SimulatorQueryPlayProgressRequest struct { + PlayIDs []int64 +} + +func (x *SimulatorQueryPlayProgressRequest) GetPlayIDs() []int64 { + if x != nil { + return x.PlayIDs + } + return nil +} + +type SimulatorQueryPlayProgressResponse struct { + Code int64 + Plays []*SimulatorPlay +} + +func (x *SimulatorQueryPlayProgressResponse) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *SimulatorQueryPlayProgressResponse) GetPlays() []*SimulatorPlay { + if x != nil { + return x.Plays + } + return nil +} diff --git a/gamesrv/slotspkg/slots/types/rpc/simulator.pb.go b/gamesrv/slotspkg/slots/types/rpc/simulator.pb.go new file mode 100644 index 0000000..a8f4eeb --- /dev/null +++ b/gamesrv/slotspkg/slots/types/rpc/simulator.pb.go @@ -0,0 +1,310 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.12.1 +// source: external/proto/rpc/simulator.proto + +package rpc + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type OnSimulatorProgressRPC struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PlayID int64 `protobuf:"varint,1,opt,name=PlayID,proto3" json:"PlayID,omitempty"` + Progress int64 `protobuf:"varint,2,opt,name=Progress,proto3" json:"Progress,omitempty"` +} + +func (x *OnSimulatorProgressRPC) Reset() { + *x = OnSimulatorProgressRPC{} + if protoimpl.UnsafeEnabled { + mi := &file_external_proto_rpc_simulator_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnSimulatorProgressRPC) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnSimulatorProgressRPC) ProtoMessage() {} + +func (x *OnSimulatorProgressRPC) ProtoReflect() protoreflect.Message { + mi := &file_external_proto_rpc_simulator_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnSimulatorProgressRPC.ProtoReflect.Descriptor instead. +func (*OnSimulatorProgressRPC) Descriptor() ([]byte, []int) { + return file_external_proto_rpc_simulator_proto_rawDescGZIP(), []int{0} +} + +func (x *OnSimulatorProgressRPC) GetPlayID() int64 { + if x != nil { + return x.PlayID + } + return 0 +} + +func (x *OnSimulatorProgressRPC) GetProgress() int64 { + if x != nil { + return x.Progress + } + return 0 +} + +type OnSimluatorStatsRPC struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PlayID int64 `protobuf:"varint,1,opt,name=PlayID,proto3" json:"PlayID,omitempty"` + StatsType string `protobuf:"bytes,2,opt,name=StatsType,proto3" json:"StatsType,omitempty"` + StatsData string `protobuf:"bytes,3,opt,name=StatsData,proto3" json:"StatsData,omitempty"` +} + +func (x *OnSimluatorStatsRPC) Reset() { + *x = OnSimluatorStatsRPC{} + if protoimpl.UnsafeEnabled { + mi := &file_external_proto_rpc_simulator_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnSimluatorStatsRPC) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnSimluatorStatsRPC) ProtoMessage() {} + +func (x *OnSimluatorStatsRPC) ProtoReflect() protoreflect.Message { + mi := &file_external_proto_rpc_simulator_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnSimluatorStatsRPC.ProtoReflect.Descriptor instead. +func (*OnSimluatorStatsRPC) Descriptor() ([]byte, []int) { + return file_external_proto_rpc_simulator_proto_rawDescGZIP(), []int{1} +} + +func (x *OnSimluatorStatsRPC) GetPlayID() int64 { + if x != nil { + return x.PlayID + } + return 0 +} + +func (x *OnSimluatorStatsRPC) GetStatsType() string { + if x != nil { + return x.StatsType + } + return "" +} + +func (x *OnSimluatorStatsRPC) GetStatsData() string { + if x != nil { + return x.StatsData + } + return "" +} + +type OnSimulatorPlayRPC struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Code int64 `protobuf:"varint,1,opt,name=Code,proto3" json:"Code,omitempty"` + PlayID int64 `protobuf:"varint,2,opt,name=PlayID,proto3" json:"PlayID,omitempty"` +} + +func (x *OnSimulatorPlayRPC) Reset() { + *x = OnSimulatorPlayRPC{} + if protoimpl.UnsafeEnabled { + mi := &file_external_proto_rpc_simulator_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnSimulatorPlayRPC) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnSimulatorPlayRPC) ProtoMessage() {} + +func (x *OnSimulatorPlayRPC) ProtoReflect() protoreflect.Message { + mi := &file_external_proto_rpc_simulator_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnSimulatorPlayRPC.ProtoReflect.Descriptor instead. +func (*OnSimulatorPlayRPC) Descriptor() ([]byte, []int) { + return file_external_proto_rpc_simulator_proto_rawDescGZIP(), []int{2} +} + +func (x *OnSimulatorPlayRPC) GetCode() int64 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *OnSimulatorPlayRPC) GetPlayID() int64 { + if x != nil { + return x.PlayID + } + return 0 +} + +var File_external_proto_rpc_simulator_proto protoreflect.FileDescriptor + +var file_external_proto_rpc_simulator_proto_rawDesc = []byte{ + 0x0a, 0x22, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x72, 0x70, 0x63, 0x22, 0x4c, 0x0a, 0x16, 0x4f, 0x6e, 0x53, + 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x52, 0x50, 0x43, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x6c, 0x61, 0x79, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x6c, 0x61, 0x79, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x69, 0x0a, 0x13, 0x4f, 0x6e, 0x53, 0x69, 0x6d, + 0x6c, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x50, 0x43, 0x12, 0x16, + 0x0a, 0x06, 0x50, 0x6c, 0x61, 0x79, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, + 0x50, 0x6c, 0x61, 0x79, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x73, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x73, 0x44, 0x61, 0x74, + 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x74, 0x61, 0x74, 0x73, 0x44, 0x61, + 0x74, 0x61, 0x22, 0x40, 0x0a, 0x12, 0x4f, 0x6e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, + 0x72, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x50, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x50, 0x6c, 0x61, 0x79, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x6c, + 0x61, 0x79, 0x49, 0x44, 0x42, 0x26, 0x5a, 0x24, 0x72, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2d, 0x6e, + 0x61, 0x6e, 0x6f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_external_proto_rpc_simulator_proto_rawDescOnce sync.Once + file_external_proto_rpc_simulator_proto_rawDescData = file_external_proto_rpc_simulator_proto_rawDesc +) + +func file_external_proto_rpc_simulator_proto_rawDescGZIP() []byte { + file_external_proto_rpc_simulator_proto_rawDescOnce.Do(func() { + file_external_proto_rpc_simulator_proto_rawDescData = protoimpl.X.CompressGZIP(file_external_proto_rpc_simulator_proto_rawDescData) + }) + return file_external_proto_rpc_simulator_proto_rawDescData +} + +var file_external_proto_rpc_simulator_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_external_proto_rpc_simulator_proto_goTypes = []interface{}{ + (*OnSimulatorProgressRPC)(nil), // 0: rpc.OnSimulatorProgressRPC + (*OnSimluatorStatsRPC)(nil), // 1: rpc.OnSimluatorStatsRPC + (*OnSimulatorPlayRPC)(nil), // 2: rpc.OnSimulatorPlayRPC +} +var file_external_proto_rpc_simulator_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_external_proto_rpc_simulator_proto_init() } +func file_external_proto_rpc_simulator_proto_init() { + if File_external_proto_rpc_simulator_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_external_proto_rpc_simulator_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnSimulatorProgressRPC); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_external_proto_rpc_simulator_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnSimluatorStatsRPC); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_external_proto_rpc_simulator_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnSimulatorPlayRPC); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_external_proto_rpc_simulator_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_external_proto_rpc_simulator_proto_goTypes, + DependencyIndexes: file_external_proto_rpc_simulator_proto_depIdxs, + MessageInfos: file_external_proto_rpc_simulator_proto_msgTypes, + }.Build() + File_external_proto_rpc_simulator_proto = out.File + file_external_proto_rpc_simulator_proto_rawDesc = nil + file_external_proto_rpc_simulator_proto_goTypes = nil + file_external_proto_rpc_simulator_proto_depIdxs = nil +} diff --git a/gamesrv/slotspkg/tools/converter/converter.go b/gamesrv/slotspkg/tools/converter/converter.go new file mode 100644 index 0000000..20408ac --- /dev/null +++ b/gamesrv/slotspkg/tools/converter/converter.go @@ -0,0 +1,47 @@ +package main + +import ( + "fmt" + "log" + "os" + "time" + + cvt "github.com/tomas-qstarrs/excel-converter/converter" +) + +func main() { + args := os.Args[1:] + DoConvert(args) +} + +func DoConvert(args []string) { + if len(args) < 4 { + log.Println("Requires at least 4 argument") + } + fmt.Println("Start...") + beginTm := time.Now() + + defer func() { + endTm := time.Now() + fmt.Printf("Done in %v seconds\n", float64(endTm.UnixNano()-beginTm.UnixNano())/10e8) + }() + + c := cvt.Config{ + Type: args[0], + ImportPath: args[1], + ExportPath: args[2], + ProjectPath: args[3], + } + + cvt.FlagSettings = "Settings" + cvt.FlagTemplate = "Template" + cvt.FlagDefault = "Default" + cvt.FlagBase = "Base" + cvt.FlagCategory = "Category" + cvt.FlagVarian = "Lucky" + cvt.FlagLink = "Link" + + // cvt.SetMode(cvt.DebugMode) + + cvt.Run(c) +} diff --git a/protocol/doc.md b/protocol/doc.md index 6d8f4f4..e33b793 100644 --- a/protocol/doc.md +++ b/protocol/doc.md @@ -161,5 +161,8 @@ ### smallrocket.protp - 5581~5599 +### fortunedragon.prot +- 5600~5609 + ### game.proto(玩家离开) - 8000~8099 \ No newline at end of file diff --git a/protocol/fortunedragon/fortunedragon.pb.go b/protocol/fortunedragon/fortunedragon.pb.go new file mode 100644 index 0000000..29ae44e --- /dev/null +++ b/protocol/fortunedragon/fortunedragon.pb.go @@ -0,0 +1,792 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.1-devel +// protoc v3.19.4 +// source: fortunedragon.proto + +package fortunedragon + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +//fortunedragon +//龙 +type FortuneDragonPID int32 + +const ( + FortuneDragonPID_PACKET_FORTUNEDRAGON_ZERO FortuneDragonPID = 0 // 弃用消息号 + FortuneDragonPID_PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMINFO FortuneDragonPID = 5600 //房间信息 + FortuneDragonPID_PACKET_FORTUNEDRAGON_CSFORTUNEDRAGONOP FortuneDragonPID = 5601 + FortuneDragonPID_PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONOP FortuneDragonPID = 5602 + FortuneDragonPID_PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMSTATE FortuneDragonPID = 5603 + FortuneDragonPID_PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONBILLED FortuneDragonPID = 5604 +) + +// Enum value maps for FortuneDragonPID. +var ( + FortuneDragonPID_name = map[int32]string{ + 0: "PACKET_FORTUNEDRAGON_ZERO", + 5600: "PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMINFO", + 5601: "PACKET_FORTUNEDRAGON_CSFORTUNEDRAGONOP", + 5602: "PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONOP", + 5603: "PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMSTATE", + 5604: "PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONBILLED", + } + FortuneDragonPID_value = map[string]int32{ + "PACKET_FORTUNEDRAGON_ZERO": 0, + "PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMINFO": 5600, + "PACKET_FORTUNEDRAGON_CSFORTUNEDRAGONOP": 5601, + "PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONOP": 5602, + "PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMSTATE": 5603, + "PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONBILLED": 5604, + } +) + +func (x FortuneDragonPID) Enum() *FortuneDragonPID { + p := new(FortuneDragonPID) + *p = x + return p +} + +func (x FortuneDragonPID) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FortuneDragonPID) Descriptor() protoreflect.EnumDescriptor { + return file_fortunedragon_proto_enumTypes[0].Descriptor() +} + +func (FortuneDragonPID) Type() protoreflect.EnumType { + return &file_fortunedragon_proto_enumTypes[0] +} + +func (x FortuneDragonPID) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use FortuneDragonPID.Descriptor instead. +func (FortuneDragonPID) EnumDescriptor() ([]byte, []int) { + return file_fortunedragon_proto_rawDescGZIP(), []int{0} +} + +type FortuneDragonPlayerData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` //名字 + SnId int32 `protobuf:"varint,2,opt,name=SnId,proto3" json:"SnId,omitempty"` //账号 + Head int32 `protobuf:"varint,3,opt,name=Head,proto3" json:"Head,omitempty"` //头像 + Sex int32 `protobuf:"varint,4,opt,name=Sex,proto3" json:"Sex,omitempty"` //性别 + Coin int64 `protobuf:"varint,5,opt,name=Coin,proto3" json:"Coin,omitempty"` //金币 + Pos int32 `protobuf:"varint,6,opt,name=Pos,proto3" json:"Pos,omitempty"` //座位位置 + Flag int32 `protobuf:"varint,7,opt,name=Flag,proto3" json:"Flag,omitempty"` //二进制标记 + Params []string `protobuf:"bytes,8,rep,name=Params,proto3" json:"Params,omitempty"` //其他数据 如:ip 等 + City string `protobuf:"bytes,9,opt,name=City,proto3" json:"City,omitempty"` //城市 + HeadOutLine int32 `protobuf:"varint,10,opt,name=HeadOutLine,proto3" json:"HeadOutLine,omitempty"` //头像框 + VIP int32 `protobuf:"varint,11,opt,name=VIP,proto3" json:"VIP,omitempty"` +} + +func (x *FortuneDragonPlayerData) Reset() { + *x = FortuneDragonPlayerData{} + if protoimpl.UnsafeEnabled { + mi := &file_fortunedragon_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FortuneDragonPlayerData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FortuneDragonPlayerData) ProtoMessage() {} + +func (x *FortuneDragonPlayerData) ProtoReflect() protoreflect.Message { + mi := &file_fortunedragon_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FortuneDragonPlayerData.ProtoReflect.Descriptor instead. +func (*FortuneDragonPlayerData) Descriptor() ([]byte, []int) { + return file_fortunedragon_proto_rawDescGZIP(), []int{0} +} + +func (x *FortuneDragonPlayerData) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *FortuneDragonPlayerData) GetSnId() int32 { + if x != nil { + return x.SnId + } + return 0 +} + +func (x *FortuneDragonPlayerData) GetHead() int32 { + if x != nil { + return x.Head + } + return 0 +} + +func (x *FortuneDragonPlayerData) GetSex() int32 { + if x != nil { + return x.Sex + } + return 0 +} + +func (x *FortuneDragonPlayerData) GetCoin() int64 { + if x != nil { + return x.Coin + } + return 0 +} + +func (x *FortuneDragonPlayerData) GetPos() int32 { + if x != nil { + return x.Pos + } + return 0 +} + +func (x *FortuneDragonPlayerData) GetFlag() int32 { + if x != nil { + return x.Flag + } + return 0 +} + +func (x *FortuneDragonPlayerData) GetParams() []string { + if x != nil { + return x.Params + } + return nil +} + +func (x *FortuneDragonPlayerData) GetCity() string { + if x != nil { + return x.City + } + return "" +} + +func (x *FortuneDragonPlayerData) GetHeadOutLine() int32 { + if x != nil { + return x.HeadOutLine + } + return 0 +} + +func (x *FortuneDragonPlayerData) GetVIP() int32 { + if x != nil { + return x.VIP + } + return 0 +} + +//房间信息 +//PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMINFO +type SCFortuneDragonRoomInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RoomId int32 `protobuf:"varint,1,opt,name=RoomId,proto3" json:"RoomId,omitempty"` //房间id + GameFreeId int32 `protobuf:"varint,2,opt,name=GameFreeId,proto3" json:"GameFreeId,omitempty"` + GameId int32 `protobuf:"varint,3,opt,name=GameId,proto3" json:"GameId,omitempty"` //游戏id + RoomMode int32 `protobuf:"varint,4,opt,name=RoomMode,proto3" json:"RoomMode,omitempty"` //游戏模式 + Params []int32 `protobuf:"varint,5,rep,packed,name=Params,proto3" json:"Params,omitempty"` //规则参数 + NumOfGames int32 `protobuf:"varint,6,opt,name=NumOfGames,proto3" json:"NumOfGames,omitempty"` //当前第几局 + State int32 `protobuf:"varint,7,opt,name=State,proto3" json:"State,omitempty"` //房间当前状态 + ParamsEx []int64 `protobuf:"varint,8,rep,packed,name=ParamsEx,proto3" json:"ParamsEx,omitempty"` //其他参数 + SceneType int32 `protobuf:"varint,9,opt,name=SceneType,proto3" json:"SceneType,omitempty"` //房间模式 + Player *FortuneDragonPlayerData `protobuf:"bytes,10,opt,name=Player,proto3" json:"Player,omitempty"` //房间内的玩家信息 + PlayerInfo string `protobuf:"bytes,11,opt,name=PlayerInfo,proto3" json:"PlayerInfo,omitempty"` +} + +func (x *SCFortuneDragonRoomInfo) Reset() { + *x = SCFortuneDragonRoomInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_fortunedragon_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SCFortuneDragonRoomInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SCFortuneDragonRoomInfo) ProtoMessage() {} + +func (x *SCFortuneDragonRoomInfo) ProtoReflect() protoreflect.Message { + mi := &file_fortunedragon_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SCFortuneDragonRoomInfo.ProtoReflect.Descriptor instead. +func (*SCFortuneDragonRoomInfo) Descriptor() ([]byte, []int) { + return file_fortunedragon_proto_rawDescGZIP(), []int{1} +} + +func (x *SCFortuneDragonRoomInfo) GetRoomId() int32 { + if x != nil { + return x.RoomId + } + return 0 +} + +func (x *SCFortuneDragonRoomInfo) GetGameFreeId() int32 { + if x != nil { + return x.GameFreeId + } + return 0 +} + +func (x *SCFortuneDragonRoomInfo) GetGameId() int32 { + if x != nil { + return x.GameId + } + return 0 +} + +func (x *SCFortuneDragonRoomInfo) GetRoomMode() int32 { + if x != nil { + return x.RoomMode + } + return 0 +} + +func (x *SCFortuneDragonRoomInfo) GetParams() []int32 { + if x != nil { + return x.Params + } + return nil +} + +func (x *SCFortuneDragonRoomInfo) GetNumOfGames() int32 { + if x != nil { + return x.NumOfGames + } + return 0 +} + +func (x *SCFortuneDragonRoomInfo) GetState() int32 { + if x != nil { + return x.State + } + return 0 +} + +func (x *SCFortuneDragonRoomInfo) GetParamsEx() []int64 { + if x != nil { + return x.ParamsEx + } + return nil +} + +func (x *SCFortuneDragonRoomInfo) GetSceneType() int32 { + if x != nil { + return x.SceneType + } + return 0 +} + +func (x *SCFortuneDragonRoomInfo) GetPlayer() *FortuneDragonPlayerData { + if x != nil { + return x.Player + } + return nil +} + +func (x *SCFortuneDragonRoomInfo) GetPlayerInfo() string { + if x != nil { + return x.PlayerInfo + } + return "" +} + +//玩家操作 +//PACKET_FORTUNEDRAGON_CSFORTUNEDRAGONOP +type CSFortuneDragonOp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OpCode int32 `protobuf:"varint,1,opt,name=OpCode,proto3" json:"OpCode,omitempty"` //操作码 0.spin + Params []int64 `protobuf:"varint,2,rep,packed,name=Params,proto3" json:"Params,omitempty"` //操作参数 下注索引编号 +} + +func (x *CSFortuneDragonOp) Reset() { + *x = CSFortuneDragonOp{} + if protoimpl.UnsafeEnabled { + mi := &file_fortunedragon_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CSFortuneDragonOp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CSFortuneDragonOp) ProtoMessage() {} + +func (x *CSFortuneDragonOp) ProtoReflect() protoreflect.Message { + mi := &file_fortunedragon_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CSFortuneDragonOp.ProtoReflect.Descriptor instead. +func (*CSFortuneDragonOp) Descriptor() ([]byte, []int) { + return file_fortunedragon_proto_rawDescGZIP(), []int{2} +} + +func (x *CSFortuneDragonOp) GetOpCode() int32 { + if x != nil { + return x.OpCode + } + return 0 +} + +func (x *CSFortuneDragonOp) GetParams() []int64 { + if x != nil { + return x.Params + } + return nil +} + +//玩家操作返回 +//PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONOP +type SCFortuneDragonOp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OpCode int32 `protobuf:"varint,1,opt,name=OpCode,proto3" json:"OpCode,omitempty"` //操作码 + OpRetCode int32 `protobuf:"varint,2,opt,name=OpRetCode,proto3" json:"OpRetCode,omitempty"` //操作结果 1.金币不足 2.低于该值不能押注 + Params []int64 `protobuf:"varint,3,rep,packed,name=Params,proto3" json:"Params,omitempty"` //操作参数 +} + +func (x *SCFortuneDragonOp) Reset() { + *x = SCFortuneDragonOp{} + if protoimpl.UnsafeEnabled { + mi := &file_fortunedragon_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SCFortuneDragonOp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SCFortuneDragonOp) ProtoMessage() {} + +func (x *SCFortuneDragonOp) ProtoReflect() protoreflect.Message { + mi := &file_fortunedragon_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SCFortuneDragonOp.ProtoReflect.Descriptor instead. +func (*SCFortuneDragonOp) Descriptor() ([]byte, []int) { + return file_fortunedragon_proto_rawDescGZIP(), []int{3} +} + +func (x *SCFortuneDragonOp) GetOpCode() int32 { + if x != nil { + return x.OpCode + } + return 0 +} + +func (x *SCFortuneDragonOp) GetOpRetCode() int32 { + if x != nil { + return x.OpRetCode + } + return 0 +} + +func (x *SCFortuneDragonOp) GetParams() []int64 { + if x != nil { + return x.Params + } + return nil +} + +//房间状态 +//PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMSTATE +type SCFortuneDragonRoomState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + State int32 `protobuf:"varint,1,opt,name=State,proto3" json:"State,omitempty"` //房间当前状态 + SubState int32 `protobuf:"varint,2,opt,name=SubState,proto3" json:"SubState,omitempty"` //房间当前子状态 + Params []int32 `protobuf:"varint,3,rep,packed,name=Params,proto3" json:"Params,omitempty"` //状态参数 +} + +func (x *SCFortuneDragonRoomState) Reset() { + *x = SCFortuneDragonRoomState{} + if protoimpl.UnsafeEnabled { + mi := &file_fortunedragon_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SCFortuneDragonRoomState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SCFortuneDragonRoomState) ProtoMessage() {} + +func (x *SCFortuneDragonRoomState) ProtoReflect() protoreflect.Message { + mi := &file_fortunedragon_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SCFortuneDragonRoomState.ProtoReflect.Descriptor instead. +func (*SCFortuneDragonRoomState) Descriptor() ([]byte, []int) { + return file_fortunedragon_proto_rawDescGZIP(), []int{4} +} + +func (x *SCFortuneDragonRoomState) GetState() int32 { + if x != nil { + return x.State + } + return 0 +} + +func (x *SCFortuneDragonRoomState) GetSubState() int32 { + if x != nil { + return x.SubState + } + return 0 +} + +func (x *SCFortuneDragonRoomState) GetParams() []int32 { + if x != nil { + return x.Params + } + return nil +} + +//PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONBILLED +type SCFortuneDragonBilled struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GameEndStr string `protobuf:"bytes,1,opt,name=GameEndStr,proto3" json:"GameEndStr,omitempty"` +} + +func (x *SCFortuneDragonBilled) Reset() { + *x = SCFortuneDragonBilled{} + if protoimpl.UnsafeEnabled { + mi := &file_fortunedragon_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SCFortuneDragonBilled) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SCFortuneDragonBilled) ProtoMessage() {} + +func (x *SCFortuneDragonBilled) ProtoReflect() protoreflect.Message { + mi := &file_fortunedragon_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SCFortuneDragonBilled.ProtoReflect.Descriptor instead. +func (*SCFortuneDragonBilled) Descriptor() ([]byte, []int) { + return file_fortunedragon_proto_rawDescGZIP(), []int{5} +} + +func (x *SCFortuneDragonBilled) GetGameEndStr() string { + if x != nil { + return x.GameEndStr + } + return "" +} + +var File_fortunedragon_proto protoreflect.FileDescriptor + +var file_fortunedragon_proto_rawDesc = []byte{ + 0x0a, 0x13, 0x66, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x65, 0x64, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x72, 0x75, 0x69, 0x74, 0x73, 0x22, 0x81, 0x02, + 0x0a, 0x17, 0x46, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x65, 0x44, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x50, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x53, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x53, 0x6e, 0x49, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x65, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x48, 0x65, 0x61, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x53, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x53, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x6f, 0x69, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x43, 0x6f, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x50, + 0x6f, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x6f, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x46, 0x6c, 0x61, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x46, 0x6c, 0x61, + 0x67, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x69, 0x74, + 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, + 0x0b, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x56, 0x49, 0x50, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x56, 0x49, + 0x50, 0x22, 0xe6, 0x02, 0x0a, 0x17, 0x53, 0x43, 0x46, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x65, 0x44, + 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, + 0x06, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x52, + 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x46, 0x72, 0x65, + 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x46, + 0x72, 0x65, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x47, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x4e, 0x75, 0x6d, 0x4f, 0x66, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x4e, 0x75, 0x6d, 0x4f, 0x66, 0x47, 0x61, 0x6d, 0x65, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x45, 0x78, 0x18, 0x08, 0x20, 0x03, 0x28, 0x03, 0x52, 0x08, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x45, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x63, 0x65, 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x53, 0x63, 0x65, 0x6e, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x37, 0x0a, 0x06, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x72, 0x75, 0x69, 0x74, 0x73, 0x2e, 0x46, 0x6f, 0x72, 0x74, 0x75, + 0x6e, 0x65, 0x44, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x06, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x43, 0x0a, 0x11, 0x43, 0x53, + 0x46, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x65, 0x44, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x4f, 0x70, 0x12, + 0x16, 0x0a, 0x06, 0x4f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x4f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03, 0x52, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, + 0x61, 0x0a, 0x11, 0x53, 0x43, 0x46, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x65, 0x44, 0x72, 0x61, 0x67, + 0x6f, 0x6e, 0x4f, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x4f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x4f, 0x70, 0x52, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x4f, 0x70, 0x52, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x06, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x22, 0x64, 0x0a, 0x18, 0x53, 0x43, 0x46, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x65, 0x44, + 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x75, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x53, 0x75, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x05, + 0x52, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x37, 0x0a, 0x15, 0x53, 0x43, 0x46, 0x6f, + 0x72, 0x74, 0x75, 0x6e, 0x65, 0x44, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x42, 0x69, 0x6c, 0x6c, 0x65, + 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x53, 0x74, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x64, 0x53, 0x74, + 0x72, 0x2a, 0xa3, 0x02, 0x0a, 0x10, 0x46, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x65, 0x44, 0x72, 0x61, + 0x67, 0x6f, 0x6e, 0x50, 0x49, 0x44, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x46, 0x4f, 0x52, 0x54, 0x55, 0x4e, 0x45, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x5f, 0x5a, + 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x31, 0x0a, 0x2c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x46, 0x4f, 0x52, 0x54, 0x55, 0x4e, 0x45, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x5f, 0x53, 0x43, + 0x46, 0x4f, 0x52, 0x54, 0x55, 0x4e, 0x45, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x52, 0x4f, 0x4f, + 0x4d, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe0, 0x2b, 0x12, 0x2b, 0x0a, 0x26, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x54, 0x55, 0x4e, 0x45, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, + 0x5f, 0x43, 0x53, 0x46, 0x4f, 0x52, 0x54, 0x55, 0x4e, 0x45, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, + 0x4f, 0x50, 0x10, 0xe1, 0x2b, 0x12, 0x2b, 0x0a, 0x26, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x46, 0x4f, 0x52, 0x54, 0x55, 0x4e, 0x45, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x5f, 0x53, 0x43, + 0x46, 0x4f, 0x52, 0x54, 0x55, 0x4e, 0x45, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x4f, 0x50, 0x10, + 0xe2, 0x2b, 0x12, 0x32, 0x0a, 0x2d, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x46, 0x4f, 0x52, + 0x54, 0x55, 0x4e, 0x45, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x46, 0x4f, 0x52, + 0x54, 0x55, 0x4e, 0x45, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x52, 0x4f, 0x4f, 0x4d, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x10, 0xe3, 0x2b, 0x12, 0x2f, 0x0a, 0x2a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x46, 0x4f, 0x52, 0x54, 0x55, 0x4e, 0x45, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x5f, 0x53, + 0x43, 0x46, 0x4f, 0x52, 0x54, 0x55, 0x4e, 0x45, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x42, 0x49, + 0x4c, 0x4c, 0x45, 0x44, 0x10, 0xe4, 0x2b, 0x42, 0x2d, 0x5a, 0x2b, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x66, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x65, + 0x64, 0x72, 0x61, 0x67, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_fortunedragon_proto_rawDescOnce sync.Once + file_fortunedragon_proto_rawDescData = file_fortunedragon_proto_rawDesc +) + +func file_fortunedragon_proto_rawDescGZIP() []byte { + file_fortunedragon_proto_rawDescOnce.Do(func() { + file_fortunedragon_proto_rawDescData = protoimpl.X.CompressGZIP(file_fortunedragon_proto_rawDescData) + }) + return file_fortunedragon_proto_rawDescData +} + +var file_fortunedragon_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_fortunedragon_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_fortunedragon_proto_goTypes = []interface{}{ + (FortuneDragonPID)(0), // 0: fruits.FortuneDragonPID + (*FortuneDragonPlayerData)(nil), // 1: fruits.FortuneDragonPlayerData + (*SCFortuneDragonRoomInfo)(nil), // 2: fruits.SCFortuneDragonRoomInfo + (*CSFortuneDragonOp)(nil), // 3: fruits.CSFortuneDragonOp + (*SCFortuneDragonOp)(nil), // 4: fruits.SCFortuneDragonOp + (*SCFortuneDragonRoomState)(nil), // 5: fruits.SCFortuneDragonRoomState + (*SCFortuneDragonBilled)(nil), // 6: fruits.SCFortuneDragonBilled +} +var file_fortunedragon_proto_depIdxs = []int32{ + 1, // 0: fruits.SCFortuneDragonRoomInfo.Player:type_name -> fruits.FortuneDragonPlayerData + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_fortunedragon_proto_init() } +func file_fortunedragon_proto_init() { + if File_fortunedragon_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_fortunedragon_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FortuneDragonPlayerData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fortunedragon_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SCFortuneDragonRoomInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fortunedragon_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CSFortuneDragonOp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fortunedragon_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SCFortuneDragonOp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fortunedragon_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SCFortuneDragonRoomState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fortunedragon_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SCFortuneDragonBilled); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_fortunedragon_proto_rawDesc, + NumEnums: 1, + NumMessages: 6, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_fortunedragon_proto_goTypes, + DependencyIndexes: file_fortunedragon_proto_depIdxs, + EnumInfos: file_fortunedragon_proto_enumTypes, + MessageInfos: file_fortunedragon_proto_msgTypes, + }.Build() + File_fortunedragon_proto = out.File + file_fortunedragon_proto_rawDesc = nil + file_fortunedragon_proto_goTypes = nil + file_fortunedragon_proto_depIdxs = nil +} diff --git a/protocol/fortunedragon/fortunedragon.proto b/protocol/fortunedragon/fortunedragon.proto new file mode 100644 index 0000000..879c9e5 --- /dev/null +++ b/protocol/fortunedragon/fortunedragon.proto @@ -0,0 +1,67 @@ +syntax = "proto3"; +package fruits; +option go_package = "mongo.games.com/game/protocol/fortunedragon"; + +//fortunedragon +//龙 +enum FortuneDragonPID { + PACKET_FORTUNEDRAGON_ZERO = 0;// 弃用消息号 + PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMINFO = 5600; //房间信息 + PACKET_FORTUNEDRAGON_CSFORTUNEDRAGONOP = 5601; + PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONOP = 5602; + PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMSTATE = 5603; + PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONBILLED = 5604; +} + +message FortuneDragonPlayerData { + string Name = 1; //名字 + int32 SnId = 2; //账号 + int32 Head = 3; //头像 + int32 Sex = 4; //性别 + int64 Coin = 5; //金币 + int32 Pos = 6; //座位位置 + int32 Flag = 7; //二进制标记 + repeated string Params = 8; //其他数据 如:ip 等 + string City = 9; //城市 + int32 HeadOutLine = 10; //头像框 + int32 VIP = 11; +} +//房间信息 +//PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMINFO +message SCFortuneDragonRoomInfo { + int32 RoomId = 1; //房间id + int32 GameFreeId = 2; + int32 GameId = 3; //游戏id + int32 RoomMode = 4; //游戏模式 + repeated int32 Params = 5; //规则参数 + int32 NumOfGames = 6; //当前第几局 + int32 State = 7; //房间当前状态 + repeated int64 ParamsEx = 8; //其他参数 + int32 SceneType = 9; //房间模式 + FortuneDragonPlayerData Player = 10; //房间内的玩家信息 + string PlayerInfo = 11; +} +//玩家操作 +//PACKET_FORTUNEDRAGON_CSFORTUNEDRAGONOP +message CSFortuneDragonOp { + int32 OpCode = 1; //操作码 0.spin + repeated int64 Params = 2; //操作参数 下注索引编号 +} +//玩家操作返回 +//PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONOP +message SCFortuneDragonOp { + int32 OpCode = 1; //操作码 + int32 OpRetCode = 2; //操作结果 1.金币不足 2.低于该值不能押注 + repeated int64 Params = 3; //操作参数 +} +//房间状态 +//PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONROOMSTATE +message SCFortuneDragonRoomState { + int32 State = 1; //房间当前状态 + int32 SubState = 2; //房间当前子状态 + repeated int32 Params = 3; //状态参数 +} +//PACKET_FORTUNEDRAGON_SCFORTUNEDRAGONBILLED +message SCFortuneDragonBilled{ + string GameEndStr = 1; +} \ No newline at end of file