package main import ( "time" "mongo.games.com/game/common" hall_proto "mongo.games.com/game/protocol/gamehall" "mongo.games.com/goserver/core/logger" ) const ( SPDPCustomIndex_GamesOfCard int = iota //局数选项 SPDPCustomIndex_PlayerNum //人数选项 SPDPCustomIndex_RoomFeeMode //房费模式选项 SPDPCustomIndex_LimitOption //新手限制选项 SPDPCustomIndex_DoorOption //中途不可进选项 SPDPCustomIndex_SameIPForbid //同IP不可进 SPDPCustomIndex_BaseCoin //房间底分 ) // 创建房间选项 const ( CreateRoomParam_NumOfGames int = iota //局数选项 CreateRoomParam_DoorOption //中途允许加入选项 CreateRoomParam_SameIPForbid //同IP不可进 CreateRoomParam_Max ) type ScenePolicyDataParam struct { Name string AliasName string Desc string Min int32 Max int32 Default int32 Value []int32 Value2 []int32 CustomIndex int32 index int } type ScenePolicyData struct { GameName string GameId int32 GameMode []int32 CanForceStart bool MinPlayerCnt int32 DefaultPlayerCnt int32 MaxIndex int32 TimeFreeStart int32 TimeFreeEnd int32 DependentPlayerCnt bool EnterAfterStart bool ConfigVer int32 PerGameTakeCard int32 ViewLogCnt int32 BetState int32 Params []ScenePolicyDataParam nameMap map[string]*ScenePolicyDataParam aliasNameMap map[string]*ScenePolicyDataParam customIndexParams []*ScenePolicyDataParam } func alignto(val, align int32) int32 { return (val + align - 1) / align } func (spd *ScenePolicyData) Init() bool { spd.nameMap = make(map[string]*ScenePolicyDataParam) spd.aliasNameMap = make(map[string]*ScenePolicyDataParam) if spd.MaxIndex > 0 { spd.customIndexParams = make([]*ScenePolicyDataParam, spd.MaxIndex) } for i := 0; i < len(spd.Params); i++ { spd.nameMap[spd.Params[i].Name] = &spd.Params[i] spd.Params[i].index = i spd.aliasNameMap[spd.Params[i].AliasName] = &spd.Params[i] if spd.Params[i].CustomIndex >= 0 && spd.MaxIndex > 0 { spd.customIndexParams[spd.Params[i].CustomIndex] = &spd.Params[i] } } return true } func (spd *ScenePolicyData) GetParam(idx int) *ScenePolicyDataParam { if idx >= 0 && idx < len(spd.Params) { return &spd.Params[idx] } return nil } func (spd *ScenePolicyData) GetParamByIndex(idx int) *ScenePolicyDataParam { if idx >= 0 && idx < len(spd.customIndexParams) { return spd.customIndexParams[idx] } return nil } func (spd *ScenePolicyData) GetParamByName(name string) *ScenePolicyDataParam { if spdp, exist := spd.nameMap[name]; exist { return spdp } return nil } func (spd *ScenePolicyData) GetParamByAliasName(name string) *ScenePolicyDataParam { if spdp, exist := spd.aliasNameMap[name]; exist { return spdp } return nil } func (spd *ScenePolicyData) IsTimeFree(mode int) bool { //是否限时免费 ts := int32(time.Now().Unix()) if ts >= spd.TimeFreeStart && ts < spd.TimeFreeEnd { return true } return false } func (spd *ScenePolicyData) IsEnoughRoomCardCnt(s *Scene, p *Player, roomFeeParam, needCardCnt, playerNum int32, isAgent bool) bool { return true } func (spd *ScenePolicyData) CostRoomCard(s *Scene, roomFeeParam, needCardCnt, playerNum int32, snid []int32) { } func (spd *ScenePolicyData) UpRoomCard(s *Scene, roomFeeParam, needCardCnt, playerNum int32) { } //ScenePolicy interface // 能否进入 func (spd *ScenePolicyData) CanCreate(s *Scene, p *Player, mode, sceneType int, params []int32, isAgent bool) (bool, []int32) { //参数容错处理 if len(params) < len(spd.Params) { logger.Logger.Infof("ScenePolicyData.CanCreate param count not enough, need:%v get:%v", len(spd.Params), len(params)) for i := len(params); i < len(spd.Params); i++ { params = append(params, spd.Params[i].Default) } } //确保参数正确 for i := 0; i < len(params); i++ { if params[i] < spd.Params[i].Min || params[i] > spd.Params[i].Max { params[i] = spd.Params[i].Default } } return true, params } func (spd *ScenePolicyData) OnStart(s *Scene) { } func (spd *ScenePolicyData) ReturnRoomCard(s *Scene, roomFeeParam, needCardCnt, playerNum int32) { } // 场景关闭事件 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) GetFitFactor(s *Scene, p *Player) int { return len(s.players) } // 是否满座了 func (spd *ScenePolicyData) IsFull(s *Scene, p *Player, num int32) bool { if s.HasPlayer(p) { return false } return s.GetPlayerCnt() >= int(num) } // 是否可以强制开始 func (spd *ScenePolicyData) IsCanForceStart(s *Scene) bool { return spd.CanForceStart && s.GetPlayerCnt() >= int(spd.MinPlayerCnt) } // 结算房卡 func (spd *ScenePolicyData) BilledRoomCard(s *Scene, snid []int32) { //spd.CostRoomCard(s, spd.GetRoomFeeMode(s), spd.GetNeedRoomCardCnt(s), int32(len(s.players)), snid) } func (spd *ScenePolicyData) getNeedRoomCardCnt(params []int32) int32 { return 0 } // 需求房卡数量 func (spd *ScenePolicyData) GetNeedRoomCardCnt(s *Scene) int32 { return 0 } //func (spd *ScenePolicyData) getRoomFeeMode(params []int32) int32 { // //if len(params) > 0 { // // param := spd.GetParamByIndex(SPDPCustomIndex_RoomFeeMode) // // if param != nil && param.index >= 0 && param.index < len(params) { // // return params[param.index] // // } // //} // return common.RoomFee_Owner //} // 收费方式(AA|房主付费) func (spd *ScenePolicyData) GetRoomFeeMode(s *Scene) int32 { //if s != nil { // return spd.getRoomFeeMode(s.params) //} return 0 } func (spd *ScenePolicyData) GetNeedRoomCardCntDependentPlayerCnt(s *Scene) int32 { return 0 } // 能否进入 func (spd *ScenePolicyData) CanEnter(s *Scene, p *Player) int { param := spd.GetParamByIndex(SPDPCustomIndex_SameIPForbid) if param != nil && len(s.params) <= param.index { logger.Logger.Errorf("game param len too long %v", s.gameId) } if param != nil && len(s.params) > param.index && s.params[param.index] != 0 { ip := p.GetIP() for i := 0; i < s.playerNum; i++ { pp := s.seats[i] if pp != nil && pp.GetIP() == ip { return int(hall_proto.OpResultCode_Game_OPRC_SameIpForbid_Game) } } } if !spd.EnterAfterStart { if s.starting { return int(hall_proto.OpResultCode_Game_OPRC_GameStarting_Game) } } if spd.EnterAfterStart { if s.starting { param := spd.GetParamByIndex(SPDPCustomIndex_DoorOption) if param != nil && s.params[param.index] != 0 { return int(hall_proto.OpResultCode_Game_OPRC_GameStarting_Game) //} else { // return int(hall_proto.OpResultCode_OPRC_SceneEnterForWatcher) } } } return 0 } // 人数 func (spd *ScenePolicyData) getPlayerNum(params []int32) int32 { if len(params) > 0 { param := spd.GetParamByIndex(SPDPCustomIndex_PlayerNum) if param != nil { idx := int(params[param.index]) if idx >= 0 && idx < len(param.Value) { val := param.Value[idx] return val } } } return spd.DefaultPlayerCnt } func (spd *ScenePolicyData) GetPlayerNum(s *Scene) int32 { if s != nil { return spd.getPlayerNum(common.CopySliceInt64ToInt32(s.params)) } return spd.DefaultPlayerCnt } func (spd *ScenePolicyData) getBaseCoin(params []int32) int { if len(params) > 0 { param := spd.GetParamByIndex(SPDPCustomIndex_BaseCoin) if param != nil { idx := int(params[param.index]) if idx >= 0 && idx < len(param.Value) { val := param.Value[idx] return int(val) } } } return 0 } func (spd *ScenePolicyData) GetBaseCoin(s *Scene) int { if s != nil { return spd.getBaseCoin(common.CopySliceInt64ToInt32(s.params)) } return 0 } // 局数 func (spd *ScenePolicyData) GetTotalOfGames(s *Scene) int32 { //if len(s.params) > 0 { // param := spd.GetParamByIndex(SPDPCustomIndex_GamesOfCard) // if param != nil { // cardCostIdx := int(s.params[param.index]) // if cardCostIdx >= 0 && cardCostIdx < len(param.Value) { // costCardNum := param.Value[cardCostIdx] // return costCardNum // } else if int32(cardCostIdx) >= common.CUSTOM_PER_GAME_INDEX_BEG { //自定义局数 // totalOfGames := int32(cardCostIdx) - common.CUSTOM_PER_GAME_INDEX_BEG + 1 // return totalOfGames // } // } //} //return 4 return s.totalRound } func (spd *ScenePolicyData) GetBetState() int32 { return spd.BetState } func (spd *ScenePolicyData) GetViewLogLen() int32 { return spd.ViewLogCnt }