📄 servermanage.cpp
字号:
if(GameEnd.iTurePoint[i]<0)
GameEnd.iTurePoint[i]=__max(-m_dwMaxPoint,GameEnd.iTurePoint[i]);
if (GameEnd.iTurePoint[i]>=100)
{
GameEnd.iTurePoint[i]=GameEnd.iTurePoint[i]*49L/50L;
}
}
}
//写入数据库
for (int i=0;i<3;i++)
ChangeUserPoint(m_pUserInfo[i],GameEnd.iTurePoint[i],GameEnd.iTurePoint[i]>0,GameEnd.iTurePoint[i]<0,GameEnd.iTurePoint[i]==0,false);
//发送数据
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&GameEnd,sizeof(GameEnd),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0);
SendWatchData(m_bMaxPeople,&GameEnd,sizeof(GameEnd),MDM_GM_GAME_NOTIFY,ASS_CONTINUE_END,0);
//if(m_bQueryQuit)
//{
// GameFinish(bDeskStation,GF_SALE);
//}
ReSetGameState(bCloseFlag);
}
return true;
}
case GF_SALE: //游戏安全结束
case GFF_FORCE_FINISH: //用户断线离开
{
int iBasePoint=m_pDataManage->m_InitData.uBasePoint;//倍数
//计算得分
int iTurePoint=GetUpGrade(m_iGamePoint,m_iPlayCardCount);
//设置数据
m_bGameStation=GS_WAIT_SETGAME;
for (int i=0;i<m_bMaxPeople;i++)
{
if (m_pUserInfo[i]!=NULL)
m_pUserInfo[i]->m_UserData.bUserState=USER_SITTING;
}
GameCutStruct CutEnd;
CutEnd.bDeskStation=bDeskStation;
if(bCloseFlag==GF_SALE)
{
CutEnd.iTurePoint[bDeskStation]=0;
CutEnd.iTurePoint[(bDeskStation+1)%4]=0;
CutEnd.iTurePoint[(bDeskStation+2)%4]=0;
CutEnd.iTurePoint[(bDeskStation+3)%4]=0;
}
else
{
//设置分数
CutEnd.iTurePoint[bDeskStation]=-15;
CutEnd.iTurePoint[(bDeskStation+1)%4]=0;
CutEnd.iTurePoint[(bDeskStation+2)%4]=0;
CutEnd.iTurePoint[(bDeskStation+3)%4]=0;
}
//发送信息
if (bCloseFlag==GF_SALE)
{
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_SALE_END,0);
SendWatchData(m_bMaxPeople,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_SALE_END,0);
}
else
{
//计算金币类和比赛类的实得分
if (m_pDataManage->m_InitData.uComType!=TY_NORMAL_GAME)
{
CutEnd.iTurePoint[0]*=iBasePoint;
CutEnd.iTurePoint[1]*=iBasePoint;
CutEnd.iTurePoint[2]*=iBasePoint;
CutEnd.iTurePoint[3]*=iBasePoint;
for (BYTE i=0;i<m_bMaxPeople;i++)
{
if(CutEnd.iTurePoint[i]>0)
CutEnd.iTurePoint[i]=__min(m_dwMaxPoint,CutEnd.iTurePoint[i]);
if(CutEnd.iTurePoint[i]<0)
CutEnd.iTurePoint[i]=__max(-m_dwMaxPoint,CutEnd.iTurePoint[i]);
if (CutEnd.iTurePoint[i]>=100)
{
CutEnd.iTurePoint[i]=CutEnd.iTurePoint[i]*49L/50L;
}
}
}
for (int i=0;i<4;i++)
ChangeUserPoint(m_pUserInfo[i],CutEnd.iTurePoint[i],CutEnd.iTurePoint[i]>0,CutEnd.iTurePoint[i]<0,CutEnd.iTurePoint[i]==0,(bDeskStation==i && CutEnd.iTurePoint[i]<0));
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_CUT_END,0);
SendWatchData(m_bMaxPeople,&CutEnd,sizeof(CutEnd),MDM_GM_GAME_NOTIFY,ASS_CUT_END,0);
}
bCloseFlag=GFF_FORCE_FINISH;
ReSetGameState(bCloseFlag);
__super::GameFinish(bDeskStation,bCloseFlag);
return true;
}
}
//重置数据
ReSetGameState(bCloseFlag);
__super::GameFinish(bDeskStation,bCloseFlag);
return true;
}
//用户离开游戏桌
BYTE CServerGameDesk::UserLeftDesk(BYTE bDeskStation, CGameUserInfo * pUserInfo)
{
if ((m_pUserInfo[bDeskStation]!=NULL)&&(m_bGameStation==GS_WAIT_ARGEE)&&(bDeskStation==0))
{
//更改数据
m_bGameStation=GS_WAIT_SETGAME;
for (int i=0;i<m_bMaxPeople;i++)
{
if (m_pUserInfo[i]!=NULL) m_pUserInfo[i]->m_UserData.bUserState=USER_SITTING;
}
}
else if(m_bGameStation==GS_WAIT_SETGAME && (m_pUserInfo[bDeskStation]!=NULL) && m_iBeenPlayCount>0)
{
GameFinish(0,GF_SALE);
}
return __super::UserLeftDesk(bDeskStation,pUserInfo);
}
//游戏数据包处理函数
bool CServerGameDesk::HandleNotifyMessage(BYTE bDeskStation, NetMessageHead * pNetHead, void * pData, UINT uSize, UINT uSocketID, bool bWatchUser)
{
switch (pNetHead->bAssistantID)
{
case ASS_GM_AGREE_GAME: //用户同意游戏
{
if (bWatchUser) return FALSE;
if ((bDeskStation==0)&&(m_bGameStation==GS_WAIT_SETGAME)) //东家设置
{
if (uSize!=sizeof(UserArgeeGame)) return FALSE;
UserArgeeGame * pGameSet=(UserArgeeGame *)pData;
if (!UserSetGame(pGameSet)) return FALSE;
__super::HandleNotifyMessage(bDeskStation,pNetHead,pData,uSize,uSocketID,bWatchUser);
return TRUE;
}
//其他玩家
if ((m_bGameStation!=GS_WAIT_ARGEE)&&(m_bGameStation!=GS_WAIT_NEXT))
return TRUE;
return __super::HandleNotifyMessage(bDeskStation,pNetHead,pData,uSize,uSocketID,bWatchUser);
}
case ASS_OUT_CARD: //用户出牌
{
if(bWatchUser)
return false;
if(m_bGameStation==GS_WAIT_NEXT || m_bGameStation==GS_WAIT_ARGEE || m_bGameStation==GS_WAIT_SETGAME)
return true;
OutCardStruct * pOutCard=(OutCardStruct *)pData;
if ((uSize<=(sizeof(OutCardStruct)-sizeof(pOutCard->iCardList)))
||(uSize>sizeof(OutCardStruct))||bWatchUser) return FALSE;
if (uSize!=(sizeof(OutCardStruct)-sizeof(pOutCard->iCardList)+sizeof(BYTE)*pOutCard->iCardCount)) return FALSE;
return (UserOutCard(bDeskStation,pOutCard->iCardList,pOutCard->iCardCount)==1);
}
//case ASS_HAVE_THING: //有事请求离开
// {
// if(bWatchUser)
// return false;
// HaveThingStruct * pThing=(HaveThingStruct *)pData;
// return (UserHaveThing(bDeskStation,pThing->szMessage)==1);
// }
//case ASS_LEFT_RESULT: //同意用户离开
// {
// if(bWatchUser)
// return false;
// LeaveResultStruct * pLeave=(LeaveResultStruct *)pData;
// return (ArgeeUserLeft(bDeskStation,pLeave->bArgeeLeave)==1);
// }
//case ASS_STOP_THING:
// {
// if(bWatchUser)
// return false;
// SendGameData((bDeskStation+2)%4,MDM_GM_GAME_NOTIFY,ASS_STOP_THING,0);
// return true;
// }
//case ASS_AGREE_STOP:
// {
// if(bWatchUser)
// return false;
// StopResultStruct * pStop=(StopResultStruct *)pData;
// if(pStop->bArgee==1)
// {
// //同意
// StopResultStruct stop;
// stop.bArgee=true;
// SendGameData((bDeskStation+2)%4,&stop,sizeof(stop),MDM_GM_GAME_NOTIFY,ASS_AGREE_STOP,0);
// MessageStruct Mess;
// memset(&Mess,0,sizeof(Mess));
// strcpy(Mess.Message,"敌家经过商量,提前结束了本局!");
// SendGameData((bDeskStation+1)%4,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0);
// SendGameData((bDeskStation+3)%4,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0);
// memset(&Mess,0,sizeof(Mess));
// strcpy(Mess.Message,"拣分的双方经过商量,提前结束了本局!");
// SendWatchData(m_bMaxPeople,&Mess,sizeof(Mess),MDM_GM_GAME_NOTIFY,ASS_MESSAGE,0);
// //结束游戏
// if (m_bGameStation==GS_PLAY_GAME)
// GameFinish(0,GF_NORMAL);
// }
// else
// {
// StopResultStruct stop;
// stop.bArgee=false;
// SendGameData((bDeskStation+2)%4,&stop,sizeof(stop),MDM_GM_GAME_NOTIFY,ASS_AGREE_STOP,0);
// }
// return true;
// }
case ASS_PASS://不出
{
if (bWatchUser) return false;
if(m_bGameStation==GS_WAIT_NEXT || m_bGameStation==GS_WAIT_ARGEE || m_bGameStation==GS_WAIT_SETGAME)
return true;
NewPlayTurn(bDeskStation);
if (!IsNewTurn)
{
for (int i=0;i<m_bMaxPeople;i++)
SendGameData(i,MDM_GM_GAME_NOTIFY,ASS_PASS,m_iOutCardPeople);
SendWatchData(m_bMaxPeople,MDM_GM_GAME_NOTIFY,ASS_PASS,m_iOutCardPeople);
}
return true;
}
}
return __super::HandleNotifyMessage(bDeskStation,pNetHead,pData,uSize,uSocketID,bWatchUser);
}
//计算得分
int CServerGameDesk::GetUpGrade(int iGamePoint, int iPlayCardCount)
{
m_iTurePoint[m_iWinStation] = 12;
m_iTurePoint[(m_iWinStation+1)%4] = -4;
m_iTurePoint[(m_iWinStation+2)%4] = -4;
m_iTurePoint[(m_iWinStation+3)%4] = -4;
return 0;
}
//用户设置游戏
BOOL CServerGameDesk::UserSetGame(UserArgeeGame * pGameSet)
{
//效验数据
if (m_bGameStation!=GS_WAIT_SETGAME) return FALSE;
//效验数据
if (((pGameSet->iPlayCount<=0)||(pGameSet->iPlayCount>99)))
return FALSE;
if ((m_CardCount & pGameSet->iCardCount)==0) return FALSE;
//设置数据
m_iLessCount=pGameSet->iPlayCount;
m_iPlayCardCount=(pGameSet->iCardCount&1)?2:3;
//m_iBeginStation=pGameSet->iBeginStation;
//m_iEndStation=pGameSet->iEndStation;
m_iBeenPlayCount=0;
m_bGameStation=GS_WAIT_ARGEE;
//m_Logic.SetNTCardNum(pGameSet->iBeginStation);
//m_Logic.SetNTHuaKind(UG_ERROR_HUA);
//m_iPlayNTNum[0]=pGameSet->iBeginStation;
//m_iPlayNTNum[1]=pGameSet->iBeginStation;
//发送消息
UserArgeeGame Agree;
//Agree.iBeginStation=m_iBeginStation;
//Agree.iEndStation=m_iEndStation;
Agree.iPlayCount=m_iLessCount;
Agree.iCardCount=m_iPlayCardCount;
for (int i=0;i<4;i++) SendGameData(i,&Agree,sizeof(Agree),MDM_GM_GAME_NOTIFY,ASS_UG_USER_SET,0);
SendWatchData(m_bMaxPeople,&Agree,sizeof(Agree),MDM_GM_GAME_NOTIFY,ASS_UG_USER_SET,0);
return TRUE;
}
//用户反牌
//bool CServerGameDesk::UserNtCard(BYTE bDeskStation, int iHuaKind, int iCardCount)
//{
//
// return FALSE;
//}
//
////发送底牌
//BOOL CServerGameDesk::SendBackCard()
//{
//
// return TRUE;
//}
//用户上交底牌
//bool CServerGameDesk::UserGiveBackCard(BYTE bDeskStation, BYTE iBackCard[], int iCardCount)
//{
//
// return TRUE;
//}
//用户出牌
bool CServerGameDesk::UserOutCard(BYTE bDeskStation, BYTE iOutCard[], int iCardCount)
{
if (bDeskStation!=m_iOutCardPeople) return FALSE;
BOOL bShowFalse=FALSE;
//记录数据
//删除扑克
if (m_Logic.RemoveCard(iOutCard,iCardCount,m_iUserCard[bDeskStation],m_iUserCardCount[bDeskStation])==0)
return FALSE;
m_iUserCardCount[bDeskStation]-=iCardCount;//用户手上扑克数目
//记录出牌信息
m_iDeskCardCount[bDeskStation]=iCardCount;
::CopyMemory(m_iDeskCard[bDeskStation],iOutCard,sizeof(BYTE)*iCardCount);
////记下当前出牌用户
m_iLastOutPeople = bDeskStation;
m_iCurScores += m_Logic.FindPoint(iOutCard,iCardCount);
//计算下一出牌者
///m_iOutCardPeople=(bDeskStation+1)%3;
//测试
//if (m_iOutCardPeople==m_iFirstOutPeople) m_iOutCardPeople=-1;
///if (bShowFalse==TRUE) return TRUE;
if (m_iUserCardCount[bDeskStation] == 0)
{
m_iUserCardCount[bDeskStation] = 0;
m_iCurMiCi++;
m_iMiCiArr[bDeskStation] = m_iCurMiCi;
m_iWinStation = bDeskStation;
GameFinish(0,GF_NORMAL);
return TRUE;
}
NewPlayTurn(bDeskStation);
OutCardMsg UserOut;
UserOut.bDeskStation=bDeskStation;//当前出牌者
UserOut.iLessCardCount=m_iUserCardCount[bDeskStation];
UserOut.iNextDeskStation=m_iOutCardPeople;
UserOut.iCardCount=iCardCount;
::CopyMemory(UserOut.iCardList,iOutCard,sizeof(BYTE)*iCardCount);
int iSendSize=sizeof(UserOut)-sizeof(UserOut.iCardList)+sizeof(BYTE)*iCardCount;
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&UserOut,iSendSize,MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,0);
SendWatchData(m_bMaxPeople,&UserOut,iSendSize,MDM_GM_GAME_NOTIFY,ASS_OUT_CARD,0);
return TRUE;
}
//新一轮开始
BOOL CServerGameDesk::NewPlayTurn(BYTE bDeskStation)
{
//AfxMessageBox("新一轮开始");
int iWiner;
int lastOutPeople = m_iLastOutPeople;
IsNewTurn = false;
m_iOutCardPeople = bDeskStation;
for (int i = 0;i < 3;i++)
{
//计算下一出牌者
m_iOutCardPeople = (m_iOutCardPeople + 1) % 4;
if (m_iMiCiArr[m_iOutCardPeople] < 0)break;
}
if (m_iLastOutPeople ==m_iOutCardPeople)
{
if (lastOutPeople >= 0)
{
m_iCurScoresArr[lastOutPeople] += m_iCurScores;
m_iBaseOutCount=0;
//m_iOutCardPeople=m_iOutCardPeople;
m_iFirstOutPeople=m_iOutCardPeople;
iWiner = m_iOutCardPeople;
::memset(m_iDeskCardCount,0,sizeof(m_iDeskCardCount));
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,MDM_GM_GAME_NOTIFY,ASS_NEW_TURN,iWiner);
SendWatchData(m_bMaxPeople,MDM_GM_GAME_NOTIFY,ASS_NEW_TURN,iWiner);
IsNewTurn = true;
if (m_iCurScores != 0)
{
m_iGamePoint+=m_iCurScores;
GamePointStruct GamePoint;
GamePoint.iPoint=m_iCurScores;
GamePoint.bAdd=true;
for (int i=0;i<m_bMaxPeople;i++) SendGameData(i,&GamePoint,sizeof(GamePoint),MDM_GM_GAME_NOTIFY,ASS_GAME_POINT,iWiner);
SendWatchData(m_bMaxPeople,&GamePoint,sizeof(GamePoint),MDM_GM_GAME_NOTIFY,ASS_GAME_POINT,0);
}
m_iCurScores = 0;
}
}
return TRUE;
}
//void CServerGameDesk::ModifyPlayInfo(BYTE bDeskStation, int iCardCount)
//{
// if (bDeskStation >= 0) m_iPlayRemainCardCnt[bDeskStation] -= iCardCount;
//
// tagPlayInfoStruct playInfo;
// for (int i=0;i<4;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -