📄 brewgame.cpp
字号:
/*===========================================================================
FILE: BrewGame.c
===========================================================================*/
#include "BrewGame.h"
#include "BrewHelpAndIntro.h"
CBrewGame::CBrewGame(){
UINT16 x,y;
m_nCurrentGameId = MKND_CHESS;
m_nGameRunFlag = FALSE;
frame = NULL;
m_pIShell = NULL;
// m_nGameState = GAME_INIT;
m_nCurrentTableId = 0;
m_nCurrentSeatId = 0;
m_pIGameCanvas = CreateGameCanvas();
if (m_pIGameCanvas != NULL)
m_pIGameCanvas->setFrame(this);
m_pUList = NULL;
m_nUCount = 0;
////////////////////////////////
m_bInitData=FALSE;
m_bGameStart=FALSE;
m_bShowMenuOnly=TRUE;
m_bNextRound=FALSE;
m_pMainMenuCtl=NULL;
m_pMenu=NULL;
m_pRiver=NULL;
m_pHand=NULL;
m_pGeneral=NULL;//7-16
m_pChatMenu=NULL;
m_pDlg=NULL;
m_pHelp=NULL;
m_pApplyResult[0]='\0';
m_pApplyResult[1]='\0';
m_ApplyInd[0]='\0';
m_ApplyInd[1]='\0';
m_bShowGeneral=FALSE;
m_time=0;
m_clock=0;
m_bMsgResponse=FALSE;
m_bProcessedTIMEIND=FALSE;
m_bShowClock=FALSE;
for(x=0;x<9;x++)
for(y=0;y<10;y++)
m_cChessVal[x][y]=0;
m_cSelectedChess=0;
m_cEndChess=0;
m_setupCnt=0;
m_pChess=NULL;
m_pImage=NULL;
m_bChessSelected=FALSE;
m_bShowRect=FALSE;
m_bMyturn=FALSE;
m_eMove=ENONE;
m_bShowOppRect=FALSE;
m_pIMWriter=NULL;
m_pBoard=NULL;
m_pLastLayout=NULL;
MEMSET(m_psIDName,'\0',sizeof(m_psTypeName));
MEMSET(m_psTypeName,'\0',sizeof(m_psTypeName));
MEMSET(m_psLayout,'\0',sizeof(m_psLayout));
MEMSET(m_ChessMapField,'\0',sizeof(m_ChessMapField));
m_bChessCanMove=FALSE;//7-19改为false,因为会在悔棋等动作时出现上一次的框
m_bMainMenuCtl=FALSE;
m_bMainMenu=FALSE;
m_bChatMenu=FALSE;
m_bHelpView=FALSE;
m_bYouBack=FALSE;
}
void CBrewGame::freeData(){
freeMyData();
m_pIShell = NULL;
if (m_pIGameCanvas != NULL){
m_pIGameCanvas->Release();
m_pIGameCanvas = NULL;
}
clearUserList();
}
void CBrewGame::clearUserList(){
struct UserItemStruct *uItem;
UINT16 i;
for (i = 0; i < m_nUCount; i ++){
if (m_pUList == NULL)
break;
uItem = m_pUList;
m_pUList = m_pUList->userNext;
FREE(uItem);
}
m_nUCount = 0;
}
CBrewGame::~CBrewGame(){
freeData();
}
void CBrewGame::setGameFrame(IBrewGameFrame *f){
frame = f;
if (frame != NULL){
m_pIShell = frame->getCurrentShell();
m_pIDi = frame->getDeviceInfo();
}
}
UINT16 CBrewGame::getCurrentGameId(){
return m_nCurrentGameId;
}
void CBrewGame::onUserInfo(UINT8 ret, UINT16 num, struct UserItemStruct *uItem){
if (m_nGameRunFlag == FALSE)
return;
UINT16 i;
UINT16 j;
struct UserItemStruct *uFromItem;
struct UserItemStruct *uToItem;
struct UserItemStruct *uLastItem;
uLastItem = NULL;
uFromItem = uItem;
for (i = 0; i < num; i ++){
if (uFromItem == NULL)
break;
uToItem = m_pUList;
uLastItem = NULL;
for (j = 0; j < m_nUCount; j ++){
if (uToItem == NULL)
break;
if ((uToItem->userItem.userNameLength == uItem->userItem.userNameLength)
&& (MEMCMP(uToItem->userItem.userName, uItem->userItem.userName, uItem->userItem.userNameLength) == 0))
break;
uLastItem = uToItem;
uToItem = uToItem->userNext;
}
if (uToItem == NULL){
uToItem = (struct UserItemStruct *)MALLOC(sizeof(struct UserItemStruct));
if (uToItem == NULL)
break;
m_nUCount ++;
if (uLastItem == NULL){
uToItem->userNext = NULL;
m_pUList = uToItem;
}else{
uToItem->userNext = uLastItem->userNext;
uLastItem->userNext = uToItem;
}
}
MEMCPY(&(uToItem->userItem), &(uFromItem->userItem), sizeof(struct UserInfoStruct));
ProcessUserInfo(&uToItem->userItem);
uFromItem = uFromItem->userNext;
}
}
void CBrewGame::onInviteUser(UINT16 num, struct InviteItemStruct *inviteItem){
}
void CBrewGame::onChat(UINT16 num, struct ChatItemStruct *chatItem){
AECHAR* szMsg=NULL;
int i,j,k;
for(k=0;k<num;k++){
i=0;j=0;
while(chatItem[k].chatItem.info[i]!=0){
if(szMsg==NULL){
szMsg=(AECHAR*)MALLOC(chatItem[k].chatItem.infoLength+2);
MEMSET(szMsg,'\0',chatItem[k].chatItem.infoLength+2);
}
szMsg[j]=*(UINT16*)&chatItem[k].chatItem.info[i];
szMsg[j]=NTOHS(szMsg[j]);
i+=2;
j++;
}
szMsg[j]='\0';
frame->postMessage(szMsg,0,MESSAGE_WARNING_COLOR,5000,MESSAGE_TEXT_CENTER);
if(szMsg)
FREE(szMsg);
szMsg=NULL;
}
return;
}
void CBrewGame::onDisconnectGameServer(UINT8 retCode){
if(m_nGameRunFlag == FALSE)
return;
AECHAR* pszMsg=NULL;
if((m_nGameState==GAME_STATE_SELSTART)||(m_nGameState==GAME_STATE_WAIT)||(m_nGameState==GAME_STATE_ROUNDOVER)||(m_nGameState==GAME_STATE_NEXTROUND)){
m_nGameRunFlag = FALSE;
frame->standUp();
freeMyData();
frame->postUserEvent(HALL, SWITCH_INTO, 0);
frame->showHint(NULL,0,HINT_TOP);
frame->showHint(NULL,0,HINT_BOTTOM);
return;
}
UINT16 hintType;
if(m_bMyturn)
hintType=HINT_TOP;
else
hintType=HINT_BOTTOM;
pszMsg=(AECHAR*)MALLOC(40);
MEMSET(pszMsg,'\0',40);
ISHELL_LoadResString(m_pIShell,GAMEVV_RES_FILE,IDC_MYDISCONNECT,pszMsg,20);
frame->showHint(pszMsg,0,hintType);
clearUserList();
m_bShowClock=FALSE;
((CBrewGameCanvas*)m_pIGameCanvas)->m_bShowHand=FALSE;
FREE(pszMsg);
pszMsg=NULL;
}
void CBrewGame::onStart(){
}
void CBrewGame::onStop(){
freeData();
}
void CBrewGame::onSuspend(){
if((m_pMainMenuCtl!=NULL)){
m_bMainMenuCtl=IMENUCTL_IsActive(m_pMainMenuCtl);
if(m_bMainMenuCtl)
IMENUCTL_SetActive(m_pMainMenuCtl,FALSE);
}
if(m_pMenu!=NULL){
m_bMainMenu=IMENUCTL_IsActive(m_pMenu);
if(m_bMainMenu)
IMENUCTL_SetActive(m_pMenu,FALSE);
}
if(m_pChatMenu!=NULL){
m_bChatMenu=IMENUCTL_IsActive(m_pChatMenu);
if(m_bChatMenu)
IMENUCTL_SetActive(m_pChatMenu,FALSE);
}
return;
}
void CBrewGame::onResume(){
if((m_pMainMenuCtl!=NULL)&&m_bMainMenuCtl)
IMENUCTL_SetActive(m_pMainMenuCtl,TRUE);
if((m_pMenu!=NULL)&&m_bMainMenu)
IMENUCTL_SetActive(m_pMenu,TRUE);
if((m_pChatMenu!=NULL)&&m_bChatMenu)
IMENUCTL_SetActive(m_pChatMenu,TRUE);
return;
}
void CBrewGame::onPlay(){
if (m_nGameRunFlag == FALSE)
return;
UINT32 nowTime;
switch (m_nGameState){
case GAME_STATE_NONE:
break;
case GAME_STATE_SELSTART://举手
m_bShowMenuOnly=TRUE;
break;
case GAME_STATE_WAIT:
break;
case GAME_STATE_PLAY:
m_bShowMenuOnly=FALSE;
m_bMyturn=CheckWhoTurn();//7-14为了显示下过棋的框而调用
if(m_bShowGeneral){//7-16
nowTime=ISHELL_GetUpTimeMS(m_pIShell);
if(((nowTime-m_time)>=2000))//将字显示延迟时间到达1秒后就不再显示
m_bShowGeneral=FALSE;
}
break;
case GAME_STATE_CHAT:
break;
case GAME_STATE_MENU:
break;
case GAME_STATE_ROUNDOVER:
break;
case GAME_STATE_NEXTROUND:
break;
default:
break;
}
}
void CBrewGame::onYouBack(UINT8 roomId, UINT8 tableId, UINT8 seatId){
// m_nCurrentTableId=tableId;
// m_nCurrentSeatId=seatId;
m_bShowClock=TRUE;
m_bYouBack=TRUE;
m_nGameRunFlag=TRUE;
if(m_bInitData==FALSE){
m_bInitData=InitData();
if((m_sChessState.m_turn&0xF0)==1){
if(m_nCurrentSeatId==1)
m_cMycolor=BLACK;
else
m_cMycolor=RED;
}else {
if(m_nCurrentSeatId==1)
m_cMycolor=RED;
else
m_cMycolor=BLACK;
}
}
m_nGameState=GAME_STATE_PLAY;
}
void CBrewGame::ProcessReConnect()
{
MEMSET(m_psLayout,'\0',sizeof(m_psLayout));
MEMCPY(m_psLayout,m_ChessMapField,sizeof(m_ChessMapField));
SetOrigin(m_cMycolor);//实时更新棋谱
m_setupCnt=(m_sChessState.m_stateID[0]<<8)+(m_sChessState.m_stateID[1]&255);
m_bMyturn=CheckWhoTurn();
if(m_bMyturn){
m_bShowClock=TRUE;
m_clock=ISHELL_GetUpTimeMS(m_pIShell);
}
m_bChessCanMove=FALSE;
m_bShowOppRect=FALSE;
m_cSelectedChess=0;
m_cEndChess=0;
m_bChessSelected=FALSE;
m_bShowRect=FALSE;
}
void CBrewGame::onPackage(IMessageReader *mReader){
INT8 i=0;
INT16 num;
if(m_nGameRunFlag ==FALSE)
return;
switch (mReader->getModuleKind()){
case MKND_CHESS:
switch (mReader->getMessageID()){
case MFC_M_IND://棋谱信息
ProcessMFC_M_INDmsg(mReader);
switch(m_nGameState){
case GAME_STATE_NONE:
SetOrigin(m_cMycolor);
if(m_bInitData){
m_nGameState = GAME_STATE_SELSTART;
ShowIntroduce();
}
break;
case GAME_STATE_ROUNDOVER:
gameReset();//新的一局开始7-18
SetOrigin(m_cMycolor);
break;
default:
break;
}
break;
case MFC_TIME_IND://局况指示
ProcessMFC_TIME_INDmsg(mReader);
i=(INT8)(m_sChessState.m_ChessState&0x0F);
switch(i){
case 0:
switch(m_nGameState){
case GAME_STATE_WAIT:
case GAME_STATE_MAINMENU:
case GAME_STATE_MENU:
case GAME_STATE_HELP:
case GAME_STATE_PLAYERINFO:
ProcessSelStart();
break;
}
break;
case 1://走子结果
ProcessGoResult();
break;
case 2://悔棋结果
ProcessRegret();//7-16
break;
case 3://重联结果
ProcessReConnect();
break;
case 4://双方交换棋子
ProcessChange();
break;
case 5://将军
m_bShowGeneral=TRUE;
m_time=ISHELL_GetUpTimeMS(m_pIShell);//为了在自己这里画出将军
ProcessGoResult();
break;
}
if(i!=0){
num=(m_sChessState.m_stateID[0]<<8)+(m_sChessState.m_stateID[1]&255);
if((num-m_setupCnt)==1)
m_setupCnt=num;
else{
MEMSET(m_psLayout,'\0',sizeof(m_psLayout));
MEMCPY(m_psLayout,m_ChessMapField,sizeof(m_ChessMapField));
SetOrigin(m_cMycolor);//实时更新棋谱
m_setupCnt=num;
}
}
break;
case MFC_ROUNDEND_IND://棋局结束指示
ProcessMFC_ROUNDEND_INDmsg(mReader);
m_cOldColor=m_cMycolor;
m_nGameState = GAME_STATE_ROUNDOVER;
showMsg(m_nGameState,0,0,0,0,0);
break;
case MFC_CLAIM_IND://请求
ProcessMFC_CLAIM_INDmsg(mReader);
break;
case MFC_ACTION_IND://走棋结果
ProcessMFC_ACTION_INDmsg(mReader);
break;
case MFC_CLAIM_REQ://求和、悔棋、交换的指示
ProcessMFC_CLAIM_REQmsg(mReader);
default:
break;
}
break;
default:
break;
}
}
void CBrewGame::onEvent(AEEEvent eCode, UINT16 wParam, UINT32 dwParam){
if (frame == NULL)
return;
// struct UserItemStruct *userItem=NULL;
switch (eCode){
case EVT_COMMAND:
if (m_nGameRunFlag == FALSE)
break;
///////////////////////////////////////////////
switch (m_nGameState){
case GAME_STATE_PLAY:
case GAME_STATE_GIVEUP:
case GAME_STATE_SELSTART:
case GAME_STATE_WAIT:
case GAME_STATE_CHANGE:
case GAME_STATE_REGRET:
case GAME_STATE_COMPROMISE:
case GAME_STATE_ROUNDOVER:
case GAME_STATE_NEXTROUND:
ProcessMyDecide(m_nGameState,wParam,dwParam);
break;
case GAME_STATE_CHAT:
DispatchChatMsg(wParam);
m_nGameState=m_nPreGameState;
break;
case GAME_STATE_MAINMENU://主菜单界面
switch (wParam){//菜单选项
case IDC_MENUCHAT:
m_nGameState = GAME_STATE_CHAT;//聊天
ProcessChat();
break;
case IDC_MENUCHANGE:
m_nGameState = GAME_STATE_CHANGE;//交换
showMsg(m_nGameState,2,2,MESSAGE_WARNING_COLOR,0,MESSAGE_YES|MESSAGE_NO|MESSAGE_TEXT_CENTER);
break;
case IDC_MENUGIVEUP://放弃
m_nGameState = GAME_STATE_GIVEUP;
showMsg(GAME_STATE_GIVEUP,0,0,MESSAGE_WARNING_COLOR,10000,MESSAGE_YES|MESSAGE_NO|MESSAGE_TEXT_CENTER);
break;
case IDC_MENUREGRET:
m_nGameState = GAME_STATE_REGRET;//悔棋
showMsg(m_nGameState,2,2,MESSAGE_WARNING_COLOR,0,MESSAGE_YES|MESSAGE_NO|MESSAGE_TEXT_CENTER);
break;
case IDC_MENUCOMPROMISE:
m_nGameState = GAME_STATE_COMPROMISE;//求和
showMsg(m_nGameState,2,2,MESSAGE_WARNING_COLOR,0,MESSAGE_YES|MESSAGE_NO|MESSAGE_TEXT_CENTER);
break;
case IDC_MAINMENU:
m_nGameState = GAME_STATE_MENU;//菜单
((CBrewGameCanvas*)m_pIGameCanvas)->BuildMenu();
break;
default:
break;
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -