Files
wnmj/Classes/Games/13S/13S_GameScene.cpp
2026-02-13 14:34:15 +08:00

3638 lines
97 KiB
C++
Raw 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 "13S_GameScene.h"
#include "13S_GamePlayer.h"
#include "13S_GameLogic.h"
#include "UserInfo.h"
#include "MainScene.h"
#include "MissionWeiXin.h"
#include "DismissScene.h"
#include "13S_BigCardSprite.h"
#include "PopScene.h"
#include "ActionEx.h"
#include "JniFun.h"
#include "SetScene.h"
#include "ChatScene.h"
#include "PlayerScene.h"
#include "IpTipScene.h"
#include "SimpleAudioEngine.h"
using namespace SSS_SPACE;
bool SSSGameScene::init()
{
if (!GameFrameBase::init())
{
return false;
}
m_strGameRuleInfo = "";
m_bClassicRule = false;
_cbGameStatus = SSS_GS_WK_FREE;
_wBuildCardTime = 40;
_wRobBankerTime = 20;
_wUserChipTime = 20;
zeromemory(&m_PrivateRoomInfo, sizeof(CMD_GF_Private_Room_Info));
initNet();
initScene();
return true;
}
//进场动画完成回调;
void SSSGameScene::onEnterTransitionDidFinish()
{
GameFrameBase::onEnterTransitionDidFinish();
if (true == GAME_MUISCBG)
{
CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("Games/13S/Sound/background1.mp3", true);
}
// 暂时停了测试;
#if CC_PLATFORM_WIN32 == CC_TARGET_PLATFORM
CocosDenshion::SimpleAudioEngine* pAudio = CocosDenshion::SimpleAudioEngine::getInstance();
pAudio->stopBackgroundMusic(true);
#endif
// 录像模式;
if (m_IsGameRecord)
{
StartRecord(SSS_GAME_PLAYER);
// 隐藏功能按钮;
m_sprRepBg->setVisible(false);
}
else
{
// 增加游戏内事件处理;
auto dispatcher = Director::getInstance()->getEventDispatcher();
dispatcher->addCustomEventListener(SHOW_PRIVATE_END, CC_CALLBACK_1(SSSGameScene::onEventShowPrivate, this));
CGameServerItem* pGameServerItem = GameMission::g_pGameServerItem;
CC_ASSERT(pGameServerItem != nullptr);
if (pGameServerItem != nullptr)
{
m_kGameMission.SetServerItem(pGameServerItem);
m_kGameMission.start();
}
}
}
//场景退出;
void SSSGameScene::onExit()
{
GameFrameBase::onExit();
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
SafeDelete(m_aryPlayer[i]);
}
auto dispatcher = Director::getInstance()->getEventDispatcher();
dispatcher->removeCustomEventListeners(SHOW_PRIVATE_END);
}
//场景初始化;
void SSSGameScene::initScene()
{
//根节点;
m_rootNode = CSLoader::createNodeWithVisibleSize("Games/13S/GameTableScene.csb");
CC_ASSERT(m_rootNode != nullptr);
this->addChild(m_rootNode, ZO_DEFAULT);
// 公告;
auto ImageSytem = (ImageView*)m_rootNode->getChildByName("ImgRoll");
CC_ASSERT(ImageSytem!=nullptr);
SetSystemNode(ImageSytem);
// 绑定界面元素;
_MainPanel = static_cast<Layout*>(m_rootNode->getChildByName("MainPanel"));
CC_ASSERT(_MainPanel != nullptr);
// 房间信息;
_imgRoomInfo = static_cast<ImageView*>(_MainPanel->getChildByName("imgRoomInfo"));
CC_ASSERT(_imgRoomInfo != nullptr);
// 房间ID;
_txtRoomID = static_cast<Text*>(_imgRoomInfo->getChildByName("txtRoomID"));
CC_ASSERT(_txtRoomID != nullptr);
// 房间规则;
_txtRoomRule = static_cast<Text*>(_imgRoomInfo->getChildByName("txtRule"));
CC_ASSERT(_txtRoomRule != nullptr);
_txtRoomRule->setString("");
// 局数;
_txtJushu = static_cast<Text*>(_imgRoomInfo->getChildByName("txtRoundNum"));
CC_ASSERT(_txtJushu != nullptr);
_txtJushu->setVisible(false);
// 结束面板;
_ResultPanel = static_cast<Layout*>(m_rootNode->getChildByName("resultPanel"));
CC_ASSERT(_ResultPanel != nullptr);
_ResultPanel->setVisible(false);
// 胜负动画;
_pArmatureResult = (Armature*)_ResultPanel->getChildByName("armaGameResult");
CC_ASSERT(_pArmatureResult != nullptr);
_pArmatureResult->setVisible(false);
// 准备按钮;
_btnReady = static_cast<Button*>(_ResultPanel->getChildByName("btnReady"));
CC_ASSERT(_btnReady != nullptr);
// 准备开始;
_btnReady->addClickEventListener([=](Ref* pSender) {
playBtnClickEffect();
SendUserReady();
ArmatureAnimation* pAniResult = _pArmatureResult->getAnimation();
if (pAniResult != nullptr)
{
pAniResult->stop();
}
_pArmatureResult->setVisible(false);
_ResultPanel->setVisible(false);
});
// 查看总成绩按钮;
_btnPrivateEnd = static_cast<Button*>(_ResultPanel->getChildByName("btnPrivateEnd"));
CC_ASSERT(_btnPrivateEnd != nullptr);
_btnPrivateEnd->setVisible(false);
_btnPrivateEnd->addClickEventListener([this](Ref*){
playBtnClickEffect();
//BJOpenResultScene* pOpenResultScene = BJOpenResultScene::create();
_OpenResultScene->updateUIData(m_dwRoomID, &_aryResultItem, true);
_OpenResultScene->setVisible(true);
});
for (uint16 i = 0; i < SSS_GAME_PLAYER; i++)
{
string strName = StringUtils::format("txtScoreChair_%d", i);
_pTxtResultScore[i] = static_cast<TextAtlas*>(_ResultPanel->getChildByName(strName));
CC_ASSERT(_pTxtResultScore[i]!=nullptr);
_pTxtResultScore[i]->setString("");
//string strXin = StringUtils::format("txtXinScore_%d", i);
//_pTxtXinScore[i] = static_cast<TextAtlas*>(_ResultPanel->getChildByName(strXin));
//CC_ASSERT(_pTxtXinScore[i] != nullptr);
//_pTxtXinScore[i]->setString("");
}
// 按钮面板;
_ButtonPanel = static_cast<Layout*>(_MainPanel->getChildByName("ButtonPanel"));
CC_ASSERT(_ButtonPanel != nullptr);
// 发牌面板;
_SendCardPanel = static_cast<Layout*>(_MainPanel->getChildByName("panelSendCard"));
CC_ASSERT(_SendCardPanel != nullptr);
_SendCardPanel->setVisible(false);
// 微信邀请按钮;
_btnInvite = static_cast<Button*>(_ButtonPanel->getChildByName("btnInvite"));
CC_ASSERT(_btnInvite != nullptr);
_btnInvite->setVisible(false);
// 解散房间按钮;
_btnDismiss = static_cast<Button*>(_ButtonPanel->getChildByName("btnDismiss"));
CC_ASSERT(_btnDismiss != nullptr);
_btnDismiss->setVisible(false);
//设置按钮;
auto btnSetting = static_cast<Button*>(_ButtonPanel->getChildByName("btnSetting"));
CC_ASSERT(btnSetting != nullptr);
btnSetting->addClickEventListener([this](Ref*){
YSAudioEngine::Instance().playBtnClickEffect();
TipNode* pNode = SetScene::create();
CC_ASSERT(pNode != nullptr);
this->addChild(pNode, ZO_ANI);
pNode->pushScene();
});
// 离开按钮;
_btnLeave = static_cast<Button*>(_ButtonPanel->getChildByName("btnLeave"));
CC_ASSERT(_btnLeave != nullptr);
//_btnLeave->setVisible(false);
_btnLeave->addClickEventListener([=](Ref* pSender){
YSAudioEngine::Instance().playBtnClickEffect();
GamePlayer* pGamePlayer = getSelfGamePlayer();
auto callback_ok = [=](){
if (pGamePlayer != nullptr)
{
CMD_GR_UserStandUp request;
memset(&request, 0, sizeof(request));
request.wTableID = pGamePlayer->GetTableID();
request.wChairID = pGamePlayer->GetChairID();
request.cbForceLeave = true;
m_kGameMission.SendSocketData(MDM_GR_USER, SUB_GR_USER_STANDUP, &request, sizeof(request));
}
this->runAction(Sequence::createWithTwoActions(DelayTime::create(0.2f), CallFunc::create([=]{
Director::getInstance()->getEventDispatcher()->dispatchCustomEvent(LEAVE_GAME);
})));
};
std::string strPop = "您确定要离开房间吗?";
if (_cbGameStatus != SSS_GS_WK_FREE)
{
strPop = "您正在游戏中,强行退出会被扣分,确定要强退吗?";
}
PopScene::Instance().show(utility::a_u8(strPop), callback_ok, nullptr);
});
// 语音按钮;
_btnVoice = static_cast<Button*>(_ButtonPanel->getChildByName("btnVoice"));
CC_ASSERT(_btnVoice != nullptr);
_btnVoice->addTouchEventListener(CC_CALLBACK_2(SSSGameScene::OnButtonVoiceTouched, this));
// 聊天按钮;
_btnChat = static_cast<Button*>(_ButtonPanel->getChildByName("btnChat"));
CC_ASSERT(_btnChat != nullptr);
_btnChat->addClickEventListener([this](Ref*){
YSAudioEngine::Instance().playBtnClickEffect();
auto chatLayer = ChatLayer::create(m_vecShortChatList);
CC_ASSERT(chatLayer != nullptr);
this->addChild(chatLayer, ZO_ANI);
chatLayer->pushScene();
});
// 开始按钮;
_btnStartGame = static_cast<Button*>(_ButtonPanel->getChildByName("btnStartGame"));
CC_ASSERT(_btnStartGame != nullptr);
_btnStartGame->setVisible(false);
// 开始游戏;
_btnStartGame->addClickEventListener([=](Ref* pSender) {
playBtnClickEffect();
SendUserReady();
_btnStartGame->setEnabled(false);
});
// 开始动画;
_pArmatureStart = (Armature*)_MainPanel->getChildByName("armaStartGame");
CC_ASSERT(_pArmatureStart != nullptr);
_pArmatureStart->setVisible(false);
ArmatureAnimation* pAniStart = _pArmatureStart->getAnimation();
if (pAniStart != nullptr)
{
pAniStart->setMovementEventCallFunc(CC_CALLBACK_3(SSSGameScene::movementEventCallFunc, this));
}
// 全垒打动画;
_pArmaAllKillEffect = (Armature*)_MainPanel->getChildByName("armaAllKillEffect");
CC_ASSERT(_pArmaAllKillEffect != nullptr);
_pArmaAllKillEffect->setVisible(false);
ArmatureAnimation* pAniAllKill = _pArmaAllKillEffect->getAnimation();
if (pAniAllKill != nullptr)
{
pAniAllKill->setMovementEventCallFunc(CC_CALLBACK_3(SSSGameScene::movementEventCallFunc, this));
}
// 抢庄面板;
_RobPanel = static_cast<Layout*>(_MainPanel->getChildByName("RobPanel"));
CC_ASSERT(_RobPanel != nullptr);
_RobPanel->setVisible(false);
// 抢庄;
_btnRobYes = static_cast<Button*>(_RobPanel->getChildByName("btnRobYes"));
CC_ASSERT(_btnRobYes != nullptr);
_btnRobYes->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onRobYesButtonClick, this));
// 不抢庄;
_btnRobNo = static_cast<Button*>(_RobPanel->getChildByName("btnRobNo"));
CC_ASSERT(_btnRobNo != nullptr);
_btnRobNo->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onRobNoButtonClick, this));
// 压注面板;
_YaZhuPanel = static_cast<Layout*>(_MainPanel->getChildByName("YaZhuPanel"));
CC_ASSERT(_YaZhuPanel != nullptr);
_YaZhuPanel->setVisible(false);
// 压注按钮;
for (uint8 i = 0; i < 3; i++)
{
Button* pTmpButton = static_cast<Button*>(_YaZhuPanel->getChildByName(StringUtils::format("btnScore%d", 3+i)));
CC_ASSERT(pTmpButton != nullptr);
pTmpButton->setTag(3 + i);
pTmpButton->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onYaZhuButtonClick, this));
_aryButtonScore[i] = pTmpButton;
}
// 特殊面板;
_SpecialPanel = static_cast<Layout*>(_MainPanel->getChildByName("SpecialPanel"));
CC_ASSERT(_SpecialPanel != nullptr);
_SpecialPanel->setVisible(false);
// 特殊牌类型;
_sprSpecialType = static_cast<Sprite*>(_SpecialPanel->getChildByName("txtCardType"));
CC_ASSERT(_sprSpecialType != nullptr);
_sprOtherCallBanker = static_cast<Sprite*>(_MainPanel->getChildByName("watting_callbanker"));
CC_ASSERT(_sprOtherCallBanker != nullptr);
_sprOtherAddScore = static_cast<Sprite*>(_MainPanel->getChildByName("watting_addscore"));
CC_ASSERT(_sprOtherAddScore != nullptr);
_sprSelfAddScore = static_cast<Sprite*>(_MainPanel->getChildByName("owner_addscore"));
CC_ASSERT(_sprSelfAddScore != nullptr);
setOperateStatus(SSS_OS_NULL);
// 不摆特殊牌按钮;
_btnRefuseCards = static_cast<Button*>(_SpecialPanel->getChildByName("btnRefuseCards"));
CC_ASSERT(_btnRefuseCards != nullptr);
_btnRefuseCards->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onRefuseCardsButtonClick, this));
// 确定特殊牌按钮;
_btnCommitSpecial = static_cast<Button*>(_SpecialPanel->getChildByName("btnCommit"));
CC_ASSERT(_btnCommitSpecial != nullptr);
_btnCommitSpecial->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onCommitSpecialButtonClick, this));
// 操作面板;
_OperatePanel = static_cast<Layout*>(_MainPanel->getChildByName("OperatePanel"));
CC_ASSERT(_OperatePanel != nullptr);
_OperatePanel->setVisible(false);
auto OperCardPanelParent = static_cast<Layout*>(_OperatePanel->getChildByName("OperateCardPanel"));
CC_ASSERT(OperCardPanelParent != nullptr);
// 创建扑克操作面板;
Size operSize = OperCardPanelParent->getContentSize();
auto func = CC_CALLBACK_2(SSSGameScene::selectCardCallback, this);
_OperateCardPanel = SSSOperateCardPanel::create(operSize, func);
OperCardPanelParent->addChild(_OperateCardPanel);
// 桌面上的时钟精灵;
_imgGameClock = static_cast<Sprite*>(_MainPanel->getChildByName("imgGameClock"));
CC_ASSERT(_imgGameClock != nullptr);
_imgGameClock->setVisible(false);
// 操作面板上的时钟精灵;
_imgOperClock = static_cast<Sprite*>(_OperatePanel->getChildByName("imgGameClock"));
CC_ASSERT(_imgOperClock != nullptr);
_imgOperClock->setVisible(false);
// 比较按钮;
_btnCompare = static_cast<Button*>(_OperatePanel->getChildByName("btnCompare"));
CC_ASSERT(_btnCompare != nullptr);
_btnCompare->setVisible(false);
// 重置按钮;
_btnReset = static_cast<Button*>(_OperatePanel->getChildByName("btnReset"));
CC_ASSERT(_btnReset != nullptr);
_btnReset->setVisible(false);
// 随机组牌按钮;
_btnRandomCard = static_cast<Button*>(_OperatePanel->getChildByName("btnRandomCard"));
CC_ASSERT(_btnRandomCard != nullptr);
_btnRandomCard->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onRandomButtonClick, this));
auto tricksPanel = static_cast<ImageView*>(_OperatePanel->getChildByName("imgTricksPanel"));
CC_ASSERT(tricksPanel != nullptr);
for (int i = 0; i < SSS_GROUP_COUNT; i++)
{
auto imgCardBlock = static_cast<ImageView*>(tricksPanel->getChildByName(StringUtils::format("imgCardBlock%d", i)));
CC_ASSERT(imgCardBlock!=nullptr);
_aryTricksCardPanel[i] = static_cast<Layout*>(imgCardBlock->getChildByName("panelCard"));
CC_ASSERT(_aryTricksCardPanel[i]!=nullptr);
_aryButtonRechoose[i] = static_cast<Button*>(tricksPanel->getChildByName(StringUtils::format("btnRechoose%d", i)));
CC_ASSERT(_aryButtonRechoose[i]!=nullptr);
_aryButtonRechoose[i]->setEnabled(false);
_arySprCardType[i] = static_cast<Sprite*>(tricksPanel->getChildByName(StringUtils::format("sprCardType%d", i)));
CC_ASSERT(_arySprCardType[i] != nullptr);
_arySprCardType[i]->setVisible(false);
_arySprCardShadow[i] = static_cast<Sprite*>(imgCardBlock->getChildByName("imgCardShadow"));
CC_ASSERT(_arySprCardShadow[i] != nullptr);
_arySprCardShadow[i]->setVisible(false);
}
//对子按钮;
_btnDuiZi = static_cast<Button*>(_OperatePanel->getChildByName("btnDuiZi"));
CC_ASSERT(_btnDuiZi != nullptr);
_btnDuiZi->setEnabled(false);
_btnDuiZi->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onDuiZiButtonClick, this));
//两对按钮;
_btnLiangDui = static_cast<Button*>(_OperatePanel->getChildByName("btnLiangDui"));
CC_ASSERT(_btnLiangDui != nullptr);
_btnLiangDui->setEnabled(false);
_btnLiangDui->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onLiangDuiButtonClick, this));
//三条按钮;
_btnSanTiao = static_cast<Button*>(_OperatePanel->getChildByName("btnSanTiao"));
CC_ASSERT(_btnSanTiao != nullptr);
_btnSanTiao->setEnabled(false);
_btnSanTiao->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onSanTiaoButtonClick, this));
//顺子按钮;
_btnShunZi = static_cast<Button*>(_OperatePanel->getChildByName("btnShunZi"));
CC_ASSERT(_btnShunZi != nullptr);
_btnShunZi->setEnabled(false);
_btnShunZi->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onShunZiButtonClick, this));
//同花按钮;
_btnTongHua = static_cast<Button*>(_OperatePanel->getChildByName("btnTongHua"));
CC_ASSERT(_btnTongHua != nullptr);
_btnTongHua->setEnabled(false);
_btnTongHua->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onTongHuaButtonClick, this));
//葫芦按钮;
_btnHuLu = static_cast<Button*>(_OperatePanel->getChildByName("btnHuLu"));
CC_ASSERT(_btnHuLu != nullptr);
_btnHuLu->setEnabled(false);
_btnHuLu->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onHuLuButtonClick, this));
//铁支按钮;
_btnTieZhi = static_cast<Button*>(_OperatePanel->getChildByName("btnTieZhi"));
CC_ASSERT(_btnTieZhi != nullptr);
_btnTieZhi->setEnabled(false);
_btnTieZhi->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onTieZhiButtonClick, this));
//同花顺按钮;
_btnTongHuaShun = static_cast<Button*>(_OperatePanel->getChildByName("btnTongHuaShun"));
CC_ASSERT(_btnTongHuaShun != nullptr);
_btnTongHuaShun->setEnabled(false);
_btnTongHuaShun->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onTongHuaShunButtonClick, this));
// 头道小于中道提示;
_imgQualifiedTips = static_cast<Sprite*>(_OperatePanel->getChildByName("imgQualifiedTips"));
CC_ASSERT(_imgQualifiedTips != nullptr);
_imgQualifiedTips->setVisible(false);
// 摊牌;
_txtTip = static_cast<Text*>(_MainPanel->getChildByName("txtTip"));
CC_ASSERT(_txtTip != nullptr);
_txtTip->setVisible(true);
_txtTip->setString("");
// 发牌位置;
_ptSendCardPos = _MainPanel->getChildByName("imgCard")->getPosition();
// 语音标志;
m_pVoiceNode = (Node*)m_rootNode->getChildByName("VoiceNode");
CC_ASSERT(m_pVoiceNode != nullptr);
m_pVoiceNode->setVisible(false);
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
std::string strName = StringUtils::format("panelChair_%d", i);
Layout* layout = static_cast<Layout*>(_MainPanel->getChildByName(strName));
CC_ASSERT(layout!=nullptr);
m_aryPlayer[i] = new SSS_GamePlayer(i, layout);
layout->addClickEventListener([i, this](Ref* pSender){
CC_ASSERT(pSender != nullptr);
if (nullptr == pSender) return;
if ((m_aryPlayer[i] != nullptr) && m_aryPlayer[i]->getUserItem(false) != nullptr)
{
PlayerScene* playerScene = PlayerScene::create();
playerScene->showPlayerInfo(m_aryPlayer[i]);
this->addChild(playerScene, ZO_TRUSTEE);
}
});
}
m_pLocalPlayer = m_aryPlayer[SSS_VIEW_SELF_ID];
auto exitCallFunc = [=](Ref*){
auto callback = [=](){
onClickExitGameButton(nullptr);
this->runAction(Sequence::createWithTwoActions(DelayTime::create(0.2f), CallFunc::create([=]{
Director::getInstance()->getEventDispatcher()->dispatchCustomEvent(LEAVE_GAME);
})));
};
PopScene::Instance().show(utility::a_u8("您确定要退出游戏吗?"), callback, nullptr);
};
// 比牌;
_btnCompare->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onCompareButtonClick, this));
// 重置手牌;
_btnReset->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onResetButtonClick, this));
for (int i = 0; i < SSS_GROUP_COUNT; i++)
{
_aryButtonRechoose[i]->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onRechooseButtonClick, this));
_aryButtonRechoose[i]->setTag(i);
//string strName = StringUtils::format("btnPanel%d", i);
//auto btnPanel = static_cast<Layout*>(tricksPanel->getChildByName(strName));
//CC_ASSERT(btnPanel!=nullptr);
_aryTricksCardPanel[i]->addTouchEventListener(CC_CALLBACK_2(SSSGameScene::onPanelTouchEvent, this));
_aryTricksCardPanel[i]->setTag(i);
}
// 邀请;
_btnInvite->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onInviteButtonClick, this));
// 解散房间函数;
auto callback = [this](){
onEventAgreeDismissRoom(true);
};
_btnDismiss->addClickEventListener([=](Ref* pSender) {
// 解散;
playBtnClickEffect();
std::string strTip;
if (0 == m_PrivateRoomInfo.dwPlayCout && false == m_PrivateRoomInfo.bStartGame)
{
strTip = "牌局开始前解散房间不扣房卡,是否解散?";
}
else
{
strTip = "您确定要解散房间吗?";
}
PopScene::Instance().show(utility::a_u8(strTip.c_str()), callback, nullptr);
});
// 私人场结束面板;
_OpenResultScene = SSSOpenResultScene::create();
addChild(_OpenResultScene);
_OpenResultScene->setVisible(false);
//// 解散房间函数;
//auto callback = [this](){
// onEventAgreeDismissRoom(true);
//};
//对手机返回键的监听 ;
auto keyListener = EventListenerKeyboard::create();
//和回调函数绑定 ;
keyListener->onKeyReleased = [=](EventKeyboard::KeyCode keyCode, Event * pEvent){
//返回值处理;
if (keyCode == EventKeyboard::KeyCode::KEY_ESCAPE)
{
//uint8 cbWinChairID = 3;
//uint8 cbLoseChairID = 2;
//uint16 wWinViewID = SwitchViewChairID(cbWinChairID);
//tagSSSGunInfo* pWinInfo = new tagSSSGunInfo;
//pWinInfo->wViewID = wWinViewID;
//pWinInfo->ptPos = m_aryPlayer[wWinViewID]->getHandCardPos(1, 2);
//pWinInfo->cbGender = m_aryPlayer[wWinViewID]->GetGender();
//pWinInfo->nScore = std::abs(10);
//uint16 wLoseViewID = SwitchViewChairID(cbLoseChairID);
//tagSSSGunInfo* pLoseInfo = new tagSSSGunInfo;
//pLoseInfo->wViewID = wLoseViewID;
//pLoseInfo->ptPos = m_aryPlayer[wLoseViewID]->getHandCardPos(1, 2);
//pLoseInfo->cbGender = m_aryPlayer[wLoseViewID]->GetGender();
//pLoseInfo->nScore = -10;
//tagSSSTwoGunInfos* pInfo = new tagSSSTwoGunInfos;
//pInfo->pWinnerInfo = pWinInfo;
//pInfo->pLoserInfo = pLoseInfo;
//m_GameOverAni->addGunPlay(pInfo);
//m_GameOverAni->showAnimation(nullptr);
exitCallFunc(nullptr);
}
};
//添加到事件分发器中 ;
_eventDispatcher->addEventListenerWithSceneGraphPriority(keyListener, this);
SpriteFrameCache* pSpriteFrameCache = SpriteFrameCache::getInstance();
pSpriteFrameCache->addSpriteFramesWithFile("Games/13S/Cards/PinLargeCard1.plist");
pSpriteFrameCache->addSpriteFramesWithFile("Games/13S/Cards/PinLargeCard2.plist");
pSpriteFrameCache->addSpriteFramesWithFile("Games/13S/Cards/PinSmallCard.plist");
m_GameOverAni = CGameOverAni::create();
_MainPanel->addChild(m_GameOverAni);
loadShortChat("Games/13S/ShortChat/ChatInfo.json");
//重置场景;
resetScene();
//重置数据;
ResetAllData();
}
//重置场景;
void SSSGameScene::resetScene(bool bAll/* = false*/)
{
//重置玩家UI;
for (uint8 i = 0; i < SSS_GAME_PLAYER; i++)
{
m_aryPlayer[i]->resetUI(bAll);
m_aryPlayer[i]->setBankerVisible(false);
m_aryPlayer[i]->updateUserChip(0);
}
for (int i = 0; i < SSS_GROUP_COUNT; i++)
{
_aryTricksCardPanel[i]->removeAllChildren();
_aryButtonRechoose[i]->setEnabled(false);
_arySprCardType[i]->setVisible(false);
}
setOperateStatus(SSS_OS_NULL);
_RobPanel->setVisible(false);
_YaZhuPanel->setVisible(false);
_SpecialPanel->setVisible(false);
_OperatePanel->setVisible(false);
_ResultPanel->setVisible(false);
}
//重置数据;
void SSSGameScene::resetData()
{
_cbGameStatus = SSS_GS_WK_FREE;
_iBaseScore = 0;
_wBankerUser = INVALID_CHAIR;
_cbCurOpenCardAniIndex = 0;
_wSelfSpecialType = SSS_CT_INVALID;
_wKillAllUserChairID = INVALID_CHAIR;
for (uint8 i = 0; i < SSS_GAME_PLAYER; i++)
{
_aryActiveStatus[i] = SSS_HAND_STATUS_NULL;
}
zeromemory(_aryHandCardData, sizeof(_aryHandCardData));
zeromemory(_aryTricksFrontCard, sizeof(_aryTricksFrontCard));
zeromemory(_aryTricksMidCard, sizeof(_aryTricksMidCard));
zeromemory(_aryTricksBackCard, sizeof(_aryTricksBackCard));
zeromemory(_arySpecialType, sizeof(_arySpecialType));
zeromemory(_arySpecialCompareResult, sizeof(_arySpecialCompareResult));
zeromemory(_aryThreeKillResult, sizeof(_aryThreeKillResult));
zeromemory(_aryFrontCard, sizeof(_aryFrontCard));
zeromemory(_aryMidCard, sizeof(_aryMidCard));
zeromemory(_aryBackCard, sizeof(_aryBackCard));
}
//重置数据(相当于玩家离开);
void SSSGameScene::ResetAllData()
{
resetScene();
resetData();
}
//重置桌子;
void SSSGameScene::ResetTable()
{
resetScene(true);
resetData();
}
//获取快捷语音文件路径;
const std::string SSSGameScene::getShortChatSoundPath(uint8 cbGender, int nIndex)
{
// 短语;
std::string strFilePath = "Games/13S/ShortChat/";
if (cbGender == enMan)
{
strFilePath += StringUtils::format("man/%d.mp3", nIndex);
}
else
{
strFilePath += StringUtils::format("woman/%d.mp3", nIndex);
}
return strFilePath;
}
//绑定网络消息;
void SSSGameScene::initNet()
{
addNetCBDefine(SSS_SUB_S_GAME_START, this, SSSGameScene::onSubGameStart);
addNetCBDefine(SSS_SUB_S_START_ROB, this, SSSGameScene::onSubStartRob);
addNetCBDefine(SSS_SUB_S_USER_ROB, this, SSSGameScene::onSubUserRob);
addNetCBDefine(SSS_SUB_S_START_CHIP, this, SSSGameScene::onSubStartChip);
addNetCBDefine(SSS_SUB_S_USER_CHIP, this, SSSGameScene::onSubUserChip);
addNetCBDefine(SSS_SUB_S_SEND_LEFT_CARD, this, SSSGameScene::onSubSendLeftCard);
addNetCBDefine(SSS_SUB_S_START_OPEN, this, SSSGameScene::onSubStartOpen);
addNetCBDefine(SSS_SUB_S_OPEN_CARD, this, SSSGameScene::onSubOpenCard);
addNetCBDefine(SSS_SUB_S_CLASSIC_CMP_CARD, this, SSSGameScene::onSubClassicCompareCard);
addNetCBDefine(SSS_SUB_S_BANKER_CMP_CARD, this, SSSGameScene::onSubBankerCompareCard);
addNetCBDefine(SSS_SUB_S_GAME_END, this, SSSGameScene::onSubGameEnd);
}
bool SSSGameScene::OnEventSceneMessage(uint8 cbGameStatus, bool bLookonUser, void* pData, int nDataSize)
{
_cbGameStatus = cbGameStatus;
switch (cbGameStatus)
{
case SSS_GS_WK_FREE:
{
return onGameSceneFree(pData, nDataSize);
}
case SSS_GS_WK_ROB_BANKER:
{
return onGameSceneRobBanker(pData, nDataSize);
}
case SSS_GS_WK_USER_CHIP:
{
return onGameSceneUserChip(pData, nDataSize);
}
case SSS_GS_WK_SEND_CARD:
{
return onGameSceneSendCard(pData, nDataSize);
}
case SSS_GS_WK_OPEN_CARD:
{
return onGameSceneOpenCard(pData, nDataSize);
}
case SSS_GS_WK_COMPARE_CARD:
{
return onGameSceneCompareCard(pData, nDataSize);
}
default:
break;
}
return true;
}
//恢复空闭场景;
bool SSSGameScene::onGameSceneFree(void* pData, int nDataSize)
{
//校验数据;
CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusFree));
SSS_CMD_S_StatusFree* pStatusFree = (SSS_CMD_S_StatusFree*)pData;
_wBuildCardTime = pStatusFree->wBuildCardTime;
_wRobBankerTime = pStatusFree->wRobBankerTime;
_wUserChipTime = pStatusFree->wUserChipTime;
return true;
}
//抢庄场景;
bool SSSGameScene::onGameSceneRobBanker(void* pData, int nDataSize)
{
//校验数据;
CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusRob));
SSS_CMD_S_StatusRob* pStatusRob = (SSS_CMD_S_StatusRob*)pData;
_wBuildCardTime = pStatusRob->BaseStatus.wBuildCardTime;
_wRobBankerTime = pStatusRob->BaseStatus.wRobBankerTime;
_wUserChipTime = pStatusRob->BaseStatus.wUserChipTime;
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
_aryActiveStatus[i] = pStatusRob->BaseStatus.cbHandStatus[i];
}
_cbSendCardCount = pStatusRob->cbCardCount;
memcpy(_aryHandCardData, pStatusRob->cbHandCardData, sizeof(_aryHandCardData));
showCurHandCard(_cbSendCardCount);
uint16 wSelfChairID = getSelfChairID();
CC_ASSERT(wSelfChairID<SSS_GAME_PLAYER);
//抢庄状态 0:没操作1:不抢2:抢;
if (0==pStatusRob->cbRobStatus[wSelfChairID])
{
_RobPanel->setVisible(true);
}
else
{
setOperateStatus(SSS_OS_CALLBANK);
}
return true;
}
//下注场景;
bool SSSGameScene::onGameSceneUserChip(void* pData, int nDataSize)
{
//校验数据;
CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusChip));
SSS_CMD_S_StatusChip* pStatusChip = (SSS_CMD_S_StatusChip*)pData;
_wBuildCardTime = pStatusChip->BaseStatus.wBuildCardTime;
_wRobBankerTime = pStatusChip->BaseStatus.wRobBankerTime;
_wUserChipTime = pStatusChip->BaseStatus.wUserChipTime;
_wBankerUser = pStatusChip->wBankerUser;
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
_aryActiveStatus[i] = pStatusChip->BaseStatus.cbHandStatus[i];
}
_cbSendCardCount = pStatusChip->cbCardCount;
memcpy(_aryHandCardData, pStatusChip->cbHandCardData, sizeof(_aryHandCardData));
showCurHandCard(_cbSendCardCount);
uint16 wSelfChairID = getSelfChairID();
CC_ASSERT(wSelfChairID < SSS_GAME_PLAYER);
//抢庄状态 0:没操作1:已操作;
if ((pStatusChip->wBankerUser != wSelfChairID) && (0 == pStatusChip->cbChipStatus[wSelfChairID]))
{
_YaZhuPanel->setVisible(true);
setOperateStatus(SSS_OS_ADDSCORE1);
}
else
{
setOperateStatus(SSS_OS_ADDSCORE0);
}
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
int nChipScore = pStatusChip->lUserChipScore[i];
if (nChipScore>0)
{
uint16 wViewID = SwitchViewChairID(i);
m_aryPlayer[wViewID]->updateUserChip(nChipScore);
}
}
showBankerIcon();
return true;
}
//发牌场景;
bool SSSGameScene::onGameSceneSendCard(void* pData, int nDataSize)
{
//校验数据;
CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusSendCard));
SSS_CMD_S_StatusSendCard* pStatusSend = (SSS_CMD_S_StatusSendCard*)pData;
_wBuildCardTime = pStatusSend->BaseStatus.wBuildCardTime;
_wRobBankerTime = pStatusSend->BaseStatus.wRobBankerTime;
_wUserChipTime = pStatusSend->BaseStatus.wUserChipTime;
_wSelfSpecialType = pStatusSend->wSpecialType;
_cbSendCardCount = pStatusSend->cbCardCount;
_wBankerUser = pStatusSend->wBankerUser;
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
_aryActiveStatus[i] = pStatusSend->BaseStatus.cbHandStatus[i];
}
memcpy(_aryHandCardData, pStatusSend->cbHandCardData, sizeof(_aryHandCardData));
uint16 wMyChairID = getSelfChairID();
CC_ASSERT(wMyChairID < SSS_GAME_PLAYER);
if (wMyChairID < SSS_GAME_PLAYER)
{
memcpy(_aryFrontCard[wMyChairID], pStatusSend->cbHandCardData, SSS_MIN_ITEM_COUNT);
memcpy(_aryMidCard[wMyChairID], &pStatusSend->cbHandCardData[3], SSS_MAX_ITEM_COUNT);
memcpy(_aryBackCard[wMyChairID], &pStatusSend->cbHandCardData[8], SSS_MAX_ITEM_COUNT);
}
showAllPlayersCard();
showBankerIcon();
uint8 cbUserStatus = m_pLocalPlayer->GetUserStatus();
if (pStatusSend->bSendOver && cbUserStatus == US_PLAYING)
{
sendSendCardOverMsg();
}
return true;
}
//开牌场景;
bool SSSGameScene::onGameSceneOpenCard(void* pData, int nDataSize)
{
//校验数据;
CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusOpen));
SSS_CMD_S_StatusOpen* pStatusOpen = (SSS_CMD_S_StatusOpen*)pData;
_wBuildCardTime = pStatusOpen->BaseStatus.wBuildCardTime;
_wRobBankerTime = pStatusOpen->BaseStatus.wRobBankerTime;
_wUserChipTime = pStatusOpen->BaseStatus.wUserChipTime;
_wSelfSpecialType = pStatusOpen->wSpecialType;
_wBankerUser = pStatusOpen->wBankerUser;
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
_aryActiveStatus[i] = pStatusOpen->BaseStatus.cbHandStatus[i];
}
memcpy(_aryHandCardData, pStatusOpen->cbHandCardData, sizeof(_aryHandCardData));
uint16 wMyChairID = getSelfChairID();
CC_ASSERT(wMyChairID < SSS_GAME_PLAYER);
if (wMyChairID < SSS_GAME_PLAYER)
{
memcpy(_aryFrontCard[wMyChairID], pStatusOpen->cbHandCardData, SSS_MIN_ITEM_COUNT);
memcpy(_aryMidCard[wMyChairID], &pStatusOpen->cbHandCardData[3], SSS_MAX_ITEM_COUNT);
memcpy(_aryBackCard[wMyChairID], &pStatusOpen->cbHandCardData[8], SSS_MAX_ITEM_COUNT);
}
showAllPlayersCard();
showBankerIcon();
for (int i = 0; i<SSS_GAME_PLAYER; i++)
{
if (_aryActiveStatus[i] != SSS_HAND_STATUS_NULL )
{
uint16 wViewID = SwitchViewChairID(i);
m_aryPlayer[wViewID]->showHandStatus(_aryActiveStatus[i]);
int nChipScore = pStatusOpen->lUserChipScore[i];
if (nChipScore > 0)
{
m_aryPlayer[wViewID]->updateUserChip(nChipScore);
}
}
}
switch (_aryActiveStatus[wMyChairID])
{
case SSS_HAND_STATUS_SORTED:
_txtTip->setString(utility::a_u8("等待其他玩家开牌..."));
m_aryPlayer[SSS_VIEW_SELF_ID]->showCard(_aryFrontCard[wMyChairID], _aryMidCard[wMyChairID], _aryBackCard[wMyChairID], SSS_HAND_STATUS_SORTED);
break;
case SSS_HAND_STATUS_GIVEUP:
_txtTip->setString(utility::a_u8("等待其他玩家开牌..."));
break;
case SSS_HAND_STATUS_DISORDER:
if (_wSelfSpecialType!=SSS_CT_INVALID)
{
m_GameLogic.SortCardList(_aryHandCardData, SSS_MAX_COUNT);
showCurHandCard(SSS_MAX_COUNT);
showSpecialPanel(true);
}
else
{
showOperatePanel(true);
}
break;
default:
break;
}
return true;
}
//比牌场景;
bool SSSGameScene::onGameSceneCompareCard(void* pData, int nDataSize)
{
bool bCompareOver = false;
uint16 wHandCardType[SSS_GAME_PLAYER][SSS_GROUP_COUNT] = {0};
int nCompareResult[SSS_GAME_PLAYER][SSS_GROUP_COUNT] = { 0 };
int aryUserChipScore[SSS_GAME_PLAYER] = {};
if (eSSSGameRuleClassic==(m_PrivateRoomInfo.bGameRuleIdex&eSSSGameRuleClassic))
{
//校验数据;
CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusClassicCompare));
SSS_CMD_S_StatusClassicCompare* pSC = (SSS_CMD_S_StatusClassicCompare*)pData;
_wBuildCardTime = pSC->wBuildCardTime;
_txtTip->setString("");
memcpy(_aryActiveStatus, pSC->CompareStatus.cbHandStatus, sizeof(_aryActiveStatus));
//ArmatureAnimation* pAniStart = _pArmatureStart->getAnimation();
//if (pAniStart != nullptr)
//{
// pAniStart->play("GameStart1", -1, 0);
// _pArmatureStart->setVisible(true);
//}
memcpy(_aryFrontCard, pSC->CompareStatus.cbFrontCard, sizeof(_aryFrontCard));
memcpy(_aryMidCard, pSC->CompareStatus.cbMidCard, sizeof(_aryMidCard));
memcpy(_aryBackCard, pSC->CompareStatus.cbBackCard, sizeof(_aryBackCard));
memcpy(wHandCardType, pSC->CompareStatus.wHandCardType, sizeof(wHandCardType));
memcpy(nCompareResult, pSC->CompareStatus.nCompareResult, sizeof(nCompareResult));
bCompareOver = pSC->bCompareOver;
}
else
{
//校验数据;
CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusBankerCompare));
SSS_CMD_S_StatusBankerCompare* pSBC = (SSS_CMD_S_StatusBankerCompare*)pData;
_wBankerUser = pSBC->wBankerUser;
_wBuildCardTime = pSBC->wBuildCardTime;
_txtTip->setString("");
memcpy(_aryActiveStatus, pSBC->CompareStatus.cbHandStatus, sizeof(_aryActiveStatus));
//ArmatureAnimation* pAniStart = _pArmatureStart->getAnimation();
//if (pAniStart != nullptr)
//{
// pAniStart->play("GameStart1", -1, 0);
// _pArmatureStart->setVisible(true);
//}
memcpy(_aryFrontCard, pSBC->CompareStatus.cbFrontCard, sizeof(_aryFrontCard));
memcpy(_aryMidCard, pSBC->CompareStatus.cbMidCard, sizeof(_aryMidCard));
memcpy(_aryBackCard, pSBC->CompareStatus.cbBackCard, sizeof(_aryBackCard));
bCompareOver = pSBC->bCompareOver;
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
for (int j = 0; j < SSS_GROUP_COUNT; j++)
{
wHandCardType[i][j] = pSBC->CompareStatus.wHandCardType[i][j];
nCompareResult[i][j] = pSBC->CompareStatus.cbOtherCmResult[i][j];
}
aryUserChipScore[i] = pSBC->lUserChipScore[i];
}
showBankerIcon();
}
// 展示所有手牌和分数;
for (uint16 i = 0; i < SSS_GAME_PLAYER; i++)
{
if (_aryActiveStatus[i] != SSS_HAND_STATUS_NULL)
{
uint16 wViewID = SwitchViewChairID(i);
// 特殊处理A32;
for (uint8 j = 0; j < SSS_GROUP_COUNT; j++)
{
uint8 aryTmpCardData[SSS_MAX_ITEM_COUNT] = { 0 };
int nItemCount = j > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT;
if (0==j)
{
if (cardTypeTo32A(_aryFrontCard[i], nItemCount, aryTmpCardData, nItemCount))
{
memcpy(_aryFrontCard[i], aryTmpCardData, sizeof(uint8)*nItemCount);
}
}
else if (1==j)
{
if (cardTypeTo32A(_aryMidCard[i], nItemCount, aryTmpCardData, nItemCount))
{
memcpy(_aryMidCard[i], aryTmpCardData, sizeof(uint8)*nItemCount);
}
}
else if (2==j)
{
if (cardTypeTo32A(_aryBackCard[i], nItemCount, aryTmpCardData, nItemCount))
{
memcpy(_aryBackCard[i], aryTmpCardData, sizeof(uint8)*nItemCount);
}
}
}
m_aryPlayer[wViewID]->showCard(_aryFrontCard[i], _aryMidCard[i], _aryBackCard[i], _aryActiveStatus[i]);
m_aryPlayer[wViewID]->setGameScore(nCompareResult[i], wHandCardType[i]);
int nChipScore = aryUserChipScore[i];
if (nChipScore > 0)
{
m_aryPlayer[wViewID]->updateUserChip(nChipScore);
}
}
}
uint8 cbUserStatus = m_pLocalPlayer->GetUserStatus();
if (!bCompareOver && cbUserStatus == US_PLAYING)
{
sendCompareOverMsg();
}
return true;
}
void SSSGameScene::onSubGameStart(const void * pBuffer, uint16 wDataSize)
{
//校验数据;
CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_GameStart));
SSS_CMD_S_GameStart* pGameStart = (SSS_CMD_S_GameStart*)pBuffer;
//重置数据;
ResetAllData();
_wSelfSpecialType = pGameStart->wSpecialType;
_cbSendCardCount = pGameStart->cbCardCount;
_wBankerUser = pGameStart->wBankerChairID;
memcpy(_aryHandCardData, pGameStart->cbHandCardData, sizeof(_aryHandCardData));
if (_cbSendCardCount > 0)
{
m_GameLogic.SortCardList(_aryHandCardData, _cbSendCardCount);
}
for (uint8 i = 0; i < SSS_GAME_PLAYER; i++)
{
_aryActiveStatus[i] = pGameStart->cbHandStatus[i];
}
if (_cbSendCardCount>0)
{
ArmatureAnimation* pAniStart = _pArmatureStart->getAnimation();
if (pAniStart != nullptr)
{
pAniStart->play("GameStart2", -1, 0);
_pArmatureStart->setVisible(true);
}
showBankerIcon();
}
else
{
SSS_CMD_S_StartChip mStartChip = {0};
mStartChip.wBankerUser = _wBankerUser;
onSubStartChip(&mStartChip, sizeof(SSS_CMD_S_StartChip));
}
// 隐藏同IP显示;
IpTipScene::Instance().hide();
}
//开始抢庄;
void SSSGameScene::onSubStartRob(const void * pBuffer, uint16 wDataSize)
{
_RobPanel->setVisible(true);
}
//玩家抢庄;
void SSSGameScene::onSubUserRob(const void * pBuffer, uint16 wDataSize)
{
//校验数据;
CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_UserRob));
SSS_CMD_S_UserRob* pUserRob = (SSS_CMD_S_UserRob*)pBuffer;
uint16 wViewID = SwitchViewChairID(pUserRob->wRobUser);
if (SSS_VIEW_SELF_ID==wViewID)
{
_RobPanel->setVisible(false);
setOperateStatus(SSS_OS_CALLBANK);
}
// 声音;
std::string strRobResult = StringUtils::format("%s", pUserRob->bRobResult ? "Qiangzhuan" : "Buqiang");
std::string strSound = StringUtils::format("woman/%s", strRobResult.c_str());
if (m_aryPlayer[wViewID]->GetGender() == enMan)
{
strSound = StringUtils::format("man/%s", strRobResult.c_str());
}
playEffect(strSound);
}
//开始下注;
void SSSGameScene::onSubStartChip(const void * pBuffer, uint16 wDataSize)
{
//校验数据;
CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_StartChip));
SSS_CMD_S_StartChip* pStartChip = (SSS_CMD_S_StartChip*)pBuffer;
_RobPanel->setVisible(false);
CC_ASSERT(pStartChip->wBankerUser<SSS_GAME_PLAYER);
if (pStartChip->wBankerUser<SSS_GAME_PLAYER)
{
_wBankerUser = pStartChip->wBankerUser;
uint16 wViewID = SwitchViewChairID(pStartChip->wBankerUser);
m_aryPlayer[wViewID]->setBankerVisible(true);
if (SSS_VIEW_SELF_ID!=wViewID)
{
_YaZhuPanel->setVisible(true);
setOperateStatus(SSS_OS_ADDSCORE1);
}
else
{
setOperateStatus(SSS_OS_ADDSCORE0);
}
std::string strSound = "woman/banker";
if (m_aryPlayer[wViewID]->GetGender() == enMan)
{
strSound = "man/banker";
}
playEffect(strSound);
}
}
//玩家下注;
void SSSGameScene::onSubUserChip(const void * pBuffer, uint16 wDataSize)
{
//校验数据;
CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_UserChip));
SSS_CMD_S_UserChip* pUserChip = (SSS_CMD_S_UserChip*)pBuffer;
uint16 wViewID = SwitchViewChairID(pUserChip->wChipUser);
m_aryPlayer[wViewID]->updateUserChip(pUserChip->lChipScore);
if (SSS_VIEW_SELF_ID == wViewID)
{
_YaZhuPanel->setVisible(false);
setOperateStatus(SSS_OS_ADDSCORE0);
}
// 声音;
std::string strSound = StringUtils::format("woman/Chip%d", pUserChip->lChipScore);
if (m_aryPlayer[wViewID]->GetGender() == enMan)
{
strSound = StringUtils::format("man/Chip%d", pUserChip->lChipScore);
}
playEffect(strSound);
}
//发送剩下的牌;
void SSSGameScene::onSubSendLeftCard(const void * pBuffer, uint16 wDataSize)
{
//校验数据;
CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_SendLeftCard));
SSS_CMD_S_SendLeftCard* pLeftCard = (SSS_CMD_S_SendLeftCard*)pBuffer;
memcpy(_aryHandCardData, pLeftCard->cbHandCardData, sizeof(_aryHandCardData));
onSubStartOpen(nullptr, 0);
}
//开始开牌;
void SSSGameScene::onSubStartOpen(const void * pBuffer, uint16 wDataSize)
{
setOperateStatus(SSS_OS_NULL);
_YaZhuPanel->setVisible(false);
if (SSS_CT_INVALID==_wSelfSpecialType)
{
_SendCardPanel->setVisible(false);
_SendCardPanel->removeAllChildren();
}
if ((m_PrivateRoomInfo.bGameRuleIdex&eSSSGameRuleClassic) == 0)
{
showAllPlayersCard();
}
uint16 wSelfChairID = getSelfChairID();
if (_aryActiveStatus[wSelfChairID] != SSS_HAND_STATUS_NULL)
{
if (_wSelfSpecialType != SSS_CT_INVALID)
{
showSpecialPanel(true);
}
else
{
showOperatePanel(true);
}
}
}
//开牌;
void SSSGameScene::onSubOpenCard(const void * pBuffer, uint16 wDataSize)
{
CC_ASSERT(sizeof(SSS_CMD_S_OpenCard) == wDataSize);
SSS_CMD_S_OpenCard* pOpenCard = (SSS_CMD_S_OpenCard*)pBuffer;
uint16 wSelfChairID = getSelfChairID();
uint16 wViewID = SwitchViewChairID(pOpenCard->wChairID);
if (pOpenCard->wChairID == wSelfChairID)
{
closeClock(_imgOperClock);
_OperatePanel->setVisible(false);
_SendCardPanel->setVisible(false);
_SendCardPanel->removeAllChildren();
m_aryPlayer[wViewID]->showCard(_aryTricksFrontCard, _aryTricksMidCard, _aryTricksBackCard, SSS_HAND_STATUS_SORTED, true);
_txtTip->setString(utility::a_u8("等待其他玩家开牌..."));
uint8 cbGender = m_pLocalPlayer->GetGender();
std::string strPath = "";
if (0 == cbGender)
{
strPath += "man/m_complete";
}
else
{
strPath += "woman/f_complete";
}
playEffect(strPath);
}
else
{
m_aryPlayer[wViewID]->showHandStatus(SSS_HAND_STATUS_SORTED);
}
}
//比牌结果;
void SSSGameScene::onSubClassicCompareCard(const void * pBuffer, uint16 wDataSize)
{
CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_ClassicCompareCard));
SSS_CMD_S_ClassicCompareCard* pCompare = (SSS_CMD_S_ClassicCompareCard*)pBuffer;
_OperatePanel->setVisible(false);
_txtTip->setString("");
closeClock(_imgGameClock);
memcpy(_aryActiveStatus, pCompare->cbHandStatus, sizeof(_aryActiveStatus));
memcpy(_aryFrontCard, pCompare->cbFrontCard, sizeof(_aryFrontCard));
memcpy(_aryMidCard, pCompare->cbMidCard, sizeof(_aryMidCard));
memcpy(_aryBackCard, pCompare->cbBackCard, sizeof(_aryBackCard));
memcpy(_arySpecialType, pCompare->wSpecialType, sizeof(_arySpecialType));
memcpy(_arySpecialCompareResult, pCompare->nSpecialCompareResult, sizeof(_arySpecialCompareResult));
memcpy(_aryThreeKillResult, pCompare->cbThreeKillResult, sizeof(_aryThreeKillResult));
// 展示所有手牌;
for (uint16 i = 0; i < SSS_GAME_PLAYER; i++)
{
if (SSS_HAND_STATUS_NULL==_aryActiveStatus[i])
{
continue;
}
uint16 wViewID = SwitchViewChairID(i);
if (SSS_CT_INVALID==pCompare->wSpecialType[i])
{
// 特殊处理A32;
for (uint8 j = 0; j < SSS_GROUP_COUNT; j++)
{
uint8 aryTmpCardData[SSS_MAX_ITEM_COUNT] = { 0 };
int nItemCount = j > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT;
if (0 == j)
{
if (cardTypeTo32A(_aryFrontCard[i], nItemCount, aryTmpCardData, nItemCount))
{
memcpy(_aryFrontCard[i], aryTmpCardData, sizeof(uint8)*nItemCount);
}
}
else if (1 == j)
{
if (cardTypeTo32A(_aryMidCard[i], nItemCount, aryTmpCardData, nItemCount))
{
memcpy(_aryMidCard[i], aryTmpCardData, sizeof(uint8)*nItemCount);
}
}
else if (2 == j)
{
if (cardTypeTo32A(_aryBackCard[i], nItemCount, aryTmpCardData, nItemCount))
{
memcpy(_aryBackCard[i], aryTmpCardData, sizeof(uint8)*nItemCount);
}
}
}
m_aryPlayer[wViewID]->showCard(_aryFrontCard[i], _aryMidCard[i], _aryBackCard[i], _aryActiveStatus[i], true);
m_aryPlayer[wViewID]->setGameScore(pCompare->nCompareResult[i], pCompare->wHandCardType[i]);
}
else
{
m_aryPlayer[wViewID]->showCard(_aryFrontCard[i], _aryMidCard[i], _aryBackCard[i], _aryActiveStatus[i]);
m_aryPlayer[wViewID]->showSepShadow(true);
SCORE aryScore[SSS_GROUP_COUNT] = {0};
uint16 aryCardType[SSS_GROUP_COUNT] = { 0 };
m_aryPlayer[wViewID]->setGameScore(aryScore, aryCardType);
}
}
_cbCurOpenCardAniIndex = 0;
ArmatureAnimation* pAniStart = _pArmatureStart->getAnimation();
if (pAniStart != nullptr)
{
pAniStart->play("GameStart1", -1, 0);
_pArmatureStart->setVisible(true);
}
uint8 cbGender = m_pLocalPlayer->GetGender();
std::string strPath = "";
if (0 == cbGender)
{
strPath += "man/m_compare";
}
else
{
strPath += "woman/f_compare";
}
playEffect(strPath);
for (uint8 i = 0; i < 6; i++)
{
uint8 cbWinChairID = pCompare->aryShootState[i][0];
uint8 cbLoseChairID = pCompare->aryShootState[i][1];
if (cbWinChairID != 255)
{
if (!m_GameOverAni->isExist(cbWinChairID, cbLoseChairID))
{
uint16 wWinViewID = SwitchViewChairID(cbWinChairID);
tagSSSGunInfo* pWinInfo = new tagSSSGunInfo;
pWinInfo->wViewID = wWinViewID;
pWinInfo->ptPos = m_aryPlayer[wWinViewID]->getHandCardPos(1, 2);
pWinInfo->cbGender = m_aryPlayer[wWinViewID]->GetGender();
pWinInfo->nScore = pCompare->aryShootDaoShu[cbWinChairID][cbLoseChairID];
uint16 wLoseViewID = SwitchViewChairID(cbLoseChairID);
tagSSSGunInfo* pLoseInfo = new tagSSSGunInfo;
pLoseInfo->wViewID = wLoseViewID;
pLoseInfo->ptPos = m_aryPlayer[wLoseViewID]->getHandCardPos(1, 2);
pLoseInfo->cbGender = m_aryPlayer[wLoseViewID]->GetGender();
pLoseInfo->nScore = pCompare->aryShootDaoShu[cbLoseChairID][cbWinChairID];
tagSSSTwoGunInfos* pInfo = new tagSSSTwoGunInfos;
pInfo->pWinnerInfo = pWinInfo;
pInfo->pLoserInfo = pLoseInfo;
m_GameOverAni->addGunPlay(pInfo);
}
}
}
}
//带庄家比牌结果;
void SSSGameScene::onSubBankerCompareCard(const void * pBuffer, uint16 wDataSize)
{
CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_BankerCompareCard));
SSS_CMD_S_BankerCompareCard* pCompare = (SSS_CMD_S_BankerCompareCard*)pBuffer;
_OperatePanel->setVisible(false);
_txtTip->setString("");
closeClock(_imgGameClock);
memcpy(_aryActiveStatus, pCompare->cbHandStatus, sizeof(_aryActiveStatus));
memcpy(_aryFrontCard, pCompare->cbFrontCard, sizeof(_aryFrontCard));
memcpy(_aryMidCard, pCompare->cbMidCard, sizeof(_aryMidCard));
memcpy(_aryBackCard, pCompare->cbBackCard, sizeof(_aryBackCard));
int aryCompareResult[SSS_GAME_PLAYER][SSS_GROUP_COUNT] = {0};
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
for (int j = 0; j < SSS_GROUP_COUNT; j++)
{
aryCompareResult[i][j] = pCompare->cbOtherCmResult[i][j];
}
}
// 展示所有手牌;
for (uint16 i = 0; i < SSS_GAME_PLAYER; i++)
{
if (SSS_HAND_STATUS_NULL == _aryActiveStatus[i])
{
continue;
}
bool bShowScore = (i != _wBankerUser);
uint16 wViewID = SwitchViewChairID(i);
// 特殊处理A32;
for (uint8 j = 0; j < SSS_GROUP_COUNT; j++)
{
uint8 aryTmpCardData[SSS_MAX_ITEM_COUNT] = { 0 };
int nItemCount = j > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT;
if (0 == j)
{
if (cardTypeTo32A(_aryFrontCard[i], nItemCount, aryTmpCardData, nItemCount))
{
memcpy(_aryFrontCard[i], aryTmpCardData, sizeof(uint8)*nItemCount);
}
}
else if (1 == j)
{
if (cardTypeTo32A(_aryMidCard[i], nItemCount, aryTmpCardData, nItemCount))
{
memcpy(_aryMidCard[i], aryTmpCardData, sizeof(uint8)*nItemCount);
}
}
else if (2 == j)
{
if (cardTypeTo32A(_aryBackCard[i], nItemCount, aryTmpCardData, nItemCount))
{
memcpy(_aryBackCard[i], aryTmpCardData, sizeof(uint8)*nItemCount);
}
}
}
m_aryPlayer[wViewID]->showCard(_aryFrontCard[i], _aryMidCard[i], _aryBackCard[i], _aryActiveStatus[i], true);
m_aryPlayer[wViewID]->setGameScore(aryCompareResult[i], pCompare->wHandCardType[i], bShowScore);
}
_cbCurOpenCardAniIndex = 0;
ArmatureAnimation* pAniStart = _pArmatureStart->getAnimation();
if (pAniStart != nullptr)
{
pAniStart->play("GameStart1", -1, 0);
_pArmatureStart->setVisible(true);
}
uint8 cbGender = m_pLocalPlayer->GetGender();
std::string strPath = "";
if (0 == cbGender)
{
strPath += "man/m_compare";
}
else
{
strPath += "woman/f_compare";
}
playEffect(strPath);
}
//发牌结束;
void SSSGameScene::sendSendCardOverMsg()
{
SendSocketData(SSS_SUB_C_SEND_OVER);
}
//开牌操作;
void SSSGameScene::sendOpenCardMsg()
{
SSS_CMD_C_OpenCard mOpenCard;
memset(&mOpenCard, 0, sizeof(mOpenCard));
memcpy(mOpenCard.cbFrontCard, _aryTricksFrontCard, sizeof(_aryTricksFrontCard));
memcpy(mOpenCard.cbMidCard, _aryTricksMidCard, sizeof(_aryTricksMidCard));
memcpy(mOpenCard.cbBackCard, _aryTricksBackCard, sizeof(_aryTricksBackCard));
SendSocketData(SSS_SUB_C_OPEN_CARD, &mOpenCard, sizeof(SSS_CMD_C_OpenCard));
}
//比牌完成;
void SSSGameScene::sendCompareOverMsg()
{
if (m_IsGameRecord)
{
onSubGameEnd(&m_GameEnd, sizeof(SSS_CMD_S_GameEnd));
}
else
{
SendSocketData(SSS_SUB_C_COMPARE_OVER);
}
}
//显示当前手牌;
void SSSGameScene::showCurHandCard(uint8 cbCardCount)
{
_SendCardPanel->setVisible(true);
_SendCardPanel->removeAllChildren();
float fInitX = _SendCardPanel->getContentSize().width;
float fTargetX = (SSS_MAX_COUNT == cbCardCount) ? 0.f : 200.f;
for (int i = 0; i < cbCardCount; i++)
{
SSSBigCardSprite* pCardSprite = SSSBigCardSprite::create(_aryHandCardData[i]);
pCardSprite->setPositionX(fTargetX);
_SendCardPanel->addChild(pCardSprite);
fTargetX += 56.f;
}
}
//显示庄家图标;
void SSSGameScene::showBankerIcon()
{
if (INVALID_CHAIR != _wBankerUser)
{
uint16 wViewID = SwitchViewChairID(_wBankerUser);
m_aryPlayer[wViewID]->setBankerVisible(true);
}
}
// 设置状态;
void SSSGameScene::setOperateStatus(SSS_OPERATE_STATUS ops)
{
_sprOtherCallBanker->setVisible(ops == SSS_OS_CALLBANK);
_sprOtherAddScore->setVisible(ops == SSS_OS_ADDSCORE0);
_sprSelfAddScore->setVisible(ops == SSS_OS_ADDSCORE1);
}
void SSSGameScene::showOperatePanel(bool bShow)
{
_OperatePanel->setVisible(bShow);
if ( bShow )
{
openClock(_imgOperClock, _wBuildCardTime, nullptr);
openClock(_imgGameClock, _wBuildCardTime, nullptr);
_btnCompare->setVisible(false);
_btnReset->setVisible(false);
m_GameLogic.SortCardList(_aryHandCardData, SSS_MAX_COUNT);
_OperateCardPanel->showHandCard(_aryHandCardData, SSS_MAX_COUNT);
_OperateCardPanel->setVisible(true);
m_AnalyseType = m_GameLogic.GetType(_aryHandCardData, SSS_HAND_CARD_COUNT);
updateCardTypeButtons();
}
}
//显示特殊牌面板;
void SSSGameScene::showSpecialPanel(bool bShow)
{
_SpecialPanel->setVisible(bShow);
if (bShow)
{
openClock(_imgGameClock, _wBuildCardTime, nullptr);
string strImagePath = C13SGameLogic::getCardTypeImagePath(_wSelfSpecialType);
if (!strImagePath.empty())
{
_sprSpecialType->setTexture(strImagePath);
_sprSpecialType->setVisible(true);
}
else
{
_sprSpecialType->setVisible(false);
}
_btnRefuseCards->setVisible(true);
_btnCommitSpecial->setVisible(true);
}
}
//点击随便机组牌按钮;
void SSSGameScene::onRandomButtonClick(Ref* pSender)
{
tag13SAnalyseType AnalyseType = m_GameLogic.GetType(_aryHandCardData, SSS_HAND_CARD_COUNT);
uint8 aryFrontCard[SSS_MIN_ITEM_COUNT] = {0};
uint8 aryMidCard[SSS_MAX_ITEM_COUNT] = { 0 };
uint8 aryBackCard[SSS_MAX_ITEM_COUNT] = { 0 };
m_GameLogic.TheBestCard(AnalyseType, _aryHandCardData, SSS_HAND_CARD_COUNT, aryFrontCard, aryMidCard, aryBackCard);
if (0 == aryFrontCard[0] || 0 == aryMidCard[0] || 0 == aryBackCard[0])
{
PopScene::Instance().show(utility::a_u8("未找到合适牌型请手工配牌!"));
return;
}
addTricksCard(0, aryFrontCard, SSS_MIN_ITEM_COUNT);
addTricksCard(1, aryMidCard, SSS_MAX_ITEM_COUNT);
addTricksCard(2, aryBackCard, SSS_MAX_ITEM_COUNT);
_OperateCardPanel->showHandCard(nullptr, 0);
disableCardTypeButtons();
onChooseFinished();
}
//重置按钮被点击;
void SSSGameScene::onResetButtonClick(Ref* pSender)
{
playBtnClickEffect();
if (_aryTricksFrontCard[0] + _aryTricksMidCard[0] + _aryTricksBackCard[0] == 0)
{
return;
}
uint16 wSelfChairID = getSelfChairID();
if (_aryActiveStatus[wSelfChairID] != SSS_HAND_STATUS_NULL)
{
for (int i = 0; i < SSS_GROUP_COUNT; i++)
{
_aryTricksCardPanel[i]->removeAllChildren();
_aryButtonRechoose[i]->setEnabled(false);
_arySprCardType[i]->setVisible(false);
}
m_GameLogic.SortCardList(_aryHandCardData, sizeof(_aryHandCardData));
_OperateCardPanel->showHandCard(_aryHandCardData, sizeof(_aryHandCardData));
zeromemory(_aryTricksFrontCard, sizeof(_aryTricksFrontCard));
zeromemory(_aryTricksMidCard, sizeof(_aryTricksMidCard));
zeromemory(_aryTricksBackCard, sizeof(_aryTricksBackCard));
_OperateCardPanel->setVisible(true);
m_AnalyseType = m_GameLogic.GetType(_aryHandCardData, sizeof(_aryHandCardData));
updateCardTypeButtons();
}
}
void SSSGameScene::onCompareButtonClick(Ref* pSender)
{
playBtnClickEffect();
for (int i = 0; i < SSS_GROUP_COUNT; i++)
{
if (_aryTricksCardPanel[i]->getChildrenCount() == 0)
{
PopScene::Instance().show(utility::a_u8("请分配好你的牌序~"));
return;
}
}
if (false==checkCardPutRule())
{
return;
}
uint16 wSelfChairID = getSelfChairID();
if (_aryActiveStatus[wSelfChairID] != SSS_HAND_STATUS_NULL)
{
showOperatePanel(false);
sendOpenCardMsg();
}
}
//邀请按钮被点击;
void SSSGameScene::onInviteButtonClick(Ref* pSender)
{
playBtnClickEffect();
std::string strUTFGameTitle = utility::a_u8(m_strGameTitle);
std::string strUrl = GlobalJosn::getInstance()->getShareInfoByKind(SH_KIND_WEIXIN_URL);
std::string strUrlInfo = StringUtils::format("%s?param=%d", strUrl.c_str(), m_PrivateRoomInfo.dwRoomNum);
std::string strRoomID = StringUtils::format("房间号(%d), ", m_PrivateRoomInfo.dwRoomNum);
std::string strShareRule = strRoomID + m_strGameRuleInfo + StringUtils::format("人数: %d/%d", getCurPlayerCount(), SSS_GAME_PLAYER);
MissionWeiXin::Instance().shareUrlWeiXin(strUrlInfo, utility::a_u8(m_strGameTitle), utility::a_u8(strShareRule));
//SelectShareScene::Instance().shareRoomInfo(strUrlInfo, strUTFGameTitle, strShareRule, 0);
}
//重选按钮被点击;
void SSSGameScene::onRechooseButtonClick(Ref* pSender)
{
Button* pBtn = (Button*)pSender;
int nIndex = pBtn->getTag();
CC_ASSERT(nIndex<SSS_GROUP_COUNT);
playBtnClickEffect();
if (_aryTricksCardPanel[nIndex]->getChildrenCount() == 0)
{
return;
}
log("reset----%d", nIndex);
_aryTricksCardPanel[nIndex]->removeAllChildren();
uint8 aryCardData[SSS_MAX_COUNT] = { 0 };
uint8 cbCardCount = _OperateCardPanel->getHandCardData(aryCardData, sizeof(aryCardData));
int nItemCount = nIndex > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT;
for (int j = 0; j < nItemCount; j++)
{
if (0 == nIndex)
{
aryCardData[cbCardCount++] = _aryTricksFrontCard[j];
_aryTricksFrontCard[j] = 0;
}
else if (1 == nIndex)
{
aryCardData[cbCardCount++] = _aryTricksMidCard[j];
_aryTricksMidCard[j] = 0;
}
else if (2 == nIndex)
{
aryCardData[cbCardCount++] = _aryTricksBackCard[j];
_aryTricksBackCard[j] = 0;
}
if (cbCardCount >= SSS_MAX_COUNT)
{
break;
}
}
m_GameLogic.SortCardList(aryCardData, cbCardCount);
_OperateCardPanel->showHandCard(aryCardData, cbCardCount);
_OperateCardPanel->setVisible(true);
_arySprCardType[nIndex]->setVisible(false);
_aryButtonRechoose[nIndex]->setEnabled(false);
_arySprCardShadow[nIndex]->setVisible(false);
_btnCompare->setVisible(false);
_btnReset->setVisible(false);
m_AnalyseType = m_GameLogic.GetType(aryCardData, cbCardCount);
updateCardTypeButtons();
}
//面板触摸事件;
void SSSGameScene::onPanelTouchEvent(Ref* pSender, Widget::TouchEventType iEventType)
{
Layout* panel = (Layout*)pSender;
int nIndex = panel->getTag();
CC_ASSERT(nIndex<SSS_GROUP_COUNT);
if (iEventType == Widget::TouchEventType::BEGAN)
{
playBtnClickEffect();
if (_aryTricksCardPanel[nIndex]->getChildrenCount() >0)
{
return;
}
log("set card data ----%d", nIndex);
uint8 aryCardData[SSS_MAX_COUNT] = { 0 };
uint8 cbCardCount = 0;
_OperateCardPanel->getShootCardData(aryCardData, cbCardCount, sizeof(aryCardData));
int nItemCount = nIndex > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT;
//bool bRet = checkCardPutRule();
if (cbCardCount == nItemCount)
{
addTricksCard(nIndex, aryCardData, cbCardCount);
zeromemory(aryCardData, sizeof(aryCardData));
cbCardCount = 0;
_OperateCardPanel->getDownCardData(aryCardData, cbCardCount, sizeof(aryCardData));
_OperateCardPanel->showHandCard(aryCardData, cbCardCount);
m_AnalyseType = m_GameLogic.GetType(aryCardData, cbCardCount);
updateCardTypeButtons();
}
else
{
return;
}
onChooseFinished();
}
else if(iEventType == Widget::TouchEventType::ENDED)
{
uint8 aryCardData[SSS_MAX_COUNT] = { 0 };
uint8 cbCardCount = 0;
_OperateCardPanel->getDownCardData(aryCardData, cbCardCount, sizeof(aryCardData));
//当还剩下3张牌时自动被填充到空面板处;
if (SSS_MIN_ITEM_COUNT == cbCardCount || SSS_MAX_ITEM_COUNT == cbCardCount)
{
int nNullIndex = -1;
for (int i = 0; i < SSS_GROUP_COUNT; i++)
{
if (_aryTricksCardPanel[i]->getChildrenCount() == 0)
{
nNullIndex = i;
break;
}
}
//bool bRet = checkCardPutRule();
if (nNullIndex >= 0)
{
int nItemCount = nNullIndex > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT;
addTricksCard(nNullIndex, aryCardData, nItemCount);
//清空手牌面板;
_OperateCardPanel->showHandCard(nullptr, 0);
disableCardTypeButtons();
onChooseFinished();
}
}
}
}
//抢注按钮点击事件;
void SSSGameScene::onRobYesButtonClick(Ref* pSender)
{
SSS_CMD_C_RobBanker mRob;
mRob.bRob = true;
SendSocketData(SSS_SUB_C_ROB_BANKER, &mRob, sizeof(SSS_CMD_C_RobBanker));
}
//抢注按钮点击事件;
void SSSGameScene::onRobNoButtonClick(Ref* pSender)
{
SSS_CMD_C_RobBanker mRob;
mRob.bRob = false;
SendSocketData(SSS_SUB_C_ROB_BANKER, &mRob, sizeof(SSS_CMD_C_RobBanker));
}
//压注按钮点击事件;
void SSSGameScene::onYaZhuButtonClick(Ref* pSender)
{
_YaZhuPanel->setVisible(false);
Button* pBtn = (Button*)pSender;
int nScore = __min(5, __max(3, pBtn->getTag()));
SSS_CMD_C_ChipScore ChipScore = {0};
ChipScore.lScore = nScore;
SendSocketData(SSS_SUB_C_CHIP_SCORE, &ChipScore, sizeof(ChipScore));
}
//不摆特殊牌按钮点击事件;
void SSSGameScene::onRefuseCardsButtonClick(Ref* pSender)
{
_SendCardPanel->setVisible(false);
_SendCardPanel->removeAllChildren();
showSpecialPanel(false);
showOperatePanel(true);
}
//确定特殊牌按钮点击事件;
void SSSGameScene::onCommitSpecialButtonClick(Ref* pSender)
{
_SendCardPanel->setVisible(false);
_SendCardPanel->removeAllChildren();
showSpecialPanel(false);
SSS_CMD_C_OpenCard mOpenCard;
zeromemory(&mOpenCard, sizeof(SSS_CMD_C_OpenCard));
mOpenCard.wSpecialType = _wSelfSpecialType;
SendSocketData(SSS_SUB_C_OPEN_CARD, &mOpenCard, sizeof(SSS_CMD_C_OpenCard));
}
//一对;
void SSSGameScene::onDuiZiButtonClick(Ref* pSender)
{
uint8 aryShootIndex[2] = {0};
uint8 cbCardCount = 2;
for (uint8 i = 0; i < 20; i++)
{
if (false==m_AnalyseType.bbOnePare[i])
{
if (m_AnalyseType.cbOnePare[i * 2] == 0 && m_AnalyseType.cbOnePare[i * 2 + 1] == 0)
{
zeromemory(m_AnalyseType.bbOnePare, sizeof(m_AnalyseType.bbOnePare));
i = 0;
}
aryShootIndex[0] = m_AnalyseType.cbOnePare[i * 2];
aryShootIndex[1] = m_AnalyseType.cbOnePare[i * 2 + 1];
_OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount);
m_AnalyseType.bbOnePare[i] = true;
break;
}
}
}
//两对;
void SSSGameScene::onLiangDuiButtonClick(Ref* pSender)
{
uint8 aryShootIndex[4] = { 0 };
uint8 cbCardCount = 4;
for (uint8 i = 0; i < 20; i++)
{
if (false == m_AnalyseType.bbTwoPare[i])
{
if (m_AnalyseType.cbTwoPare[i * 4] == 0 && m_AnalyseType.cbTwoPare[i * 4 + 1] == 0)
{
zeromemory(m_AnalyseType.bbTwoPare, sizeof(m_AnalyseType.bbTwoPare));
i = 0;
}
aryShootIndex[0] = m_AnalyseType.cbTwoPare[i * 4];
aryShootIndex[1] = m_AnalyseType.cbTwoPare[i * 4 + 1];
aryShootIndex[2] = m_AnalyseType.cbTwoPare[i * 4 + 2];
aryShootIndex[3] = m_AnalyseType.cbTwoPare[i * 4 + 3];
_OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount);
m_AnalyseType.bbTwoPare[i] = true;
break;
}
}
}
//三条;
void SSSGameScene::onSanTiaoButtonClick(Ref* pSender)
{
uint8 aryShootIndex[3] = { 0 };
uint8 cbCardCount = 3;
for (uint8 i = 0; i < 20; i++)
{
if (false == m_AnalyseType.bbThreeSame[i])
{
if (m_AnalyseType.cbThreeSame[i * 3] == 0 && m_AnalyseType.cbThreeSame[i * 3 + 1] == 0)
{
zeromemory(m_AnalyseType.bbThreeSame, sizeof(m_AnalyseType.bbThreeSame));
i = 0;
}
aryShootIndex[0] = m_AnalyseType.cbThreeSame[i * 3];
aryShootIndex[1] = m_AnalyseType.cbThreeSame[i * 3 + 1];
aryShootIndex[2] = m_AnalyseType.cbThreeSame[i * 3 + 2];
_OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount);
m_AnalyseType.bbThreeSame[i] = true;
break;
}
}
}
//顺子;
void SSSGameScene::onShunZiButtonClick(Ref* pSender)
{
uint8 aryShootIndex[5] = { 0 };
uint8 cbCardCount = 5;
for (uint8 i = 0; i < 20; i++)
{
if (false == m_AnalyseType.bbStraight[i])
{
if (m_AnalyseType.cbStraight[i * 5] == 0 && m_AnalyseType.cbStraight[i * 5 + 1] == 0)
{
zeromemory(m_AnalyseType.bbStraight, sizeof(m_AnalyseType.bbStraight));
i = 0;
}
aryShootIndex[0] = m_AnalyseType.cbStraight[i * 5];
aryShootIndex[1] = m_AnalyseType.cbStraight[i * 5 + 1];
aryShootIndex[2] = m_AnalyseType.cbStraight[i * 5 + 2];
aryShootIndex[3] = m_AnalyseType.cbStraight[i * 5 + 3];
aryShootIndex[4] = m_AnalyseType.cbStraight[i * 5 + 4];
_OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount);
m_AnalyseType.bbStraight[i] = true;
break;
}
}
}
//同花;
void SSSGameScene::onTongHuaButtonClick(Ref* pSender)
{
uint8 aryShootIndex[5] = { 0 };
uint8 cbCardCount = 5;
for (uint8 i = 0; i < 20; i++)
{
if (false == m_AnalyseType.bbFlush[i])
{
if (m_AnalyseType.cbFlush[i * 5] == 0 && m_AnalyseType.cbFlush[i * 5 + 1] == 0)
{
zeromemory(m_AnalyseType.bbFlush, sizeof(m_AnalyseType.bbFlush));
i = 0;
}
aryShootIndex[0] = m_AnalyseType.cbFlush[i * 5];
aryShootIndex[1] = m_AnalyseType.cbFlush[i * 5 + 1];
aryShootIndex[2] = m_AnalyseType.cbFlush[i * 5 + 2];
aryShootIndex[3] = m_AnalyseType.cbFlush[i * 5 + 3];
aryShootIndex[4] = m_AnalyseType.cbFlush[i * 5 + 4];
_OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount);
m_AnalyseType.bbFlush[i] = true;
break;
}
}
}
//葫芦;
void SSSGameScene::onHuLuButtonClick(Ref* pSender)
{
uint8 aryShootIndex[5] = { 0 };
uint8 cbCardCount = 5;
for (uint8 i = 0; i < 20; i++)
{
if (false == m_AnalyseType.bbGourd[i])
{
if (m_AnalyseType.cbGourd[i * 5] == 0 && m_AnalyseType.cbGourd[i * 5 + 1] == 0)
{
zeromemory(m_AnalyseType.bbGourd, sizeof(m_AnalyseType.bbGourd));
i = 0;
}
aryShootIndex[0] = m_AnalyseType.cbGourd[i * 5];
aryShootIndex[1] = m_AnalyseType.cbGourd[i * 5 + 1];
aryShootIndex[2] = m_AnalyseType.cbGourd[i * 5 + 2];
aryShootIndex[3] = m_AnalyseType.cbGourd[i * 5 + 3];
aryShootIndex[4] = m_AnalyseType.cbGourd[i * 5 + 4];
_OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount);
m_AnalyseType.bbGourd[i] = true;
break;
}
}
}
//铁支;
void SSSGameScene::onTieZhiButtonClick(Ref* pSender)
{
uint8 aryShootIndex[4] = { 0 };
uint8 cbCardCount = 4;
for (uint8 i = 0; i < 20; i++)
{
if (false == m_AnalyseType.bbFourSame[i])
{
if (m_AnalyseType.cbFourSame[i * 4] == 0 && m_AnalyseType.cbFourSame[i * 4 + 1] == 0)
{
zeromemory(m_AnalyseType.bbFourSame, sizeof(m_AnalyseType.bbFourSame));
i = 0;
}
aryShootIndex[0] = m_AnalyseType.cbFourSame[i * 4];
aryShootIndex[1] = m_AnalyseType.cbFourSame[i * 4 + 1];
aryShootIndex[2] = m_AnalyseType.cbFourSame[i * 4 + 2];
aryShootIndex[3] = m_AnalyseType.cbFourSame[i * 4 + 3];
_OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount);
m_AnalyseType.bbFourSame[i] = true;
break;
}
}
}
//同花顺;
void SSSGameScene::onTongHuaShunButtonClick(Ref* pSender)
{
uint8 aryShootIndex[5] = { 0 };
uint8 cbCardCount = 5;
for (uint8 i = 0; i < 20; i++)
{
if (false == m_AnalyseType.bbStraightFlush[i])
{
if (m_AnalyseType.cbStraightFlush[i * 5] == 0 && m_AnalyseType.cbStraightFlush[i * 5 + 1] == 0)
{
zeromemory(m_AnalyseType.bbStraightFlush, sizeof(m_AnalyseType.bbStraightFlush));
i = 0;
}
aryShootIndex[0] = m_AnalyseType.cbStraightFlush[i * 5];
aryShootIndex[1] = m_AnalyseType.cbStraightFlush[i * 5 + 1];
aryShootIndex[2] = m_AnalyseType.cbStraightFlush[i * 5 + 2];
aryShootIndex[3] = m_AnalyseType.cbStraightFlush[i * 5 + 3];
aryShootIndex[4] = m_AnalyseType.cbStraightFlush[i * 5 + 4];
_OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount);
m_AnalyseType.bbStraightFlush[i] = true;
break;
}
}
}
// 开始发牌;
void SSSGameScene::startSendCardAni()
{
_SendCardPanel->setVisible(true);
_SendCardPanel->removeAllChildren();
float fActionTime = 0.12f;
float fInitX = _SendCardPanel->getContentSize().width;
float fTargetX = (SSS_MAX_COUNT==_cbSendCardCount) ? 0.f : 200.f;
float fDelaySendTime = 0.01f;
for (int i = 0; i < _cbSendCardCount; i++)
{
SSSBigCardSprite* pCardSprite = SSSBigCardSprite::create(_aryHandCardData[i]);
pCardSprite->setPositionX(fInitX);
pCardSprite->setPositionY(30.f);
pCardSprite->setScale(0.5f);
_SendCardPanel->addChild(pCardSprite);
auto pAction = Spawn::create(MoveTo::create(fActionTime, Vec2(fTargetX, 0.f)), ScaleTo::create(fActionTime, 1.0f), nullptr);
pCardSprite->runAction(Sequence::create(DelayTime::create(fDelaySendTime), pAction, nullptr));
fTargetX += 56.f;
fDelaySendTime += 0.05f;
}
playSendCardEffect();
auto callback = [=]() {
if ((m_PrivateRoomInfo.bGameRuleIdex&eSSSGameRuleClassic)>0)
{
uint8 aryFrontCard[SSS_MIN_ITEM_COUNT] = { 0 };
uint8 aryMidCard[SSS_MAX_ITEM_COUNT] = { 0 };
uint8 aryBackCard[SSS_MAX_ITEM_COUNT] = { 0 };
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
if (SSS_HAND_STATUS_NULL == _aryActiveStatus[i])
{
continue;
}
uint16 wViewID = SwitchViewChairID(i);
m_aryPlayer[wViewID]->showCard(aryFrontCard, aryMidCard, aryBackCard, SSS_HAND_STATUS_DISORDER, true);
}
}
sendSendCardOverMsg();
};
_SendCardPanel->runAction(Sequence::create(DelayTime::create(fActionTime + fDelaySendTime), CallFunc::create(callback), nullptr));
}
// 开始比牌;
void SSSGameScene::startCompareCardAni()
{
uint8 cbGamePlayerCount = 0;
uint8 cbSpecialTypeCount = 0;
for (uint16 i = 0; i < SSS_GAME_PLAYER; i++)
{
if (SSS_HAND_STATUS_NULL == _aryActiveStatus[i])
{
continue;
}
cbGamePlayerCount++;
if (SSS_CT_INVALID != _arySpecialType[i])
{
cbSpecialTypeCount++;
}
}
if (cbGamePlayerCount != cbSpecialTypeCount)
{
oneGroupFinished();
}
else
{
checkSpecialTypeAni();
}
}
// 动画回调;
void SSSGameScene::movementEventCallFunc(cocostudio::Armature *armature, cocostudio::MovementEventType movementType, const std::string& movementID)
{
// 播放完成;
if (movementType == cocostudio::COMPLETE)
{
if ("GameStart2" == movementID)
{
// 发牌动画;
startSendCardAni();
_pArmatureStart->setVisible(false);
}
else if ("GameStart1" == movementID)
{
startCompareCardAni();
_pArmatureStart->setVisible(false);
}
else if ("KillAlleffect" == movementID)
{
_pArmaAllKillEffect->setVisible(false);
killAllAniFinished();
}
}
}
void SSSGameScene::addTricksCard(int nIndex, uint8 aryCardData[SSS_MAX_ITEM_COUNT], uint8 cbCardCount)
{
CC_ASSERT(nIndex<SSS_GROUP_COUNT);
int nItemCount = nIndex > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT;
uint8 cbTmpCardData[SSS_MAX_ITEM_COUNT] = { 0 };
if (false==cardTypeTo32A(aryCardData, nItemCount, cbTmpCardData, nItemCount))
{
memcpy(cbTmpCardData, aryCardData, cbCardCount);
}
uint8* pTrickCard = nullptr;
if (0 == nIndex)
{
memcpy(_aryTricksFrontCard, cbTmpCardData, SSS_MIN_ITEM_COUNT*sizeof(uint8));
pTrickCard = _aryTricksFrontCard;
}
else if (1 == nIndex)
{
memcpy(_aryTricksMidCard, cbTmpCardData, SSS_MAX_ITEM_COUNT*sizeof(uint8));
pTrickCard = _aryTricksMidCard;
}
else if (2 == nIndex)
{
memcpy(_aryTricksBackCard, cbTmpCardData, SSS_MAX_ITEM_COUNT*sizeof(uint8));
pTrickCard = _aryTricksBackCard;
}
_aryTricksCardPanel[nIndex]->removeAllChildren();
int iHandCardSpace = 0;
for (int i = 0; i<nItemCount; i++)
{
SSSBigCardSprite* pCardSprite = SSSBigCardSprite::create(pTrickCard[i]);
if (0==iHandCardSpace)
{
const Size& cardSize = _aryTricksCardPanel[nIndex]->getContentSize();
iHandCardSpace = (cardSize.width - pCardSprite->getContentSize().width) / (nItemCount - 1);
}
pCardSprite->setPosition(i * iHandCardSpace, 0);
_aryTricksCardPanel[nIndex]->addChild(pCardSprite);
}
uint8 cbCardType = m_GameLogic.GetCardType(aryCardData, nItemCount, m_GameLogic.btCardSpecialData);
if (cbCardType>0)
{
std::string strPath = C13SGameLogic::getCardTypeImagePath(cbCardType);
if (strPath.size()>0)
{
_arySprCardType[nIndex]->setTexture(strPath);
_arySprCardType[nIndex]->setVisible(true);
}
else
{
_arySprCardType[nIndex]->setVisible(false);
}
}
_aryButtonRechoose[nIndex]->setEnabled(true);
if (nIndex < 1)
{
_arySprCardShadow[0]->setVisible(false);
}
else
{
_arySprCardShadow[1]->setVisible(false);
_arySprCardShadow[2]->setVisible(false);
}
}
bool SSSGameScene::inTricksCardPanel(int nIndex, uint8 cbCardData)
{
CC_ASSERT(nIndex<SSS_GROUP_COUNT);
int nItemCount = nIndex > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT;
uint8* pTrickCard = nullptr;
if (0 == nIndex)
{
pTrickCard = _aryTricksFrontCard;
}
else if (1 == nIndex)
{
pTrickCard = _aryTricksMidCard;
}
else if (2 == nIndex)
{
pTrickCard = _aryTricksBackCard;
}
else
{
return false;
}
for (int i = 0; i < nItemCount; i++)
{
if (pTrickCard[i] == cbCardData)
{
return true;
}
}
return false;
}
void SSSGameScene::onChooseFinished()
{
int nTricksCount = 0;
for (int n = 0; n < SSS_GROUP_COUNT; n++)
{
nTricksCount += _aryTricksCardPanel[n]->getChildrenCount();
}
if (nTricksCount == SSS_MAX_COUNT)
{
_btnCompare->setVisible(true);
_OperateCardPanel->setVisible(false);
_btnReset->setVisible(true);
}
}
void SSSGameScene::oneGroupFinished()
{
if (_cbCurOpenCardAniIndex >= 3)
{
m_GameOverAni->showAnimation(CC_CALLBACK_1(SSSGameScene::oneShootFinished, this));
}
else
{
bool bSetCallback = false;
for (uint16 i = 0; i < SSS_GAME_PLAYER; i++)
{
if ((_aryActiveStatus[i] != SSS_HAND_STATUS_NULL)&&(SSS_CT_INVALID==_arySpecialType[i]))
{
uint16 wViewID = SwitchViewChairID(i);
bool bPlaySubScore = (i != _wBankerUser);
if (false==bSetCallback)
{
m_aryPlayer[wViewID]->playScoreAni(_cbCurOpenCardAniIndex, CC_CALLBACK_0(SSSGameScene::oneGroupFinished, this), true, bPlaySubScore);
bSetCallback = true;
}
else
{
m_aryPlayer[wViewID]->playScoreAni(_cbCurOpenCardAniIndex, nullptr, false, (i != _wBankerUser));
}
}
}
_cbCurOpenCardAniIndex++;
}
}
void SSSGameScene::oneShootFinished(tagSSSTwoGunInfos* pGunInfos)
{
if (nullptr==pGunInfos)
{
checkSpecialTypeAni();
}
else
{
uint16 wLoserViewID = pGunInfos->pLoserInfo->wViewID;
m_aryPlayer[wLoserViewID]->playSubScoreAni(1, pGunInfos->pLoserInfo->nScore);
uint16 wWinnerViewID = pGunInfos->pWinnerInfo->wViewID;
m_aryPlayer[wWinnerViewID]->playSubScoreAni(1, pGunInfos->pWinnerInfo->nScore, CC_CALLBACK_0(SSSGameScene::shootScoreAniFinished, this));
}
}
//打枪加分动画结束;
void SSSGameScene::shootScoreAniFinished()
{
tagSSSTwoGunInfos* pTmpGunInfo = m_GameOverAni->getNoPlayInfo();
if (nullptr == pTmpGunInfo)
{
checkSpecialTypeAni();
}
else
{
m_GameOverAni->showAnimation(CC_CALLBACK_1(SSSGameScene::oneShootFinished, this));
}
}
void SSSGameScene::checkSpecialTypeAni()
{
uint8 cbSpecialTypeCount = 0;
for (uint16 i = 0; i < SSS_GAME_PLAYER; i++)
{
if (SSS_HAND_STATUS_NULL == _aryActiveStatus[i])
{
continue;
}
if (SSS_CT_INVALID != _arySpecialType[i])
{
cbSpecialTypeCount++;
}
}
if (cbSpecialTypeCount>0)
{
for (uint16 i = 0; i < SSS_GAME_PLAYER; i++)
{
if (SSS_HAND_STATUS_NULL == _aryActiveStatus[i])
{
continue;
}
uint16 wViewID = SwitchViewChairID(i);
if (SSS_VIEW_SELF_ID == wViewID)
{
m_aryPlayer[wViewID]->playSubScoreAni(1, _arySpecialCompareResult[i], CC_CALLBACK_0(SSSGameScene::specialTypeAniFinished, this));
}
else
{
m_aryPlayer[wViewID]->playSubScoreAni(1, _arySpecialCompareResult[i]);
}
if (_arySpecialType[i] != SSS_CT_INVALID)
{
m_aryPlayer[wViewID]->showSepShadow(false);
m_aryPlayer[wViewID]->showCardType(_arySpecialType[i]);
playSpecialTypeEffect(m_aryPlayer[wViewID]->GetGender(), _arySpecialType[i]);
}
}
}
else
{
sendCompareOverMsg();
}
}
//特殊牌动画播放完成;
void SSSGameScene::specialTypeAniFinished()
{
checkKillAllAni();
}
void SSSGameScene::checkKillAllAni()
{
if (INVALID_CHAIR==_wKillAllUserChairID)
{
sendCompareOverMsg();
}
else
{
ArmatureAnimation* pAniKillAll = _pArmaAllKillEffect->getAnimation();
if (pAniKillAll != nullptr)
{
pAniKillAll->play("KillAlleffect", -1, 0);
_pArmaAllKillEffect->setVisible(true);
}
}
}
//全垒打动画播放完成;
void SSSGameScene::killAllAniFinished()
{
for (uint16 i = 0; i < SSS_GAME_PLAYER; i++)
{
if (SSS_HAND_STATUS_NULL == _aryActiveStatus[i])
{
continue;
}
uint16 wViewID = SwitchViewChairID(i);
if (SSS_VIEW_LEFT_ID == wViewID)
{
m_aryPlayer[wViewID]->playSubScoreAni(1, _aryThreeKillResult[i], CC_CALLBACK_0(SSSGameScene::sendCompareOverMsg, this));
}
else
{
m_aryPlayer[wViewID]->playSubScoreAni(1, _aryThreeKillResult[i]);
}
}
}
//更新牌类型按钮状态;
void SSSGameScene::updateCardTypeButtons()
{
_btnDuiZi->setEnabled(m_AnalyseType.bOnePare);
_btnLiangDui->setEnabled(m_AnalyseType.bTwoPare);
_btnSanTiao->setEnabled(m_AnalyseType.bThreeSame);
_btnShunZi->setEnabled(m_AnalyseType.bStraight);
_btnTongHua->setEnabled(m_AnalyseType.bFlush);
_btnHuLu->setEnabled(m_AnalyseType.bGourd);
_btnTieZhi->setEnabled(m_AnalyseType.bFourSame);
_btnTongHuaShun->setEnabled(m_AnalyseType.bStraightFlush);
}
//禁用牌类型按钮状态;
void SSSGameScene::disableCardTypeButtons()
{
_btnDuiZi->setEnabled(false);
_btnLiangDui->setEnabled(false);
_btnSanTiao->setEnabled(false);
_btnShunZi->setEnabled(false);
_btnTongHua->setEnabled(false);
_btnHuLu->setEnabled(false);
_btnTieZhi->setEnabled(false);
_btnTongHuaShun->setEnabled(false);
}
//游戏结束;
void SSSGameScene::onSubGameEnd(const void * pBuffer, uint16 wDataSize)
{
//校验数据;
CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_GameEnd));
SSS_CMD_S_GameEnd* pGameEnd = (SSS_CMD_S_GameEnd*)pBuffer;
_txtTip->setString("");
uint16 wSelfChairID = getSelfChairID();
SCORE lMyResultScore = pGameEnd->lGameScore[wSelfChairID];
if (false==m_IsGameRecord)
{
if (pGameEnd->isPrivateEnd)
{
_btnReady->setVisible(false);
_btnPrivateEnd->setVisible(true);
}
else
{
_btnReady->setVisible(true);
_btnPrivateEnd->setVisible(false);
}
}
else
{
_btnReady->setVisible(false);
_btnPrivateEnd->setVisible(false);
}
_ResultPanel->setVisible(true);
ArmatureAnimation* pAniResult = _pArmatureResult->getAnimation();
if (pAniResult != nullptr)
{
if (lMyResultScore > 0)
{
pAniResult->play("Win", -1, 0);
playEffect("Win");
}
else if (lMyResultScore < 0)
{
pAniResult->play("Lose", -1, 0);
playEffect("Loss");
}
else
{
pAniResult->play("Draw", -1, 0);
}
_pArmatureResult->setVisible(true);
}
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
if (_aryActiveStatus[i] != SSS_HAND_STATUS_NULL)
{
uint16 wViewID = SwitchViewChairID(i);
SCORE lTotalScore = pGameEnd->lGameScore[i];
playResultScoreAni(wViewID, lTotalScore, 0);
}
}
}
//用户进入;
void SSSGameScene::OnEventUserEnter(GamePlayer * pPlayer)
{
if (pPlayer->GetChairID() == getSelfChairID())
{
//更新准备按钮状态;
uint8 cbUserStatus = pPlayer->GetUserStatus();
if (cbUserStatus >= US_READY || _cbGameStatus>SSS_GS_WK_FREE)
{
_btnStartGame->setEnabled(false);
//_ResultPanel->setVisible(false);
}
else
{
//_btnStartGame->setVisible(true);
}
}
}
//玩家状态改变;
void SSSGameScene::OnEventUserStatus(GamePlayer * pPlayer)
{
OnEventUserEnter(pPlayer);
}
//选牌回调;
void SSSGameScene::selectCardCallback(uint8* arySelCardData, uint8 cbSelCardCount)
{
uint8 aryShootCardData[SSS_MAX_COUNT] = { 0 };
uint8 cbShootCardCount = 0;
_OperateCardPanel->getShootCardData(aryShootCardData, cbShootCardCount, SSS_MAX_COUNT);
if (3==cbShootCardCount)
{
if (0==_aryTricksCardPanel[0]->getChildrenCount())
{
_arySprCardShadow[0]->setVisible(true);
}
}
else if (5 == cbShootCardCount)
{
for (uint8 i = 1; i < SSS_GROUP_COUNT; i++)
{
if (0 == _aryTricksCardPanel[i]->getChildrenCount())
{
_arySprCardShadow[i]->setVisible(true);
}
}
}
else
{
for (uint8 i = 0; i < SSS_GROUP_COUNT; i++)
{
_arySprCardShadow[i]->setVisible(false);
}
}
}
// 播放结束积分动画;
void SSSGameScene::playResultScoreAni(int nIndex, SCORE lScore, SCORE lXinScore)
{
CC_ASSERT(nIndex < SSS_GAME_PLAYER);
auto pAction1 = ScaleTo::create(0.15f, 0.8f);
auto pAction2 = ScaleTo::create(0.18f, 1.5f);
auto pAction3 = ScaleTo::create(0.12f, 1.2f);
TextAtlas* txtResult = _pTxtResultScore[nIndex];
//TextAtlas* txtXin = _pTxtXinScore[nIndex];
//if (0 != lXinScore)
//{
// txtXin->setVisible(true);
// txtXin->setScale(0);
// if (lXinScore >= 0)
// {
// txtXin->setString(StringUtils::format(".%d", lXinScore));
// }
// else
// {
// txtXin->setString(StringUtils::format("/%d", std::abs(lXinScore)));
// }
// txtXin->runAction(Sequence::create(pAction1->clone(), pAction2->clone(), pAction3->clone(), nullptr));
//}
//else
//{
// txtXin->setVisible(false);
//}
if (0 != lScore)
{
txtResult->setVisible(true);
txtResult->setScale(0);
if (lScore >= 0)
{
txtResult->setProperty(StringUtils::format("/%d", lScore), "Games/13S/Table/imgPositiveFont.png", 26, 35, "/");
}
else
{
txtResult->setProperty(StringUtils::format("/%d", std::abs(lScore)), "Games/13S/Table/imgNegativeFont.png", 26, 35, "/");
}
txtResult->runAction(Sequence::create(pAction1, pAction2, pAction3, nullptr));
}
else
{
txtResult->setVisible(false);
}
}
void SSSGameScene::showAllPlayersCard()
{
for (int i = 0; i<SSS_GAME_PLAYER; i++ )
{
if (_aryActiveStatus[i]!=SSS_HAND_STATUS_NULL)
{
uint16 wViewID = SwitchViewChairID(i);
m_aryPlayer[wViewID]->showCard(_aryFrontCard[i], _aryMidCard[i], _aryBackCard[i], _aryActiveStatus[i], true);
}
}
}
void SSSGameScene::openClock(Sprite* sprClock, int iLeftTime, const std::function<void()>& callFunc/* = nullptr*/)
{
sprClock->setVisible(true);
sprClock->stopAllActions();
TextAtlas* txtClockNum = static_cast<TextAtlas*>(sprClock->getChildByName("txtClockNum"));
txtClockNum->setString(StringUtils::format("%02d", iLeftTime));
txtClockNum->setTag(iLeftTime);
auto callback = [=]() {
int iTime = __max(txtClockNum->getTag(), 0);
txtClockNum->setString(StringUtils::format("%02d", iTime--));
txtClockNum->setTag(iTime);
if (iTime == 3)
{
sprClock->runAction(RepeatForever::create(JumpBy::create(0.9f, Vec2(0, 0), 20, 3)));
}
if (iTime == 0)
{
//sprClock->stopAllActions();
if (callFunc != nullptr)
{
callFunc();
}
}
};
sprClock->runAction(RepeatForever::create(Sequence::create(DelayTime::create(1.0f), CallFunc::create(callback), nullptr)));
}
void SSSGameScene::closeClock(Sprite* sprClock)
{
sprClock->stopAllActions();
sprClock->setVisible(false);
}
//玩家金币改变;
void SSSGameScene::OnUserScore(GamePlayer* pPlayer)
{
CC_ASSERT(pPlayer!=nullptr);
if (pPlayer == nullptr) return;
// 不再桌子上;
CC_ASSERT(pPlayer->GetTableID() != INVALID_TABLE && pPlayer->GetChairID() != INVALID_CHAIR);
if (pPlayer->GetTableID() == INVALID_TABLE || pPlayer->GetChairID() == INVALID_CHAIR) return;
// 不是同一桌子玩家;
CC_ASSERT(pPlayer->GetTableID() == getSelfGamePlayer()->GetTableID());
if (pPlayer->GetTableID() != getSelfGamePlayer()->GetTableID()) return;
cocos2d::log(a_u8c("用户%sscore = %d"), pPlayer->GetNickName().c_str(), pPlayer->GetUserScore());
((SSS_GamePlayer*)pPlayer)->updateScore();
}
// 玩家坐标;
Vec2 SSSGameScene::GetPlayerPosByUserID(uint32 dwUserID)
{
SSS_GamePlayer* pPlayer = (SSS_GamePlayer*)getPlayerByUserID(dwUserID);
if (pPlayer == nullptr)
{
return Vec2();
}
//const Vec2& ptHeadPos = pPlayer->getHeadPos();
//Vec2 ptWorldPos = pPlayer->convertToWorldSpace(ptHeadPos);
return pPlayer->getHeadPos();
}
//调用;
GamePlayer* SSSGameScene::CreatePlayer(IClientUserItem * pIClientUserItem)
{
if (pIClientUserItem->GetChairID() == INVALID_CHAIR)
{
return NULL;
}
if (pIClientUserItem->GetUserID() == UserInfo::Instance().getUserID())
{
m_pLocalPlayer->setUserItem(pIClientUserItem);
return m_pLocalPlayer;
}
else
{
WORD wViewID = SwitchViewChairID(pIClientUserItem->GetChairID());
CC_ASSERT(wViewID!=INVALID_CHAIR);
SSS_GamePlayer* pPlayer = m_aryPlayer[wViewID];
pPlayer->setUserItem(pIClientUserItem);
return pPlayer;
}
return NULL;
}
//椅子号视图转换;
WORD SSSGameScene::SwitchViewChairID(WORD wChairID)
{
//参数判断;
if (wChairID == INVALID_CHAIR) return INVALID_CHAIR;
WORD wSelfChairID = getSelfChairID();
if (wSelfChairID == INVALID_CHAIR) return INVALID_CHAIR;
//转换椅子;
WORD wChairCount = SSS_GAME_PLAYER;
WORD wViewChairID = (wChairID + wChairCount - wSelfChairID + SSS_VIEW_SELF_ID) % wChairCount;
return wViewChairID;
}
//本人进入游戏 GameFrameBase.cpp调用;
void SSSGameScene::upSelfPlayerInfo()
{
log("Self Enter!!");
return;
}
//牌型A32转32A;
bool SSSGameScene::cardTypeTo32A(const uint8 arySrcCardData[SSS_MIN_ITEM_COUNT], const uint8 cbCardCount, uint8* aryTargetCardData, const uint8 cbTargetCardCount)
{
CC_ASSERT(cbCardCount >= SSS_MIN_ITEM_COUNT && cbCardCount == cbTargetCardCount);
if (cbCardCount<SSS_MIN_ITEM_COUNT || cbCardCount != cbTargetCardCount) return false;
zeromemory(aryTargetCardData, sizeof(BYTE)*cbTargetCardCount);
uint8 cbFirstCardValue = m_GameLogic.GetCardValue(arySrcCardData[0]);
uint8 cbLastCardValue = m_GameLogic.GetCardValue(arySrcCardData[cbCardCount-1]);
if (0x01==cbFirstCardValue && 0x02==cbLastCardValue)
{
uint8 cbCurCardValue = m_GameLogic.GetCardValue(arySrcCardData[1]);
for (uint8 i = 2; i < cbCardCount; i++)
{
uint8 cbTmpCardValue = m_GameLogic.GetCardValue(arySrcCardData[i]);
if (cbCurCardValue != (cbTmpCardValue+1))
{
break;
}
cbCurCardValue = cbTmpCardValue;
}
if (cbCurCardValue==cbLastCardValue)
{
aryTargetCardData[cbTargetCardCount - 1] = arySrcCardData[0];
for (uint8 i = 1; i < cbCardCount; i++)
{
aryTargetCardData[i-1] = arySrcCardData[i];
}
return true;
}
}
return false;
}
//检测扑克牌摆放规则;
bool SSSGameScene::checkCardPutRule()
{
bool bShowTip = false;
do
{
if (_aryTricksCardPanel[0]->getChildrenCount()>0 && _aryTricksCardPanel[1]->getChildrenCount() > 0)
{
// 首道比中道;
uint8 cbResult = m_GameLogic.CompareCard(_aryTricksFrontCard, _aryTricksMidCard, SSS_MIN_ITEM_COUNT, SSS_MAX_ITEM_COUNT, m_bClassicRule);
if (0 == cbResult)
{
bShowTip = true;
_aryTricksCardPanel[0]->removeAllChildren();
_aryTricksCardPanel[1]->removeAllChildren();
uint8 aryCardData[SSS_MAX_COUNT] = { 0 };
uint8 cbCardCount = _OperateCardPanel->getHandCardData(aryCardData, sizeof(aryCardData));
if ((cbCardCount + SSS_MIN_ITEM_COUNT) <= SSS_MAX_COUNT)
{
memcpy(&aryCardData[cbCardCount], _aryTricksFrontCard, SSS_MIN_ITEM_COUNT);
memset(_aryTricksFrontCard, 0, sizeof(_aryTricksFrontCard));
cbCardCount += SSS_MIN_ITEM_COUNT;
}
if ((cbCardCount + SSS_MAX_ITEM_COUNT) <= SSS_MAX_COUNT)
{
memcpy(&aryCardData[cbCardCount], _aryTricksMidCard, SSS_MAX_ITEM_COUNT);
memset(_aryTricksMidCard, 0, sizeof(_aryTricksMidCard));
cbCardCount += SSS_MAX_ITEM_COUNT;
}
m_GameLogic.SortCardList(aryCardData, cbCardCount);
_OperateCardPanel->showHandCard(aryCardData, cbCardCount);
_OperateCardPanel->setVisible(true);
_arySprCardType[0]->setVisible(false);
_arySprCardType[1]->setVisible(false);
_aryButtonRechoose[0]->setEnabled(false);
_aryButtonRechoose[1]->setEnabled(false);
_arySprCardShadow[0]->setVisible(false);
_arySprCardShadow[1]->setVisible(false);
_btnCompare->setVisible(false);
_btnReset->setVisible(false);
m_AnalyseType = m_GameLogic.GetType(aryCardData, cbCardCount);
updateCardTypeButtons();
break;
}
}
if (_aryTricksCardPanel[1]->getChildrenCount() > 0 && _aryTricksCardPanel[2]->getChildrenCount() > 0)
{
// 中道比尾道;
uint8 cbResult = m_GameLogic.CompareCard(_aryTricksMidCard, _aryTricksBackCard, SSS_MAX_ITEM_COUNT, SSS_MAX_ITEM_COUNT, m_bClassicRule);
if (0 == cbResult)
{
bShowTip = true;
_aryTricksCardPanel[1]->removeAllChildren();
_aryTricksCardPanel[2]->removeAllChildren();
uint8 aryCardData[SSS_MAX_COUNT] = { 0 };
uint8 cbCardCount = _OperateCardPanel->getHandCardData(aryCardData, sizeof(aryCardData));
if ((cbCardCount + SSS_MAX_ITEM_COUNT) <= SSS_MAX_COUNT)
{
memcpy(&aryCardData[cbCardCount], _aryTricksMidCard, SSS_MAX_ITEM_COUNT);
memset(_aryTricksMidCard, 0, sizeof(_aryTricksMidCard));
cbCardCount += SSS_MAX_ITEM_COUNT;
}
if ((cbCardCount + SSS_MAX_ITEM_COUNT) <= SSS_MAX_COUNT)
{
memcpy(&aryCardData[cbCardCount], _aryTricksBackCard, SSS_MAX_ITEM_COUNT);
memset(_aryTricksBackCard, 0, sizeof(_aryTricksBackCard));
cbCardCount += SSS_MAX_ITEM_COUNT;
}
m_GameLogic.SortCardList(aryCardData, cbCardCount);
_OperateCardPanel->showHandCard(aryCardData, cbCardCount);
_OperateCardPanel->setVisible(true);
_arySprCardType[1]->setVisible(false);
_arySprCardType[2]->setVisible(false);
_aryButtonRechoose[1]->setEnabled(false);
_aryButtonRechoose[2]->setEnabled(false);
_arySprCardShadow[1]->setVisible(false);
_arySprCardShadow[2]->setVisible(false);
_btnCompare->setVisible(false);
_btnReset->setVisible(false);
m_AnalyseType = m_GameLogic.GetType(aryCardData, cbCardCount);
updateCardTypeButtons();
break;
}
}
} while (false);
if (bShowTip)
{
// 缩放提示;
_imgQualifiedTips->setScale(0.5f);
auto actSeq = Sequence::create(Show::create(), EaseElasticOut::create(ScaleTo::create(0.5f, 1.0f)), DelayTime::create(2.0f), Hide::create(), nullptr);
_imgQualifiedTips->runAction(actSeq);
return false;
}
return true;
}
// 获取当前玩家数量;
uint8 SSSGameScene::getCurPlayerCount()
{
uint8 cbPlayerCount = 0;
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
GamePlayer* pPlayer = m_aryPlayer[i];
if (pPlayer != nullptr && pPlayer->getUserItem(false) != nullptr)
{
cbPlayerCount++;
}
}
return cbPlayerCount;
}
/************************************* 语音 ***********************************************************/
// 按住语音按钮;
void SSSGameScene::OnButtonVoiceTouched(Ref*, Widget::TouchEventType type)
{
if (Widget::TouchEventType::BEGAN == type)
{
// 暂停播放背景音乐;
CocosDenshion::SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
if (m_pVoiceNode->isVisible())
{
m_pVoiceNode->setVisible(false);
m_pVoiceNode->stopAllActions();
YvVoiceManager::GetInstance()->StopRecord();
return;
}
m_pVoiceNode->setVisible(true);
// 启动帧动画;
auto action = CSLoader::createTimeline("Games/13S/VoiceNode.csb");
action->gotoFrameAndPlay(0);
m_pVoiceNode->runAction(action);
YvVoiceManager::GetInstance()->StartRecord();
}
else if ((Widget::TouchEventType::CANCELED == type) || (Widget::TouchEventType::ENDED == type))
{
// 继续播放背景音乐;
CocosDenshion::SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
if (!m_pVoiceNode->isVisible())
{
return;
}
m_pVoiceNode->setVisible(false);
m_pVoiceNode->stopAllActions();
YvVoiceManager::GetInstance()->StopRecord();
}
}
//获到性别字符串;
std::string SSSGameScene::getUserGender(int cbGender)
{
if (cbGender == 0)
{
return "man";
}
return "woman";
}
//播放发牌声音;
void SSSGameScene::playSendCardEffect()
{
CocosDenshion::SimpleAudioEngine* pAudio = CocosDenshion::SimpleAudioEngine::getInstance();
pAudio->playEffect("Games/13S/Sound/deal.mp3");
}
// 播放特殊牌型声音;
void SSSGameScene::playSpecialTypeEffect(uint8 cbGender, uint8 cbCardType)
{
CocosDenshion::SimpleAudioEngine* pAudio = CocosDenshion::SimpleAudioEngine::getInstance();
std::string strCardTypePath = C13SGameLogic::getCardTypeSoundPath(cbGender, cbCardType);
log("the strAudioRes is== %s", strCardTypePath.c_str());
pAudio->playEffect(strCardTypePath.c_str());
}
//播放快捷语音;
void SSSGameScene::playFastVoice(int cbGender, int voiceIndex)
{
CocosDenshion::SimpleAudioEngine* pAudio = CocosDenshion::SimpleAudioEngine::getInstance();
std::string strGender = getUserGender(cbGender);
std::string strAudioRes = StringUtils::format("Games/13S/Sound/FastVoice/%s/%d.mp3", strGender.c_str(), voiceIndex);
log("the strAudioRes is== %s", strAudioRes.c_str());
pAudio->playEffect(strAudioRes.c_str());
}
//播放音效;
void SSSGameScene::playEffect(std::string strPath)
{
CocosDenshion::SimpleAudioEngine* pAudio = CocosDenshion::SimpleAudioEngine::getInstance();
std::string strAudioRes = StringUtils::format("Games/13S/Sound/%s.mp3", strPath.c_str());
pAudio->playEffect(strAudioRes.c_str());
}
//播放点击音效;
void SSSGameScene::playBtnClickEffect()
{
CocosDenshion::SimpleAudioEngine* pAudio = CocosDenshion::SimpleAudioEngine::getInstance();
pAudio->playEffect("Games/13S/Sound/button_click.mp3");
}
/************************************* 房间信息 ***********************************************************/
// 房间信息消息;
void SSSGameScene::OnSocketSubPrivateRoomInfo(CMD_GF_Private_Room_Info* pNetInfo)
{
m_PrivateRoomInfo = *pNetInfo;
m_dwRoomID = pNetInfo->dwRoomNum;
string strRoomID = StringUtils::format("%d", m_dwRoomID);
_txtRoomID->setString(strRoomID);
_txtRoomID->setVisible(true);
uint32 dwPlayCout = __max(pNetInfo->dwPlayCout+1, 1);
dwPlayCout = __min(dwPlayCout, pNetInfo->dwPlayTotal);
m_dwPlayCout = dwPlayCout;
string strPlayCount = StringUtils::format("%u/%u", dwPlayCout, pNetInfo->dwPlayTotal);
cocos2d::log("dwPlayCout = %d", pNetInfo->dwPlayCout);
_txtJushu->setString(utility::a_u8(strPlayCount));
_txtJushu->setVisible(true);
ShowGameRule(pNetInfo);
DWORD dwGameRule = m_PrivateRoomInfo.bGameRuleIdex;
m_bClassicRule = (dwGameRule & eSSSGameRuleClassic) > 0;
m_GameLogic.setClassicRule(m_bClassicRule);
SSS_GamePlayer* pPlayer = (SSS_GamePlayer*)getPlayerByUserID(pNetInfo->dwCreateUserID);
if (pPlayer != nullptr)
{
pPlayer->setOwner(true);
}
if (pNetInfo->bStartGame)
{
//如果游戏已开始则隐藏“返回大厅”按钮,显示“解散房间”按钮;
_btnInvite->setVisible(false);
_btnStartGame->setVisible(false);
_btnDismiss->setVisible(true);
_btnLeave->setVisible(false);
//私人场已经开始,重连上游戏自带发送准备消息;
GamePlayer* pSelfPlayer = getSelfGamePlayer();
if (!_ResultPanel->isVisible() && (pSelfPlayer != nullptr) && (pSelfPlayer->GetUserStatus() == US_SIT) && (_cbGameStatus == SSS_GS_WK_FREE))
{
SendUserReady();
}
}
else
{
GamePlayer* pPlayer = getSelfGamePlayer();
//如果房间主人是自已则隐藏“返回大厅”按钮,显示“解散房间”按钮;
if (pPlayer != nullptr && pNetInfo->dwCreateUserID == pPlayer->GetUserID())
{
_btnLeave->setVisible(false);
_btnDismiss->setVisible(true);
}
//游戏未开始显示微信分享按钮;
if (pNetInfo->dwPlayCout <= 0)
{
_btnInvite->setVisible(true);
_btnStartGame->setVisible(true);
}
}
}
// 游戏规则
void SSSGameScene::ShowGameRule(CMD_GF_Private_Room_Info* pNetInfo)
{
if (pNetInfo == nullptr) return;
std::string strPlayCount = StringUtils::format("%d局, ", pNetInfo->dwPlayTotal);
std::string strGameSet = "";
uint32 dwGameRule = m_PrivateRoomInfo.bGameRuleIdex;
m_strGameTitle = "十三张~抢庄玩法";
if ((dwGameRule & eSSSGameRuleRobBanker) > 0)
{
strGameSet += "抢庄玩法, ";
_txtRoomRule->setString(utility::a_u8("抢庄玩法"));
}
if ((dwGameRule & eSSSGameRuleFixBanker) > 0)
{
strGameSet += "霸王庄玩法, ";
_txtRoomRule->setString(utility::a_u8("霸王庄玩法"));
m_strGameTitle = "十三张~霸王庄玩法";
}
if ((dwGameRule & eSSSGameRuleTurnBanker) > 0)
{
strGameSet += "轮庄玩法, ";
_txtRoomRule->setString(utility::a_u8("轮庄玩法"));
m_strGameTitle = "十三张~轮庄玩法";
}
if ((dwGameRule & eSSSGameRuleClassic) > 0)
{
strGameSet += "经典玩法, ";
_txtRoomRule->setString(utility::a_u8("经典玩法"));
m_strGameTitle = "十三张~经典玩法";
}
m_strGameRuleInfo = strPlayCount + strGameSet;
}
// 私人场结束;
void SSSGameScene::OnSocketSubPrivateEnd(void* data, int dataSize)
{
m_bPrivateEnd = true;
// 申请解散界面;
DismissScene::Instance().hide();
DataStream kDataStream(data, dataSize);
SSS_CMD_S_Private_End_Info kNetInfo;
kNetInfo.StreamValue(kDataStream, false);
_aryResultItem.clear();
// 是不是欢乐场;
bool bUnionScore = (m_PrivateRoomInfo.cbUnionGoldOpen == 1);
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
if (kNetInfo.aryActiveStatus[i] == 0)
{
continue;
}
tagSSSOpenResultItem mItem;
mItem.lGameScore = kNetInfo.lUserScore[i];
//if (bUnionScore)
//{
// mItem.lUnionScore = mItem.lGameScore * m_PrivateRoomInfo.lScoreMultiple;
//}
//else
{
mItem.lUnionScore = mItem.lGameScore * m_PrivateRoomInfo.cbBaseScore;
}
GamePlayer* player = getPlayerByChairID(i);
if (player!=nullptr)
{
std::string strName = player->GetNickName();
strncpy(mItem.szNickName, strName.c_str(), countarray(mItem.szNickName) - 1);
mItem.dwGameID = player->GetGameID();
mItem.bOwner = (player->GetUserID() == m_PrivateRoomInfo.dwCreateUserID);
std::string strHttpHead = player->GetHeadHttp();
strncpy(mItem.szHttpHead, strHttpHead.c_str(), countarray(mItem.szHttpHead) - 1);
}
mItem.cbWinTimes = kNetInfo.aryWinTimes[i];
mItem.cbLoseTimes = kNetInfo.aryLoseTimes[i];
mItem.cbShootTimes = kNetInfo.aryShootTimes[i];
mItem.cbKillAllTimes = kNetInfo.aryKillAllTimes[i];
_aryResultItem.push_back(mItem);
}
// 工会欢乐场;
if (bUnionScore)
{
int nCount = _aryResultItem.size();
// 寻找大赢家;
SCORE lMaxScore = 0;
for (size_t i = 0; i < nCount; i++)
{
tagSSSOpenResultItem* pData = &(_aryResultItem.at(i));
if (pData->lGameScore > lMaxScore)
{
lMaxScore = pData->lGameScore;
}
}
// 统计大赢家数量;
int iMaxScoreCount = 0;
for (int j = 0; j < nCount; j++)
{
tagSSSOpenResultItem* pData = &(_aryResultItem.at(j));
if ((lMaxScore > 0) && (pData->lGameScore == lMaxScore))
{
iMaxScoreCount++;
}
}
if (iMaxScoreCount > 0)
{
SCORE lGameGold = m_PrivateRoomInfo.lGameGold*m_PrivateRoomInfo.dwPlayCost;
// 计算玩家积分;
SCORE lRevenue = floor(lGameGold / iMaxScoreCount);
// 重新计算积分, 统计扣税;
for (int k = 0; k < nCount; k++)
{
tagSSSOpenResultItem* pData = &(_aryResultItem.at(k));
if ((lMaxScore > 0) && (pData->lGameScore == lMaxScore))
{
if (pData->lUnionScore > lRevenue)
{
pData->lUnionScore -= lRevenue;
}
else
{
pData->lUnionScore = 0;
}
}
// 这里直接设置为欢乐总积分
pData->lAllUnionScore = pData->lUnionScore + m_PrivateScoreInfo.kScoreInfoArray[k];
}
}
}
if (_ResultPanel->isVisible() == false)
{
_OpenResultScene->updateUIData(m_dwRoomID, &_aryResultItem, true);
_OpenResultScene->setVisible(true);
}
else
{
_btnPrivateEnd->setVisible(true);
_btnReady->setVisible(false);
}
// 游戏结束停止网络;
PrivateRoomEnd();
}
void SSSGameScene::onEventShowPrivate(cocos2d::EventCustom *event)
{
//if (m_pPrivateScene)
//{
// m_pPrivateScene->pushScene();
//}
}
// 请求解散房间;
void SSSGameScene::OnSocketSubPrivateDismissInfo(CMD_GF_Private_Dismiss_Info* pNetInfo)
{
std::string aryName[SSS_GAME_PLAYER];
BYTE aryResult[SSS_GAME_PLAYER] = { 0 }; // 0 未选择 1 同意 2 不同意;
bool bHasSelf = false;
uint32 dwMyChairID = getSelfChairID();
for (uint32 i = 0; i < pNetInfo->dwDissUserCout; i++)
{
uint32 dwChairID = pNetInfo->dwDissChairID[i];
GamePlayer* pPlayer = getPlayerByChairID(dwChairID);
if (pPlayer != nullptr && dwChairID < SSS_GAME_PLAYER)
{
aryResult[dwChairID] = 1;
}
if (dwMyChairID == dwChairID)
{
bHasSelf = true;
}
}
for (uint32 i = 0; i < pNetInfo->dwNotAgreeUserCout; i++)
{
uint32 dwChairID = pNetInfo->dwNotAgreeChairID[i];
GamePlayer* pPlayer = getPlayerByChairID(dwChairID);
if (pPlayer != nullptr && dwChairID < SSS_GAME_PLAYER)
{
aryResult[dwChairID] = 2;
}
if (dwMyChairID == dwChairID)
{
bHasSelf = true;
}
}
GamePlayer* players[SSS_GAME_PLAYER];
for (int i = 0; i < SSS_GAME_PLAYER; i++)
{
players[i] = getPlayerByChairID(i);
}
DismissScene::Instance().show(aryResult, players, !bHasSelf, SSS_GAME_PLAYER);
}
void SSSGameScene::OnSocketSubPrivateDismissResult(CMD_GF_Private_Dismiss_Result* pNetInfo)
{
if (pNetInfo->bSuccess && false == m_PrivateRoomInfo.bStartGame)
{
EventLeaveGame(nullptr);
}
else
{
DismissScene::Instance().hide();
}
}
//////////////////////////////// 游戏录像 //////////////////////////////////////////
// 开始录像播放
void SSSGameScene::StartGameRecord()
{
if (m_GameRecord.playersVec.size() < 2)
{
return;
}
// 初始化房间信息;
OnSocketSubPrivateRoomInfo(&m_GameRecord.roomInfo);
m_iActRecordIdex = 0;
m_txtRecordPercent->setString(utility::toString(m_iActRecordIdex * 100 / m_GameRecord.actionVec.size(), "%"));
schedule(schedule_selector(GameFrameBase::NextRecordAction), m_RecordTime);
if ((m_GameRecord.wBankerUser != INVALID_CHAIR)&&(m_GameRecord.wBankerUser<SSS_GAME_PLAYER))
{
SSS_CMD_S_StartChip startChip = {0};
startChip.wBankerUser = m_GameRecord.wBankerUser;
onSubStartChip(&startChip, sizeof(SSS_CMD_S_StartChip));
}
return;
}
void SSSGameScene::NextRecordAction(float dt)
{
cocos2d::log("NextRecordAction...m_iActRecordIdex = %d", m_iActRecordIdex);
// 已经播放完了;
if (m_iActRecordIdex >= (int)m_GameRecord.actionVec.size() || !isVisible())
{
m_txtRecordPercent->setString("100%");
m_btnPlay->setVisible(true);
m_btnPause->setVisible(false);
unschedule(schedule_selector(GameFrameBase::NextRecordAction));
return;
}
// 下一个操作记录;
tagGameRecordOperateResult& kAction = m_GameRecord.actionVec[m_iActRecordIdex];
// 游戏开始;
if (kAction.wSubCmdID == SSS_SUB_S_USER_ROB)
{
SSS_CMD_S_UserRob userRob;
kAction.subMessageData.popValue(&userRob, sizeof(SSS_CMD_S_UserRob));
onSubUserRob(&userRob, sizeof(SSS_CMD_S_UserRob));
}
// 玩家叫分;
else if (kAction.wSubCmdID == SSS_SUB_S_START_CHIP)
{
SSS_CMD_S_StartChip startChip;
kAction.subMessageData.popValue(&startChip, sizeof(SSS_CMD_S_StartChip));
onSubStartChip(&startChip, sizeof(SSS_CMD_S_StartChip));
}
// 确认地主;
else if (kAction.wSubCmdID == SSS_SUB_S_USER_CHIP)
{
SSS_CMD_S_UserChip userChip;
kAction.subMessageData.popValue(&userChip, sizeof(SSS_CMD_S_UserChip));
onSubUserChip(&userChip, sizeof(SSS_CMD_S_UserChip));
}
// 玩家出牌;
else if (kAction.wSubCmdID == SSS_SUB_S_CLASSIC_CMP_CARD)
{
SSS_CMD_S_ClassicCompareCard cmpCard;
kAction.subMessageData.popValue(&cmpCard, sizeof(SSS_CMD_S_ClassicCompareCard));
onSubClassicCompareCard(&cmpCard, sizeof(SSS_CMD_S_ClassicCompareCard));
}
// 玩家放弃出牌;
else if (kAction.wSubCmdID == SSS_SUB_S_BANKER_CMP_CARD)
{
SSS_CMD_S_BankerCompareCard cmpCard;
kAction.subMessageData.popValue(&cmpCard, sizeof(SSS_CMD_S_BankerCompareCard));
onSubBankerCompareCard(&cmpCard, sizeof(SSS_CMD_S_BankerCompareCard));
}
// 游戏结束;
else if (kAction.wSubCmdID == SSS_SUB_S_GAME_END)
{
//SSS_CMD_S_GameEnd GameEnd;
kAction.subMessageData.popValue(&m_GameEnd, sizeof(SSS_CMD_S_GameEnd));
//onSubGameEnd(&GameEnd, sizeof(SSS_CMD_S_GameEnd));
}
m_iActRecordIdex++;
m_txtRecordPercent->setString(utility::toString(m_iActRecordIdex * 100 / m_GameRecord.actionVec.size(), "%"));
}
std::string SSSGameScene::getGameRule(uint32 dwGameRule)
{
std::string strGameSet = "";
if ((dwGameRule & eSSSGameRuleRobBanker) > 0)
{
strGameSet += "抢庄玩法, ";
}
if ((dwGameRule & eSSSGameRuleFixBanker) > 0)
{
strGameSet += "霸王庄玩法, ";
}
if ((dwGameRule & eSSSGameRuleTurnBanker) > 0)
{
strGameSet += "轮庄玩法, ";
}
if ((dwGameRule & eSSSGameRuleClassic) > 0)
{
strGameSet += "经典玩法, ";
}
return strGameSet;
}