|
- #include "StdAfx.h"
- #include "AndroidUserItem.h"
- #include "../../MessageDef/Pb_GameInfo.pb.h"
- #include "../../GlobalDef/Util.h"
- //////////////////////////////////////////////////////////////////////////////////
-
- //静态变量
- CTimerItemArray CAndroidUserItem::m_TimerItemBuffer; //库存数组
-
- //////////////////////////////////////////////////////////////////////////////////
-
- //构造函数
- CAndroidUserItem::CAndroidUserItem()
- {
- //索引变量
- m_wRoundID = 1;
- m_wAndroidIndex = INVALID_WORD;
-
- //接口变量
- m_pIServerUserManager = NULL;
- m_pIAndroidUserManager = NULL;
- m_pIAndroidUserItemSink = NULL;
-
- //状态变量
- m_bWaitLeave = false;
- m_bStartClient = false;
- m_wAndroidAction = 0;
- m_dwPlayInnings = 0;
- m_cbGameStatus = GAME_STATUS_FREE;
-
- //用户状态
- m_CurrentUserStatus.cbUserStatus = US_NULL;
- m_CurrentUserStatus.wChairID = INVALID_CHAIR;
- m_CurrentUserStatus.wTableID = INVALID_TABLE;
-
- //绑定变量
- m_pIServerUserItem = NULL;
-
- //时间变量
- m_dwMinSitInterval = 0;
- m_dwMaxSitInterval = 0;
- m_dwStandupTickCount = 0;
- m_dwReposeTickCount = 0;
-
- //状态信息
- ZeroMemory(&m_AndroidService, sizeof(m_AndroidService));
- ZeroMemory(&m_AndroidItemConfig, sizeof(m_AndroidItemConfig));
-
- return;
- }
-
- //析构函数
- CAndroidUserItem::~CAndroidUserItem()
- {
- //删除时间
- KillGameTimer(0);
-
- //释放对象
- SafeRelease(m_pIAndroidUserItemSink);
-
- return;
- }
-
- //接口查询
- VOID * CAndroidUserItem::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
- {
- QUERYINTERFACE(IAndroidUserItem, Guid, dwQueryVer);
- QUERYINTERFACE_IUNKNOWNEX(IAndroidUserItem, Guid, dwQueryVer);
- return NULL;
- }
-
- //获取 I D
- DWORD CAndroidUserItem::GetUserID()
- {
- return m_AndroidItemConfig.AndroidAccountsInfo.dwUserID;
- }
-
- //桌子号码
- WORD CAndroidUserItem::GetTableID()
- {
- //效验状态
- ASSERT(m_pIServerUserItem != NULL);
- if (m_pIServerUserItem == NULL) return INVALID_TABLE;
-
- return m_pIServerUserItem->GetTableID();
- }
-
- //椅子号码
- WORD CAndroidUserItem::GetChairID()
- {
- //效验状态
- ASSERT(m_pIServerUserItem != NULL);
- if (m_pIServerUserItem == NULL) return INVALID_CHAIR;
-
- return m_pIServerUserItem->GetChairID();
- }
-
-
- //获取自己
- IServerUserItem * CAndroidUserItem::GetMeUserItem()
- {
- return m_pIServerUserItem;
- }
-
- //游戏用户
- IServerUserItem * CAndroidUserItem::GetTableUserItem(WORD wChariID)
- {
- return NULL;
- }
-
- //发送函数
- bool CAndroidUserItem::SendSocketData(WORD wSubCmdID)
- {
- //状态效验
- ASSERT(m_pIServerUserItem != NULL);
- if (m_pIServerUserItem == NULL) return false;
-
- //发送数据
- DWORD dwAndroidID = MAKELONG(m_wAndroidIndex, m_wRoundID);
- m_pIAndroidUserManager->SendDataToServer(dwAndroidID, MDM_GF_GAME, wSubCmdID, NULL, 0);
-
- return true;
- }
-
- //存入游戏币
- bool CAndroidUserItem::PerformSaveScore(SCORE lScore)
- {
- //状态效验
- ASSERT(m_pIServerUserItem != NULL);
- if (m_pIServerUserItem == NULL) return false;
-
- //效验游戏币
- ASSERT(m_pIServerUserItem->GetUserScore() >= lScore);
- if (m_pIServerUserItem->GetUserScore() < lScore) return false;
-
- //修改游戏币
- m_pIServerUserItem->ModifyUserInsure(-lScore, 0L, 0L);
-
- return true;
- }
-
- //提取游戏币
- bool CAndroidUserItem::PerformTakeScore(SCORE lScore)
- {
- //状态效验
- ASSERT(m_pIServerUserItem != NULL);
- if (m_pIServerUserItem == NULL) return false;
-
- //修改游戏币
- m_pIServerUserItem->ModifyUserInsure(lScore, 0L, 0L);
-
- return true;
- }
-
- //发送函数
- bool CAndroidUserItem::SendSocketData(WORD wSubCmdID, VOID * pData, WORD wDataSize)
- {
- //状态效验
- ASSERT(m_pIServerUserItem != NULL);
- if (m_pIServerUserItem == NULL) return false;
-
- //发送数据
- DWORD dwAndroidID = MAKELONG(m_wAndroidIndex, m_wRoundID);
- m_pIAndroidUserManager->SendDataToServer(dwAndroidID, MDM_GF_GAME, wSubCmdID, pData, wDataSize);
-
- return true;
- }
-
- //机器动作
- bool CAndroidUserItem::JudgeAndroidActionAndRemove(WORD wAction)
- {
- //变量定义
- bool bResult = (m_wAndroidAction&wAction) != 0;
-
- //移除动作
- if (bResult == true)
- {
- m_wAndroidAction &= ~wAction;
-
- //离开标识
- if (wAction == ANDROID_WAITLEAVE) m_bWaitLeave = true;
- }
-
- return bResult;
- }
-
- //删除时间
- bool CAndroidUserItem::KillGameTimer(UINT nTimerID)
- {
- //删除时间
- if (nTimerID != 0)
- {
- //寻找子项
- for (INT_PTR i = 0; i < m_TimerItemActive.GetCount(); i++)
- {
- //获取时间
- tagTimerItem * pTimerItem = m_TimerItemActive[i];
-
- //删除判断
- if (pTimerItem->nTimerID == nTimerID)
- {
- m_TimerItemActive.RemoveAt(i);
- m_TimerItemBuffer.Add(pTimerItem);
-
- return true;
- }
- }
- }
- else
- {
- m_TimerItemBuffer.Append(m_TimerItemActive);
- m_TimerItemActive.RemoveAll();
- }
-
- return false;
- }
-
- //设置时间
- bool CAndroidUserItem::SetGameTimer(UINT nTimerID, UINT nElapse)
- {
- //寻找子项
- for (INT_PTR i = 0; i < m_TimerItemActive.GetCount(); i++)
- {
- //获取时间
- tagTimerItem * pTimerItem = m_TimerItemActive[i];
-
- //设置判断
- if (pTimerItem->nTimerID == nTimerID)
- {
- pTimerItem->nTimeLeave = nElapse;
- return true;
- }
- }
-
- //变量定义
- tagTimerItem * pTimerItem = NULL;
- WORD wStorageCount = (WORD)m_TimerItemBuffer.GetCount();
-
- //库存子项
- if (wStorageCount > 0)
- {
- //获取对象
- pTimerItem = m_TimerItemBuffer[wStorageCount - 1];
-
- //加入数组
- m_TimerItemActive.Add(pTimerItem);
- m_TimerItemBuffer.RemoveAt(wStorageCount - 1);
- }
-
- //创建子项
- if (pTimerItem == NULL)
- {
- try
- {
- //创建对象
- pTimerItem = new tagTimerItem;
- if (pTimerItem == NULL) return false;
-
- //加入数组
- m_TimerItemActive.Add(pTimerItem);
- }
- catch (...)
- {
- ASSERT(FALSE);
- return false;
- }
- }
-
- //设置变量
- pTimerItem->nTimerID = nTimerID;
- pTimerItem->nTimeLeave = nElapse;
-
- return true;
- }
-
- //发送准备
- bool CAndroidUserItem::SendUserReady(VOID * pData, WORD wDataSize)
- {
- //状态效验
- // ASSERT((m_pIServerUserItem!=NULL)&&(m_pIServerUserItem->GetUserStatus()==US_SIT));
- if ((m_pIServerUserItem == NULL) || (m_pIServerUserItem->GetUserStatus() != US_SIT)) return false;
-
- //发送准备
- DWORD dwAndroidID = MAKELONG(m_wAndroidIndex, m_wRoundID);
- m_pIAndroidUserManager->SendDataToServer(dwAndroidID, MDM_GF_FRAME, SUB_GF_USER_READY, pData, wDataSize);
-
- return true;
- }
-
- //发送聊天
- bool CAndroidUserItem::SendChatMessage(DWORD dwTargetUserID, LPCTSTR pszChatString, COLORREF crColor)
- {
- //效验用户
- ASSERT(m_pIServerUserItem != NULL);
- if (m_pIServerUserItem == NULL) return false;
-
- //构造信息
- CMD_GF_C_UserChat UserChat;
- lstrcpyn(UserChat.szChatString, pszChatString, CountArray(UserChat.szChatString));
-
- //构造数据
- UserChat.dwChatColor = crColor;
- UserChat.dwTargetUserID = dwTargetUserID;
- UserChat.wChatLength = CountStringBuffer(UserChat.szChatString);
-
- //发送命令
- DWORD dwAndroidID = MAKELONG(m_wAndroidIndex, m_wRoundID);
- WORD wSendSize = sizeof(UserChat)-sizeof(UserChat.szChatString) + UserChat.wChatLength*sizeof(TCHAR);
-
- GameInfo::PB_CS_UserChat Chat;
- Chat.set_dwchatcolor(UserChat.dwChatColor);
- Chat.set_wchatlength(UserChat.wChatLength);
- Chat.set_dwtargetuserid(UserChat.dwTargetUserID);
- std::string szChatString = CW2AEX<1024>(UserChat.szChatString, CP_UTF8).m_psz;
- Chat.set_szchatstring(szChatString);
- //发送数据
- std::string pbdata = Chat.SerializePartialAsString();
- //发送消息
- m_pIAndroidUserManager->SendDataToServer(dwAndroidID, MDM_GF_FRAME, SUB_GF_USER_CHAT, (void*)pbdata.c_str(), pbdata.length());
-
- return true;
- }
-
- //时间事件
- bool CAndroidUserItem::OnTimerPulse(DWORD dwTimerID, WPARAM dwBindParameter)
- {
- //寻找子项
- for (INT_PTR i = 0; i < m_TimerItemActive.GetCount();)
- {
- //变量定义
- tagTimerItem * pTimerItem = m_TimerItemActive[i];
-
- //时间处理
- if (pTimerItem->nTimeLeave <= 1L)
- {
- //设置数组
- m_TimerItemActive.RemoveAt(i);
- m_TimerItemBuffer.Add(pTimerItem);
-
- //时间通知
- if (m_pIAndroidUserItemSink != NULL)
- {
- m_pIAndroidUserItemSink->OnEventTimer(pTimerItem->nTimerID);
- }
- }
- else
- {
- //设置变量
- i++;
- pTimerItem->nTimeLeave--;
- }
- }
-
-
- return true;
- }
-
- //网络消息
- bool CAndroidUserItem::OnSocketRead(WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
- {
- //登录失败
- if ((wMainCmdID == MDM_GR_LOGON) && (wSubCmdID == SUB_GR_LOGON_FAILURE))
- {
- return OnSocketSubLogonFailure(pData, wDataSize);
- }
-
- //登录完成
- if ((wMainCmdID == MDM_GR_LOGON) && (wSubCmdID == SUB_GR_LOGON_FINISH))
- {
- return OnSocketSubLogonFinish(pData, wDataSize);
- }
-
- //用户状态
- if ((wMainCmdID == MDM_GR_USER) && (wSubCmdID == SUB_GR_USER_STATUS))
- {
- return OnSocketSubUserStatus(pData, wDataSize);
- }
-
- //游戏消息
- if ((wMainCmdID == MDM_GF_GAME) || (wMainCmdID == MDM_GF_FRAME))
- {
- return OnSocketGameMessage(wMainCmdID, wSubCmdID, pData, wDataSize);
- }
-
- //系统消息
- if ((wMainCmdID == MDM_CM_SYSTEM) && (wSubCmdID == SUB_CM_SYSTEM_MESSAGE))
- {
- return OnSocketSubSystemMessage(pData, wDataSize);
- }
-
- return true;
- }
-
- //游戏消息
- bool CAndroidUserItem::OnSocketGameMessage(WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
- {
- //游戏处理
- if ((wMainCmdID == MDM_GF_GAME) && (m_pIAndroidUserItemSink != NULL))
- {
- return m_pIAndroidUserItemSink->OnEventGameMessage(wSubCmdID, pData, wDataSize);
- }
-
- //框架处理
- if (wMainCmdID == MDM_GF_FRAME)
- {
- //默认处理
- switch (wSubCmdID)
- {
- case SUB_GF_GAME_STATUS: //游戏状态
- {
- ////效验参数
- //GameInfo::PB_CS_GameStatus GameStatus;
- //GameStatus.ParseFromArray(pData, wDataSize);
- ////处理消息
- //CMD_GF_GameStatus pGameStatus;
- //ZeroMemory(&pGameStatus, sizeof(pGameStatus));
- //pGameStatus.cbGameStatus = GameStatus.cbgamestatus();
- //pGameStatus.cbAllowLookon = GameStatus.cballowlookon();
- //效验参数
- ASSERT(wDataSize == sizeof(CMD_GF_GameStatus));
- if (wDataSize != sizeof(CMD_GF_GameStatus)) return false;
-
- //消息处理
- CMD_GF_GameStatus* pGameStatus = (CMD_GF_GameStatus*)pData;
- //设置变量
- m_cbGameStatus = pGameStatus->cbGameStatus;
-
- return true;
- }
- case SUB_GF_GAME_SCENE: //游戏场景
- {
- //游戏处理
- if (m_pIAndroidUserItemSink != NULL)
- {
- bool bLookonUser = (m_pIServerUserItem->GetUserStatus() == US_LOOKON);
- return m_pIAndroidUserItemSink->OnEventSceneMessage(m_cbGameStatus, bLookonUser, pData, wDataSize);
- }
- else
- {
- //发送开始
- IServerUserItem * pIServerUserItem = GetMeUserItem();
- if (pIServerUserItem->GetUserStatus() != US_READY) SendUserReady(NULL, 0);
- }
-
- return true;
- }
- case SUB_GF_USER_READY: //用户准备
- {
- if (m_pIServerUserItem->GetUserStatus() >= US_READY)
- return true;
-
- //发送开始
- SendUserReady(NULL, 0);
- return true;
- }
- default:
- {
- if (m_pIAndroidUserItemSink != NULL)
- return m_pIAndroidUserItemSink->OnEventFrameMessage(wSubCmdID, pData, wDataSize);
- break;
- }
- }
- }
-
- return true;
- }
-
- //登录失败
- bool CAndroidUserItem::OnSocketSubLogonFailure(VOID * pData, WORD wDataSize)
- {
- return true;
- }
-
- //登录完成
- bool CAndroidUserItem::OnSocketSubLogonFinish(VOID * pData, WORD wDataSize)
- {
- //设置变量
- m_cbGameStatus = GAME_STATUS_FREE;
- m_pIServerUserItem = m_pIServerUserManager->SearchUserItem(m_AndroidItemConfig.AndroidAccountsInfo.dwUserID);
-
- //状态效验
- ASSERT(m_pIServerUserItem != NULL);
- if (m_pIServerUserItem == NULL) return false;
-
- //用户状态
- m_CurrentUserStatus.wChairID = m_pIServerUserItem->GetChairID();
- m_CurrentUserStatus.wTableID = m_pIServerUserItem->GetTableID();
- m_CurrentUserStatus.cbUserStatus = m_pIServerUserItem->GetUserStatus();
-
- //规则变量
- CMD_GR_UserRule UserRule;
- ZeroMemory(&UserRule, sizeof(UserRule));
-
- //发送规则
- DWORD dwAndroidID = MAKELONG(m_wAndroidIndex, m_wRoundID);
- m_pIAndroidUserManager->SendDataToServer(dwAndroidID, MDM_GR_USER, SUB_GR_USER_RULE, &UserRule, sizeof(UserRule));
-
- //设置时间
- m_dwStandupTickCount = (DWORD)time(NULL);
- m_dwReposeTickCount = m_dwMinSitInterval + rand() % (__max(m_dwMaxSitInterval - m_dwMinSitInterval, 1));
-
- //重入判断
- if (m_pIServerUserItem->GetTableID() != INVALID_TABLE)
- {
- StartGameClient();
- }
-
- return true;
- }
-
- //用户状态
- bool CAndroidUserItem::OnSocketSubUserStatus(VOID * pData, WORD wDataSize)
- {
- //效验参数
- ASSERT(wDataSize == sizeof(CMD_GR_UserStatus));
- if (wDataSize < sizeof(CMD_GR_UserStatus)) return false;
-
- //变量定义
- CMD_GR_UserStatus * pUserStatus = (CMD_GR_UserStatus *)pData;
-
- //玩家判断
- if (pUserStatus->dwUserID != m_AndroidItemConfig.AndroidAccountsInfo.dwUserID)
- {
- return true;
- }
-
- //用户状态
- tagUserStatus LastUserStatus;
- CopyMemory(&LastUserStatus, &m_CurrentUserStatus, sizeof(LastUserStatus));
- CopyMemory(&m_CurrentUserStatus, &pUserStatus->UserStatus, sizeof(m_CurrentUserStatus));
-
- //开始切换
- if ((LastUserStatus.cbUserStatus != US_READY) && (m_CurrentUserStatus.cbUserStatus == US_READY))
- {
- }
-
- //机器起立
- if (m_CurrentUserStatus.cbUserStatus == US_FREE)
- {
- //设置局数
- m_dwPlayInnings = 0;
- m_wAndroidAction = 0;
-
- //设置时间
- m_dwStandupTickCount = (DWORD)time(NULL);
- m_dwReposeTickCount = m_dwMinSitInterval + rand() % (__max(m_dwMaxSitInterval - m_dwMinSitInterval, 1));
- }
-
- //游戏开始
- if (m_CurrentUserStatus.cbUserStatus == US_PLAYING)
- {
- m_dwPlayInnings++;
- }
-
- //坐下状态
- if (m_CurrentUserStatus.cbUserStatus == US_SIT)
- {
- if (m_AndroidService.dwSwitchTableInnings > 0 &&
- m_AndroidService.dwSwitchTableInnings <= m_dwPlayInnings)
- {
- //设置动作
- m_dwPlayInnings = 0;
- m_wAndroidAction |= ANDROID_WAITSTANDUP;
- }
- }
-
- //关闭判断
- if ((m_bStartClient == true) && (m_CurrentUserStatus.wTableID == INVALID_TABLE))
- {
- //关闭游戏
- CloseGameClient();
-
- return true;
- }
-
- //启动判断
- if ((m_bStartClient == false) && (m_CurrentUserStatus.wTableID != INVALID_TABLE))
- {
- //启动游戏
- StartGameClient();
-
- return true;
- }
-
- return true;
- }
-
- //系统消息
- bool CAndroidUserItem::OnSocketSubSystemMessage(VOID * pData, WORD wDataSize)
- {
- //变量定义
- CMD_CM_SystemMessage * pSystemMessage = (CMD_CM_SystemMessage *)pData;
- WORD wHeadSize = sizeof(CMD_CM_SystemMessage)-sizeof(pSystemMessage->szString);
-
- //效验参数
- ASSERT((wDataSize > wHeadSize) && (wDataSize == (wHeadSize + pSystemMessage->wLength*sizeof(TCHAR))));
- if ((wDataSize <= wHeadSize) || (wDataSize != (wHeadSize + pSystemMessage->wLength*sizeof(TCHAR)))) return false;
-
- //关闭处理
- //if ((pSystemMessage->wType&(SMT_CLOSE_ROOM | SMT_CLOSE_LINK)) != 0)
- //{
- // //关闭处理
- // DWORD dwAndroidID = MAKELONG(m_wAndroidIndex, m_wRoundID);
- // m_pIAndroidUserManager->DeleteAndroidUserItem(dwAndroidID, true);
- // }
-
- return true;
- }
-
- //启动游戏
- VOID CAndroidUserItem::StartGameClient()
- {
- //状态判断
- ASSERT((m_bStartClient == false) && (m_pIServerUserItem != NULL));
- ASSERT((m_pIServerUserItem->GetTableID() != INVALID_TABLE) && (m_pIServerUserItem->GetChairID() != INVALID_CHAIR));
-
- //设置变量
- m_bStartClient = true;
-
- //变量定义
- CMD_GF_GameOption GameOption;
- ZeroMemory(&GameOption, sizeof(GameOption));
-
- //构造数据
- GameOption.cbAllowLookon = FALSE;
- GameOption.dwFrameVersion = INVALID_DWORD;
- GameOption.dwClientVersion = INVALID_DWORD;
-
- //发送数据
- DWORD dwAndroidID = MAKELONG(m_wAndroidIndex, m_wRoundID);
- m_pIAndroidUserManager->SendDataToServer(dwAndroidID, MDM_GF_FRAME, SUB_GF_GAME_OPTION, &GameOption, sizeof(GameOption));
-
- return;
- }
-
- //关闭游戏
- VOID CAndroidUserItem::CloseGameClient()
- {
- //状态判断
- ASSERT((m_bStartClient == true) && (m_pIServerUserItem != NULL));
- ASSERT((m_pIServerUserItem->GetTableID() == INVALID_TABLE) && (m_pIServerUserItem->GetChairID() == INVALID_CHAIR));
-
- //删除时间
- KillGameTimer(0);
-
- //设置变量
- m_bStartClient = false;
- m_cbGameStatus = GAME_STATUS_FREE;
-
- //游戏复位
- if (m_pIAndroidUserItemSink != NULL)
- {
- m_pIAndroidUserItemSink->RepositionSink();
- }
-
- return;
- }
-
- //复位数据
- VOID CAndroidUserItem::RepositUserItem()
- {
- //状态变量
- m_bWaitLeave = false;
- m_bStartClient = false;
- m_wAndroidAction = 0;
- m_dwPlayInnings = 0;
- m_cbGameStatus = GAME_STATUS_FREE;
-
- //用户状态
- m_CurrentUserStatus.cbUserStatus = US_NULL;
- m_CurrentUserStatus.wChairID = INVALID_CHAIR;
- m_CurrentUserStatus.wTableID = INVALID_TABLE;
-
- //绑定变量
- m_pIServerUserItem = NULL;
-
- //时间变量
- m_dwMinSitInterval = 0;
- m_dwMaxSitInterval = 0;
- m_dwStandupTickCount = 0;
- m_dwReposeTickCount = 0;
-
- //状态信息
- ZeroMemory(&m_AndroidService, sizeof(m_AndroidService));
- ZeroMemory(&m_AndroidItemConfig, sizeof(m_AndroidItemConfig));
-
- //删除时间
- m_TimerItemBuffer.Append(m_TimerItemActive);
- m_TimerItemActive.RemoveAll();
-
- //索引变量
- m_wRoundID = __max(1, m_wRoundID + 1);
-
- //复位游戏
- if (m_pIAndroidUserItemSink != NULL)
- {
- m_pIAndroidUserItemSink->RepositionSink();
- }
-
- return;
- }
-
- //////////////////////////////////////////////////////////////////////////////////
|