Exemple #1
0
        public override bool Action(NotifyType notifyType, BaseInfo baseInfo, UserInfo userInfo)
        {
            switch (notifyType)
            {
            case NotifyType.Request_AddScore:
            {
                AddScoreInfo addScoreInfo = (AddScoreInfo)baseInfo;

                int chairID = ((DzCardTable)_GameTable).GetSeatterIndex(userInfo);

                OnUserAddScore(chairID, addScoreInfo.lAddLessScore, false);

                AutoProcess();
            }
            break;

            case NotifyType.Request_GiveUp:
            {
                AddScoreInfo addScoreInfo = (AddScoreInfo)baseInfo;

                bool ret = OnUserGiveUp(userInfo, addScoreInfo);

                AutoProcess();

                return(ret);
            }
            break;

            case NotifyType.Request_OpenCard:
            {
                AddScoreInfo addScoreInfo = new AddScoreInfo();
                addScoreInfo.wAddScoreUser = ((DzCardTable)_GameTable).GetSeatterIndex(userInfo);

                _GameTable.BroadCastGame(NotifyType.Reply_OpenCard, addScoreInfo);
            }
            break;

            default:
                return(base.Action(notifyType, baseInfo, userInfo));

                break;
            }

            return(true);
        }
Exemple #2
0
        public override bool PlayerOutTable(BaseInfo baseInfo, UserInfo userInfo)
        {
            int seaterIndex = GetSeatterIndex(userInfo);

            if (seaterIndex >= 0)
            {
                if (_Rounds[_TableInfo._RoundIndex] is DzCardStartRound)
                {
                    AddScoreInfo giveInfo = new AddScoreInfo();

                    _Rounds[_TableInfo._RoundIndex].Action(NotifyType.Request_GiveUp, giveInfo, userInfo);
                }

                DzCardInfo dzCardInfo = (DzCardInfo)_TableInfo;

                dzCardInfo.m_cbPlayStatus[seaterIndex] = false;
                dzCardInfo.m_Seatter[seaterIndex]      = null;
            }

            return(base.PlayerOutTable(baseInfo, userInfo));
        }
