Compare commits
No commits in common. "628301eafa20daaaacf34e45419f53bfc64e18dd" and "7b19859179a65ed4fa37a42d22b357817360d796" have entirely different histories.
628301eafa
...
7b19859179
|
|
@ -1,22 +0,0 @@
|
|||
package gatesofolympus
|
||||
|
||||
// 房间类型
|
||||
const (
|
||||
RoomMode_Classic int = iota //经典
|
||||
RoomMode_Max
|
||||
)
|
||||
|
||||
// 场景状态
|
||||
const (
|
||||
GatesOfOlympusStateStart int = iota //默认状态
|
||||
GatesOfOlympusStateMax
|
||||
)
|
||||
|
||||
// 玩家操作
|
||||
const (
|
||||
GatesOfOlympusPlayerOpStart int = iota
|
||||
GatesOfOlympusPlayerOpSwitch
|
||||
)
|
||||
const NowByte int64 = 10000
|
||||
|
||||
const GameDataKey = "FortuneData"
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
package gatesofolympus
|
||||
|
||||
import (
|
||||
"mongo.games.com/game/common"
|
||||
"mongo.games.com/game/gamesrv/base"
|
||||
"mongo.games.com/game/protocol/gatesofolympus"
|
||||
"mongo.games.com/goserver/core/logger"
|
||||
"mongo.games.com/goserver/core/netlib"
|
||||
)
|
||||
|
||||
type CSGatesOfOlympusOpPacketFactory struct {
|
||||
}
|
||||
type CSGatesOfOlympusOpHandler struct {
|
||||
}
|
||||
|
||||
func (this *CSGatesOfOlympusOpPacketFactory) CreatePacket() interface{} {
|
||||
pack := &gatesofolympus.CSGatesOfOlympusOp{}
|
||||
return pack
|
||||
}
|
||||
|
||||
func (this *CSGatesOfOlympusOpHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
|
||||
if op, ok := data.(*gatesofolympus.CSGatesOfOlympusOp); ok {
|
||||
p := base.PlayerMgrSington.GetPlayer(sid)
|
||||
if p == nil {
|
||||
logger.Logger.Warn("CSGatesOfOlympusOpHandler p == nil")
|
||||
return nil
|
||||
}
|
||||
scene := p.GetScene()
|
||||
if scene == nil {
|
||||
logger.Logger.Warn("CSGatesOfOlympusOpHandler 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() {
|
||||
common.RegisterHandler(int(gatesofolympus.GatesOfOlympusPID_PACKET_GATESOFOLYMPUS_CSGATESOFOLYMPUSOP), &CSGatesOfOlympusOpHandler{})
|
||||
netlib.RegisterFactory(int(gatesofolympus.GatesOfOlympusPID_PACKET_GATESOFOLYMPUS_CSGATESOFOLYMPUSOP), &CSGatesOfOlympusOpPacketFactory{})
|
||||
}
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
package gatesofolympus
|
||||
|
||||
import (
|
||||
"mongo.games.com/game/gamerule/gatesofolympus"
|
||||
"mongo.games.com/game/gamesrv/base"
|
||||
"mongo.games.com/game/gamesrv/slotspkg/slots"
|
||||
)
|
||||
|
||||
type GatesOfOlympusPlayerData struct {
|
||||
*base.Player
|
||||
base.LabaLog
|
||||
leaveTime int32 //离开时间
|
||||
SlotsSession *base.SlotsSession
|
||||
|
||||
BetSizeIndex int64 `json:"bsi"` //选中的单注下标
|
||||
BetLevelIndex int64 `json:"bli"` //选中的等级下标
|
||||
BetLineIndex int64 `json:"bii"` //选中的线数下标
|
||||
BetMode int64 `json:"bm,optional"` //0.常规 1.%125 2.购买
|
||||
|
||||
taxCoin int64
|
||||
winCoin int64
|
||||
currentLogId string
|
||||
totalBet int64
|
||||
|
||||
isFree bool //只用于判断是否可以离开
|
||||
}
|
||||
type LinkPositions struct {
|
||||
Positions []int64 `json:"Positions,omitempty"`
|
||||
}
|
||||
type CustomEliminate struct {
|
||||
LinkPositions []*LinkPositions `json:"LinkPositions,omitempty"` //消除的位置
|
||||
AppendSymbols [][]int64 `json:"AppendSymbols,omitempty"` //新增
|
||||
FormattedSymbols [][]int64 `json:"FormattedSymbols,omitempty"` //最终的结果
|
||||
LinePays []float64 `json:"LinePays,omitempty"` //赔付
|
||||
WinCoins []float64 `json:"WinCoins,omitempty"` //输赢
|
||||
MultiStr string `json:"multi_str,omitempty"`
|
||||
MultiStrVal string `json:"multi_str_val,omitempty"`
|
||||
SymbolsAbove []int64 `json:"symbols_above,omitempty"`
|
||||
SymbolsBelow []int64 `json:"symbols_below,omitempty"`
|
||||
}
|
||||
type SpinLock struct {
|
||||
CustomEliminates []CustomEliminate `json:"CustomEliminates,omitempty"`
|
||||
Pay float64 `json:"Pay,omitempty"`
|
||||
Multi int64 `json:"Multi,omitempty"`
|
||||
SymbolsAbove []int64 `json:"symbols_above,omitempty"`
|
||||
SymbolsBelow []int64 `json:"symbols_below,omitempty"`
|
||||
}
|
||||
|
||||
func (p *GatesOfOlympusPlayerData) init() {
|
||||
p.SlotsSession = base.NewSession(uint64(p.SnId), p.Coin*gatesofolympus.NowByte)
|
||||
}
|
||||
func (p *GatesOfOlympusPlayerData) Clear() {
|
||||
p.taxCoin = 0
|
||||
p.winCoin = 0
|
||||
p.currentLogId = ""
|
||||
p.LabaLog.Clear()
|
||||
}
|
||||
|
||||
// 需要带到world上进行数据处理
|
||||
func (p *GatesOfOlympusPlayerData) PushPlayer() map[string]string {
|
||||
cache := slots.SlotsMgrSington.PushPlayer(p.SlotsSession)
|
||||
return cache
|
||||
}
|
||||
|
||||
// 进房的时候需要带进来
|
||||
func (p *GatesOfOlympusPlayerData) PullPlayer(data map[string]string) {
|
||||
slots.SlotsMgrSington.PullPlayer(p.SlotsSession, data)
|
||||
}
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
package gatesofolympus
|
||||
|
||||
import (
|
||||
"mongo.games.com/game/gamesrv/base"
|
||||
"mongo.games.com/game/gamesrv/slotspkg/assemble"
|
||||
)
|
||||
|
||||
type GatesOfOlympusSceneData struct {
|
||||
*base.Scene //场景
|
||||
players map[int32]*GatesOfOlympusPlayerData //玩家信息
|
||||
BetConfig *assemble.BetConfig
|
||||
}
|
||||
|
||||
func NewGatesOfOlympusSceneData(s *base.Scene) *GatesOfOlympusSceneData {
|
||||
sceneEx := &GatesOfOlympusSceneData{
|
||||
Scene: s,
|
||||
players: make(map[int32]*GatesOfOlympusPlayerData),
|
||||
}
|
||||
sceneEx.Init()
|
||||
return sceneEx
|
||||
}
|
||||
func (s *GatesOfOlympusSceneData) Init() {
|
||||
|
||||
}
|
||||
|
||||
func (s *GatesOfOlympusSceneData) Clear() {
|
||||
//应该是水池变一次就判断修改一次
|
||||
//s.slotRateWeight = s.slotRateWeightTotal[0]
|
||||
}
|
||||
func (s *GatesOfOlympusSceneData) SceneDestroy(force bool) {
|
||||
//销毁房间
|
||||
s.Scene.Destroy(force)
|
||||
}
|
||||
|
||||
func (s *GatesOfOlympusSceneData) delPlayer(SnId int32) {
|
||||
if _, exist := s.players[SnId]; exist {
|
||||
delete(s.players, SnId)
|
||||
}
|
||||
}
|
||||
func (s *GatesOfOlympusSceneData) OnPlayerLeave(p *base.Player, reason int) {
|
||||
if /*playerEx*/ _, ok := p.ExtraData.(*GatesOfOlympusPlayerData); ok {
|
||||
|
||||
}
|
||||
s.delPlayer(p.SnId)
|
||||
}
|
||||
|
|
@ -1,585 +0,0 @@
|
|||
package gatesofolympus
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"mongo.games.com/game/common"
|
||||
"mongo.games.com/game/gamerule/gatesofolympus"
|
||||
"mongo.games.com/game/gamesrv/base"
|
||||
"mongo.games.com/game/gamesrv/slotspkg/assemble"
|
||||
"mongo.games.com/game/gamesrv/slotspkg/slots"
|
||||
"mongo.games.com/game/model"
|
||||
"mongo.games.com/game/proto"
|
||||
protocol "mongo.games.com/game/protocol/gatesofolympus"
|
||||
"mongo.games.com/game/protocol/server"
|
||||
"mongo.games.com/goserver/core"
|
||||
"mongo.games.com/goserver/core/logger"
|
||||
"time"
|
||||
)
|
||||
|
||||
// ////////////////////////////////////////////////////////////
|
||||
var ScenePolicyGatesOfOlympusSington = &ScenePolicyGatesOfOlympus{}
|
||||
|
||||
type ScenePolicyGatesOfOlympus struct {
|
||||
base.BaseScenePolicy
|
||||
states [gatesofolympus.GatesOfOlympusStateMax]base.SceneState
|
||||
}
|
||||
|
||||
// 创建场景扩展数据
|
||||
func (this *ScenePolicyGatesOfOlympus) CreateSceneExData(s *base.Scene) interface{} {
|
||||
sceneEx := NewGatesOfOlympusSceneData(s)
|
||||
if sceneEx != nil {
|
||||
if sceneEx.GetInit() {
|
||||
s.SetExtraData(sceneEx)
|
||||
}
|
||||
}
|
||||
return sceneEx
|
||||
}
|
||||
|
||||
// 创建玩家扩展数据
|
||||
func (this *ScenePolicyGatesOfOlympus) CreatePlayerExData(s *base.Scene, p *base.Player) interface{} {
|
||||
playerEx := &GatesOfOlympusPlayerData{Player: p}
|
||||
p.SetExtraData(playerEx)
|
||||
return playerEx
|
||||
}
|
||||
|
||||
// 场景开启事件
|
||||
func (this *ScenePolicyGatesOfOlympus) OnStart(s *base.Scene) {
|
||||
logger.Logger.Trace("(this *ScenePolicyGatesOfOlympus) OnStart, sceneId=", s.GetSceneId())
|
||||
sceneEx := NewGatesOfOlympusSceneData(s)
|
||||
if sceneEx != nil {
|
||||
if sceneEx.GetInit() {
|
||||
s.SetExtraData(sceneEx)
|
||||
s.ChangeSceneState(gatesofolympus.GatesOfOlympusStateStart)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 场景关闭事件
|
||||
func (this *ScenePolicyGatesOfOlympus) OnStop(s *base.Scene) {
|
||||
logger.Logger.Trace("(this *ScenePolicyGatesOfOlympus) OnStop , sceneId=", s.GetSceneId())
|
||||
}
|
||||
|
||||
// 场景心跳事件
|
||||
func (this *ScenePolicyGatesOfOlympus) OnTick(s *base.Scene) {
|
||||
if s == nil {
|
||||
return
|
||||
}
|
||||
if s.GetSceneState() != nil {
|
||||
s.GetSceneState().OnTick(s)
|
||||
}
|
||||
}
|
||||
|
||||
// 玩家进入事件
|
||||
func (this *ScenePolicyGatesOfOlympus) OnPlayerEnter(s *base.Scene, p *base.Player) {
|
||||
if s == nil || p == nil {
|
||||
return
|
||||
}
|
||||
logger.Logger.Trace("(this *ScenePolicyGatesOfOlympus) OnPlayerEnter, sceneId=", s.GetSceneId(), " player=", p.Name)
|
||||
if sceneEx, ok := s.GetExtraData().(*GatesOfOlympusSceneData); ok {
|
||||
playerEx := &GatesOfOlympusPlayerData{Player: p}
|
||||
|
||||
playerEx.init()
|
||||
|
||||
d := p.GameData[gatesofolympus.GameDataKey]
|
||||
if d != nil {
|
||||
m := make(map[string]string)
|
||||
json.Unmarshal(d.Data.([]byte), &m)
|
||||
playerEx.PullPlayer(m)
|
||||
} else {
|
||||
m := make(map[string]string)
|
||||
//json.Unmarshal(d.Data.([]byte), &m)
|
||||
playerEx.PullPlayer(m)
|
||||
}
|
||||
|
||||
playerEx.SlotsSession.SetCoin(playerEx.Coin * gatesofolympus.NowByte)
|
||||
|
||||
playerEx.Clear()
|
||||
|
||||
sceneEx.players[p.SnId] = playerEx
|
||||
|
||||
p.SetExtraData(playerEx)
|
||||
GatesOfOlympusSendRoomInfo(s, sceneEx, playerEx)
|
||||
|
||||
s.FirePlayerEvent(p, base.PlayerEventEnter, nil)
|
||||
}
|
||||
}
|
||||
|
||||
// 玩家离开事件
|
||||
func (this *ScenePolicyGatesOfOlympus) OnPlayerLeave(s *base.Scene, p *base.Player, reason int) {
|
||||
if s == nil || p == nil {
|
||||
return
|
||||
}
|
||||
logger.Logger.Trace("(this *ScenePolicyGatesOfOlympus) OnPlayerLeave, sceneId=", s.GetSceneId(), " player=", p.SnId)
|
||||
if playerEx, ok := p.ExtraData.(*GatesOfOlympusPlayerData); ok {
|
||||
playerEx.LabaLog.Save(2) // 没有收到结束消息,算2秒游戏时长
|
||||
m := playerEx.PushPlayer()
|
||||
if m != nil && len(m) > 0 {
|
||||
b, err := json.Marshal(m)
|
||||
if err != nil {
|
||||
logger.Logger.Error("OnPlayerLeave, json.Marshal error:", err)
|
||||
} else {
|
||||
p.GameData[gatesofolympus.GameDataKey] = &model.PlayerGameData{
|
||||
Platform: p.Platform,
|
||||
SnId: p.SnId,
|
||||
Id: gatesofolympus.GameDataKey,
|
||||
Data: b,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if sceneEx, ok := s.ExtraData.(*GatesOfOlympusSceneData); ok {
|
||||
s.FirePlayerEvent(p, base.PlayerEventLeave, nil)
|
||||
sceneEx.OnPlayerLeave(p, reason)
|
||||
}
|
||||
}
|
||||
|
||||
// 玩家掉线
|
||||
func (this *ScenePolicyGatesOfOlympus) OnPlayerDropLine(s *base.Scene, p *base.Player) {
|
||||
if s == nil || p == nil {
|
||||
return
|
||||
}
|
||||
logger.Logger.Trace("(this *ScenePolicyGatesOfOlympus) OnPlayerDropLine, sceneId=", s.GetSceneId(), " player=", p.SnId)
|
||||
s.FirePlayerEvent(p, base.PlayerEventDropLine, nil)
|
||||
}
|
||||
|
||||
// 玩家重连
|
||||
func (this *ScenePolicyGatesOfOlympus) OnPlayerRehold(s *base.Scene, p *base.Player) {
|
||||
if s == nil || p == nil {
|
||||
return
|
||||
}
|
||||
logger.Logger.Trace("(this *ScenePolicyGatesOfOlympus) OnPlayerRehold, sceneId=", s.GetSceneId(), " player=", p.SnId)
|
||||
if sceneEx, ok := s.GetExtraData().(*GatesOfOlympusSceneData); ok {
|
||||
if playerEx, ok := p.GetExtraData().(*GatesOfOlympusPlayerData); ok {
|
||||
GatesOfOlympusSendRoomInfo(s, sceneEx, playerEx)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 返回房间
|
||||
func (this *ScenePolicyGatesOfOlympus) OnPlayerReturn(s *base.Scene, p *base.Player) {
|
||||
if s == nil || p == nil {
|
||||
return
|
||||
}
|
||||
logger.Logger.Trace("(this *ScenePolicyGatesOfOlympus) OnPlayerReturn, GetSceneId()=", s.GetSceneId(), " player=", p.Name)
|
||||
if sceneEx, ok := s.GetExtraData().(*GatesOfOlympusSceneData); ok {
|
||||
if playerEx, ok := p.GetExtraData().(*GatesOfOlympusPlayerData); ok {
|
||||
//if p.IsMarkFlag(base.PlayerState_Auto) {
|
||||
// p.UnmarkFlag(base.PlayerState_Auto)
|
||||
// p.SyncFlag()
|
||||
//}
|
||||
//发送房间信息给自己
|
||||
GatesOfOlympusSendRoomInfo(s, sceneEx, playerEx)
|
||||
s.FirePlayerEvent(p, base.PlayerEventReturn, nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func GatesOfOlympusSendRoomInfo(s *base.Scene, sceneEx *GatesOfOlympusSceneData, playerEx *GatesOfOlympusPlayerData) {
|
||||
pack := GatesOfOlympusCreateRoomInfoPacket(s, sceneEx, playerEx)
|
||||
logger.Logger.Trace("RoomInfo: ", pack)
|
||||
playerEx.SendToClient(int(protocol.GatesOfOlympusPID_PACKET_GATESOFOLYMPUS_SCGATESOFOLYMPUSROOMINFO), pack)
|
||||
}
|
||||
func GatesOfOlympusCreateRoomInfoPacket(s *base.Scene, sceneEx *GatesOfOlympusSceneData, playerEx *GatesOfOlympusPlayerData) interface{} {
|
||||
//房间信息
|
||||
pack := &protocol.SCGatesOfOlympusRoomInfo{
|
||||
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.GatesOfOlympusPlayerData{
|
||||
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
|
||||
}
|
||||
|
||||
//get data
|
||||
Response, err := slots.SlotsMgrSington.Enter(playerEx.SlotsSession, int64(s.GameId))
|
||||
if err == nil {
|
||||
data := assemble.DataToCli(Response).(assemble.TableInfo)
|
||||
pi, _ := json.Marshal(data)
|
||||
pack.PlayerInfo = string(pi)
|
||||
if sceneEx.BetConfig == nil {
|
||||
sceneEx.BetConfig = &data.BetConfig
|
||||
}
|
||||
} else {
|
||||
logger.Logger.Error("slots enter err:", err)
|
||||
}
|
||||
proto.SetDefaults(pack)
|
||||
return pack
|
||||
}
|
||||
func (this *ScenePolicyGatesOfOlympus) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool {
|
||||
if s == nil || p == nil {
|
||||
return false
|
||||
}
|
||||
logger.Logger.Trace("(this *ScenePolicyGatesOfOlympus) 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 *ScenePolicyGatesOfOlympus) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) {
|
||||
if s == nil || p == nil {
|
||||
return
|
||||
}
|
||||
logger.Logger.Trace("(this *ScenePolicyGatesOfOlympus) OnPlayerEvent, sceneId=", s.GetSceneId(), " player=", p.SnId, " eventcode=", evtcode, " params=", params)
|
||||
if s.GetSceneState() != nil {
|
||||
s.GetSceneState().OnPlayerEvent(s, p, evtcode, params)
|
||||
}
|
||||
}
|
||||
|
||||
// 当前状态能否换桌
|
||||
func (this *ScenePolicyGatesOfOlympus) 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 SceneBaseStateGatesOfOlympus struct {
|
||||
}
|
||||
|
||||
func (this *SceneBaseStateGatesOfOlympus) GetTimeout(s *base.Scene) int {
|
||||
if sceneEx, ok := s.GetExtraData().(*GatesOfOlympusSceneData); ok {
|
||||
return int(time.Now().Sub(sceneEx.GetStateStartTime()) / time.Second)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (this *SceneBaseStateGatesOfOlympus) CanChangeTo(s base.SceneState) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// 当前状态能否换桌
|
||||
func (this *SceneBaseStateGatesOfOlympus) CanChangeCoinScene(s *base.Scene, p *base.Player) bool {
|
||||
return true
|
||||
}
|
||||
func (this *SceneBaseStateGatesOfOlympus) OnEnter(s *base.Scene) {
|
||||
if sceneEx, ok := s.GetExtraData().(*GatesOfOlympusSceneData); ok {
|
||||
sceneEx.SetStateStartTime(time.Now())
|
||||
}
|
||||
}
|
||||
|
||||
func (this *SceneBaseStateGatesOfOlympus) OnLeave(s *base.Scene) {}
|
||||
func (this *SceneBaseStateGatesOfOlympus) OnTick(s *base.Scene) {
|
||||
if time.Now().Sub(s.GameStartTime) > time.Second*3 {
|
||||
if sceneEx, ok := s.ExtraData.(*GatesOfOlympusSceneData); 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 *SceneBaseStateGatesOfOlympus) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool {
|
||||
return false
|
||||
}
|
||||
func (this *SceneBaseStateGatesOfOlympus) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) {
|
||||
}
|
||||
|
||||
// ////////////////////////////////////////////////////////////
|
||||
// 开始状态
|
||||
// ////////////////////////////////////////////////////////////
|
||||
type SceneStateStartGatesOfOlympus struct {
|
||||
SceneBaseStateGatesOfOlympus
|
||||
}
|
||||
|
||||
func (this *SceneStateStartGatesOfOlympus) GetState() int {
|
||||
return gatesofolympus.GatesOfOlympusStateStart
|
||||
}
|
||||
|
||||
func (this *SceneStateStartGatesOfOlympus) CanChangeTo(s base.SceneState) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// 当前状态能否换桌
|
||||
func (this *SceneStateStartGatesOfOlympus) CanChangeCoinScene(s *base.Scene, p *base.Player) bool {
|
||||
if playerEx, ok := p.GetExtraData().(*GatesOfOlympusPlayerData); ok {
|
||||
if playerEx.isFree {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (this *SceneStateStartGatesOfOlympus) GetTimeout(s *base.Scene) int {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (this *SceneStateStartGatesOfOlympus) OnEnter(s *base.Scene) {
|
||||
this.SceneBaseStateGatesOfOlympus.OnEnter(s)
|
||||
if sceneEx, ok := s.GetExtraData().(*GatesOfOlympusSceneData); ok {
|
||||
sceneEx.SetGameNowTime(time.Now())
|
||||
}
|
||||
}
|
||||
|
||||
// 状态离开时
|
||||
func (this *SceneStateStartGatesOfOlympus) OnLeave(s *base.Scene) {
|
||||
this.SceneBaseStateGatesOfOlympus.OnLeave(s)
|
||||
logger.Logger.Tracef("(this *SceneStateStartGatesOfOlympus) OnLeave, sceneid=%v", s.GetSceneId())
|
||||
}
|
||||
|
||||
// 玩家操作
|
||||
func (this *SceneStateStartGatesOfOlympus) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool {
|
||||
logger.Logger.Tracef("(this *SceneStateStartGatesOfOlympus) OnPlayerOp, sceneid=%v params=%v", s.GetSceneId(), params)
|
||||
if this.SceneBaseStateGatesOfOlympus.OnPlayerOp(s, p, opcode, params) {
|
||||
return true
|
||||
}
|
||||
if sceneEx, ok := s.GetExtraData().(*GatesOfOlympusSceneData); ok {
|
||||
if playerEx, ok := p.GetExtraData().(*GatesOfOlympusPlayerData); ok {
|
||||
switch opcode {
|
||||
case gatesofolympus.GatesOfOlympusPlayerOpStart:
|
||||
playerEx.Clear()
|
||||
if len(params) < 4 {
|
||||
pack := &protocol.SCGatesOfOlympusBilled{
|
||||
OpRetCode: proto.Int32(1),
|
||||
}
|
||||
proto.SetDefaults(pack)
|
||||
logger.Logger.Trace("SCGatesOfOlympusBilled", pack.String())
|
||||
playerEx.SendToClient(int(protocol.GatesOfOlympusPID_PACKET_GATESOFOLYMPUS_SCGATESOFOLYMPUSBILLED), pack)
|
||||
return true
|
||||
}
|
||||
playerEx.BetSizeIndex = params[0]
|
||||
playerEx.BetLevelIndex = params[1]
|
||||
playerEx.BetLineIndex = params[2]
|
||||
playerEx.BetMode = params[3]
|
||||
needCoin := sceneEx.BetConfig.BetSize[params[0]] * float64(sceneEx.BetConfig.BetLevel[params[1]]) *
|
||||
float64(sceneEx.BetConfig.BetLines[params[2]]) * float64(sceneEx.BetConfig.BaseBet[params[2]])
|
||||
if needCoin > float64(playerEx.Coin) && !playerEx.isFree {
|
||||
pack := &protocol.SCGatesOfOlympusBilled{
|
||||
OpRetCode: proto.Int32(1),
|
||||
}
|
||||
proto.SetDefaults(pack)
|
||||
logger.Logger.Trace("SCGatesOfOlympusBilled:", pack.String())
|
||||
playerEx.SendToClient(int(protocol.GatesOfOlympusPID_PACKET_GATESOFOLYMPUS_SCGATESOFOLYMPUSBILLED), pack)
|
||||
return true
|
||||
}
|
||||
|
||||
//playerEx.SlotsSession.SetCoin(playerEx.Coin * gatesofolympus.NowByte)
|
||||
//logger.Logger.Trace("=============init dif coin", playerEx.Coin-playerEx.SlotsSession.Coin()/gatesofolympus.NowByte)
|
||||
|
||||
//get data
|
||||
Response, err := slots.SlotsMgrSington.Play(playerEx.SlotsSession, &base.SpinReq{
|
||||
GameId: int64(sceneEx.GameId),
|
||||
BetSizeIndex: playerEx.BetSizeIndex,
|
||||
BetLevelIndex: playerEx.BetLevelIndex,
|
||||
BetLineIndex: playerEx.BetLineIndex,
|
||||
BetMode: playerEx.BetMode,
|
||||
Ts: time.Now().Unix(),
|
||||
})
|
||||
var gameEndStr string
|
||||
var data assemble.GameEnd
|
||||
if err == nil {
|
||||
s.SetGameNowTime(time.Now())
|
||||
data = assemble.DataToCli(Response).(assemble.GameEnd)
|
||||
|
||||
data.BetSizeIndex = playerEx.BetSizeIndex
|
||||
data.BetLevelIndex = playerEx.BetLevelIndex
|
||||
data.LinesIndex = playerEx.BetLineIndex
|
||||
//data.BaseBetIndex = 1
|
||||
|
||||
data.Results[0].BetMode = playerEx.BetMode
|
||||
if data.Results[0].FreeStatus == 1 || data.Results[0].FreeNumMax == 0 {
|
||||
//logger.Logger.Trace("=====================AddCoin=====TotalBet===", -data.TotalBet)
|
||||
//第一次触发或者正常模式
|
||||
playerEx.AddCoin(int64(-data.TotalBet), common.GainWay_HundredSceneLost, base.SyncFlag_ToClient, "system", s.GetSceneName())
|
||||
playerEx.totalBet = int64(data.TotalBet)
|
||||
}
|
||||
var taxCoin float64
|
||||
if data.RoundReward > 0 {
|
||||
//税收比例
|
||||
taxRate := sceneEx.GetDBGameFree().GetTaxRate()
|
||||
if taxRate < 0 || taxRate > 10000 {
|
||||
taxRate = 500
|
||||
}
|
||||
taxCoin = data.RoundReward * float64(taxRate) / 10000
|
||||
data.RoundReward = data.RoundReward - taxCoin
|
||||
playerEx.AddServiceFee(int64(taxCoin))
|
||||
playerEx.taxCoin = int64(taxCoin)
|
||||
playerEx.winCoin = int64(data.RoundReward)
|
||||
}
|
||||
pi, _ := json.Marshal(data)
|
||||
gameEndStr = string(pi)
|
||||
|
||||
if data.Results[0].FreeStatus == 3 || data.Results[0].FreeNumMax == 0 {
|
||||
//logger.Logger.Trace("=====================AddCoin=====RoundReward===", data.RoundReward)
|
||||
playerEx.AddCoin(int64(data.RoundReward), common.GainWay_HundredSceneWin, 0, "system", s.GetSceneName())
|
||||
//免费游戏结束或者正常模式
|
||||
sceneEx.StaticsLaba(&base.StaticLabaParam{
|
||||
SnId: playerEx.SnId,
|
||||
Gain: int64(data.RoundReward - data.TotalBet),
|
||||
GainTax: int64(taxCoin),
|
||||
IsAddTimes: true,
|
||||
})
|
||||
}
|
||||
if data.Results[0].FreeNum > 0 {
|
||||
playerEx.isFree = true
|
||||
} else {
|
||||
playerEx.isFree = false
|
||||
}
|
||||
} else {
|
||||
logger.Logger.Error("slots Play err:", err)
|
||||
}
|
||||
|
||||
playerEx.SlotsSession.SetCoin(int64(data.FinalCoin) * gatesofolympus.NowByte)
|
||||
//logger.Logger.Trace("=====================end===== playerEx.Coin===", playerEx.Coin)
|
||||
//logger.Logger.Trace("=====================end===== data.FinalCoin===", data.FinalCoin)
|
||||
|
||||
pack := &protocol.SCGatesOfOlympusBilled{
|
||||
OpRetCode: proto.Int32(0),
|
||||
GameEndStr: proto.String(gameEndStr),
|
||||
}
|
||||
proto.SetDefaults(pack)
|
||||
logger.Logger.Trace("SCGatesOfOlympusBilled", pack.String())
|
||||
playerEx.SendToClient(int(protocol.GatesOfOlympusPID_PACKET_GATESOFOLYMPUS_SCGATESOFOLYMPUSBILLED), pack)
|
||||
|
||||
if playerEx.Coin != int64(data.FinalCoin) {
|
||||
logger.Logger.Error("==========playerEx.Coin != Response.Coin==============", playerEx.Coin, data.FinalCoin)
|
||||
}
|
||||
|
||||
// 记录本次操作
|
||||
GatesOfOlympusAndSaveLog(sceneEx, playerEx, data)
|
||||
case 1000:
|
||||
playerEx.Save(0)
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// 玩家事件
|
||||
func (this *SceneStateStartGatesOfOlympus) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) {
|
||||
logger.Logger.Trace("(this *SceneStateStartGatesOfOlympus) OnPlayerEvent, sceneId=", s.GetSceneId(), " player=", p.SnId, " evtcode=", evtcode)
|
||||
this.SceneBaseStateGatesOfOlympus.OnPlayerEvent(s, p, evtcode, params)
|
||||
}
|
||||
|
||||
func (this *SceneStateStartGatesOfOlympus) OnTick(s *base.Scene) {
|
||||
this.SceneBaseStateGatesOfOlympus.OnTick(s)
|
||||
}
|
||||
|
||||
// //////////////////////////////////////////////////////////////////////////////
|
||||
func (this *ScenePolicyGatesOfOlympus) RegisteSceneState(state base.SceneState) {
|
||||
if state == nil {
|
||||
return
|
||||
}
|
||||
stateid := state.GetState()
|
||||
if stateid < 0 || stateid >= gatesofolympus.GatesOfOlympusStateMax {
|
||||
return
|
||||
}
|
||||
this.states[stateid] = state
|
||||
}
|
||||
|
||||
func (this *ScenePolicyGatesOfOlympus) GetSceneState(s *base.Scene, stateid int) base.SceneState {
|
||||
if stateid >= 0 && stateid < gatesofolympus.GatesOfOlympusStateMax {
|
||||
return this.states[stateid]
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func GatesOfOlympusAndSaveLog(sceneEx *GatesOfOlympusSceneData, playerEx *GatesOfOlympusPlayerData, data assemble.GameEnd) {
|
||||
if !playerEx.IsRob {
|
||||
data.SnId = playerEx.SnId
|
||||
if data.Results[0].FreeStatus != 1 && data.Results[0].FreeNumMax != 0 {
|
||||
data.TotalBet = 0
|
||||
}
|
||||
info, err := model.MarshalGameNoteByROLL(data)
|
||||
if err == nil {
|
||||
logid, _ := model.AutoIncGameLogId()
|
||||
playerEx.currentLogId = logid
|
||||
var totalin, totalout int64
|
||||
if data.Results[0].FreeStatus == 1 || data.Results[0].FreeNumMax == 0 {
|
||||
totalin = playerEx.totalBet
|
||||
}
|
||||
if data.Results[0].FreeStatus == 3 || data.Results[0].FreeNumMax == 0 {
|
||||
totalout = int64(data.RoundReward) + playerEx.taxCoin
|
||||
}
|
||||
playerEx.Cache(sceneEx.Scene, &base.SaveGameDetailedParam{
|
||||
LogId: logid,
|
||||
Detail: info,
|
||||
}, &base.SaveGamePlayerListLogParam{
|
||||
LogId: logid,
|
||||
Platform: playerEx.Platform,
|
||||
Snid: playerEx.SnId,
|
||||
PlayerName: playerEx.Name,
|
||||
TotalIn: totalin,
|
||||
TotalOut: totalout,
|
||||
TaxCoin: playerEx.taxCoin,
|
||||
BetAmount: totalin,
|
||||
WinAmountNoAnyTax: totalout - totalin - playerEx.taxCoin,
|
||||
IsFirstGame: sceneEx.IsPlayerFirst(playerEx.Player),
|
||||
IsFree: playerEx.isFree,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
//统计输下注金币数
|
||||
if !sceneEx.Testing && !playerEx.IsRob {
|
||||
playerBet := &server.PlayerData{
|
||||
SnId: proto.Int32(playerEx.SnId),
|
||||
Bet: proto.Int64(playerEx.CurrentBet),
|
||||
Gain: proto.Int64(int64(data.RoundReward) + playerEx.taxCoin),
|
||||
Tax: proto.Int64(playerEx.taxCoin),
|
||||
Coin: proto.Int64(playerEx.GetCoin()),
|
||||
GameCoinTs: proto.Int64(playerEx.GameCoinTs),
|
||||
}
|
||||
gwPlayerBet := &server.GWPlayerData{
|
||||
SceneId: sceneEx.SceneId,
|
||||
GameFreeId: proto.Int32(sceneEx.GetDBGameFree().GetId()),
|
||||
}
|
||||
gwPlayerBet.Datas = append(gwPlayerBet.Datas, playerBet)
|
||||
sceneEx.SyncPlayerDatas(&base.PlayerDataParam{
|
||||
HasRobotGaming: false,
|
||||
Data: gwPlayerBet,
|
||||
})
|
||||
}
|
||||
|
||||
playerEx.taxCoin = 0
|
||||
playerEx.winCoin = 0
|
||||
|
||||
if sceneEx.CheckNeedDestroy() && data.Results[0].FreeNum <= 0 {
|
||||
sceneEx.SceneDestroy(true)
|
||||
}
|
||||
}
|
||||
func init() {
|
||||
//主状态
|
||||
ScenePolicyGatesOfOlympusSington.RegisteSceneState(&SceneStateStartGatesOfOlympus{})
|
||||
core.RegisteHook(core.HOOK_BEFORE_START, func() error {
|
||||
base.RegisteScenePolicy(common.GameId_GatesOfOlympus, gatesofolympus.RoomMode_Classic, ScenePolicyGatesOfOlympusSington)
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
|
@ -36,7 +36,6 @@ import (
|
|||
_ "mongo.games.com/game/gamesrv/fortunerabbit"
|
||||
_ "mongo.games.com/game/gamesrv/fortunetiger"
|
||||
_ "mongo.games.com/game/gamesrv/fruits"
|
||||
_ "mongo.games.com/game/gamesrv/gatesofolympus"
|
||||
_ "mongo.games.com/game/gamesrv/iceage"
|
||||
_ "mongo.games.com/game/gamesrv/richblessed"
|
||||
_ "mongo.games.com/game/gamesrv/slotspkg/slots"
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ type CustomFortune struct {
|
|||
FreeNumMax int64 `json:"fnm"` //总次数
|
||||
FreeNumTrigger int64 `json:"fnt"` //新增freespin
|
||||
ForceRound int64 `json:"fr"` //第n次
|
||||
ScatterWin int64 `json:"sw,omitempty"`
|
||||
}
|
||||
|
||||
func getDataByTheme(NodeTree *shared.LiteNodeTree) (map[int64]*shared.SpinLock, CustomFortune, int64) {
|
||||
|
|
|
|||
|
|
@ -1,21 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# 检查 "external" 目录是否存在,如果存在,则进入目录
|
||||
if [ -d "external" ]; then
|
||||
cd external
|
||||
fi
|
||||
|
||||
# 检查 converter 文件是否存在
|
||||
if [ ! -f "converter" ]; then
|
||||
echo "Building converter..."
|
||||
go build -o converter ../tools/converter
|
||||
else
|
||||
echo "converter already exists."
|
||||
fi
|
||||
|
||||
# 执行 converter 文件
|
||||
./converter go /excel ../internal/exported/excel2go ..
|
||||
|
||||
echo "Done."
|
||||
read -p "Press [Enter] to exit..."
|
||||
exit 0
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
|
@ -120,46 +120,6 @@ var (
|
|||
FortuneTigerSuperStackWeight = []*structs.FortuneTigerSuperStackWeight{}
|
||||
FortuneTigerSymbolBetRatio = []*structs.FortuneTigerSymbolBetRatio{}
|
||||
FortuneTigerSymbol = map[int64]*structs.FortuneTigerSymbol{}
|
||||
GatesOfOlympusBetBetChangeList = map[int64]*structs.GatesOfOlympusBetBetChangeList{}
|
||||
GatesOfOlympusBetBetLevel = map[int64]*structs.GatesOfOlympusBetBetLevel{}
|
||||
GatesOfOlympusBetBetLine = map[int64]*structs.GatesOfOlympusBetBetLine{}
|
||||
GatesOfOlympusBetBetSize = map[int64]*structs.GatesOfOlympusBetBetSize{}
|
||||
GatesOfOlympusBetFirstBet = map[int64]*structs.GatesOfOlympusBetFirstBet{}
|
||||
GatesOfOlympusFormation = []*structs.GatesOfOlympusFormation{}
|
||||
GatesOfOlympusMapRTPMode = map[int64]*structs.GatesOfOlympusMapRTPMode{}
|
||||
GatesOfOlympusMultiplier = []*structs.GatesOfOlympusMultiplier{}
|
||||
GatesOfOlympusMultiplierKeyID = map[int64]*structs.GatesOfOlympusMultiplierKeyID{}
|
||||
GatesOfOlympusReelBaseSpin1Range = [][]int64{}
|
||||
GatesOfOlympusReelBaseSpin1Reel = [][]int64{}
|
||||
GatesOfOlympusReelBaseSpin1Weight = [][]float64{}
|
||||
GatesOfOlympusReelBaseSpin2Range = [][]int64{}
|
||||
GatesOfOlympusReelBaseSpin2Reel = [][]int64{}
|
||||
GatesOfOlympusReelBaseSpin2Weight = [][]float64{}
|
||||
GatesOfOlympusReelBaseSpin3Range = [][]int64{}
|
||||
GatesOfOlympusReelBaseSpin3Reel = [][]int64{}
|
||||
GatesOfOlympusReelBaseSpin3Weight = [][]float64{}
|
||||
GatesOfOlympusReelBaseSpin7Range = [][]int64{}
|
||||
GatesOfOlympusReelBaseSpin7Reel = [][]int64{}
|
||||
GatesOfOlympusReelBaseSpin7Weight = [][]float64{}
|
||||
GatesOfOlympusReelBaseSpin8Range = [][]int64{}
|
||||
GatesOfOlympusReelBaseSpin8Reel = [][]int64{}
|
||||
GatesOfOlympusReelBaseSpin8Weight = [][]float64{}
|
||||
GatesOfOlympusReelBaseSpinRange = [][]int64{}
|
||||
GatesOfOlympusReelBaseSpinReel = [][]int64{}
|
||||
GatesOfOlympusReelBaseSpinWeight = [][]float64{}
|
||||
GatesOfOlympusReelChoose = []*structs.GatesOfOlympusReelChoose{}
|
||||
GatesOfOlympusReelFreeSpin4Range = [][]int64{}
|
||||
GatesOfOlympusReelFreeSpin4Reel = [][]int64{}
|
||||
GatesOfOlympusReelFreeSpin4Weight = [][]float64{}
|
||||
GatesOfOlympusReelFreeSpin5Range = [][]int64{}
|
||||
GatesOfOlympusReelFreeSpin5Reel = [][]int64{}
|
||||
GatesOfOlympusReelFreeSpin5Weight = [][]float64{}
|
||||
GatesOfOlympusReelFreeSpinRange = [][]int64{}
|
||||
GatesOfOlympusReelFreeSpinReel = [][]int64{}
|
||||
GatesOfOlympusReelFreeSpinWeight = [][]float64{}
|
||||
GatesOfOlympusScatter = map[int64]*structs.GatesOfOlympusScatter{}
|
||||
GatesOfOlympusSymbolBetRatio = []*structs.GatesOfOlympusSymbolBetRatio{}
|
||||
GatesOfOlympusSymbol = map[int64]*structs.GatesOfOlympusSymbol{}
|
||||
MatrixFeaturesForm15X1TypeA = []*structs.MatrixFeaturesForm15X1TypeA{}
|
||||
MatrixFeaturesForm19X1TypeA = []*structs.MatrixFeaturesForm19X1TypeA{}
|
||||
MatrixFeaturesForm20X1TypeA = []*structs.MatrixFeaturesForm20X1TypeA{}
|
||||
|
|
|
|||
|
|
@ -179,46 +179,6 @@ func StoragesLoading(data map[string]string) {
|
|||
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.GatesOfOlympus/Bet.BetChangeList", &base.GatesOfOlympusBetBetChangeList)
|
||||
Load(data, "Base.GatesOfOlympus/Bet.BetLevel", &base.GatesOfOlympusBetBetLevel)
|
||||
Load(data, "Base.GatesOfOlympus/Bet.BetLine", &base.GatesOfOlympusBetBetLine)
|
||||
Load(data, "Base.GatesOfOlympus/Bet.BetSize", &base.GatesOfOlympusBetBetSize)
|
||||
Load(data, "Base.GatesOfOlympus/Bet.FirstBet", &base.GatesOfOlympusBetFirstBet)
|
||||
Load(data, "Base.GatesOfOlympus/Formation.Default", &base.GatesOfOlympusFormation)
|
||||
Load(data, "Base.GatesOfOlympus/Map.RTPMode", &base.GatesOfOlympusMapRTPMode)
|
||||
Load(data, "Base.GatesOfOlympus/Multiplier.Default", &base.GatesOfOlympusMultiplier)
|
||||
Load(data, "Base.GatesOfOlympus/Multiplier.Default/ID", &base.GatesOfOlympusMultiplierKeyID)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin1.Range", &base.GatesOfOlympusReelBaseSpin1Range)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin1.Reel", &base.GatesOfOlympusReelBaseSpin1Reel)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin1.Weight", &base.GatesOfOlympusReelBaseSpin1Weight)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin2.Range", &base.GatesOfOlympusReelBaseSpin2Range)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin2.Reel", &base.GatesOfOlympusReelBaseSpin2Reel)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin2.Weight", &base.GatesOfOlympusReelBaseSpin2Weight)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin3.Range", &base.GatesOfOlympusReelBaseSpin3Range)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin3.Reel", &base.GatesOfOlympusReelBaseSpin3Reel)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin3.Weight", &base.GatesOfOlympusReelBaseSpin3Weight)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin7.Range", &base.GatesOfOlympusReelBaseSpin7Range)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin7.Reel", &base.GatesOfOlympusReelBaseSpin7Reel)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin7.Weight", &base.GatesOfOlympusReelBaseSpin7Weight)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin8.Range", &base.GatesOfOlympusReelBaseSpin8Range)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin8.Reel", &base.GatesOfOlympusReelBaseSpin8Reel)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin8.Weight", &base.GatesOfOlympusReelBaseSpin8Weight)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin.Range", &base.GatesOfOlympusReelBaseSpinRange)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin.Reel", &base.GatesOfOlympusReelBaseSpinReel)
|
||||
Load(data, "Base.GatesOfOlympus/ReelBaseSpin.Weight", &base.GatesOfOlympusReelBaseSpinWeight)
|
||||
Load(data, "Base.GatesOfOlympus/ReelChoose.Default", &base.GatesOfOlympusReelChoose)
|
||||
Load(data, "Base.GatesOfOlympus/ReelFreeSpin4.Range", &base.GatesOfOlympusReelFreeSpin4Range)
|
||||
Load(data, "Base.GatesOfOlympus/ReelFreeSpin4.Reel", &base.GatesOfOlympusReelFreeSpin4Reel)
|
||||
Load(data, "Base.GatesOfOlympus/ReelFreeSpin4.Weight", &base.GatesOfOlympusReelFreeSpin4Weight)
|
||||
Load(data, "Base.GatesOfOlympus/ReelFreeSpin5.Range", &base.GatesOfOlympusReelFreeSpin5Range)
|
||||
Load(data, "Base.GatesOfOlympus/ReelFreeSpin5.Reel", &base.GatesOfOlympusReelFreeSpin5Reel)
|
||||
Load(data, "Base.GatesOfOlympus/ReelFreeSpin5.Weight", &base.GatesOfOlympusReelFreeSpin5Weight)
|
||||
Load(data, "Base.GatesOfOlympus/ReelFreeSpin.Range", &base.GatesOfOlympusReelFreeSpinRange)
|
||||
Load(data, "Base.GatesOfOlympus/ReelFreeSpin.Reel", &base.GatesOfOlympusReelFreeSpinReel)
|
||||
Load(data, "Base.GatesOfOlympus/ReelFreeSpin.Weight", &base.GatesOfOlympusReelFreeSpinWeight)
|
||||
Load(data, "Base.GatesOfOlympus/Scatter.Default", &base.GatesOfOlympusScatter)
|
||||
Load(data, "Base.GatesOfOlympus/Symbol.BetRatio", &base.GatesOfOlympusSymbolBetRatio)
|
||||
Load(data, "Base.GatesOfOlympus/Symbol.Default", &base.GatesOfOlympusSymbol)
|
||||
Load(data, "Base.Matrix/FeaturesForm15X1TypeA.Default", &base.MatrixFeaturesForm15X1TypeA)
|
||||
Load(data, "Base.Matrix/FeaturesForm19X1TypeA.Default", &base.MatrixFeaturesForm19X1TypeA)
|
||||
Load(data, "Base.Matrix/FeaturesForm20X1TypeA.Default", &base.MatrixFeaturesForm20X1TypeA)
|
||||
|
|
@ -441,46 +401,6 @@ func StoragesMapping() {
|
|||
Set("Base", "FortuneTiger/SuperStack", "Weight", base.FortuneTigerSuperStackWeight)
|
||||
Set("Base", "FortuneTiger/Symbol", "BetRatio", base.FortuneTigerSymbolBetRatio)
|
||||
Set("Base", "FortuneTiger/Symbol", "Default", base.FortuneTigerSymbol)
|
||||
Set("Base", "GatesOfOlympus/Bet", "BetChangeList", base.GatesOfOlympusBetBetChangeList)
|
||||
Set("Base", "GatesOfOlympus/Bet", "BetLevel", base.GatesOfOlympusBetBetLevel)
|
||||
Set("Base", "GatesOfOlympus/Bet", "BetLine", base.GatesOfOlympusBetBetLine)
|
||||
Set("Base", "GatesOfOlympus/Bet", "BetSize", base.GatesOfOlympusBetBetSize)
|
||||
Set("Base", "GatesOfOlympus/Bet", "FirstBet", base.GatesOfOlympusBetFirstBet)
|
||||
Set("Base", "GatesOfOlympus/Formation", "Default", base.GatesOfOlympusFormation)
|
||||
Set("Base", "GatesOfOlympus/Map", "RTPMode", base.GatesOfOlympusMapRTPMode)
|
||||
Set("Base", "GatesOfOlympus/Multiplier", "Default", base.GatesOfOlympusMultiplier)
|
||||
Set("Base", "GatesOfOlympus/Multiplier", "Default/ID", base.GatesOfOlympusMultiplierKeyID)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin1", "Range", base.GatesOfOlympusReelBaseSpin1Range)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin1", "Reel", base.GatesOfOlympusReelBaseSpin1Reel)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin1", "Weight", base.GatesOfOlympusReelBaseSpin1Weight)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin2", "Range", base.GatesOfOlympusReelBaseSpin2Range)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin2", "Reel", base.GatesOfOlympusReelBaseSpin2Reel)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin2", "Weight", base.GatesOfOlympusReelBaseSpin2Weight)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin3", "Range", base.GatesOfOlympusReelBaseSpin3Range)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin3", "Reel", base.GatesOfOlympusReelBaseSpin3Reel)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin3", "Weight", base.GatesOfOlympusReelBaseSpin3Weight)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin7", "Range", base.GatesOfOlympusReelBaseSpin7Range)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin7", "Reel", base.GatesOfOlympusReelBaseSpin7Reel)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin7", "Weight", base.GatesOfOlympusReelBaseSpin7Weight)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin8", "Range", base.GatesOfOlympusReelBaseSpin8Range)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin8", "Reel", base.GatesOfOlympusReelBaseSpin8Reel)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin8", "Weight", base.GatesOfOlympusReelBaseSpin8Weight)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin", "Range", base.GatesOfOlympusReelBaseSpinRange)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin", "Reel", base.GatesOfOlympusReelBaseSpinReel)
|
||||
Set("Base", "GatesOfOlympus/ReelBaseSpin", "Weight", base.GatesOfOlympusReelBaseSpinWeight)
|
||||
Set("Base", "GatesOfOlympus/ReelChoose", "Default", base.GatesOfOlympusReelChoose)
|
||||
Set("Base", "GatesOfOlympus/ReelFreeSpin4", "Range", base.GatesOfOlympusReelFreeSpin4Range)
|
||||
Set("Base", "GatesOfOlympus/ReelFreeSpin4", "Reel", base.GatesOfOlympusReelFreeSpin4Reel)
|
||||
Set("Base", "GatesOfOlympus/ReelFreeSpin4", "Weight", base.GatesOfOlympusReelFreeSpin4Weight)
|
||||
Set("Base", "GatesOfOlympus/ReelFreeSpin5", "Range", base.GatesOfOlympusReelFreeSpin5Range)
|
||||
Set("Base", "GatesOfOlympus/ReelFreeSpin5", "Reel", base.GatesOfOlympusReelFreeSpin5Reel)
|
||||
Set("Base", "GatesOfOlympus/ReelFreeSpin5", "Weight", base.GatesOfOlympusReelFreeSpin5Weight)
|
||||
Set("Base", "GatesOfOlympus/ReelFreeSpin", "Range", base.GatesOfOlympusReelFreeSpinRange)
|
||||
Set("Base", "GatesOfOlympus/ReelFreeSpin", "Reel", base.GatesOfOlympusReelFreeSpinReel)
|
||||
Set("Base", "GatesOfOlympus/ReelFreeSpin", "Weight", base.GatesOfOlympusReelFreeSpinWeight)
|
||||
Set("Base", "GatesOfOlympus/Scatter", "Default", base.GatesOfOlympusScatter)
|
||||
Set("Base", "GatesOfOlympus/Symbol", "BetRatio", base.GatesOfOlympusSymbolBetRatio)
|
||||
Set("Base", "GatesOfOlympus/Symbol", "Default", base.GatesOfOlympusSymbol)
|
||||
Set("Base", "Matrix/FeaturesForm15X1TypeA", "Default", base.MatrixFeaturesForm15X1TypeA)
|
||||
Set("Base", "Matrix/FeaturesForm19X1TypeA", "Default", base.MatrixFeaturesForm19X1TypeA)
|
||||
Set("Base", "Matrix/FeaturesForm20X1TypeA", "Default", base.MatrixFeaturesForm20X1TypeA)
|
||||
|
|
@ -620,12 +540,6 @@ func LinksMapping() {
|
|||
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")
|
||||
|
|
@ -722,4 +636,3 @@ func Load(dataMap map[string]string, name string, v interface{}) {
|
|||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -172,19 +172,6 @@ type (
|
|||
FreeSpinCount int64
|
||||
MaxWin int64
|
||||
}
|
||||
// GatesOfOlympusMultiplier comment
|
||||
GatesOfOlympusMultiplier struct {
|
||||
Multiple int64
|
||||
ID int64
|
||||
Weights []int64
|
||||
}
|
||||
// GatesOfOlympusReelChoose comment
|
||||
GatesOfOlympusReelChoose struct {
|
||||
ID int64
|
||||
IsFreeSpin bool
|
||||
NodeType string
|
||||
Weights []int64
|
||||
}
|
||||
// JackpotPrize comment
|
||||
JackpotPrize struct {
|
||||
PrizeType int64
|
||||
|
|
@ -534,42 +521,6 @@ type (
|
|||
// FortuneTigerSymbolBetRatio comment
|
||||
FortuneTigerSymbolBetRatio = SymbolBetRatio
|
||||
|
||||
// GatesOfOlympusBetBetChangeList comment
|
||||
GatesOfOlympusBetBetChangeList = BetChangeList
|
||||
|
||||
// GatesOfOlympusBetBetLevel comment
|
||||
GatesOfOlympusBetBetLevel = BetLevel
|
||||
|
||||
// GatesOfOlympusBetBetLine comment
|
||||
GatesOfOlympusBetBetLine = BetLine
|
||||
|
||||
// GatesOfOlympusBetBetSize comment
|
||||
GatesOfOlympusBetBetSize = BetSize
|
||||
|
||||
// GatesOfOlympusBetFirstBet comment
|
||||
GatesOfOlympusBetFirstBet = FirstBet
|
||||
|
||||
// GatesOfOlympusFormation comment
|
||||
GatesOfOlympusFormation = Formation
|
||||
|
||||
// GatesOfOlympusMapRTPMode comment
|
||||
GatesOfOlympusMapRTPMode = MapRTPMode
|
||||
|
||||
// GatesOfOlympusMapRTPModeTypeWeight comment
|
||||
GatesOfOlympusMapRTPModeTypeWeight = MapRTPModeTypeWeight
|
||||
|
||||
// GatesOfOlympusMultiplierKeyID comment
|
||||
GatesOfOlympusMultiplierKeyID = GatesOfOlympusMultiplier
|
||||
|
||||
// GatesOfOlympusScatter comment
|
||||
GatesOfOlympusScatter = Scatter
|
||||
|
||||
// GatesOfOlympusSymbol comment
|
||||
GatesOfOlympusSymbol = Symbol
|
||||
|
||||
// GatesOfOlympusSymbolBetRatio comment
|
||||
GatesOfOlympusSymbolBetRatio = SymbolBetRatio
|
||||
|
||||
// MatrixFeaturesForm15X1TypeA comment
|
||||
MatrixFeaturesForm15X1TypeA = Matrix
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ const (
|
|||
FortuneOx = "FortuneOx"
|
||||
FortuneMouse = "FortuneMouse"
|
||||
CashMania = "CashMania"
|
||||
GatesOfOlympus = "GatesOfOlympus"
|
||||
Test = "Test"
|
||||
)
|
||||
const (
|
||||
|
|
@ -18,7 +17,6 @@ const (
|
|||
GameId_OX
|
||||
GameId_Mouse
|
||||
GameId_Cash_Mania
|
||||
GameId_GatesOfOlympus
|
||||
|
||||
GameId_Max
|
||||
GameId_Test = 999
|
||||
|
|
@ -31,7 +29,6 @@ var GameMap = map[uint]string{
|
|||
GameId_OX: FortuneOx,
|
||||
GameId_Mouse: FortuneMouse,
|
||||
GameId_Cash_Mania: CashMania,
|
||||
GameId_GatesOfOlympus: GatesOfOlympus,
|
||||
GameId_Test: Test,
|
||||
}
|
||||
var GameMapTheme = map[string]uint{
|
||||
|
|
@ -41,7 +38,6 @@ var GameMapTheme = map[string]uint{
|
|||
FortuneOx: GameId_OX,
|
||||
FortuneMouse: GameId_Mouse,
|
||||
CashMania: GameId_Cash_Mania,
|
||||
GatesOfOlympus: GameId_GatesOfOlympus,
|
||||
Test: GameId_Test,
|
||||
}
|
||||
var GameKeyMap = map[int64]uint{
|
||||
|
|
@ -51,7 +47,5 @@ var GameKeyMap = map[int64]uint{
|
|||
310: GameId_Rabbit,
|
||||
311: GameId_OX,
|
||||
312: GameId_Mouse,
|
||||
313: GameId_Cash_Mania,
|
||||
314: GameId_GatesOfOlympus,
|
||||
999: GameId_Max,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,18 +58,6 @@ type GameEndDto struct {
|
|||
ActualWin int64 `json:"actualWin"`
|
||||
}
|
||||
|
||||
type CustomEliminate struct {
|
||||
LinkPositions []*LinkPositions `json:"LinkPositions,omitempty"` //消除的位置
|
||||
AppendSymbols [][]int64 `json:"AppendSymbols,omitempty"` //新增
|
||||
FormattedSymbols [][]int64 `json:"FormattedSymbols,omitempty"` //最终的结果
|
||||
LinePays []float64 `json:"LinePays,omitempty"` //赔付
|
||||
WinCoins []float64 `json:"WinCoins,omitempty"` //输赢
|
||||
MultiStr string `json:"multi_str,omitempty"`
|
||||
MultiStrVal string `json:"multi_str_val,omitempty"`
|
||||
SymbolsAbove []int64 `json:"symbols_above,omitempty"`
|
||||
SymbolsBelow []int64 `json:"symbols_below,omitempty"`
|
||||
}
|
||||
|
||||
// Special
|
||||
type SpinLock struct {
|
||||
//tigerSpecial
|
||||
|
|
@ -93,13 +81,4 @@ type SpinLock struct {
|
|||
Multiple int64 `json:"multiple,omitempty"` //倍乘倍数
|
||||
Irv [][]float64 `json:"irv,omitempty"`
|
||||
Frv [][]float64 `json:"frv,omitempty"`
|
||||
|
||||
//GatesOfOlympus
|
||||
CustomEliminates []CustomEliminate `json:"CustomEliminates,omitempty"`
|
||||
Pay float64 `json:"Pay,omitempty"`
|
||||
Multi int64 `json:"Multi,omitempty"`
|
||||
MultiStr string `json:"multi_str,omitempty"`
|
||||
MultiStrVal string `json:"multi_str_val,omitempty"`
|
||||
SymbolsAbove []int64 `json:"symbols_above,omitempty"`
|
||||
SymbolsBelow []int64 `json:"symbols_below,omitempty"`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -122,18 +122,6 @@ func (n *MachineDesc) BetChangeList() []float64 {
|
|||
}
|
||||
return lists
|
||||
}
|
||||
func (n *MachineDesc) GetBetIndexByVal(val float64) []int64 {
|
||||
betChangeListRows, ok := n.Sheet("Bet", "BetChangeList").(map[int64]*structs.BetChangeList)
|
||||
if !ok {
|
||||
panic(errors.ConfigTypeError.ErrorWith(n.Theme, "BetChangeList"))
|
||||
}
|
||||
for _, list := range betChangeListRows {
|
||||
if list.BetChangeList == val {
|
||||
return []int64{list.BetSizeIndex, list.BetLevelIndex}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
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)
|
||||
|
|
|
|||
|
|
@ -13,8 +13,6 @@ type Formation struct {
|
|||
NodeType string
|
||||
FormationDesc *desc.FormationDesc
|
||||
Symbols []int64
|
||||
SymbolsAbove []int64
|
||||
SymbolsBelow []int64
|
||||
RandPositions []int64
|
||||
CheatSymbols []int64
|
||||
DisplaySymbols []int64
|
||||
|
|
@ -74,8 +72,6 @@ func NewFormation(n *desc.NodeDesc, seqID int64) (*Formation, error) {
|
|||
NodeType: n.NodeType,
|
||||
FormationDesc: formationDesc,
|
||||
Symbols: nil,
|
||||
SymbolsAbove: nil,
|
||||
SymbolsBelow: nil,
|
||||
RandPositions: nil,
|
||||
CheatSymbols: nil,
|
||||
DisplaySymbols: nil,
|
||||
|
|
@ -100,16 +96,12 @@ func (f *Formation) Rand(r *randx.Randx) {
|
|||
symbol := reelDesc.Reel[symbolIdx%length]
|
||||
f.Symbols = append(f.Symbols, symbol)
|
||||
}
|
||||
f.SymbolsAbove = append(f.SymbolsAbove, reelDesc.Reel[(startIdx+reelDesc.Range-1)%length])
|
||||
f.SymbolsBelow = append(f.SymbolsBelow, reelDesc.Reel[(startIdx+reelDesc.Range)%length])
|
||||
}
|
||||
}
|
||||
|
||||
func (f *Formation) ResetRandSymbols(r *randx.Randx) {
|
||||
f.RandPositions = nil
|
||||
f.Symbols = nil
|
||||
f.SymbolsAbove = nil
|
||||
f.SymbolsBelow = nil
|
||||
for _, reelDesc := range f.FormationDesc.ReelsDesc {
|
||||
// 经测试:缓存权重 和 二分查找 对权重随机性能的提升微乎其微,没必要优化
|
||||
startIdx := int64(randx.RandWeight(r, reelDesc.Weights))
|
||||
|
|
@ -119,15 +111,11 @@ func (f *Formation) ResetRandSymbols(r *randx.Randx) {
|
|||
symbol := reelDesc.Reel[symbolIdx%length]
|
||||
f.Symbols = append(f.Symbols, symbol)
|
||||
}
|
||||
f.SymbolsAbove = append(f.SymbolsAbove, reelDesc.Reel[(startIdx-1)%length])
|
||||
f.SymbolsBelow = append(f.SymbolsBelow, reelDesc.Reel[(startIdx+reelDesc.Range)%length])
|
||||
}
|
||||
}
|
||||
func (f *Formation) ResetRandSymbolsByIndex(r *randx.Randx) {
|
||||
f.RandPositions = nil
|
||||
f.Symbols = nil
|
||||
f.SymbolsAbove = nil
|
||||
f.SymbolsBelow = nil
|
||||
for _, reelDesc := range f.FormationDesc.ReelsDesc {
|
||||
// 经测试:缓存权重 和 二分查找 对权重随机性能的提升微乎其微,没必要优化
|
||||
startIdx := int64(r.Intn(len(reelDesc.Weights)))
|
||||
|
|
@ -137,8 +125,6 @@ func (f *Formation) ResetRandSymbolsByIndex(r *randx.Randx) {
|
|||
symbol := reelDesc.Reel[symbolIdx%length]
|
||||
f.Symbols = append(f.Symbols, symbol)
|
||||
}
|
||||
f.SymbolsAbove = append(f.SymbolsAbove, reelDesc.Reel[(startIdx-1)%length])
|
||||
f.SymbolsBelow = append(f.SymbolsBelow, reelDesc.Reel[(startIdx+reelDesc.Range)%length])
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,8 +16,6 @@ type Formation interface {
|
|||
SetInitFormattedSymbols(symbols [][]int64) Formation
|
||||
|
||||
GetSymbols() []int64
|
||||
GetSymbolsAbove() []int64
|
||||
GetSymbolsBelow() []int64
|
||||
SetSymbols(symbols []int64) Formation
|
||||
GetReelFormattedSymbols() [][]int64
|
||||
GetMatrixFormattedSymbols() [][]int64
|
||||
|
|
@ -43,8 +41,6 @@ type Formation interface {
|
|||
GetMatrixFormattedFinalSymbols() [][]int64
|
||||
SetFormattedFinalSymbols(symbols [][]int64) Formation
|
||||
|
||||
GetMatrixFormattedBySymbols(symbols []int64) [][]int64
|
||||
|
||||
GetLinkPositions() []*shared.LinkPositions
|
||||
SetLinkPositions(linkPositions []*shared.LinkPositions) Formation
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,6 @@ type Spinner interface {
|
|||
BetLines() []int64
|
||||
BaseBets() []int64
|
||||
BetChangeList() []float64
|
||||
GetBetIndexByVal(val float64) []int64
|
||||
|
||||
Choice() int64
|
||||
Stay() bool
|
||||
|
|
|
|||
|
|
@ -65,20 +65,6 @@ func (f *Formation) GetSymbols() []int64 {
|
|||
return symbols
|
||||
}
|
||||
|
||||
// GetSymbolsAbove gets origin SymbolsAbove
|
||||
func (f *Formation) GetSymbolsAbove() []int64 {
|
||||
symbolsAbove := make([]int64, len(f.OriginFormation.SymbolsAbove))
|
||||
copy(symbolsAbove, f.OriginFormation.SymbolsAbove)
|
||||
return symbolsAbove
|
||||
}
|
||||
|
||||
// GetSymbolsBelow gets origin SymbolsBelow
|
||||
func (f *Formation) GetSymbolsBelow() []int64 {
|
||||
symbolsBelow := make([]int64, len(f.OriginFormation.SymbolsBelow))
|
||||
copy(symbolsBelow, f.OriginFormation.SymbolsBelow)
|
||||
return symbolsBelow
|
||||
}
|
||||
|
||||
// SetSymbols sets origin symbols
|
||||
func (f *Formation) SetSymbols(symbols []int64) intf.Formation {
|
||||
f.OriginFormation.Symbols = symbols
|
||||
|
|
@ -197,12 +183,6 @@ func (f *Formation) GetMatrixFormattedFinalSymbols() [][]int64 {
|
|||
f.OriginFormation.MatrixForm)
|
||||
}
|
||||
|
||||
// GetMatrixFormattedBySymbols gets symbols and places them into specific form
|
||||
func (f *Formation) GetMatrixFormattedBySymbols(symbols []int64) [][]int64 {
|
||||
return formation.FormatSymbols(symbols,
|
||||
f.OriginFormation.MatrixForm)
|
||||
}
|
||||
|
||||
// SetFormattedFinalSymbols sets formed final symbols
|
||||
func (f *Formation) SetFormattedFinalSymbols(symbols [][]int64) intf.Formation {
|
||||
f.Formation.FinalSymbols = formation.DeformatSymbols(symbols)
|
||||
|
|
|
|||
|
|
@ -45,9 +45,6 @@ func (m *Machine) BaseBets() []int64 {
|
|||
func (m *Machine) BetChangeList() []float64 {
|
||||
return m.MachineDesc.BetChangeList()
|
||||
}
|
||||
func (m *Machine) GetBetIndexByVal(val float64) []int64 {
|
||||
return m.MachineDesc.GetBetIndexByVal(val)
|
||||
}
|
||||
func (m *Machine) Choice() int64 {
|
||||
if m.UserData().ForceChoice > 0 {
|
||||
return m.UserData().ForceChoice
|
||||
|
|
|
|||
|
|
@ -1,36 +0,0 @@
|
|||
package gatesofolympus
|
||||
|
||||
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.GatesOfOlympus
|
||||
}
|
||||
|
||||
func (p *PluginChooseWheel) OnStepBegin(m intf.Master) {
|
||||
isFreeSpin := m.Next().GetType() == FreeSpin
|
||||
typ := m.Choice()
|
||||
|
||||
nodeName := Descx(m).RandWheel(isFreeSpin, typ)
|
||||
if !isFreeSpin {
|
||||
if typ == RoundTypeMoreScatter {
|
||||
nodeName = "MoreScatter" + nodeName
|
||||
m.SetRatio(key.MachineRatioMoreCoinMoreBet, 1.25)
|
||||
} else if typ == RoundTypeBuyFreeSpin {
|
||||
m.SetRatio(key.MachineRatioMoreCoinSameBet, 100)
|
||||
}
|
||||
}
|
||||
m.Set(key.MachineFormationSeqsDesc, nodeName)
|
||||
|
||||
// 设置日志中的RoundType
|
||||
if m.Next().GetType() == BaseSpin {
|
||||
m.Set(key.MachineRoundType, typ)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
package gatesofolympus
|
||||
|
||||
const (
|
||||
BaseSpin = "BaseSpin"
|
||||
FreeSpin = "FreeSpin"
|
||||
)
|
||||
|
||||
const (
|
||||
RoundTypeBaseSpin = iota
|
||||
RoundTypeMoreScatter // 25% more cost
|
||||
RoundTypeBuyFreeSpin // 10000% more cost
|
||||
)
|
||||
|
||||
const (
|
||||
MultiplierBaseSpin = iota
|
||||
MultiplierFreeSpin
|
||||
MultiplierNoWin
|
||||
)
|
||||
|
||||
const (
|
||||
SymbolMultiplier = int64(12)
|
||||
)
|
||||
|
||||
type CustomFortune struct {
|
||||
FreeStatus int `json:"fs"`
|
||||
FreeSpinNum int64 `json:"fsn"` //剩余freespin
|
||||
FreeNumMax int64 `json:"fnm"` //总次数
|
||||
FreeNumTrigger int64 `json:"fnt"` //新增freespin
|
||||
ScatterWin int64 `json:"sw,omitempty"`
|
||||
}
|
||||
|
|
@ -1,84 +0,0 @@
|
|||
package gatesofolympus
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"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(),
|
||||
}
|
||||
}
|
||||
|
||||
func (n descx) RandWheel(isFreeSpin bool, typ int64) string {
|
||||
sheet := n.DefaultSheet("ReelChoose")
|
||||
rows, ok := sheet.([]*structs.GatesOfOlympusReelChoose)
|
||||
if !ok {
|
||||
panic(errors.ConfigTypeError.ErrorWith(n.Theme, "ReelChoose"))
|
||||
}
|
||||
|
||||
var weights = make(map[int]int64, 0)
|
||||
for idx, row := range rows {
|
||||
if row.IsFreeSpin == isFreeSpin {
|
||||
weights[idx] = row.Weights[int(typ)]
|
||||
}
|
||||
}
|
||||
|
||||
idx := randx.RandWeightMap(n.Randx, weights)
|
||||
return rows[idx].NodeType
|
||||
}
|
||||
|
||||
func (n descx) RandMultiplier(typ int64) int64 {
|
||||
sheet := n.DefaultSheet("Multiplier")
|
||||
rows, ok := sheet.([]*structs.GatesOfOlympusMultiplier)
|
||||
if !ok {
|
||||
panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Multiplier"))
|
||||
}
|
||||
|
||||
var weights = make([]int64, 0, len(rows))
|
||||
for _, row := range rows {
|
||||
weights = append(weights, row.Weights[typ])
|
||||
}
|
||||
|
||||
idx := randx.RandWeight(n.Randx, weights)
|
||||
return rows[idx].ID
|
||||
}
|
||||
|
||||
func (n descx) GetMultiBySymbol(symbol int64) int64 {
|
||||
sheet := n.KeySheet("Multiplier", "Default", "ID")
|
||||
rows, ok := sheet.(map[int64]*structs.GatesOfOlympusMultiplier)
|
||||
if !ok {
|
||||
panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Multiplier"))
|
||||
}
|
||||
|
||||
row, ok := rows[symbol]
|
||||
if !ok {
|
||||
return 0
|
||||
}
|
||||
|
||||
return row.Multiple
|
||||
}
|
||||
func (n descx) GetMultiStr() string {
|
||||
sheet := n.KeySheet("Multiplier", "Default", "ID")
|
||||
rows, ok := sheet.(map[int64]*structs.GatesOfOlympusMultiplier)
|
||||
if !ok {
|
||||
panic(errors.ConfigTypeError.ErrorWith(n.Theme, "Multiplier"))
|
||||
}
|
||||
var multiples = make(map[int64]int64)
|
||||
for _, v := range rows {
|
||||
multiples[v.ID] = v.Multiple
|
||||
}
|
||||
multiplesByte, _ := json.Marshal(multiples)
|
||||
return string(multiplesByte)
|
||||
}
|
||||
|
|
@ -1,239 +0,0 @@
|
|||
package gatesofolympus
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/mohae/deepcopy"
|
||||
"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/intf"
|
||||
"mongo.games.com/game/gamesrv/slotspkg/slots/plugin/generic"
|
||||
)
|
||||
|
||||
type PluginEliminate struct {
|
||||
generic.PluginBase
|
||||
}
|
||||
|
||||
type CustomEliminate struct {
|
||||
LinkPositions []*shared.LinkPositions `json:"LinkPositions,omitempty"` //消除的位置
|
||||
AppendSymbols [][]int64 `json:"AppendSymbols,omitempty"` //新增
|
||||
FormattedSymbols [][]int64 `json:"FormattedSymbols,omitempty"` //最终的结果
|
||||
LinePays []float64 `json:"LinePays,omitempty"` //赔付
|
||||
WinCoins []float64 `json:"WinCoins,omitempty"` //输赢
|
||||
MultiStr string `json:"multi_str,omitempty"`
|
||||
SymbolsAbove []int64 `json:"symbols_above,omitempty"`
|
||||
SymbolsBelow []int64 `json:"symbols_below,omitempty"`
|
||||
}
|
||||
|
||||
type CustomMulti struct {
|
||||
Multi int64
|
||||
MultiStr string
|
||||
MultiStrVal string
|
||||
}
|
||||
|
||||
type CustomPay struct {
|
||||
Pay float64
|
||||
}
|
||||
|
||||
func (p *PluginEliminate) Theme() string {
|
||||
return key.GatesOfOlympus
|
||||
}
|
||||
|
||||
func (p *PluginEliminate) Customs() []interface{} {
|
||||
return []interface{}{
|
||||
&CustomEliminate{},
|
||||
&CustomMulti{},
|
||||
&CustomPay{},
|
||||
&CustomFortune{},
|
||||
}
|
||||
}
|
||||
|
||||
func (p *PluginEliminate) OnInit(m intf.Master) {
|
||||
if len(m.RootCustoms(&CustomMulti{})) == 0 {
|
||||
m.AddRootFeature(&CustomMulti{})
|
||||
}
|
||||
}
|
||||
|
||||
func (p *PluginEliminate) OnEnterNode(m intf.Master) {
|
||||
if m.Cursor().GetType() == key.BaseSpin {
|
||||
m.RootCustom(&CustomMulti{}).(*CustomMulti).Multi = 0
|
||||
}
|
||||
}
|
||||
|
||||
func (p *PluginEliminate) BeforeSpin(m intf.Master) {
|
||||
m.AddCursorFeature(&CustomPay{}).SetLifetime(1)
|
||||
}
|
||||
|
||||
func (p *PluginEliminate) AfterSpin(m intf.Master) {
|
||||
cursorFormation := m.CursorFormation()
|
||||
formattedSymbols := cursorFormation.GetReelFormattedDisplaySymbols()
|
||||
|
||||
//f := getCustomFortune(m)
|
||||
//if f.FreeSpinNum == 13 {
|
||||
// formattedSymbols[0][0] = 1
|
||||
// formattedSymbols[0][1] = 1
|
||||
// formattedSymbols[0][2] = 1
|
||||
//}
|
||||
|
||||
appendFormattedSymbols := deepcopy.Copy(formattedSymbols).([][]int64)
|
||||
randPositions := cursorFormation.GetRandPositions()
|
||||
|
||||
// 清空基础赢钱
|
||||
m.CursorFormation().SetWin(0)
|
||||
|
||||
// 获取custom
|
||||
customMulti := m.RootCustom(&CustomMulti{}).(*CustomMulti)
|
||||
customPay := m.CursorCustom(&CustomPay{}).(*CustomPay)
|
||||
|
||||
// 根据赔付计算multi type
|
||||
linkPositions, _, linePays := m.TryLinkMatrixSymbols(1, formattedSymbols)
|
||||
|
||||
var multiType int64
|
||||
if mathx.Sum(linePays) == 0 {
|
||||
multiType = MultiplierNoWin
|
||||
} else if m.Cursor().GetType() == key.BaseSpin {
|
||||
multiType = MultiplierBaseSpin
|
||||
} else {
|
||||
multiType = MultiplierFreeSpin
|
||||
}
|
||||
|
||||
// 替换Formation元素
|
||||
for colIdx, symbols := range formattedSymbols {
|
||||
for rowIdx, symbol := range symbols {
|
||||
if symbol == SymbolMultiplier {
|
||||
multiSymbol := Descx(m).RandMultiplier(multiType)
|
||||
formattedSymbols[int64(colIdx)][5-int64(len(symbols))+int64(rowIdx)] = multiSymbol
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 存储 Formation元素
|
||||
cursorFormation.SetFormattedDisplaySymbols(formattedSymbols)
|
||||
defer cursorFormation.SetFormattedFinalSymbols(formattedSymbols)
|
||||
|
||||
// 有消除
|
||||
for mathx.Sum(linePays) > 0 {
|
||||
// 计算连线赢钱
|
||||
lineNum := len(linePays)
|
||||
winCoins := make([]float64, lineNum)
|
||||
for lineIdx, pay := range linePays {
|
||||
winCoins[lineIdx] = float64(m.Cursor().GetSingleBet()) * float64(pay)
|
||||
}
|
||||
|
||||
// 标记消除的元素
|
||||
for _, link := range linkPositions {
|
||||
for _, pos := range link.Positions {
|
||||
row, col := cursorFormation.PositionToCoords(pos)
|
||||
formattedSymbols[col][row] = -1
|
||||
}
|
||||
}
|
||||
// 删除消除的元素
|
||||
for colIndex := range formattedSymbols {
|
||||
for rowIndex := 0; rowIndex < len(formattedSymbols[colIndex]); rowIndex++ {
|
||||
if formattedSymbols[colIndex][rowIndex] == -1 {
|
||||
formattedSymbols[colIndex] = append(formattedSymbols[colIndex][:rowIndex], formattedSymbols[colIndex][rowIndex+1:]...)
|
||||
rowIndex--
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var symbolsAbove []int64
|
||||
// 获取新得元素
|
||||
for colIdx, symbols := range formattedSymbols {
|
||||
// 获取后续(向前)元素
|
||||
appendFormattedSymbols[colIdx] = cursorFormation.GetReelSymbols(int64(colIdx),
|
||||
randPositions[colIdx]-int64(5-len(symbols)), int64(5-len(symbols)))
|
||||
|
||||
symbolsAbove = append(symbolsAbove, cursorFormation.GetReelSymbols(int64(colIdx),
|
||||
randPositions[colIdx]-int64(5-len(symbols))-1, 1)...)
|
||||
|
||||
for rowIdx, symbol := range appendFormattedSymbols[colIdx] {
|
||||
if symbol == SymbolMultiplier {
|
||||
multiSymbol := Descx(m).RandMultiplier(multiType)
|
||||
appendFormattedSymbols[colIdx][rowIdx] = multiSymbol
|
||||
}
|
||||
}
|
||||
|
||||
// 拼接剩余元素和后续(向前)元素
|
||||
formattedSymbols[colIdx] = deepcopy.Copy(appendFormattedSymbols[colIdx]).([]int64)
|
||||
formattedSymbols[colIdx] = append(formattedSymbols[colIdx], symbols...)
|
||||
|
||||
// randPosition 向前移动
|
||||
randPositions[colIdx] -= int64(len(appendFormattedSymbols[colIdx]))
|
||||
}
|
||||
|
||||
// 添加后续feature,这里是消除
|
||||
m.AddCursorFeature(&CustomEliminate{
|
||||
LinkPositions: linkPositions,
|
||||
AppendSymbols: appendFormattedSymbols,
|
||||
FormattedSymbols: formattedSymbols,
|
||||
LinePays: linePays,
|
||||
WinCoins: winCoins,
|
||||
MultiStr: Descx(m).GetMultiStr(),
|
||||
SymbolsAbove: symbolsAbove,
|
||||
SymbolsBelow: m.CursorFormation().GetSymbolsBelow(),
|
||||
}).SetLifetime(1)
|
||||
|
||||
// 累加pay
|
||||
customPay.Pay += mathx.Sum(linePays)
|
||||
|
||||
// 连线
|
||||
linkPositions, _, linePays = m.TryLinkMatrixSymbols(1, formattedSymbols)
|
||||
}
|
||||
|
||||
// 增加multi
|
||||
var multiSum int64
|
||||
maxColCount := 0
|
||||
|
||||
// 找到最长的列数
|
||||
for _, row := range formattedSymbols {
|
||||
if len(row) > maxColCount {
|
||||
maxColCount = len(row)
|
||||
}
|
||||
}
|
||||
|
||||
flatIndex := 0 // 当前符号在一维数组中的索引
|
||||
|
||||
customMulti.MultiStr = ""
|
||||
customMulti.MultiStrVal = ""
|
||||
|
||||
// 遍历列优先的索引
|
||||
for col := 0; col < maxColCount; col++ {
|
||||
for row := 0; row < len(formattedSymbols); row++ {
|
||||
rowSymbols := formattedSymbols[row] // 当前行的符号
|
||||
if col < len(rowSymbols) { // 确保当前列存在
|
||||
symbol := rowSymbols[col]
|
||||
multi := Descx(m).GetMultiBySymbol(symbol)
|
||||
multiSum += multi
|
||||
|
||||
// 打印 Symbol 和其一维索引
|
||||
//fmt.Printf("Symbol: %s, Position in one-dimensional array: %d\n", symbol, flatIndex)
|
||||
if multi > 0 {
|
||||
if len(customMulti.MultiStr) > 0 {
|
||||
customMulti.MultiStr += ";"
|
||||
customMulti.MultiStrVal += ","
|
||||
}
|
||||
customMulti.MultiStr += fmt.Sprintf("%v~%v~%v", 12, flatIndex, multi)
|
||||
customMulti.MultiStrVal += fmt.Sprintf("%v", multi)
|
||||
}
|
||||
flatIndex++ // 索引递增
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if customPay.Pay > 0 {
|
||||
if multiSum == 0 {
|
||||
win := int64(customPay.Pay * float64(m.Cursor().GetSingleBet()))
|
||||
m.CursorFeature(&CustomPay{}).SetWin(win)
|
||||
} else {
|
||||
customMulti.Multi += multiSum
|
||||
var win int64
|
||||
if customMulti.Multi == 0 {
|
||||
win = int64(customPay.Pay * float64(m.Cursor().GetSingleBet()))
|
||||
} else {
|
||||
win = int64(customPay.Pay * float64(m.Cursor().GetSingleBet()) * float64(customMulti.Multi))
|
||||
}
|
||||
m.CursorFeature(&CustomPay{}).SetWin(win)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,106 +0,0 @@
|
|||
package gatesofolympus
|
||||
|
||||
import (
|
||||
"github.com/tomas-qstarrs/boost/mathx"
|
||||
"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 PluginFreeSpin struct {
|
||||
generic.PluginScatter
|
||||
}
|
||||
|
||||
func (p *PluginFreeSpin) Theme() string {
|
||||
return key.GatesOfOlympus
|
||||
}
|
||||
|
||||
// 获取特性数据
|
||||
func getCustomFortune(m intf.Master) *CustomFortune {
|
||||
customFortune := new(CustomFortune)
|
||||
if len(m.CursorCustoms(customFortune)) == 0 {
|
||||
m.AddCursorFeature(customFortune)
|
||||
}
|
||||
return m.CursorCustom(customFortune).(*CustomFortune)
|
||||
}
|
||||
|
||||
// AfterSpin implements generic.PluginBase.AfterSpin
|
||||
func (p *PluginFreeSpin) AfterSpin(m intf.Master) {
|
||||
switch m.Cursor().GetType() {
|
||||
case key.BaseSpin:
|
||||
p.AfterBaseSpin(m)
|
||||
case key.FreeSpin:
|
||||
p.AfterFreeSpin(m)
|
||||
}
|
||||
}
|
||||
|
||||
// AfterBaseSpin is called after base spin
|
||||
func (p *PluginFreeSpin) AfterBaseSpin(m intf.Master) {
|
||||
addTimes, win := p.GetScatterInfo(m, false)
|
||||
if addTimes > 0 {
|
||||
//m.AddNodeOnCursor(key.FreeSpin, addTimes)
|
||||
customFortune := getCustomFortune(m)
|
||||
customFortune.FreeStatus = 1
|
||||
customFortune.FreeNumMax += addTimes
|
||||
customFortune.FreeNumTrigger = addTimes
|
||||
customFortune.FreeSpinNum = addTimes
|
||||
customFortune.ScatterWin = win
|
||||
m.AddNodeFeature(m.AddNodeOnCursor(key.FreeSpin, addTimes).GetID(), customFortune).SetLifetime(addTimes)
|
||||
}
|
||||
if win > 0 {
|
||||
m.AddCursorFeature(&generic.CustomScatterWin{}).SetWin(win)
|
||||
}
|
||||
}
|
||||
|
||||
// AfterFreeSpin is called after free spin
|
||||
func (p *PluginFreeSpin) AfterFreeSpin(m intf.Master) {
|
||||
addTimes, win := p.GetScatterInfo(m, true)
|
||||
customFortune := getCustomFortune(m)
|
||||
if addTimes > 0 {
|
||||
customFortune.FreeStatus = 2
|
||||
customFortune.FreeNumTrigger = addTimes
|
||||
customFortune.FreeNumMax += addTimes
|
||||
customFortune.FreeSpinNum += addTimes
|
||||
customFortune.ScatterWin = win
|
||||
m.AddProgress(addTimes)
|
||||
m.AddCursorFeature(&generic.CustomExtraFreeSpin{ExtraTimes: addTimes}).SetLifetime(1)
|
||||
} else {
|
||||
customFortune.FreeStatus = 0
|
||||
customFortune.FreeNumTrigger = 0
|
||||
if customFortune.FreeSpinNum > 0 {
|
||||
if customFortune.FreeSpinNum == 1 {
|
||||
customFortune.FreeStatus = 3
|
||||
}
|
||||
customFortune.FreeSpinNum--
|
||||
}
|
||||
}
|
||||
if win > 0 {
|
||||
m.AddCursorFeature(&generic.CustomScatterWin{}).SetWin(win)
|
||||
}
|
||||
}
|
||||
|
||||
// GetScatterInfo gets add free spin times & pay rate
|
||||
func (p *PluginFreeSpin) GetScatterInfo(m intf.Master, inFreeSpin bool) (int64, int64) {
|
||||
var scatterCount int64
|
||||
symbols := m.CursorFormation().GetFinalSymbols()
|
||||
scatterSymbols := p.Scatters(m)
|
||||
for _, scatterSymbol := range scatterSymbols {
|
||||
scatterCount += int64(mathx.Count(scatterSymbol, symbols))
|
||||
}
|
||||
|
||||
if scatterCount == 0 {
|
||||
return 0, 0
|
||||
}
|
||||
|
||||
freeSpinCount := generic.Descx(m).FreeSpin(inFreeSpin, scatterCount)
|
||||
|
||||
payRate := generic.Descx(m).ScatterPayRate(inFreeSpin, scatterCount)
|
||||
|
||||
win := m.Bet() * payRate
|
||||
|
||||
if m.Choice() == RoundTypeMoreScatter {
|
||||
win = int64(mathx.SafeDiv(win, 1.25))
|
||||
}
|
||||
|
||||
return freeSpinCount, win
|
||||
}
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
package gatesofolympus
|
||||
|
||||
var Plugins = []interface{}{
|
||||
&PluginChooseWheel{},
|
||||
&PluginEliminate{},
|
||||
&PluginFreeSpin{},
|
||||
&PluginSpecial{},
|
||||
}
|
||||
|
||||
var SimulatorPlugins = []interface{}{}
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
package gatesofolympus
|
||||
|
||||
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
|
||||
}
|
||||
type Special struct {
|
||||
CustomEliminates []CustomEliminate `json:"CustomEliminates,omitempty"` //消除的次数 一次为一个结果
|
||||
FreeStatus int `json:"fs"`
|
||||
FreeSpinNum int64 `json:"fsn,omitempty"` //剩余freespin
|
||||
FreeNumMax int64 `json:"fnm,omitempty"` //总次数
|
||||
FreeNumTrigger int64 `json:"fnt,omitempty"` //新增freespin
|
||||
Pay float64 `json:"Pay,omitempty"`
|
||||
Multi int64 `json:"Multi,omitempty"`
|
||||
MultiStr string `json:"multi_str,omitempty"`
|
||||
MultiStrVal string `json:"multi_str_val,omitempty"`
|
||||
SymbolsAbove []int64 `json:"symbols_above,omitempty"`
|
||||
SymbolsBelow []int64 `json:"symbols_below,omitempty"`
|
||||
}
|
||||
|
||||
func (p *PluginSpecial) Theme() string {
|
||||
return key.GatesOfOlympus
|
||||
}
|
||||
|
||||
func (p *PluginSpecial) Customs() []interface{} {
|
||||
return []interface{}{
|
||||
&Special{},
|
||||
}
|
||||
}
|
||||
func (p *PluginSpecial) getCustomSpecial(m intf.Master) *Special {
|
||||
customSpecial := new(Special)
|
||||
if len(m.CursorCustoms(customSpecial)) == 0 {
|
||||
m.AddCursorFeature(customSpecial).SetLifetime(0)
|
||||
}
|
||||
return m.CursorCustom(customSpecial).(*Special)
|
||||
}
|
||||
func (p *PluginSpecial) AfterSpin(m intf.Master) {
|
||||
//cf := m.CursorFeatures(&CustomEliminate{})
|
||||
ces := m.CursorCustoms(&CustomEliminate{})
|
||||
sp := p.getCustomSpecial(m)
|
||||
if len(ces) > 0 {
|
||||
for _, i2 := range ces {
|
||||
ce := i2.(*CustomEliminate)
|
||||
wc := make([]float64, len(ce.WinCoins))
|
||||
for j := 0; j < len(ce.WinCoins); j++ {
|
||||
wc[j] = ce.WinCoins[j] / 10000
|
||||
}
|
||||
sp.CustomEliminates = append(sp.CustomEliminates, CustomEliminate{
|
||||
LinkPositions: ce.LinkPositions,
|
||||
AppendSymbols: ce.AppendSymbols,
|
||||
FormattedSymbols: ce.FormattedSymbols,
|
||||
LinePays: ce.LinePays,
|
||||
WinCoins: wc,
|
||||
MultiStr: ce.MultiStr,
|
||||
})
|
||||
}
|
||||
}
|
||||
customFortune := getCustomFortune(m)
|
||||
sp.FreeStatus = customFortune.FreeStatus
|
||||
sp.FreeSpinNum = customFortune.FreeSpinNum
|
||||
sp.FreeNumMax = customFortune.FreeNumMax
|
||||
sp.FreeNumTrigger = customFortune.FreeNumTrigger
|
||||
|
||||
customMulti := m.RootCustom(&CustomMulti{}).(*CustomMulti)
|
||||
customPay := m.CursorCustom(&CustomPay{}).(*CustomPay)
|
||||
sp.Multi = customMulti.Multi
|
||||
sp.MultiStr = customMulti.MultiStr
|
||||
sp.MultiStrVal = customMulti.MultiStrVal
|
||||
sp.Pay = customPay.Pay
|
||||
sp.SymbolsAbove = m.CursorFormation().GetSymbolsAbove()
|
||||
sp.SymbolsBelow = m.CursorFormation().GetSymbolsBelow()
|
||||
}
|
||||
|
|
@ -8,7 +8,6 @@ import (
|
|||
"mongo.games.com/game/gamesrv/slotspkg/slots/plugin/fortuneox"
|
||||
"mongo.games.com/game/gamesrv/slotspkg/slots/plugin/fortunerabbit"
|
||||
"mongo.games.com/game/gamesrv/slotspkg/slots/plugin/fortunetiger"
|
||||
"mongo.games.com/game/gamesrv/slotspkg/slots/plugin/gatesofolympus"
|
||||
"mongo.games.com/game/gamesrv/slotspkg/slots/plugin/test"
|
||||
"mongo.games.com/game/gamesrv/slotspkg/slots/reg"
|
||||
)
|
||||
|
|
@ -21,7 +20,6 @@ func Init() {
|
|||
reg.Register(fortunedragon.Plugins...)
|
||||
reg.Register(fortunemouse.Plugins...)
|
||||
reg.Register(cashmania.Plugins...)
|
||||
reg.Register(gatesofolympus.Plugins...)
|
||||
reg.Register(test.Plugins...)
|
||||
|
||||
if global.Mock {
|
||||
|
|
@ -30,8 +28,6 @@ func Init() {
|
|||
reg.Register(fortunerabbit.SimulatorPlugins...)
|
||||
reg.Register(fortunedragon.SimulatorPlugins...)
|
||||
reg.Register(cashmania.SimulatorPlugins...)
|
||||
reg.Register(gatesofolympus.SimulatorPlugins...)
|
||||
reg.Register(test.SimulatorPlugins...)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -43,15 +39,11 @@ func Close() {
|
|||
reg.Deregister(fortunedragon.Plugins...)
|
||||
reg.Deregister(fortunemouse.Plugins...)
|
||||
reg.Deregister(cashmania.Plugins...)
|
||||
reg.Deregister(gatesofolympus.Plugins...)
|
||||
reg.Deregister(test.Plugins...)
|
||||
if global.Mock {
|
||||
reg.Deregister(fortuneox.SimulatorPlugins...)
|
||||
reg.Deregister(fortunetiger.SimulatorPlugins...)
|
||||
reg.Deregister(fortunerabbit.SimulatorPlugins...)
|
||||
reg.Deregister(fortunedragon.SimulatorPlugins...)
|
||||
reg.Deregister(cashmania.SimulatorPlugins...)
|
||||
reg.Deregister(gatesofolympus.SimulatorPlugins...)
|
||||
reg.Deregister(test.SimulatorPlugins...)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
1
go.mod
1
go.mod
|
|
@ -94,7 +94,6 @@ require (
|
|||
github.com/xdg-go/scram v1.1.2 // indirect
|
||||
github.com/xdg-go/stringprep v1.0.4 // indirect
|
||||
github.com/xtaci/kcp-go v5.4.20+incompatible // indirect
|
||||
github.com/xtaci/lossyconn v0.0.0-20200209145036-adba10fffc37 // indirect
|
||||
github.com/xuri/efp v0.0.0-20241211021726-c4e992084aa6 // indirect
|
||||
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect
|
||||
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
|
||||
|
|
|
|||
|
|
@ -208,7 +208,7 @@ func (x *CashManiaPlayerData) GetVIP() int32 {
|
|||
}
|
||||
|
||||
//房间信息
|
||||
//PACKET_CASHMANIA_SCCASHMANIAROOMINFO
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEROOMINFO
|
||||
type SCCashManiaRoomInfo struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
|
|
@ -337,7 +337,7 @@ func (x *SCCashManiaRoomInfo) GetPlayerInfo() string {
|
|||
}
|
||||
|
||||
//玩家操作
|
||||
//PACKET_CASHMANIA_CSCASHMANIAOP
|
||||
//PACKET_FORTUNEMOUSE_CSFORTUNEMOUSEOP
|
||||
type CSCashManiaOp struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
|
|
@ -394,7 +394,7 @@ func (x *CSCashManiaOp) GetParams() []int64 {
|
|||
}
|
||||
|
||||
//玩家操作返回
|
||||
//PACKET_CASHMANIA_SCCASHMANIAOP
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEOP
|
||||
type SCCashManiaOp struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
|
|
@ -459,7 +459,7 @@ func (x *SCCashManiaOp) GetParams() []int64 {
|
|||
}
|
||||
|
||||
//房间状态
|
||||
//PACKET_CASHMANIA_SCCASHMANIAROOMSTATE
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEROOMSTATE
|
||||
type SCCashManiaRoomState struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
|
|
@ -523,7 +523,7 @@ func (x *SCCashManiaRoomState) GetParams() []int32 {
|
|||
return nil
|
||||
}
|
||||
|
||||
//PACKET_CASHMANIA_SCCASHMANIABILLED
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEBILLED
|
||||
type SCCashManiaBilled struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ message CashManiaPlayerData {
|
|||
int32 VIP = 11;
|
||||
}
|
||||
//房间信息
|
||||
//PACKET_CASHMANIA_SCCASHMANIAROOMINFO
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEROOMINFO
|
||||
message SCCashManiaRoomInfo {
|
||||
int32 RoomId = 1; //房间id
|
||||
int32 GameFreeId = 2;
|
||||
|
|
@ -42,26 +42,26 @@ message SCCashManiaRoomInfo {
|
|||
string PlayerInfo = 11;
|
||||
}
|
||||
//玩家操作
|
||||
//PACKET_CASHMANIA_CSCASHMANIAOP
|
||||
//PACKET_FORTUNEMOUSE_CSFORTUNEMOUSEOP
|
||||
message CSCashManiaOp {
|
||||
int32 OpCode = 1; //操作码 0.spin
|
||||
repeated int64 Params = 2; //操作参数 下注索引编号
|
||||
}
|
||||
//玩家操作返回
|
||||
//PACKET_CASHMANIA_SCCASHMANIAOP
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEOP
|
||||
message SCCashManiaOp {
|
||||
int32 OpCode = 1; //操作码
|
||||
int32 OpRetCode = 2; //操作结果 1.金币不足 2.低于该值不能押注
|
||||
repeated int64 Params = 3; //操作参数
|
||||
}
|
||||
//房间状态
|
||||
//PACKET_CASHMANIA_SCCASHMANIAROOMSTATE
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEROOMSTATE
|
||||
message SCCashManiaRoomState {
|
||||
int32 State = 1; //房间当前状态
|
||||
int32 SubState = 2; //房间当前子状态
|
||||
repeated int32 Params = 3; //状态参数
|
||||
}
|
||||
//PACKET_CASHMANIA_SCCASHMANIABILLED
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEBILLED
|
||||
message SCCashManiaBilled{
|
||||
int32 OpRetCode = 1;//0.spin成功 1.spin失败
|
||||
string GameEndStr = 2;
|
||||
|
|
|
|||
|
|
@ -208,7 +208,7 @@ func (x *GatesOfOlympusPlayerData) GetVIP() int32 {
|
|||
}
|
||||
|
||||
//房间信息
|
||||
//PACKET_GATESOFOLYMPUS_SCGATESOFOLYMPUSROOMINFO
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEROOMINFO
|
||||
type SCGatesOfOlympusRoomInfo struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
|
|
@ -337,7 +337,7 @@ func (x *SCGatesOfOlympusRoomInfo) GetPlayerInfo() string {
|
|||
}
|
||||
|
||||
//玩家操作
|
||||
//PACKET_GATESOFOLYMPUS_CSGATESOFOLYMPUSOP
|
||||
//PACKET_FORTUNEMOUSE_CSFORTUNEMOUSEOP
|
||||
type CSGatesOfOlympusOp struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
|
|
@ -394,7 +394,7 @@ func (x *CSGatesOfOlympusOp) GetParams() []int64 {
|
|||
}
|
||||
|
||||
//玩家操作返回
|
||||
//PACKET_GATESOFOLYMPUS_SCGATESOFOLYMPUSOP
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEOP
|
||||
type SCGatesOfOlympusOp struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
|
|
@ -459,7 +459,7 @@ func (x *SCGatesOfOlympusOp) GetParams() []int64 {
|
|||
}
|
||||
|
||||
//房间状态
|
||||
//PACKET_GATESOFOLYMPUS_SCGATESOFOLYMPUSROOMSTATE
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEROOMSTATE
|
||||
type SCGatesOfOlympusRoomState struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
|
|
@ -523,7 +523,7 @@ func (x *SCGatesOfOlympusRoomState) GetParams() []int32 {
|
|||
return nil
|
||||
}
|
||||
|
||||
//PACKET_GATESOFOLYMPUS_SCGATESOFOLYMPUSBILLED
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEBILLED
|
||||
type SCGatesOfOlympusBilled struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ message GatesOfOlympusPlayerData {
|
|||
int32 VIP = 11;
|
||||
}
|
||||
//房间信息
|
||||
//PACKET_GATESOFOLYMPUS_SCGATESOFOLYMPUSROOMINFO
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEROOMINFO
|
||||
message SCGatesOfOlympusRoomInfo {
|
||||
int32 RoomId = 1; //房间id
|
||||
int32 GameFreeId = 2;
|
||||
|
|
@ -42,26 +42,26 @@ message SCGatesOfOlympusRoomInfo {
|
|||
string PlayerInfo = 11;
|
||||
}
|
||||
//玩家操作
|
||||
//PACKET_GATESOFOLYMPUS_CSGATESOFOLYMPUSOP
|
||||
//PACKET_FORTUNEMOUSE_CSFORTUNEMOUSEOP
|
||||
message CSGatesOfOlympusOp {
|
||||
int32 OpCode = 1; //操作码 0.spin
|
||||
repeated int64 Params = 2; //操作参数 下注索引编号
|
||||
}
|
||||
//玩家操作返回
|
||||
//PACKET_GATESOFOLYMPUS_SCGATESOFOLYMPUSOP
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEOP
|
||||
message SCGatesOfOlympusOp {
|
||||
int32 OpCode = 1; //操作码
|
||||
int32 OpRetCode = 2; //操作结果 1.金币不足 2.低于该值不能押注
|
||||
repeated int64 Params = 3; //操作参数
|
||||
}
|
||||
//房间状态
|
||||
//PACKET_GATESOFOLYMPUS_SCGATESOFOLYMPUSROOMSTATE
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEROOMSTATE
|
||||
message SCGatesOfOlympusRoomState {
|
||||
int32 State = 1; //房间当前状态
|
||||
int32 SubState = 2; //房间当前子状态
|
||||
repeated int32 Params = 3; //状态参数
|
||||
}
|
||||
//PACKET_GATESOFOLYMPUS_SCGATESOFOLYMPUSBILLED
|
||||
//PACKET_FORTUNEMOUSE_SCFORTUNEMOUSEBILLED
|
||||
message SCGatesOfOlympusBilled{
|
||||
int32 OpRetCode = 1;//0.spin成功 1.spin失败
|
||||
string GameEndStr = 2;
|
||||
|
|
|
|||
Loading…
Reference in New Issue