GunChleoc has proposed merging lp:~widelands-dev/widelands/bug-1341081 into lp:widelands.
Requested reviews: Widelands Developers (widelands-dev) Related bugs: Bug #1341081 in widelands: "Building help: clean up type() and MapObject::type_name() " https://bugs.launchpad.net/widelands/+bug/1341081 For more details, see: https://code.launchpad.net/~widelands-dev/widelands/bug-1341081/+merge/227107 L_MapObject now has a desc method, so type_name can be accessed through L_MapObjectDescription. The types for Flags and Roads are now faked in the Lua scripts by checking their name rather than their type_name (e.g. "while not (f.immovable and f.immovable.name == "flag") do sleep(300) end", check Atlanteans campaign + Tutorial for examples). This avoids having to get the tribes' Immovable_Descr through the Lua interface. If you think this is a problem, I can have a go at it though. Otherwise, ready for merging. -- https://code.launchpad.net/~widelands-dev/widelands/bug-1341081/+merge/227107 Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/bug-1341081 into lp:widelands.
=== modified file 'campaigns/atl01.wmf/scripting/init.lua' --- campaigns/atl01.wmf/scripting/init.lua 2014-07-15 10:02:22 +0000 +++ campaigns/atl01.wmf/scripting/init.lua 2014-07-16 21:09:18 +0000 @@ -324,7 +324,7 @@ if not f.immovable then return end -- Flags are not so interesting - if f.immovable.type == "flag" and + if f.immovable.name == "flag" and (f.tln.immovable and is_building(f.tln.immovable)) then f = f.tln end === modified file 'campaigns/tutorial01.wmf/scripting/init.lua' --- campaigns/tutorial01.wmf/scripting/init.lua 2014-07-15 10:02:22 +0000 +++ campaigns/tutorial01.wmf/scripting/init.lua 2014-07-16 21:09:18 +0000 @@ -311,7 +311,7 @@ end -- buildings and constructionsite have a flag - if is_building(i) or i.type == "constructionsite" then + if is_building(i) or i.descr.type_name == "constructionsite" then registered_player_immovables[_fmt(i.fields[1].brn)] = true end end @@ -350,15 +350,15 @@ -- Allows constructionsites for the given buildings, all others are invalid -- as is any other immovable build by the player function allow_constructionsite(i, buildings) - if i.type == "constructionsite" then + if i.descr.type_name == "constructionsite" then if not buildings then return i end for idx,n in ipairs(buildings) do if i.building == n then return i end end return false - elseif i.type == "flag" then + elseif i.name == "flag" then local tr = i.fields[1].tln.immovable - if tr and tr.type == "constructionsite" then + if tr and tr.descr.type_name == "constructionsite" then return allow_constructionsite(tr, buildings) end end @@ -442,7 +442,7 @@ blocker:lift_blocks() -- Wait for flag - while not (f.immovable and f.immovable.type == "flag") do sleep(300) end + while not (f.immovable and f.immovable.name == "flag") do sleep(300) end o.done = true sleep(300) @@ -506,7 +506,7 @@ local function _rip_road() for idx,f in ipairs(cs.fields[1].brn:region(2)) do - if f.immovable and f.immovable.type == "road" then + if f.immovable and f.immovable.name == "road" then click_on_field(f) click_on_panel(wl.ui.MapView().windows. field_action.buttons.destroy_road, 300) @@ -671,7 +671,7 @@ local function _find_nearby_flag() for i=2,8 do for idx, f in ipairs(conquer_field:region(i)) do - if f.immovable and f.immovable.type == "flag" then + if f.immovable and f.immovable.name == "flag" then return f end end === modified file 'scripting/format_help.lua' --- scripting/format_help.lua 2014-07-15 10:02:22 +0000 +++ scripting/format_help.lua 2014-07-16 21:09:18 +0000 @@ -331,23 +331,23 @@ image_line("tribes/" .. tribename .. "/" .. resourcename .. "/menu.png", 1, p(purpose)) if (note) then result = result .. rt(h3(_"Note:")) .. rt(p(note)) end - if(building_description.type == "productionsite") then + if(building_description.type_name == "productionsite") then if(building_description.workarea_radius and building_description.workarea_radius > 0) then result = result .. text_line(_"Working radius:", building_description.workarea_radius) end - elseif(building_description.type == "warehouse") then + elseif(building_description.type_name == "warehouse") then result = result .. rt(h3(_"Healing:") .. p(_"Garrisoned soldiers heal %s per second":bformat(building_description.heal_per_second))) result = result .. text_line(_"Conquer range:", building_description.conquers) - elseif(building_description.type == "militarysite") then + elseif(building_description.type_name == "militarysite") then result = result .. rt(h3(_"Healing:") .. p(_"Garrisoned soldiers heal %s per second":bformat(building_description.heal_per_second))) result = result .. text_line(_"Capacity:", building_description.max_number_of_soldiers) result = result .. text_line(_"Conquer range:", building_description.conquers) - elseif(building_description.type == "trainingsite") then + elseif(building_description.type_name == "trainingsite") then result = result .. rt(h3(_"Training:")) if(building_description.max_attack and building_description.min_attack) then -- TRANSLATORS: %1$s = Health, Evade, Attack or Defense. %2$s and %3$s are numbers. @@ -695,7 +695,7 @@ local building_description = wl.Game():get_building_description(tribename, building_description.name) local result = "" - if(building_description.type == "productionsite" or building_description.type == "trainingsite") then + if(building_description.type_name == "productionsite" or building_description.type_name == "trainingsite") then result = result .. rt(h2(_"Workers")) .. rt(h3(_"Crew required:")) === modified file 'scripting/infrastructure.lua' --- scripting/infrastructure.lua 2014-06-18 18:08:20 +0000 +++ scripting/infrastructure.lua 2014-07-16 21:09:18 +0000 @@ -169,8 +169,8 @@ -- -- :returns: true if the immovable is a building function is_building(immovable) - return immovable.type == "productionsite" or - immovable.type == "warehouse" or - immovable.type == "militarysite" or - immovable.type == "trainingsite" + return immovable.descr.type_name == "productionsite" or + immovable.descr.type_name == "warehouse" or + immovable.descr.type_name == "militarysite" or + immovable.descr.type_name == "trainingsite" end === modified file 'src/economy/flag.h' --- src/economy/flag.h 2014-07-14 14:40:42 +0000 +++ src/economy/flag.h 2014-07-16 21:09:18 +0000 @@ -33,6 +33,16 @@ class WareInstance; +class Flag_Descr : public Map_Object_Descr +{ + +public: + Flag_Descr(char const * const name, char const * const descname); + virtual ~Flag_Descr(); + + char const * type_name() const override {return "flag";} +}; + /** * Flag represents a flag, obviously. @@ -59,6 +69,8 @@ friend struct Map_Waredata_Data_Packet; // has to look at pending wares friend struct Router; + MO_DESCR(Flag_Descr); + Flag(); /// empty flag for savegame loading Flag(Editor_Game_Base &, Player & owner, Coords); /// create a new flag virtual ~Flag(); @@ -67,7 +79,6 @@ virtual void destroy(Editor_Game_Base &) override; virtual int32_t get_type () const override; - char const * type_name() const override {return "flag";} virtual int32_t get_size () const override; virtual bool get_passable() const override; === modified file 'src/economy/fleet.cc' --- src/economy/fleet.cc 2014-07-14 22:18:03 +0000 +++ src/economy/fleet.cc 2014-07-16 21:09:18 +0000 @@ -40,14 +40,11 @@ namespace Widelands { -namespace { - // Every Map_Object() needs to have a description. So we make a dummy one for // Fleet. Map_Object_Descr* fleet_description() { static Map_Object_Descr fleet_descr("fleet", "Fleet"); return &fleet_descr; -} } // namespace @@ -70,11 +67,6 @@ return FLEET; } -char const * Fleet::type_name() const -{ - return "fleet"; -} - /** * Whether the fleet is in fact useful for transporting goods. */ === modified file 'src/economy/fleet.h' --- src/economy/fleet.h 2014-07-05 16:41:51 +0000 +++ src/economy/fleet.h 2014-07-16 21:09:18 +0000 @@ -32,6 +32,16 @@ struct RoutingNodeNeighbour; struct Ship; +class Fleet_Descr : public Map_Object_Descr +{ + +public: + Fleet_Descr(char const * const name, char const * const descname); + virtual ~Fleet_Descr(); + + char const * type_name() const override {return "fleet";} +}; + /** * Manage all ships and ports of a player that are connected * by ocean. @@ -58,6 +68,8 @@ PortPath() : cost(-1) {} }; + MO_DESCR(Fleet_Descr); + Fleet(Player & player); Player * get_owner() const {return &m_owner;} @@ -70,7 +82,6 @@ bool active() const; virtual int32_t get_type() const override; - virtual char const * type_name() const override; virtual void init(Editor_Game_Base &) override; virtual void cleanup(Editor_Game_Base &) override; === modified file 'src/economy/portdock.cc' --- src/economy/portdock.cc 2014-07-16 05:33:19 +0000 +++ src/economy/portdock.cc 2014-07-16 21:09:18 +0000 @@ -99,11 +99,6 @@ return PORTDOCK; } -char const * PortDock::type_name() const -{ - return "portdock"; -} - PortDock::PositionList PortDock::get_positions (const Editor_Game_Base &) const { === modified file 'src/economy/portdock.h' --- src/economy/portdock.h 2014-07-14 14:40:42 +0000 +++ src/economy/portdock.h 2014-07-16 21:09:18 +0000 @@ -34,6 +34,16 @@ class Warehouse; class ExpeditionBootstrap; +class PortDock_Descr : public Map_Object_Descr +{ + +public: + PortDock_Descr(char const * const name, char const * const descname); + virtual ~PortDock_Descr(); + + char const * type_name() const override {return "portdock";} +}; + /** * The PortDock occupies the fields in the water at which ships * dock at a port. As such, this class cooperates closely with @@ -62,6 +72,8 @@ */ class PortDock : public PlayerImmovable { public: + MO_DESCR(PortDock_Descr); + PortDock(Warehouse* warehouse); virtual ~PortDock(); @@ -77,7 +89,6 @@ virtual int32_t get_size() const override; virtual bool get_passable() const override; virtual int32_t get_type() const override; - virtual char const * type_name() const override; virtual Flag & base_flag() override; virtual PositionList get_positions === modified file 'src/economy/road.h' --- src/economy/road.h 2014-07-14 14:40:42 +0000 +++ src/economy/road.h 2014-07-16 21:09:18 +0000 @@ -30,6 +30,16 @@ struct Carrier; class Request; +class Road_Descr : public Map_Object_Descr +{ + +public: + Road_Descr(char const * const name, char const * const descname); + virtual ~Road_Descr(); + + char const * type_name() const override {return "road";} +}; + /** * Road is a special object which connects two flags. * The Road itself is never rendered; however, the appropriate Field::roads are @@ -49,6 +59,8 @@ friend class Map_Roaddata_Data_Packet; // For saving friend class Map_Road_Data_Packet; // For init() + MO_DESCR(Road_Descr); + static bool IsRoadDescr(Map_Object_Descr const *); enum FlagId { @@ -75,7 +87,6 @@ virtual int32_t get_type () const override; uint8_t get_roadtype() const {return m_type;} - char const * type_name() const override {return "road";} virtual int32_t get_size () const override; virtual bool get_passable() const override; virtual PositionList get_positions(const Editor_Game_Base &) const override; === modified file 'src/economy/ware_instance.h' --- src/economy/ware_instance.h 2014-07-05 16:41:51 +0000 +++ src/economy/ware_instance.h 2014-07-16 21:09:18 +0000 @@ -62,9 +62,6 @@ ~WareInstance(); virtual int32_t get_type() const override; - char const* type_name() const override { - return "ware"; - } Map_Object* get_location(Editor_Game_Base& egbase) { return m_location.get(egbase); === modified file 'src/logic/battle.cc' --- src/logic/battle.cc 2014-07-03 20:11:14 +0000 +++ src/logic/battle.cc 2014-07-16 21:09:18 +0000 @@ -34,10 +34,7 @@ namespace Widelands { -namespace { -Battle::Descr g_Battle_Descr("battle", "Battle"); -} // namespace - +Map_Object_Descr g_Battle_Descr("battle", "Battle"); Battle::Battle () : === modified file 'src/logic/battle.h' --- src/logic/battle.h 2014-07-05 16:41:51 +0000 +++ src/logic/battle.h 2014-07-16 21:09:18 +0000 @@ -24,6 +24,16 @@ namespace Widelands { class Soldier; +class Battle_Descr : public Map_Object_Descr +{ + +public: + Battle_Descr(char const * const name, char const * const descname); + virtual ~Battle_Descr(); + + char const * type_name() const override {return "battle";} +}; + /** * Manages the battle between two opposing soldiers. * @@ -34,14 +44,14 @@ */ class Battle : public Map_Object { public: - typedef Map_Object_Descr Descr; + + MO_DESCR(Battle_Descr); Battle(); // for loading an existing battle from a savegame Battle(Game &, Soldier &, Soldier &); // to create a new battle in the game // Implements Map_Object. virtual int32_t get_type() const override {return BATTLE;} - virtual char const * type_name() const override {return "battle";} virtual void init(Editor_Game_Base &) override; virtual void cleanup(Editor_Game_Base &) override; virtual bool has_new_save_support() override {return true;} === modified file 'src/logic/bob.h' --- src/logic/bob.h 2014-07-15 10:02:22 +0000 +++ src/logic/bob.h 2014-07-16 21:09:18 +0000 @@ -55,7 +55,7 @@ public: friend struct Map_Bobdata_Data_Packet; - std::string type() const override {return "bob";} + char const * type_name() const override {return "bob";} BobDescr(const std::string& init_name, const std::string& init_descname, @@ -229,7 +229,6 @@ int32_t get_animstart() const {return m_animstart;} virtual int32_t get_type() const override {return BOB;} - virtual char const * type_name() const override {return "bob";} virtual Type get_bob_type() const = 0; virtual void init(Editor_Game_Base &) override; === modified file 'src/logic/building.h' --- src/logic/building.h 2014-07-16 05:54:49 +0000 +++ src/logic/building.h 2014-07-16 21:09:18 +0000 @@ -65,7 +65,7 @@ const std::string & directory, Profile &, Section & global_s, const Tribe_Descr &); - std::string type() const override { + char const * type_name() const override { return "building"; } @@ -183,7 +183,6 @@ void load_finish(Editor_Game_Base &) override; virtual int32_t get_type () const override; - char const * type_name() const override {return "building";} virtual int32_t get_size () const override; virtual bool get_passable() const override; virtual uint32_t get_ui_anim () const; === modified file 'src/logic/carrier.h' --- src/logic/carrier.h 2014-07-11 22:53:34 +0000 +++ src/logic/carrier.h 2014-07-16 21:09:18 +0000 @@ -43,7 +43,7 @@ virtual Worker_Type get_worker_type() const override {return CARRIER;} // class type needed for Lua stuffl TODO: redundant with get_worker_type()? - std::string type() const override {return "carrier";} + char const * type_name() const override {return "carrier";} protected: virtual Bob & create_object() const override {return *new Carrier(*this);} === modified file 'src/logic/constructionsite.h' --- src/logic/constructionsite.h 2014-07-11 22:53:34 +0000 +++ src/logic/constructionsite.h 2014-07-16 21:09:18 +0000 @@ -56,7 +56,7 @@ const Tribe_Descr & tribe); virtual Building & create_object() const override; - std::string type() const override {return "constructionsite";} + char const * type_name() const override {return "constructionsite";} }; class ConstructionSite : public Partially_Finished_Building { @@ -69,7 +69,6 @@ public: ConstructionSite(const ConstructionSite_Descr & descr); - char const * type_name() const override {return "constructionsite";} virtual std::string get_statistics_string() override; const Player::Constructionsite_Information & get_info() {return m_info;} === modified file 'src/logic/critter_bob.h' --- src/logic/critter_bob.h 2014-07-14 11:30:37 +0000 +++ src/logic/critter_bob.h 2014-07-16 21:09:18 +0000 @@ -43,7 +43,7 @@ virtual ~Critter_Bob_Descr(); Bob & create_object() const override; - std::string type() const override {return "critterbob";} + char const * type_name() const override {return "critterbob";} bool is_swimming() const; uint32_t movecaps() const override; @@ -67,7 +67,6 @@ public: Critter_Bob(const Critter_Bob_Descr &); - char const * type_name() const override {return "critter";} virtual Bob::Type get_bob_type() const override {return Bob::CRITTER;} virtual void init_auto_task(Game &) override; === modified file 'src/logic/dismantlesite.h' --- src/logic/dismantlesite.h 2014-07-11 22:53:34 +0000 +++ src/logic/dismantlesite.h 2014-07-16 21:09:18 +0000 @@ -48,7 +48,7 @@ const Tribe_Descr & tribe); virtual Building & create_object() const override; - std::string type() const override {return "dismantlesite";} + char const * type_name() const override {return "dismantlesite";} }; class DismantleSite : public Partially_Finished_Building { @@ -64,7 +64,6 @@ (const DismantleSite_Descr & descr, Editor_Game_Base &, Coords const, Player &, bool, Building::FormerBuildings & former_buildings); - char const * type_name() const override {return "dismantlesite";} virtual std::string get_statistics_string() override; virtual bool burn_on_destroy() override; === modified file 'src/logic/immovable.h' --- src/logic/immovable.h 2014-07-15 10:02:22 +0000 +++ src/logic/immovable.h 2014-07-16 21:09:18 +0000 @@ -102,7 +102,7 @@ ~Immovable_Descr(); - std::string type() const override {return "immovable";} + char const * type_name() const override {return "immovable";} int32_t get_size() const {return m_size;} ImmovableProgram const * get_program(const std::string &) const; @@ -163,7 +163,6 @@ virtual PositionList get_positions (const Editor_Game_Base &) const override; virtual int32_t get_type () const override; - char const * type_name() const override {return "immovable";} virtual int32_t get_size () const override; virtual bool get_passable() const override; void start_animation(const Editor_Game_Base &, uint32_t anim); === modified file 'src/logic/instances.h' --- src/logic/instances.h 2014-07-15 10:02:22 +0000 +++ src/logic/instances.h 2014-07-16 21:09:18 +0000 @@ -58,7 +58,7 @@ } virtual ~Map_Object_Descr() {m_anims.clear();} - virtual std::string type() const { + virtual char const * type_name() const { return "mapobject"; } @@ -201,7 +201,6 @@ public: virtual int32_t get_type() const = 0; - virtual char const * type_name() const {return "map object";} Serial serial() const {return m_serial;} === modified file 'src/logic/militarysite.h' --- src/logic/militarysite.h 2014-07-11 22:53:34 +0000 +++ src/logic/militarysite.h 2014-07-16 21:09:18 +0000 @@ -39,7 +39,7 @@ const Tribe_Descr & tribe, const World& world); virtual Building & create_object() const override; - virtual std::string type() const override { + char const * type_name() const override { return "militarysite"; } @@ -82,7 +82,6 @@ MilitarySite(const MilitarySite_Descr &); virtual ~MilitarySite(); - char const * type_name() const override {return "militarysite";} virtual std::string get_statistics_string() override; virtual void init(Editor_Game_Base &) override; === modified file 'src/logic/productionsite.h' --- src/logic/productionsite.h 2014-07-11 22:53:34 +0000 +++ src/logic/productionsite.h 2014-07-16 21:09:18 +0000 @@ -62,7 +62,7 @@ virtual Building & create_object() const override; - virtual std::string type() const override { + char const * type_name() const override { return "productionsite"; } @@ -146,7 +146,6 @@ virtual WaresQueue & waresqueue(Ware_Index) override; - char const * type_name() const override {return "productionsite";} virtual void init(Editor_Game_Base &) override; virtual void cleanup(Editor_Game_Base &) override; virtual void act(Game &, uint32_t data) override; === modified file 'src/logic/ship.h' --- src/logic/ship.h 2014-07-15 10:02:22 +0000 +++ src/logic/ship.h 2014-07-16 21:09:18 +0000 @@ -44,7 +44,7 @@ virtual Bob & create_object() const override; - std::string type() const override { + char const * type_name() const override { return "ship"; } === modified file 'src/logic/soldier.h' --- src/logic/soldier.h 2014-07-15 10:02:22 +0000 +++ src/logic/soldier.h 2014-07-16 21:09:18 +0000 @@ -49,7 +49,7 @@ // NOTE as well defined in an enum in instances.h virtual Worker_Type get_worker_type() const override {return Worker_Descr::SOLDIER;} - std::string type() const override {return "soldier";} + char const * type_name() const override {return "soldier";} virtual void load_graphics() override; === modified file 'src/logic/trainingsite.h' --- src/logic/trainingsite.h 2014-07-11 22:53:34 +0000 +++ src/logic/trainingsite.h 2014-07-16 21:09:18 +0000 @@ -36,7 +36,7 @@ const std::string & directory, Profile &, Section & global_s, const Tribe_Descr & tribe, const World& world); - std::string type() const override {return "trainingsite";} + char const * type_name() const override {return "trainingsite";} virtual Building & create_object() const override; @@ -121,7 +121,6 @@ public: TrainingSite(const TrainingSite_Descr &); - char const * type_name() const override {return "trainingsite";} virtual std::string get_statistics_string() override; virtual void init(Editor_Game_Base &) override; === modified file 'src/logic/ware_descr.h' --- src/logic/ware_descr.h 2014-07-11 22:53:34 +0000 +++ src/logic/ware_descr.h 2014-07-16 21:09:18 +0000 @@ -52,7 +52,7 @@ virtual ~WareDescr() {} - std::string type() const override {return "ware";} + char const * type_name() const override {return "ware";} const Tribe_Descr & tribe() const {return m_tribe;} === modified file 'src/logic/warehouse.cc' --- src/logic/warehouse.cc 2014-07-15 10:02:22 +0000 +++ src/logic/warehouse.cc 2014-07-16 21:09:18 +0000 @@ -450,7 +450,7 @@ schedule_act (ref_cast<Game, Editor_Game_Base>(egbase), 4000); - log("Message: adding (wh) (%s) %i \n", type_name(), player.player_number()); + log("Message: adding (wh) (%s) %i \n", descr().type_name(), player.player_number()); char message[2048]; snprintf (message, sizeof(message), === modified file 'src/logic/warehouse.h' --- src/logic/warehouse.h 2014-07-11 22:53:34 +0000 +++ src/logic/warehouse.h 2014-07-16 21:09:18 +0000 @@ -53,7 +53,7 @@ const std::string & directory, Profile &, Section & global_s, const Tribe_Descr &); - std::string type() const override {return "warehouse";} + char const * type_name() const override {return "warehouse";} virtual Building & create_object() const override; @@ -115,8 +115,6 @@ void load_finish(Editor_Game_Base &) override; - char const * type_name() const override {return "warehouse";} - /// Called only when the oject is logically created in the simulation. If /// called again, such as when the object is loaded from a savegame, it will /// cause bugs. === modified file 'src/logic/worker.h' --- src/logic/worker.h 2014-07-15 10:02:22 +0000 +++ src/logic/worker.h 2014-07-16 21:09:18 +0000 @@ -80,7 +80,7 @@ virtual Worker_Descr::Worker_Type get_worker_type() const { return descr().get_worker_type(); } - char const * type_name() const override {return "worker";} + virtual Bob::Type get_bob_type() const override {return Bob::WORKER;} uint32_t get_animation(char const * const str) const { === modified file 'src/logic/worker_descr.h' --- src/logic/worker_descr.h 2014-07-11 22:53:34 +0000 +++ src/logic/worker_descr.h 2014-07-16 21:09:18 +0000 @@ -55,7 +55,7 @@ const Tribe_Descr &); virtual ~Worker_Descr(); - std::string type() const override {return "worker";} + char const * type_name() const override {return "worker";} virtual Bob & create_object() const override; === modified file 'src/map_io/widelands_map_map_object_loader.h' --- src/map_io/widelands_map_map_object_loader.h 2014-07-05 16:41:51 +0000 +++ src/map_io/widelands_map_map_object_loader.h 2014-07-16 21:09:18 +0000 @@ -64,7 +64,7 @@ if (existing != m_objects.end()) { //delete &object; can not do this throw game_data_error - ("already loaded (%s)", existing->second->type_name()); + ("already loaded (%s)", existing->second->descr().type_name()); } m_objects.insert(std::pair<Serial, Map_Object *>(n, &object)); m_loaded_obj[&object] = false; @@ -80,7 +80,7 @@ else throw game_data_error ("is a %s, expected a %s", - it->second->type_name(), typeid(T).name()); + it->second->descr().type_name(), typeid(T).name()); } int32_t get_nr_unloaded_objects(); === modified file 'src/map_io/widelands_map_map_object_saver.cc' --- src/map_io/widelands_map_map_object_saver.cc 2014-07-05 12:17:03 +0000 +++ src/map_io/widelands_map_map_object_saver.cc 2014-07-16 21:09:18 +0000 @@ -61,7 +61,7 @@ MapObjectRec rec; #ifndef NDEBUG - rec.description = obj.type_name(); + rec.description = obj.descr().type_name(); rec.description += " ("; rec.description += obj.serial(); rec.description += ')'; === modified file 'src/map_io/widelands_map_object_packet.cc' --- src/map_io/widelands_map_object_packet.cc 2014-06-21 10:24:12 +0000 +++ src/map_io/widelands_map_object_packet.cc 2014-07-16 21:09:18 +0000 @@ -112,7 +112,7 @@ try { (*i.current)->load_pointers(); } catch (const std::exception & e) { - throw wexception("load_pointers for %s: %s", (*i.current)->get_object()->type_name(), e.what()); + throw wexception("load_pointers for %s: %s", (*i.current)->get_object()->descr().type_name(), e.what()); } } @@ -121,7 +121,7 @@ try { (*i.current)->load_finish(); } catch (const std::exception & e) { - throw wexception("load_finish for %s: %s", (*i.current)->get_object()->type_name(), e.what()); + throw wexception("load_finish for %s: %s", (*i.current)->get_object()->descr().type_name(), e.what()); } (*i.current)->mol().mark_object_as_loaded(*(*i.current)->get_object()); } === modified file 'src/scripting/lua_map.cc' --- src/scripting/lua_map.cc 2014-07-16 06:05:23 +0000 +++ src/scripting/lua_map.cc 2014-07-16 21:09:18 +0000 @@ -562,7 +562,7 @@ switch (mo->get_type()) { case Map_Object::BUILDING: { - const char * type_name = mo->type_name(); + const char * type_name = mo->descr().type_name(); if (!strcmp(type_name, "constructionsite")) return CAST_TO_LUA(ConstructionSite); else if (!strcmp(type_name, "productionsite")) @@ -606,6 +606,9 @@ else if (is_a(ProductionSite_Descr, desc)) { return CAST_TO_LUA(ProductionSite_Descr, L_ProductionSiteDescription); } + else if (is_a(ConstructionSite_Descr, desc)) { + return CAST_TO_LUA(ConstructionSite_Descr, L_ConstructionSiteDescription); + } else if (is_a(Warehouse_Descr, desc)) { return CAST_TO_LUA(Warehouse_Descr, L_WarehouseDescription); } @@ -1023,7 +1026,7 @@ const PropertyType<L_MapObjectDescription> L_MapObjectDescription::Properties[] = { PROP_RO(L_MapObjectDescription, descname), PROP_RO(L_MapObjectDescription, name), - PROP_RO(L_MapObjectDescription, type), + PROP_RO(L_MapObjectDescription, type_name), {nullptr, nullptr, nullptr}, }; @@ -1059,8 +1062,8 @@ (RO) the name of the building, e.g. building. */ -int L_MapObjectDescription::get_type(lua_State * L) { - lua_pushstring(L, get()->type()); +int L_MapObjectDescription::get_type_name(lua_State * L) { + lua_pushstring(L, get()->type_name()); return 1; } @@ -1289,6 +1292,24 @@ return 1; } +/* RST +ConstructionSiteDescription +---------- + +.. class:: ConstructionSiteDescription + + A static description of a tribe's constructionsite, so it can be used in help files + without having to access an actual building on the map. + See also class BuildingDescription and class MapObjectDescription for more properties. +*/ +const char L_ConstructionSiteDescription::className[] = "ConstructionSiteDescription"; +const MethodType<L_ConstructionSiteDescription> L_ConstructionSiteDescription::Methods[] = { + {nullptr, nullptr}, +}; +const PropertyType<L_ConstructionSiteDescription> L_ConstructionSiteDescription::Properties[] = { + {nullptr, nullptr, nullptr}, +}; + /* RST ProductionSiteDescription @@ -1706,7 +1727,7 @@ if (std::string(get()->name()) == std::string(tribe.get_ware_descr(ware_index)->name())) { lua_pushint32(L, index++); - upcasted_building_descr_to_lua(L, tribe.get_building_descr(i)); + upcasted_building_descr_to_lua(L, tribe.get_building_descr(i)); lua_rawset(L, -3); } } @@ -1745,7 +1766,7 @@ if (std::string(get()->name()) == std::string(tribe.get_ware_descr(ware_amount.first)->name())) { lua_pushint32(L, index++); - upcasted_building_descr_to_lua(L, tribe.get_building_descr(i)); + upcasted_building_descr_to_lua(L, tribe.get_building_descr(i)); lua_rawset(L, -3); } } @@ -1892,10 +1913,9 @@ }; const PropertyType<L_MapObject> L_MapObject::Properties[] = { PROP_RO(L_MapObject, __hash), + PROP_RO(L_MapObject, descr), + PROP_RO(L_MapObject, name), PROP_RO(L_MapObject, serial), - PROP_RO(L_MapObject, type), - PROP_RO(L_MapObject, name), - PROP_RO(L_MapObject, descname), {nullptr, nullptr, nullptr}, }; @@ -1944,17 +1964,6 @@ return 1; } -/* RST - .. attribute:: type - - (RO) the type name of this map object. You can determine with what kind - of object you cope by looking at this attribute. Some example types: - immovable, flag, road, productionsite, warehouse, militarysite... -*/ -int L_MapObject::get_type(lua_State * L) { - lua_pushstring(L, get(L, get_egbase(L))->type_name()); - return 1; -} /* RST .. attribute:: name @@ -1967,19 +1976,43 @@ return 1; } +// use the dynamic type of BuildingDescription +#define CAST_TO_LUA(klass, lua_klass) to_lua<lua_klass> \ + (L, new lua_klass(static_cast<const klass *>(desc))) + /* RST - .. attribute:: descname + .. attribute:: descr - (RO) The descriptive (and translated) name of this Map Object. Use this - in messages to the player instead of name. + (RO) The description object for this immovable, e.g. BuildingDescription. */ -int L_MapObject::get_descname(lua_State * L) { - lua_pushstring(L, get(L, get_egbase(L))->descr().descname().c_str()); - return 1; +int L_MapObject::get_descr(lua_State * L) { + //TODO(GunChleoc) Flag_Descr would be nice for getting the type of immovables, + // at the moment the type for these can be faked by using their name instead + const Map_Object_Descr* desc = &get(L, get_egbase(L))->descr(); + assert(desc != nullptr); + + if (is_a(MilitarySite_Descr, desc)) { + return CAST_TO_LUA(MilitarySite_Descr, L_MilitarySiteDescription); + } + else if (is_a(TrainingSite_Descr, desc)) { + return CAST_TO_LUA(TrainingSite_Descr, L_TrainingSiteDescription); + } + else if (is_a(ProductionSite_Descr, desc)) { + return CAST_TO_LUA(ProductionSite_Descr, L_ProductionSiteDescription); + } + else if (is_a(Warehouse_Descr, desc)) { + return CAST_TO_LUA(Warehouse_Descr, L_WarehouseDescription); + } + else if (is_a(ConstructionSite_Descr, desc)) { + return CAST_TO_LUA(ConstructionSite_Descr, L_ConstructionSiteDescription); + } + else if (is_a(Building_Descr, desc)) { + return CAST_TO_LUA(Building_Descr, L_BuildingDescription); + } + return CAST_TO_LUA(Map_Object_Descr, L_MapObjectDescription); } - - +#undef CAST_TO_LUA /* ========================================================== @@ -3983,6 +4016,11 @@ add_parent<L_BuildingDescription, L_MapObjectDescription>(L); lua_pop(L, 1); // Pop the meta table + register_class<L_ConstructionSiteDescription>(L, "map", true); + add_parent<L_ConstructionSiteDescription, L_BuildingDescription>(L); + add_parent<L_ConstructionSiteDescription, L_MapObjectDescription>(L); + lua_pop(L, 1); // Pop the meta table + register_class<L_ProductionSiteDescription>(L, "map", true); add_parent<L_ProductionSiteDescription, L_BuildingDescription>(L); add_parent<L_ProductionSiteDescription, L_MapObjectDescription>(L); === modified file 'src/scripting/lua_map.h' --- src/scripting/lua_map.h 2014-07-15 10:02:22 +0000 +++ src/scripting/lua_map.h 2014-07-16 21:09:18 +0000 @@ -112,7 +112,7 @@ * Properties */ int get_name(lua_State *); - int get_type(lua_State *); + int get_type_name(lua_State *); int get_descname(lua_State *); /* @@ -189,6 +189,36 @@ }; +class L_ConstructionSiteDescription : public L_BuildingDescription { +public: + LUNA_CLASS_HEAD(L_ConstructionSiteDescription); + + virtual ~L_ConstructionSiteDescription() {} + + L_ConstructionSiteDescription() {} + L_ConstructionSiteDescription(const Widelands::ConstructionSite_Descr* const constructionsitedescr) + : L_BuildingDescription(constructionsitedescr) { + } + L_ConstructionSiteDescription(lua_State* L) : L_BuildingDescription(L) { + } + + /* + * Properties + */ + + /* + * Lua methods + */ + + /* + * C methods + */ + +private: + CASTED_GET_DESCRIPTION(ConstructionSite_Descr); +}; + + class L_ProductionSiteDescription : public L_BuildingDescription { public: LUNA_CLASS_HEAD(L_ProductionSiteDescription); @@ -428,10 +458,9 @@ * attributes */ int get___hash(lua_State *); + int get_descr(lua_State *); + int get_name(lua_State *); int get_serial(lua_State *); - int get_type(lua_State *); - int get_name(lua_State *); - int get_descname(lua_State *); /* * Lua Methods
_______________________________________________ Mailing list: https://launchpad.net/~widelands-dev Post to : widelands-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~widelands-dev More help : https://help.launchpad.net/ListHelp