Exemple #3
0
        //加注事件
        bool OnUserAddScore(int wChairID, int lScore, bool bGiveUp)
        {
            DzCardInfo dzCardInfo = (DzCardInfo)_GameTable._TableInfo;

            //校验用户
            //ASSERT(m_wCurrentUser==wChairID);
            if (dzCardInfo.m_wCurrentUser != wChairID)
            {
                return(false);
            }

            //校验金币
            //ASSERT((lScore +m_lTotalScore[wChairID])<= m_lUserMaxScore[wChairID]);
            if ((lScore + dzCardInfo.m_lTotalScore[wChairID]) > dzCardInfo.m_lUserMaxScore[wChairID])
            {
                return(false);
            }
            //ASSERT(lScore>=0L);
            if ((lScore < 0))
            {
                return(false);
            }

            //累计金币
            dzCardInfo.m_lTableScore[wChairID] += lScore;
            dzCardInfo.m_lTotalScore[wChairID] += lScore;

            //平衡下注
            if (dzCardInfo.m_lTableScore[wChairID] > dzCardInfo.m_lBalanceScore)
            {
                dzCardInfo.m_lBalanceScore = dzCardInfo.m_lTableScore[wChairID];
            }

            //梭哈判断
            if (dzCardInfo.m_lTotalScore[wChairID] == dzCardInfo.m_lUserMaxScore[wChairID])
            {
                dzCardInfo.m_cbShowHand[wChairID] = true;
            }

            //用户切换
            int wNextPlayer = GameDefine.INVALID_CHAIR;

            for (int i = 1; i < DzCardDefine.GAME_PLAYER; i++)
            {
                //设置变量
                dzCardInfo.m_wOperaCount++;
                wNextPlayer = (dzCardInfo.m_wCurrentUser + i) % DzCardDefine.GAME_PLAYER;

                //继续判断
                if ((dzCardInfo.m_cbPlayStatus[wNextPlayer] == true) && (dzCardInfo.m_cbShowHand[wNextPlayer] == false))
                {
                    break;
                }
            }
            //ASSERT(wNextPlayer < m_wPlayerCount);

            //完成判断
            bool bFinishTurn = false;

            if (dzCardInfo.m_wOperaCount >= DzCardDefine.GAME_PLAYER)
            {
                int i = 0;

                for (i = 0; i < DzCardDefine.GAME_PLAYER; i++)
                {
                    //过滤未平衡 和未梭哈用户
                    if ((dzCardInfo.m_cbPlayStatus[i] == true) && (dzCardInfo.m_lTableScore[i] < dzCardInfo.m_lBalanceScore) && (dzCardInfo.m_cbShowHand[i] == false))
                    {
                        break;
                    }
                }
                if (i == DzCardDefine.GAME_PLAYER)
                {
                    bFinishTurn = true;
                }
            }

            //A家show190,B放弃,C还选择?
            if (!bFinishTurn)
            {
                int wPlayCount = 0;
                int wShowCount = 0;

                for (int i = 0; i < DzCardDefine.GAME_PLAYER; i++)
                {
                    if (dzCardInfo.m_cbPlayStatus[i] == true)
                    {
                        if (dzCardInfo.m_cbShowHand[i] == true)
                        {
                            wShowCount++;
                        }
                        wPlayCount++;
                    }
                }
                if (wPlayCount - 1 == wShowCount && dzCardInfo.m_lTableScore[wNextPlayer] >= dzCardInfo.m_lBalanceScore)
                {
                    bFinishTurn = true;
                }
            }

            //继续加注
            if (!bFinishTurn)
            {
                //当前用户
                dzCardInfo.m_wCurrentUser = wNextPlayer;

                //最小值为平衡下注 -桌面下注  和 剩余金币中取小 可能梭哈
                dzCardInfo.m_lTurnLessScore = Math.Min(dzCardInfo.m_lBalanceScore - dzCardInfo.m_lTableScore[dzCardInfo.m_wCurrentUser], dzCardInfo.m_lUserMaxScore[dzCardInfo.m_wCurrentUser] - dzCardInfo.m_lTotalScore[dzCardInfo.m_wCurrentUser]);
                dzCardInfo.m_lTurnMaxScore  = dzCardInfo.m_lUserMaxScore[dzCardInfo.m_wCurrentUser] - dzCardInfo.m_lTotalScore[dzCardInfo.m_wCurrentUser];
                if (dzCardInfo.m_lTotalScore[dzCardInfo.m_wCurrentUser] == dzCardInfo.m_lCellScore)
                {
                    int bTemp = (dzCardInfo.m_lBalanceScore == dzCardInfo.m_lCellScore * 2) ? (dzCardInfo.m_lCellScore * 2) : ((dzCardInfo.m_lBalanceScore - dzCardInfo.m_lCellScore * 2) * 2);
                    dzCardInfo.m_lAddLessScore = dzCardInfo.m_lCellScore + bTemp;
                }
                else
                {
                    dzCardInfo.m_lAddLessScore = (int)((dzCardInfo.m_lBalanceScore == 0) ? (2 * dzCardInfo.m_lCellScore) : (Math.Max((dzCardInfo.m_lBalanceScore - dzCardInfo.m_lTableScore[dzCardInfo.m_wCurrentUser]) * 2, 2L * dzCardInfo.m_lCellScore)));
                }

                //构造数据
                AddScoreInfo AddScore = new AddScoreInfo();

                AddScore.lAddScoreCount = lScore;
                AddScore.wAddScoreUser  = wChairID;
                AddScore.wCurrentUser   = dzCardInfo.m_wCurrentUser;
                AddScore.lTurnLessScore = dzCardInfo.m_lTurnLessScore;
                AddScore.lTurnMaxScore  = dzCardInfo.m_lTurnMaxScore;
                AddScore.lAddLessScore  = dzCardInfo.m_lAddLessScore;

                //发送数据
                _GameTable.BroadCastGame(NotifyType.Reply_AddScore, AddScore);
                //m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_SCORE,&AddScore,sizeof(AddScore));
                //m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_SCORE,&AddScore,sizeof(AddScore));

                return(true);
            }

            //平衡次数
            dzCardInfo.m_cbBalanceCount++;
            dzCardInfo.m_wOperaCount = 0;

            //第1次下注平衡后就开始发给三张公牌
            //第2次下注平衡后就开始发第四张公牌
            //第3次下注平衡后就开始发第五张公牌
            //第4次下注平衡后就结束游戏

            //D家下注
            int wDUser = dzCardInfo.m_wDUser;

            for (int i = 0; i < DzCardDefine.GAME_PLAYER; i++)
            {
                wDUser = (dzCardInfo.m_wDUser + i) % DzCardDefine.GAME_PLAYER;

                if (dzCardInfo.m_cbPlayStatus[wDUser] == true && dzCardInfo.m_cbShowHand[wDUser] == false)
                {
                    break;
                }
            }

            //重值变量
            dzCardInfo.m_lBalanceScore  = 0;
            dzCardInfo.m_lTurnLessScore = 0;
            dzCardInfo.m_lTurnMaxScore  = dzCardInfo.m_lUserMaxScore[wDUser] - dzCardInfo.m_lTotalScore[wDUser];
            dzCardInfo.m_lAddLessScore  = 2 * dzCardInfo.m_lCellScore;

            //构造数据
            AddScoreInfo AddScoreInfo = new AddScoreInfo();

            AddScoreInfo.wAddScoreUser  = wChairID;
            AddScoreInfo.wCurrentUser   = GameDefine.INVALID_CHAIR;
            AddScoreInfo.lAddScoreCount = lScore;
            AddScoreInfo.lTurnLessScore = dzCardInfo.m_lTurnLessScore;
            AddScoreInfo.lTurnMaxScore  = dzCardInfo.m_lTurnMaxScore;
            AddScoreInfo.lAddLessScore  = dzCardInfo.m_lAddLessScore;

            //清理数据
            Array.Clear(dzCardInfo.m_lTableScore, 0, dzCardInfo.m_lTableScore.Length);
            dzCardInfo.m_lBalanceScore = 0;

            //发送数据
            _GameTable.BroadCastGame(NotifyType.Reply_AddScore, AddScoreInfo);
            //m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_ADD_SCORE,&AddScore,sizeof(AddScore));
            //m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_ADD_SCORE,&AddScore,sizeof(AddScore));

            //结束判断
            if (dzCardInfo.m_cbBalanceCount == 4)
            {
                //OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL);
                _isEnd = true;
                dzCardInfo.cbTotalEnd = 1;
                return(true);
            }

            //梭哈用户统计
            int wShowHandCount = 0;
            int wPlayerCount   = 0;

            for (int i = 0; i < DzCardDefine.GAME_PLAYER; i++)
            {
                if (dzCardInfo.m_cbShowHand[i] == true)
                {
                    wShowHandCount++;
                }
                if (dzCardInfo.m_cbPlayStatus[i] == true)
                {
                    wPlayerCount++;
                }
            }

            //只剩一玩家没梭或者全梭
            if ((wShowHandCount >= wPlayerCount - 1) && dzCardInfo.m_cbBalanceCount < 4)
            {
                //构造数据
                SendCardInfo SendCard = new SendCardInfo();

                SendCard.cbPublic         = dzCardInfo.m_cbBalanceCount;
                SendCard.wCurrentUser     = GameDefine.INVALID_CHAIR;
                SendCard.cbSendCardCount  = DzCardDefine.MAX_CENTERCOUNT;
                SendCard.cbCenterCardData = dzCardInfo.m_cbCenterCardData;

                ////发送数据
                _GameTable.BroadCastGame(NotifyType.Reply_SendCard, SendCard);
                //m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));
                //m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));

                ////结束游戏
                //OnEventGameEnd(INVALID_CHAIR,NULL,GER_NORMAL);

                dzCardInfo.m_cbSendCardCount = DzCardDefine.MAX_CENTERCOUNT;

                _isEnd = true;
                dzCardInfo.cbTotalEnd = 1;

                return(true);
            }

            //盲注玩家
            for (int i = 0; i < DzCardDefine.GAME_PLAYER; i++)
            {
                //临时变量
                int cbNextUser = (dzCardInfo.m_wDUser + i) % DzCardDefine.GAME_PLAYER;

                //获取用户
                UserInfo pIServerUserItem = dzCardInfo.m_Seatter[cbNextUser];

                //无效用户 梭哈用户过滤
                if (pIServerUserItem == null || dzCardInfo.m_cbPlayStatus[cbNextUser] == false || dzCardInfo.m_cbShowHand[cbNextUser] == true)
                {
                    continue;
                }

                dzCardInfo.m_wCurrentUser = cbNextUser;
                break;
            }

            //构造数据
            SendCardInfo sendCardInfo = new SendCardInfo();

            sendCardInfo.cbPublic         = 0;
            sendCardInfo.wCurrentUser     = dzCardInfo.m_wCurrentUser;
            sendCardInfo.cbSendCardCount  = 3 + (dzCardInfo.m_cbBalanceCount - 1);
            sendCardInfo.cbCenterCardData = dzCardInfo.m_cbCenterCardData;

            ////发送数据
            _GameTable.BroadCastGame(NotifyType.Reply_SendCard, sendCardInfo);
            //m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));
            //m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_SEND_CARD,&SendCard,sizeof(SendCard));

            dzCardInfo.m_cbSendCardCount = 3 + (dzCardInfo.m_cbBalanceCount - 1);
            return(true);
        }
Exemple #4
0
        bool OnUserGiveUp(UserInfo userInfo, AddScoreInfo giveInfo)
        {
            int wChairID = ((DzCardTable)_GameTable).GetSeatterIndex(userInfo);

            if (wChairID == GameDefine.INVALID_CHAIR)
            {
                return(true);
            }

            DzCardInfo dzCardInfo = (DzCardInfo)_GameTable._TableInfo;

            //重置状态
            dzCardInfo.m_cbPlayStatus[wChairID] = false;
            dzCardInfo.m_cbShowHand[wChairID]   = false;

            //发送消息
            AddScoreInfo GiveUp = giveInfo;

            GiveUp.wAddScoreUser = wChairID;
            GiveUp.lAddLessScore = -dzCardInfo.m_lTotalScore[wChairID];

            _GameTable.BroadCastGame(NotifyType.Reply_GiveUp, GiveUp);

            //写入金币
            //m_pITableFrame->WriteUserScore(wChairID,-m_lTotalScore[wChairID],0,enScoreKind_Lost);
            int playerIndex = _GameTable.GetPlayerIndex(userInfo);

            if (playerIndex >= 0)
            {
                _GameTable._TableInfo.m_lUserWinScore[playerIndex] = -dzCardInfo.m_lTotalScore[wChairID];
                Cash.GetInstance().ProcessGameCash(playerIndex, _GameTable._GameInfo, _GameTable._TableInfo);

                _GameTable._TableInfo.m_lUserWinScore[playerIndex] = 0;
            }

            //清空下注
            dzCardInfo.m_lTableScore[wChairID] = 0;

            //人数统计
            int wPlayerCount = 0;

            for (int i = 0; i < DzCardDefine.GAME_PLAYER; i++)
            {
                if (dzCardInfo.m_cbPlayStatus[i] == true)
                {
                    wPlayerCount++;
                }
            }

            //判断结束
            if (wPlayerCount >= 2)
            {
                if (dzCardInfo.m_wCurrentUser == wChairID)
                {
                    OnUserAddScore(wChairID, 0, true);
                }
            }
            else
            {
                //OnEventGameEnd(INVALID_CHAIR, NULL, GER_NO_PLAYER);
                _isEnd = true;
            }

            return(true);
        }
