game_sync/gamesrv/iceage/scenepolicy_iceage.go

1013 lines
39 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package iceage
import (
"fmt"
"math"
"os"
"strconv"
"sync"
"time"
"mongo.games.com/goserver/core"
"mongo.games.com/goserver/core/basic"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/task"
"mongo.games.com/goserver/core/timer"
"mongo.games.com/game/common"
rule "mongo.games.com/game/gamerule/iceage"
"mongo.games.com/game/gamesrv/base"
"mongo.games.com/game/model"
"mongo.games.com/game/proto"
"mongo.games.com/game/protocol/iceage"
"mongo.games.com/game/protocol/server"
)
////////////////////////////////////////////////////////////////////////////////
//冰河世纪
////////////////////////////////////////////////////////////////////////////////
// 房间内主要逻辑
var ScenePolicyIceAgeSington = &ScenePolicyIceAge{}
type ScenePolicyIceAge struct {
base.BaseScenePolicy
states [IceAgeSceneStateMax]base.SceneState
}
// 创建场景扩展数据
func (this *ScenePolicyIceAge) CreateSceneExData(s *base.Scene) interface{} {
sceneEx := NewIceAgeSceneData(s)
if sceneEx != nil {
if sceneEx.init() {
s.SetExtraData(sceneEx)
}
}
return sceneEx
}
// 创建玩家扩展数据
func (this *ScenePolicyIceAge) CreatePlayerExData(s *base.Scene, p *base.Player) interface{} {
playerEx := &IceAgePlayerData{Player: p}
if playerEx != nil {
p.SetExtraData(playerEx)
}
return playerEx
}
// 场景开启事件
func (this *ScenePolicyIceAge) OnStart(s *base.Scene) {
logger.Logger.Trace("(this *ScenePolicyIceAge) OnStart, sceneId=", s.GetSceneId())
sceneEx := NewIceAgeSceneData(s)
if sceneEx != nil {
if sceneEx.init() {
s.SetExtraData(sceneEx)
//sceneEx.BroadcastJackpot()
s.ChangeSceneState(IceAgeSceneStateStart) //改变当前的玩家状态
}
}
}
// 场景关闭事件
func (this *ScenePolicyIceAge) OnStop(s *base.Scene) {
logger.Logger.Trace("(this *ScenePolicyIceAge) OnStop , sceneId=", s.GetSceneId())
if sceneEx, ok := s.GetExtraData().(*IceAgeSceneData); ok {
sceneEx.SaveData(true)
}
}
// 场景心跳事件
func (this *ScenePolicyIceAge) OnTick(s *base.Scene) {
if s == nil {
return
}
if s.GetSceneState() != nil {
s.GetSceneState().OnTick(s)
}
}
// 玩家进入事件
func (this *ScenePolicyIceAge) OnPlayerEnter(s *base.Scene, p *base.Player) {
if s == nil || p == nil {
return
}
logger.Logger.Trace("(this *ScenePolicyIceAge) OnPlayerEnter, sceneId=", s.GetSceneId(), " player=", p.SnId, s.GetGameId())
if sceneEx, ok := s.GetExtraData().(*IceAgeSceneData); ok {
playerEx := &IceAgePlayerData{Player: p}
playerEx.init(s) // 玩家当前信息初始化
playerEx.score = sceneEx.GetDBGameFree().GetBaseScore() // 底注初始化
sceneEx.players[p.SnId] = playerEx
p.SetExtraData(playerEx)
IceAgeSendRoomInfo(s, p, sceneEx, playerEx, nil)
s.FirePlayerEvent(p, base.PlayerEventEnter, nil) //回调会调取 onPlayerEvent事件
}
}
// 玩家离开事件
func (this *ScenePolicyIceAge) OnPlayerLeave(s *base.Scene, p *base.Player, reason int) {
if s == nil || p == nil {
return
}
logger.Logger.Trace("(this *ScenePolicyIceAge) OnPlayerLeave, sceneId=", s.GetSceneId(), " player=", p.SnId)
if sceneEx, ok := s.GetExtraData().(*IceAgeSceneData); ok {
if this.CanChangeCoinScene(s, p) {
if playerEx, ok := p.GetExtraData().(*IceAgePlayerData); ok {
playerEx.SavePlayerGameData(strconv.Itoa(int(s.GetGameFreeId())))
}
sceneEx.OnPlayerLeave(p, reason)
s.FirePlayerEvent(p, base.PlayerEventLeave, []int64{int64(reason)})
}
}
}
// 玩家掉线
func (this *ScenePolicyIceAge) OnPlayerDropLine(s *base.Scene, p *base.Player) {
if s == nil || p == nil {
return
}
logger.Logger.Trace("(this *ScenePolicyIceAge) OnPlayerDropLine, sceneId=", s.GetSceneId(), " player=", p.SnId)
s.FirePlayerEvent(p, base.PlayerEventDropLine, nil)
if sceneEx, ok := s.GetExtraData().(*IceAgeSceneData); ok {
if sceneEx.GetGaming() {
return
}
}
}
// 玩家重连
func (this *ScenePolicyIceAge) OnPlayerRehold(s *base.Scene, p *base.Player) {
if s == nil || p == nil {
return
}
logger.Logger.Trace("(this *ScenePolicyIceAge) OnPlayerRehold, sceneId=", s.GetSceneId(), " player=", p.Name)
//gs 玩家rehold的时候不再发送 RoomInfo消息
if _, ok := s.GetExtraData().(*IceAgeSceneData); ok {
if _, ok := p.GetExtraData().(*IceAgePlayerData); ok {
//发送房间信息给自己
//IceAgeSendRoomInfo(s, p, sceneEx, playerEx)
s.FirePlayerEvent(p, base.PlayerEventRehold, nil)
}
}
}
// 玩家返回房间 gs添加
func (this *ScenePolicyIceAge) OnPlayerReturn(s *base.Scene, p *base.Player) {
if s == nil || p == nil {
return
}
logger.Logger.Trace("(this *ScenePolicyIceAge) OnPlayerReturn,sceneId =", s.GetSceneId(), " player= ", p.Name)
if sceneEx, ok := s.GetExtraData().(*IceAgeSceneData); ok {
if playerEx, ok := p.GetExtraData().(*IceAgePlayerData); ok {
IceAgeSendRoomInfo(s, p, sceneEx, playerEx, playerEx.billedData)
s.FirePlayerEvent(p, base.PlayerEventReturn, nil)
}
}
}
// 玩家操作
func (this *ScenePolicyIceAge) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool {
if s == nil || p == nil {
return false
}
if s.GetSceneState() != nil {
return s.GetSceneState().OnPlayerOp(s, p, opcode, params)
}
return true
}
// 玩家事件
func (this *ScenePolicyIceAge) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) {
if s == nil || p == nil {
return
}
if s.GetSceneState() != nil {
s.GetSceneState().OnPlayerEvent(s, p, evtcode, params)
}
}
// 是否完成了整个牌局
func (this *ScenePolicyIceAge) IsCompleted(s *base.Scene) bool { return false }
// 是否可以强制开始
func (this *ScenePolicyIceAge) IsCanForceStart(s *base.Scene) bool { return true }
// 当前状态能否换桌
func (this *ScenePolicyIceAge) CanChangeCoinScene(s *base.Scene, p *base.Player) bool {
if s == nil || p == nil {
return true
}
if s.GetSceneState() != nil {
return s.GetSceneState().CanChangeCoinScene(s, p)
}
return true
}
func (this *ScenePolicyIceAge) RegisteSceneState(state base.SceneState) {
if state == nil {
return
}
stateid := state.GetState()
if stateid < 0 || stateid >= IceAgeSceneStateMax {
return
}
this.states[stateid] = state
}
func (this *ScenePolicyIceAge) GetSceneState(s *base.Scene, stateid int) base.SceneState {
if stateid >= 0 && stateid < IceAgeSceneStateMax {
return ScenePolicyIceAgeSington.states[stateid]
}
return nil
}
func (this *ScenePolicyIceAge) GetJackPotVal(s *base.Scene) int64 {
if sceneEx, ok := s.ExtraData.(*IceAgeSceneData); ok {
if sceneEx.lastJackpotValue != sceneEx.jackpot.VirtualJK {
return sceneEx.jackpot.VirtualJK
}
}
return 0
}
func IceAgeSendRoomInfo(s *base.Scene, p *base.Player, sceneEx *IceAgeSceneData, playerEx *IceAgePlayerData, data *iceage.GameBilledData) {
logger.Logger.Trace("-------------------发送房间消息 ", s.RoomId, p.SnId)
pack := &iceage.SCIceAgeRoomInfo{
RoomId: proto.Int(s.GetSceneId()),
Creator: proto.Int32(s.GetCreator()),
GameId: proto.Int(s.GetGameId()),
RoomMode: proto.Int(s.GetSceneMode()),
Params: common.CopySliceInt64ToInt32(s.GetParams()),
State: proto.Int(s.GetSceneState().GetState()),
Jackpot: proto.Int64(sceneEx.jackpot.VirtualJK),
GameFreeId: proto.Int32(s.GetDBGameFree().GetId()),
BilledData: data,
}
if playerEx != nil {
pd := &iceage.IceAgePlayerData{
SnId: proto.Int32(playerEx.SnId),
Name: proto.String(playerEx.Name),
Head: proto.Int32(playerEx.Head),
Sex: proto.Int32(playerEx.Sex),
Coin: proto.Int64(playerEx.GetCoin()),
HeadOutLine: proto.Int32(playerEx.HeadOutLine),
VIP: proto.Int32(playerEx.VIP),
}
pack.Players = append(pack.Players, pd)
pack.BetLines = playerEx.betLines
pack.FreeTimes = proto.Int32(playerEx.freeTimes)
pack.Chip = proto.Int32(s.GetDBGameFree().BaseScore)
pack.TotalPriceBonus = proto.Int64(playerEx.totalPriceBonus)
pack.SpinID = proto.Int64(playerEx.spinID)
}
proto.SetDefaults(pack)
p.SendToClient(int(iceage.IceAgePacketID_PACKET_SC_ICEAGE_ROOMINFO), pack)
}
type SceneStateIceAgeStart struct {
}
// 获取当前场景状态
func (this *SceneStateIceAgeStart) GetState() int { return IceAgeSceneStateStart }
// 是否可以切换状态到
func (this *SceneStateIceAgeStart) CanChangeTo(s base.SceneState) bool { return true }
// 当前状态能否换桌
func (this *SceneStateIceAgeStart) CanChangeCoinScene(s *base.Scene, p *base.Player) bool {
return true
}
func (this *SceneStateIceAgeStart) GetTimeout(s *base.Scene) int { return 0 }
func (this *SceneStateIceAgeStart) OnEnter(s *base.Scene) {
if sceneEx, ok := s.GetExtraData().(*IceAgeSceneData); ok {
logger.Logger.Tracef("(this *base.Scene) [%v] 场景状态进入 %v", s.GetSceneId(), len(sceneEx.players))
//sceneEx.stateStartTime = time.Now()
sceneEx.SetStateStartTime(time.Now())
pack := &iceage.SCIceAgeRoomState{
State: proto.Int(this.GetState()),
}
proto.SetDefaults(pack)
s.Broadcast(int(iceage.IceAgePacketID_PACKET_SC_ICEAGE_ROOMSTATE), pack, 0)
}
}
func (this *SceneStateIceAgeStart) OnLeave(s *base.Scene) {}
func (this *SceneStateIceAgeStart) OnTick(s *base.Scene) {
if sceneEx, ok := s.ExtraData.(*IceAgeSceneData); ok {
sceneEx.AIAddJackPot()
sceneEx.AIBurstJackPot()
sceneEx.KickPlayerByTime()
}
}
func (this *SceneStateIceAgeStart) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, params []int64) bool {
playerEx, ok := p.GetExtraData().(*IceAgePlayerData)
if !ok {
return false
}
sceneEx, ok := s.GetExtraData().(*IceAgeSceneData)
if !ok {
return false
}
if sceneEx.CheckNeedDestroy() && playerEx.freeTimes <= 0 {
//离开有统计
sceneEx.PlayerLeave(playerEx.Player, common.PlayerLeaveReason_OnDestroy, true)
return false
}
switch opcode {
case IceAgePlayerOpStart: //开始
//if !iceAgeBenchTest {
// iceAgeBenchTest = true
// for i := 0; i < 10; i++ {
// //this.BenchTest(s, p)
// this.WinTargetBenchTest(s, p)
// }
// return true
//}
//params 参数0底注后面跟客户端选择的线n条线(1<=n<=20)客户端线是从1开始算起1~20条线
//参数是否合法
if len(params) < 2 || len(params) > rule.LINENUM+1 {
this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_Error, params)
return false
}
//// 小游戏未结束 不能进行下一次旋转
//if playerEx.totalPriceBonus > 0 {
// this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_Error, params)
// return false
//}
//先做底注校验,看是否在指定参数内
if sceneEx.GetDBGameFree().GetBaseScore() != int32(params[0]) {
this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_Error, params)
return false
}
playerEx.score = int32(params[0])
//判断线条是否重复,是否合法
lineFlag := make(map[int64]bool)
lineParams := make([]int64, 0)
for i := 1; i < len(params); i++ {
lineNum := params[i]
if lineNum >= 1 && lineNum <= int64(rule.LINENUM) && !lineFlag[lineNum] {
lineParams = append(lineParams, lineNum)
lineFlag[lineNum] = true
} else {
this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_Error, params)
return false
}
}
//没有选线参数
if len(lineParams) == 0 {
this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_Error, params)
return false
}
//获取总投注金额(所有线的总投注) | 校验玩家余额是否足够
totalBetValue := (int64(len(lineParams))) * params[0]
if playerEx.freeTimes <= 0 && totalBetValue > playerEx.GetCoin() {
this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_CoinNotEnough, params)
return false
} else if playerEx.freeTimes <= 0 && int64(sceneEx.GetDBGameFree().GetBetLimit()) > playerEx.GetCoin() { //押注限制
this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_CoinNotEnough, params)
return false
}
//p.lastOPTimer = time.Now()
//sceneEx.gameNowTime = time.Now()
//sceneEx.numOfGames++
//p.gameTimes++
//playerEx.startCoin = playerEx.GetCoin()
p.SetLastOPTimer(time.Now())
sceneEx.SetGameNowTime(time.Now())
p.SetGameTimes(p.GetGameTimes() + 1)
sceneEx.SetNumOfGames(sceneEx.GetNumOfGames() + 1)
//playerEx.SetStartCoin(playerEx.GetCoin())
//获取当前水池的上下文环境
cpCtx := base.GetCoinPoolMgr().GetCoinPoolCtx(sceneEx.GetPlatform(), sceneEx.GetGameFreeId(), sceneEx.GetGroupId())
sceneEx.SetCpCtx(cpCtx)
//税收比例
taxRate := sceneEx.GetDBGameFree().GetTaxRate()
if taxRate < 0 || taxRate > 10000 {
logger.Logger.Warnf("IceAgeErrorTaxRate [%v][%v][%v][%v]", sceneEx.GetGameFreeId(), playerEx.SnId, playerEx.spinID, taxRate)
taxRate = 500
}
//水池设置
coinPoolSetting := base.GetCoinPoolMgr().GetCoinPoolSetting(sceneEx.GetPlatform(), sceneEx.GetGameFreeId(), sceneEx.GetGroupId())
//baseRate := coinPoolSetting.GetBaseRate() //基础赔率
ctroRate := coinPoolSetting.GetCtrlRate() //调节赔率 暗税系数
//if baseRate >= 10000 || baseRate <= 0 || ctroRate < 0 || ctroRate >= 1000 || baseRate+ctroRate > 9900 {
// logger.Logger.Warnf("IceAgeErrorBaseRate [%v][%v][%v][%v][%v]", sceneEx.GetGameFreeId(), playerEx.SnId, playerEx.spinID, baseRate, ctroRate)
// baseRate = 9700
// ctroRate = 200
//}
//jackpotRate := 10000 - (baseRate + ctroRate) //奖池系数
jackpotRate := ctroRate //奖池系数
logger.Logger.Tracef("IceAgeRates [%v][%v][%v][%v][%v]", sceneEx.GetGameFreeId(), playerEx.SnId, playerEx.spinID, taxRate, ctroRate)
playerEx.IsFNovice(sceneEx.KeyGameId)
isFoolPlayer := playerEx.IsFoolPlayer[sceneEx.KeyGameId]
var gamePoolCoin int64
if isFoolPlayer {
gamePoolCoin = base.CoinPoolMgr.GetNoviceCoin(sceneEx.GetGameFreeId(), sceneEx.Platform, sceneEx.GroupId) // 当前水池金额
} else {
gamePoolCoin = base.CoinPoolMgr.GetCoin(sceneEx.GetGameFreeId(), sceneEx.Platform, sceneEx.GroupId) // 当前水池金额
}
prizeFund := gamePoolCoin - sceneEx.jackpot.VirtualJK // 除去奖池的水池剩余金额
var jackpotParam = sceneEx.GetDBGameFree().GetJackpot() // 奖池参数
var jackpotInit = int64(jackpotParam[rule.ICEAGE_JACKPOT_InitJackpot]) * int64(sceneEx.GetDBGameFree().GetBaseScore())
var jackpotFundAdd, prizeFundAdd int64 //奖池/水池增量
if playerEx.freeTimes <= 0 { //正常模式才能记录用户的押注变化,免费模式不能改变押注
playerEx.betLines = lineParams // 选线记录
jackpotFundAdd = int64(math.Floor(float64(totalBetValue) * (float64(jackpotRate) / 10000.0)))
prizeFundAdd = totalBetValue - jackpotFundAdd
//playerEx.totalBet += totalBetValue //总下注额(从进房间开始,包含多局游戏的下注)
//playerEx.SetTotalBet(playerEx.GetTotalBet() + totalBetValue)
p.AddCoin(-totalBetValue, common.GainWay_HundredSceneLost, base.SyncFlag_ToClient, "system", s.GetSceneName())
//p.Statics(sceneEx.GetKeyGameId(), sceneEx.KeyGamefreeId, -totalBetValue, true)
if !p.IsRob && !sceneEx.GetTesting() {
// 推送金币
sceneEx.PushCoinPool(prizeFundAdd, isFoolPlayer)
//base.GetCoinPoolMgr().PushCoin(sceneEx.GetGameFreeId(), sceneEx.GetGroupId(), sceneEx.GetPlatform(), int64(float64(totalBetValue)*float64(10000-ctroRate)/10000.0))
}
////统计参与游戏次数
//if !sceneEx.GetTesting() && !playerEx.IsRob {
// pack := &server.GWSceneEnd{
// GameFreeId: proto.Int32(sceneEx.GetDBGameFree().GetId()),
// Players: []*server.PlayerCtx{&server.PlayerCtx{SnId: proto.Int32(playerEx.SnId), Coin: proto.Int64(playerEx.GetCoin())}},
// }
// proto.SetDefaults(pack)
// sceneEx.SendToWorld(int(server.SSPacketID_PACKET_GW_SCENEEND), pack)
//}
} else { //免费次数时,不能改线改底注
totalBetValue = 0
}
var distributionParams, bonusDistributionParams []int32
//奖池模式
var slotMode = 0
//if prizeFund <= int64(jackpotParam[iceage.ICEAGE_JACKPOT_RoomPrizeFundLimit]) { //奖池不足
if gamePoolCoin <= int64(coinPoolSetting.GetLowerLimit()) { //奖池不足
distributionParams = getElementDistributionByName(SlotsData).GetParams()
bonusDistributionParams = getElementDistributionByName(BonusData).GetParams()
} else {
slotMode = 1
distributionParams = getElementDistributionByName(SlotsData_V2).GetParams()
bonusDistributionParams = getElementDistributionByName(BonusData_V2).GetParams()
}
logger.Logger.Tracef("IceAgePlayerOpStart prizeFund:%v distributionParams:%v bonusDistributionParams:%v", prizeFund, distributionParams, bonusDistributionParams)
writeBlackTryTimes := 0
WriteBlack:
slotData := make([]int, 0)
var spinRes SpinResult
loopCount := 0
for {
loopCount++
if loopCount > 3 {
break
}
slotData = getSlotsDataByElementDistribution(distributionParams)
spinRes = sceneEx.CalcSpinsPrize(slotData, playerEx.betLines, getElementDistributionByName(SlotsData).GetParams(), bonusDistributionParams, params[0], taxRate)
logger.Logger.Tracef("CalcSpinsPrize:%v", spinRes)
//不允许有免费旋转同时还出大奖
if playerEx.freeTimes > 0 && spinRes.IsJackpot {
continue
}
//不允许出现两次小游戏
if spinRes.BonusGameCnt > 1 {
continue
}
if spinRes.TotalPrizeLine+spinRes.TotalPrizeBonus > 0 {
if spinRes.IsJackpot {
if sceneEx.jackpot.Small < sceneEx.jackpot.VirtualJK {
continue
}
}
// 现金池不够补充 奖池初值 和 玩家奖金 时,不允许出现爆奖
spinCondition := prizeFund + prizeFundAdd - (spinRes.TotalPrizeLine + spinRes.TotalPrizeBonus)
spinCondition += jackpotFundAdd + sceneEx.jackpot.VirtualJK - jackpotInit
win := spinRes.TotalPrizeLine + spinRes.TotalPrizeBonus
if spinCondition < 0 && win > totalBetValue {
if !spinRes.IsJackpot { // 非爆奖 水池不足 不再进行黑白名单调控
writeBlackTryTimes = 999
}
continue
}
var limitWin = int32(0)
switch slotMode {
case 0:
limitWin = jackpotParam[rule.ICEAGE_JACKPOT_LIMITWIN_PRIZELOW]
case 1:
limitWin = jackpotParam[rule.ICEAGE_JACKPOT_LIMITWIN_PRIZEHIGH]
}
if totalBetValue > 0 && !spinRes.IsJackpot && spinRes.TotalPrizeLine > totalBetValue*int64(limitWin) {
continue
}
//if !spinRes.IsJackpot && spinRes.TotalPrizeLine+spinRes.TotalPrizeBonus > gamePoolCoin {
// // 水池不足 不再进行黑白名单调控
// writeBlackTryTimes = 999
// continue
//}
}
break
}
limitWinScore := int64(coinPoolSetting.GetLowerLimit())
// 多次尝试后 没有选好牌
if loopCount > 3 {
logger.Logger.Warnf("CalcSpinsPrize at loopCount>3 :%v", spinRes)
if sceneEx.GetDBGameFree().GetSceneType() > 1 { // IF(@_RoomID > 1)
slotData = getSlotsDataByGroupName(DefaultData)
} else if gamePoolCoin < limitWinScore || playerEx.freeTimes > 0 {
slotData = getSlotsDataByGroupName(DefaultData)
} else {
slotData = getSlotsDataByGroupName(DefaultData_v1)
}
spinRes = sceneEx.CalcSpinsPrize(slotData, playerEx.betLines, getElementDistributionByName(SlotsData).GetParams(), bonusDistributionParams, params[0], taxRate)
}
// 黑白名单调控 防止异常循环,添加上限次数
if writeBlackTryTimes < 100 && playerEx.CheckBlackWriteList(spinRes.TotalPrizeLine+spinRes.TotalPrizeBonus > totalBetValue) {
writeBlackTryTimes++
goto WriteBlack
} else if writeBlackTryTimes >= 100 && writeBlackTryTimes != 999 {
logger.Logger.Warnf("IceAgeWriteBlackTryTimesOver [%v][%v][%v][%v]", sceneEx.GetGameFreeId(), playerEx.SnId, gamePoolCoin, playerEx.WBLevel)
}
///////////测试游戏数据 开始//////////
//if playerEx.DebugBonus && sceneEx.SceneType == 1 {
// if playerEx.TestNum >= len(DebugData) {
// playerEx.TestNum = 0
// }
// slotData = DebugData[playerEx.TestNum]
// spinRes = sceneEx.CalcSpinsPrize(slotData, playerEx.betLines, getElementDistributionByName(SlotsData).GetParams(), bonusDistributionParams, params[0], taxRate)
// //playerEx.DebugBonus = false
// playerEx.TestNum++
//}
///////////测试游戏数据 结束//////////
if spinRes.IsJackpot {
sceneEx.jackpot.Small -= sceneEx.jackpot.VirtualJK
if sceneEx.jackpot.Small < 0 {
sceneEx.jackpot.Small = 0
}
sceneEx.jackpot.VirtualJK = jackpotInit
} else {
sceneEx.jackpot.Small += jackpotFundAdd
sceneEx.jackpot.VirtualJK += jackpotFundAdd
}
if spinRes.TotalPrizeLine > 0 || spinRes.TotalPrizeBonus > 0 {
p.AddCoin(spinRes.TotalPrizeLine+spinRes.TotalPrizeBonus, common.GainWay_HundredSceneWin, 0, "system", s.GetSceneName())
//p.Statics(sceneEx.GetKeyGameId(), sceneEx.KeyGamefreeId, spinRes.TotalPrizeLine+spinRes.TotalPrizeBonus+spinRes.TotalTaxScore, true)
if !p.IsRob && !sceneEx.GetTesting() {
sceneEx.PopCoinPool(spinRes.TotalPrizeLine+spinRes.TotalPrizeBonus+spinRes.TotalTaxScore, isFoolPlayer)
//base.GetCoinPoolMgr().PopCoin(sceneEx.GetGameFreeId(), sceneEx.GetGroupId(), sceneEx.GetPlatform(), spinRes.TotalPrizeLine+spinRes.TotalPrizeBonus+spinRes.TotalTaxScore)
}
playerEx.taxCoin = spinRes.TotalTaxScore
playerEx.AddServiceFee(playerEx.taxCoin)
}
sceneEx.StaticsLaba(&base.StaticLabaParam{
SnId: playerEx.SnId,
Gain: spinRes.TotalPrizeLine + spinRes.TotalPrizeBonus - totalBetValue,
GainTax: spinRes.TotalTaxScore,
IsAddTimes: true,
})
var isFreeFlag bool
//免费次数
if playerEx.freeTimes > 0 {
playerEx.freeTimes--
isFreeFlag = true
}
playerEx.freeTimes += spinRes.AddFreeTimes
rule.SpinID++
playerEx.spinID = rule.SpinID
if spinRes.TotalPrizeBonus > 0 { // 小游戏开始
logger.Logger.Tracef("BonusGame Start [%v][%v][%v][%v]", sceneEx.GetGameFreeId(), playerEx.SnId, playerEx.spinID, spinRes.TotalPrizeBonus)
playerEx.totalPriceBonus = spinRes.TotalPrizeBonus
playerEx.BonusLineIdx = 0
//// 小游戏超时处理
//playerEx.bonusTimerHandle, _ = timer.StartTimer(timer.TimerActionWrapper(func(h timer.TimerHandle, ud interface{}) bool {
// this.OnPlayerOp(s, p, IceAgeBonusGame, []int64{playerEx.spinID})
// return true
//}), nil, IceAgeBonusGameTimeout, 1)
}
playerEx.cards = spinRes.SlotsData
playerEx.winCoin = spinRes.TotalPrizeLine + spinRes.TotalPrizeJackpot + spinRes.TotalPrizeBonus + playerEx.taxCoin
playerEx.linesWinCoin = spinRes.TotalPrizeLine
playerEx.jackpotWinCoin = spinRes.TotalPrizeJackpot
playerEx.smallGameWinCoin = spinRes.TotalPrizeBonus
//playerEx.currentBet = totalBetValue
//playerEx.currentTax = playerEx.taxCoin
playerEx.SetCurrentBet(totalBetValue)
playerEx.SetCurrentTax(playerEx.taxCoin)
this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_Sucess, append(params[:1], playerEx.betLines...))
playerEx.billedData = &iceage.GameBilledData{
SpinID: proto.Int64(playerEx.spinID),
TotalBetValue: proto.Int64(totalBetValue),
TotalPriceValue: proto.Int64(spinRes.TotalPrizeLine),
IsJackpot: proto.Bool(spinRes.IsJackpot),
Jackpot: proto.Int64(sceneEx.jackpot.VirtualJK),
Balance: proto.Int64(playerEx.GetCoin()),
TotalFreeSpin: proto.Int32(playerEx.freeTimes),
TotalPriceBonus: proto.Int64(spinRes.TotalPrizeBonus),
TotalJackpot: proto.Int64(spinRes.TotalPrizeJackpot),
PrizesData: spinRes.LinesInfo,
SlotsData: spinRes.SlotsData,
}
pack := &iceage.SCIceAgeGameBilled{
BilledData: playerEx.billedData,
}
proto.SetDefaults(pack)
logger.Logger.Infof("IceAgePlayerOpStart %v", pack)
p.SendToClient(int(iceage.IceAgePacketID_PACKET_SC_ICEAGE_GAMEBILLED), pack)
// 记录本次操作
var allCards = make([][]int32, 0)
for _, v := range pack.BilledData.SlotsData {
allCards = append(allCards, v.Card)
}
playerEx.RollGameType.BaseResult.WinTotal = pack.BilledData.GetTotalPriceValue() + pack.BilledData.GetTotalPriceBonus()
playerEx.RollGameType.BaseResult.IsFree = isFreeFlag
playerEx.RollGameType.BaseResult.WinSmallGame = pack.BilledData.GetTotalPriceBonus()
playerEx.RollGameType.BaseResult.AllWinNum = int32(len(pack.BilledData.PrizesData))
playerEx.RollGameType.BaseResult.WinRate = spinRes.TotalWinRate
playerEx.RollGameType.Cards = allCards
playerEx.RollGameType.WinLines = spinRes.WinLines
playerEx.RollGameType.BaseResult.WinJackpot = pack.BilledData.GetTotalJackpot()
playerEx.RollGameType.BaseResult.WinLineScore = pack.BilledData.TotalPriceValue
playerEx.RollGameType.BaseResult.IsFoolPlayer = isFoolPlayer
IceAgeCheckAndSaveLog(sceneEx, playerEx)
// 广播奖池
if totalBetValue == 0 && !spinRes.IsJackpot { // 没改变奖池
return true
}
// 添加进开奖记录里面
if spinRes.IsJackpot {
//spinid := strconv.FormatInt(int64(playerEx.SnId), 10)
// 推送最新开奖记录到world
//msg := &server.GWGameNewBigWinHistory{
// SceneId: proto.Int32(int32(sceneEx.GetSceneId())),
// BigWinHistory: &server.BigWinHistoryInfo{
// SpinID: proto.String(spinid),
// CreatedTime: proto.Int64(time.Now().Unix()),
// BaseBet: proto.Int64(int64(playerEx.score)),
// TotalBet: proto.Int64(int64(playerEx.CurrentBet)),
// PriceValue: proto.Int64(pack.BilledData.GetTotalJackpot()),
// UserName: proto.String(playerEx.Name),
// },
//}
//proto.SetDefaults(msg)
//logger.Logger.Infof("GWGameNewBigWinHistory gameFreeID %v %v", sceneEx.GetDBGameFree().GetId(), msg)
//sceneEx.SendToWorld(int(server.SSPacketID_PACKET_GW_GAMENEWBIGWINHISTORY), msg)
}
logger.Logger.Tracef("---iceage---当前奖池:真人[%v] 虚拟[%v]", sceneEx.jackpot.Small, sceneEx.jackpot.VirtualJK)
case IceAgePlayerHistory:
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
spinid := strconv.FormatInt(int64(playerEx.SnId), 10)
gpl := model.GetPlayerListByHallEx(p.SnId, p.Platform, 0, 80, 0, 0, 0, s.GetDBGameFree().GetGameClass(), s.GetGameId())
pack := &iceage.SCIceAgePlayerHistory{}
for _, v := range gpl.Data {
//if v.GameDetailedLogId == "" {
// logger.Logger.Error("IceAgePlayerHistory GameDetailedLogId is nil")
// break
//}
//gdl := model.GetPlayerHistory(p.Platform, v.GameDetailedLogId)
//if gdl == nil {
// logger.Logger.Error("IceAgePlayerHistory gdl is nil")
// continue
//}
//data, err := UnMarshalIceAgeGameNote(gdl.GameDetailedNote)
//if err != nil {
// logger.Logger.Errorf("UnMarshalIceAgeGameNote error:%v", err)
//}
//gnd := data.(*GameResultLog)
player := &iceage.IceAgePlayerHistoryInfo{
SpinID: proto.String(spinid),
CreatedTime: proto.Int64(int64(v.Ts)),
TotalBetValue: proto.Int64(v.BetAmount),
TotalPriceValue: proto.Int64(v.WinTotal),
IsFree: proto.Bool(v.IsFree),
TotalBonusValue: proto.Int64(v.WinSmallGame),
}
pack.PlayerHistory = append(pack.PlayerHistory, player)
}
proto.SetDefaults(pack)
logger.Logger.Info("IceAgePlayerHistory: ", pack)
return pack
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if data == nil {
logger.Logger.Error("IceAgePlayerHistory data is nil")
return
}
p.SendToClient(int(iceage.IceAgePacketID_PACKET_SC_ICEAGE_PLAYERHISTORY), data)
}), "CSGetIceAgePlayerHistoryHandler").Start()
case IceAgeBurstHistory:
sceneEx.BurstHistory(playerEx)
case IceAgeBonusGame:
//params 参数0 spinID
//参数是否合法
if len(params) < 2 {
this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_Error, params)
return false
}
if playerEx.spinID != params[0] || playerEx.totalPriceBonus <= 0 || params[1] != playerEx.BonusLineIdx {
this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_Error, params)
return false
}
idx := params[1]
logger.Logger.Tracef("BonusGame End [%v][%v][%v][%v][%v]", sceneEx.GetGameFreeId(), playerEx.SnId, playerEx.spinID, playerEx.totalPriceBonus, idx)
if playerEx.bonusTimerHandle != timer.TimerHandle(0) {
timer.StopTimer(playerEx.bonusTimerHandle)
playerEx.bonusTimerHandle = timer.TimerHandle(0)
}
//p.AddCoin(playerEx.totalPriceBonus, common.GainWay_HundredSceneWin, false, "system", s.GetSceneName())
//if !p.IsRob && !sceneEx.GetTesting() {
// GetCoinPoolMgr().PopCoin(sceneEx.GetGameFreeId(), sceneEx.GetGroupId(), sceneEx.GetPlatform(), playerEx.totalPriceBonus)
// p.Statics(sceneEx.GetKeyGameId(), sceneEx.GetGameFreeId(), playerEx.totalPriceBonus, true)
//}
this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_Sucess, params)
//playerEx.totalPriceBonus = 0
case IceAgeBonusGameStart:
logger.Logger.Tracef("params:%v", params)
if len(params) < 2 || params[1] < 0 || int(params[1]) > len(playerEx.billedData.PrizesData) {
this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_Error, params)
return false
}
idx := params[1]
if idx > int64(playerEx.BonusLineIdx) || playerEx.BonusLineIdx == 0 {
// 小游戏超时处理
playerEx.BonusLineIdx = idx
if playerEx.bonusTimerHandle != timer.TimerHandle(0) {
timer.StopTimer(playerEx.bonusTimerHandle)
playerEx.bonusTimerHandle = timer.TimerHandle(0)
}
playerEx.bonusTimerHandle, _ = timer.StartTimer(timer.TimerActionWrapper(func(h timer.TimerHandle, ud interface{}) bool {
this.OnPlayerOp(s, p, IceAgeBonusGame, []int64{playerEx.spinID, playerEx.BonusLineIdx})
return true
}), nil, IceAgeBonusGameTimeout, 1)
this.OnPlayerSToCOp(s, p, playerEx.GetPos(), opcode, iceage.OpResultCode_OPRC_Sucess, params)
}
}
return true
}
func (this *SceneStateIceAgeStart) OnPlayerEvent(s *base.Scene, p *base.Player, evtcode int, params []int64) {
}
// 发送玩家操作情况
func (this *SceneStateIceAgeStart) OnPlayerSToCOp(s *base.Scene, p *base.Player, pos int, opcode int,
opRetCode iceage.OpResultCode, params []int64) {
pack := &iceage.SCIceAgeOp{
SnId: proto.Int32(p.SnId),
OpCode: proto.Int(opcode),
OpRetCode: opRetCode,
Params: params,
}
proto.SetDefaults(pack)
p.SendToClient(int(iceage.IceAgePacketID_PACKET_SC_ICEAGE_PLAYEROP), pack)
}
var iceAgeBenchTest bool
var iceAgeBenchTestTimes int
func (this *SceneStateIceAgeStart) BenchTest(s *base.Scene, p *base.Player) {
const BENCH_CNT = 10000
setting := base.GetCoinPoolMgr().GetCoinPoolSetting(s.GetPlatform(), s.GetGameFreeId(), s.GetGroupId())
oldPoolCoin := base.GetCoinPoolMgr().GetCoin(s.GetGameFreeId(), s.GetPlatform(), s.GetGroupId())
if iceAgeBenchTestTimes == 0 {
defaultVal := int64(setting.GetLowerLimit())
if oldPoolCoin != defaultVal {
base.GetCoinPoolMgr().PushCoin(s.GetGameFreeId(), s.GetGroupId(), s.GetPlatform(), defaultVal-oldPoolCoin)
}
}
iceAgeBenchTestTimes++
fileName := fmt.Sprintf("iceage-%v-%d.csv", p.SnId, iceAgeBenchTestTimes)
file, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModePerm)
defer file.Close()
if err != nil {
file, err = os.Create(fileName)
if err != nil {
return
}
}
file.WriteString("玩家id,当前水位,之前余额,之后余额,投入,产出,税收,小游戏,爆奖,中线倍数,中线数,剩余免费次数\r\n")
oldCoin := p.GetCoin()
//p.coin = int64(5000 * s.GetDBGameFree().GetBaseScore())
p.SetCoin(5000 * int64(s.GetDBGameFree().GetBaseScore()))
if playerEx, ok := p.GetExtraData().(*IceAgePlayerData); ok {
for i := 0; i < BENCH_CNT; i++ {
startCoin := p.GetCoin()
freeTimes := playerEx.freeTimes
poolCoin := base.GetCoinPoolMgr().GetCoin(s.GetGameFreeId(), s.GetPlatform(), s.GetGroupId())
playerEx.UnmarkFlag(base.PlayerState_GameBreak)
suc := this.OnPlayerOp(s, p, IceAgePlayerOpStart, append([]int64{int64(playerEx.score)}, rule.AllBetLines...))
inCoin := int64(playerEx.RollGameType.BaseResult.TotalBet)
outCoin := playerEx.RollGameType.BaseResult.ChangeCoin + inCoin
taxCoin := playerEx.RollGameType.BaseResult.Tax
lineScore := float64(playerEx.RollGameType.BaseResult.WinRate*s.GetDBGameFree().GetBaseScore()) * float64(10000.0-s.GetDBGameFree().GetTaxRate()) / 10000.0
jackpotScore := outCoin - playerEx.RollGameType.BaseResult.WinSmallGame - int64(lineScore+0.00001)
str := fmt.Sprintf("%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v\r\n", p.SnId, poolCoin, startCoin, p.GetCoin(), inCoin, outCoin, taxCoin,
playerEx.RollGameType.BaseResult.WinSmallGame, jackpotScore, playerEx.RollGameType.BaseResult.WinRate, playerEx.RollGameType.BaseResult.AllWinNum, freeTimes)
file.WriteString(str)
if !suc {
break
}
if playerEx.totalPriceBonus > 0 {
this.OnPlayerOp(s, p, IceAgeBonusGame, []int64{playerEx.spinID})
}
}
}
p.SetCoin(oldCoin)
}
func (this *SceneStateIceAgeStart) WinTargetBenchTest(s *base.Scene, p *base.Player) {
const BENCH_CNT = 10000
var once = sync.Once{}
once.Do(func() {
setting := base.GetCoinPoolMgr().GetCoinPoolSetting(s.GetPlatform(), s.GetGameFreeId(), s.GetGroupId())
oldPoolCoin := base.GetCoinPoolMgr().GetCoin(s.GetGameFreeId(), s.GetPlatform(), s.GetGroupId())
if iceAgeBenchTestTimes == 0 {
defaultVal := int64(setting.GetLowerLimit())
if oldPoolCoin != defaultVal {
base.GetCoinPoolMgr().PushCoin(s.GetGameFreeId(), s.GetGroupId(), s.GetPlatform(), defaultVal-oldPoolCoin)
}
}
})
iceAgeBenchTestTimes++
fileName := fmt.Sprintf("iceage-%v-%d.csv", p.SnId, iceAgeBenchTestTimes)
file, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModePerm)
defer file.Close()
if err != nil {
file, err = os.Create(fileName)
if err != nil {
return
}
}
file.WriteString("玩家id,当前水位,之前余额,之后余额,投入,产出,税收,小游戏,爆奖,中线倍数,中线数,剩余免费次数\r\n")
oldCoin := p.GetCoin()
switch s.GetDBGameFree().GetSceneType() {
case 1:
p.SetCoin(100000)
case 2:
p.SetCoin(500000)
case 3:
p.SetCoin(1000000)
default:
p.SetCoin(100000)
}
var targetCoin = p.GetCoin() + p.GetCoin()/10
if playerEx, ok := p.GetExtraData().(*IceAgePlayerData); ok {
for i := 0; p.GetCoin() < targetCoin; i++ {
startCoin := p.GetCoin()
freeTimes := playerEx.freeTimes
poolCoin := base.GetCoinPoolMgr().GetCoin(s.GetGameFreeId(), s.GetPlatform(), s.GetGroupId())
playerEx.UnmarkFlag(base.PlayerState_GameBreak)
suc := this.OnPlayerOp(s, p, IceAgePlayerOpStart, append([]int64{int64(playerEx.score)}, rule.AllBetLines...))
inCoin := int64(playerEx.RollGameType.BaseResult.TotalBet)
outCoin := playerEx.RollGameType.BaseResult.ChangeCoin + inCoin
taxCoin := playerEx.RollGameType.BaseResult.Tax
lineScore := float64(playerEx.RollGameType.BaseResult.WinRate*s.GetDBGameFree().GetBaseScore()) * float64(10000.0-s.GetDBGameFree().GetTaxRate()) / 10000.0
jackpotScore := outCoin - playerEx.RollGameType.BaseResult.WinSmallGame - int64(lineScore+0.00001)
str := fmt.Sprintf("%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v\r\n", p.SnId, poolCoin, startCoin, p.GetCoin(), inCoin, outCoin, taxCoin,
playerEx.RollGameType.BaseResult.WinSmallGame, jackpotScore, playerEx.RollGameType.BaseResult.WinRate, playerEx.RollGameType.BaseResult.AllWinNum, freeTimes)
file.WriteString(str)
if !suc {
break
}
if playerEx.totalPriceBonus > 0 {
this.OnPlayerOp(s, p, IceAgeBonusGame, []int64{playerEx.spinID})
}
if i > BENCH_CNT {
break
}
}
}
p.SetCoin(oldCoin)
}
func IceAgeCheckAndSaveLog(sceneEx *IceAgeSceneData, playerEx *IceAgePlayerData) {
//统计金币变动
//log1
logger.Logger.Trace("IceAgeCheckAndSaveLog Save ", playerEx.SnId)
//changeCoin := playerEx.GetCoin() - playerEx.GetStartCoin()
changeCoin := playerEx.winCoin - playerEx.taxCoin - playerEx.CurrentBet
startCoin := playerEx.Coin - changeCoin
//playerEx.SaveSceneCoinLog(startCoin, changeCoin,
// playerEx.GetCoin(), playerEx.GetCurrentBet(), playerEx.taxCoin, playerEx.winCoin, playerEx.jackpotWinCoin, playerEx.smallGameWinCoin)
//log2
playerEx.RollGameType.BaseResult.ChangeCoin = changeCoin
playerEx.RollGameType.BaseResult.BasicBet = sceneEx.GetDBGameFree().GetBaseScore()
playerEx.RollGameType.BaseResult.RoomId = int32(sceneEx.GetSceneId())
playerEx.RollGameType.BaseResult.AfterCoin = playerEx.GetCoin()
playerEx.RollGameType.BaseResult.BeforeCoin = startCoin
playerEx.RollGameType.BaseResult.IsFirst = sceneEx.IsPlayerFirst(playerEx.Player)
playerEx.RollGameType.BaseResult.PlayerSnid = playerEx.SnId
playerEx.RollGameType.BaseResult.TotalBet = int32(playerEx.GetCurrentBet())
playerEx.RollGameType.AllLine = int32(len(playerEx.betLines))
playerEx.RollGameType.BaseResult.FreeTimes = playerEx.freeTimes
playerEx.RollGameType.UserName = playerEx.Name
playerEx.RollGameType.BetLines = playerEx.betLines
playerEx.RollGameType.BaseResult.Tax = playerEx.taxCoin
playerEx.RollGameType.BaseResult.WBLevel = sceneEx.players[playerEx.SnId].WBLevel
if playerEx.score > 0 {
if !playerEx.IsRob {
info, err := model.MarshalGameNoteByROLL(playerEx.RollGameType)
if err == nil {
logid, _ := model.AutoIncGameLogId()
playerEx.currentLogId = logid
sceneEx.SaveGameDetailedLog(&base.SaveGameDetailedParam{
LogId: logid,
Detail: info,
GameTime: 1,
})
totalin := int64(playerEx.RollGameType.BaseResult.TotalBet)
totalout := playerEx.RollGameType.BaseResult.ChangeCoin + playerEx.taxCoin + totalin
sceneEx.SaveGamePlayerListLog(&base.SaveGamePlayerListLogParam{
LogId: logid,
Platform: playerEx.Platform,
Snid: playerEx.SnId,
PlayerName: playerEx.Name,
Channel: playerEx.Channel,
ChannelId: playerEx.ChannelId,
TotalIn: totalin,
TotalOut: totalout,
TaxCoin: playerEx.taxCoin,
BetAmount: int64(playerEx.RollGameType.BaseResult.TotalBet),
WinAmountNoAnyTax: playerEx.RollGameType.BaseResult.ChangeCoin,
IsFirstGame: sceneEx.IsPlayerFirst(playerEx.Player),
IsFree: playerEx.RollGameType.BaseResult.IsFree,
WinSmallGame: playerEx.RollGameType.BaseResult.WinSmallGame,
WinTotal: playerEx.RollGameType.BaseResult.WinTotal,
GameTime: 1,
})
}
}
}
//统计输下注金币数
if !sceneEx.GetTesting() && !playerEx.IsRob {
playerBet := &server.PlayerData{
SnId: proto.Int32(playerEx.SnId),
Bet: proto.Int64(playerEx.GetCurrentBet()),
Gain: proto.Int64(playerEx.RollGameType.BaseResult.ChangeCoin),
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
playerEx.linesWinCoin = 0
playerEx.jackpotWinCoin = 0
playerEx.smallGameWinCoin = 0
if sceneEx.CheckNeedDestroy() && playerEx.freeTimes <= 0 {
sceneEx.SceneDestroy(true)
}
}
func init() {
ScenePolicyIceAgeSington.RegisteSceneState(&SceneStateIceAgeStart{})
core.RegisteHook(core.HOOK_BEFORE_START, func() error {
base.RegisteScenePolicy(common.GameId_IceAge, 0, ScenePolicyIceAgeSington)
return nil
})
}