void Ship::UpdateEquipStats() { PropertyMap &p = Properties(); m_stats.used_capacity = 0; p.Get("mass_cap", m_stats.used_capacity); m_stats.used_cargo = 0; m_stats.free_capacity = m_type->capacity - m_stats.used_capacity; m_stats.static_mass = m_stats.used_capacity + m_type->hullMass; p.Set("usedCapacity", m_stats.used_capacity); p.Set("freeCapacity", m_stats.free_capacity); p.Set("totalMass", m_stats.static_mass); p.Set("staticMass", m_stats.static_mass); int shield_cap = 0; Properties().Get("shield_cap", shield_cap); m_stats.shield_mass = TONS_HULL_PER_SHIELD * float(shield_cap); p.Set("shieldMass", m_stats.shield_mass); UpdateFuelStats(); m_stats.hyperspace_range = m_stats.hyperspace_range_max = 0; p.Set("hyperspaceRange", m_stats.hyperspace_range); p.Set("maxHyperspaceRange", m_stats.hyperspace_range_max); }
void Ship::UpdateFuel(const float timeStep, const vector3d &thrust) { const double fuelUseRate = GetShipType()->GetFuelUseRate() * 0.01; double totalThrust = (fabs(thrust.x) + fabs(thrust.y) + fabs(thrust.z)) / -GetShipType()->linThrust[ShipType::THRUSTER_FORWARD]; FuelState lastState = GetFuelState(); SetFuel(GetFuel() - timeStep * (totalThrust * fuelUseRate)); FuelState currentState = GetFuelState(); UpdateFuelStats(); if (currentState != lastState) LuaEvent::Queue("onShipFuelChanged", this, EnumStrings::GetString("ShipFuelStatus", currentState)); }
void Ship::UpdateEquipStats() { const ShipType &stype = GetShipType(); m_stats.max_capacity = stype.capacity; m_stats.used_capacity = 0; m_stats.used_cargo = 0; for (int i=0; i<Equip::SLOT_MAX; i++) { for (int j=0; j<stype.equipSlotCapacity[i]; j++) { Equip::Type t = m_equipment.Get(Equip::Slot(i), j); if (t) m_stats.used_capacity += Equip::types[t].mass; if (Equip::Slot(i) == Equip::SLOT_CARGO) m_stats.used_cargo += Equip::types[t].mass; } } m_stats.free_capacity = m_stats.max_capacity - m_stats.used_capacity; m_stats.total_mass = m_stats.used_capacity + stype.hullMass; m_stats.shield_mass = TONS_HULL_PER_SHIELD * float(m_equipment.Count(Equip::SLOT_SHIELD, Equip::SHIELD_GENERATOR)); UpdateMass(); UpdateFuelStats(); Equip::Type fuelType = GetHyperdriveFuelType(); if (stype.equipSlotCapacity[Equip::SLOT_ENGINE]) { Equip::Type t = m_equipment.Get(Equip::SLOT_ENGINE); int hyperclass = Equip::types[t].pval; if (!hyperclass) { // no drive m_stats.hyperspace_range = m_stats.hyperspace_range_max = 0; } else { m_stats.hyperspace_range_max = Pi::CalcHyperspaceRangeMax(hyperclass, GetMass()/1000); m_stats.hyperspace_range = Pi::CalcHyperspaceRange(hyperclass, GetMass()/1000, m_equipment.Count(Equip::SLOT_CARGO, fuelType)); } } else { m_stats.hyperspace_range = m_stats.hyperspace_range_max = 0; } }
void Ship::UpdateStats() { UpdateEquipStats(); UpdateFuelStats(); }