Exemple #5
0
        public override void NotifyGameTimer(GameTimer gameTimer)
        {
            if (gameTimer.timerId != TimerID.Custom || gameTimer.autoInfo == null)
            {
                return;
            }

            DzCardInfo dzCardInfo = (DzCardInfo)_GameTable._TableInfo;

            DzCardTable dzCardTable = (DzCardTable)_GameTable;
            int         seaterIndex = dzCardTable.GetSeatterIndex(gameTimer.autoInfo);

            if (seaterIndex < 0 || seaterIndex >= DzCardDefine.GAME_PLAYER)
            {
                return;
            }

            int[] bestCardData  = new int[DzCardDefine.MAX_CENTERCOUNT];
            int   cbEndCardKind = DzCardTable.m_GameLogic.FiveFromSeven(dzCardInfo.m_cbHandCardData[seaterIndex], DzCardDefine.MAX_COUNT, dzCardInfo.m_cbCenterCardData, DzCardDefine.MAX_CENTERCOUNT, bestCardData, DzCardDefine.MAX_CENTERCOUNT);

            int actionType = _random.Next() % 4;

            if (cbEndCardKind >= 3)
            {
                actionType = _random.Next() % 4;
            }
            else
            {
                actionType = _random.Next() % 4 + 1;
            }

            switch (actionType)
            {
            case 0:         // add
            {
                AddScoreInfo AddScore = new AddScoreInfo();
                //AddScore.lAddLessScore = dzCardInfo.m_lTurnMaxScore;
                AddScore.lAddLessScore = dzCardInfo.m_lAddLessScore;

                Action(NotifyType.Request_AddScore, AddScore, gameTimer.autoInfo);
            }
            break;

            case 1:         // follow
            case 2:
            case 3:
            {
                //发送消息
                AddScoreInfo AddScore = new AddScoreInfo();
                AddScore.lAddLessScore = dzCardInfo.m_lTurnLessScore;

                Action(NotifyType.Request_AddScore, AddScore, gameTimer.autoInfo);
            }
            break;

            case 4:
            {
                AddScoreInfo AddScore = new AddScoreInfo();

                Action(NotifyType.Request_GiveUp, AddScore, gameTimer.autoInfo);
            }
            break;
            }
        }