📄 tableframesink.cpp
字号:
#include "StdAfx.h"
#include "TableFrameSink.h"
//////////////////////////////////////////////////////////////////////////
#define IDI_GAME_END 1 //结束标识
#define IDI_PASS_CARD 2 //放弃标识
#define TIME_PASS_CARD 50000 //放弃定时
#define MAX_SHOW_HAND_SCORE 0x7FFFFFFF //最大梭哈分数
//////////////////////////////////////////////////////////////////////////
//静态变量
const WORD CTableFrameSink::m_wPlayerCount=GAME_PLAYER; //游戏人数
const enStartMode CTableFrameSink::m_GameStartMode=enStartMode_AllReady; //开始模式
//////////////////////////////////////////////////////////////////////////
//构造函数
CTableFrameSink::CTableFrameSink()
{
//游戏变量
m_wOperaCount=0;
m_bSendCardCount=0;
m_wCurrentUser=INVALID_CHAIR;
memset(m_cbCardCount,0,sizeof(m_cbCardCount));
memset(m_cbHandCardData,0,sizeof(m_cbHandCardData));
m_cbGameEndReason = GER_NORMAL;
m_bGameEnd = false;
m_bShowHand = false;
//金币信息
m_lMaxGold=0;
m_lTurnMaxGold = 0;
m_lTurnBasicGold=0;
m_lBasicGold = 0;
memset(m_lTableGold,0,sizeof(m_lTableGold));
ZeroMemory(m_lUserScore,sizeof(m_lUserScore));
//辅助变量
memset(m_cbPlayStatus,0,sizeof(m_cbPlayStatus));
//组件变量
m_pITableFrame=NULL;
m_pGameServiceOption=NULL;
return;
}
//析构函数
CTableFrameSink::~CTableFrameSink(void)
{
}
//接口查询
void * __cdecl CTableFrameSink::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(ITableFrameSink,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(ITableFrameSink,Guid,dwQueryVer);
return NULL;
}
//初始化
bool __cdecl CTableFrameSink::InitTableFrameSink(IUnknownEx * pIUnknownEx)
{
//查询接口
ASSERT(pIUnknownEx!=NULL);
m_pITableFrame=GET_OBJECTPTR_INTERFACE(pIUnknownEx,ITableFrame);
if (m_pITableFrame==NULL) return false;
//获取参数
m_pGameServiceOption=m_pITableFrame->GetGameServiceOption();
ASSERT(m_pGameServiceOption!=NULL);
return true;
}
//复位桌子
void __cdecl CTableFrameSink::RepositTableFrameSink()
{
//状态变量
m_wOperaCount=0;
m_bSendCardCount=0;
m_wCurrentUser=INVALID_CHAIR;
memset(m_cbPlayStatus,0,sizeof(m_cbPlayStatus));
memset(m_cbHandCardData,0,sizeof(m_cbHandCardData));
memset(m_cbCardCount,0,sizeof(m_cbCardCount));
m_cbGameEndReason = GER_NORMAL;
m_bGameEnd = false;
m_bShowHand = false;
//金币变量
m_lMaxGold=0L;
m_lTurnMaxGold = 0;
m_lTurnBasicGold=0L;
m_lBasicGold = 0;
memset(m_lTableGold,0,sizeof(m_lTableGold));
ZeroMemory(m_lUserScore,sizeof(m_lUserScore));
return;
}
//开始模式
enStartMode __cdecl CTableFrameSink::GetGameStartMode()
{
return m_GameStartMode;
}
//游戏状态
bool __cdecl CTableFrameSink::IsUserPlaying(WORD wChairID)
{
ASSERT(wChairID<m_wPlayerCount);
return m_cbPlayStatus[wChairID]?true:false;
}
//游戏开始
bool __cdecl CTableFrameSink::OnEventGameStart()
{
//状态变量
m_wOperaCount=0;
m_bSendCardCount=0;
memset(m_cbPlayStatus,0,sizeof(m_cbPlayStatus));
memset(m_cbCardCount,0,sizeof(m_cbCardCount));
//金币变量
m_lMaxGold=0L;
m_lTurnBasicGold=0L;
memset(m_lTableGold,0,sizeof(m_lTableGold));
//设置状态
m_pITableFrame->SetGameStatus(GS_PLAYING);
//变量定义
const tagUserScore * pUserScore=NULL;
IServerUserItem * pIServerUserItem=NULL;
//计算下注
bool bCalculateGold=false;
LONG lMaxShowHandScore = m_pGameServiceOption->lRestrictScore!=0L?m_pGameServiceOption->lRestrictScore:MAX_SHOW_HAND_SCORE;
for (WORD i=0;i<m_wPlayerCount;i++)
{
pIServerUserItem=m_pITableFrame->GetServerUserItem(i);
if (pIServerUserItem!=NULL)
{
m_cbPlayStatus[i]=true;
pUserScore=pIServerUserItem->GetUserScore();
m_lUserScore[i] = __min(pUserScore->lScore,lMaxShowHandScore);
if (bCalculateGold==false)
{
bCalculateGold=true;
m_lMaxGold=m_lUserScore[i];
}
else
{
m_lMaxGold=__min(m_lMaxGold,m_lUserScore[i]);
}
}
}
m_lTurnMaxGold = m_lMaxGold/2;
m_lBasicGold = m_pGameServiceOption->lCellScore;
for( WORD i = 0; i < m_wPlayerCount; i++ )
{
if( m_cbPlayStatus[i] )
{
m_lTableGold[i*2+1]=m_lBasicGold;
}
}
//分发扑克
m_bSendCardCount=2;
m_GameLogic.RandCardList(m_cbHandCardData[0],sizeof(m_cbHandCardData)/sizeof(m_cbHandCardData[0][0]));
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (m_cbPlayStatus[i]==TRUE)
{
m_cbCardCount[i]=m_bSendCardCount;
}
}
//设置用户
m_wCurrentUser=EstimateWinner(1,1);
//发送开始
CMD_S_GameStart GameStart;
memset(&GameStart,0,sizeof(GameStart));
GameStart.wCurrentUser=m_wCurrentUser;
GameStart.lTurnMaxGold=m_lTurnMaxGold;
GameStart.lTurnBasicGold=m_lTurnBasicGold;
GameStart.lBasicGold = m_lBasicGold;
GameStart.lShowHandScore = lMaxShowHandScore;
for (WORD i=0;i<m_wPlayerCount;i++)
{
if( m_cbPlayStatus[i] )
GameStart.bCardData[i]=m_cbHandCardData[i][1];
}
for (WORD i=0;i<m_wPlayerCount;i++)
{
GameStart.bFundusCard=0;
if (m_cbPlayStatus[i]==TRUE)
{
GameStart.bFundusCard=m_cbHandCardData[i][0];
m_pITableFrame->SendTableData(i,SUB_S_GAME_START,&GameStart,sizeof(GameStart));
}
m_pITableFrame->SendLookonData(i,SUB_S_GAME_START,&GameStart,sizeof(GameStart));
}
m_pITableFrame->SetGameTimer( IDI_PASS_CARD,TIME_PASS_CARD,1,m_wCurrentUser );
return true;
}
//游戏结束
bool __cdecl CTableFrameSink::OnEventGameEnd(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason)
{
switch (cbReason)
{
case GER_DISMISS: //游戏解散
{
//效验参数
ASSERT(pIServerUserItem!=NULL);
ASSERT(wChairID<m_wPlayerCount);
//构造数据
CMD_S_GameEnd GameEnd;
memset(&GameEnd,0,sizeof(GameEnd));
//发送信息
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd));
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd));
m_pITableFrame->KillGameTimer(IDI_GAME_END);
//结束游戏
m_pITableFrame->ConcludeGame();
return true;
}
case GER_NORMAL: //常规结束
case GER_NO_PLAYER: //没有玩家
{
//定义变量
CMD_S_GameEnd GameEnd;
ZeroMemory(&GameEnd,sizeof(GameEnd));
//统计信息
WORD wWinerUser=EstimateWinner(0,4);
ASSERT( wWinerUser != INVALID_CHAIR );
LONG lMaxWinScore = m_lUserScore[wWinerUser];
for (WORD i=0;i<m_wPlayerCount;i++)
{
//底牌信息
if ((cbReason==GER_NO_PLAYER)||(m_cbPlayStatus[i]==FALSE)) GameEnd.bUserCard[i]=0;
else GameEnd.bUserCard[i]=m_cbHandCardData[i][0];
//积分信息
if (i!=wWinerUser)
{
LONG lScore = __min(__min(m_lTableGold[i*2]+m_lTableGold[i*2+1],m_lUserScore[i]),lMaxWinScore);
GameEnd.lGameGold[i] = -lScore;
GameEnd.lGameGold[wWinerUser] += lScore;
}
}
for( WORD i = 0; i < GAME_PLAYER; i++ )
{
LONG lRevenue=0;
enScoreKind ScoreKind;
//胜利类型
ScoreKind=(GameEnd.lGameGold[i]>0L)?enScoreKind_Win:enScoreKind_Lost;
//计算税收
if (m_pGameServiceOption->wServerType==GAME_GENRE_GOLD)
{
//扣税变量
BYTE cbRevenue=m_pGameServiceOption->cbRevenue;
if (GameEnd.lGameGold[i]>=100L)
{
//计算税收
lRevenue=(LONG)((LONGLONG)GameEnd.lGameGold[i]*cbRevenue/100L);
//成绩变量
GameEnd.lTax+=lRevenue;
GameEnd.lGameGold[i]=GameEnd.lGameGold[i]-lRevenue;
}
}
//写入积分
if (m_cbPlayStatus[i]==TRUE)
{
m_pITableFrame->WriteUserScore(i,GameEnd.lGameGold[i],lRevenue,ScoreKind);
}
}
//发送信息
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd));
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_GAME_END,&GameEnd,sizeof(GameEnd));
m_pITableFrame->KillGameTimer(IDI_GAME_END);
//结束游戏
m_pITableFrame->ConcludeGame();
return true;
}
case GER_USER_LEFT: //用户强退
{
//效验参数
ASSERT(pIServerUserItem!=NULL);
ASSERT(wChairID<m_wPlayerCount);
//强退处理
OnUserGiveUp(wChairID);
return true;
}
}
return false;
}
//发送场景
bool __cdecl CTableFrameSink::SendGameScene(WORD wChiarID, IServerUserItem * pIServerUserItem, BYTE bGameStatus, bool bSendSecret)
{
switch (bGameStatus)
{
case GS_FREE: //空闲状态
{
//构造数据
CMD_S_StatusFree StatusFree;
memset(&StatusFree,0,sizeof(StatusFree));
StatusFree.dwBasicGold=0;
//发送场景
return m_pITableFrame->SendGameScene(pIServerUserItem,&StatusFree,sizeof(StatusFree));
}
case GS_PLAYING: //游戏状态
{
//构造数据
CMD_S_StatusPlay StatusPlay;
memset(&StatusPlay,0,sizeof(StatusPlay));
StatusPlay.wCurrentUser=m_wCurrentUser;
StatusPlay.lTurnBasicGold=m_lTurnBasicGold;
StatusPlay.lBasicGold=m_lBasicGold;
CopyMemory(StatusPlay.bPlayStatus,m_cbPlayStatus,sizeof(m_cbPlayStatus));
CopyMemory(StatusPlay.lTableGold,m_lTableGold,sizeof(m_lTableGold));
StatusPlay.lShowHandScore = m_pGameServiceOption->lRestrictScore!=0L?m_pGameServiceOption->lRestrictScore:MAX_SHOW_HAND_SCORE;
StatusPlay.bShowHand = m_bShowHand?TRUE:FALSE;
//设置下注
StatusPlay.lTurnMaxGold=m_lTurnMaxGold;
//设置扑克
for (WORD i=0;i<m_wPlayerCount;i++)
{
if (m_cbPlayStatus[i]==TRUE)
{
ASSERT(m_pITableFrame->GetServerUserItem(i)!=NULL);
StatusPlay.bTableCardCount[i]=m_cbCardCount[i];
if (i==wChiarID) StatusPlay.bTableCardArray[i][0]=m_cbHandCardData[i][0];
CopyMemory(&StatusPlay.bTableCardArray[i][1],&m_cbHandCardData[i][1],(m_cbCardCount[i]-1)*sizeof(BYTE));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -