bool QueryReply::applyGh( CGameHandler *gh ) { auto playerToConnection = gh->connections.find(player); if(playerToConnection == gh->connections.end()) COMPLAIN_AND_RETURN("No such player!"); if(playerToConnection->second != c) COMPLAIN_AND_RETURN("Message came from wrong connection!"); if(qid == -1) COMPLAIN_AND_RETURN("Cannot answer the query with id -1!"); assert(vstd::contains(gh->states.players, player)); return gh->queryReply(qid, answer, player); }
bool HireHero::applyGh( CGameHandler *gh ) { const CGObjectInstance *obj = gh->getObj(tid); const CGTownInstance *town = dynamic_ptr_cast<CGTownInstance>(obj); if(town && PlayerRelations::ENEMIES == gh->getPlayerRelations(obj->tempOwner, gh->getPlayerAt(c))) COMPLAIN_AND_RETURN("Can't buy hero in enemy town!"); return gh->hireHero(obj, hid,player); }
bool EndTurn::applyGh( CGameHandler *gh ) { int player = GS(gh)->currentPlayer; ERROR_IF_NOT(player); if(gh->states.checkFlag(player, &PlayerStatus::engagedIntoBattle)) COMPLAIN_AND_RETURN("Cannot end turn when in battle!"); gh->states.setFlag(GS(gh)->currentPlayer,&PlayerStatus::makingTurn,false); return true; }
bool EndTurn::applyGh( CGameHandler *gh ) { PlayerColor player = GS(gh)->currentPlayer; ERROR_IF_NOT(player); if(gh->queries.topQuery(player)) COMPLAIN_AND_RETURN("Cannot end turn before resolving queries!"); gh->states.setFlag(GS(gh)->currentPlayer,&PlayerStatus::makingTurn,false); return true; }
bool TradeOnMarketplace::applyGh( CGameHandler *gh ) { //market must be owned or visited const IMarket *m = IMarket::castFrom(market); if(!m) COMPLAIN_AND_RETURN("market is not-a-market! :/"); ui8 player = market->tempOwner; if(player >= GameConstants::PLAYER_LIMIT) player = gh->getTile(market->visitablePos())->visitableObjects.back()->tempOwner; if(player >= GameConstants::PLAYER_LIMIT) COMPLAIN_AND_RETURN("No player can use this market!"); if(hero && (player != hero->tempOwner || hero->visitablePos() != market->visitablePos())) COMPLAIN_AND_RETURN("This hero can't use this marketplace!"); ERROR_IF_NOT(player); switch(mode) { case EMarketMode::RESOURCE_RESOURCE: return gh->tradeResources(m, val, player, r1, r2); case EMarketMode::RESOURCE_PLAYER: return gh->sendResources(val, player, static_cast<Res::ERes>(r1), static_cast<TPlayerColor>(r2)); case EMarketMode::CREATURE_RESOURCE: if(!hero) COMPLAIN_AND_RETURN("Only hero can sell creatures!"); return gh->sellCreatures(val, m, hero, r1, static_cast<Res::ERes>(r2)); case EMarketMode::RESOURCE_ARTIFACT: if(!hero) COMPLAIN_AND_RETURN("Only hero can buy artifacts!"); return gh->buyArtifact(m, hero, static_cast<Res::ERes>(r1), ArtifactID(r2)); case EMarketMode::ARTIFACT_RESOURCE: if(!hero) COMPLAIN_AND_RETURN("Only hero can sell artifacts!"); return gh->sellArtifact(m, hero, ArtifactInstanceID(r1), static_cast<Res::ERes>(r2)); case EMarketMode::CREATURE_UNDEAD: return gh->transformInUndead(m, hero, r1); case EMarketMode::RESOURCE_SKILL: return gh->buySecSkill(m, hero, SecondarySkill(r2)); case EMarketMode::CREATURE_EXP: return gh->sacrificeCreatures(m, hero, r1, val); case EMarketMode::ARTIFACT_EXP: return gh->sacrificeArtifact(m, hero, ArtifactPosition(r1)); default: COMPLAIN_AND_RETURN("Unknown exchange mode!"); } }