Files
wnmj/Servers/游戏组件/万年麻将/游戏服务器/TableFrameSink.cpp

2663 lines
73 KiB
C++
Raw Normal View History

2026-02-13 14:34:15 +08:00
#include "StdAfx.h"
#include "TableFrameSink.h"
#include <fstream>
//////////////////////////////////////////////////////////////////////////
//<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>
const WORD CTableFrameSink::m_wPlayerCount=GAME_PLAYER; //<2F><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
//const enStartMode CTableFrameSink::m_GameStartMode=enStartMode_FullReady; //<2F><>ʼģʽ
#define DROPPED_DEFAULT 0 // <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CTableFrameSink::CTableFrameSink()
{
//<2F><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
m_wSiceCount=MAKEWORD(1,1);
m_wSiceCount2=MAKEWORD(1,1);
m_wSiceCount3=MAKEWORD(1,1);
m_wBankerUser=INVALID_CHAIR;
ZeroMemory(m_bCallCard,sizeof(m_bCallCard));
ZeroMemory(m_cbCardIndex,sizeof(m_cbCardIndex));
ZeroMemory(m_cbBatch,sizeof(m_cbBatch));
ZeroMemory(m_bTrustee,sizeof(m_bTrustee));
ZeroMemory(m_bBatchEnd,sizeof(m_bBatchEnd));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_cbOutCardData=0;
m_cbOutCardCount=0;
m_wOutCardUser=INVALID_CHAIR;
ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard));
ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount));
m_cbGangCount=0;
m_BankContinueCount = 1;
m_cbMustLeft =MUST_LEFT_COUNT;
//<2F><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
memset(m_lAllTurnScore,0,sizeof(m_lAllTurnScore));
memset(m_lLastTurnScore,0,sizeof(m_lLastTurnScore));
memset(m_cbAllGangCounts, 0, sizeof(m_cbAllGangCounts));
ZeroMemory(m_cbDelCardIndex, sizeof(m_cbDelCardIndex));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_cbSendCardData=0;
m_cbSendCardCount=0;
m_cbLeftCardCount=0;
ZeroMemory(m_cbRepertoryCard,sizeof(m_cbRepertoryCard));
//<2F><><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
m_cbProvideCard=0;
m_wResumeUser=INVALID_CHAIR;
m_wCurrentUser=INVALID_CHAIR;
m_wProvideUser=INVALID_CHAIR;
//״̬<D7B4><CCAC><EFBFBD><EFBFBD>
m_bSendStatus=false;
m_bGangStatus=false;
//ZeroMemory(m_bEnjoinChiHu,sizeof(m_bEnjoinChiHu));
//<2F>û<EFBFBD>״̬
ZeroMemory(m_bResponse,sizeof(m_bResponse));
ZeroMemory(m_wUserAction,sizeof(m_wUserAction));
ZeroMemory(m_cbOperateCard,sizeof(m_cbOperateCard));
ZeroMemory(m_wPerformAction,sizeof(m_wPerformAction));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray));
ZeroMemory(m_cbWeaveItemCount,sizeof(m_cbWeaveItemCount));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_cbChiHuCard=0;
ZeroMemory(&m_ChiHuResult,sizeof(m_ChiHuResult));
ZeroMemory(m_cbMasterCheckCard, sizeof(m_cbMasterCheckCard));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pITableFrame=NULL;
m_pGameServiceOption=NULL;
ZeroMemory(m_genDaLiHuCards, sizeof(m_genDaLiHuCards));
ZeroMemory(m_genHuCards, sizeof(m_genHuCards));
ZeroMemory(m_genPengCards, sizeof(m_genPengCards));
ZeroMemory(m_cbContinueGangs, sizeof(m_cbContinueGangs));
ZeroMemory(m_cbContinueGangTypes, sizeof(m_cbContinueGangTypes));
m_wDropped = 0;
m_wProvideMingGangUser = INVALID_CHAIR;
ZeroMemory(m_bActiveUser, sizeof(m_bActiveUser));
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CTableFrameSink::~CTableFrameSink(void)
{
}
//<2F>ӿڲ<D3BF>ѯ
void * CTableFrameSink::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(ITableFrameSink,Guid,dwQueryVer);
QUERYINTERFACE(ITableUserAction,Guid,dwQueryVer);
#ifdef __SPECIAL___
QUERYINTERFACE(ITableUserActionEX,Guid,dwQueryVer);
#endif
QUERYINTERFACE_IUNKNOWNEX(ITableFrameSink,Guid,dwQueryVer);
return NULL;
}
//<2F><>ʼ<EFBFBD><CABC>
bool CTableFrameSink::Initialization(IUnknownEx * pIUnknownEx)
{
//<2F><>ѯ<EFBFBD>ӿ<EFBFBD>
ASSERT(pIUnknownEx!=NULL);
m_pITableFrame=QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx,ITableFrame);
if (m_pITableFrame==NULL) return false;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
m_pGameServiceOption=m_pITableFrame->GetGameServiceOption();
ASSERT(m_pGameServiceOption!=NULL);
srand(GetTickCount() | (m_pITableFrame->GetTableID() << 8));
//<2F><>ʼģʽ
m_pITableFrame->SetStartMode(START_MODE_FULL_READY);
////////////////////////////////////////////////////////////////////////////
//
//m_bSendStatus = true;
//m_bGangStatus = true;
//
////<2F><><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>
//if (m_bSendStatus == true)
//{
//
// //<2F><><EFBFBD><EFBFBD>Ȩλ
// WORD wChiHuRight = 0;
// if (m_bGangStatus == true) wChiHuRight |= CHR_QIANG_GANG;
// WORD wCurrentUser = 2;
// BYTE cbRule = eWNMJHURuleEnum_YiBianDaoHU;
// m_cbSendCardData = 0x12;
// //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
// BYTE cbTempCardIndex[MAX_INDEX] = {0};
// BYTE cbTempCardData[MAX_COUNT] = { 0 };
// cbTempCardData[0] = 0x23;
// cbTempCardData[1] = 0x23;
// cbTempCardData[2] = 0x29;
// cbTempCardData[3] = 0x29;
// //0x31, 0x33, 0x34,
// cbTempCardData[4] = 0x31;
// cbTempCardData[5] = 0x33;
// cbTempCardData[6] = 0x34;
// for (int i = 0; i < MAX_COUNT; i++)
// {
// if (cbTempCardData[i] != 0)
// {
// cbTempCardIndex[m_GameLogic.SwitchToCardIndex(cbTempCardData[i])]++;
// }
// }
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
// m_WeaveItemArray[wCurrentUser][0].wWeaveKind = WIK_GANG;
// m_WeaveItemArray[wCurrentUser][0].cbCenterCard = 0x25;
// m_WeaveItemArray[wCurrentUser][1].wWeaveKind = WIK_PENG;
// m_WeaveItemArray[wCurrentUser][1].cbCenterCard = 0x21;
// m_cbWeaveItemCount[wCurrentUser] = 2;
//
// m_wUserAction[wCurrentUser] = 0;
// tagChiHuResult ChiHuResult;
// m_wUserAction[wCurrentUser] |= m_GameLogic.AnalyseChiHuCard(cbTempCardIndex,
// m_WeaveItemArray[wCurrentUser], m_cbWeaveItemCount[wCurrentUser], m_cbSendCardData, wChiHuRight, ChiHuResult, cbRule, true, (m_bGangStatus ? false : true));
// if (m_bGangStatus && ((m_wUserAction[wCurrentUser] & WIK_CHI_HU) != WIK_CHI_HU))
// {
// bool bTingCard = m_GameLogic.IsTingCard(cbTempCardIndex, m_WeaveItemArray[wCurrentUser], m_cbWeaveItemCount[wCurrentUser], m_cbSendCardData, wChiHuRight, ChiHuResult, cbRule);
// if (!bTingCard)
// {
// m_wUserAction[wCurrentUser] |= m_GameLogic.AnalyseTingCard(cbTempCardIndex, m_WeaveItemArray[wCurrentUser], m_cbWeaveItemCount[wCurrentUser], m_cbSendCardData, wChiHuRight, ChiHuResult, cbRule, true, false, bTingCard);
// }
// else
// {
// m_wUserAction[wCurrentUser] |= WIK_CHI_HU;
// }
// }
//}
//////////////////////////////////////////////////////////////////////////
return true;
}
//<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
void CTableFrameSink::RepositionSink()
{
//<2F><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
m_wSiceCount=MAKEWORD(1,1);
m_wSiceCount2=MAKEWORD(1,1);
m_wSiceCount3=MAKEWORD(1,1);
ZeroMemory(m_cbCardIndex,sizeof(m_cbCardIndex));
ZeroMemory(m_bCallCard,sizeof(m_bCallCard));
ZeroMemory(m_cbBatch,sizeof(m_cbBatch));
ZeroMemory(m_bTrustee,sizeof(m_bTrustee));
ZeroMemory(m_bBatchEnd,sizeof(m_bBatchEnd));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_cbOutCardData=0;
m_cbOutCardCount=0;
m_wOutCardUser=INVALID_CHAIR;
ZeroMemory(m_cbDiscardCard,sizeof(m_cbDiscardCard));
ZeroMemory(m_cbDiscardCount,sizeof(m_cbDiscardCount));
m_cbGangCount=0;
m_cbMustLeft =MUST_LEFT_COUNT;
ZeroMemory(m_cbDelCardIndex, sizeof(m_cbDelCardIndex));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_cbSendCardData=0;
m_cbSendCardCount=0;
m_cbLeftCardCount=0;
ZeroMemory(m_cbRepertoryCard,sizeof(m_cbRepertoryCard));
//<2F><><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
m_cbProvideCard=0;
m_wResumeUser=INVALID_CHAIR;
m_wCurrentUser=INVALID_CHAIR;
m_wProvideUser=INVALID_CHAIR;
//״̬<D7B4><CCAC><EFBFBD><EFBFBD>
m_bSendStatus=false;
m_bGangStatus=false;
//ZeroMemory(m_bEnjoinChiHu,sizeof(m_bEnjoinChiHu));
//<2F>û<EFBFBD>״̬
ZeroMemory(m_bResponse,sizeof(m_bResponse));
ZeroMemory(m_wUserAction,sizeof(m_wUserAction));
ZeroMemory(m_cbOperateCard,sizeof(m_cbOperateCard));
ZeroMemory(m_wPerformAction,sizeof(m_wPerformAction));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
ZeroMemory(m_WeaveItemArray,sizeof(m_WeaveItemArray));
ZeroMemory(m_cbWeaveItemCount,sizeof(m_cbWeaveItemCount));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_cbChiHuCard=0;
ZeroMemory(&m_ChiHuResult,sizeof(m_ChiHuResult));
m_wCheatChairID = INVALID_CHAIR;
ZeroMemory(m_genDaLiHuCards, sizeof(m_genDaLiHuCards));
ZeroMemory(m_genHuCards, sizeof(m_genHuCards));
ZeroMemory(m_genPengCards, sizeof(m_genPengCards));
ZeroMemory(m_cbContinueGangs, sizeof(m_cbContinueGangs));
ZeroMemory(m_GangPaiResult, sizeof(m_GangPaiResult));
ZeroMemory(m_cbContinueGangTypes, sizeof(m_cbContinueGangTypes));
m_wProvideMingGangUser = INVALID_CHAIR;
ZeroMemory(m_bActiveUser, sizeof(m_bActiveUser));
return;
}
////<2F><>ʼģʽ
//enStartMode CTableFrameSink::GetGameStartMode()
//{
// return m_GameStartMode;
//}
//<2F><>Ϸ״̬
bool CTableFrameSink::IsUserPlaying(WORD wChairID)
{
return true;
}
//<2F><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
bool CTableFrameSink::OnEventGameConclude(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason)
{
switch (cbReason)
{
case GER_NORMAL: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_S_GameEnd GameEnd;
ZeroMemory(&GameEnd,sizeof(GameEnd));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
GameEnd.wProvideUser=m_wProvideUser;
GameEnd.cbChiHuCard=m_cbChiHuCard;
CopyMemory(GameEnd.bActiveStatus, m_bActiveUser, sizeof(bool)*GAME_PLAYER);
//ͳ<>ƻ<EFBFBD><C6BB><EFBFBD>
if (wChairID!=INVALID_CHAIR)
{
bool bZhiAnGangFanbei = IsHasGameRule(eWNMJRuleEnum_ZhiAnGang);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((m_ChiHuResult[wChairID].wChiHuKind!=CHK_NULL) &&(wChairID == m_wProvideUser))
{
LONG lScore=0L;
LONG lTimes=0L;
LONG lExtScore = 0L;
BYTE cbFanShuType = GetFanShuType();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
WORD wChiHuOrder = m_GameLogic.CalScore(m_ChiHuResult[wChairID], lScore, lTimes, lExtScore, cbFanShuType, bZhiAnGangFanbei);
if (!bZhiAnGangFanbei)
{
if (m_ChiHuResult[wChairID].wChiHuRight&CHR_GANG_FLOWER && (m_cbContinueGangs[wChairID] > 1))
{
wChiHuOrder *= (1 << (m_cbContinueGangs[wChairID] - 1));
int nMaxTimes = 0;
if (cbFanShuType == eWNMJRuleEnum_OneTwoFAN)
{ //16<31>ַⶥ;
nMaxTimes = 16;
}
else if (cbFanShuType == eWNMJRuleEnum_TwoThreeFAN)
{ //24<32>ַⶥ;
nMaxTimes = 24;
}
if (wChiHuOrder > nMaxTimes)
{
wChiHuOrder = nMaxTimes;
}
m_ChiHuResult[wChairID].wChiHuRight = CHR_LIAN_GANG_FLOWER; //<2F>޸ij<DEB8><C4B3><EFBFBD><EFBFBD>ܺ<EFBFBD>Ȩλ;
}
//ѭ<><D1AD><EFBFBD>ۼ<EFBFBD>
for (WORD i = 0; i < m_wPlayerCount; i++)
{
if (m_bActiveUser[i] == false) continue;
//Ӯ<>ҹ<EFBFBD><D2B9><EFBFBD>
if (m_ChiHuResult[i].wChiHuKind != CHK_NULL) continue;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
GameEnd.lGameScore[i] -= m_pGameServiceOption->lCellScore*(wChiHuOrder + lExtScore);
GameEnd.lGameScore[wChairID] += m_pGameServiceOption->lCellScore*(wChiHuOrder + lExtScore);
}
}
else
{
WORD wProvideChiHuOrder = 0;
if (m_ChiHuResult[wChairID].wChiHuRight&CHR_GANG_FLOWER)
{
if (m_cbContinueGangs[wChairID] > 0)
{
wChiHuOrder *= (1 << (m_cbContinueGangs[wChairID] - 1));
for (BYTE j = 0; j < m_cbContinueGangs[wChairID]; ++j)
{ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>*2;
if (m_cbContinueGangTypes[wChairID][j] == eGangType_AnGang)
{
wChiHuOrder *= 2;
}
}
if (m_cbContinueGangs[wChairID] > 1)
{
m_ChiHuResult[wChairID].wChiHuRight = CHR_LIAN_GANG_FLOWER; //<2F>޸ij<DEB8><C4B3><EFBFBD><EFBFBD>ܺ<EFBFBD>Ȩλ;
}
}
if (m_wProvideMingGangUser != INVALID_CHAIR)
{
wProvideChiHuOrder = (wChiHuOrder * 2);
}
int nMaxTimes = 0;
if (cbFanShuType == eWNMJRuleEnum_OneTwoFAN)
{ //16<31>ַⶥ;
nMaxTimes = 16;
}
else if (cbFanShuType == eWNMJRuleEnum_TwoThreeFAN)
{ //24<32>ַⶥ;
nMaxTimes = 24;
}
nMaxTimes *= 2;
if (wProvideChiHuOrder > nMaxTimes)
{
wProvideChiHuOrder = nMaxTimes;
}
if (wChiHuOrder > nMaxTimes)
{
wChiHuOrder = nMaxTimes;
}
}
//ѭ<><D1AD><EFBFBD>ۼ<EFBFBD>
for (WORD i = 0; i < m_wPlayerCount; i++)
{
if (m_bActiveUser[i] == false) continue;
//Ӯ<>ҹ<EFBFBD><D2B9><EFBFBD>;
if (m_ChiHuResult[i].wChiHuKind != CHK_NULL) continue;
if (m_wProvideMingGangUser == i)
{ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
GameEnd.lGameScore[i] -= m_pGameServiceOption->lCellScore*(wProvideChiHuOrder + lExtScore);
GameEnd.lGameScore[wChairID] += m_pGameServiceOption->lCellScore*(wProvideChiHuOrder + lExtScore);
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
GameEnd.lGameScore[i] -= m_pGameServiceOption->lCellScore*(wChiHuOrder + lExtScore);
GameEnd.lGameScore[wChairID] += m_pGameServiceOption->lCellScore*(wChiHuOrder + lExtScore);
}
}
}
//ׯ<><D7AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
m_wBankerUser = wChairID;
}
//׽<><D7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((m_ChiHuResult[wChairID].wChiHuKind!=CHK_NULL) &&(wChairID != m_wProvideUser))
{
LONG lScore=0L;
LONG lTimes=0L;
LONG lExtScore = 0L;
BYTE cbFanShuType = GetFanShuType();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wChiHuOrder = m_GameLogic.CalScore(m_ChiHuResult[wChairID], lScore, lTimes, lExtScore, cbFanShuType, bZhiAnGangFanbei);
if (m_ChiHuResult[wChairID].wChiHuRight&CHR_QIANG_GANG && (m_cbContinueGangs[m_wProvideUser] > 1))
{
wChiHuOrder *= (1 << (m_cbContinueGangs[m_wProvideUser] - 1));
int nMaxTimes = 0;
if (cbFanShuType == eWNMJRuleEnum_OneTwoFAN)
{ //16<31>ַⶥ;
nMaxTimes = 16;
}
else if (cbFanShuType == eWNMJRuleEnum_TwoThreeFAN)
{ //24<32>ַⶥ;
nMaxTimes = 24;
}
if (bZhiAnGangFanbei)
{
nMaxTimes *= 2;
}
if (wChiHuOrder > nMaxTimes)
{
wChiHuOrder = nMaxTimes;
}
m_ChiHuResult[wChairID].wChiHuRight = CHR_QIANG_LIAN_GANG; //<2F>޸ij<DEB8><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD>Ȩλ;
}
//<2F><><EFBFBD><EFBFBD>;
GameEnd.lGameScore[m_wProvideUser] -= m_pGameServiceOption->lCellScore*(wChiHuOrder + lExtScore);
GameEnd.lGameScore[wChairID] += m_pGameServiceOption->lCellScore*(wChiHuOrder + lExtScore);
//ׯ<><D7AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
m_wBankerUser = wChairID;
////<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ׯ
//if(wChairID != m_wBankerUser)
//{ //ׯ<><D7AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
// m_wBankerUser=(m_wBankerUser+1)%GAME_PLAYER;
//}
}
}
else
{
//<2F><>ׯ<EFBFBD><D7AF><EFBFBD><EFBFBD>
GameEnd.cbChiHuCard=0;
m_wBankerUser = 0; //<2F><>ׯ<EFBFBD><D7AF><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ׯ;
//m_wBankerUser=(m_wBankerUser+1)%GAME_PLAYER;
}
//<2F><><EFBFBD>Ƶ÷<C6B5>
CopyMemory(GameEnd.lGameHuScore,GameEnd.lGameScore,sizeof(GameEnd.lGameHuScore));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
for (WORD i=0;i<GAME_PLAYER;i++)
{
if (m_bActiveUser[i] == false) continue;
GameEnd.dwChiHuKind[i]=m_ChiHuResult[i].wChiHuKind;
GameEnd.dwChiHuRight[i]=m_ChiHuResult[i].wChiHuRight;
GameEnd.cbCardCount[i]=m_GameLogic.SwitchToCardData(m_cbCardIndex[i],GameEnd.cbCardData[i],MAX_COUNT);
GameEnd.cbWeaveItemCount[i] = m_cbWeaveItemCount[i];
CopyMemory(GameEnd.WeaveItemArray[i], m_WeaveItemArray[i], sizeof(tagWeaveItem)*MAX_WEAVE);
}
////<2F><><EFBFBD>ճɼ<D5B3>
//for (WORD i=0;i<GAME_PLAYER;i++)
//{
// IServerUserItem * pIServerUserItem = m_pITableFrame->GetTableUserItem(i);
// if ( pIServerUserItem == NULL ) continue;
//
// MyLog("name:[%s], ChairID:[%d], lGameScore:[%ld],lGameHuScore[%ld].",
// pIServerUserItem->GetNickName(), i, GameEnd.lGameScore[i], GameEnd.lGameHuScore[i]);
//}
//<2F><><EFBFBD>ҷ<EFBFBD><D2B7><EFBFBD>
//if(m_pGameServiceOption->wServerType&GAME_GENRE_GOLD)
//{
// //<2F><><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>
// LONG lDifference = 0;
// for (WORD i=0;i<m_wPlayerCount;i++)
// {
// if (m_bActiveUser[i] == false) continue;
// IServerUserItem * pIServerUserItem=m_pITableFrame->GetTableUserItem(i);
// SCORE lUserScore=pIServerUserItem->GetUserScore();
// if ((lUserScore < abs(GameEnd.lGameScore[i])) && (GameEnd.lGameScore[i]<0) && (lUserScore >0))
// {
// lDifference += abs(GameEnd.lGameScore[i]) - lUserScore;
// GameEnd.lGameScore[i] = -lUserScore;
// }
// }
//
// BYTE cbWinCount=0;
// //<2F><><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>
// for (WORD i=0; i<m_wPlayerCount; i++)
// {
// if(GameEnd.lGameScore[i] > 0)
// {
// cbWinCount++;
// }
// }
// //<2F><><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>
// for (WORD i=0; i<m_wPlayerCount; i++)
// {
// if(GameEnd.lGameScore[i] > 0&&cbWinCount>0)
// {
// GameEnd.lGameScore[i] -= lDifference/cbWinCount;
// }
// }
//}
//<2F><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (m_bActiveUser[i] == false) continue;
m_lAllTurnScore[i]+=GameEnd.lGameScore[i];
m_lLastTurnScore[i]=GameEnd.lGameScore[i];
GameEnd.lAllTurnScore[i]=m_lAllTurnScore[i];
GameEnd.lLastTurnScore[i]=m_lLastTurnScore[i];
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd));
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd));
// <20><>Ϸ¼<CFB7><C2BC>;
addGameRecordAction(SUB_S_GAME_END, &GameEnd, sizeof(GameEnd));
//<2F>޸Ļ<DEB8><C4BB><EFBFBD>
tagScoreInfo ScoreInfoArray[GAME_PLAYER];
ZeroMemory(&ScoreInfoArray,sizeof(ScoreInfoArray));
for (WORD i=0;i<GAME_PLAYER;i++)
{
if (m_bActiveUser[i] == false) continue;
//<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD>
ScoreInfoArray[i].lScore=GameEnd.lGameScore[i];
if (GameEnd.lGameScore[i]>0L)
{
GameEnd.lGameScore[i]=ScoreInfoArray[i].lScore-GameEnd.lGameScore[i]*m_pGameServiceOption->wRevenueRatio/100L;
ScoreInfoArray[i].lRevenue = GameEnd.lGameScore[i] * m_pGameServiceOption->wRevenueRatio / 100L;
}
ScoreInfoArray[i].cbType = SCORE_TYPE_DRAW;
if (GameEnd.lGameScore[i] != 0)
ScoreInfoArray[i].cbType = (ScoreInfoArray[i].lScore > 0L) ? SCORE_TYPE_WIN : SCORE_TYPE_LOSE;
ScoreInfoArray[i].lScore = ScoreInfoArray[i].lScore;
ScoreInfoArray[i].lRevenue = ScoreInfoArray[i].lRevenue;
}
/********************************˽<>˳<EFBFBD>ͳ<EFBFBD><CDB3>****************************************/
//ͳ<><CDB3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (WORD i = 0; i < GAME_PLAYER; i++)
{
if (m_bActiveUser[i] == false) continue;
// Ӯ<><D3AE>
if (m_ChiHuResult[i].wChiHuKind!=CHK_NULL)
{
// <20><><EFBFBD><EFBFBD>
if (i == m_wProvideUser)
{
m_PrivateEndInfo.cbZiMoCout[i]++;
}
}
else // <20><><EFBFBD><EFBFBD>
{
// <20><><EFBFBD><EFBFBD>
if (i == m_wProvideUser)
{
m_PrivateEndInfo.cbDianPaoCout[i]++;
}
}
//<2F>ܵĴ<DCB5><C4B4><EFBFBD>;
memcpy(m_PrivateEndInfo.cbAllGangCounts, m_cbAllGangCounts, sizeof(m_cbAllGangCounts));
// <20><><EFBFBD>ߵ÷<DFB5>
if (m_PrivateEndInfo.lMaxScore[i] <= GameEnd.lGameScore[i])
{
m_PrivateEndInfo.lMaxScore[i] = GameEnd.lGameScore[i];
}
}
/********************************˽<>˳<EFBFBD>ͳ<EFBFBD><CDB3>****************************************/
// <20><><EFBFBD><EFBFBD>ͳ<EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ݿ<EFBFBD>֮ǰ;
m_pITableFrame->addPrivatePlayCout(1);
//<2F>ƾֽ<C6BE><D6BD><EFBFBD><EFBFBD><EFBFBD>,ÿ8<C3BF><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><E3BEAD>ֵ;
if ( IsPrivateEnd() )
{
//tagPrivateFrameRecordInfo* pPrivateRecord = m_pITableFrame->GetPrivateFrameRecord();
//SCORE lGrade = pPrivateRecord->cbFinishCout / 8;
tagPrivateFrameParameter* pPrivateFrame = m_pITableFrame->GetPrivateFrameInfo();
SCORE lGrade = pPrivateFrame->dwPlayCost;
ScoreInfoArray[0].lGrade = 2 * lGrade; //<2F><><EFBFBD><EFBFBD>2<EFBFBD><32>;
for (WORD i = 1; i<GAME_PLAYER; i++)
{
ScoreInfoArray[i].lGrade = lGrade;
}
}
//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DataStream kDataStream;
m_kGameRecord.StreamValue(kDataStream, true);
m_pITableFrame->WriteTableScore(ScoreInfoArray, CountArray(ScoreInfoArray), kDataStream);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
m_pITableFrame->ConcludeGame(GAME_STATUS_FREE);
return true;
}
case GER_DISMISS: //<2F><>Ϸ<EFBFBD><CFB7>ɢ
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_S_GameEnd GameEnd;
ZeroMemory(&GameEnd,sizeof(GameEnd));
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
GameEnd.wProvideUser=INVALID_CHAIR;
CopyMemory(GameEnd.bActiveStatus, m_bActiveUser, sizeof(bool)*GAME_PLAYER);
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
for (WORD i=0;i<GAME_PLAYER;i++)
{
if (!m_bActiveUser[i]) continue;
GameEnd.cbCardCount[i]=m_GameLogic.SwitchToCardData(m_cbCardIndex[i],GameEnd.cbCardData[i],MAX_COUNT);
GameEnd.cbWeaveItemCount[i] = m_cbWeaveItemCount[i];
CopyMemory(GameEnd.WeaveItemArray[i], m_WeaveItemArray[i], sizeof(tagWeaveItem)*MAX_WEAVE);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd));
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd));
// <20><>Ϸ¼<CFB7><C2BC>;
addGameRecordAction(SUB_S_GAME_END, &GameEnd, sizeof(GameEnd));
tagScoreInfo ScoreInfo[GAME_PLAYER];
ZeroMemory(ScoreInfo, sizeof(ScoreInfo));
for (WORD i = 0; i < GAME_PLAYER; i++)
{
if (!m_bActiveUser[i]) continue;
ScoreInfo[i].lScore = GameEnd.lGameScore[i];
ScoreInfo[i].cbType = SCORE_TYPE_DRAW;
}
//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DataStream kDataStream;
m_kGameRecord.StreamValue(kDataStream, true);
m_pITableFrame->WriteTableScore(ScoreInfo, CountArray(ScoreInfo), kDataStream);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
m_pITableFrame->ConcludeGame(GAME_STATUS_FREE, GER_DISMISS);
return true;
}
}
return false;
}
//<2F><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
bool CTableFrameSink::OnEventSendGameScene(WORD wChiarID, IServerUserItem * pIServerUserItem, BYTE cbGameStatus, bool bSendSecret)
{
switch (cbGameStatus)
{
case GS_MJ_FREE: //<2F><><EFBFBD><EFBFBD>״̬
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_S_StatusFree StatusFree;
memset(&StatusFree,0,sizeof(StatusFree));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
StatusFree.wBankerUser=m_wBankerUser;
StatusFree.lCellScore=m_pGameServiceOption->lCellScore*m_BankContinueCount;
CopyMemory(StatusFree.bTrustee,m_bTrustee,sizeof(m_bTrustee));
CopyMemory(StatusFree.bActiveStatus, m_bActiveUser, sizeof(bool)*GAME_PLAYER);
//<2F><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
return m_pITableFrame->SendGameScene(pIServerUserItem,&StatusFree,sizeof(StatusFree));
}
case GS_MJ_BATCH: //<2F><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_S_StatusBatch StatusChip;
ZeroMemory(&StatusChip,sizeof(StatusChip));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
StatusChip.bComplete=(m_bCallCard[wChiarID]==true)?TRUE:FALSE;
StatusChip.lCellScore=m_pGameServiceOption->lCellScore*m_BankContinueCount;
CopyMemory(StatusChip.bTrustee,m_bTrustee,sizeof(m_bTrustee));
//<2F><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
CopyMemory(StatusChip.lAllTurnScore,m_lAllTurnScore,sizeof(m_lAllTurnScore));
CopyMemory(StatusChip.lLastTurnScore,m_lLastTurnScore,sizeof(m_lLastTurnScore));
CopyMemory(StatusChip.bActiveStatus, m_bActiveUser, sizeof(bool)*GAME_PLAYER);
//<2F><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
return m_pITableFrame->SendGameScene(pIServerUserItem,&StatusChip,sizeof(StatusChip));
}
case GS_MJ_PLAY: //<2F><>Ϸ״̬
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_S_StatusPlay StatusPlay;
memset(&StatusPlay,0,sizeof(StatusPlay));
//<2F><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
StatusPlay.wBankerUser=m_wBankerUser;
StatusPlay.wCurrentUser=m_wCurrentUser;
StatusPlay.lCellScore=m_pGameServiceOption->lCellScore;
StatusPlay.wSiceCount=m_wSiceCount;
StatusPlay.wSiceCount2=m_wSiceCount2;
StatusPlay.wSiceCount3=m_wSiceCount3;
CopyMemory(StatusPlay.bTrustee,m_bTrustee,sizeof(m_bTrustee));
CopyMemory(StatusPlay.bActiveStatus, m_bActiveUser, sizeof(bool)*GAME_PLAYER);
//״̬<D7B4><CCAC><EFBFBD><EFBFBD>
StatusPlay.cbActionCard=m_cbProvideCard;
StatusPlay.cbLeftCardCount=m_cbLeftCardCount;
StatusPlay.dwActionMask=(m_bResponse[wChiarID]==false)?m_wUserAction[wChiarID]:WIK_NULL;
CopyMemory(&StatusPlay.GangPaiResult, &m_GangPaiResult[wChiarID], sizeof(StatusPlay.GangPaiResult));
//<2F><>ʷ<EFBFBD><CAB7>¼
StatusPlay.wOutCardUser=m_wOutCardUser;
StatusPlay.cbOutCardData=m_cbOutCardData;
CopyMemory(StatusPlay.cbDiscardCard,m_cbDiscardCard,sizeof(StatusPlay.cbDiscardCard));
CopyMemory(StatusPlay.cbDiscardCount,m_cbDiscardCount,sizeof(StatusPlay.cbDiscardCount));
//<2F><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
CopyMemory(StatusPlay.lAllTurnScore,m_lAllTurnScore,sizeof(m_lAllTurnScore));
CopyMemory(StatusPlay.lLastTurnScore,m_lLastTurnScore,sizeof(m_lLastTurnScore));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
CopyMemory(StatusPlay.WeaveItemArray,m_WeaveItemArray,sizeof(m_WeaveItemArray));
CopyMemory(StatusPlay.cbWeaveCount,m_cbWeaveItemCount,sizeof(m_cbWeaveItemCount));
StatusPlay.cbCardCount = m_GameLogic.SwitchToCardData(m_cbCardIndex[wChiarID], StatusPlay.cbCardData, MAX_COUNT);
//StatusPlay.cbSendCardData = ((m_cbSendCardData != 0) && (m_wProvideUser == wChiarID)) ? m_cbSendCardData : 0x00;
StatusPlay.cbSendCardData = ((m_cbSendCardData != 0) && (m_wCurrentUser == wChiarID)) ? m_cbSendCardData : 0xff;
//<2F><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
return m_pITableFrame->SendGameScene(pIServerUserItem,&StatusPlay,sizeof(StatusPlay));
}
}
return false;
}
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD>¼<EFBFBD>
bool CTableFrameSink::OnTimerMessage(DWORD wTimerID, WPARAM wBindParam)
{
return false;
}
//<2F><>Ϸ<EFBFBD><CFB7>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
bool CTableFrameSink::OnGameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem)
{
switch (wSubCmdID)
{
case SUB_C_OUT_CARD: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
{
//Ч<><D0A7><EFBFBD><EFBFBD>Ϣ
ASSERT(wDataSize==sizeof(CMD_C_OutCard));
if (wDataSize!=sizeof(CMD_C_OutCard)) return false;
//<2F>û<EFBFBD>Ч<EFBFBD><D0A7>
tagUserInfo * pUserData = pIServerUserItem->GetUserInfo();
if (pUserData->cbUserStatus != US_PLAYING) return true;
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
CMD_C_OutCard * pOutCard=(CMD_C_OutCard *)pDataBuffer;
return OnUserOutCard(pUserData->wChairID,pOutCard->cbCardData);
}
case SUB_C_OPERATE_CARD: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
{
//Ч<><D0A7><EFBFBD><EFBFBD>Ϣ
ASSERT(wDataSize==sizeof(CMD_C_OperateCard));
if (wDataSize!=sizeof(CMD_C_OperateCard)) return false;
//<2F>û<EFBFBD>Ч<EFBFBD><D0A7>
tagUserInfo * pUserData = pIServerUserItem->GetUserInfo();
if (pUserData->cbUserStatus != US_PLAYING) return true;
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
CMD_C_OperateCard * pOperateCard=(CMD_C_OperateCard *)pDataBuffer;
return OnUserOperateCard(pUserData->wChairID,pOperateCard->dwOperateCode,pOperateCard->cbOperateCard);
}
//case SUB_C_BATCH: //ϴ<><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// {
// //Ч<><D0A7><EFBFBD><EFBFBD>Ϣ
// ASSERT(wDataSize==sizeof(CMD_C_BATCH));
// if (wDataSize!=sizeof(CMD_C_BATCH)) return false;
// //<2F>û<EFBFBD>Ч<EFBFBD><D0A7>
// tagUserInfo * pUserData = pIServerUserItem->GetUserInfo();
// if (pUserData->cbUserStatus != US_PLAYING) return true;
// //<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
// CMD_C_BATCH * pChip=(CMD_C_BATCH *)pDataBuffer;
// return OnUserCallFinish(pUserData->wChairID,pChip->cbChipTimes);
// }
//case SUB_C_TRUSTEE:
// {
// CMD_C_Trustee *pTrustee =(CMD_C_Trustee *)pDataBuffer;
// if(wDataSize != sizeof(CMD_C_Trustee)) return false;
// //<2F>û<EFBFBD>Ч<EFBFBD><D0A7>
// tagUserInfo * pUserData = pIServerUserItem->GetUserInfo();
// m_bTrustee[pUserData->wChairID]=pTrustee->bTrustee;
// CMD_S_Trustee Trustee;
// Trustee.bTrustee=pTrustee->bTrustee;
// Trustee.wChairID = pUserData->wChairID;
// m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_TRUSTEE,&Trustee,sizeof(Trustee));
// m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_TRUSTEE,&Trustee,sizeof(Trustee));
// return true;
// }
//case SUB_C_BATCH_END: //ϴ<><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// {
// //Ч<><D0A7><EFBFBD><EFBFBD>Ϣ
// ASSERT(wDataSize==0);
// if (wDataSize!=0) return false;
// //<2F>û<EFBFBD>Ч<EFBFBD><D0A7>
// tagServerUserData * pUserData=pIServerUserItem->GetUserData();
// if (pUserData->cbUserStatus!=US_PLAY) return true;
// //<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
// return OnUserBatchEnd(pUserData->wChairID);
// }
//case SUB_C_PASS_KING: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// {
// //<2F>û<EFBFBD>Ч<EFBFBD><D0A7>
// tagUserInfo * pUserData = pIServerUserItem->GetUserInfo();
// if (pUserData->cbUserStatus != US_PLAYING) return true;
// m_cbLeftCardCount--;
// if(m_cbLeftCardCount<=m_cbMustLeft-1)
// {
// m_cbChiHuCard=0;
// m_wProvideUser=INVALID_CHAIR;
// OnEventGameConclude(INVALID_CHAIR,NULL,GER_NORMAL);
// return true;
// }
// return true;
// }
//#ifdef DEBUG
case SUB_C_MASTER_CHEAKCARD:
{
if (CUserRight::CanGetCard(pIServerUserItem->GetUserRight()))
{
CMD_C_MaterCheckCard *pMaterCheckCard = (CMD_C_MaterCheckCard *)pDataBuffer;
if (wDataSize != sizeof(CMD_C_MaterCheckCard)) return false;
WORD wChairID = pIServerUserItem->GetChairID();
m_cbMasterCheckCard[wChairID] = pMaterCheckCard->cbCheakCard;
return true;
}
return false;
}
case SUB_C_MASTER_LEFTCARD:
{
if (CUserRight::CanGetCard(pIServerUserItem->GetUserRight()))
{
WORD wChairID = pIServerUserItem->GetChairID();
sendMasterLeftCard(wChairID);
return true;
}
return false;
}
//#endif // DEBUG
}
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
bool CTableFrameSink::OnFrameMessage(WORD wSubCmdID, VOID * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem)
{
return false;
}
//<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
bool CTableFrameSink::OnActionUserSitDown(WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser)
{
//ׯ<><D7AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((bLookonUser==false)&&(m_wBankerUser==INVALID_CHAIR))
{
m_wBankerUser=pIServerUserItem->GetChairID();
}
return true;
}
//<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
bool CTableFrameSink::OnActionUserStandUp(WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser)
{
if(bLookonUser==false)
{
m_BankContinueCount=1;
}
ZeroMemory(m_lAllTurnScore,sizeof(m_lAllTurnScore));
ZeroMemory(m_lLastTurnScore,sizeof(m_lLastTurnScore));
memset(m_cbAllGangCounts, 0, sizeof(m_cbAllGangCounts));
//ׯ<><D7AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((bLookonUser==false)&&(wChairID==m_wBankerUser))
{
m_wBankerUser=INVALID_CHAIR;
for (WORD i=0;i<m_wPlayerCount;i++)
{
if ((i!=wChairID)&&(m_pITableFrame->GetTableUserItem(i)!=NULL))
{
m_wBankerUser=i;
break;
}
}
}
return true;
}
//<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
bool CTableFrameSink::OnUserOutCard(WORD wChairID, BYTE cbCardData)
{
//Ч<><D0A7>״̬
ASSERT(m_pITableFrame->GetGameStatus()==GS_MJ_PLAY);
if (m_pITableFrame->GetGameStatus()!=GS_MJ_PLAY) return true;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(wChairID==m_wCurrentUser);
ASSERT(m_GameLogic.IsValidCard(cbCardData)==true);
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (wChairID != m_wCurrentUser)
{
CTraceService::TraceFormat(TraceLevel_Exception, TEXT("CTableFrameSink::OnUserOutCard, TableID:%u, <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>:%u, <20><>ǰ<EFBFBD>û<EFBFBD>:%u."), m_pITableFrame->GetTableID(), wChairID, m_wCurrentUser);
return true;
}
if (m_GameLogic.IsValidCard(cbCardData) == false)
{
CTraceService::TraceFormat(TraceLevel_Exception, TEXT("CTableFrameSink::OnUserOutCard, TableID:%u, <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>:%u, <20><>ǰ<EFBFBD>û<EFBFBD>:%u, <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>:%d."), m_pITableFrame->GetTableID(), wChairID, m_wCurrentUser, cbCardData);
return false;
}
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
if (m_GameLogic.RemoveCard(m_cbCardIndex[wChairID],cbCardData)==false)
{
CTraceService::TraceFormat(TraceLevel_Exception, TEXT("CTableFrameSink::OnUserOutCard, TableID:%u, <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>:%u, <20><>ǰ<EFBFBD>û<EFBFBD>:%u, <20>û<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>˿˳<CBBF><CBB3><EFBFBD>:%d<><64><EFBFBD><EFBFBD>."), m_pITableFrame->GetTableID(), wChairID, m_wCurrentUser, cbCardData);
ASSERT(FALSE);
return false;
}
BYTE cbDelCardIndex = m_GameLogic.SwitchToCardIndex(cbCardData);
m_cbDelCardIndex[wChairID][cbDelCardIndex]++;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bSendStatus=true;
m_wUserAction[wChairID]=WIK_NULL;
m_wPerformAction[wChairID]=WIK_NULL;
m_bGangStatus=false;
ZeroMemory(m_genHuCards[wChairID], sizeof(BYTE)*4);
ZeroMemory(m_genPengCards[wChairID], sizeof(BYTE)*4);
m_genDaLiHuCards[wChairID] = cbCardData;
ZeroMemory(m_cbContinueGangs, sizeof(m_cbContinueGangs));
ZeroMemory(m_GangPaiResult, sizeof(m_GangPaiResult));
ZeroMemory(m_cbContinueGangTypes, sizeof(m_cbContinueGangTypes));
m_wProvideMingGangUser = INVALID_CHAIR;
//<2F><><EFBFBD>Ƽ<EFBFBD>¼
m_cbOutCardCount++;
m_wOutCardUser=wChairID;
m_cbOutCardData=cbCardData;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_S_OutCard OutCard;
OutCard.wOutCardUser=wChairID;
OutCard.cbOutCardData=cbCardData;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,sizeof(OutCard));
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,sizeof(OutCard));
// <20><>Ϸ¼<CFB7><C2BC>;
addGameRecordAction(SUB_S_OUT_CARD, &OutCard, sizeof(OutCard));
//<2F>û<EFBFBD><C3BB>л<EFBFBD>
m_wProvideUser=wChairID;
m_cbProvideCard=cbCardData;
//m_wCurrentUser=(wChairID+m_wPlayerCount-1)%m_wPlayerCount;
m_wCurrentUser = getNextChairID(wChairID);
//<2F><>Ӧ<EFBFBD>ж<EFBFBD>
bool bAroseAction=EstimateUserRespond(wChairID,cbCardData,EstimatKind_OutCard);
//<2F>ɷ<EFBFBD><C9B7>˿<EFBFBD>
if (bAroseAction==false) DispatchCardData(m_wCurrentUser);
return true;
}
//<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
bool CTableFrameSink::OnUserOperateCard(WORD wChairID, WORD wOperateCode, BYTE cbOperateCard)
{
//Ч<><D0A7>״̬
ASSERT(m_pITableFrame->GetGameStatus()==GS_MJ_PLAY);
if (m_pITableFrame->GetGameStatus()!=GS_MJ_PLAY) return false;
//Ч<><D0A7><EFBFBD>û<EFBFBD>
ASSERT((wChairID==m_wCurrentUser)||(m_wCurrentUser==INVALID_CHAIR));
if ((wChairID!=m_wCurrentUser)&&(m_wCurrentUser!=INVALID_CHAIR)) return true;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_wCurrentUser==INVALID_CHAIR)
{
//Ч<><D0A7>״̬
ASSERT(m_bResponse[wChairID]==false);
ASSERT((wOperateCode==WIK_NULL)||((m_wUserAction[wChairID]&wOperateCode)!=0));
//Ч<><D0A7>״̬
if (m_bResponse[wChairID]==true) return true;
if ((wOperateCode!=WIK_NULL)&&((m_wUserAction[wChairID]&wOperateCode)==0)) return true;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wTargetUser=wChairID;
WORD wTargetAction=wOperateCode;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bResponse[wChairID]=true;
m_wPerformAction[wChairID]=wOperateCode;
m_cbOperateCard[wChairID]=(cbOperateCard==0)?m_cbProvideCard:cbOperateCard;
//ִ<><D6B4><EFBFBD>ж<EFBFBD>
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (!m_bActiveUser[i]) continue;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
WORD wUserAction=(m_bResponse[i]==false)?m_wUserAction[i]:m_wPerformAction[i];
//<2F><><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>
BYTE cbUserActionRank=m_GameLogic.GetUserActionRank(wUserAction);
BYTE cbTargetActionRank=m_GameLogic.GetUserActionRank(wTargetAction);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (cbUserActionRank>cbTargetActionRank)
{
wTargetUser=i;
wTargetAction=wUserAction;
}
}
if (m_bResponse[wTargetUser] == false)
{
if (m_wUserAction[wChairID] & WIK_CHI_HU)
{
InsertGenHuCards(wChairID, m_cbOperateCard[wChairID]);
}
return true;
}
//<2F>Ժ<EFBFBD><D4BA>ȴ<EFBFBD>
if (wTargetAction==WIK_CHI_HU)
{
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (!m_bActiveUser[i]) continue;
if ((m_bResponse[i]==false)&&(m_wUserAction[i]&WIK_CHI_HU))
return true;
}
}
//<2F>Ժ<EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>ж<EFBFBD>
if (wTargetAction==WIK_CHI_HU)
{
for (WORD i=0;i<m_wPlayerCount;i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
WORD wFirstUser=(m_wProvideUser+m_wPlayerCount-1-i)%m_wPlayerCount;
if (!m_bActiveUser[wFirstUser]) continue;
if(m_wPerformAction[wFirstUser]&WIK_CHI_HU)
{
//<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
ASSERT(m_bResponse[wFirstUser] == true);
if((m_bResponse[wFirstUser] == false)) return false;
//<2F>ҵ<EFBFBD><D2B5>׼<EFBFBD><D7BC>û<EFBFBD> <20><><EFBFBD>˳<EFBFBD>ѭ<EFBFBD><D1AD>
wTargetUser = wFirstUser;
break;
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (wTargetAction==WIK_NULL)
{
if (m_wUserAction[wChairID] & WIK_CHI_HU)
{
InsertGenHuCards(wChairID, m_cbOperateCard[wChairID]);
}
else if (m_wUserAction[wChairID] & WIK_PENG)
{
InsertGenPengCards(wChairID, m_cbOperateCard[wChairID]);
}
//<2F>û<EFBFBD>״̬
ZeroMemory(m_bResponse,sizeof(m_bResponse));
ZeroMemory(m_wUserAction,sizeof(m_wUserAction));
ZeroMemory(m_cbOperateCard,sizeof(m_cbOperateCard));
ZeroMemory(m_wPerformAction,sizeof(m_wPerformAction));
ZeroMemory(m_GangPaiResult, sizeof(m_GangPaiResult));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
DispatchCardData(m_wResumeUser);
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbTargetCard=m_cbOperateCard[wTargetUser];
//<2F><><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
m_cbOutCardData=0;
m_bSendStatus=true;
m_wOutCardUser=INVALID_CHAIR;
//<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
if (wTargetAction==WIK_CHI_HU)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_cbChiHuCard=cbTargetCard;
m_wProvideUser=m_wProvideUser;
//<2F><><EFBFBD><EFBFBD>Ȩλ
WORD wChiHuRight=0;
if (m_bGangStatus==true) wChiHuRight|=CHR_QIANG_GANG;
if ((m_cbSendCardCount==1)&&(m_cbOutCardCount==1)) wChiHuRight|=CHR_DI;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (!m_bActiveUser[i]) continue;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if ((i==m_wProvideUser)||((m_wPerformAction[i]&WIK_CHI_HU)==0))
continue;
if(i!=wTargetUser) continue;
//<2F><>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
if (m_cbChiHuCard!=0)
{
BYTE cbRule = GetHURuleType();
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
BYTE cbWeaveItemCount=m_cbWeaveItemCount[i];
tagWeaveItem * pWeaveItem=m_WeaveItemArray[i];
WORD wAction = m_GameLogic.AnalyseChiHuCard(m_cbCardIndex[i], pWeaveItem, cbWeaveItemCount, m_cbChiHuCard, wChiHuRight, m_ChiHuResult[i], cbRule, false, (((wChiHuRight & CHR_DI) == CHR_DI)? false : true));
if (wAction == WIK_NULL && ((wChiHuRight & CHR_DI) == CHR_DI))
{
bool bTingCard = m_GameLogic.IsTingCard(m_cbCardIndex[i], pWeaveItem, cbWeaveItemCount, m_cbChiHuCard, wChiHuRight, m_ChiHuResult[i], cbRule, false, false);
if (WIK_CHI_HU == m_GameLogic.AnalyseTingCard(m_cbCardIndex[i], pWeaveItem, cbWeaveItemCount, m_cbChiHuCard, wChiHuRight, m_ChiHuResult[i], cbRule, false, true, bTingCard))
{
m_ChiHuResult[i].wChiHuRight |= CHR_HAS_KING;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
if (m_ChiHuResult[i].wChiHuKind!=CHK_NULL)
m_cbCardIndex[i][m_GameLogic.SwitchToCardIndex(m_cbChiHuCard)]++;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
ASSERT(m_ChiHuResult[wTargetUser].wChiHuKind!=CHK_NULL);
OnEventGameConclude(wTargetUser,NULL,GER_NORMAL);
return true;
}
//<2F>û<EFBFBD>״̬
ZeroMemory(m_bResponse,sizeof(m_bResponse));
ZeroMemory(m_wUserAction,sizeof(m_wUserAction));
ZeroMemory(m_cbOperateCard,sizeof(m_cbOperateCard));
ZeroMemory(m_wPerformAction,sizeof(m_wPerformAction));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߸<EFBFBD>֮<EFBFBD><D6AE>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һȦ(<28>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>);
if (WIK_PENG == wTargetAction)
{
ZeroMemory(m_genHuCards, sizeof(m_genHuCards));
ZeroMemory(m_genPengCards, sizeof(m_genPengCards));
ZeroMemory(m_GangPaiResult, sizeof(m_GangPaiResult));
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߸<EFBFBD>֮<EFBFBD><D6AE>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һȦ(<28>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>20190107);
if (WIK_PENG == wTargetAction || WIK_GANG == wTargetAction)
{
ZeroMemory(m_genDaLiHuCards, sizeof(m_genDaLiHuCards));
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
ASSERT(m_cbWeaveItemCount[wTargetUser]<MAX_WEAVE);
WORD wIndex=m_cbWeaveItemCount[wTargetUser]++;
m_WeaveItemArray[wTargetUser][wIndex].cbPublicCard=TRUE;
m_WeaveItemArray[wTargetUser][wIndex].cbCenterCard=cbTargetCard;
m_WeaveItemArray[wTargetUser][wIndex].wWeaveKind=wTargetAction;
m_WeaveItemArray[wTargetUser][wIndex].wProvideUser=(m_wProvideUser==INVALID_CHAIR)?wTargetUser:m_wProvideUser;
InsertIntoDelCardIndex(wTargetUser, m_WeaveItemArray[wTargetUser][wIndex]);
//CMD_S_GangScore gangScoreMsg;
//ZeroMemory(&gangScoreMsg, sizeof(gangScoreMsg));
//gangScoreMsg.wChairId = wTargetUser;
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
switch (wTargetAction)
{
case WIK_DNBL: //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[]={cbTargetCard+1,cbTargetCard+3};
m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser],cbRemoveCard,CountArray(cbRemoveCard));
break;
}
case WIK_DNBC: //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[]={cbTargetCard-1,cbTargetCard+2};
m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser],cbRemoveCard,CountArray(cbRemoveCard));
break;
}
case WIK_DNBR: //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[]={cbTargetCard-3,cbTargetCard-2};
m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser],cbRemoveCard,CountArray(cbRemoveCard));
break;
}
case WIK_DXBL: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[]={cbTargetCard+2,cbTargetCard+3};
m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser],cbRemoveCard,CountArray(cbRemoveCard));
break;
}
case WIK_DXBC: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[]={cbTargetCard-2,cbTargetCard+1};
m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser],cbRemoveCard,CountArray(cbRemoveCard));
break;
}
case WIK_DXBR: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[]={cbTargetCard-3,cbTargetCard-1};
m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser],cbRemoveCard,CountArray(cbRemoveCard));
break;
}
case WIK_LEFT: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[]={cbTargetCard+1,cbTargetCard+2};
m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser],cbRemoveCard,CountArray(cbRemoveCard));
break;
}
case WIK_RIGHT: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[]={cbTargetCard-2,cbTargetCard-1};
m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser],cbRemoveCard,CountArray(cbRemoveCard));
break;
}
case WIK_CENTER: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[]={cbTargetCard-1,cbTargetCard+1};
m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser],cbRemoveCard,CountArray(cbRemoveCard));
break;
}
case WIK_PENG: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[]={cbTargetCard,cbTargetCard};
m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser],cbRemoveCard,CountArray(cbRemoveCard));
break;
}
case WIK_GANG: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((m_cbSendCardCount==1)&&(m_cbOutCardData==0))
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[]={cbTargetCard,cbTargetCard,cbTargetCard};
m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser],cbRemoveCard,CountArray(cbRemoveCard));
}
else
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[]={cbTargetCard,cbTargetCard,cbTargetCard};
m_GameLogic.RemoveCard(m_cbCardIndex[wTargetUser],cbRemoveCard,CountArray(cbRemoveCard));
}
m_cbGangCount++;
break;
}
}
if (m_wProvideUser != INVALID_CHAIR && (m_wProvideUser < GAME_PLAYER))
{
BYTE cbDelCardIndex = m_GameLogic.SwitchToCardIndex(cbTargetCard);
m_cbDelCardIndex[m_wProvideUser][cbDelCardIndex]--;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_S_OperateResult OperateResult;
OperateResult.wOperateUser=wTargetUser;
OperateResult.cbOperateCard=cbTargetCard;
OperateResult.dwOperateCode=wTargetAction;
OperateResult.wProvideUser=(m_wProvideUser==INVALID_CHAIR)?wTargetUser:m_wProvideUser;
//<2F><><EFBFBD><EFBFBD>״̬
if (wTargetAction==WIK_GANG) m_bGangStatus=true;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OPERATE_RESULT,&OperateResult,sizeof(OperateResult));
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OPERATE_RESULT,&OperateResult,sizeof(OperateResult));
// <20><>Ϸ¼<CFB7><C2BC>;
addGameRecordAction(SUB_S_OPERATE_RESULT, &OperateResult, sizeof(OperateResult));
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>
m_wCurrentUser=wTargetUser;
//<2F><><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>
if (wTargetAction==WIK_GANG)
{
//m_pITableFrame->SendTableData(INVALID_CHAIR, SUB_S_GANG_SCORE, &gangScoreMsg, sizeof(gangScoreMsg));
//m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_GANG_SCORE, &gangScoreMsg, sizeof(gangScoreMsg));
//// <20><>Ϸ¼<CFB7><C2BC>;
//addGameRecordAction(SUB_S_GANG_SCORE, &gangScoreMsg, sizeof(gangScoreMsg));
////Ч<><EFBFBD><E9B6AF>
//bool bAroseAction=EstimateUserRespond(wTargetUser,cbTargetCard,EstimatKind_GangCard);
////<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
//if (bAroseAction==false)
//{
m_wProvideMingGangUser = m_wProvideUser; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
ZeroMemory(m_genHuCards, sizeof(m_genHuCards));
ZeroMemory(m_genPengCards, sizeof(m_genPengCards));
ZeroMemory(m_GangPaiResult, sizeof(m_GangPaiResult));
DispatchCardData(wTargetUser,false);
//}
m_cbContinueGangTypes[wTargetUser][m_cbContinueGangs[wTargetUser]] = eGangType_MingGang;
++m_cbContinueGangs[wTargetUser];
++m_cbAllGangCounts[wTargetUser];
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (m_cbLeftCardCount>m_cbMustLeft-1)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
tagGangCardResult GangCardResult;
ZeroMemory(&GangCardResult, sizeof(GangCardResult));
m_wUserAction[m_wCurrentUser]|=m_GameLogic.AnalyseGangCard(m_cbCardIndex[m_wCurrentUser],
m_WeaveItemArray[m_wCurrentUser],m_cbWeaveItemCount[m_wCurrentUser],GangCardResult);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (GangCardResult.cbCardCount>0)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_wUserAction[m_wCurrentUser]|=WIK_GANG;
m_wProvideUser = m_wCurrentUser;
//<2F><><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
SendOperateNotify(GangCardResult);
}
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_wCurrentUser==wChairID)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT((wOperateCode!=WIK_NULL)&&((m_wUserAction[wChairID]&wOperateCode)!=0));
if ((wOperateCode==WIK_NULL)||((m_wUserAction[wChairID]&wOperateCode)==0)) return true;
//<2F>˿<EFBFBD>Ч<EFBFBD><D0A7>
ASSERT((wOperateCode==WIK_NULL)||(wOperateCode==WIK_CHI_HU)||(m_GameLogic.IsValidCard(cbOperateCard)==true));
if ((wOperateCode!=WIK_NULL)&&(wOperateCode!=WIK_CHI_HU)&&(m_GameLogic.IsValidCard(cbOperateCard)==false)) return false;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bSendStatus=true;
m_wUserAction[m_wCurrentUser]=WIK_NULL;
m_wPerformAction[m_wCurrentUser]=WIK_NULL;
bool bPublic=false;
//ִ<>ж<EFBFBD><D0B6><EFBFBD>
switch (wOperateCode)
{
case WIK_GANG: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbWeaveIndex=0xFF;
BYTE cbCardIndex=m_GameLogic.SwitchToCardIndex(cbOperateCard);
//<2F><><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>
if (m_cbCardIndex[wChairID][cbCardIndex]==1)
{
//Ѱ<><D1B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (BYTE i=0;i<m_cbWeaveItemCount[wChairID];i++)
{
WORD wWeaveKind=m_WeaveItemArray[wChairID][i].wWeaveKind;
BYTE cbCenterCard=m_WeaveItemArray[wChairID][i].cbCenterCard;
if ((cbCenterCard==cbOperateCard)&&(wWeaveKind==WIK_PENG))
{
bPublic=true;
cbWeaveIndex=i;
break;
}
}
//Ч<><EFBFBD><E9B6AF>
ASSERT(cbWeaveIndex!=0xFF);
if (cbWeaveIndex==0xFF) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
m_WeaveItemArray[wChairID][cbWeaveIndex].cbPublicCard=TRUE;
m_WeaveItemArray[wChairID][cbWeaveIndex].wProvideUser=wChairID;
m_WeaveItemArray[wChairID][cbWeaveIndex].wWeaveKind=wOperateCode;
m_WeaveItemArray[wChairID][cbWeaveIndex].cbCenterCard=cbOperateCard;
}
else
{
//<2F>˿<EFBFBD>Ч<EFBFBD><D0A7>
ASSERT(m_cbCardIndex[wChairID][cbCardIndex]==4);
if (m_cbCardIndex[wChairID][cbCardIndex]!=4) return false;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
bPublic=false;
cbWeaveIndex=m_cbWeaveItemCount[wChairID]++;
m_WeaveItemArray[wChairID][cbWeaveIndex].cbPublicCard=FALSE;
m_WeaveItemArray[wChairID][cbWeaveIndex].wProvideUser=wChairID;
m_WeaveItemArray[wChairID][cbWeaveIndex].wWeaveKind=wOperateCode;
m_WeaveItemArray[wChairID][cbWeaveIndex].cbCenterCard=cbOperateCard;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
m_cbGangCount++;
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
m_cbCardIndex[wChairID][cbCardIndex]=0;
//<2F><><EFBFBD><EFBFBD>״̬
if (wOperateCode==WIK_GANG) m_bGangStatus=true;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_S_OperateResult OperateResult;
OperateResult.wOperateUser=wChairID;
OperateResult.wProvideUser=wChairID;
OperateResult.dwOperateCode=wOperateCode;
OperateResult.cbOperateCard=cbOperateCard;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OPERATE_RESULT,&OperateResult,sizeof(OperateResult));
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OPERATE_RESULT,&OperateResult,sizeof(OperateResult));
// <20><>Ϸ¼<CFB7><C2BC>;
addGameRecordAction(SUB_S_OPERATE_RESULT, &OperateResult, sizeof(OperateResult));
//Ч<><EFBFBD><E9B6AF>
bool bAroseAction=false;
if (bPublic==true) bAroseAction=EstimateUserRespond(wChairID,cbOperateCard,EstimatKind_GangCard);
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
if (bAroseAction==false)
{
DispatchCardData(wChairID,false);
}
if ( bPublic )
{
m_cbContinueGangTypes[wChairID][m_cbContinueGangs[wChairID]] = eGangType_BuGang;
}
else
{
m_cbContinueGangTypes[wChairID][m_cbContinueGangs[wChairID]] = eGangType_AnGang;
}
++m_cbContinueGangs[wChairID];
++m_cbAllGangCounts[wChairID];
return true;
}
case WIK_CHI_HU: //<2F>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD>Ȩλ
WORD wChiHuRight=0;
if (m_bGangStatus==true) wChiHuRight|=CHR_QIANG_GANG;
if ((m_cbSendCardCount==1)&&(m_cbOutCardCount==1)) wChiHuRight|=CHR_DI;
if ((m_cbSendCardCount==1)&&(m_cbOutCardCount==0))
{
wChiHuRight|=CHR_TIAN;
m_wProvideUser = m_wCurrentUser;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_cbChiHuCard=m_cbProvideCard;
//<2F><>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
BYTE cbWeaveItemCount=m_cbWeaveItemCount[wChairID];
tagWeaveItem * pWeaveItem=m_WeaveItemArray[wChairID];
BYTE cbTempCardIndex[MAX_INDEX];
CopyMemory(cbTempCardIndex,m_cbCardIndex[wChairID],sizeof(cbTempCardIndex));
if(m_GameLogic.RemoveCard(cbTempCardIndex,m_cbChiHuCard)==false)
{
ASSERT(FALSE);
}
BYTE cbRule = GetHURuleType();
bool bRealHu = true;
if (m_bGangStatus || ((wChiHuRight & CHR_TIAN) == CHR_TIAN))
{ //<2F><><EFBFBD>ܻ<EFBFBD><DCBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>Ժ<EFBFBD>5<EFBFBD><35><EFBFBD><EFBFBD>;
bRealHu = false;
}
WORD wAction = m_GameLogic.AnalyseChiHuCard(cbTempCardIndex, pWeaveItem, cbWeaveItemCount, m_cbChiHuCard, wChiHuRight, m_ChiHuResult[wChairID], cbRule, true, bRealHu);
if ( wAction == WIK_CHI_HU )
{
m_GameLogic.IsCheckZhongSe(cbTempCardIndex, pWeaveItem, cbWeaveItemCount, m_cbChiHuCard, m_ChiHuResult[wChairID], cbRule, true);
}
if (wAction == WIK_NULL && (m_bGangStatus == true || ((wChiHuRight & CHR_TIAN) == CHR_TIAN)))
{
bool bTingCard = m_GameLogic.IsTingCard(cbTempCardIndex, pWeaveItem, cbWeaveItemCount, m_cbChiHuCard, wChiHuRight, m_ChiHuResult[wChairID], cbRule, true, true);
if ( !bTingCard )
{
if (WIK_CHI_HU == m_GameLogic.AnalyseTingCard(cbTempCardIndex, pWeaveItem, cbWeaveItemCount, m_cbChiHuCard, wChiHuRight, m_ChiHuResult[wChairID], cbRule, true, true, bTingCard))
{
m_ChiHuResult[wChairID].wChiHuRight |= CHR_HAS_KING;
}
}
else
{
m_ChiHuResult[wChairID].wChiHuRight |= CHR_HAS_KING;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
tagChiHuResult tempChiHuResult;
ZeroMemory(&tempChiHuResult, sizeof(tempChiHuResult));
if (WIK_CHI_HU == m_GameLogic.AnalyseTingCard(cbTempCardIndex, pWeaveItem, cbWeaveItemCount, m_cbChiHuCard, wChiHuRight, tempChiHuResult, cbRule, true, true, bTingCard))
{
tempChiHuResult.wChiHuRight |= CHR_HAS_KING;
m_GameLogic.CompareChiHuResult(m_ChiHuResult[wChairID], tempChiHuResult);
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ
OnEventGameConclude(m_wProvideUser,NULL,GER_NORMAL);
return true;
}
}
return true;
}
return false;
}
//<2F><><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>
bool CTableFrameSink::SendOperateNotify(const tagGangCardResult& GangCardResult)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (m_wUserAction[i]!=WIK_NULL)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_S_OperateNotify OperateNotify;
ZeroMemory(&OperateNotify, sizeof(OperateNotify));
OperateNotify.wResumeUser=m_wResumeUser;
OperateNotify.cbActionCard=m_cbProvideCard;
OperateNotify.dwActionMask=m_wUserAction[i];
CopyMemory(&OperateNotify.GangPaiResult, &GangCardResult, sizeof(GangCardResult));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D6BB><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>)
m_pITableFrame->SendTableData(i,SUB_S_OPERATE_NOTIFY,&OperateNotify,sizeof(OperateNotify));
m_pITableFrame->SendLookonData(i,SUB_S_OPERATE_NOTIFY,&OperateNotify,sizeof(OperateNotify));
// <20><><EFBFBD><EFBFBD><E6B3A1><EFBFBD>ָ<EFBFBD>ʹ<EFBFBD><CAB9>;
if ((m_wUserAction[i] & WIK_GANG) != 0)
{
CopyMemory(&m_GangPaiResult[i], &GangCardResult, sizeof(GangCardResult));
}
}
}
return true;
}
//<2F>ɷ<EFBFBD><C9B7>˿<EFBFBD>
bool CTableFrameSink::DispatchCardData(WORD wCurrentUser,bool bNotGang)
{
//״̬Ч<CCAC><D0A7>
ASSERT(wCurrentUser!=INVALID_CHAIR);
if (wCurrentUser==INVALID_CHAIR) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
if ((m_wOutCardUser!=INVALID_CHAIR)&&(m_cbOutCardData!=0))
{
m_cbDiscardCount[m_wOutCardUser]++;
m_cbDiscardCard[m_wOutCardUser][m_cbDiscardCount[m_wOutCardUser]-1]=m_cbOutCardData;
}
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_cbOutCardData=0;
m_wCurrentUser=wCurrentUser;
m_wOutCardUser=INVALID_CHAIR;
tagGangCardResult GangCardResult;
ZeroMemory(&GangCardResult, sizeof(GangCardResult));
if (m_cbLeftCardCount<=m_cbMustLeft-1)
{
m_cbChiHuCard=0;
m_wProvideUser=INVALID_CHAIR;
OnEventGameConclude(m_wProvideUser,NULL,GER_NORMAL);
return true;
}
//<2F><><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>
if (m_bSendStatus==true)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
m_cbSendCardCount++;
//m_cbSendCardData=m_cbRepertoryCard[--m_cbLeftCardCount];
//#ifdef DEBUG
m_cbSendCardData = getSendCardData(wCurrentUser);
//#else
// m_cbSendCardData = m_cbRepertoryCard[--m_cbLeftCardCount];
//#endif // DEBUG
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_cbCardIndex[wCurrentUser][m_GameLogic.SwitchToCardIndex(m_cbSendCardData)]++;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_wProvideUser=wCurrentUser;
m_cbProvideCard=m_cbSendCardData;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (m_cbLeftCardCount>m_cbMustLeft-1)
{
m_wUserAction[wCurrentUser]|=m_GameLogic.AnalyseGangCard(m_cbCardIndex[wCurrentUser],
m_WeaveItemArray[wCurrentUser],m_cbWeaveItemCount[wCurrentUser],GangCardResult);
}
//<2F><><EFBFBD><EFBFBD>Ȩλ
WORD wChiHuRight=0;
if (m_bGangStatus==true) wChiHuRight|=CHR_QIANG_GANG;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
BYTE cbTempCardIndex[MAX_INDEX];
CopyMemory(cbTempCardIndex,m_cbCardIndex[m_wCurrentUser],sizeof(cbTempCardIndex));
if(m_GameLogic.RemoveCard(cbTempCardIndex,m_cbSendCardData)==false)
{
ASSERT(FALSE);
}
BYTE cbRule = GetHURuleType();
tagChiHuResult ChiHuResult;
m_wUserAction[wCurrentUser]|=m_GameLogic.AnalyseChiHuCard(cbTempCardIndex,
m_WeaveItemArray[wCurrentUser], m_cbWeaveItemCount[wCurrentUser], m_cbSendCardData, wChiHuRight, ChiHuResult, cbRule, true, (m_bGangStatus ? false : true));
if (m_bGangStatus && ((m_wUserAction[wCurrentUser] & WIK_CHI_HU) != WIK_CHI_HU ))
{
bool bTingCard = m_GameLogic.IsTingCard(cbTempCardIndex, m_WeaveItemArray[wCurrentUser], m_cbWeaveItemCount[wCurrentUser], m_cbSendCardData, wChiHuRight, ChiHuResult, cbRule);
if (!bTingCard)
{
m_wUserAction[wCurrentUser] |= m_GameLogic.AnalyseTingCard(cbTempCardIndex, m_WeaveItemArray[wCurrentUser], m_cbWeaveItemCount[wCurrentUser], m_cbSendCardData, wChiHuRight, ChiHuResult, cbRule, true, false, bTingCard);
}
else
{
m_wUserAction[wCurrentUser] |= WIK_CHI_HU;
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_S_SendCard SendCard;
SendCard.wCurrentUser = wCurrentUser;
SendCard.wActionMask = m_wUserAction[wCurrentUser];
SendCard.cbCardData = 0x00;
SendCard.cbIsNotGang = bNotGang;
for (WORD i = 0; i < GAME_PLAYER; i++)
{
if (i == wCurrentUser) continue;
if (!m_bActiveUser[i]) continue;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pITableFrame->SendTableData(i, SUB_S_SEND_CARD, &SendCard, sizeof(SendCard));
}
m_pITableFrame->SendLookonData(INVALID_CHAIR, SUB_S_SEND_CARD, &SendCard, sizeof(SendCard));
// <20>Ƿ<EFBFBD><C7B7>иܲ<D0B8><DCB2><EFBFBD>;
if ((m_wUserAction[wCurrentUser] & WIK_GANG) != 0)
{
CopyMemory(&m_GangPaiResult[wCurrentUser], &GangCardResult, sizeof(GangCardResult));
CopyMemory(&SendCard.GangPaiResult, &GangCardResult, sizeof(GangCardResult));
}
SendCard.cbCardData = ( (m_bSendStatus == true) ? m_cbSendCardData : 0x00 );
m_pITableFrame->SendTableData(wCurrentUser, SUB_S_SEND_CARD, &SendCard, sizeof(SendCard));
// <20><>Ϸ¼<CFB7><C2BC>;
addGameRecordAction(SUB_S_SEND_CARD, &SendCard, sizeof(SendCard));
return true;
}
//<2F><>Ӧ<EFBFBD>ж<EFBFBD>
bool CTableFrameSink::EstimateUserRespond(WORD wCenterUser, BYTE cbCenterCard, enEstimatKind EstimatKind)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool bAroseAction=false;
//<2F>û<EFBFBD>״̬
ZeroMemory(m_bResponse,sizeof(m_bResponse));
ZeroMemory(m_wUserAction,sizeof(m_wUserAction));
ZeroMemory(m_wPerformAction,sizeof(m_wPerformAction));
tagGangCardResult GangCardResult;
ZeroMemory(&GangCardResult, sizeof(GangCardResult));
BYTE cbCenterCardIndex = m_GameLogic.SwitchToCardIndex(cbCenterCard);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (!m_bActiveUser[i]) continue;
//<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
if (wCenterUser==i) continue;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߲<EFBFBD><DFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ<EFBFBD><C6BC><EFBFBD>;
if (EstimatKind == EstimatKind_GangCard && m_wProvideUser == i) continue;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (EstimatKind==EstimatKind_OutCard)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if ( !IsInInsertGenPengCards(i, cbCenterCard ) )
{
m_wUserAction[i] |= m_GameLogic.EstimatePengCard(m_cbCardIndex[i], cbCenterCard);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (m_cbLeftCardCount>m_cbMustLeft-1)
{
m_wUserAction[i]|=m_GameLogic.EstimateGangCard(m_cbCardIndex[i],cbCenterCard);
if ((m_wUserAction[i]&WIK_GANG)!= 0)
{
GangCardResult.cbCardCount = 1;
GangCardResult.cbCardData[0] = cbCenterCard;
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
//if (!IsInInsertGenHuCards(i, cbCenterCard))
if (m_genDaLiHuCards[i] != cbCenterCard)
{
//<2F><><EFBFBD><EFBFBD>Ȩλ
WORD wChiHuRight=0;
if (m_bGangStatus==true)
wChiHuRight|=CHR_QIANG_GANG;
if ((m_cbSendCardCount==1)&&(m_cbOutCardCount==1))
wChiHuRight|=CHR_DI;
if ((m_cbSendCardCount==1)&&(m_cbOutCardCount==0))
wChiHuRight|=CHR_TIAN;
BYTE cbRule = GetHURuleType();
//<2F>Ժ<EFBFBD><D4BA>ж<EFBFBD>
tagChiHuResult ChiHuResult;
BYTE cbWeaveCount=m_cbWeaveItemCount[i];
m_wUserAction[i] |= m_GameLogic.AnalyseChiHuCard(m_cbCardIndex[i], m_WeaveItemArray[i], cbWeaveCount, cbCenterCard, wChiHuRight, ChiHuResult, cbRule);
if (((wChiHuRight & CHR_DI) == CHR_DI) && ((m_wUserAction[i] & WIK_CHI_HU) != WIK_CHI_HU))
{
bool bTingCard = m_GameLogic.IsTingCard(m_cbCardIndex[i], m_WeaveItemArray[i], cbWeaveCount, cbCenterCard, wChiHuRight, ChiHuResult, cbRule, false);
m_wUserAction[i] |= m_GameLogic.AnalyseTingCard(m_cbCardIndex[i], m_WeaveItemArray[i], cbWeaveCount, cbCenterCard, wChiHuRight, ChiHuResult, cbRule, false, false, bTingCard);
}
if (((m_wUserAction[i] & WIK_CHI_HU) == WIK_CHI_HU) && (EstimatKind != EstimatKind_GangCard) && HasGenHuCards(i) && ((ChiHuResult.wChiHuKind&CHK_SERVEN) != CHK_SERVEN))
{
//<2F><><EFBFBD>и<EFBFBD><D0B8>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȧ<EFBFBD><C8A6><EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
m_wUserAction[i] &= (~WIK_CHI_HU);
}
if ((wChiHuRight&CHR_DI) == CHR_DI && (ChiHuResult.wChiHuRight&CHR_HAS_KING) == CHR_HAS_KING && (ChiHuResult.wChiHuKind&CHK_QI_DUI) == CHK_QI_DUI)
{
//<2F>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ;
if (m_cbCardIndex[i][cbCenterCardIndex] == 0)
{
//û<><C3BB><EFBFBD>׵<EFBFBD><D7B5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD>;
m_wUserAction[i] &= (~WIK_CHI_HU);
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (m_wUserAction[i]!=WIK_NULL)
bAroseAction=true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (bAroseAction==true)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_wProvideUser=wCenterUser;
m_cbProvideCard=cbCenterCard;
m_wResumeUser=m_wCurrentUser;
m_wCurrentUser=INVALID_CHAIR;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
SendOperateNotify(GangCardResult);
return true;
}
return false;
}
//<2F><>Ϸ<EFBFBD><CFB7>ʼ
bool CTableFrameSink::OnEventGameStart()
{
#if DROPPED_DEFAULT
/************************ ʹ<><CAB9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ************************************************/
std::string strExpirationTime = "2017-05-15";
std::string strMinTime = "2017-03-01";
COleDateTime odt;
COleDateTime odtMin;
odt.ParseDateTime(strExpirationTime.c_str());
odtMin.ParseDateTime(strMinTime.c_str());
SYSTEMTIME st;
SYSTEMTIME stMin;
odt.GetAsSystemTime(st);
odtMin.GetAsSystemTime(stMin);
CTime tCreate(st);
CTime tMin(stMin);
CTime cCurTime = CTime::GetCurrentTime();
// <20><>֤<EFBFBD><D6A4>ǰʱ<C7B0><CAB1><EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD>;
if (cCurTime.GetTime() < tMin.GetTime())
{
m_wDropped = 80;
}
else
{
if (tCreate.GetTime() <= cCurTime.GetTime())
{
CTimeSpan span = cCurTime - tCreate;
m_wDropped = 10 * span.GetDays();
if (m_wDropped > 80)
{
m_wDropped = 80;
}
}
}
/************************************************************************/
#endif
//<2F><><EFBFBD><EFBFBD>״̬
m_pITableFrame->SetGameStatus(GS_MJ_PLAY);
// ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
for (WORD i = 0; i < GAME_PLAYER; ++i)
{
IServerUserItem * pIServerUserItem = m_pITableFrame->GetTableUserItem(i);
if (nullptr == pIServerUserItem) continue;
BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
BYTE cbReUserStatus = pIServerUserItem->GetReUserStatus();
if (cbUserStatus == US_PLAYING || (US_OFFLINE == cbUserStatus && cbReUserStatus == US_PLAYING))
{
m_bActiveUser[i] = true;
}
}
// <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>;
for (WORD i = 0; i < GAME_PLAYER; ++i)
{
m_PrivateEndInfo.aryActiveStatus[i] = m_bActiveUser[i];
}
//Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_cbMustLeft =MUST_LEFT_COUNT;
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
m_GameLogic.RandCardData(m_cbRepertoryCard,CountArray(m_cbRepertoryCard));
m_wSiceCount=MAKEWORD(rand()%6+1,rand()%6+1);
m_cbLeftCardCount=CountArray(m_cbRepertoryCard);
BYTE cbAllUserCardData[GAME_PLAYER][MAX_COUNT];
memset(cbAllUserCardData, 0x0, sizeof(cbAllUserCardData));
#ifdef DEBUG
UseCardLibrary();
#endif
// ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>Ʒֱ<C6B7><D6B1><EFBFBD><EFBFBD><EFBFBD>
for (WORD i = 0; i < m_wPlayerCount; i++)
{
if (m_bActiveUser[i])
{
m_cbLeftCardCount -= (MAX_COUNT - 1);
CopyMemory(&cbAllUserCardData[i][0], &m_cbRepertoryCard[m_cbLeftCardCount], sizeof(BYTE)*(MAX_COUNT - 1));
m_GameLogic.SwitchToCardIndex(&m_cbRepertoryCard[m_cbLeftCardCount], MAX_COUNT - 1, m_cbCardIndex[i]);
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
m_cbSendCardCount++;
m_cbSendCardData=m_cbRepertoryCard[--m_cbLeftCardCount];
m_cbCardIndex[m_wBankerUser][m_GameLogic.SwitchToCardIndex(m_cbSendCardData)]++;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_cbProvideCard=m_cbSendCardData;
m_wProvideUser=INVALID_CHAIR;
m_wCurrentUser=m_wBankerUser;
// <20><><EFBFBD><EFBFBD>ׯ<EFBFBD><D7AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>;
BYTE cbTempCardIndex[MAX_INDEX];
CopyMemory(cbTempCardIndex, m_cbCardIndex[m_wBankerUser], sizeof(cbTempCardIndex));
if(m_GameLogic.RemoveCard(cbTempCardIndex,m_cbSendCardData)==false)
{
ASSERT(FALSE);
}
BYTE cbRule = GetHURuleType();
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>;
tagChiHuResult ChiHuResult;
m_wUserAction[m_wBankerUser] |= m_GameLogic.AnalyseChiHuCard(cbTempCardIndex, NULL, 0, m_cbSendCardData, 0, ChiHuResult, cbRule, true);
if (m_wUserAction[m_wBankerUser] == WIK_NULL)
{
bool bTingCard = m_GameLogic.IsTingCard(cbTempCardIndex, NULL, 0, m_cbSendCardData, 0, ChiHuResult, cbRule);
if ( !bTingCard )
{
m_wUserAction[m_wBankerUser] |= m_GameLogic.AnalyseTingCard(cbTempCardIndex, NULL, 0, m_cbSendCardData, 0, ChiHuResult, cbRule, true);
}
else
{
m_wUserAction[m_wBankerUser] |= WIK_CHI_HU;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (m_cbLeftCardCount > m_cbMustLeft - 1)
{
m_wUserAction[m_wBankerUser] |= m_GameLogic.AnalyseGangCard(m_cbCardIndex[m_wBankerUser],
m_WeaveItemArray[m_wBankerUser], m_cbWeaveItemCount[m_wBankerUser], m_GangPaiResult[m_wBankerUser]);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_S_GameStart GameStart;
ZeroMemory(&GameStart, sizeof(CMD_S_GameStart));
GameStart.wSiceCount=m_wSiceCount;
GameStart.wBankerUser=m_wBankerUser;
GameStart.wCurrentUser=m_wCurrentUser;
CopyMemory(&GameStart.GangPaiResult, &m_GangPaiResult[m_wBankerUser], sizeof(GameStart.GangPaiResult));
CopyMemory(GameStart.bActiveStatus, m_bActiveUser, sizeof(bool)*GAME_PLAYER);
CopyMemory(GameStart.bTrustee,m_bTrustee,sizeof(m_bTrustee));
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (m_bActiveUser[i] == false) continue;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
GameStart.wUserAction=m_wUserAction[i];
CopyMemory(GameStart.cbCardData, &cbAllUserCardData[i][0], sizeof(BYTE)*MAX_COUNT);
// ׯ<><D7AF><EFBFBD>е<EFBFBD>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (i == m_wCurrentUser)
{
GameStart.cbCardData[MAX_COUNT - 1] = m_cbSendCardData;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pITableFrame->SendTableData(i, SUB_S_GAME_START, &GameStart, sizeof(GameStart));
m_pITableFrame->SendLookonData(i, SUB_S_GAME_START, &GameStart, sizeof(GameStart));
}
// ¼<><C2BC><EFBFBD><EFBFBD>ʼ
starGameRecord();
GameStart.wUserAction = m_wUserAction[m_wBankerUser];
ZeroMemory(GameStart.cbCardData, sizeof(GameStart.cbCardData));
addGameRecordAction(SUB_S_GAME_START, &GameStart, sizeof(GameStart));
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
bool CTableFrameSink::OnGameDataBase(WORD wRequestID, VOID * pData, WORD wDataSize)
{
return false;
}
//ʹ<><CAB9><EFBFBD>ƿ<EFBFBD>
void CTableFrameSink::UseCardLibrary()
{
WORD wChairID = INVALID_CHAIR;
//<2F>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>λ<EFBFBD><CEBB>
for (BYTE i = 0; i < GAME_PLAYER; i++)
{
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
IServerUserItem *pServerUserItem = m_pITableFrame->GetTableUserItem(i);
if (pServerUserItem != NULL && pServerUserItem->canUseCardLib())
//if (pServerUserItem != NULL && pServerUserItem->GetGameID() == 131243)
{
CString strDebugInfo;
strDebugInfo.Format(_T("UserID[%d] ChairID[%d] NickName[%s] Is Cheat User\n"), pServerUserItem->GetUserID(), i, pServerUserItem->GetNickName());
::OutputDebugString(strDebugInfo);
wChairID = i;
break;
}
}
if (wChairID == INVALID_CHAIR)
{
return;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
IServerUserItem *pServerUserItem = m_pITableFrame->GetTableUserItem(wChairID);
DWORD dwCardLibIndex = pServerUserItem->getCardLibIndex();
pServerUserItem->addCardLibIndex();
//<2F><>ȡ<EFBFBD>ƿ<EFBFBD>
tagGameCardLibrary* pCardLib = m_pITableFrame->GetGameCardLibrary(1);
if (pCardLib == NULL)
{
return;
}
m_wCheatChairID = wChairID;
//<2F>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE cbCardCount = pCardLib->cbCount;
BYTE aryCardData[LEN_CARD_LIB] = { 0 };
CopyMemory(aryCardData, pCardLib->cbData, cbCardCount);
//<2F>Ȱ<EFBFBD><C8B0>ƿ<EFBFBD><C6BF>е<EFBFBD><D0B5><EFBFBD>ɾ<EFBFBD><C9BE>
BYTE cbMoveCount = (MAX_COUNT - 1);
bool bRemoveSuccess = RemoveCards(m_cbRepertoryCard, CountArray(m_cbRepertoryCard), pCardLib->cbData, pCardLib->cbCount);
if (bRemoveSuccess)
{
//<2F><><EFBFBD>ƴӺ<C6B4><D3BA>ʼ<E6BFAA><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0ʱ<30><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>13<31><33><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>ʱֱ<CAB1>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA>ȰѶ<C8B0>Ӧλ<D3A6><CEBB><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٰ<EFBFBD><D9B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD>ȥ
WORD wDesPos = CountArray(m_cbRepertoryCard) - ((wChairID + 1)*cbMoveCount);
if (wChairID > 0)
{
CopyMemory(&m_cbRepertoryCard[CountArray(m_cbRepertoryCard) - cbMoveCount], &m_cbRepertoryCard[wDesPos], cbMoveCount);
}
CopyMemory(&m_cbRepertoryCard[wDesPos], aryCardData, cbMoveCount);
}
}
//<2F><>֤ɾ<D6A4><C9BE>
bool CTableFrameSink::RemoveCards(BYTE cbCardData[], BYTE cbCardCount, BYTE cbRemoveCard[], BYTE cbRemoveCount)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(cbRemoveCount <= cbCardCount);
BYTE cbDeleteCount = 0;
BYTE cbTempCardData[MAX_REPERTORY] = { 0 };
CopyMemory(cbTempCardData, cbCardData, cbCardCount*sizeof(cbCardData[0]));
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
for (BYTE i = 0; i < cbRemoveCount; i++)
{
for (BYTE j = 0; j < cbCardCount; j++)
{
if (cbRemoveCard[i] == cbTempCardData[j])
{
cbDeleteCount++;
cbTempCardData[j] = 0;
break;
}
}
}
//<2F>ɹ<EFBFBD><C9B9>ж<EFBFBD>
if (cbDeleteCount != cbRemoveCount)
{
ASSERT(FALSE);
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
BYTE cbCardPos = 0;
for (BYTE i = 0; i < cbCardCount; i++)
{
if (cbTempCardData[i] != 0)
cbCardData[cbCardPos++] = cbTempCardData[i];
}
return true;
}
////////////////////////////// ˽<>˳<EFBFBD> ////////////////////////////////////////////
void CTableFrameSink::SetPrivateInfo(BYTE bGameTypeIdex, DWORD bGameRuleIdex)
{
}
// <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void CTableFrameSink::ResetPrivateEndInfo()
{
ZeroMemory(&m_PrivateEndInfo, sizeof(CMD_S_Private_End_Info));
m_BankContinueCount = 1;
}
// <20><><EFBFBD><EFBFBD>˽<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
void CTableFrameSink::GetPrivateEndInfo(DataStream &kDataStream, bool bSend)
{
for (WORD i = 0; i < GAME_PLAYER; i++)
{
// <20>ܻ<EFBFBD><DCBB><EFBFBD>
IServerUserItem* pServerUserItem = m_pITableFrame->GetTableUserItem(i);
if (pServerUserItem)
{
m_PrivateEndInfo.lAllScore[i] = pServerUserItem->GetUserScore();
}
}
m_PrivateEndInfo.StreamValue(kDataStream, bSend);
}
//<2F>ж<EFBFBD>˽<EFBFBD>˳<EFBFBD><CBB3>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
bool CTableFrameSink::IsPrivateEnd()
{
if (m_pITableFrame == nullptr) return false;
tagPrivateFrameParameter* pPrivateFrame = m_pITableFrame->GetPrivateFrameInfo();
tagPrivateFrameRecordInfo* pPrivateRecord = m_pITableFrame->GetPrivateFrameRecord();
if ((pPrivateFrame == nullptr) || (pPrivateRecord == nullptr)) return false;
if (pPrivateFrame->cbGameCout <= pPrivateRecord->cbFinishCout)
{
return true;
}
return false;
}
// <20><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD CTableFrameSink::GetRealChairCount()
{
if (IsHasGameRule(eWNMJRuleEnum_PlayCount2))
{
return 2;
}
else if (IsHasGameRule(eWNMJRuleEnum_PlayCount3))
{
return 3;
}
return GAME_PLAYER;
}
// <20><>ȡ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>Ӻ<EFBFBD>;(wChairID+m_wPlayerCount-1)%m_wPlayerCount;
WORD CTableFrameSink::getNextChairID(WORD wChairID)
{
WORD wNextChairID = INVALID_CHAIR;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
if (IsHasGameRule(eWNMJRuleEnum_PlayCount_auto))
{
// <20>ҵ<EFBFBD><D2B5><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>;
for (int i = 1; i < GAME_PLAYER; i++)
{
wNextChairID = (wChairID + GAME_PLAYER - i) % GAME_PLAYER;
if (m_bActiveUser[wNextChairID])
{
break;
}
}
}
else
{
WORD wRealChairCount = GetRealChairCount();
wNextChairID = (wChairID + wRealChairCount - 1) % wRealChairCount;
}
ASSERT(m_bActiveUser[wNextChairID]);
////<2F>¼<EFBFBD>ʣ<EFBFBD><CAA3>һ<EFBFBD><D2BB><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>;
//WORD wNextChairID = (wChairID + 1) % wRealChairCount;
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(һ<><D2BB>3<EFBFBD><33>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>˴<EFBFBD><CBB4>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD>ֻ<EFBFBD>ж<EFBFBD>һ<EFBFBD>ξͺ<CEBE><CDBA><EFBFBD>);
//if (!m_bActiveUser[wNextChairID])
//{
// wNextChairID = (wNextChairID + 1) % wRealChairCount;
//}
return wNextChairID;
}
// <20><>ȡҪ<C8A1><D2AA>
BYTE CTableFrameSink::getSendCardData(WORD dwSendUser)
{
#define swapCard(a,b)\
BYTE nTemp = a;\
a = b;\
b = nTemp;\
BYTE MasterCard = m_cbMasterCheckCard[dwSendUser];
if (MasterCard == 0)
{
return m_cbRepertoryCard[--m_cbLeftCardCount];
}
bool bValue = false;
for (int i = m_cbLeftCardCount - 1; i >= 0; i--)
{
if (m_cbRepertoryCard[i] == MasterCard)
{
bValue = true;
swapCard(m_cbRepertoryCard[i], m_cbRepertoryCard[m_cbLeftCardCount - 1]);
break;
}
}
m_cbMasterCheckCard[dwSendUser] = 0;
BYTE nCard = m_cbRepertoryCard[--m_cbLeftCardCount];
if (!bValue)
{
//MyLog(_T("<22><><EFBFBD><EFBFBD>ID: %d, ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!"), dwSendUser);
m_pITableFrame->SendGameMessage(m_pITableFrame->GetTableUserItem(dwSendUser), "<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>", SMT_CHAT);
}
return nCard;
}
void CTableFrameSink::sendMasterLeftCard(int nChairdID)
{
MasterLeftCard kMasterLeftCard;
ZeroMemory(&kMasterLeftCard, sizeof(kMasterLeftCard));
kMasterLeftCard.kMasterCheakCard = m_cbMasterCheckCard[nChairdID];
for (int i = 0; i < m_cbLeftCardCount; i++)
{
BYTE __ind = m_GameLogic.SwitchToCardIndex(m_cbRepertoryCard[i]);
kMasterLeftCard.kMasterLeftIndex[__ind]++;
}
m_pITableFrame->SendTableData(nChairdID, SUB_S_MASTER_LEFTCARD, &kMasterLeftCard, sizeof(kMasterLeftCard));
}
bool CTableFrameSink::IsHasGameRule(eWNMJRuleEnum eType)
{
if (m_pITableFrame == NULL) return false;
const tagPrivateFrameParameter* pPrivateFrame = m_pITableFrame->GetPrivateFrameInfo();
if (NULL == pPrivateFrame) return false;
return ((pPrivateFrame->dwGameRule & eType)!= 0);
}
void CTableFrameSink::InsertIntoDelCardIndex(WORD wChairID, BYTE cbRemoveCard[], BYTE cbRemoveCount)
{
for (BYTE i = 0; i < cbRemoveCount; ++i)
{
BYTE cbDelCardIndex = m_GameLogic.SwitchToCardIndex(cbRemoveCard[i]);
m_cbDelCardIndex[wChairID][cbDelCardIndex]++;
}
}
void CTableFrameSink::InsertIntoDelCardIndex(WORD wChairID, tagWeaveItem &reftagWeaveItem)
{
WORD wTargetAction = reftagWeaveItem.wWeaveKind;
BYTE cbTargetCard = reftagWeaveItem.cbCenterCard;
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
switch (wTargetAction)
{
case WIK_DNBL: //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[] = { cbTargetCard, cbTargetCard + 1, cbTargetCard + 3 };
InsertIntoDelCardIndex(wChairID, cbRemoveCard, CountArray(cbRemoveCard));
break;
}
case WIK_DNBC: //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[] = { cbTargetCard - 1, cbTargetCard, cbTargetCard + 2 };
InsertIntoDelCardIndex(wChairID, cbRemoveCard, CountArray(cbRemoveCard));
break;
}
case WIK_DNBR: //<2F><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[] = { cbTargetCard - 3, cbTargetCard - 2, cbTargetCard };
InsertIntoDelCardIndex(wChairID, cbRemoveCard, CountArray(cbRemoveCard));
break;
}
case WIK_DXBL: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[] = { cbTargetCard, cbTargetCard + 2, cbTargetCard + 3 };
InsertIntoDelCardIndex(wChairID, cbRemoveCard, CountArray(cbRemoveCard));
break;
}
case WIK_DXBC: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[] = { cbTargetCard - 2, cbTargetCard, cbTargetCard + 1 };
InsertIntoDelCardIndex(wChairID, cbRemoveCard, CountArray(cbRemoveCard));
break;
}
case WIK_DXBR: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[] = { cbTargetCard - 3, cbTargetCard - 1, cbTargetCard };
InsertIntoDelCardIndex(wChairID, cbRemoveCard, CountArray(cbRemoveCard));
break;
}
case WIK_LEFT: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[] = { cbTargetCard, cbTargetCard + 1, cbTargetCard + 2 };
InsertIntoDelCardIndex(wChairID, cbRemoveCard, CountArray(cbRemoveCard));
break;
}
case WIK_RIGHT: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[] = { cbTargetCard - 2, cbTargetCard - 1, cbTargetCard };
InsertIntoDelCardIndex(wChairID, cbRemoveCard, CountArray(cbRemoveCard));
break;
}
case WIK_CENTER: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[] = { cbTargetCard - 1, cbTargetCard, cbTargetCard + 1 };
InsertIntoDelCardIndex(wChairID, cbRemoveCard, CountArray(cbRemoveCard));
break;
}
case WIK_PENG: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[] = { cbTargetCard, cbTargetCard, cbTargetCard };
InsertIntoDelCardIndex(wChairID, cbRemoveCard, CountArray(cbRemoveCard));
break;
}
case WIK_GANG: //<2F><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
{
//ɾ<><C9BE><EFBFBD>˿<EFBFBD>
BYTE cbRemoveCard[] = { cbTargetCard, cbTargetCard, cbTargetCard, cbTargetCard };
InsertIntoDelCardIndex(wChairID, cbRemoveCard, CountArray(cbRemoveCard));
break;
}
}
}
/////////////////////////////// <20><>Ϸ¼<CFB7><C2BC> ///////////////////////////////////////////
void CTableFrameSink::addGameRecordAction(WORD wSubCmdID, void* pSubMessage, int nMessageSize)
{
tagGameRecordOperateResult kOperateRecord;
kOperateRecord.wSubCmdID = wSubCmdID;
kOperateRecord.subMessageData.pushValue(pSubMessage, nMessageSize);
m_kGameRecord.actionVec.push_back(kOperateRecord);
}
void CTableFrameSink::starGameRecord()
{
m_kGameRecord = tagGameRecord();
m_kGameRecord.wBankerUser = m_wBankerUser;
m_kGameRecord.wEastUser = 0;
for (WORD i = 0; i < GAME_PLAYER; i++)
{
if (!m_bActiveUser[i]) continue;
IServerUserItem* pUserItem = m_pITableFrame->GetTableUserItem(i);
if (pUserItem == NULL) continue;
tagUserInfo* pUserInfo = pUserItem->GetUserInfo();
if (NULL == pUserInfo) continue;
tagGameRecordPlayer kReocrdPlayer;
kReocrdPlayer.dwUserID = pUserItem->GetUserID();
kReocrdPlayer.dwGameID = pUserItem->GetGameID();
kReocrdPlayer.wChairID = pUserItem->GetChairID();
kReocrdPlayer.cbSex = pUserItem->GetGender();
kReocrdPlayer.lScore = pUserItem->GetUserScore();
kReocrdPlayer.strHead = pUserInfo->szHeadHttp;
kReocrdPlayer.strNickName = pUserItem->GetNickName();
BYTE cbCardData[MAX_COUNT] = { 0 };
m_GameLogic.SwitchToCardData(m_cbCardIndex[i], cbCardData, MAX_INDEX);
for (int i = 0; i < MAX_COUNT; i++)
{
kReocrdPlayer.cbCardData.push_back(cbCardData[i]);
}
m_kGameRecord.playersVec.push_back(kReocrdPlayer);
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ;
}
BYTE CTableFrameSink::GetFanShuType()
{
return (IsHasGameRule(eWNMJRuleEnum_OneTwoFAN) ? eWNMJRuleEnum_OneTwoFAN : eWNMJRuleEnum_TwoThreeFAN);
}
void CTableFrameSink::InsertGenHuCards(WORD wChairID, BYTE cbHuCardData)
{
if (wChairID < 0 || wChairID >= GAME_PLAYER)
{
return;
}
for (int i = 0; i < 4; ++i)
{
if (m_genHuCards[wChairID][i] == 0)
{
m_genHuCards[wChairID][i] = cbHuCardData;
break;
}
}
}
bool CTableFrameSink::IsInInsertGenHuCards(WORD wChairID, BYTE cbCardData)
{
if (wChairID < 0 || wChairID >= GAME_PLAYER)
{
return true;
}
for (int i = 0; i < 4; ++i)
{
BYTE cbGenHuCard = m_genHuCards[wChairID][i];
if (cbGenHuCard == 0)
{
break;
}
if (cbGenHuCard == cbCardData)
{
return true;
}
}
return false;
}
BYTE CTableFrameSink::GetHURuleType()
{
if (IsHasGameRule(eWNMJRuleEnum_YingHU))
{
return eWNMJHURuleEnum_YingHU;
}
if (IsHasGameRule(eWNMJRuleEnum_YiBianDaoHU))
{
return eWNMJHURuleEnum_YiBianDaoHU;
}
if (IsHasGameRule(eWNMJRuleEnum_HunHU))
{
return eWNMJHURuleEnum_HunHU;
}
return eWNMJHURuleEnum_Invalid;
}
void CTableFrameSink::InsertGenPengCards(WORD wChairID, BYTE cbPengCardData)
{
if (wChairID < 0 || wChairID >= GAME_PLAYER)
{
return;
}
for (int i = 0; i < 4; ++i)
{
if (m_genPengCards[wChairID][i] == 0)
{
m_genPengCards[wChairID][i] = cbPengCardData;
break;
}
}
}
bool CTableFrameSink::IsInInsertGenPengCards(WORD wChairID, BYTE cbCardData)
{
if (wChairID < 0 || wChairID >= GAME_PLAYER)
{
return true;
}
for (int i = 0; i < 4; ++i)
{
BYTE cbGenPengCard = m_genPengCards[wChairID][i];
if (cbGenPengCard == 0)
{
break;
}
if (cbGenPengCard == cbCardData)
{
return true;
}
}
return false;
}
bool CTableFrameSink::HasGenHuCards(WORD wChairID)
{
if (wChairID < 0 || wChairID >= GAME_PLAYER)
{
return true;
}
for (int i = 0; i < 4; ++i)
{
BYTE cbGenHuCard = m_genHuCards[wChairID][i];
if (cbGenHuCard != 0)
{
return true;
}
}
return false;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////