// Updates cell if it is changin. Returns false if it did not change bool Labyrinth::updateCell(std::vector<Point2d> cells, const Vector3D pos) { for (unsigned int i = 0; i < cells.size(); ++i) { if (isChangingCell(cells[i], pos)) { setPlayerPos(cells[i]); return true; } } return false; }
optional<CampaignSetup> CampaignBuilder::prepareCampaign(function<optional<RetiredGames>(CampaignType)> genRetired, CampaignType type, string worldName) { Vec2 size(17, 9); int numBlocked = 0.6 * size.x * size.y; Table<Campaign::SiteInfo> terrain = getTerrain(random, size, numBlocked); auto retired = genRetired(type); View::CampaignMenuState menuState { true, false}; setCountLimits(options); const auto playerRole = getPlayerRole(); while (1) { Campaign campaign(terrain, type, playerRole, worldName); if (auto pos = considerStaticPlayerPos(campaign)) { campaign.clearSite(*pos); setPlayerPos(campaign, *pos, avatarInfo.playerCreature->getMaxViewIdUpgrade()); } placeVillains(campaign, getVillainCounts(type, options), retired, avatarInfo.tribeAlignment); while (1) { bool updateMap = false; campaign.influenceSize = options->getIntValue(OptionId::INFLUENCE_SIZE); campaign.refreshInfluencePos(); CampaignAction action = autoConfirm(type) ? CampaignActionId::CONFIRM : view->prepareCampaign({ campaign, (retired && type == CampaignType::FREE_PLAY) ? optional<RetiredGames&>(*retired) : none, avatarInfo.playerCreature.get(), getPrimaryOptions(), getSecondaryOptions(type), getSiteChoiceTitle(type), getIntroText(), getAvailableTypes().transform([](CampaignType t) -> View::CampaignOptions::CampaignTypeInfo { return {t, getCampaignTypeDescription(t)};}), getMenuWarning(type) }, options, menuState); switch (action.getId()) { case CampaignActionId::REROLL_MAP: terrain = getTerrain(random, size, numBlocked); updateMap = true; break; case CampaignActionId::UPDATE_MAP: updateMap = true; break; case CampaignActionId::CHANGE_TYPE: type = action.get<CampaignType>(); retired = genRetired(type); updateMap = true; break; case CampaignActionId::UPDATE_OPTION: switch (action.get<OptionId>()) { case OptionId::PLAYER_NAME: case OptionId::GENERATE_MANA: case OptionId::INFLUENCE_SIZE: break; default: updateMap = true; break; } break; case CampaignActionId::CANCEL: return none; case CampaignActionId::CHOOSE_SITE: if (!considerStaticPlayerPos(campaign)) setPlayerPos(campaign, action.get<Vec2>(), avatarInfo.playerCreature->getMaxViewIdUpgrade()); break; case CampaignActionId::CONFIRM: if (!retired || retired->getNumActive() > 0 || playerRole != PlayerRole::KEEPER || retired->getAllGames().empty() || view->yesOrNoPrompt("The imps are going to be sad if you don't add any retired dungeons. Continue?")) { string name = avatarInfo.playerCreature->getName().firstOrBare(); string gameIdentifier = name + "_" + campaign.worldName + getNewIdSuffix(); string gameDisplayName = name + " of " + campaign.worldName; return CampaignSetup{campaign, gameIdentifier, gameDisplayName, getIntroMessages(type)}; } } if (updateMap) break; } } }