From: <tz...@us...> - 2009-03-24 02:35:59
|
Revision: 2933 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2933&view=rev Author: tzlaine Date: 2009-03-24 02:35:51 +0000 (Tue, 24 Mar 2009) Log Message: ----------- More work on ShipDesign hull and parts stuff. - Changed the hull and part parsers to expect camelCase instead of underscore_separated, in keeping with previous parser work. - Added a health value to hulls. - Changed FighterStats and LRStats m_capacity stats from doubles to ints. - Removed m_range from FighterStats. - Added code to Ship ctor to create fighters as appropriate. Modified Paths: -------------- trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/default/ship_hulls.txt trunk/FreeOrion/universe/Parser.h trunk/FreeOrion/universe/Ship.cpp trunk/FreeOrion/universe/Ship.h trunk/FreeOrion/universe/ShipDesign.cpp trunk/FreeOrion/universe/ShipDesign.h trunk/FreeOrion/universe/TopLevelParsers.cpp Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2009-03-23 09:40:13 UTC (rev 2932) +++ trunk/FreeOrion/default/eng_stringtable.txt 2009-03-24 02:35:51 UTC (rev 2933) @@ -3809,7 +3809,8 @@ HULL_DESC '''Starlane Speed: %1% Fuel Capacity: %2% -Combat Speed: %3%''' +Combat Speed: %3% +Health: %4%''' PART_DESC_CAPACITY Capacity: %1% @@ -3836,7 +3837,6 @@ Fighter Anti-Fighter Damage: %2% Fighter Anti-Ship Damage: %3% Fighter Launch Rate: %4% fighters/turn -Fighter Range: %5% Fighter Speed: %6% Fighter Health: %7% Fighter Stealth: %8% Modified: trunk/FreeOrion/default/ship_hulls.txt =================================================================== --- trunk/FreeOrion/default/ship_hulls.txt 2009-03-23 09:40:13 UTC (rev 2932) +++ trunk/FreeOrion/default/ship_hulls.txt 2009-03-24 02:35:51 UTC (rev 2933) @@ -2,10 +2,11 @@ name = "SH_EMPTY" description = "SH_EMPTY_DESC" speed = 120 - starlane_speed = 120 + starlaneSpeed = 120 fuel = 3 - buildcost = 1 - buildtime = 1 + health = 30 + buildCost = 1 + buildTime = 1 location = And [ OwnedBy TheEmpire Source.Owner Contains Building name = "BLD_SHIPYARD_BASE" @@ -16,10 +17,11 @@ name = "SH_SMALL" description = "SH_SMALL_DESC" speed = 80 - starlane_speed = 80 + starlaneSpeed = 80 fuel = 3 - buildcost = 10 - buildtime = 4 + health = 40 + buildCost = 10 + buildTime = 4 slots = [ Slot type = External position = (0.20, 0.40) Slot type = External position = (0.40, 0.40) @@ -35,10 +37,11 @@ name = "SH_MEDIUM" description = "SH_MEDIUM_DESC" speed = 50 - starlane_speed = 50 + starlaneSpeed = 50 fuel = 5 - buildcost = 20 - buildtime = 5 + health = 50 + buildCost = 20 + buildTime = 5 slots = [ Slot type = External position = (0.20, 0.15) Slot type = External position = (0.40, 0.15) @@ -56,10 +59,11 @@ name = "SH_LARGE" description = "SH_LARGE_DESC" speed = 40 - starlane_speed = 40 + starlaneSpeed = 40 fuel = 3 - buildcost = 30 - buildtime = 6 + health = 65 + buildCost = 30 + buildTime = 6 slots = [ Slot type = External position = (0.15, 0.15) Slot type = External position = (0.30, 0.15) @@ -79,10 +83,11 @@ name = "SH_HUGE" description = "SH_HUGE_DESC" speed = 30 - starlane_speed = 30 + starlaneSpeed = 30 fuel = 1 - buildcost = 50 - buildtime = 8 + health = 80 + buildCost = 50 + buildTime = 8 slots = [ Slot type = External position = (0.10, 0.15) Slot type = External position = (0.25, 0.15) Modified: trunk/FreeOrion/universe/Parser.h =================================================================== --- trunk/FreeOrion/universe/Parser.h 2009-03-23 09:40:13 UTC (rev 2932) +++ trunk/FreeOrion/universe/Parser.h 2009-03-24 02:35:51 UTC (rev 2933) @@ -153,7 +153,7 @@ struct PartStatsClosure : boost::spirit::closure<PartStatsClosure, PartTypeStats, double, double, double, double, double, double, CombatFighterType, - double, double, double, double> + double, double, double, int> { member1 this_; member2 damage; @@ -186,7 +186,7 @@ }; struct HullClosure : boost::spirit::closure<HullClosure, HullType*, std::string, std::string, double, double, - double, double, int, std::vector<HullType::Slot>, + double, double, double, int, std::vector<HullType::Slot>, Condition::ConditionBase*, std::string> { member1 this_; @@ -195,11 +195,12 @@ member4 speed; member5 starlane_speed; member6 fuel; - member7 cost; - member8 build_time; - member9 slots; - member10 location; - member11 graphic; + member7 health; + member8 cost; + member9 build_time; + member10 slots; + member11 location; + member12 graphic; }; extern boost::spirit::rule<Scanner, BuildingTypeClosure::context_t> building_type_p; Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2009-03-23 09:40:13 UTC (rev 2932) +++ trunk/FreeOrion/universe/Ship.cpp 2009-03-24 02:35:51 UTC (rev 2933) @@ -21,14 +21,25 @@ AddOwner(empire_id); - Init(); -} - -void Ship::Init() { InsertMeter(METER_FUEL, Meter()); InsertMeter(METER_SHIELD, Meter()); InsertMeter(METER_DETECTION, Meter()); InsertMeter(METER_STEALTH, Meter()); + InsertMeter(METER_HEALTH, Meter()); + + const std::vector<std::string>& part_names = Design()->Parts(); + for (std::size_t i = 0; i < part_names.size(); ++i) { + if (part_names[i] != "") { + const PartType* part = GetPartType(part_names[i]); + assert(part); + if (part->Class() == PC_FIGHTERS) { + std::pair<std::size_t, std::size_t>& part_fighters = + m_fighters[part_names[i]]; + ++part_fighters.first; + part_fighters.second = boost::get<FighterStats>(part->Stats()).m_capacity; + } + } + } } const ShipDesign* Ship::Design() const { @@ -70,6 +81,10 @@ return Design()->Speed(); } +const Ship::FighterMap& Ship::Fighters() const { + return m_fighters; +} + const std::string& Ship::PublicName(int empire_id) const { // Disclose real ship name only to fleet owners. Rationale: a player who doesn't know the design for a particular // ship can easily guess it if the ship's name is "Scout" Modified: trunk/FreeOrion/universe/Ship.h =================================================================== --- trunk/FreeOrion/universe/Ship.h 2009-03-23 09:40:13 UTC (rev 2932) +++ trunk/FreeOrion/universe/Ship.h 2009-03-24 02:35:51 UTC (rev 2933) @@ -5,6 +5,7 @@ #include "UniverseObject.h" #include "Meter.h" +class Fighter; class Fleet; class ShipDesign; @@ -12,6 +13,10 @@ class Ship : public UniverseObject { public: + // map from part type name to (number of parts in the design of that type, + // number of fighters usable with that part type) pairs + typedef std::map<std::string, std::pair<std::size_t, std::size_t> > FighterMap; + /** \name Structors */ //@{ Ship(); ///< default ctor Ship(int empire_id, int design_id); ///< general ctor taking ship's empire and design id; from this the design can be looked up and used to create the ship @@ -30,6 +35,8 @@ bool CanColonize() const; double Speed() const; + const FighterMap& Fighters() const; + virtual UniverseObject* Accept(const UniverseObjectVisitor& visitor) const; virtual double ProjectedCurrentMeter(MeterType type) const; ///< returns expected value of specified meter current value on the next turn @@ -43,12 +50,10 @@ virtual void PopGrowthProductionResearchPhase(); //@} -protected: - void Init(); - private: int m_design_id; int m_fleet_id; + FighterMap m_fighters; friend class boost::serialization::access; template <class Archive> Modified: trunk/FreeOrion/universe/ShipDesign.cpp =================================================================== --- trunk/FreeOrion/universe/ShipDesign.cpp 2009-03-23 09:40:13 UTC (rev 2932) +++ trunk/FreeOrion/universe/ShipDesign.cpp 2009-03-24 02:35:51 UTC (rev 2933) @@ -41,17 +41,28 @@ const phoenix::function<store_hull_type_impl> store_hull_type_; + struct PartTypeStringVisitor : + public boost::static_visitor<> + { + PartTypeStringVisitor(std::string& str) : + m_str(str) + {} + void operator()(const double& d) const + { m_str = "capacity stat"; } + void operator()(const DirectFireStats& stats) const + { m_str = "direct-fire weapon stats"; } + void operator()(const LRStats& stats) const + { m_str = "long-range weapon stats"; } + void operator()(const FighterStats& stats) const + { m_str = "fighter bay stats"; } + std::string& m_str; + }; + std::string PartTypeStatsString(const PartTypeStats& stats) { - if (boost::get<double>(&stats)) - return "capacity stat"; - else if (boost::get<DirectFireStats>(&stats)) - return "direct-fire weapon stats"; - else if (boost::get<LRStats>(&stats)) - return "long-range weapon stats"; - else if (boost::get<FighterStats>(&stats)) - return "fighter bay stats"; - return ""; + std::string retval; + boost::apply_visitor(PartTypeStringVisitor(retval), stats); + return retval; } boost::shared_ptr<const Effect::EffectsGroup> @@ -115,7 +126,6 @@ % stats.m_anti_fighter_damage % stats.m_anti_ship_damage % stats.m_launch_rate - % stats.m_range % stats.m_speed % stats.m_stealth % stats.m_health @@ -130,6 +140,8 @@ //////////////////////////////////////////////// // stat variant types // //////////////////////////////////////////////// +const double DirectFireStats::PD_SELF_DEFENSE_FACTOR = 2.0 / 3.0; + DirectFireStats::DirectFireStats() : m_damage(), m_ROF(), @@ -159,7 +171,7 @@ double speed, double stealth, double health, - double capacity) : + int capacity) : m_damage(damage), m_ROF(ROF), m_range(range), @@ -167,14 +179,17 @@ m_stealth(stealth), m_health(health), m_capacity(capacity) -{} +{ + if (m_capacity < 0) + throw std::runtime_error("Attempted to create a LRStats with a " + "nonpositive capacity."); +} FighterStats::FighterStats() : m_type(), m_anti_fighter_damage(), m_anti_ship_damage(), m_launch_rate(), - m_range(), m_speed(), m_stealth(), m_health(), @@ -186,17 +201,15 @@ double anti_fighter_damage, double anti_ship_damage, double launch_rate, - double range, double speed, double stealth, double health, double detection, - double capacity) : + int capacity) : m_type(type), m_anti_fighter_damage(anti_fighter_damage), m_anti_ship_damage(anti_ship_damage), m_launch_rate(launch_rate), - m_range(range), m_speed(speed), m_stealth(stealth), m_health(health), @@ -209,6 +222,9 @@ if (type == BOMBER && m_anti_ship_damage < m_anti_fighter_damage) throw std::runtime_error("Attempted to create a BOMBER FighterStats with weaker " "anti-ship stat than anti-fighter stat."); + if (m_capacity < 0) + throw std::runtime_error("Attempted to create a FighterStats with a " + "nonpositive capacity."); } @@ -449,20 +465,24 @@ {} HullType::HullType(const std::string& name, const std::string& description, double speed, - double starlane_speed, double fuel, double cost, int build_time, - const std::vector<Slot>& slots, const Condition::ConditionBase* location, - const std::string& graphic) : + double starlane_speed, double fuel, double health, double cost, + int build_time, const std::vector<Slot>& slots, + const Condition::ConditionBase* location, const std::string& graphic) : m_name(name), m_description(description), m_speed(speed), m_starlane_speed(starlane_speed), m_fuel(fuel), + m_health(health), m_cost(cost), m_build_time(build_time), m_slots(slots), m_location(location), m_graphic(graphic) -{ m_effects.push_back(IncreaseMax(METER_FUEL, "MaxFuel", m_fuel)); } +{ + m_effects.push_back(IncreaseMax(METER_FUEL, "MaxFuel", m_fuel)); + m_effects.push_back(IncreaseMax(METER_HEALTH, "MaxHealth", m_health)); +} HullType::~HullType() { delete m_location; } @@ -478,7 +498,8 @@ str(FlexibleFormat(UserString("HULL_DESC")) % m_starlane_speed % m_fuel - % m_speed); + % m_speed + % m_health); return retval; } @@ -494,6 +515,10 @@ return m_fuel; } +double HullType::Health() const { + return m_health; +} + double HullType::Cost() const { return m_cost; } Modified: trunk/FreeOrion/universe/ShipDesign.h =================================================================== --- trunk/FreeOrion/universe/ShipDesign.h 2009-03-23 09:40:13 UTC (rev 2932) +++ trunk/FreeOrion/universe/ShipDesign.h 2009-03-24 02:35:51 UTC (rev 2933) @@ -32,6 +32,10 @@ double m_ROF; double m_range; + /** The factor by which PD damage should be multiplied when used in + defense of the ship firing it. */ + static const double PD_SELF_DEFENSE_FACTOR; + template <class Archive> void serialize(Archive& ar, const unsigned int) { @@ -51,7 +55,7 @@ double speed, double stealth, double health, - double capacity); + int capacity); double m_damage; double m_ROF; @@ -59,7 +63,7 @@ double m_speed; double m_stealth; double m_health; - double m_capacity; + int m_capacity; template <class Archive> void serialize(Archive& ar, const unsigned int) @@ -82,23 +86,21 @@ double anti_fighter_damage, double anti_ship_damage, double launch_rate, - double range, double speed, double stealth, double health, double detection, - double capacity); + int capacity); CombatFighterType m_type; double m_anti_fighter_damage; double m_anti_ship_damage; double m_launch_rate; - double m_range; double m_speed; double m_stealth; double m_health; double m_detection; - double m_capacity; + int m_capacity; template <class Archive> void serialize(Archive& ar, const unsigned int) @@ -107,7 +109,6 @@ & BOOST_SERIALIZATION_NVP(m_anti_fighter_damage) & BOOST_SERIALIZATION_NVP(m_anti_ship_damage) & BOOST_SERIALIZATION_NVP(m_launch_rate) - & BOOST_SERIALIZATION_NVP(m_range) & BOOST_SERIALIZATION_NVP(m_speed) & BOOST_SERIALIZATION_NVP(m_stealth) & BOOST_SERIALIZATION_NVP(m_health) @@ -232,7 +233,7 @@ /** \name Structors */ //@{ HullType(); HullType(const std::string& name, const std::string& description, double speed, - double starlane_speed, double fuel, double cost, int build_time, + double starlane_speed, double fuel, double health, double cost, int build_time, const std::vector<Slot>& slots, const Condition::ConditionBase* location, const std::string& graphic); ~HullType(); @@ -246,6 +247,8 @@ double StarlaneSpeed() const; ///< returns starlane speed of hull double Fuel() const; ///< returns fuel capacity of hull + double Health() const; ///< returns health of hull + double Cost() const; ///< returns cost of hull int BuildTime() const; ///< returns base build time for this hull, before parts are added @@ -268,6 +271,7 @@ double m_speed; double m_starlane_speed; double m_fuel; + double m_health; double m_cost; // in PP int m_build_time; // in turns @@ -373,7 +377,6 @@ ///< returns true if the \a design passed is a valid ShipDesign in terms of its hull and parts. does not check any other member variables static bool ValidDesign(const ShipDesign& design); - private: int m_id; Modified: trunk/FreeOrion/universe/TopLevelParsers.cpp =================================================================== --- trunk/FreeOrion/universe/TopLevelParsers.cpp 2009-03-23 09:40:13 UTC (rev 2932) +++ trunk/FreeOrion/universe/TopLevelParsers.cpp 2009-03-24 02:35:51 UTC (rev 2933) @@ -92,7 +92,7 @@ ParamLabel location_label("location"); ParamLabel partclass_label("class"); ParamLabel speed_label("speed"); - ParamLabel starlane_speed_label("starlane_speed"); + ParamLabel starlane_speed_label("starlanespeed"); ParamLabel slots_label("slots"); ParamLabel mountableslottypes_label("mountableslottypes"); ParamLabel colour_label("colour"); @@ -104,8 +104,8 @@ ParamLabel range_label("range"); ParamLabel stealth_label("stealth"); ParamLabel health_label("health"); - ParamLabel fighter_type_label("fighter_type"); - ParamLabel launch_rate_label("launch_rate"); + ParamLabel fighter_type_label("fightertype"); + ParamLabel launch_rate_label("launchrate"); ParamLabel detection_label("detection"); ParamLabel capacity_label("capacity"); ParamLabel fuel_label("fuel"); @@ -198,16 +198,15 @@ >> anti_ship_damage_label >> real_p[part_stats_p.anti_ship_damage = arg1] >> anti_fighter_damage_label >> real_p[part_stats_p.anti_fighter_damage = arg1] >> launch_rate_label >> real_p[part_stats_p.rate = arg1] - >> range_label >> real_p[part_stats_p.range = arg1] >> speed_label >> real_p[part_stats_p.speed = arg1] >> stealth_label >> real_p[part_stats_p.stealth = arg1] >> health_label >> real_p[part_stats_p.health = arg1] >> detection_label >> real_p[part_stats_p.detection = arg1] - >> capacity_label >> real_p[part_stats_p.capacity = arg1]) + >> capacity_label >> int_p[part_stats_p.capacity = arg1]) [part_stats_p.this_ = construct_<FighterStats>(part_stats_p.fighter_type, part_stats_p.anti_ship_damage, part_stats_p.anti_fighter_damage, part_stats_p.rate, - part_stats_p.range, part_stats_p.speed, part_stats_p.stealth, + part_stats_p.speed, part_stats_p.stealth, part_stats_p.health, part_stats_p.detection, part_stats_p.capacity)] // a single double stat @@ -220,7 +219,7 @@ >> speed_label >> real_p[part_stats_p.speed = arg1] >> stealth_label >> real_p[part_stats_p.stealth = arg1] >> health_label >> real_p[part_stats_p.health = arg1] - >> capacity_label >> real_p[part_stats_p.capacity = arg1]) + >> capacity_label >> int_p[part_stats_p.capacity = arg1]) [part_stats_p.this_ = construct_<LRStats>(part_stats_p.damage, part_stats_p.rate, part_stats_p.range, part_stats_p.speed, part_stats_p.stealth, part_stats_p.health, @@ -267,15 +266,16 @@ >> speed_label >> real_p[hull_p.speed = arg1] >> starlane_speed_label >> real_p[hull_p.starlane_speed = arg1] >> fuel_label >> real_p[hull_p.fuel = arg1] + >> health_label >> real_p[hull_p.health = arg1] >> buildcost_label >> real_p[hull_p.cost = arg1] >> buildtime_label >> int_p[hull_p.build_time = arg1] >> !(slots_label >> slot_vec_p[hull_p.slots = arg1]) >> location_label >> condition_p[hull_p.location = arg1] >> graphic_label >> file_name_p[hull_p.graphic = arg1]) [hull_p.this_ = new_<HullType>(hull_p.name, hull_p.description, hull_p.speed, - hull_p.starlane_speed, hull_p.fuel, hull_p.cost, - hull_p.build_time, hull_p.slots, hull_p.location, - hull_p.graphic)]; + hull_p.starlane_speed, hull_p.fuel, hull_p.health, + hull_p.cost, hull_p.build_time, hull_p.slots, + hull_p.location, hull_p.graphic)]; return true; } |