/**
 * @brief onDestroy Callback for Antimatter Storage
 */
static void B_Destroy_AntimaterStorage_f (void)
{
	base_t *base;
	const float prob = frand();

	if (cgi->Cmd_Argc() < 4) {	/** note: third parameter not used but we must be sure we have probability parameter */
		Com_Printf("Usage: %s <probability> <baseID> <buildingType>\n", cgi->Cmd_Argv(0));
		return;
	}

	base = B_GetFoundedBaseByIDX(atoi(cgi->Cmd_Argv(2)));
	if (!base)
		return;
	if (CAP_GetCurrent(base, CAP_ANTIMATTER) <= 0)
		return;

	CAP_RemoveAntimatterExceedingCapacity(base);

	if (base->baseStatus != BASE_WORKING)
		return;

	if (prob < atof(cgi->Cmd_Argv(1))) {
		MS_AddNewMessage(_("Notice"), va(_("%s has been destroyed by an antimatter storage breach."), base->name));
		cgi->UI_PopWindow(false);
		B_Destroy(base);
	}
}
Beispiel #2
0
/**
 * @brief Checks capacity overflows on bases
 * @sa CP_CampaignRun
 */
void CAP_CheckOverflow (void)
{
	base_t *base = nullptr;

	while ((base = B_GetNext(base)) != nullptr) {
		int i;

		for (i = CAP_ALIENS; i < MAX_CAP; i++) {
			baseCapacities_t capacityType = (baseCapacities_t)i;
			capacities_t *cap = CAP_Get(base, capacityType);

			if (cap->cur <= cap->max)
				continue;

			switch (capacityType) {
			case CAP_WORKSPACE:
				PR_UpdateProductionCap(base);
				break;
			case CAP_ITEMS:
				CAP_RemoveItemsExceedingCapacity(base);
				break;
			case CAP_ALIENS:
				AL_RemoveAliensExceedingCapacity(base);
				break;
			case CAP_LABSPACE:
				RS_RemoveScientistsExceedingCapacity(base);
				break;
			case CAP_AIRCRAFT_SMALL:
			case CAP_AIRCRAFT_BIG:
				CAP_RemoveAircraftExceedingCapacity(base, capacityType);
				break;
			case CAP_EMPLOYEES:
				E_DeleteEmployeesExceedingCapacity(base);
				break;
			case CAP_ANTIMATTER:
				CAP_RemoveAntimatterExceedingCapacity(base);
				break;
			default:
				/* nothing to do */
				break;
			}
		}
	}
}
Beispiel #3
0
/**
 * @brief Checks capacity overflows on bases
 * @sa CP_CampaignRun
 */
void CAP_CheckOverflow (void)
{
	base_t* base = nullptr;

	while ((base = B_GetNext(base)) != nullptr) {
		for (int i = CAP_ALIENS; i < MAX_CAP; i++) {
			baseCapacities_t capacityType = (baseCapacities_t)i;
			capacities_t* cap = CAP_Get(base, capacityType);

			if (cap->cur <= cap->max)
				continue;

			switch (capacityType) {
			case CAP_ANTIMATTER:
				CAP_RemoveAntimatterExceedingCapacity(base);
				break;
			case CAP_WORKSPACE:
				PR_UpdateProductionCap(base);
				break;
			case CAP_LABSPACE:
				RS_RemoveScientistsExceedingCapacity(base);
				break;
			case CAP_AIRCRAFT_SMALL:
			case CAP_AIRCRAFT_BIG:
			case CAP_ALIENS:
			case CAP_EMPLOYEES:
			case CAP_ITEMS:
				if (base->baseStatus != BASE_DESTROYED) {
					const buildingType_t bldgType = B_GetBuildingTypeByCapacity((baseCapacities_t)i);
					const building_t* bldg = B_GetBuildingTemplateByType(bldgType);
					CP_GameTimeStop();
					cgi->Cmd_ExecuteString("ui_push popup_cap_overload base %d \"%s\" \"%s\" %d %d",
						base->idx, base->name, _(bldg->name), cap->max - cap->cur, cap->max);
				}
				break;
			default:
				/* nothing to do */
				break;
			}
		}
	}
}