double Planet::NextTurnCurrentMeterValue(MeterType type) const { MeterType max_meter_type = INVALID_METER_TYPE; switch (type) { case METER_TARGET_POPULATION: case METER_TARGET_HEALTH: case METER_POPULATION: case METER_HEALTH: case METER_FOOD_CONSUMPTION: return PopCenterNextTurnMeterValue(type); break; case METER_TARGET_FARMING: case METER_TARGET_INDUSTRY: case METER_TARGET_RESEARCH: case METER_TARGET_TRADE: case METER_TARGET_MINING: case METER_TARGET_CONSTRUCTION: case METER_FARMING: case METER_INDUSTRY: case METER_RESEARCH: case METER_TRADE: case METER_MINING: case METER_CONSTRUCTION: return ResourceCenterNextTurnMeterValue(type); break; case METER_SHIELD: max_meter_type = METER_MAX_SHIELD; break; case METER_TROOPS: max_meter_type = METER_MAX_TROOPS; break; case METER_DEFENSE: max_meter_type = METER_MAX_DEFENSE; break; break; default: return UniverseObject::NextTurnCurrentMeterValue(type); } const Meter* meter = GetMeter(type); if (!meter) { throw std::invalid_argument("Planet::NextTurnCurrentMeterValue passed meter type that the Planet does not have, but should."); } double current_meter_value = meter->Current(); const Meter* max_meter = GetMeter(max_meter_type); if (!max_meter) { throw std::runtime_error("Planet::NextTurnCurrentMeterValue dealing with invalid meter type"); } double max_meter_value = max_meter->Current(); // being attacked prevents meter growth if (LastTurnAttackedByShip() >= CurrentTurn()) { return std::min(current_meter_value, max_meter_value); } // currently meter growth is one per turn. return std::min(current_meter_value + 1.0, max_meter_value); }
float Planet::NextTurnCurrentMeterValue(MeterType type) const { MeterType max_meter_type = INVALID_METER_TYPE; switch (type) { case METER_TARGET_POPULATION: case METER_POPULATION: case METER_TARGET_HAPPINESS: case METER_HAPPINESS: return PopCenterNextTurnMeterValue(type); break; case METER_TARGET_INDUSTRY: case METER_TARGET_RESEARCH: case METER_TARGET_TRADE: case METER_TARGET_CONSTRUCTION: case METER_INDUSTRY: case METER_RESEARCH: case METER_TRADE: case METER_CONSTRUCTION: return ResourceCenterNextTurnMeterValue(type); break; case METER_SHIELD: max_meter_type = METER_MAX_SHIELD; break; case METER_TROOPS: max_meter_type = METER_MAX_TROOPS; break; case METER_DEFENSE: max_meter_type = METER_MAX_DEFENSE; break; case METER_SUPPLY: max_meter_type = METER_MAX_SUPPLY; break; break; default: return UniverseObject::NextTurnCurrentMeterValue(type); } const Meter* meter = GetMeter(type); if (!meter) { throw std::invalid_argument("Planet::NextTurnCurrentMeterValue passed meter type that the Planet does not have, but should: " + boost::lexical_cast<std::string>(type)); } float current_meter_value = meter->Current(); const Meter* max_meter = GetMeter(max_meter_type); if (!max_meter) { throw std::runtime_error("Planet::NextTurnCurrentMeterValue dealing with invalid meter type: " + boost::lexical_cast<std::string>(type)); } float max_meter_value = max_meter->Current(); // being attacked prevents meter growth if (LastTurnAttackedByShip() >= CurrentTurn()) return std::min(current_meter_value, max_meter_value); // currently meter growth is one per turn. return std::min(current_meter_value + 1.0f, max_meter_value); }
void ResourceCenter::ResourceCenterPopGrowthProductionResearchPhase() { GetMeter(METER_INDUSTRY)->SetCurrent(ResourceCenterNextTurnMeterValue(METER_INDUSTRY)); GetMeter(METER_RESEARCH)->SetCurrent(ResourceCenterNextTurnMeterValue(METER_RESEARCH)); GetMeter(METER_TRADE)->SetCurrent(ResourceCenterNextTurnMeterValue(METER_TRADE)); GetMeter(METER_CONSTRUCTION)->SetCurrent(ResourceCenterNextTurnMeterValue(METER_CONSTRUCTION)); }