package main import ( "math" "mongo.games.com/game/common" "mongo.games.com/game/model" hallproto "mongo.games.com/game/protocol/gamehall" "mongo.games.com/game/protocol/webapi" ) type ScenePolicyData struct { GameName string GameId int32 GameMode []int32 DefaultPlayerCnt int32 EnterAfterStart bool BetState int32 BaseScore int } func (spd *ScenePolicyData) Init() bool { return true } func (spd *ScenePolicyData) OnStart(s *Scene) {} // 场景关闭事件 func (spd *ScenePolicyData) OnStop(s *Scene) { } // 场景心跳事件 func (spd *ScenePolicyData) OnTick(s *Scene) { } // 玩家进入事件 func (spd *ScenePolicyData) OnPlayerEnter(s *Scene, p *Player) { } // 玩家离开事件 func (spd *ScenePolicyData) OnPlayerLeave(s *Scene, p *Player) { } // 系统维护关闭事件 func (spd *ScenePolicyData) OnShutdown(s *Scene) { } func (spd *ScenePolicyData) OnSceneState(s *Scene, state int) { s.SceneState = int32(state) switch state { case common.SceneStateWaite: case common.SceneStateStart: if s.IsCustom() { for _, v := range s.players { spd.CostPayment(s, v) } } case common.SceneStateEnd: } } func (spd *ScenePolicyData) OnGameState(s *Scene, state int) { } // 能否进入 func (spd *ScenePolicyData) CanEnter(s *Scene, p *Player) int { if !spd.EnterAfterStart { if s.starting { return int(hallproto.OpResultCode_Game_OPRC_GameStarting_Game) } } return 0 } func (spd *ScenePolicyData) costEnough(costType, playerNum int, roomConfig *webapi.RoomConfig, p *Player, f func(items []*model.Item)) bool { isEnough := true var items []*model.Item if costType == 1 { // 房主 for _, v := range roomConfig.GetCost() { if item := BagMgrSingleton.GetItem(p.SnId, v.GetItemId()); item == nil || item.ItemNum < v.GetItemNum() { isEnough = false break } else { items = append(items, &model.Item{ ItemId: v.GetItemId(), ItemNum: v.GetItemNum(), }) } } } else { // AA for _, v := range roomConfig.GetCost() { n := int64(math.Ceil(float64(v.GetItemNum()) / float64(playerNum))) if item := BagMgrSingleton.GetItem(p.SnId, v.GetItemId()); item == nil || item.ItemNum < n { isEnough = false break } else { items = append(items, &model.Item{ ItemId: v.GetItemId(), ItemNum: v.GetItemNum(), }) } } } if isEnough { f(items) } return isEnough } func (spd *ScenePolicyData) CostEnough(costType, playerNum int, roomConfig *webapi.RoomConfig, p *Player) bool { if roomConfig == nil { return false } return spd.costEnough(costType, playerNum, roomConfig, p, func(items []*model.Item) {}) } func (spd *ScenePolicyData) CostPayment(s *Scene, p *Player) bool { roomConfig := PlatformMgrSingleton.GetConfig(p.Platform).RoomConfig[s.GetRoomConfigId()] if roomConfig == nil { return false } return spd.costEnough(int(roomConfig.GetCostType()), s.playerNum, roomConfig, p, func(items []*model.Item) { BagMgrSingleton.AddItemsV2(&model.AddItemParam{ P: p.PlayerData, Change: items, GainWay: common.GainWayRoomCost, Operator: "system", Remark: "竞技馆进房费用", GameId: int64(s.gameId), GameFreeId: int64(s.dbGameFree.GetId()), RoomConfigId: roomConfig.GetId(), }) }) } func (spd *ScenePolicyData) GetBetState() int32 { return spd.BetState } func (spd *ScenePolicyData) GetPlayerNum() int { return int(spd.DefaultPlayerCnt) } func (spd *ScenePolicyData) GetBaseScore() int { return int(spd.BaseScore) }