void ShengQiang::onCancelClicked() { Role::onCancelClicked(); QString command; network::Respond* respond; switch(state) { case DI_QIANG: respond = new Respond(); respond->add_args(0); respond->set_respond_id(DI_QIANG); emit sendCommand(network::MSG_RESPOND, respond); gui->reset(); break; case HUI_YAO: case CHENG_JIE: case SHENG_GUANG_QI_YU: if(actionFlag==0) normal(); else if(actionFlag==1) attackAction(); break; } }
void YongZhe::onOkClicked() { Role::onOkClicked(); QList<Player*>selectedPlayers; QString command; QString sourceID; QString targetID; QString text; selectedPlayers=playerArea->getSelectedPlayers(); switch(state) { //额外行动询问 case 42: text=tipArea->getBoxCurrentText(); if(text[0].digitValue()==1) { emit sendCommand("2103;"+QString::number(myID)+";"); jinDuanZhiLi--; attackAction(); } break; //挑衅 case 2101: command="2101;"; sourceID=QString::number(myID); targetID=QString::number(selectedPlayers[0]->getID()); command+=targetID+";"+sourceID+";"; emit sendCommand(command); gui->reset(); break; //禁断之力 case 2102: jinDuanZhiLi++; command="2102;1;"; foreach(Card*ptr,dataInterface->getHandCards()) dataInterface->removeHandCard(ptr); emit sendCommand(command); gui->reset(); break; } }
void Player::makeMove() { vector<Vec2> squareDirs = creature->getConstSquare()->getTravelDir(); const vector<Creature*>& creatures = creature->getLevel()->getAllCreatures(); if (creature->isAffected(LastingEffect::HALLU)) ViewObject::setHallu(true); else ViewObject::setHallu(false); MEASURE( model->getView()->refreshView(creature), "level render time"); if (Options::getValue(OptionId::HINTS) && displayTravelInfo && creature->getConstSquare()->getName() == "road") { model->getView()->presentText("", "Use ctrl + arrows to travel quickly on roads and corridors."); displayTravelInfo = false; } static bool greeting = false; if (Options::getValue(OptionId::HINTS) && displayGreeting) { CHECK(creature->getFirstName()); model->getView()->presentText("", "Dear " + *creature->getFirstName() + ",\n \n \tIf you are reading this letter, then you have arrived in the valley of " + NameGenerator::worldNames.getNext() + ". There is a band of dwarves dwelling in caves under a mountain. Find them, talk to them, they will help you. Let your sword guide you.\n \n \nYours, " + NameGenerator::firstNames.getNext() + "\n \nPS.: Beware the goblins!"); model->getView()->presentText("", "Every settlement that you find has a leader, and they may have quests for you." "\n \nYou can turn these messages off in the options (press F2)."); displayGreeting = false; model->getView()->refreshView(creature); } for (const Creature* c : creature->getVisibleEnemies()) { if (c->isSpecialMonster() && !contains(specialCreatures, c)) { privateMessage(MessageBuffer::important(c->getDescription())); model->getView()->refreshView(creature); specialCreatures.push_back(c); } } if (travelling) travelAction(); else if (target) targetAction(); else { UserInput action = model->getView()->getAction(); Debug() << "Action " << int(action.type); vector<Vec2> direction; bool travel = false; if (action.type != UserInput::IDLE) model->getView()->retireMessages(); switch (action.type) { case UserInput::FIRE: fireAction(action.getPosition()); break; case UserInput::TRAVEL: travel = true; case UserInput::MOVE: direction.push_back(action.getPosition()); break; case UserInput::MOVE_TO: if (action.getPosition().dist8(creature->getPosition()) == 1) { Vec2 dir = action.getPosition() - creature->getPosition(); if (const Creature* c = creature->getConstSquare(dir)->getCreature()) { if (!creature->isEnemy(c)) { chatAction(dir); break; } } direction.push_back(dir); } else if (action.getPosition() != creature->getPosition()) { target = action.getPosition(); target = Vec2(min(creature->getLevel()->getBounds().getKX() - 1, max(0, target->x)), min(creature->getLevel()->getBounds().getKY() - 1, max(0, target->y))); // Just in case if (!target->inRectangle(creature->getLevel()->getBounds())) target = Nothing(); } else pickUpAction(false); break; case UserInput::SHOW_INVENTORY: displayInventory(); break; case UserInput::PICK_UP: pickUpAction(false); break; case UserInput::EXT_PICK_UP: pickUpAction(true); break; case UserInput::DROP: dropAction(false); break; case UserInput::EXT_DROP: dropAction(true); break; case UserInput::WAIT: creature->wait().perform(); break; case UserInput::APPLY_ITEM: applyAction(); break; case UserInput::THROW: throwAction(); break; case UserInput::THROW_DIR: throwAction(action.getPosition()); break; case UserInput::EQUIPMENT: equipmentAction(); break; case UserInput::HIDE: hideAction(); break; case UserInput::PAY_DEBT: payDebtAction(); break; case UserInput::CHAT: chatAction(); break; case UserInput::SHOW_HISTORY: messageBuffer.showHistory(); break; case UserInput::UNPOSSESS: if (unpossess()) { creature->popController(); return; } break; case UserInput::CAST_SPELL: spellAction(); break; case UserInput::DRAW_LEVEL_MAP: model->getView()->drawLevelMap(creature); break; case UserInput::EXIT: model->exitAction(); break; case UserInput::IDLE: break; default: break; } if (creature->isAffected(LastingEffect::SLEEP)) { onFellAsleep(); return; } for (Vec2 dir : direction) if (travel) { if (Creature* other = creature->getSquare(dir)->getCreature()) attackAction(other); else { vector<Vec2> squareDirs = creature->getConstSquare()->getTravelDir(); if (findElement(squareDirs, dir)) { travelDir = dir; lastLocation = creature->getLevel()->getLocation(creature->getPosition()); travelling = true; travelAction(); } } } else { moveAction(dir); break; } } for (Vec2 pos : creature->getLevel()->getVisibleTiles(creature)) { (*levelMemory)[creature->getLevel()].update(pos, creature->getLevel()->getSquare(pos)->getViewIndex(creature)); } }
void ShengQiang::onOkClicked() { Role::onOkClicked(); SafeList<Card*> selectedCards; SafeList<Player*>selectedPlayers; QString text; selectedCards=handArea->getSelectedCards(); selectedPlayers=playerArea->getSelectedPlayers(); network::Action* action; network::Respond* respond; try{ switch(state) { case 42: text=tipArea->getBoxCurrentText(); if(text[0]=='1'){ HuiYaoAddition=false; respond = newRespond(1003); respond->add_args(1); emit sendCommand(network::MSG_RESPOND, respond); attackAction(); } else if(text[0]=='2'){ ChengJieAddition=false; respond = newRespond(1004); respond->add_args(1); emit sendCommand(network::MSG_RESPOND, respond); attackAction(); } else if(text[0]=='3'){ ShengGuangQiYuAddition=false; respond = newRespond(1007); respond->add_args(1); emit sendCommand(network::MSG_RESPOND, respond); attackAction(); } break; case HUI_YAO: action = newAction(ACTION_MAGIC_SKILL, HUI_YAO); action->add_card_ids(selectedCards[0]->getID()); HuiYaoAddition=true; //dataInterface->removeHandCard(selectedCards[0]); emit sendCommand(network::MSG_ACTION, action); gui->reset(); break; case CHENG_JIE: action = newAction(ACTION_MAGIC_SKILL, CHENG_JIE); action->add_card_ids(selectedCards[0]->getID()); action->add_dst_ids(selectedPlayers[0]->getID()); //dataInterface->removeHandCard(selectedCards[0]); emit sendCommand(network::MSG_ACTION, action); gui->reset(); break; case DI_QIANG: respond = new Respond(); respond->add_args(tipArea->getBoxCurrentText().toInt()); respond->set_respond_id(DI_QIANG); emit sendCommand(network::MSG_RESPOND, respond); gui->reset(); break; case SHENG_GUANG_QI_YU: action = newAction(ACTION_MAGIC_SKILL, SHENG_GUANG_QI_YU); //action->add_args(1); ShengGuangQiYuAddition=true; emit sendCommand(network::MSG_ACTION, action); gui->reset(); break; } }catch(int error){ logic->onError(error); } }
void Role::decipher(QString command) { QStringList arg=command.split(';'); QStringList cardIDList; int targetID,targetArea; int sourceID,sourceArea; int cardID; int howMany; int hitRate; int i; int team,gem,crystal; Card*card; Player*player; Team *red=dataInterface->getRedTeam(); Team *blue=dataInterface->getBlueTeam(); QList<Card*> cards; QString msg; QString flag; QString cardName; QList<Player*>playerList=dataInterface->getPlayerList(); ShowArea* showArea=gui->getShowArea(); switch (arg[0].toInt()) { //回合开始 case 3: targetID=arg[1].toInt(); gui->logAppend("-----------------------------------"); gui->logAppend(playerList[targetID]->getName()+tr("回合开始")); playerArea->setCurrentPlayerID(targetID); if(targetID!=myID) { isMyTurn=0; gui->setEnable(0); } else{ isMyTurn=true; onceUsed=false; start=false; usedAttack=usedMagic=usedSpecial=false; } break; //应战询问 case 5: hitRate=arg[1].toInt(); cardID=arg[2].toInt(); targetID=arg[3].toInt(); sourceID=arg[4].toInt(); card=dataInterface->getCard(cardID); if(targetID!=myID) { gui->setEnable(0); } else { gui->setEnable(1); msg=playerList[sourceID]->getName()+tr("对")+tr("你")+tr("使用了")+card->getName(); if (hitRate==2) return; if(hitRate==1) msg+=tr(",该攻击无法应战"); sourcePlayerID=sourceID; gui->reset(); tipArea->setMsg(msg); attacked(card->getElement(),hitRate); } break; //弃牌询问 case 7: targetID=arg[1].toInt(); howMany=arg[2].toInt(); flag=arg[3]; msg=playerList[targetID]->getName()+tr("需要弃")+arg[2]+tr("张手牌"); if(flag=="y") gui->logAppend(msg+tr("(明弃)")); else gui->logAppend(msg+tr("(暗弃)")); if(targetID!=myID) { gui->setEnable(0); } else { gui->setEnable(1); gui->reset(); drop(howMany); tipArea->setMsg(tr("你需要弃")+arg[2]+tr("张手牌")); } break; //摸牌 case 9: targetID=arg[1].toInt(); howMany=arg[2].toInt(); gui->logAppend(playerList[targetID]->getName()+tr("摸取")+arg[2]+tr("张手牌")); if(targetID==myID) { cardIDList=arg[3].split(','); for(i=0;i<howMany;i++) { cardID=cardIDList[i].toInt(); card=dataInterface->getCard(cardID); dataInterface->addHandCard(card); } } break; //牌堆重洗 case 10: gui->logAppend(tr("牌堆已重洗")); break; //士气改变 case 11: team=arg[1].toInt(); howMany=arg[2].toInt(); if(team) { red->setMorale(howMany); teamArea->update(); } else { blue->setMorale(howMany); teamArea->update(); } break; //游戏结束 case 12: team=arg[1].toInt(); msg=tr("游戏结束,"); if(team) msg+=tr("红队获胜"); else msg+=tr("蓝队获胜"); gui->logAppend(msg); tipArea->setMsg(msg); break; //弃牌公告 case 13: targetID=arg[1].toInt(); howMany=arg[2].toInt(); flag=arg[3]; msg=playerList[targetID]->getName()+tr("丢弃了")+arg[2]+tr("张手牌"); if(flag=="y") { cardIDList=arg[4].split(','); msg+=":"; cards.clear(); for(i=0;i<howMany;i++) { cardID=cardIDList[i].toInt(); card=dataInterface->getCard(cardID); msg+=card->getName()+"-"+card->getProperty()+" "; cards<<card; dataInterface->removeHandCard(card); } showArea->showCards(cards); } gui->logAppend(msg); break; //命中公告 case 14: flag=arg[1]; targetID=arg[3].toInt(); sourceID=arg[4].toInt(); if(flag=="1") msg=playerList[sourceID]->getName()+tr("未命中")+playerList[targetID]->getName(); else msg=playerList[sourceID]->getName()+tr("命中")+playerList[targetID]->getName(); gui->logAppend(msg); break; //星石改变 case 15: team=arg[1].toInt(); gem=arg[2].toInt(); crystal=arg[3].toInt(); if(team) { red->setGem(gem); red->setCrystal(crystal); teamArea->update(); } else { blue->setGem(gem); blue->setCrystal(crystal); teamArea->update(); } break; //星杯改变 case 17: team=arg[1].toInt(); howMany=arg[2].toInt(); if(team) { red->setGrail(howMany); teamArea->update(); } else { blue->setGrail(howMany); teamArea->update(); } break; //能量改变 case 18: targetID=arg[1].toInt(); gem=arg[2].toInt(); crystal=arg[3].toInt(); player=playerList.at(targetID); player->setGem(gem); player->setCrystal(crystal); playerArea->update(); break; //移牌通告 case 19: howMany=arg[1].toInt(); cardIDList=arg[2].split(","); sourceID=arg[3].toInt(); sourceArea=arg[4].toInt(); targetID=arg[5].toInt(); targetArea=arg[6].toInt(); if(sourceID!=-1) { switch(sourceArea) { case 4: player=playerList.at(sourceID); player->changeHandCardNum(-howMany); break; case 5: cardID=cardIDList[0].toInt(); card=dataInterface->getCard(cardID); playerList[sourceID]->removeStatus(card); break; } } if(targetID!=-1) { switch(targetArea) { case 4: player=playerList.at(targetID); player->changeHandCardNum(howMany); break; case 5: cardID=cardIDList[0].toInt(); card=dataInterface->getCard(cardID); cardName=card->getName(); if(cardName==tr("中毒")) playerList[targetID]->addStatus(0,card); if(cardName==tr("虚弱")) playerList[targetID]->addStatus(1,card); if(cardName==tr("圣盾")||card->getSpecialityList().contains(tr("天使之墙"))) playerList[targetID]->addStatus(2,card); if(card->getType()=="attack"&&card->getProperty()=="幻") playerList[targetID]->addStatus(3,card); break; } } playerArea->update(); break; //物伤通告 case 20: targetID=arg[1].toInt(); sourceID=arg[3].toInt(); gui->logAppend(playerList[sourceID]->getName()+tr("对")+playerList[targetID]->getName()+tr("造成了")+arg[2]+tr("点攻击伤害")); break; //法术通告 case 21: targetID=arg[1].toInt(); sourceID=arg[3].toInt(); gui->logAppend(playerList[sourceID]->getName()+tr("对")+playerList[targetID]->getName()+tr("使用的")+arg[4]+tr("造成了")+arg[2]+tr("点法术伤害")); break; //虚弱询问 case 22: targetID=arg[1].toInt(); gui->logAppend(tr("等待")+playerList[targetID]->getName()+tr("虚弱响应")); if(targetID!=myID) { gui->setEnable(0); } else { gui->setEnable(1); gui->reset(); state=7; decisionArea->enable(0); decisionArea->enable(1); tipArea->setMsg(tr("你被虚弱了,选是跳过行动阶段,选否摸")+arg[2]+tr("张牌")); } break; //虚弱结果 case 24: targetID=arg[1].toInt(); if(arg[2]=="0") gui->logAppend(playerList[targetID]->getName()+tr("选择跳过行动阶段")); else gui->logAppend(playerList[targetID]->getName()+tr("选择摸")+arg[3]+tr("张牌挣脱")); break; //圣盾移除通告 case 25: targetID=arg[1].toInt(); gui->logAppend(playerList[targetID]->getName()+tr("的圣盾被移除")); break; //魔弹询问 case 26: int nextID; targetID=arg[1].toInt(); sourceID=arg[2].toInt(); howMany=arg[3].toInt(); nextID=arg[4].toInt(); gui->logAppend(playerList[sourceID]->getName()+tr("对")+playerList[targetID]->getName()+tr("使用了魔弹,目前伤害为:")+arg[3]+tr("点")); if(targetID!=myID) { gui->setEnable(0); } else { gui->setEnable(1); msg=playerList[sourceID]->getName()+tr("对")+tr("你")+tr("使用了魔弹,目前伤害为:")+arg[3]+tr("点"); gui->reset(); tipArea->setMsg(msg); moDaned(nextID); } break; //卡牌通告 case 28: cardID=arg[1].toInt(); targetID=arg[2].toInt(); sourceID=arg[3].toInt(); flag=arg[4]; card=dataInterface->getCard(cardID); cardName=card->getName(); if(flag=="1"){ cards.clear(); cards<<card; showArea->showCards(cards); } if(card->getElement()!="light") gui->logAppend(playerList[sourceID]->getName()+tr("对")+playerList[targetID]->getName()+tr("使用了")+cardName); else gui->logAppend(playerList[sourceID]->getName()+tr("使用圣光抵御")); break; //行动阶段 flag 0-所有行动,1-攻击行动,2-法术行动,3-特殊行动,4-攻击或法术行动 case 29: targetID=arg[1].toInt(); flag=arg[2]; if(targetID!=myID) { isMyTurn=0; gui->setEnable(0); actionFlag=-1; } else { gui->setEnable(1); if(flag=="0") normal(); else if(flag=="1") attackAction(); else if(flag=="2") magicAction(); else if(flag=="4") attackOrMagic(); if(arg[3]=="1") decisionArea->enable(3); } break; //无法行动公告 case 31: targetID=arg[1].toInt(); msg=playerList[targetID]->getName()+tr("宣告无法行动"); gui->logAppend(msg); break; //治疗改变 case 32: targetID=arg[1].toInt(); howMany=arg[2].toInt(); playerList[targetID]->setCrossNum(howMany); break; //治疗询问 case 33: targetID=arg[1].toInt(); howMany=arg[2].toInt(); flag=arg[3]; gui->reset(); if(targetID==myID) cure(playerList[myID]->getCrossNum(),howMany,flag.toInt()); break; //技能响应询问 case 35: targetID=arg[1].toInt(); flag=arg[2]; msg=tr("等待")+playerList[targetID]->getName()+flag+tr("响应"); gui->logAppend(msg); gui->reset(); gui->setEnable(0); break; //信息通告 case 38: gui->logAppend(arg[1]); break; //角色形态转换通知 case 39: targetID=arg[1].toInt(); flag=arg[2]; if(flag=="0") { playerList[targetID]->setTap(0); msg=playerList[targetID]->getName()+tr("返回")+arg[3]; } else { playerList[targetID]->setTap(1); msg=playerList[targetID]->getName()+tr("进入")+arg[3]; } playerArea->update(); gui->logAppend(msg); gui->reset(); gui->setEnable(0); break; //手牌上限变更通知 case 40: targetID=arg[1].toInt(); howMany=arg[2].toInt(); playerList[targetID]->setHandCardsMax(howMany); playerArea->update(); break; //获得手牌通告 case 41: targetID=arg[1].toInt(); flag=arg[2]; howMany=arg[3].toInt(); gui->logAppend(playerList[targetID]->getName()+tr("获得")+arg[3]+tr("张手牌")); if(targetID==myID) { cardIDList=arg[4].split(','); for(i=0;i<howMany;i++) { cardID=cardIDList[i].toInt(); card=dataInterface->getCard(cardID); dataInterface->addHandCard(card); } } break; //额外行动询问 case 42: targetID=arg[1].toInt(); gui->logAppend(tr("等待")+playerList[targetID]->getName()+tr("额外行动响应")); if(targetID==myID) { gui->setEnable(1); addtionalAction(); } else gui->setEnable(0); break; //专属变更 case 43: targetID=arg[1].toInt(); msg=arg[2]; playerList.at(targetID)->setSpecial(msg.toInt(),arg[3].toInt()); playerArea->update(); break; //标记变更 case 45: targetID=arg[1].toInt(); flag=arg[2]; howMany=arg[3].toInt(); playerList.at(targetID)->setToken(flag.toInt(),howMany); playerArea->update(); break; //天使祝福 case 750: targetID=arg[1].toInt(); howMany=arg[2].toInt(); msg=tr("等待")+playerList[targetID]->getName()+tr("天使祝福(给牌)响应"); gui->logAppend(msg); if(targetID!=myID) { isMyTurn=0; gui->setEnable(0); } else { gui->setEnable(1); TianShiZhuFu(howMany); } break; //魔爆冲击(弃牌) case 850: targetID=arg[1].toInt(); msg=tr("等待")+playerList[targetID]->getName()+tr("魔爆冲击(弃牌)响应"); gui->logAppend(msg); if(targetID!=myID) { isMyTurn=0; gui->setEnable(0); } else { gui->setEnable(1); MoBaoChongJi(); } break; } }