void Logic::setupRoom(bool isStarted, GameInfo *gameInfo) { if(!init_before_start && !isStarted) { connect(gui->getDecisionArea(),SIGNAL(okClicked()),this,SLOT(onOkClicked())); connect(gui->getDecisionArea(),SIGNAL(cancelClicked()),this,SLOT(onCancelClicked())); connect(gui->getBPArea(),SIGNAL(roleReady()),this,SLOT(roleAnalyse())); dataInterface->setupRoom(isStarted); gui->setupRoom(isStarted); normal(); init_before_start = true; #ifdef DEBUG ready(); #endif } else if(!init_after_start && isStarted){ dataInterface->initPlayerList(gameInfo); dataInterface->setupRoom(isStarted); gui->setupRoom(isStarted); init_after_start = true; } }
void Logic::setupRoom(bool isStarted, GameInfo *gameInfo) { if(!init_before_start && !isStarted) { connect(gui->getDecisionArea(),SIGNAL(okClicked()),this,SLOT(onOkClicked())); connect(gui->getBPArea(),SIGNAL(roleReady()),this,SLOT(roleAnalyse())); dataInterface->setupRoom(isStarted); gui->setupRoom(isStarted); normal(); init_before_start = true; } else if(!init_after_start && isStarted){ dataInterface->initPlayerList(gameInfo); dataInterface->setupRoom(isStarted); gui->setupRoom(isStarted); init_after_start = true; if(myID != GUEST){ network::ReadyForGameRequest* ready = new ReadyForGameRequest; ready->set_type(ReadyForGameRequest_Type_SEAT_READY); emit sendCommand(network::MSG_READY_GAME_REQ, ready); } } }
void Logic::getCommand(unsigned short proto_type, google::protobuf::Message* proto) { QMutexLocker locker(&mutex); TipArea *tipArea; DecisionArea* decisionArea; BPArea* bpArea; SafeList<int> roleIDs; PlayerArea* playerArea; int targetID,roleID,howMany,num; QString arg[10]; network::RoleRequest* char_pick; switch (proto_type) { case network::MSG_ROOMLIST_REP: lobby->fill((network::RoomListResponse*) proto); break; case network::MSG_GAME: { network::GameInfo* game_info = (network::GameInfo*) proto; if(game_info->has_player_id()){ myID = game_info->player_id(); dataInterface->setID(myID); cleanRoom(); if(myID == GUEST) gui->logAppend(QStringLiteral("<font color=\'pink\'>房间已满,进入观战模式</font>")); else gui->logAppend(QStringLiteral("<font color=\'pink\'>请准备</font>")); } if(game_info->has_room_id()){ gui->getTeamArea()->setRoomID(game_info->room_id()); } setupRoom(game_info->is_started(), game_info); for (int i = 0; i < game_info->player_infos_size(); ++i) { network::SinglePlayerInfo* player_info = (network::SinglePlayerInfo*)&(game_info->player_infos(i)); targetID = player_info->id(); if(player_info->has_role_id()) { roleID = player_info->role_id(); roles[targetID] = roleID; count++; } if(player_info->has_nickname()){ dataInterface->setNickName(targetID, QString::fromStdString(player_info->nickname())); } if(player_info->has_team()){ dataInterface->getPlayerById(targetID)->setTeam(player_info->team()); } gui->getPlayerArea()->getPlayerItem(targetID)->setReady(player_info->ready()); } if(count==dataInterface->getPlayerMax()) { disconnect(getClient(),0,this,0); disconnect(gui->getDecisionArea(), 0, this, 0); for(int i=0;i<dataInterface->getPlayerMax();i++){ dataInterface->getPlayerList().at(i)->setRole(roles[i]); gui->getPlayerArea()->getPlayerItem(i)->setToolTip(dataInterface->getRoleSkillInfo(roles[i])); } roleID = myID == GUEST ? roles[0] : roles[myID]; setMyRole(roleID); network::GameInfo* toRole = new network::GameInfo; toRole->CopyFrom(*game_info); myRole->decipher(network::MSG_GAME, toRole); } gui->getPlayerArea()->update(); break; } case network::MSG_GOSSIP: if(gui!=NULL) { network::Gossip* gossip = (network::Gossip*) proto; gui->chatAppend(gossip->id(), QString::fromStdString(gossip->txt())); } break; case network::MSG_ERROR: { network::Error* error = (network::Error*)proto; if(error->dst_id() == myID){ gui->reset(); } switch(error->id()) { //GE_DISCONNECTED case GE_DISCONNECTED: { int targetId = error->dst_id(); gui->logAppend(QStringLiteral("<font color=\'red\'>玩家") + QString::number(targetId) + QStringLiteral("离开房间</font>")); dataInterface->setNickName(targetId, ""); dataInterface->getPlayerById(targetId)->setTeam(-1); gui->getPlayerArea()->getPlayerItem(targetId)->setReady(false); gui->getPlayerArea()->update(); break; } case GE_NOT_WELCOME: gui->logAppend(QStringLiteral("<font color=\'red\'>这个房主比较高冷,下个房间见。。</font>")); break; case GE_WRONG_PASSWORD: gui->logAppend(QStringLiteral("<font color=\'red\'>瞎蒙果然是不行的。。</font>")); break; default: gui->logAppend(QStringLiteral("<font color=\'red\'>错误代码") + QString::number(error->id()) + "</font>"); break; } break; } //选择角色 case network::MSG_ROLE_REQ: state=46; char_pick = (network::RoleRequest*) proto; tipArea=gui->getTipArea(); decisionArea=gui->getDecisionArea(); tipArea->reset(); howMany=char_pick->role_ids_size(); for(int i=0;i<howMany;i++){ roleID=char_pick->role_ids(i); tipArea->addBoxItem(QString::number(roleID)+"."+dataInterface->getRoleName(roleID)); } tipArea->setMsg(QStringLiteral("请选择角色:")); tipArea->showBox(); decisionArea->enable(0); gui->alert(); break; case 51: // TODO:BP模式,暂不可用 state = 51; tipArea=gui->getTipArea(); decisionArea=gui->getDecisionArea(); bpArea = gui->getBPArea(); tipArea->reset(); connect(decisionArea,SIGNAL(okClicked()),this,SLOT(onOkClicked())); connect(bpArea,SIGNAL(roleReady()),this,SLOT(roleAnalyse())); num = arg[1].toInt(); for(int i=0;i<num;i++) { roleIDs<<arg[i+2].toInt(); } bpArea->BPStart(num, roleIDs); break; case 52: // TODO:BP模式,暂不可用 state = 52; bpArea = gui->getBPArea(); bpArea->setMsg("请禁用一角色"); bpArea->setQuota(1); bpArea->enableAll(); playerArea = gui->getPlayerArea(); gui->alert(); break; case 55: // TODO:BP模式,暂不可用 state = 55; bpArea = gui->getBPArea(); bpArea->setMsg("请选择一角色"); bpArea->setQuota(1); bpArea->enableAll(); playerArea = gui->getPlayerArea(); gui->alert(); break; case 54: // TODO:BP模式,暂不可用 bpArea = gui->getBPArea(); bpArea->ban(arg[1].toInt(), arg[2].toInt()); break; case 57: // TODO:BP模式,暂不可用 bpArea = gui->getBPArea(); bpArea->choose(arg[1].toInt(), arg[2].toInt()); decisionArea = gui->getDecisionArea(); if(bpArea->checkOver()) { bpArea->setVisible(0); disconnect(decisionArea,SIGNAL(okClicked()),this,SLOT(onOkClicked())); disconnect(bpArea,SIGNAL(roleReady()),this,SLOT(roleAnalyse())); } break; case 59: // TODO:BP模式,暂不可用 if(gui!=NULL) gui->chatAppend(arg[1].toInt(),arg[2]); break; } delete proto; }