Files
wnmj/Servers/服务器组件/私人场服务/PrivateTableInfo.cpp
2026-02-13 14:34:15 +08:00

256 lines
6.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "StdAfx.h"
#include "PrivateTableInfo.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//构造函数
PrivateTableInfo::PrivateTableInfo()
:pITableFrame(NULL)
{
restValue();
}
PrivateTableInfo::~PrivateTableInfo(void)
{
//关闭定时器
}
void PrivateTableInfo::restAgainValue()
{
bStart = false;
bInEnd = false;
kDismissChairID.clear();
kNotAgreeChairID.clear();
fDismissPastTime = 0;
dwFinishPlayCout = 0;
dwStartPlayCout = 0;
fAgainPastTime = 0.0f;
ZeroMemory(bAutoStart, sizeof(bAutoStart));
ZeroMemory(lPlayerWinLose,sizeof(lPlayerWinLose));
ZeroMemory(lScoreInfoArray, sizeof(lScoreInfoArray));
kTotalRecord = tagPrivateRandTotalRecord();
if (pITableFrame)
{
kTotalRecord.kScore.resize(pITableFrame->GetChairCount());
kTotalRecord.kUserID.resize(pITableFrame->GetChairCount());
kTotalRecord.kNickName.resize(pITableFrame->GetChairCount());
kTotalRecord.kHeadHttp.resize(pITableFrame->GetChairCount());
kTotalRecord.dwKindID = pITableFrame->GetGameServiceAttrib()->wKindID;
kTotalRecord.dwVersion = pITableFrame->GetGameServiceAttrib()->dwClientVersion;
for (int i = 0;i<(int)getChairCout();i++)
{
kTotalRecord.kScore[i] = 0;
}
pITableFrame->ResetPrivateEndInfo();
}
}
void PrivateTableInfo::restValue()
{
bStart = false;
bInEnd = false;
bPlayCoutIdex = 0;
bGameTypeIdex = 0;
dwGameRuleIdex = 0;
cbRoomType = Type_Private;
dwPlayCout = 0;
dwRoomNum = 0;
//cbCurJiang = 0;
dwCreaterUserID = 0;
fDismissPastTime = 0;
fCreateTime = 0;
dwFinishPlayCout = 0;
dwStartPlayCout = 0;
dwPlayCost = 0;
fAgainPastTime = 0.0f;
kHttpChannel = "";
dwUnionCode = 0; // 工会ID
dwUnionConsumerID = 0; // 消耗记录ID
cbUnionGoldOpen = 0;
m_dwDaikaiIndex = 0;
//m_isDismiss = true;
fGameStartTime = 0.0f;
lCreateScore = 0;
ZeroMemory(fOfflineTimes, sizeof(fOfflineTimes));
ZeroMemory(bAutoStart, sizeof(bAutoStart));
ZeroMemory(lScoreInfoArray, sizeof(lScoreInfoArray));
mReadyInfo.reset();
restAgainValue();
}
void PrivateTableInfo::newRandChild()
{
tagPrivateRandRecordChild kRecordChild;
kRecordChild.dwKindID = pITableFrame->GetGameServiceAttrib()->wKindID;
kRecordChild.dwVersion = pITableFrame->GetGameServiceAttrib()->dwClientVersion;
kRecordChild.kScore.resize(getChairCout());
for (int i = 0;i<(int)getChairCout();i++)
{
IServerUserItem * pServerItem = pITableFrame->GetTableUserItem(i);
if ( NULL != pServerItem )
{
kTotalRecord.kNickName[i] = pServerItem->GetNickName();
kTotalRecord.kUserID[i] = pServerItem->GetUserID();
kRecordChild.kScore[i] = 0;
kTotalRecord.kHeadHttp[i] = pServerItem->GetUserInfo()->szHeadHttp;
}
}
GetLocalTime(&kRecordChild.kPlayTime);
kTotalRecord.kRecordChild.push_back(kRecordChild);
}
WORD PrivateTableInfo::getChairCout()
{
return pITableFrame->GetChairCount();
}
void PrivateTableInfo::setRoomNum(DWORD RoomNum)
{
kTotalRecord.iRoomNum = (int)RoomNum;
dwRoomNum = RoomNum;
}
void PrivateTableInfo::writeSocre(tagScoreInfo ScoreInfoArray[], WORD wScoreCount,DataStream& daUserDefine)
{
if (kTotalRecord.kRecordChild.size() == 0)
{
ASSERT(false);
return;
}
tagPrivateRandRecordChild& kRecord = kTotalRecord.kRecordChild.back();
if (kRecord.kScore.size() < wScoreCount)
{
ASSERT(false);
return;
}
for(WORD i = 0;i < wScoreCount;i++)
{
kRecord.kScore[i] += (int)ScoreInfoArray[i].lScore;
kTotalRecord.kScore[i] += (int)ScoreInfoArray[i].lScore;
lPlayerWinLose[i] += ScoreInfoArray[i].lScore;
}
GetLocalTime(&kRecord.kPlayTime);
kRecord.kRecordGame = daUserDefine;
kTotalRecord.cbGameCount++; // 统计游戏局数;
}
bool PrivateTableInfo::IsCardAARule()
{
return ((dwGameRuleIdex & ePrivateTableCommonRule_CardAA) == ePrivateTableCommonRule_CardAA);
}
bool PrivateTableInfo::IsAutoUserCountRule()
{
return ((dwGameRuleIdex & ePrivateTableCommonRule_auto) == ePrivateTableCommonRule_auto);
}
bool PrivateTableInfo::IsAllAutoUserOK()
{
WORD wChairCount = pITableFrame->GetChairCount();
//准备人数
WORD wReadyUserCount = 0;
//设置用户
for (WORD i = 0; i < wChairCount; i++)
{
//获取用户
IServerUserItem * pIServerUserItem = pITableFrame->GetTableUserItem(i);
//设置用户
if (pIServerUserItem != NULL)
{
if (!bAutoStart[i]) return false;
//用户计数
wReadyUserCount++;
}
}
if (wReadyUserCount >= 2L) return true;
return false;
}
bool PrivateTableInfo::IsEveryTimeRoomScoreType()
{
return ((cbEnterRoomScoreType & ePrivateRoomScoreType_EveryTime) == ePrivateRoomScoreType_EveryTime);
}
bool PrivateTableInfo::IsSetOneTimeRoomScoreType()
{
return ((cbEnterRoomScoreType & ePrivateRoomScoreType_SetOneTime) == ePrivateRoomScoreType_SetOneTime);
}
bool PrivateTableInfo::IsCanJoinTable(IServerUserItem * pIServerUserItem, CString& refStrMsg)
{
if ( (dwGameRuleIdex & ePrivateTableCommonRule_NOSameIPAddr) == ePrivateTableCommonRule_NOSameIPAddr )
{
DWORD dwJoinClientAddr = pIServerUserItem->GetClientAddr();
WORD nChairCount = getChairCout();
for (WORD i = 0; i < nChairCount; i++)
{
IServerUserItem * pServerItem = pITableFrame->GetTableUserItem(i);
if (pServerItem == NULL) continue;
if (dwJoinClientAddr == pServerItem->GetClientAddr())
{
refStrMsg = TEXT("该房间存在与你IP相同的玩家无法加入房间。");
return false;
}
}
}
return true;
}
BYTE PrivateTableInfo::GetStartMode()
{
if (NULL == pITableFrame)
{ //走到这个地方肯定是出错了;
return START_MODE_FULL_READY;
}
return pITableFrame->GetStartMode();
}
// 游戏开始不满2分钟不可以解散;
bool PrivateTableInfo::IsDismissRoom()
{
if (IsOffLineUser())
{
return (fGameStartTime > 120.f);
}
return false;
}
bool PrivateTableInfo::IsOffLineUser()
{
WORD nChairCount = getChairCout();
for (WORD i = 0; i < nChairCount; i++)
{
IServerUserItem * pServerItem = pITableFrame->GetTableUserItem(i);
if (pServerItem == NULL) continue;
if (pServerItem->GetUserStatus() == US_OFFLINE)
{
return true;
}
}
return false;
}