/** * @brief Cycles to the previous base. * @sa B_NextBase * @sa B_SelectBase_f * @todo This should not rely on base->idx! */ static void B_PrevBase_f (void) { const base_t *currentBase = B_GetCurrentSelectedBase(); const base_t *prevBase; base_t *base; if (!currentBase) return; prevBase = NULL; base = NULL; while ((base = B_GetNext(base)) != NULL) { if (base == currentBase) break; prevBase = base; } /* if it was the first base, select the last */ if (!prevBase) { while ((base = B_GetNext(base)) != NULL) { prevBase = base; } } if (prevBase) B_SelectBase(prevBase); }
/** * @brief Called when a base is opened or a new base is created on geoscape. * For a new base the baseID is -1. */ static void B_SelectBase_f (void) { int baseID; if (cgi->Cmd_Argc() < 2) { Com_Printf("Usage: %s <baseID>\n", cgi->Cmd_Argv(0)); return; } baseID = atoi(cgi->Cmd_Argv(1)); /* check against MAX_BASES here! - only -1 will create a new base * if we would check against ccs.numBases here, a click on the base summary * base nodes would try to select unfounded bases */ if (baseID >= 0 && baseID < MAX_BASES) { const base_t *base = B_GetFoundedBaseByIDX(baseID); /* don't create a new base if the index was valid */ if (base) B_SelectBase(base); } else if (baseID == CREATE_NEW_BASE_ID) { /* create a new base */ B_SelectBase(NULL); } }
/** * @brief Cycles to the next base. * @sa B_PrevBase * @sa B_SelectBase_f */ static void B_NextBase_f (void) { base_t *base = B_GetCurrentSelectedBase(); if (!base) return; base = B_GetNext(base); /* if it was the last base, select the first */ if (!base) base = B_GetNext(NULL); if (base) B_SelectBase(base); }
/** * @brief Constructs a new base. * @sa B_NewBase */ static void B_BuildBase_f (void) { const campaign_t* campaign = ccs.curCampaign; if (ccs.mapAction == MA_NEWBASE) ccs.mapAction = MA_NONE; if (ccs.credits - campaign->basecost > 0) { const nation_t* nation; const char* baseName = mn_base_title->string; base_t* base; /* there may be no " in the base name */ if (!Com_IsValidName(baseName)) baseName = _("Base"); base = B_Build(campaign, ccs.newBasePos, baseName); if (!base) cgi->Com_Error(ERR_DROP, "Cannot build base"); CP_UpdateCredits(ccs.credits - campaign->basecost); nation = GEO_GetNation(base->pos); if (nation) Com_sprintf(cp_messageBuffer, sizeof(cp_messageBuffer), _("A new base has been built: %s (nation: %s)"), mn_base_title->string, _(nation->name)); else Com_sprintf(cp_messageBuffer, sizeof(cp_messageBuffer), _("A new base has been built: %s"), mn_base_title->string); MS_AddNewMessage(_("Base built"), cp_messageBuffer, MSG_CONSTRUCTION); /* First base */ if (ccs.campaignStats.basesBuilt == 1) B_SetUpFirstBase(campaign, base); cgi->Cvar_SetValue("mn_base_count", B_GetCount()); B_SelectBase(base); } else { /** @todo Why is this needed? Also see bug #5401 */ if (GEO_IsRadarOverlayActivated()) GEO_SetOverlay("radar", 0); CP_PopupList(_("Notice"), _("Not enough credits to set up a new base.")); } }