← Back to team overview

widelands-dev team mailing list archive

Re: [Merge] lp:~widelands-dev/widelands/delete_deprecated into lp:widelands

 

Review: Approve

Couple of nits. I suggest to prefer dynamic_cast<> wherever possible (i.e. when you know the type of the object you have) instead of upcast() which is made for if(upcast()) { situations. dynamic_cast<> can also cast references which will make for easier to read code.

Diff comments:

> === modified file 'src/ai/defaultai.cc'
> --- src/ai/defaultai.cc	2014-11-03 06:45:32 +0000
> +++ src/ai/defaultai.cc	2014-11-29 08:14:12 +0000
> @@ -330,13 +330,12 @@
>  
>  		// Read all interesting data from ware producing buildings
>  		if (typeid(bld) == typeid(ProductionSiteDescr)) {
> -			const ProductionSiteDescr& prod =
> -			   ref_cast<ProductionSiteDescr const, BuildingDescr const>(bld);
> +			upcast(ProductionSiteDescr const, prod, &bld);

instead of checking the typeid, you can use if (upcast(...)) {
} which reads a tad bit nicer. That also applies to many other places in the change. I did not point it out all the time.

of course having dynamic type checking in the first place is already code smell.

>  			bo.type = bld.get_ismine() ? BuildingObserver::MINE : BuildingObserver::PRODUCTIONSITE;
> -			for (const WareAmount& temp_input : prod.inputs()) {
> +			for (const WareAmount& temp_input : prod->inputs()) {
>  				bo.inputs_.push_back(temp_input.first);
>  			}
> -			for (const WareIndex& temp_output : prod.output_ware_types()) {
> +			for (const WareIndex& temp_output : prod->output_ware_types()) {
>  				bo.outputs_.push_back(temp_output);
>  			}
>  
> @@ -370,9 +369,8 @@
>  		// non critical are excluded (see below)
>  		if (typeid(bld) == typeid(MilitarySiteDescr)) {
>  			bo.type = BuildingObserver::MILITARYSITE;
> -			const MilitarySiteDescr& milit =
> -			   ref_cast<MilitarySiteDescr const, BuildingDescr const>(bld);
> -			for (const std::pair<unsigned char, unsigned char>& temp_buildcosts : milit.buildcost()) {
> +			upcast(MilitarySiteDescr const, milit, &bld);
> +			for (const std::pair<unsigned char, unsigned char>& temp_buildcosts : milit->buildcost()) {
>  				// bellow are non-critical wares
>  				if (tribe_->ware_index("log") == temp_buildcosts.first ||
>  				    tribe_->ware_index("blackwood") == temp_buildcosts.first ||
> @@ -3007,8 +3005,9 @@
>  	BuildingObserver& bo = get_building_observer(b.descr().name().c_str());
>  
>  	if (bo.type == BuildingObserver::CONSTRUCTIONSITE) {
> +		upcast(ConstructionSite const, constructionsite, &b);
>  		BuildingObserver& target_bo =
> -		   get_building_observer(ref_cast<ConstructionSite, Building>(b).building().name().c_str());
> +			get_building_observer(constructionsite->building().name().c_str());
>  		++target_bo.cnt_under_construction_;
>  		++num_constructionsites_;
>  		if (target_bo.type == BuildingObserver::PRODUCTIONSITE) {
> @@ -3024,8 +3023,9 @@
>  		++bo.cnt_built_;
>  
>  		if (bo.type == BuildingObserver::PRODUCTIONSITE) {
> +			upcast(ProductionSite, productionsite, &b);
>  			productionsites.push_back(ProductionSiteObserver());
> -			productionsites.back().site = &ref_cast<ProductionSite, Building>(b);
> +			productionsites.back().site = productionsite;
>  			productionsites.back().bo = &bo;
>  			productionsites.back().built_time_ = game().get_gametime();
>  			productionsites.back().unoccupied_till_ = game().get_gametime();
> @@ -3038,8 +3038,9 @@
>  			for (uint32_t i = 0; i < bo.inputs_.size(); ++i)
>  				++wares.at(bo.inputs_.at(i)).consumers_;
>  		} else if (bo.type == BuildingObserver::MINE) {
> +			upcast(ProductionSite, productionsite, &b);
>  			mines_.push_back(ProductionSiteObserver());
> -			mines_.back().site = &ref_cast<ProductionSite, Building>(b);
> +			mines_.back().site = productionsite;
>  			mines_.back().bo = &bo;
>  			mines_.back().built_time_ = game().get_gametime();
>  
> @@ -3049,8 +3050,9 @@
>  			for (uint32_t i = 0; i < bo.inputs_.size(); ++i)
>  				++wares.at(bo.inputs_.at(i)).consumers_;
>  		} else if (bo.type == BuildingObserver::MILITARYSITE) {
> +			upcast(MilitarySite, militarysite, &b);
>  			militarysites.push_back(MilitarySiteObserver());
> -			militarysites.back().site = &ref_cast<MilitarySite, Building>(b);
> +			militarysites.back().site = militarysite;
>  			militarysites.back().bo = &bo;
>  			militarysites.back().checks = bo.desc->get_size();
>  			militarysites.back().enemies_nearby_ = true;
> @@ -3066,8 +3068,9 @@
>  	BuildingObserver& bo = get_building_observer(b.descr().name().c_str());
>  
>  	if (bo.type == BuildingObserver::CONSTRUCTIONSITE) {
> -		BuildingObserver& target_bo = get_building_observer(
> -		   ref_cast<ConstructionSite const, Building const>(b).building().name().c_str());
> +		upcast(ConstructionSite const, constructionsite, &b);
> +		BuildingObserver& target_bo =
> +				get_building_observer(constructionsite->building().name().c_str());
>  		--target_bo.cnt_under_construction_;
>  		--num_constructionsites_;
>  		if (target_bo.type == BuildingObserver::PRODUCTIONSITE) {
> 
> === modified file 'src/base/CMakeLists.txt'
> --- src/base/CMakeLists.txt	2014-11-26 09:36:46 +0000
> +++ src/base/CMakeLists.txt	2014-11-29 08:14:12 +0000
> @@ -45,13 +45,6 @@
>      base_macros
>  )
>  
> -# TODO(sirver): this library should be deleted.
> -wl_library(base_deprecated
> -  SRCS
> -    deprecated.h
> -    deprecated.cc
> -  DEPENDS
> -)
>  
>  wl_library(base_scoped_timer
>    SRCS
> 
> === removed file 'src/base/deprecated.cc'
> --- src/base/deprecated.cc	2014-07-05 12:17:03 +0000
> +++ src/base/deprecated.cc	1970-01-01 00:00:00 +0000
> @@ -1,20 +0,0 @@
> -/*
> - * Copyright (C) 2006-2014 by the Widelands Development Team
> - *
> - * This program is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU General Public License
> - * as published by the Free Software Foundation; either version 2
> - * of the License, or (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
> - *
> - */
> -
> -// Dummy file as cmake cannot handle header only libraries :(.
> 
> === removed file 'src/base/deprecated.h'
> --- src/base/deprecated.h	2014-07-25 19:15:23 +0000
> +++ src/base/deprecated.h	1970-01-01 00:00:00 +0000
> @@ -1,35 +0,0 @@
> -/*
> - * Copyright (C) 2006-2014 by the Widelands Development Team
> - *
> - * This program is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU General Public License
> - * as published by the Free Software Foundation; either version 2
> - * of the License, or (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
> - *
> - */
> -
> -#ifndef WL_BASE_DEPRECATED_H
> -#define WL_BASE_DEPRECATED_H
> -
> -// Code that is still used all over the place, but should not be used anymore.
> -
> -#include <cassert>
> -
> -// DEPRECATED: leads to unsafe code. Instead use upcast() or is_a() to check at
> -// runtime for the type you are expecting.
> -template<typename Derived, typename Base> Derived & ref_cast(Base & base) {
> -	assert(dynamic_cast<Derived *>(&base) == static_cast<Derived *>(&base));
> -	return static_cast<Derived &>(base);
> -}
> -
> -
> -#endif  // end of include guard: WL_BASE_DEPRECATED_H
> 
> === modified file 'src/economy/CMakeLists.txt'
> --- src/economy/CMakeLists.txt	2014-07-05 12:17:03 +0000
> +++ src/economy/CMakeLists.txt	2014-11-29 08:14:12 +0000
> @@ -41,7 +41,6 @@
>      wares_queue.cc
>      wares_queue.h
>    DEPENDS
> -    base_deprecated
>      base_exceptions
>      base_log
>      base_macros
> 
> === modified file 'src/economy/economy.cc'
> --- src/economy/economy.cc	2014-09-20 09:37:47 +0000
> +++ src/economy/economy.cc	2014-11-29 08:14:12 +0000
> @@ -1034,19 +1034,17 @@
>  */
>  void Economy::balance(uint32_t const timerid)
>  {
> -	if (m_request_timerid != timerid)
> +	if (m_request_timerid != timerid) {
>  		return;
> +	}
>  	++m_request_timerid;
>  
> -	Game & game = ref_cast<Game, EditorGameBase>(owner().egbase());
> +	upcast(Game, game, &owner().egbase());

When you are already sure about yuor object as in this case, just use a dynamic_cast<Game&>(egbase) directly.

>  
>  	_check_splits();
> -
> -	_create_requested_workers (game);
> -
> -	_balance_requestsupply(game);
> -
> -	_handle_active_supplies(game);
> +	_create_requested_workers(*game);
> +	_balance_requestsupply(*game);
> +	_handle_active_supplies(*game);
>  }
>  
>  }
> 
> === modified file 'src/economy/flag.cc'
> --- src/economy/flag.cc	2014-09-10 10:18:46 +0000
> +++ src/economy/flag.cc	2014-11-29 08:14:12 +0000
> @@ -19,7 +19,6 @@
>  
>  #include "economy/flag.h"
>  
> -#include "base/deprecated.h"
>  #include "base/macros.h"
>  #include "base/wexception.h"
>  #include "economy/economy.h"
> @@ -640,15 +639,16 @@
>  	}
>  
>  	// Deal with the normal (flag) case
> -	ref_cast<Flag const, PlayerImmovable const>(*nextstep);
> +	upcast(Flag const, nextflag, nextstep);
>  
>  	for (int32_t dir = 1; dir <= 6; ++dir) {
>  		Road * const road = get_road(dir);
>  		Flag *       other;
>  		Road::FlagId flagid;
>  
> -		if (!road)
> +		if (!road) {
>  			continue;
> +		}
>  
>  		if (&road->get_flag(Road::FlagStart) == this) {
>  			flagid = Road::FlagStart;
> @@ -658,12 +658,14 @@
>  			other = &road->get_flag(Road::FlagStart);
>  		}
>  
> -		if (other != nextstep)
> +		if (other != nextflag) {
>  			continue;
> +		}
>  
>  		// Yes, this is the road we want; inform it
> -		if (road->notify_ware(game, flagid))
> +		if (road->notify_ware(game, flagid)) {
>  			return;
> +		}
>  
>  		// If the road doesn't react to the ware immediately, we try other roads:
>  		// They might lead to the same flag!
> @@ -791,24 +793,24 @@
>  	 Worker          * const w,
>  	 PlayerImmovable &       target)
>  {
> -	Flag & flag = ref_cast<Flag, PlayerImmovable>(target);
> +	upcast(Flag, flag, &target);
>  
>  	assert(w);
>  
> -	for (FlagJobs::iterator flag_iter = flag.m_flag_jobs.begin();
> -		  flag_iter != flag.m_flag_jobs.end();
> +	for (FlagJobs::iterator flag_iter = flag->m_flag_jobs.begin();
> +		  flag_iter != flag->m_flag_jobs.end();
>  		  ++flag_iter) {
>  		if (flag_iter->request == &rq) {
>  			delete &rq;
>  
>  			w->start_task_program(game, flag_iter->program);
>  
> -			flag.m_flag_jobs.erase(flag_iter);
> +			flag->m_flag_jobs.erase(flag_iter);
>  			return;
>  		}
>  	}
>  
> -	flag.molog("BUG: flag_job_request_callback: worker not found in list\n");
> +	flag->molog("BUG: flag_job_request_callback: worker not found in list\n");
>  }
>  
>  void Flag::log_general_info(const Widelands::EditorGameBase & egbase)
> 
> === modified file 'src/economy/fleet.cc'
> --- src/economy/fleet.cc	2014-09-20 09:37:47 +0000
> +++ src/economy/fleet.cc	2014-11-29 08:14:12 +0000
> @@ -21,7 +21,6 @@
>  
>  #include <memory>
>  
> -#include "base/deprecated.h"
>  #include "base/macros.h"
>  #include "economy/economy.h"
>  #include "economy/flag.h"
> 
> === modified file 'src/economy/portdock.cc'
> --- src/economy/portdock.cc	2014-09-20 09:37:47 +0000
> +++ src/economy/portdock.cc	2014-11-29 08:14:12 +0000
> @@ -21,8 +21,8 @@
>  
>  #include <memory>
>  
> -#include "base/deprecated.h"
>  #include "base/log.h"
> +#include "base/macros.h"
>  #include "economy/fleet.h"
>  #include "economy/ware_instance.h"
>  #include "economy/wares_queue.h"
> 
> === modified file 'src/economy/road.cc'
> --- src/economy/road.cc	2014-09-19 12:54:54 +0000
> +++ src/economy/road.cc	2014-11-29 08:14:12 +0000
> @@ -382,15 +382,14 @@
>  {
>  	assert(w);
>  
> -	Road    & road    = ref_cast<Road,    PlayerImmovable>(target);
> +	upcast(Road, road, &target);
> +	upcast(Carrier, carrier, w);
>  
> -	for (CarrierSlot& slot : road.m_carrier_slots) {
> +	for (CarrierSlot& slot : road->m_carrier_slots) {
>  		if (slot.carrier_request == &rq) {
> -			Carrier & carrier = ref_cast<Carrier, Worker> (*w);
>  			slot.carrier_request = nullptr;
> -			slot.carrier = &carrier;
> -
> -			carrier.start_task_road(game);
> +			slot.carrier = carrier;
> +			carrier->start_task_road(game);
>  			delete &rq;
>  			return;
>  		}
> @@ -402,7 +401,7 @@
>  	 */
>  	log
>  		("Road(%u): got a request_callback but do not have the request\n",
> -		 road.serial());
> +		 road->serial());
>  	delete &rq;
>  	w->start_task_gowarehouse(game);
>  }
> 
> === modified file 'src/economy/routeastar.h'
> --- src/economy/routeastar.h	2014-09-14 11:31:58 +0000
> +++ src/economy/routeastar.h	2014-11-29 08:14:12 +0000
> @@ -20,7 +20,6 @@
>  #ifndef WL_ECONOMY_ROUTEASTAR_H
>  #define WL_ECONOMY_ROUTEASTAR_H
>  
> -#include "base/deprecated.h"
>  #include "economy/itransport_cost_calculator.h"
>  #include "economy/routing_node.h"
>  
> 
> === modified file 'src/economy/supply_list.cc'
> --- src/economy/supply_list.cc	2014-07-25 16:37:06 +0000
> +++ src/economy/supply_list.cc	2014-11-29 08:14:12 +0000
> @@ -19,7 +19,6 @@
>  
>  #include "economy/supply_list.h"
>  
> -#include "base/deprecated.h"
>  #include "base/wexception.h"
>  #include "economy/request.h"
>  #include "economy/supply.h"
> 
> === modified file 'src/economy/test/CMakeLists.txt'
> --- src/economy/test/CMakeLists.txt	2014-10-28 21:14:24 +0000
> +++ src/economy/test/CMakeLists.txt	2014-11-29 08:14:12 +0000
> @@ -4,7 +4,6 @@
>      test_road.cc
>      test_routing.cc
>    DEPENDS
> -    base_deprecated
>      economy
>      io_filesystem
>      logic
> 
> === modified file 'src/economy/test/test_routing.cc'
> --- src/economy/test/test_routing.cc	2014-10-28 21:14:24 +0000
> +++ src/economy/test/test_routing.cc	2014-11-29 08:14:12 +0000
> @@ -22,7 +22,6 @@
>  #include <boost/bind.hpp>
>  #include <boost/test/unit_test.hpp>
>  
> -#include "base/deprecated.h"
>  #include "economy/flag.h"
>  #include "economy/iroute.h"
>  #include "economy/itransport_cost_calculator.h"
> 
> === modified file 'src/economy/ware_instance.cc'
> --- src/economy/ware_instance.cc	2014-09-20 09:37:47 +0000
> +++ src/economy/ware_instance.cc	2014-11-29 08:14:12 +0000
> @@ -560,8 +560,8 @@
>  	m_location = fr.unsigned_32();
>  	m_transfer_nextstep = fr.unsigned_32();
>  	if (fr.unsigned_8()) {
> -		ware.m_transfer =
> -			new Transfer(ref_cast<Game, EditorGameBase>(egbase()), ware);
> +		upcast(Game, game, &egbase());
> +		ware.m_transfer = new Transfer(*game, ware);
>  		ware.m_transfer->read(fr, m_transfer);
>  	}
>  }
> 
> === modified file 'src/economy/wares_queue.cc'
> --- src/economy/wares_queue.cc	2014-09-20 09:37:47 +0000
> +++ src/economy/wares_queue.cc	2014-11-29 08:14:12 +0000
> @@ -130,8 +130,8 @@
>  #endif
>  	 PlayerImmovable & target)
>  {
> -	WaresQueue & wq =
> -		ref_cast<Building, PlayerImmovable>(target).waresqueue(ware);
> +	upcast(Building, building, &target);
> +	WaresQueue & wq = building->waresqueue(ware);
>  
>  	assert(!w); // WaresQueue can't hold workers
>  	assert(wq.m_filled < wq.m_max_size);
> 
> === modified file 'src/editor/editorinteractive.cc'
> --- src/editor/editorinteractive.cc	2014-11-23 14:34:38 +0000
> +++ src/editor/editorinteractive.cc	2014-11-29 08:14:12 +0000
> @@ -336,12 +336,15 @@
>  }
>  
>  void EditorInteractive::set_sel_radius_and_update_menu(uint32_t const val) {
> -	if (tools.current().has_size_one())
> +	if (tools.current().has_size_one()) {
>  		return;
> -	if (UI::UniqueWindow * const w = m_toolsizemenu.window)
> -		ref_cast<EditorToolsizeMenu, UI::UniqueWindow>(*w).update(val);
> -	else
> +	}
> +	if (UI::UniqueWindow * const w = m_toolsizemenu.window) {
> +		upcast(EditorToolsizeMenu, tool_size_menu, w);
> +		tool_size_menu->update(val);
> +	} else {
>  		set_sel_radius(val);
> +	}
>  }
>  
>  
> 
> === modified file 'src/editor/ui_menus/editor_main_menu.cc'
> --- src/editor/ui_menus/editor_main_menu.cc	2014-09-10 14:08:25 +0000
> +++ src/editor/ui_menus/editor_main_menu.cc	2014-11-29 08:14:12 +0000
> @@ -37,7 +37,8 @@
>  #define vspacing 15
>  
>  inline EditorInteractive & EditorMainMenu::eia() {
> -	return ref_cast<EditorInteractive, UI::Panel>(*get_parent());
> +	upcast(EditorInteractive, result, get_parent());
> +	return *result;
>  }
>  
>  /**
> 
> === modified file 'src/editor/ui_menus/editor_main_menu_load_map.cc'
> --- src/editor/ui_menus/editor_main_menu_load_map.cc	2014-10-28 14:57:52 +0000
> +++ src/editor/ui_menus/editor_main_menu_load_map.cc	2014-11-29 08:14:12 +0000
> @@ -146,7 +146,8 @@
>  		m_mapfiles.clear();
>  		fill_list();
>  	} else {
> -		ref_cast<EditorInteractive, UI::Panel>(*get_parent()).load(filename);
> +		upcast(EditorInteractive, eia, get_parent());
> +		eia->load(filename);
>  		die();
>  	}
>  }
> 
> === modified file 'src/editor/ui_menus/editor_main_menu_map_options.cc'
> --- src/editor/ui_menus/editor_main_menu_map_options.cc	2014-10-28 08:16:53 +0000
> +++ src/editor/ui_menus/editor_main_menu_map_options.cc	2014-11-29 08:14:12 +0000
> @@ -36,7 +36,8 @@
>  
>  
>  inline EditorInteractive & MainMenuMapOptions::eia() {
> -	return ref_cast<EditorInteractive, UI::Panel>(*get_parent());
> +	upcast(EditorInteractive, result, get_parent());
> +	return *result;
>  }
>  
>  
> 
> === modified file 'src/editor/ui_menus/editor_main_menu_new_map.cc'
> --- src/editor/ui_menus/editor_main_menu_new_map.cc	2014-11-13 08:25:45 +0000
> +++ src/editor/ui_menus/editor_main_menu_new_map.cc	2014-11-29 08:14:12 +0000
> @@ -133,9 +133,8 @@
>  }
>  
>  void MainMenuNewMap::clicked_create_map() {
> -	EditorInteractive & eia =
> -		ref_cast<EditorInteractive, UI::Panel>(*get_parent());
> -	Widelands::EditorGameBase & egbase = eia.egbase();
> +	upcast(EditorInteractive, eia, get_parent());
> +	Widelands::EditorGameBase & egbase = eia->egbase();
>  	Widelands::Map              & map    = egbase.map();
>  	UI::ProgressWindow loader;
>  
> @@ -152,7 +151,7 @@
>  
>  	map.recalc_whole_map(egbase.world());
>  
> -	eia.set_need_save(true);
> +	eia->set_need_save(true);
>  
>  	die();
>  }
> 
> === modified file 'src/editor/ui_menus/editor_main_menu_random_map.cc'
> --- src/editor/ui_menus/editor_main_menu_random_map.cc	2014-11-13 08:25:45 +0000
> +++ src/editor/ui_menus/editor_main_menu_random_map.cc	2014-11-29 08:14:12 +0000
> @@ -483,9 +483,8 @@
>  }
>  
>  void MainMenuNewRandomMap::clicked_create_map() {
> -	EditorInteractive & eia =
> -		ref_cast<EditorInteractive, UI::Panel>(*get_parent());
> -	Widelands::EditorGameBase & egbase = eia.egbase();
> +	upcast(EditorInteractive, eia, get_parent());
> +	Widelands::EditorGameBase & egbase = eia->egbase();
>  	Widelands::Map              & map    = egbase.map();
>  	UI::ProgressWindow loader;
>  
> @@ -518,8 +517,8 @@
>  
>  	map.recalc_whole_map(egbase.world());
>  
> -	eia.set_need_save(true);
> -	eia.register_overlays();
> +	eia->set_need_save(true);
> +	eia->register_overlays();
>  
>  	die();
>  }
> 
> === modified file 'src/editor/ui_menus/editor_main_menu_save_map.cc'
> --- src/editor/ui_menus/editor_main_menu_save_map.cc	2014-10-28 14:57:52 +0000
> +++ src/editor/ui_menus/editor_main_menu_save_map.cc	2014-11-29 08:14:12 +0000
> @@ -46,7 +46,8 @@
>  #include "ui_basic/textarea.h"
>  
>  inline EditorInteractive & MainMenuSaveMap::eia() {
> -	return ref_cast<EditorInteractive, UI::Panel>(*get_parent());
> +	upcast(EditorInteractive, result, get_parent());
> +	return *result;
>  }
>  
>  
> 
> === modified file 'src/editor/ui_menus/editor_player_menu.cc'
> --- src/editor/ui_menus/editor_player_menu.cc	2014-11-22 10:18:20 +0000
> +++ src/editor/ui_menus/editor_player_menu.cc	2014-11-29 08:14:12 +0000
> @@ -38,6 +38,11 @@
>  
>  #define UNDEFINED_TRIBE_NAME "<undefined>"
>  
> +inline EditorInteractive & EditorPlayerMenu::eia() {
> +	upcast(EditorInteractive, result, get_parent());
> +	return *result;
> +}
> +
>  EditorPlayerMenu::EditorPlayerMenu
>  	(EditorInteractive & parent, UI::UniqueWindow::Registry & registry)
>  	:
> @@ -108,9 +113,7 @@
>  	if (is_minimal())
>  		return;
>  
> -	Widelands::Map & map =
> -		ref_cast<EditorInteractive const, UI::Panel const>(*get_parent())
> -		.egbase().map();
> +	Widelands::Map & map = eia().egbase().map();
>  	Widelands::PlayerNumber const nr_players = map.get_nrplayers();
>  	{
>  		assert(nr_players <= 99); //  2 decimal digits
> @@ -194,9 +197,7 @@
>  }
>  
>  void EditorPlayerMenu::clicked_add_player() {
> -	EditorInteractive & menu =
> -		ref_cast<EditorInteractive, UI::Panel>(*get_parent());
> -	Widelands::Map & map = menu.egbase().map();
> +	Widelands::Map & map = eia().egbase().map();
>  	Widelands::PlayerNumber const nr_players = map.get_nrplayers() + 1;
>  	assert(nr_players <= MAX_PLAYERS);
>  	map.set_nrplayers(nr_players);
> @@ -211,7 +212,7 @@
>  		map.set_scenario_player_name(nr_players, name);
>  	}
>  	map.set_scenario_player_tribe(nr_players, m_tribes[0]);
> -	menu.set_need_save(true);
> +	eia().set_need_save(true);
>  	m_add_player        .set_enabled(nr_players < MAX_PLAYERS);
>  	m_remove_last_player.set_enabled(true);
>  	update();
> @@ -219,14 +220,12 @@
>  
>  
>  void EditorPlayerMenu::clicked_remove_last_player() {
> -	EditorInteractive & menu =
> -		ref_cast<EditorInteractive, UI::Panel>(*get_parent());
> -	Widelands::Map & map = menu.egbase().map();
> +	Widelands::Map & map = eia().egbase().map();
>  	Widelands::PlayerNumber const old_nr_players = map.get_nrplayers();
>  	Widelands::PlayerNumber const nr_players     = old_nr_players - 1;
>  	assert(1 <= nr_players);
>  
> -	if (!menu.is_player_tribe_referenced(old_nr_players)) {
> +	if (!eia().is_player_tribe_referenced(old_nr_players)) {
>  		if (const Widelands::Coords sp = map.get_starting_pos(old_nr_players)) {
>  			//  Remove starting position marker.
>  			char picsname[] = "pics/editor_player_00_starting_pos.png";
> @@ -306,9 +305,8 @@
>   * Player Tribe Button clicked
>   */
>  void EditorPlayerMenu::player_tribe_clicked(uint8_t n) {
> -	EditorInteractive & menu =
> -		ref_cast<EditorInteractive, UI::Panel>(*get_parent());
> -	if (!menu.is_player_tribe_referenced(n + 1)) {
> +	EditorInteractive& menu = eia();
> +		if (!menu.is_player_tribe_referenced(n + 1)) {
>  		std::string t = m_plr_set_tribes_buts[n]->get_title();
>  		if (!Widelands::TribeDescr::exists_tribe(t))
>  			throw wexception
> @@ -338,8 +336,7 @@
>   * Set Current Start Position button selected
>   */
>  void EditorPlayerMenu::set_starting_pos_clicked(uint8_t n) {
> -	EditorInteractive & menu =
> -		ref_cast<EditorInteractive, UI::Panel>(*get_parent());
> +	EditorInteractive& menu = eia();
>  	//  jump to the current node
>  	Widelands::Map & map = menu.egbase().map();
>  	if (Widelands::Coords const sp = map.get_starting_pos(n))
> @@ -366,8 +363,7 @@
>  void EditorPlayerMenu::name_changed(int32_t m) {
>  	//  Player name has been changed.
>  	std::string text = m_plr_names[m]->text();
> -	EditorInteractive & menu =
> -		ref_cast<EditorInteractive, UI::Panel>(*get_parent());
> +	EditorInteractive& menu = eia();
>  	Widelands::Map & map = menu.egbase().map();
>  	if (text == "") {
>  		text = map.get_scenario_player_name(m + 1);
> 
> === modified file 'src/editor/ui_menus/editor_player_menu.h'
> --- src/editor/ui_menus/editor_player_menu.h	2014-09-10 14:08:25 +0000
> +++ src/editor/ui_menus/editor_player_menu.h	2014-11-29 08:14:12 +0000
> @@ -44,6 +44,7 @@
>  	virtual ~EditorPlayerMenu() {}
>  
>  private:
> +	EditorInteractive & eia();
>  	UI::UniqueWindow::Registry m_allow_buildings_menu;
>  	UI::Textarea * m_nr_of_players_ta;
>  	UI::EditBox * m_plr_names[MAX_PLAYERS];
> 
> === modified file 'src/editor/ui_menus/editor_tool_change_resources_options_menu.cc'
> --- src/editor/ui_menus/editor_tool_change_resources_options_menu.cc	2014-09-30 05:41:55 +0000
> +++ src/editor/ui_menus/editor_tool_change_resources_options_menu.cc	2014-11-29 08:14:12 +0000
> @@ -37,6 +37,12 @@
>  const static int BUTTON_WIDTH = 20;
>  const static int BUTTON_HEIGHT = 20;
>  
> +inline EditorInteractive & EditorToolChangeResourcesOptionsMenu::eia() {
> +	upcast(EditorInteractive, result, get_parent());
> +	return *result;
> +}
> +
> +
>  EditorToolChangeResourcesOptionsMenu::
>  EditorToolChangeResourcesOptionsMenu
>  		(EditorInteractive             & parent,
> @@ -213,7 +219,7 @@
>  	m_increase_tool.set_cur_res(n);
>  	m_increase_tool.decrease_tool().set_cur_res(n);
>  
> -	Widelands::EditorGameBase& egbase = ref_cast<EditorInteractive, UI::Panel>(*get_parent()).egbase();
> +	Widelands::EditorGameBase& egbase = eia().egbase();
>  	Widelands::Map & map = egbase.map();
>  	map.overlay_manager().register_overlay_callback_function(
>  	   boost::bind(&editor_change_resource_tool_callback, _1, boost::ref(map), boost::ref(egbase.world()), n));
> @@ -234,8 +240,7 @@
>  										static_cast<unsigned int>(m_increase_tool.set_tool().get_set_to())));
>  
>  	m_cur_selection.set_text
> -		(ref_cast<EditorInteractive, UI::Panel>(*get_parent()).egbase()
> -		 .world().get_resource(m_increase_tool.set_tool().get_cur_res())->descname());
> +		(eia().egbase().world().get_resource(m_increase_tool.set_tool().get_cur_res())->descname());
>  	m_cur_selection.set_pos
>  		(Point
>  		 	((get_inner_w() - m_cur_selection.get_w()) / 2, get_inner_h() - 20));
> 
> === modified file 'src/editor/ui_menus/editor_tool_change_resources_options_menu.h'
> --- src/editor/ui_menus/editor_tool_change_resources_options_menu.h	2014-09-10 14:08:25 +0000
> +++ src/editor/ui_menus/editor_tool_change_resources_options_menu.h	2014-11-29 08:14:12 +0000
> @@ -37,6 +37,7 @@
>  		 UI::UniqueWindow::Registry     &);
>  
>  private:
> +	EditorInteractive & eia();
>  	void selected();
>  	enum Button {
>  		Change_By_Increase, Change_By_Decrease,
> 
> === modified file 'src/editor/ui_menus/editor_tool_menu.cc'
> --- src/editor/ui_menus/editor_tool_menu.cc	2014-09-20 09:37:47 +0000
> +++ src/editor/ui_menus/editor_tool_menu.cc	2014-11-29 08:14:12 +0000
> @@ -98,38 +98,37 @@
>  void EditorToolMenu::changed_to() {
>  	const int32_t n = m_radioselect.get_state();
>  
> -	EditorInteractive & parent =
> -		ref_cast<EditorInteractive, UI::Panel>(*get_parent());
> +	upcast(EditorInteractive, eia, get_parent());
>  
>  	EditorTool                * current_tool_pointer = nullptr;
>  	UI::UniqueWindow::Registry * current_registry_pointer = nullptr;
>  	switch (n) {
>  	case 0:
> -		current_tool_pointer     = &parent.tools.increase_height;
> -		current_registry_pointer = &parent.m_heightmenu;
> +		current_tool_pointer     = &eia->tools.increase_height;
> +		current_registry_pointer = &eia->m_heightmenu;
>  		break;
>  	case 1:
> -		current_tool_pointer     = &parent.tools.noise_height;
> -		current_registry_pointer = &parent.m_noise_heightmenu;
> +		current_tool_pointer     = &eia->tools.noise_height;
> +		current_registry_pointer = &eia->m_noise_heightmenu;
>  		break;
>  	case 2:
> -		current_tool_pointer     = &parent.tools.set_terrain;
> -		current_registry_pointer = &parent.m_terrainmenu;
> +		current_tool_pointer     = &eia->tools.set_terrain;
> +		current_registry_pointer = &eia->m_terrainmenu;
>  		break;
>  	case 3:
> -		current_tool_pointer     = &parent.tools.place_immovable;
> -		current_registry_pointer = &parent.m_immovablemenu;
> +		current_tool_pointer     = &eia->tools.place_immovable;
> +		current_registry_pointer = &eia->m_immovablemenu;
>  		break;
>  	case 4:
> -		current_tool_pointer     = &parent.tools.place_bob;
> -		current_registry_pointer = &parent.m_bobmenu;
> +		current_tool_pointer     = &eia->tools.place_bob;
> +		current_registry_pointer = &eia->m_bobmenu;
>  		break;
>  	case 5:
> -		current_tool_pointer     = &parent.tools.increase_resources;
> -		current_registry_pointer = &parent.m_resourcesmenu;
> +		current_tool_pointer     = &eia->tools.increase_resources;
> +		current_registry_pointer = &eia->m_resourcesmenu;
>  		break;
>  	case 6:
> -		current_tool_pointer     = &parent.tools.set_port_space;
> +		current_tool_pointer     = &eia->tools.set_port_space;
>  		current_registry_pointer = nullptr; // no need for a window
>  		break;
>  	default:
> @@ -137,13 +136,13 @@
>  		break;
>  	}
>  
> -	parent.select_tool(*current_tool_pointer, EditorTool::First);
> -	if (current_tool_pointer == &parent.tools.set_port_space) {
> +	eia->select_tool(*current_tool_pointer, EditorTool::First);
> +	if (current_tool_pointer == &eia->tools.set_port_space) {
>  		// Set correct overlay
> -		Widelands::Map & map = parent.egbase().map();
> +		Widelands::Map & map = eia->egbase().map();
>  		map.overlay_manager().register_overlay_callback_function(
>  				boost::bind(&editor_Tool_set_port_space_callback, _1, boost::ref(map)));
> -		map.recalc_whole_map(parent.egbase().world());
> +		map.recalc_whole_map(eia->egbase().world());
>  		update();
>  	}
>  
> @@ -158,38 +157,38 @@
>  			switch (n) { //  create window
>  			case 0:
>  				new EditorToolChangeHeightOptionsMenu
> -					(parent,
> -					parent.tools.increase_height,
> +					(*eia,
> +					eia->tools.increase_height,
>  					*current_registry_pointer);
>  				break;
>  			case 1:
>  				new EditorToolNoiseHeightOptionsMenu
> -					(parent,
> -					parent.tools.noise_height,
> +					(*eia,
> +					eia->tools.noise_height,
>  					*current_registry_pointer);
>  				break;
>  			case 2:
>  				new EditorToolSetTerrainOptionsMenu
> -					(parent,
> -					parent.tools.set_terrain,
> +					(*eia,
> +					eia->tools.set_terrain,
>  					*current_registry_pointer);
>  				break;
>  			case 3:
>  				new EditorToolPlaceImmovableOptionsMenu
> -					(parent,
> -					parent.tools.place_immovable,
> +					(*eia,
> +					eia->tools.place_immovable,
>  					*current_registry_pointer);
>  				break;
>  			case 4:
>  				new EditorToolPlaceBobOptionsMenu
> -					(parent,
> -					parent.tools.place_bob,
> +					(*eia,
> +					eia->tools.place_bob,
>  					*current_registry_pointer);
>  				break;
>  			case 5:
>  				new EditorToolChangeResourcesOptionsMenu
> -					(parent,
> -					parent.tools.increase_resources,
> +					(*eia,
> +					eia->tools.increase_resources,
>  					*current_registry_pointer);
>  				break;
>  			default:
> 
> === modified file 'src/editor/ui_menus/editor_tool_options_menu.cc'
> --- src/editor/ui_menus/editor_tool_options_menu.cc	2014-09-10 14:08:25 +0000
> +++ src/editor/ui_menus/editor_tool_options_menu.cc	2014-11-29 08:14:12 +0000
> @@ -35,6 +35,6 @@
>  
>  
>  void EditorToolOptionsMenu::select_correct_tool() {
> -	ref_cast<EditorInteractive, UI::Panel>(*get_parent())
> -		.select_tool(*m_current_pointer, EditorTool::First);
> +	upcast(EditorInteractive, eia, get_parent());
> +	eia->select_tool(*m_current_pointer, EditorTool::First);
>  }
> 
> === modified file 'src/editor/ui_menus/editor_toolsize_menu.cc'
> --- src/editor/ui_menus/editor_toolsize_menu.cc	2014-09-18 18:52:34 +0000
> +++ src/editor/ui_menus/editor_toolsize_menu.cc	2014-11-29 08:14:12 +0000
> @@ -29,10 +29,10 @@
>  #include "graphic/graphic.h"
>  
>  inline EditorInteractive & EditorToolsizeMenu::eia() {
> -	return ref_cast<EditorInteractive, UI::Panel>(*get_parent());
> +	upcast(EditorInteractive, result, get_parent());
> +	return *result;
>  }
>  
> -
>  /**
>   * Create all the buttons etc...
>  */
> 
> === modified file 'src/graphic/CMakeLists.txt'
> --- src/graphic/CMakeLists.txt	2014-11-24 07:25:21 +0000
> +++ src/graphic/CMakeLists.txt	2014-11-29 08:14:12 +0000
> @@ -128,7 +128,6 @@
>    USES_SDL2_IMAGE
>    USES_SDL2_TTF
>    DEPENDS
> -    base_deprecated
>      base_exceptions
>      base_geometry
>      base_i18n
> 
> === modified file 'src/graphic/animation.cc'
> --- src/graphic/animation.cc	2014-11-24 07:10:03 +0000
> +++ src/graphic/animation.cc	2014-11-29 08:14:12 +0000
> @@ -30,7 +30,6 @@
>  #include <boost/format.hpp>
>  #include <boost/lexical_cast.hpp>
>  
> -#include "base/deprecated.h"
>  #include "base/i18n.h"
>  #include "base/log.h"
>  #include "base/macros.h"
> 
> === modified file 'src/graphic/graphic.cc'
> --- src/graphic/graphic.cc	2014-11-24 07:10:03 +0000
> +++ src/graphic/graphic.cc	2014-11-29 08:14:12 +0000
> @@ -25,7 +25,6 @@
>  
>  #include <SDL_image.h>
>  
> -#include "base/deprecated.h"
>  #include "base/i18n.h"
>  #include "base/log.h"
>  #include "base/macros.h"
> 
> === modified file 'src/graphic/terrain_texture.cc'
> --- src/graphic/terrain_texture.cc	2014-11-24 07:10:03 +0000
> +++ src/graphic/terrain_texture.cc	2014-11-29 08:14:12 +0000
> @@ -21,7 +21,6 @@
>  
>  #include <SDL_image.h>
>  
> -#include "base/deprecated.h"
>  #include "base/log.h"
>  #include "base/wexception.h"
>  #include "graphic/image_io.h"
> 
> === modified file 'src/graphic/text_parser.cc'
> --- src/graphic/text_parser.cc	2014-09-10 14:48:40 +0000
> +++ src/graphic/text_parser.cc	2014-11-29 08:14:12 +0000
> @@ -24,7 +24,6 @@
>  #include <string>
>  #include <vector>
>  
> -#include "base/deprecated.h"
>  #include "base/log.h"
>  #include "helper.h"
>  
> 
> === modified file 'src/io/CMakeLists.txt'
> --- src/io/CMakeLists.txt	2014-10-13 15:04:50 +0000
> +++ src/io/CMakeLists.txt	2014-11-29 08:14:12 +0000
> @@ -37,7 +37,6 @@
>      filesystem/zip_filesystem.cc
>      filesystem/zip_filesystem.h
>    DEPENDS
> -    base_deprecated
>      base_exceptions
>      base_log
>      base_macros
> 
> === modified file 'src/io/filesystem/layered_filesystem.cc'
> --- src/io/filesystem/layered_filesystem.cc	2014-09-29 13:30:46 +0000
> +++ src/io/filesystem/layered_filesystem.cc	2014-11-29 08:14:12 +0000
> @@ -22,7 +22,6 @@
>  #include <cstdio>
>  #include <memory>
>  
> -#include "base/deprecated.h"
>  #include "base/log.h"
>  #include "base/wexception.h"
>  #include "io/fileread.h"
> 
> === modified file 'src/logic/CMakeLists.txt'
> --- src/logic/CMakeLists.txt	2014-10-13 15:04:50 +0000
> +++ src/logic/CMakeLists.txt	2014-11-29 08:14:12 +0000
> @@ -215,7 +215,6 @@
>    USES_SDL2
>    DEPENDS
>      ai
> -    base_deprecated
>      base_exceptions
>      base_geometry
>      base_i18n
> 
> === modified file 'src/logic/battle.cc'
> --- src/logic/battle.cc	2014-09-20 09:37:47 +0000
> +++ src/logic/battle.cc	2014-11-29 08:14:12 +0000
> @@ -83,23 +83,29 @@
>  
>  	m_creationtime = egbase.get_gametime();
>  
> -	if (Battle* battle = m_first ->get_battle())
> -		battle->cancel(ref_cast<Game, EditorGameBase>(egbase), *m_first);
> -	m_first->set_battle(ref_cast<Game, EditorGameBase>(egbase), this);
> -	if (Battle* battle = m_second->get_battle())
> -		battle->cancel(ref_cast<Game, EditorGameBase>(egbase), *m_second);
> -	m_second->set_battle(ref_cast<Game, EditorGameBase>(egbase), this);
> +	upcast(Game, game, &egbase);
> +
> +	if (Battle* battle = m_first ->get_battle()) {
> +		battle->cancel(*game, *m_first);
> +	}
> +	m_first->set_battle(*game, this);
> +	if (Battle* battle = m_second->get_battle()) {
> +		battle->cancel(*game, *m_second);
> +	}
> +	m_second->set_battle(*game, this);
>  }
>  
>  
>  void Battle::cleanup (EditorGameBase & egbase)
>  {
>  	if (m_first) {
> -		m_first ->set_battle(ref_cast<Game, EditorGameBase>(egbase), nullptr);
> +		upcast(Game, game, &egbase);
> +		m_first ->set_battle(*game, nullptr);
>  		m_first  = nullptr;
>  	}
>  	if (m_second) {
> -		m_second->set_battle(ref_cast<Game, EditorGameBase>(egbase), nullptr);
> +		upcast(Game, game, &egbase);
> +		m_second->set_battle(*game, nullptr);
>  		m_second = nullptr;
>  	}
>  
> 
> === modified file 'src/logic/bob.cc'
> --- src/logic/bob.cc	2014-09-20 09:37:47 +0000
> +++ src/logic/bob.cc	2014-11-29 08:14:12 +0000
> @@ -149,8 +149,10 @@
>   */
>  void Bob::cleanup(EditorGameBase & egbase)
>  {
> -	while (!m_stack.empty()) //  bobs in the editor do not have tasks
> -		do_pop_task(ref_cast<Game, EditorGameBase>(egbase));
> +	while (!m_stack.empty()) { //  bobs in the editor do not have tasks
> +		upcast(Game, game, &egbase);
> +		do_pop_task(*game);
> +	}
>  
>  	set_owner(nullptr); // implicitly remove ourselves from owner's map
>  
> 
> === modified file 'src/logic/building.cc'
> --- src/logic/building.cc	2014-11-24 07:25:21 +0000
> +++ src/logic/building.cc	2014-11-29 08:14:12 +0000
> @@ -244,11 +244,11 @@
>  	BuildingDescr const * const descr =
>  		m_tribe.get_building_descr
>  			(m_tribe.safe_building_index("constructionsite"));
> -	ConstructionSite & csite =
> -		ref_cast<ConstructionSite, MapObject>(descr->create_object());
> -	csite.set_building(*this);
> -
> -	return csite;
> +
> +	upcast(ConstructionSite, csite, &descr->create_object());
> +	csite->set_building(*this);
> +
> +	return *csite;
>  }
>  
>  
> @@ -724,25 +724,24 @@
>  void Building::draw_help
>  	(const EditorGameBase& game, RenderTarget& dst, const FCoords&, const Point& pos)
>  {
> -	const InteractiveGameBase & igbase =
> -		ref_cast<InteractiveGameBase const, InteractiveBase const>
> -			(*game.get_ibase());
> -	uint32_t const dpyflags = igbase.get_display_flags();
> +	upcast(InteractiveGameBase const, igbase, game.get_ibase());
> +
> +	uint32_t const dpyflags = igbase->get_display_flags();
>  
>  	if (dpyflags & InteractiveBase::dfShowCensus) {
> -		const std::string info = info_string(igbase.building_census_format());
> +		const std::string info = info_string(igbase->building_census_format());
>  		if (!info.empty()) {
>  			dst.blit(pos - Point(0, 48), UI::g_fh1->render(info), BlendMode::UseAlpha, UI::Align_Center);
>  		}
>  	}
>  
>  	if (dpyflags & InteractiveBase::dfShowStatistics) {
> -		if (upcast(InteractivePlayer const, iplayer, &igbase))
> +		if (upcast(InteractivePlayer const, iplayer, igbase))
>  			if
>  				(!iplayer->player().see_all() &&
>  				 iplayer->player().is_hostile(*get_owner()))
>  				return;
> -		const std::string info = info_string(igbase.building_statistics_format());
> +		const std::string info = info_string(igbase->building_statistics_format());
>  		if (!info.empty()) {
>  			dst.blit(pos - Point(0, 35), UI::g_fh1->render(info), BlendMode::UseAlpha, UI::Align_Center);
>  		}
> 
> === modified file 'src/logic/carrier.cc'
> --- src/logic/carrier.cc	2014-09-20 09:37:47 +0000
> +++ src/logic/carrier.cc	2014-11-29 08:14:12 +0000
> @@ -84,8 +84,6 @@
>  		return pop_task(game);
>  	}
>  
> -	Road & road = ref_cast<Road, PlayerImmovable>(*get_location(game));
> -
>  	// Check for pending wares
>  	if (m_promised_pickup_to == NOONE)
>  		find_pending_ware(game);
> @@ -103,12 +101,13 @@
>  		}
>  	}
>  
> +	upcast(Road, road, get_location(game));
> +
>  	// Move into idle position if necessary
> -	if
> -		(start_task_movepath
> +	if (start_task_movepath
>  		 	(game,
> -		 	 road.get_path(),
> -		 	 road.get_idle_index(),
> +			 road->get_path(),
> +			 road->get_idle_index(),
>  		 	 descr().get_right_walk_anims(does_carry_ware())))
>  		return;
>  
> @@ -127,9 +126,9 @@
>  void Carrier::road_pop(Game & game, State & /* state */)
>  {
>  	if (m_promised_pickup_to != NOONE && get_location(game)) {
> -		Road & road      = ref_cast<Road, PlayerImmovable>(*get_location(game));
> -		Flag & flag      = road.get_flag(static_cast<Road::FlagId>(m_promised_pickup_to));
> -		Flag & otherflag = road.get_flag(static_cast<Road::FlagId>(m_promised_pickup_to ^ 1));
> +		upcast(Road, road, get_location(game));
> +		Flag & flag      = road->get_flag(static_cast<Road::FlagId>(m_promised_pickup_to));
> +		Flag & otherflag = road->get_flag(static_cast<Road::FlagId>(m_promised_pickup_to ^ 1));
>  
>  		flag.cancel_pickup(game, otherflag);
>  	}
> @@ -176,8 +175,6 @@
>  		return pop_task(game);
>  	}
>  
> -	Road & road = ref_cast<Road, PlayerImmovable>(*get_location(game));
> -
>  	if (state.ivar1 == -1)
>  		// If we're "in" the target building, special code applies
>  		deliver_to_building(game, state);
> @@ -187,9 +184,10 @@
>  		pickup_from_flag(game, state);
>  
>  	else {
> +		upcast(Road, road, get_location(game));
>  		// If the ware should go to the building attached to our flag, walk
>  		// directly into said building
> -		Flag & flag = road.get_flag(static_cast<Road::FlagId>(state.ivar1 ^ 1));
> +		Flag & flag = road->get_flag(static_cast<Road::FlagId>(state.ivar1 ^ 1));
>  
>  		WareInstance & ware = *get_carried_ware(game);
>  		assert(ware.get_location(game) == this);
> @@ -240,10 +238,11 @@
>  				molog
>  					("[Carrier]: Building switch from under us, return to road.\n");
>  
> +				upcast(Road, road, get_location(game));
>  				state.ivar1 =
>  					&building->base_flag()
>  					==
> -					&ref_cast<Road, PlayerImmovable>(*get_location(game)).get_flag
> +					&road->get_flag
>  						(static_cast<Road::FlagId>(0));
>  				break;
>  			}
> @@ -277,9 +276,9 @@
>  
>  		m_promised_pickup_to = NOONE;
>  
> -		Road & road      = ref_cast<Road, PlayerImmovable>(*get_location(game));
> -		Flag & flag      = road.get_flag(static_cast<Road::FlagId>(ivar1));
> -		Flag & otherflag = road.get_flag(static_cast<Road::FlagId>(ivar1 ^ 1));
> +		upcast(Road, road, get_location(game));
> +		Flag & flag      = road->get_flag(static_cast<Road::FlagId>(ivar1));
> +		Flag & otherflag = road->get_flag(static_cast<Road::FlagId>(ivar1 ^ 1));
>  
>  		// Are there wares to move between our flags?
>  		if (WareInstance * const ware = flag.fetch_pending_ware(game, otherflag))
> @@ -305,15 +304,15 @@
>  void Carrier::drop_ware(Game & game, State & state)
>  {
>  	WareInstance * other = nullptr;
> -	Road & road = ref_cast<Road, PlayerImmovable>(*get_location(game));
> -	Flag & flag = road.get_flag(static_cast<Road::FlagId>(state.ivar1 ^ 1));
> +	upcast(Road, road, get_location(game));
> +	Flag & flag = road->get_flag(static_cast<Road::FlagId>(state.ivar1 ^ 1));
>  
>  	if (m_promised_pickup_to == (state.ivar1 ^ 1)) {
>  		// If there's an ware we acked, we can drop ours even if the flag is
>  		// flooded
>  		other =
>  			flag.fetch_pending_ware
> -				(game, road.get_flag(static_cast<Road::FlagId>(state.ivar1)));
> +				(game, road->get_flag(static_cast<Road::FlagId>(state.ivar1)));
>  
>  		if (!other && !flag.has_capacity()) {
>  			molog
> @@ -376,11 +375,11 @@
>  bool Carrier::swap_or_wait(Game & game, State & state)
>  {
>  	// Road that employs us
> -	Road & road = ref_cast<Road, PlayerImmovable>(*get_location(game));
> +	upcast(Road, road, get_location(game));
>  	// Flag we are delivering to
> -	Flag & flag = road.get_flag(static_cast<Road::FlagId>(state.ivar1 ^ 1));
> +	Flag & flag = road->get_flag(static_cast<Road::FlagId>(state.ivar1 ^ 1));
>  	// The other flag of our road
> -	Flag & otherflag = road.get_flag(static_cast<Road::FlagId>(state.ivar1));
> +	Flag & otherflag = road->get_flag(static_cast<Road::FlagId>(state.ivar1));
>  
>  
>  	if (m_promised_pickup_to == (state.ivar1 ^ 1)) {
> @@ -456,32 +455,33 @@
>   */
>  void Carrier::find_pending_ware(Game & game)
>  {
> -	Road & road = ref_cast<Road, PlayerImmovable>(*get_location(game));
> +	upcast(Road, road, get_location(game));
>  	uint32_t havewarebits = 0;
>  
>  	assert(m_promised_pickup_to == NOONE);
>  
> -	if
> -		(road.get_flag(Road::FlagStart).has_pending_ware
> -		 	(game, road.get_flag(Road::FlagEnd)))
> +	if (road->get_flag(Road::FlagStart).has_pending_ware
> +			(game, road->get_flag(Road::FlagEnd))) {
>  		havewarebits |= 1;
> +	}
>  
> -	if
> -		(road.get_flag(Road::FlagEnd).has_pending_ware
> -		 	(game, road.get_flag(Road::FlagStart)))
> +	if (road->get_flag(Road::FlagEnd).has_pending_ware
> +			(game, road->get_flag(Road::FlagStart))) {
>  		havewarebits |= 2;
> +	}
>  
>  	//  If both flags have an ware, we pick the one closer to us.
> -	if (havewarebits == 3)
> +	if (havewarebits == 3) {
>  		havewarebits = 1 << find_closest_flag(game);
> +	}
>  
>  	// Ack our decision
>  	if (havewarebits == 1) {
>  		m_promised_pickup_to = START_FLAG;
>  		if
>  			(!
> -			 road.get_flag(Road::FlagStart).ack_pickup
> -			 	(game, road.get_flag(Road::FlagEnd)))
> +			 road->get_flag(Road::FlagStart).ack_pickup
> +				(game, road->get_flag(Road::FlagEnd)))
>  			throw wexception
>  				("Carrier::find_pending_ware: start flag is messed up");
>  
> @@ -489,8 +489,8 @@
>  		m_promised_pickup_to = END_FLAG;
>  		if
>  			(!
> -			 road.get_flag(Road::FlagEnd).ack_pickup
> -			 	(game, road.get_flag(Road::FlagStart)))
> +			 road->get_flag(Road::FlagEnd).ack_pickup
> +				(game, road->get_flag(Road::FlagStart)))
>  			throw wexception("Carrier::find_pending_ware: end flag is messed up");
>  	}
>  }
> @@ -502,8 +502,8 @@
>  int32_t Carrier::find_closest_flag(Game & game)
>  {
>  	Map & map = game.map();
> -	CoordPath startpath
> -		(map, ref_cast<Road, PlayerImmovable>(*get_location(game)).get_path());
> +	upcast(Road, road, get_location(game));
> +	CoordPath startpath(map, road->get_path());
>  
>  	CoordPath endpath;
>  	int32_t startcost, endcost;
> @@ -550,8 +550,8 @@
>  bool Carrier::start_task_walktoflag
>  	(Game & game, int32_t const flag, bool const offset)
>  {
> -	const Path & path =
> -		ref_cast<Road, PlayerImmovable>(*get_location(game)).get_path();
> +	upcast(Road, road, get_location(game));
> +	const Path & path = road->get_path();
>  	int32_t idx;
>  
>  	if (!flag) {
> 
> === modified file 'src/logic/constructionsite.cc'
> --- src/logic/constructionsite.cc	2014-09-10 17:52:49 +0000
> +++ src/logic/constructionsite.cc	2014-11-29 08:14:12 +0000
> @@ -172,16 +172,16 @@
>  		Building & b =
>  			m_building->create(egbase, owner(), m_position, false, false, m_old_buildings);
>  		if (Worker * const builder = m_builder.get(egbase)) {
> -			builder->reset_tasks(ref_cast<Game, EditorGameBase>(egbase));
> +			upcast(Game, game, &egbase);
> +			builder->reset_tasks(*game);
>  			builder->set_location(&b);
>  		}
>  		// Open the new building window if needed
>  		if (m_optionswindow) {
>  			Point window_position = m_optionswindow->get_pos();
>  			hide_options();
> -			InteractiveGameBase & igbase =
> -				ref_cast<InteractiveGameBase, InteractiveBase>(*egbase.get_ibase());
> -			b.show_options(igbase, false, window_position);
> +			upcast(InteractiveGameBase, igbase, egbase.get_ibase());
> +			b.show_options(*igbase, false, window_position);
>  		}
>  	}
>  }
> 
> === modified file 'src/logic/critter.cc'
> --- src/logic/critter.cc	2014-10-27 10:14:10 +0000
> +++ src/logic/critter.cc	2014-11-29 08:14:12 +0000
> @@ -301,14 +301,12 @@
>  	}
>  
>  	for (;;) {
> -		const CritterProgram & program =
> -			ref_cast<CritterProgram const, BobProgramBase const>
> -				(*state.program);
> +		upcast(CritterProgram const, program, state.program);
>  
> -		if (state.ivar1 >= program.get_size())
> +		if (state.ivar1 >= program->get_size())
>  			return pop_task(game);
>  
> -		const CritterAction & action = program[state.ivar1];
> +		const CritterAction & action = (*program)[state.ivar1];
>  
>  		if ((this->*(action.function))(game, state, action))
>  			return;
> 
> === modified file 'src/logic/findnode.cc'
> --- src/logic/findnode.cc	2014-07-24 16:26:55 +0000
> +++ src/logic/findnode.cc	2014-11-29 08:14:12 +0000
> @@ -19,7 +19,6 @@
>  
>  #include "logic/findnode.h"
>  
> -#include "base/deprecated.h"
>  #include "base/wexception.h"
>  #include "logic/field.h"
>  #include "logic/immovable.h"
> 
> === modified file 'src/logic/immovable.cc'
> --- src/logic/immovable.cc	2014-11-24 07:25:21 +0000
> +++ src/logic/immovable.cc	2014-11-29 08:14:12 +0000
> @@ -25,7 +25,6 @@
>  #include <boost/algorithm/string.hpp>
>  #include <boost/format.hpp>
>  
> -#include "base/deprecated.h"
>  #include "base/macros.h"
>  #include "base/wexception.h"
>  #include "config.h"
> @@ -619,7 +618,7 @@
>  {
>  	BaseImmovable::Loader::load(fr);
>  
> -	Immovable & imm = ref_cast<Immovable, MapObject>(*get_object());
> +	upcast(Immovable, imm, get_object());
>  
>  	if (version >= 5) {
>  		PlayerNumber pn = fr.unsigned_8();
> @@ -627,29 +626,29 @@
>  			Player * plr = egbase().get_player(pn);
>  			if (!plr)
>  				throw GameDataError("Immovable::load: player %u does not exist", pn);
> -			imm.set_owner(plr);
> +			imm->set_owner(plr);
>  		}
>  	}
>  
>  	// Position
> -	imm.m_position = read_coords_32(&fr, egbase().map().extent());
> -	imm.set_position(egbase(), imm.m_position);
> +	imm->m_position = read_coords_32(&fr, egbase().map().extent());
> +	imm->set_position(egbase(), imm->m_position);
>  
>  	// Animation
>  	char const * const animname = fr.c_string();
>  	try {
> -		imm.m_anim = imm.descr().get_animation(animname);
> +		imm->m_anim = imm->descr().get_animation(animname);
>  	} catch (const MapObjectDescr::AnimationNonexistent &) {
> -		imm.m_anim = imm.descr().main_animation();
> +		imm->m_anim = imm->descr().main_animation();
>  		log
>  			("Warning: (%s) Animation \"%s\" not found, using animation %s).\n",
> -			 imm.descr().name().c_str(), animname, imm.descr().get_animation_name(imm.m_anim).c_str());
> +			 imm->descr().name().c_str(), animname, imm->descr().get_animation_name(imm->m_anim).c_str());
>  	}
> -	imm.m_animstart = fr.signed_32();
> +	imm->m_animstart = fr.signed_32();
>  	if (version >= 4) {
> -		imm.m_anim_construction_total = fr.unsigned_32();
> -		if (imm.m_anim_construction_total)
> -			imm.m_anim_construction_done = fr.unsigned_32();
> +		imm->m_anim_construction_total = fr.unsigned_32();
> +		if (imm->m_anim_construction_total)
> +			imm->m_anim_construction_done = fr.unsigned_32();
>  	}
>  
>  	{ //  program
> @@ -664,14 +663,14 @@
>  			if (program_name.empty())
>  				program_name = "program";
>  		}
> -		imm.m_program = imm.descr().get_program(program_name);
> +		imm->m_program = imm->descr().get_program(program_name);
>  	}
> -	imm.m_program_ptr = fr.unsigned_32();
> +	imm->m_program_ptr = fr.unsigned_32();
>  
> -	if (!imm.m_program) {
> -		imm.m_program_ptr = 0;
> +	if (!imm->m_program) {
> +		imm->m_program_ptr = 0;
>  	} else {
> -		if (imm.m_program_ptr >= imm.m_program->size()) {
> +		if (imm->m_program_ptr >= imm->m_program->size()) {
>  			// Try to not fail if the program of some immovable has changed
>  			// significantly.
>  			// Note that in some cases, the immovable may end up broken despite
> @@ -679,20 +678,20 @@
>  			log
>  				("Warning: Immovable '%s', size of program '%s' seems to have "
>  				 "changed.\n",
> -				 imm.descr().name().c_str(), imm.m_program->name().c_str());
> -			imm.m_program_ptr = 0;
> +				 imm->descr().name().c_str(), imm->m_program->name().c_str());
> +			imm->m_program_ptr = 0;
>  		}
>  	}
>  
> -	imm.m_program_step = fr.signed_32();
> +	imm->m_program_step = fr.signed_32();
>  
>  	if (version >= 3)
> -		imm.m_reserved_by_worker = fr.unsigned_8();
> +		imm->m_reserved_by_worker = fr.unsigned_8();
>  
>  	if (version >= 4) {
>  		std::string dataname = fr.c_string();
>  		if (!dataname.empty()) {
> -			imm.set_action_data(ImmovableActionData::load(fr, imm, dataname));
> +			imm->set_action_data(ImmovableActionData::load(fr, *imm, dataname));
>  		}
>  	}
>  }
> 
> === modified file 'src/logic/instances.cc'
> --- src/logic/instances.cc	2014-09-20 09:37:47 +0000
> +++ src/logic/instances.cc	2014-11-29 08:14:12 +0000
> @@ -24,7 +24,6 @@
>  #include <cstring>
>  #include <string>
>  
> -#include "base/deprecated.h"
>  #include "base/log.h"
>  #include "base/wexception.h"
>  #include "io/fileread.h"
> 
> === modified file 'src/logic/instances.h'
> --- src/logic/instances.h	2014-09-19 12:54:54 +0000
> +++ src/logic/instances.h	2014-11-29 08:14:12 +0000
> @@ -30,7 +30,6 @@
>  #include <boost/unordered_map.hpp>
>  #include <boost/signals2.hpp>
>  
> -#include "base/deprecated.h"
>  #include "base/log.h"
>  #include "base/macros.h"
>  #include "logic/cmd_queue.h"
> @@ -181,9 +180,10 @@
>  
>  /// If you find a better way to do this that doesn't cost a virtual function
>  /// or additional member variable, go ahead
> -#define MO_DESCR(type) \
> -public: const type & descr() const { \
> -		return ref_cast<type const, MapObjectDescr const>(*m_descr);          \
> +#define MO_DESCR(type)                     \
> +public: const type & descr() const {       \
> +		upcast(type const, result, m_descr); \
> +		return *result;                      \
>     }                                                                          \
>  
>  class MapObject {
> @@ -311,7 +311,8 @@
>  		MapObjectLoader & mol   () {return *m_mol;}
>  		MapObject            * get_object() {return m_object;}
>  		template<typename T> T & get() {
> -			return ref_cast<T, MapObject>(*m_object);
> +			upcast(T, result, m_object);
> +			return *result;
>  		}
>  
>  	protected:
> 
> === modified file 'src/logic/militarysite.cc'
> --- src/logic/militarysite.cc	2014-09-30 05:41:55 +0000
> +++ src/logic/militarysite.cc	2014-11-29 08:14:12 +0000
> @@ -335,9 +335,9 @@
>  		// Now I know that the new guy is worthy.
>  		if (nullptr != kickoutCandidate)
>  		{
> -			Game & game = ref_cast<Game, EditorGameBase>(owner().egbase());
> -			kickoutCandidate->reset_tasks(game);
> -			kickoutCandidate->start_task_leavebuilding(game, true);
> +			upcast(Game, game, &owner().egbase());
> +			kickoutCandidate->reset_tasks(*game);
> +			kickoutCandidate->start_task_leavebuilding(*game, true);
>  			return true;
>  		}
>  	}
> @@ -355,10 +355,10 @@
>  	// Call to drop_least routine has side effects: it tries to drop a soldier. Order is important!
>  	if (stationed_soldiers().size() < m_capacity || drop_least_suited_soldier(true, &s))
>  	{
> -		Game & game = ref_cast<Game, EditorGameBase>(egbase);
> +		upcast(Game, game, &egbase);
>  		s.set_location(this);
> -		s.reset_tasks(game);
> -		s.start_task_buildingwork(game);
> +		s.reset_tasks(*game);
> +		s.start_task_buildingwork(*game);
>  		return true;
>  	}
>  	return false;
> @@ -376,10 +376,9 @@
>  	 Worker          * const w,
>  	 PlayerImmovable &       target)
>  {
> -	MilitarySite & msite = ref_cast<MilitarySite, PlayerImmovable>(target);
> -	Soldier      & s     = ref_cast<Soldier,      Worker>         (*w);
> -
> -	msite.incorporate_soldier(game, s);
> +	upcast(MilitarySite, msite, &target);
> +	upcast(Soldier, s, w);
> +	msite->incorporate_soldier(game, *s);
>  }
>  
>  
> @@ -409,11 +408,11 @@
>  	}
>  
>  	if (m_capacity < present.size()) {
> -		Game & game = ref_cast<Game, EditorGameBase>(owner().egbase());
> +		upcast(Game, game, &owner().egbase());
>  		for (uint32_t i = 0; i < present.size() - m_capacity; ++i) {
>  			Soldier & soldier = *present[i];
> -			soldier.reset_tasks(game);
> -			soldier.start_task_leavebuilding(game, true);
> +			soldier.reset_tasks(*game);
> +			soldier.start_task_leavebuilding(*game, true);
>  		}
>  	}
>  }
> @@ -716,7 +715,7 @@
>  
>  void MilitarySite::drop_soldier(Soldier & soldier)
>  {
> -	Game & game = ref_cast<Game, EditorGameBase>(owner().egbase());
> +	upcast(Game, game, &owner().egbase());
>  
>  	if (!is_present(soldier)) {
>  		// This can happen when the "drop soldier" player command is delayed
> @@ -729,8 +728,8 @@
>  		return;
>  	}
>  
> -	soldier.reset_tasks(game);
> -	soldier.start_task_leavebuilding(game, true);
> +	soldier.reset_tasks(*game);
> +	soldier.start_task_leavebuilding(*game, true);
>  
>  	update_soldier_request();
>  }
> @@ -754,8 +753,8 @@
>  
>  void MilitarySite::aggressor(Soldier & enemy)
>  {
> -	Game & game = ref_cast<Game, EditorGameBase>(owner().egbase());
> -	Map  & map  = game.map();
> +	upcast(Game, game, &owner().egbase());
> +	Map  & map  = game->map();
>  	if
>  		(enemy.get_owner() == &owner() ||
>  		 enemy.get_battle() ||
> @@ -784,7 +783,7 @@
>  				sj.enemy = &enemy;
>  				sj.stayhome = false;
>  				m_soldierjobs.push_back(sj);
> -				temp_soldier->update_task_buildingwork(game);
> +				temp_soldier->update_task_buildingwork(*game);
>  				return;
>  			}
>  		}
> @@ -792,12 +791,12 @@
>  
>  	// Inform the player, that we are under attack by adding a new entry to the
>  	// message queue - a sound will automatically be played.
> -	notify_player(game, true);
> +	notify_player(*game, true);
>  }
>  
>  bool MilitarySite::attack(Soldier & enemy)
>  {
> -	Game & game = ref_cast<Game, EditorGameBase>(owner().egbase());
> +	upcast(Game, game, &owner().egbase());
>  
>  	std::vector<Soldier *> present = present_soldiers();
>  	Soldier * defender = nullptr;
> @@ -832,11 +831,11 @@
>  		sj.stayhome = true;
>  		m_soldierjobs.push_back(sj);
>  
> -		defender->update_task_buildingwork(game);
> +		defender->update_task_buildingwork(*game);
>  
>  		// Inform the player, that we are under attack by adding a new entry to
>  		// the message queue - a sound will automatically be played.
> -		notify_player(game);
> +		notify_player(*game);
>  
>  		return true;
>  	} else {
> @@ -844,7 +843,7 @@
>  		const Coords coords = get_position();
>  		{
>  			send_message
> -				(game,
> +				(*game,
>  				 "site_lost",
>  				 _("Militarysite lost!"),
>  				 descr().m_defeated_enemy_str,
> @@ -855,11 +854,11 @@
>  		// we still hold the bigger military presence in that area (e.g. if there
>  		// is a fortress one or two points away from our sentry, the fortress has
>  		// a higher presence and thus the enemy can just burn down the sentry.
> -		if (military_presence_kept(game)) {
> +		if (military_presence_kept(*game)) {
>  			// Okay we still got the higher military presence, so the attacked
>  			// militarysite will be destroyed.
>  			set_defeating_player(enemy.owner().player_number());
> -			schedule_destroy(game);
> +			schedule_destroy(*game);
>  			return false;
>  		}
>  
> @@ -889,16 +888,16 @@
>  
>  		// Now we destroy the old building before we place the new one.
>  		set_defeating_player(enemy.owner().player_number());
> -		schedule_destroy(game);
> +		schedule_destroy(*game);
>  
>  		enemyplayer->force_building(coords, former_buildings);
> -		BaseImmovable * const newimm = game.map()[coords].get_immovable();
> +		BaseImmovable * const newimm = game->map()[coords].get_immovable();
>  		upcast(MilitarySite, newsite, newimm);
> -		newsite->reinit_after_conqueration(game);
> +		newsite->reinit_after_conqueration(*game);
>  
>  		// Of course we should inform the victorious player as well
>  		newsite->send_message
> -			(game,
> +			(*game,
>  			 "site_defeated",
>  			 _("Enemy at site defeated!"),
>  			 newsite->descr().m_defeated_you_str,
> @@ -991,8 +990,8 @@
>  	sj.stayhome = false;
>  	m_soldierjobs.push_back(sj);
>  
> -	soldier.update_task_buildingwork
> -		(ref_cast<Game, EditorGameBase>(owner().egbase()));
> +	upcast(Game, game, &owner().egbase());
> +	soldier.update_task_buildingwork(*game);
>  }
>  
>  
> 
> === modified file 'src/logic/partially_finished_building.cc'
> --- src/logic/partially_finished_building.cc	2014-09-10 10:18:46 +0000
> +++ src/logic/partially_finished_building.cc	2014-11-29 08:14:12 +0000
> @@ -201,15 +201,15 @@
>  {
>  	assert(w);
>  
> -	PartiallyFinishedBuilding & b = ref_cast<PartiallyFinishedBuilding, PlayerImmovable>(target);
> +	upcast(PartiallyFinishedBuilding, b, &target);
>  
> -	b.m_builder = w;
> +	b->m_builder = w;
>  
>  	delete &rq;
> -	b.m_builder_request = nullptr;
> +	b->m_builder_request = nullptr;
>  
>  	w->start_task_buildingwork(game);
> -	b.set_seeing(true);
> +	b->set_seeing(true);
>  }
>  
>  
> 
> === modified file 'src/logic/pathfield.cc'
> --- src/logic/pathfield.cc	2014-09-19 12:54:54 +0000
> +++ src/logic/pathfield.cc	2014-11-29 08:14:12 +0000
> @@ -19,7 +19,6 @@
>  
>  #include "logic/pathfield.h"
>  
> -#include "base/deprecated.h"
>  #include "base/wexception.h"
>  
>  namespace Widelands {
> 
> === modified file 'src/logic/player.cc'
> --- src/logic/player.cc	2014-09-20 09:37:47 +0000
> +++ src/logic/player.cc	2014-11-29 08:14:12 +0000
> @@ -201,14 +201,14 @@
>  		const TribeDescr::Initialization & initialization =
>  			tribe().initialization(m_initialization_index);
>  
> -		Game & game = ref_cast<Game, EditorGameBase>(egbase());
> +		upcast(Game, game, &egbase());
>  
>  		// Run the corresponding script
> -		std::unique_ptr<LuaTable> table(game.lua().run_script(initialization.script));
> +		std::unique_ptr<LuaTable> table(game->lua().run_script(initialization.script));
>  		table->do_not_warn_about_unaccessed_keys();
>  		std::unique_ptr<LuaCoroutine> cr = table->get_coroutine("func");
>  		cr->push_arg(this);
> -		game.enqueue_command(new CmdLuaCoroutine(game.get_gametime(), cr.release()));
> +		game->enqueue_command(new CmdLuaCoroutine(game->get_gametime(), cr.release()));
>  
>  		// Check if other starting positions are shared in and initialize them as well
>  		for (uint8_t n = 0; n < m_further_shared_in_player.size(); ++n) {
> @@ -216,12 +216,12 @@
>  
>  			// Run the corresponding script
>  			std::unique_ptr<LuaCoroutine> ncr =
> -				game.lua()
> +				game->lua()
>  					.run_script(tribe().initialization(m_further_initializations.at(n)).script)
>  					->get_coroutine("func");
>  			ncr->push_arg(this);
>  			ncr->push_arg(further_pos);
> -			game.enqueue_command(new CmdLuaCoroutine(game.get_gametime(), ncr.release()));
> +			game->enqueue_command(new CmdLuaCoroutine(game->get_gametime(), ncr.release()));
>  		}
>  	} else
>  		throw WLWarning
> @@ -485,7 +485,8 @@
>  		log("Clearing for road at (%i, %i)\n", c.x, c.y);
>  
>  		//  Make sure that the player owns the area around.
> -		ref_cast<Game, EditorGameBase>(egbase()).conquer_area_no_building
> +		upcast(Game, game, &egbase());
> +		game->conquer_area_no_building
>  			(PlayerArea<Area<FCoords> >(player_number(), Area<FCoords>(c, 1)));
>  
>  		if (BaseImmovable * const immovable = c.field->get_immovable()) {
> @@ -774,11 +775,13 @@
>  */
>  void Player::flagaction(Flag & flag)
>  {
> -	if (&flag.owner() == this) //  Additional security check.
> +	if (&flag.owner() == this) { //  Additional security check.
> +		upcast(Game, game, &egbase());
>  		flag.add_flag_job
> -			(ref_cast<Game, EditorGameBase>(egbase()),
> +			(*game,
>  			 tribe().worker_index("geologist"),
>  			 "expedition");
> +	}
>  }
>  
>  
> 
> === modified file 'src/logic/production_program.h'
> --- src/logic/production_program.h	2014-09-14 11:31:58 +0000
> +++ src/logic/production_program.h	2014-11-29 08:14:12 +0000
> @@ -28,7 +28,6 @@
>  
>  #include <stdint.h>
>  
> -#include "base/deprecated.h"
>  #include "base/log.h"
>  #include "base/macros.h"
>  #include "logic/bill_of_materials.h"
> 
> === modified file 'src/logic/productionsite.cc'
> --- src/logic/productionsite.cc	2014-10-27 10:14:10 +0000
> +++ src/logic/productionsite.cc	2014-11-29 08:14:12 +0000
> @@ -517,10 +517,10 @@
>  	 Worker          * const w,
>  	 PlayerImmovable &       target)
>  {
> -	ProductionSite & psite = ref_cast<ProductionSite, PlayerImmovable>(target);
> +	upcast(ProductionSite, psite, &target);
>  
>  	assert(w);
> -	assert(w->get_location(game) == &psite);
> +	assert(w->get_location(game) == psite);
>  
>  	// If there is more than one working position, it's possible, that different level workers are
>  	// requested and therefor possible, that a higher qualified worker answers a request for a lower
> @@ -531,7 +531,7 @@
>  	// placed on the slot that originally requested the arrived worker.
>  	bool worker_placed = false;
>  	WareIndex     idx = w->descr().worker_index();
> -	for (WorkingPosition * wp = psite.m_working_positions;; ++wp) {
> +	for (WorkingPosition * wp = psite->m_working_positions;; ++wp) {
>  		if (wp->worker_request == &rq) {
>  			if (wp->worker_request->get_index() == idx) {
>  				// Place worker
> @@ -542,16 +542,16 @@
>  				// Set new request for this slot
>  				WareIndex workerid = wp->worker_request->get_index();
>  				delete wp->worker_request;
> -				wp->worker_request = &psite.request_worker(workerid);
> +				wp->worker_request = &psite->request_worker(workerid);
>  			}
>  			break;
>  		}
>  	}
>  	while (!worker_placed) {
>  		{
> -			uint8_t nwp = psite.descr().nr_working_positions();
> +			uint8_t nwp = psite->descr().nr_working_positions();
>  			uint8_t pos = 0;
> -			WorkingPosition * wp = psite.m_working_positions;
> +			WorkingPosition * wp = psite->m_working_positions;
>  			for (; pos < nwp; ++wp, ++pos) {
>  				// Find a fitting slot
>  				if (!wp->worker && !worker_placed)
> @@ -565,10 +565,10 @@
>  		}
>  		if (!worker_placed) {
>  			// Find the next smaller version of this worker
> -			WareIndex nuwo    = psite.descr().tribe().get_nrworkers();
> +			WareIndex nuwo    = psite->descr().tribe().get_nrworkers();
>  			WareIndex current = WareIndex(static_cast<size_t>(0));
>  			for (; current < nuwo; ++current) {
> -				WorkerDescr const * worker = psite.descr().tribe().get_worker_descr(current);
> +				WorkerDescr const * worker = psite->descr().tribe().get_worker_descr(current);
>  				if (worker->becomes() == idx) {
>  					idx = current;
>  					break;
> @@ -578,8 +578,8 @@
>  				throw
>  					wexception
>  						("Something went wrong! No fitting place for worker %s in %s at (%u, %u) found!",
> -						 w->descr().descname().c_str(), psite.descr().descname().c_str(),
> -						 psite.get_position().x, psite.get_position().y);
> +						 w->descr().descname().c_str(), psite->descr().descname().c_str(),
> +						 psite->get_position().x, psite->get_position().y);
>  		}
>  	}
>  
> @@ -588,8 +588,8 @@
>  	// primary worker if the worker that has just arrived is
>  	// the last one we need to start working.
>  	w->start_task_idle(game, 0, -1);
> -	psite.try_start_working(game);
> -	psite.workers_changed();
> +	psite->try_start_working(game);
> +	psite->workers_changed();
>  }
>  
>  
> @@ -765,14 +765,13 @@
>  			const WorkerDescr & worker_descr =
>  				*descr().tribe().get_worker_descr(worker_type_with_count.first);
>  			{
> -				Worker & recruit =
> -					ref_cast<Worker, Bob>(worker_descr.create_object());
> -				recruit.set_owner(&worker.owner());
> -				recruit.set_position(game, worker.get_position());
> -				recruit.init(game);
> -				recruit.set_location(this);
> -				recruit.start_task_leavebuilding(game, true);
> -				worker.start_task_releaserecruit(game, recruit);
> +				upcast(Worker, recruit, &worker_descr.create_object());
> +				recruit->set_owner(&worker.owner());
> +				recruit->set_position(game, worker.get_position());
> +				recruit->init(game);
> +				recruit->set_location(this);
> +				recruit->start_task_leavebuilding(game, true);
> +				worker.start_task_releaserecruit(game, *recruit);
>  			}
>  		}
>  		assert(worker_type_with_count.second);
> 
> === modified file 'src/logic/requirements.cc'
> --- src/logic/requirements.cc	2014-09-20 09:37:47 +0000
> +++ src/logic/requirements.cc	2014-11-29 08:14:12 +0000
> @@ -19,7 +19,6 @@
>  
>  #include "logic/requirements.h"
>  
> -#include "base/deprecated.h"
>  #include "base/i18n.h"
>  #include "io/fileread.h"
>  #include "io/filewrite.h"
> 
> === modified file 'src/logic/ship.cc'
> --- src/logic/ship.cc	2014-09-20 09:37:47 +0000
> +++ src/logic/ship.cc	2014-11-29 08:14:12 +0000
> @@ -21,7 +21,7 @@
>  
>  #include <memory>
>  
> -#include "base/deprecated.h"
> +#include "base/macros.h"
>  #include "economy/economy.h"
>  #include "economy/flag.h"
>  #include "economy/fleet.h"
> @@ -1031,7 +1031,8 @@
>  	// economy of all workers we're transporting so that they are in the correct
>  	// economy. Also, we might are on an expedition which means that we just now
>  	// created the economy of this ship and must inform all wares.
> -	ship.set_economy(ref_cast<Game>(egbase()), ship.m_economy);
> +	upcast(Game, game, &egbase());
> +	ship.set_economy(*game, ship.m_economy);
>  }
>  
>  
> 
> === modified file 'src/logic/soldier.cc'
> --- src/logic/soldier.cc	2014-10-27 10:14:10 +0000
> +++ src/logic/soldier.cc	2014-11-29 08:14:12 +0000
> @@ -700,12 +700,8 @@
>  	 uint32_t const time)
>  {
>  	molog("[soldier] starting animation %s", animname);
> -	return
> -		start_task_idle
> -			(ref_cast<Game, EditorGameBase>(egbase),
> -			 descr().get_rand_anim
> -			 	(ref_cast<Game, EditorGameBase>(egbase), animname),
> -			 time);
> +	upcast(Game, game, &egbase);
> +	return start_task_idle(*game, descr().get_rand_anim(*game, animname), time);
>  }
>  
>  
> @@ -748,14 +744,17 @@
>   */
>  bool Soldier::can_be_challenged()
>  {
> -	if (m_hp_current < 1)  //< Soldier is dead!
> -		return false;
> -	if (!is_on_battlefield())
> -		return false;
> -	if (!m_battle)
> +	if (m_hp_current < 1) {  //< Soldier is dead!
> +		return false;
> +	}
> +	if (!is_on_battlefield()) {
> +		return false;
> +	}
> +	if (!m_battle) {
>  		return true;
> -	return
> -		!m_battle->locked(ref_cast<Game, EditorGameBase>(owner().egbase()));
> +	}
> +	upcast(Game, game, &owner().egbase());
> +	return !m_battle->locked(*game);
>  }
>  
>  /**
> @@ -1805,11 +1804,8 @@
>  			 FindImmovableAttackable());
>  
>  		for (BaseImmovable * temp_attackable : attackables) {
> -			if
> -				(ref_cast<PlayerImmovable const, BaseImmovable const>(*temp_attackable)
> -				 .get_owner()->player_number()
> -				 ==
> -				 land_owner) {
> +			upcast(PlayerImmovable const, imm, temp_attackable);
> +			if (imm->get_owner()->player_number() == land_owner) {
>  				dynamic_cast<Attackable &>(*temp_attackable).aggressor(*this);
>  			}
>  		}
> 
> === modified file 'src/logic/trainingsite.cc'
> --- src/logic/trainingsite.cc	2014-10-27 10:14:10 +0000
> +++ src/logic/trainingsite.cc	2014-11-29 08:14:12 +0000
> @@ -341,13 +341,13 @@
>  	 Worker          * const w,
>  	 PlayerImmovable &       target)
>  {
> -	TrainingSite & tsite = ref_cast<TrainingSite, PlayerImmovable>(target);
> -	Soldier      & s     = ref_cast<Soldier,      Worker>         (*w);
> -
> -	assert(s.get_location(game) == &tsite);
> -	assert(tsite.m_soldier_request == &rq);
> -
> -	tsite.incorporate_soldier(game, s);
> +	upcast(TrainingSite, tsite, &target);
> +	upcast(Soldier, s, w);
> +
> +	assert(s->get_location(game) == tsite);
> +	assert(tsite->m_soldier_request == &rq);
> +
> +	tsite->incorporate_soldier(game, *s);
>  }
>  
>  /*
> @@ -416,7 +416,7 @@
>   */
>  void TrainingSite::drop_soldier(Soldier & soldier)
>  {
> -	Game & game = ref_cast<Game, EditorGameBase>(owner().egbase());
> +	upcast(Game, game, &owner().egbase());
>  
>  	std::vector<Soldier *>::iterator it =
>  		std::find(m_soldiers.begin(), m_soldiers.end(), &soldier);
> @@ -427,11 +427,11 @@
>  
>  	m_soldiers.erase(it);
>  
> -	soldier.reset_tasks(game);
> -	soldier.start_task_leavebuilding(game, true);
> +	soldier.reset_tasks(*game);
> +	soldier.start_task_leavebuilding(*game, true);
>  
>  	// Schedule, so that we can call new soldiers on next act()
> -	schedule_act(game, 100);
> +	schedule_act(*game, 100);
>  }
>  
>  
> 
> === modified file 'src/logic/warehouse.cc'
> --- src/logic/warehouse.cc	2014-09-30 05:41:55 +0000
> +++ src/logic/warehouse.cc	2014-11-29 08:14:12 +0000
> @@ -23,7 +23,6 @@
>  
>  #include <boost/format.hpp>
>  
> -#include "base/deprecated.h"
>  #include "base/log.h"
>  #include "base/macros.h"
>  #include "base/wexception.h"
> @@ -377,11 +376,10 @@
>  			(owner().is_worker_type_allowed(worker_index) &&
>  			 m_next_worker_without_cost_spawn[i] == static_cast<uint32_t>(never()))
>  		{
> -			if (next_spawn == static_cast<uint32_t>(never()))
> -				next_spawn =
> -					schedule_act
> -						(ref_cast<Game, EditorGameBase>(egbase),
> -						 WORKER_WITHOUT_COST_SPAWN_INTERVAL);
> +			upcast(Game, game, &egbase);
> +			if (next_spawn == static_cast<uint32_t>(never())) {
> +				next_spawn = schedule_act(*game, WORKER_WITHOUT_COST_SPAWN_INTERVAL);
> +			}
>  			m_next_worker_without_cost_spawn[i] = next_spawn;
>  			log
>  				("WARNING: player %u is allowed to create worker type %s but his "
> @@ -444,17 +442,13 @@
>  		// m_next_military_act is not touched in the loading code. Is only needed
>  		// if there warehous is created in the game?  I assume it's for the
>  		// conquer_radius thing
> -		m_next_military_act =
> -			schedule_act
> -				(ref_cast<Game, EditorGameBase>(egbase), 1000);
> +		m_next_military_act = schedule_act(*game, 1000);
>  
> -		m_next_stock_remove_act =
> -			schedule_act
> -				(ref_cast<Game, EditorGameBase>(egbase), 4000);
> +		m_next_stock_remove_act = schedule_act(*game, 4000);
>  
>  		log("Message: adding (wh) (%s) %i \n", to_string(descr().type()).c_str(), player.player_number());
>  		send_message
> -			(ref_cast<Game, EditorGameBase>(egbase),
> +			(*game,
>  			 "warehouse",
>  			 descr().descname(),
>  			 (boost::format(_("A new %s was added to your economy."))
> @@ -911,17 +905,17 @@
>  	 Worker          * const w,
>  	 PlayerImmovable &       target)
>  {
> -	Warehouse & wh = ref_cast<Warehouse, PlayerImmovable>(target);
> +	upcast(Warehouse, wh, &target);
>  
>  	if (w) {
>  		w->schedule_incorporate(game);
>  	} else {
> -		wh.m_supply->add_wares(ware, 1);
> +		wh->m_supply->add_wares(ware, 1);
>  
>  		// This ware may be used to build planned workers,
>  		// so it seems like a good idea to update the associated requests
>  		// and use the ware before it is sent away again.
> -		wh._update_all_planned_workers(game);
> +		wh->_update_all_planned_workers(game);
>  	}
>  }
>  
> @@ -1198,8 +1192,8 @@
>  	if (!descr().get_conquers())
>  		return;
>  
> -	Game & game = ref_cast<Game, EditorGameBase>(owner().egbase());
> -	Map  & map  = game.map();
> +	upcast(Game, game, &owner().egbase());
> +	Map  & map  = game->map();
>  	if
>  		(enemy.get_owner() == &owner() ||
>  		 enemy.get_battle() ||
> @@ -1209,7 +1203,7 @@
>  		return;
>  
>  	if
> -		(game.map().find_bobs
> +		(game->map().find_bobs
>  		 	(Area<FCoords>(map.get_fcoords(base_flag().get_position()), 2),
>  		 	 nullptr,
>  		 	 FindBobEnemySoldier(&owner())))
> @@ -1218,30 +1212,28 @@
>  	WareIndex const soldier_index = descr().tribe().worker_index("soldier");
>  	Requirements noreq;
>  
> -	if (!count_workers(game, soldier_index, noreq))
> +	if (!count_workers(*game, soldier_index, noreq))
>  		return;
>  
> -	Soldier & defender =
> -		ref_cast<Soldier, Worker>(launch_worker(game, soldier_index, noreq));
> -	defender.start_task_defense(game, false);
> +	upcast(Soldier, defender, &launch_worker(*game, soldier_index, noreq));
> +	defender->start_task_defense(*game, false);
>  }
>  
>  bool Warehouse::attack(Soldier & enemy)
>  {
> -	Game & game = ref_cast<Game, EditorGameBase>(owner().egbase());
> +	upcast(Game, game, &owner().egbase());
>  	WareIndex const soldier_index = descr().tribe().worker_index("soldier");
>  	Requirements noreq;
>  
> -	if (count_workers(game, soldier_index, noreq)) {
> -		Soldier & defender =
> -			ref_cast<Soldier, Worker>(launch_worker(game, soldier_index, noreq));
> -		defender.start_task_defense(game, true);
> -		enemy.send_signal(game, "sleep");
> +	if (count_workers(*game, soldier_index, noreq)) {
> +		upcast(Soldier, defender, &launch_worker(*game, soldier_index, noreq));
> +		defender->start_task_defense(*game, true);
> +		enemy.send_signal(*game, "sleep");
>  		return true;
>  	}
>  
>  	set_defeating_player(enemy.owner().player_number());
> -	schedule_destroy(game);
> +	schedule_destroy(*game);
>  	return false;
>  }
>  
> 
> === modified file 'src/logic/worker.cc'
> --- src/logic/worker.cc	2014-10-27 10:14:10 +0000
> +++ src/logic/worker.cc	2014-11-29 08:14:12 +0000
> @@ -618,7 +618,8 @@
>  	int32_t max_steps = -1;
>  
>  	// First of all, make sure we're outside
> -	if (imm == &ref_cast<Building, PlayerImmovable>(*get_location(game))) {
> +	upcast(Building, building, get_location(game));
> +	if (imm == building) {
>  		start_task_leavebuilding(game, false);
>  		return true;
>  	}
> @@ -902,7 +903,8 @@
>  bool Worker::run_geologist(Game & game, State & state, const Action & action)
>  {
>  	// assert that location is of the right type.
> -	ref_cast<Flag const, PlayerImmovable const>(*get_location(game));
> +	// NOCOM(#gunchleoc): What's this supposed to do? There's nothing being asserted here.

Dunno. Maybe the author thought that it would throw something like a bad cast exception, but I do not think it does in c++. Just delete it.

> +	//upcast(Flag const, flag, get_location(game));
>  
>  	molog
>  		("  Start Geologist (%i attempts, %i radius -> %s)\n",
> @@ -1902,13 +1904,12 @@
>  	}
>  
>  	for (;;) {
> -		const WorkerProgram & program =
> -			ref_cast<WorkerProgram const, BobProgramBase const>(*state.program);
> +		upcast(WorkerProgram const, program, state.program);
>  
> -		if (static_cast<uint32_t>(state.ivar1) >= program.get_size())
> +		if (static_cast<uint32_t>(state.ivar1) >= program->get_size())
>  			return pop_task(game);
>  
> -		const Action & action = *program.get_action(state.ivar1);
> +		const Action & action = *program->get_action(state.ivar1);
>  
>  		if ((this->*(action.function))(game, state, action))
>  			return;
> @@ -2082,9 +2083,12 @@
>  
>  	WareInstance * ware = get_carried_ware(game);
>  	BaseImmovable * const location = game.map()[get_position()].get_immovable();
> +
>  #ifndef NDEBUG
> -	Building & ploc = ref_cast<Building, PlayerImmovable>(*get_location(game));
> -	assert(&ploc == location || &ploc.base_flag() == location);
> +	upcast(BaseImmovable, ploc, get_location(game));
> +	upcast(Building, plbuild, get_location(game));
> +	upcast(BaseImmovable, plflagloc, &plbuild->base_flag());
> +	assert(ploc == location || plflagloc == location);
>  #endif
>  
>  	// Deliver the ware
> @@ -2205,11 +2209,10 @@
>  
>  		// The ware has decided that it doesn't want to go to us after all
>  		// In order to return to the warehouse, we're switching to State_DropOff
> -		if
> -			(WareInstance * const ware =
> -			 	ref_cast<Flag, PlayerImmovable>(*location).fetch_pending_ware
> -			 		(game, employer))
> +		upcast(Flag, flag, location);
> +		if (WareInstance * const ware = flag->fetch_pending_ware(game, employer)) {
>  			set_carried_ware(game, ware);
> +		}
>  
>  		set_animation(game, descr().get_animation("idle"));
>  		return schedule_act(game, 20);
> @@ -2367,14 +2370,13 @@
>   */
>  void Worker::start_task_leavebuilding(Game & game, bool const changelocation)
>  {
> -	Building & building =
> -		ref_cast<Building, PlayerImmovable>(*get_location(game));
> +	upcast(Building, building, get_location(game));
>  
>  	// Set the wait task
>  	push_task(game, taskLeavebuilding);
>  	State & state = top_state();
>  	state.ivar1   = changelocation;
> -	state.objvar1 = &building;
> +	state.objvar1 = building;
>  }
>  
>  
> @@ -2437,8 +2439,10 @@
>  	//  The if-statement is needed because this is (unfortunately) also called
>  	//  when the Worker is deallocated when shutting down the simulation. Then
>  	//  the building might not exist any more.
> -	if (MapObject * const building = state.objvar1.get(game))
> -		ref_cast<Building, MapObject>(*building).leave_skip(game, *this);
> +	if (MapObject * const building = state.objvar1.get(game)) {
> +		upcast(Building, tmp_building, building);
> +		tmp_building->leave_skip(game, *this);
> +	}
>  }
>  
>  
> @@ -2544,7 +2548,7 @@
>  		molog("[fugitive]: found a flag connected to warehouse(s)\n");
>  		for (const ImmovableFound& tmp_flag : flags) {
>  
> -			Flag & flag = ref_cast<Flag, BaseImmovable>(*tmp_flag.object);
> +			upcast(Flag, flag, tmp_flag.object);
>  
>  			if (game.logic_rand() % 2 == 0)
>  				continue;
> @@ -2553,7 +2557,7 @@
>  				map.calc_distance(get_position(), tmp_flag.coords);
>  
>  			if (!best || bestdist > dist) {
> -				best = &flag;
> +				best = flag;
>  				bestdist = dist;
>  			}
>  		}
> @@ -2649,10 +2653,8 @@
>  	//
>  	Map & map = game.map();
>  	const World & world = game.world();
> -	Area<FCoords> owner_area
> -		(map.get_fcoords
> -		 	(ref_cast<Flag, PlayerImmovable>(*get_location(game)).get_position()),
> -		 state.ivar2);
> +	upcast(Flag, flag, get_location(game));
> +	Area<FCoords> owner_area(map.get_fcoords(flag->get_position()), state.ivar2);
>  
>  	// Check if it's not time to go home
>  	if (state.ivar1 > 0) {
> @@ -2798,12 +2800,11 @@
>  	state.ivar2   = game.get_gametime() + time;
>  
>  	// first get out
> -	Building & building =
> -		ref_cast<Building, PlayerImmovable>(*get_location(game));
> +	upcast(Building, building, get_location(game));
>  	push_task(game, taskLeavebuilding);
>  	State & stateLeave = top_state();
>  	stateLeave.ivar1 = false;
> -	stateLeave.objvar1 = &building;
> +	stateLeave.objvar1 = building;
>  }
>  
>  
> @@ -2958,8 +2959,8 @@
>  
>  	if (version >= 2) {
>  		if (fr.unsigned_8()) {
> -			worker.m_transfer =
> -				new Transfer(ref_cast<Game, EditorGameBase>(egbase()), worker);
> +			upcast(Game, game, &egbase());
> +			worker.m_transfer = new Transfer(*game, worker);
>  			worker.m_transfer->read(fr, m_transfer);
>  		}
>  	}
> 
> === modified file 'src/logic/worker_descr.cc'
> --- src/logic/worker_descr.cc	2014-09-20 09:37:47 +0000
> +++ src/logic/worker_descr.cc	2014-11-29 08:14:12 +0000
> @@ -19,8 +19,8 @@
>  
>  #include "logic/worker_descr.h"
>  
> -#include "base/deprecated.h"
>  #include "base/i18n.h"
> +#include "base/macros.h"
>  #include "base/wexception.h"
>  #include "graphic/graphic.h"
>  #include "logic/carrier.h"
> @@ -177,12 +177,12 @@
>  	 Coords             const coords)
>  const
>  {
> -	Worker & worker = ref_cast<Worker, MapObject>(create_object());
> -	worker.set_owner(&owner);
> -	worker.set_location(location);
> -	worker.set_position(egbase, coords);
> -	worker.init(egbase);
> -	return worker;
> +	upcast(Worker, worker, &create_object());
> +	worker->set_owner(&owner);
> +	worker->set_location(location);
> +	worker->set_position(egbase, coords);
> +	worker->init(egbase);
> +	return *worker;
>  }
>  
>  
> 
> === modified file 'src/map_io/CMakeLists.txt'
> --- src/map_io/CMakeLists.txt	2014-11-22 15:27:45 +0000
> +++ src/map_io/CMakeLists.txt	2014-11-29 08:14:12 +0000
> @@ -86,7 +86,6 @@
>      map_version_packet.h
>    USES_SDL2_IMAGE
>    DEPENDS
> -    base_deprecated
>      base_exceptions
>      base_log
>      base_macros
> 
> === modified file 'src/map_io/map_buildingdata_packet.cc'
> --- src/map_io/map_buildingdata_packet.cc	2014-09-20 09:37:47 +0000
> +++ src/map_io/map_buildingdata_packet.cc	2014-11-29 08:14:12 +0000
> @@ -194,43 +194,21 @@
>  					//  Set economy now, some stuff below will count on this.
>  					building.set_economy(building.m_flag->get_economy());
>  
> +					upcast(Game, game, &egbase);
> +
>  					if (upcast(ConstructionSite, constructionsite, &building)) {
> -						read_constructionsite
> -							(*constructionsite,
> -							 fr,
> -							 ref_cast<Game, EditorGameBase>(egbase),
> -							 mol);
> +						read_constructionsite (*constructionsite, fr, *game, mol);
>  					} else if (upcast(DismantleSite, dms, &building)) {
> -						read_dismantlesite
> -							(*dms,
> -							 fr,
> -							 ref_cast<Game, EditorGameBase>(egbase),
> -							 mol);
> +						read_dismantlesite(*dms, fr, *game, mol);
>  					} else if (upcast(Warehouse, warehouse, &building)) {
> -						read_warehouse
> -							(*warehouse,
> -							 fr,
> -							 ref_cast<Game, EditorGameBase>(egbase),
> -							 mol);
> +						read_warehouse(*warehouse, fr, *game, mol);
>  					} else if (upcast(ProductionSite, productionsite, &building)) {
>  						if (upcast(MilitarySite, militarysite, productionsite)) {
> -							read_militarysite
> -								(*militarysite,
> -								 fr,
> -								 ref_cast<Game, EditorGameBase>(egbase),
> -								 mol);
> +							read_militarysite(*militarysite, fr, *game, mol);
>  						} else if (upcast(TrainingSite, trainingsite, productionsite)) {
> -							read_trainingsite
> -								(*trainingsite,
> -								 fr,
> -								 ref_cast<Game, EditorGameBase>(egbase),
> -								 mol);
> +							read_trainingsite(*trainingsite, fr, *game, mol);
>  						} else {
> -							read_productionsite
> -								(*productionsite,
> -								 fr,
> -								 ref_cast<Game, EditorGameBase>(egbase),
> -								 mol);
> +							read_productionsite(*productionsite, fr, *game, mol);
>  						}
>  					} else {
>  						//  type of building is not one of (or derived from)
> @@ -238,8 +216,7 @@
>  						assert(false);
>  					}
>  					if (packet_version < 3) {
> -						read_formerbuildings_v2
> -							(building, fr, ref_cast<Game, EditorGameBase>(egbase), mol);
> +						read_formerbuildings_v2(building, fr, *game, mol);
>  					}
>  
>  					mol.mark_object_as_loaded(building);
> @@ -1137,7 +1114,7 @@
>  	Map & map = egbase.map();
>  	const uint32_t mapwidth = map.get_width();
>  	MapIndex const max_index = map.max_index();
> -	for (MapIndex i = 0; i < max_index; ++i)
> +	for (MapIndex i = 0; i < max_index; ++i) {
>  		if (upcast(Building const, building, map[i].get_immovable())) {
>  			assert(mos.is_object_known(*building));
>  
> @@ -1190,52 +1167,32 @@
>  				fw.unsigned_8(is_stopped);
>  			}
>  
> -			if (upcast(ConstructionSite const, constructionsite, building))
> -				write_constructionsite
> -					(*constructionsite,
> -					 fw,
> -					 ref_cast<Game, EditorGameBase>(egbase),
> -					 mos);
> -			else if (upcast(DismantleSite const, dms, building))
> -				write_dismantlesite
> -					(*dms,
> -					 fw,
> -					 ref_cast<Game, EditorGameBase>(egbase),
> -					 mos);
> -			else if (upcast(Warehouse const, warehouse, building))
> -				write_warehouse
> -					(*warehouse,
> -					 fw,
> -					 ref_cast<Game, EditorGameBase>(egbase),
> -					 mos);
> -			else if (upcast(ProductionSite const, productionsite, building)) {
> -				if (upcast(MilitarySite const, militarysite, productionsite))
> -					write_militarysite
> -						(*militarysite,
> -						 fw,
> -						 ref_cast<Game, EditorGameBase>(egbase),
> -						 mos);
> -				else if (upcast(TrainingSite const, trainingsite, productionsite))
> -					write_trainingsite
> -						(*trainingsite,
> -						 fw,
> -						 ref_cast<Game, EditorGameBase>(egbase),
> -						 mos);
> -				else
> -					write_productionsite
> -						(*productionsite,
> -						 fw,
> -						 ref_cast<Game, EditorGameBase>(egbase),
> -						 mos);
> +			upcast(Game, game, &egbase);
> +
> +			if (upcast(ConstructionSite const, constructionsite, building)) {
> +				write_constructionsite(*constructionsite, fw, *game, mos);
> +			} else if (upcast(DismantleSite const, dms, building)) {
> +				write_dismantlesite(*dms, fw, *game, mos);
> +			} else if (upcast(Warehouse const, warehouse, building)) {
> +				write_warehouse (*warehouse, fw, *game, mos);
> +			} else if (upcast(ProductionSite const, productionsite, building)) {
> +				if (upcast(MilitarySite const, militarysite, productionsite)) {
> +					write_militarysite(*militarysite, fw, *game, mos);
> +				}
> +				else if (upcast(TrainingSite const, trainingsite, productionsite)) {
> +					write_trainingsite(*trainingsite, fw, *game, mos);
> +				}
> +				else {
> +					write_productionsite(*productionsite, fw, *game, mos);
> +				}
>  			} else {
>  				assert(false);
>  				//  type of building is not one of (or derived from)
>  				//  {ConstructionSite, Warehouse, ProductionSite}
>  			}
> -
>  			mos.mark_object_as_saved(*building);
>  		}
> -
> +	}
>  	fw.write(fs, "binary/building_data");
>  }
>  
> 
> === modified file 'src/map_io/map_elemental_packet.cc'
> --- src/map_io/map_elemental_packet.cc	2014-10-29 06:41:10 +0000
> +++ src/map_io/map_elemental_packet.cc	2014-11-29 08:14:12 +0000
> @@ -22,7 +22,6 @@
>  #include <boost/algorithm/string.hpp>
>  #include <boost/format.hpp>
>  
> -#include "base/deprecated.h"
>  #include "logic/editor_game_base.h"
>  #include "logic/game_data_error.h"
>  #include "logic/map.h"
> 
> === modified file 'src/map_io/map_flag_packet.cc'
> --- src/map_io/map_flag_packet.cc	2014-09-20 09:37:47 +0000
> +++ src/map_io/map_flag_packet.cc	2014-11-29 08:14:12 +0000
> @@ -106,12 +106,10 @@
>  						//  packet. We always create this, no matter what skip is
>  						//  since we have to read the data packets. We delete this
>  						//  object later again, if it is not wanted.
> +						upcast(Game, game, &egbase);
>  						mol.register_object<Flag>
>  							(serial,
> -							 *new Flag
> -							 	(ref_cast<Game, EditorGameBase>(egbase),
> -							 	 egbase.player(owner),
> -							 	 fc));
> +							 *new Flag(*game, egbase.player(owner), fc));
>  					} catch (const WException & e) {
>  						throw GameDataError
>  							("%u (at (%i, %i), owned by player %u): %s",
> 
> === modified file 'src/map_io/map_flagdata_packet.cc'
> --- src/map_io/map_flagdata_packet.cc	2014-09-20 09:37:47 +0000
> +++ src/map_io/map_flagdata_packet.cc	2014-11-29 08:14:12 +0000
> @@ -201,8 +201,8 @@
>  										 0,
>  										 Flag::flag_job_request_callback,
>  										 wwWORKER);
> -								f.request->read
> -									(fr, ref_cast<Game, EditorGameBase>(egbase), mol);
> +								upcast(Game, game, &egbase);
> +								f.request->read(fr, *game, mol);
>  							} else {
>  								f.request = nullptr;
>  							}
> @@ -301,8 +301,8 @@
>  			for (const Flag::FlagJob& temp_job : flag_jobs) {
>  				if (temp_job.request) {
>  					fw.unsigned_8(1);
> -					temp_job.request->write
> -						(fw, ref_cast<Game, EditorGameBase>(egbase), mos);
> +					upcast(Game, game, &egbase);
> +					temp_job.request->write(fw, *game, mos);
>  				} else
>  					fw.unsigned_8(0);
>  
> 
> === modified file 'src/map_io/map_object_saver.cc'
> --- src/map_io/map_object_saver.cc	2014-09-14 11:31:58 +0000
> +++ src/map_io/map_object_saver.cc	2014-11-29 08:14:12 +0000
> @@ -19,7 +19,6 @@
>  
>  #include "map_io/map_object_saver.h"
>  
> -#include "base/deprecated.h"
>  #include "base/wexception.h"
>  #include "economy/flag.h"
>  #include "economy/fleet.h"
> 
> === modified file 'src/map_io/map_port_spaces_packet.cc'
> --- src/map_io/map_port_spaces_packet.cc	2014-09-30 05:41:55 +0000
> +++ src/map_io/map_port_spaces_packet.cc	2014-11-29 08:14:12 +0000
> @@ -23,7 +23,6 @@
>  
>  #include <boost/algorithm/string.hpp>
>  
> -#include "base/deprecated.h"
>  #include "base/log.h"
>  #include "logic/editor_game_base.h"
>  #include "logic/game_data_error.h"
> 
> === modified file 'src/map_io/map_roaddata_packet.cc'
> --- src/map_io/map_roaddata_packet.cc	2014-09-20 09:37:47 +0000
> +++ src/map_io/map_roaddata_packet.cc	2014-11-29 08:14:12 +0000
> @@ -69,6 +69,7 @@
>  					break;
>  				}
>  				try {
> +					upcast(Game, game, &egbase);
>  					Road & road = mol.get<Road>(serial);
>  					if (mol.is_object_loaded(road))
>  						throw GameDataError("already loaded");
> @@ -124,7 +125,7 @@
>  
>  					//  Now that all rudimentary data is set, init this road. Then
>  					//  overwrite the initialization values.
> -					road._link_into_flags(ref_cast<Game, EditorGameBase>(egbase));
> +					road._link_into_flags(*game);
>  
>  					road.m_idle_index      = fr.unsigned_32();
>  
> @@ -166,8 +167,8 @@
>  							 		(road,
>  							 		 0,
>  							 		 Road::_request_carrier_callback,
> -							 		 wwWORKER))
> -							->read(fr, ref_cast<Game, EditorGameBase>(egbase), mol);
> +									 wwWORKER))
> +							->read(fr, *game, mol);
>  						} else {
>  							carrier_request = nullptr;
>  							//log("No request in this slot");
> @@ -190,13 +191,8 @@
>  						} else {
>  							delete carrier_request;
>  							if (carrier) {
> -								//carrier->set_location (0);
> -								carrier->reset_tasks
> -									(ref_cast<Game,
> -									 EditorGameBase>(egbase));
> -								//carrier->send_signal
> -								//(ref_cast<Game,
> -								//EditorGameBase>(egbase), "location");
> +								upcast(Game, game, &egbase);
> +								carrier->reset_tasks(*game);
>  							}
>  						}
>  					}
> @@ -275,8 +271,8 @@
>  
>  					if (temp_slot.carrier_request) {
>  						fw.unsigned_8(1);
> -						temp_slot.carrier_request->write
> -							(fw, ref_cast<Game, EditorGameBase>(egbase), mos);
> +						upcast(Game, game, &egbase);
> +						temp_slot.carrier_request->write(fw, *game, mos);
>  					} else {
>  						fw.unsigned_8(0);
>  					}
> 
> === modified file 'src/network/CMakeLists.txt'
> --- src/network/CMakeLists.txt	2014-10-13 15:04:50 +0000
> +++ src/network/CMakeLists.txt	2014-11-29 08:14:12 +0000
> @@ -23,7 +23,6 @@
>    USES_SDL2_NET
>    DEPENDS
>      ai
> -    base_deprecated
>      base_exceptions
>      base_i18n
>      base_log
> 
> === modified file 'src/network/network_lan_promotion.cc'
> --- src/network/network_lan_promotion.cc	2014-09-20 09:37:47 +0000
> +++ src/network/network_lan_promotion.cc	2014-11-29 08:14:12 +0000
> @@ -22,7 +22,6 @@
>  #include <cstdio>
>  #include <cstring>
>  
> -#include "base/deprecated.h"
>  #include "base/log.h"
>  #include "base/macros.h"
>  #include "build_info.h"
> 
> === modified file 'src/scripting/CMakeLists.txt'
> --- src/scripting/CMakeLists.txt	2014-07-25 20:16:31 +0000
> +++ src/scripting/CMakeLists.txt	2014-11-29 08:14:12 +0000
> @@ -38,7 +38,6 @@
>      scripting.h
>    USES_BOOST_REGEX
>    DEPENDS
> -    base_deprecated
>      base_exceptions
>      base_i18n
>      base_log
> 
> === modified file 'src/scripting/lua_map.cc'
> --- src/scripting/lua_map.cc	2014-10-27 10:14:10 +0000
> +++ src/scripting/lua_map.cc	2014-11-29 08:14:12 +0000
> @@ -21,8 +21,8 @@
>  
>  #include <boost/format.hpp>
>  
> -#include "base/deprecated.h"
>  #include "base/log.h"
> +#include "base/macros.h"
>  #include "economy/wares_queue.h"
>  #include "graphic/graphic.h"
>  #include "logic/carrier.h"
> @@ -444,11 +444,10 @@
>  			lua_rawset(L, -3);
>  		}
>  	} else {
> -		const SoldierDescr& soldier_descr = ref_cast<SoldierDescr const, WorkerDescr const>
> -			(*tribe.get_worker_descr(tribe.worker_index("soldier")));
> +		upcast(SoldierDescr const, soldier_descr, tribe.get_worker_descr(tribe.worker_index("soldier")));
>  
>  		// Only return the number of those requested
> -		const SoldierMapDescr wanted = unbox_lua_soldier_description(L, 2, soldier_descr);
> +		const SoldierMapDescr wanted = unbox_lua_soldier_description(L, 2, *soldier_descr);
>  		uint32_t rv = 0;
>  		for (const Soldier* s : soldiers) {
>  			SoldierMapDescr sd
> @@ -469,10 +468,8 @@
>  	assert(owner != nullptr);
>  
>  	const TribeDescr& tribe = owner->tribe();
> -	const SoldierDescr& soldier_descr =  //  soldiers
> -		ref_cast<SoldierDescr const, WorkerDescr const>
> -			(*tribe.get_worker_descr(tribe.worker_index("soldier")));
> -	SoldiersMap setpoints = m_parse_set_soldiers_arguments(L, soldier_descr);
> +	upcast(SoldierDescr const, soldier_descr, tribe.get_worker_descr(tribe.worker_index("soldier")));
> +	SoldiersMap setpoints = m_parse_set_soldiers_arguments(L, *soldier_descr);
>  
>  	// Get information about current soldiers
>  	const std::vector<Soldier*> curs = sc->stationed_soldiers();
> @@ -517,12 +514,11 @@
>  			}
>  		} else if (d > 0) {
>  			for (; d; --d) {
> -				Soldier& soldier = ref_cast<Soldier, Worker>
> -					(soldier_descr.create(egbase, *owner, nullptr, building_position));
> -				soldier.set_level
> +				upcast(Soldier, soldier, &soldier_descr->create(egbase, *owner, nullptr, building_position));
> +				soldier->set_level
>  					(sp.first.hp, sp.first.at, sp.first.de, sp.first.ev);
> -				if (sc->incorporate_soldier(egbase, soldier)) {
> -					soldier.remove(egbase);
> +				if (sc->incorporate_soldier(egbase, *soldier)) {
> +					soldier->remove(egbase);
>  					report_error(L, "No space left for soldier!");
>  				}
>  			}
> @@ -2586,13 +2582,13 @@
>  	for (Path::StepVector::size_type i = 0; i < idle_index; ++i)
>  		egbase.map().get_neighbour(idle_position, path[i], &idle_position);
>  
> -	Carrier & carrier = ref_cast<Carrier, Worker>
> -		(wdes->create (egbase, r.owner(), &r, idle_position));
> -
> -	if (upcast(Game, game, &egbase))
> -		carrier.start_task_road(*game);
> -
> -	r.assign_carrier(carrier, 0);
> +	upcast(Carrier, carrier, &wdes->create(egbase, r.owner(), &r, idle_position));
> +
> +	if (upcast(Game, game, &egbase)) {
> +		carrier->start_task_road(*game);
> +	}
> +
> +	r.assign_carrier(*carrier, 0);
>  	return 0;
>  }
>  
> 
> === modified file 'src/sound/CMakeLists.txt'
> --- src/sound/CMakeLists.txt	2014-10-13 15:04:50 +0000
> +++ src/sound/CMakeLists.txt	2014-11-29 08:14:12 +0000
> @@ -10,7 +10,6 @@
>    USES_SDL2
>    USES_SDL2_MIXER
>    DEPENDS
> -    base_deprecated
>      base_i18n
>      base_log
>      graphic
> 
> === modified file 'src/sound/sound_handler.cc'
> --- src/sound/sound_handler.cc	2014-10-16 16:06:37 +0000
> +++ src/sound/sound_handler.cc	2014-11-29 08:14:12 +0000
> @@ -28,7 +28,6 @@
>  #include <windows.h>
>  #endif
>  
> -#include "base/deprecated.h"
>  #include "base/i18n.h"
>  #include "base/log.h"
>  #include "graphic/graphic.h"
> 
> === modified file 'src/ui_basic/CMakeLists.txt'
> --- src/ui_basic/CMakeLists.txt	2014-11-22 11:00:04 +0000
> +++ src/ui_basic/CMakeLists.txt	2014-11-29 08:14:12 +0000
> @@ -51,7 +51,6 @@
>    USES_BOOST_REGEX
>    USES_SDL2
>    DEPENDS
> -    base_deprecated
>      base_exceptions
>      base_geometry
>      base_i18n
> 
> === modified file 'src/ui_basic/listselect.cc'
> --- src/ui_basic/listselect.cc	2014-11-22 10:18:20 +0000
> +++ src/ui_basic/listselect.cc	2014-11-29 08:14:12 +0000
> @@ -23,7 +23,6 @@
>  
>  #include <boost/bind.hpp>
>  
> -#include "base/deprecated.h"
>  #include "base/log.h"
>  #include "graphic/font.h"
>  #include "graphic/font_handler.h"
> 
> === modified file 'src/ui_basic/progresswindow.cc'
> --- src/ui_basic/progresswindow.cc	2014-10-14 06:30:20 +0000
> +++ src/ui_basic/progresswindow.cc	2014-11-29 08:14:12 +0000
> @@ -23,7 +23,6 @@
>  #include <sys/time.h>
>  #endif
>  
> -#include "base/deprecated.h"
>  #include "base/i18n.h"
>  #include "graphic/font.h"
>  #include "graphic/font_handler.h"
> 
> === modified file 'src/ui_basic/spinbox.cc'
> --- src/ui_basic/spinbox.cc	2014-09-30 05:41:55 +0000
> +++ src/ui_basic/spinbox.cc	2014-11-29 08:14:12 +0000
> @@ -23,7 +23,6 @@
>  
>  #include <boost/format.hpp>
>  
> -#include "base/deprecated.h"
>  #include "base/i18n.h"
>  #include "base/wexception.h"
>  #include "ui_basic/button.h"
> 
> === modified file 'src/ui_basic/table.cc'
> --- src/ui_basic/table.cc	2014-11-22 10:18:20 +0000
> +++ src/ui_basic/table.cc	2014-11-29 08:14:12 +0000
> @@ -21,7 +21,6 @@
>  
>  #include <boost/bind.hpp>
>  
> -#include "base/deprecated.h"
>  #include "graphic/font.h"
>  #include "graphic/font_handler.h"
>  #include "graphic/font_handler1.h"
> 
> === modified file 'src/wui/CMakeLists.txt'
> --- src/wui/CMakeLists.txt	2014-10-13 15:04:50 +0000
> +++ src/wui/CMakeLists.txt	2014-11-29 08:14:12 +0000
> @@ -129,7 +129,6 @@
>      watchwindow.h
>    USES_SDL2
>    DEPENDS
> -    base_deprecated
>      base_exceptions
>      base_geometry
>      base_i18n
> 
> === modified file 'src/wui/actionconfirm.cc'
> --- src/wui/actionconfirm.cc	2014-11-13 08:25:45 +0000
> +++ src/wui/actionconfirm.cc	2014-11-29 08:14:12 +0000
> @@ -46,7 +46,8 @@
>  		 Widelands::Ship & ship);
>  
>  	InteractivePlayer & iaplayer() const {
> -		return ref_cast<InteractivePlayer, UI::Panel>(*get_parent());
> +		upcast(InteractivePlayer, result, get_parent());
> +		return *result;
>  	}
>  
>  	virtual void think() = 0;
> 
> === modified file 'src/wui/building_statistics_menu.cc'
> --- src/wui/building_statistics_menu.cc	2014-10-28 14:57:52 +0000
> +++ src/wui/building_statistics_menu.cc	2014-11-29 08:14:12 +0000
> @@ -65,7 +65,8 @@
>  namespace Columns {enum {Name, Size, Prod, Owned, Build};}
>  
>  inline InteractivePlayer & BuildingStatisticsMenu::iplayer() const {
> -	return ref_cast<InteractivePlayer, UI::Panel>(*get_parent());
> +	upcast(InteractivePlayer, result, get_parent());
> +	return *result;
>  }
>  
>  BuildingStatisticsMenu::BuildingStatisticsMenu
> @@ -418,11 +419,10 @@
>  				++nr_build;
>  			else {
>  				++nr_owned;
> -				if (productionsite)
> -					total_prod +=
> -						ref_cast<Widelands::ProductionSite, Widelands::BaseImmovable>
> -							(*map[vec[l].pos].get_immovable())
> -						.get_statistics_percent();
> +				if (productionsite) {
> +					upcast(Widelands::ProductionSite, psite, map[vec[l].pos].get_immovable());
> +					total_prod += psite->get_statistics_percent();
> +				}
>  			}
>  		}
>  
> 
> === modified file 'src/wui/buildingwindow.cc'
> --- src/wui/buildingwindow.cc	2014-11-24 07:25:21 +0000
> +++ src/wui/buildingwindow.cc	2014-11-29 08:14:12 +0000
> @@ -378,7 +378,8 @@
>  			igbase().game().send_player_bulldoze(m_building);
>  	}
>  	else {
> -		show_bulldoze_confirm(ref_cast<InteractivePlayer, InteractiveGameBase>(igbase()), m_building);
> +		upcast(InteractivePlayer, iaplayer, &igbase());
> +		show_bulldoze_confirm(*iaplayer, m_building);
>  	}
>  }
>  
> @@ -394,7 +395,8 @@
>  			igbase().game().send_player_dismantle(m_building);
>  	}
>  	else {
> -		show_dismantle_confirm(ref_cast<InteractivePlayer, InteractiveGameBase>(igbase()), m_building);
> +		upcast(InteractivePlayer, iaplayer, &igbase());
> +		show_dismantle_confirm(*iaplayer, m_building);
>  	}
>  }
>  
> @@ -437,10 +439,8 @@
>  			igbase().game().send_player_enhance_building(m_building, id);
>  	}
>  	else {
> -		show_enhance_confirm
> -			(ref_cast<InteractivePlayer, InteractiveGameBase>(igbase()),
> -			 m_building,
> -			 id);
> +		upcast(InteractivePlayer, iaplayer, &igbase());
> +		show_enhance_confirm(*iaplayer, m_building, id);
>  	}
>  }
>  
> 
> === modified file 'src/wui/buildingwindow.h'
> --- src/wui/buildingwindow.h	2014-09-10 14:48:40 +0000
> +++ src/wui/buildingwindow.h	2014-11-29 08:14:12 +0000
> @@ -47,7 +47,8 @@
>  	Widelands::Building & building() {return m_building;}
>  
>  	InteractiveGameBase & igbase() const {
> -		return ref_cast<InteractiveGameBase, UI::Panel>(*get_parent());
> +		upcast(InteractiveGameBase, result, get_parent());
> +		return *result;
>  	}
>  
>  	void draw(RenderTarget &) override;
> 
> === modified file 'src/wui/constructionsitewindow.cc'
> --- src/wui/constructionsitewindow.cc	2014-09-10 14:48:40 +0000
> +++ src/wui/constructionsitewindow.cc	2014-11-29 08:14:12 +0000
> @@ -84,11 +84,8 @@
>  void ConstructionSiteWindow::think()
>  {
>  	BuildingWindow::think();
> -
> -	const Widelands::ConstructionSite & cs =
> -		ref_cast<Widelands::ConstructionSite, Widelands::Building>(building());
> -
> -	m_progress->set_state(cs.get_built_per64k());
> +	upcast(Widelands::ConstructionSite, cs, &building());
> +	m_progress->set_state(cs->get_built_per64k());
>  }
>  
>  
> 
> === modified file 'src/wui/dismantlesitewindow.cc'
> --- src/wui/dismantlesitewindow.cc	2014-09-10 14:48:40 +0000
> +++ src/wui/dismantlesitewindow.cc	2014-11-29 08:14:12 +0000
> @@ -78,11 +78,8 @@
>  void DismantleSiteWindow::think()
>  {
>  	BuildingWindow::think();
> -
> -	const Widelands::DismantleSite & ds =
> -		ref_cast<Widelands::DismantleSite, Widelands::Building>(building());
> -
> -	m_progress->set_state(ds.get_built_per64k());
> +	upcast(Widelands::DismantleSite, ds, &building());
> +	m_progress->set_state(ds->get_built_per64k());
>  }
>  
>  
> 
> === modified file 'src/wui/encyclopedia_window.cc'
> --- src/wui/encyclopedia_window.cc	2014-10-28 14:57:52 +0000
> +++ src/wui/encyclopedia_window.cc	2014-11-29 08:14:12 +0000
> @@ -51,7 +51,8 @@
>  using namespace Widelands;
>  
>  inline InteractivePlayer & EncyclopediaWindow::iaplayer() const {
> -	return ref_cast<InteractivePlayer, UI::Panel>(*get_parent());
> +	upcast(InteractivePlayer, result, get_parent());
> +	return *result;
>  }
>  
>  
> @@ -141,10 +142,8 @@
>  	condTable.clear();
>  	const TribeDescr & tribe = iaplayer().player().tribe();
>  
> -	const ProductionSiteDescr::Programs & programs =
> -		ref_cast<ProductionSiteDescr const, BuildingDescr const>
> -			(*tribe.get_building_descr(prodSites.get_selected()))
> -		.programs();
> +	upcast(ProductionSiteDescr const, descr, tribe.get_building_descr(prodSites.get_selected()));
> +	const ProductionSiteDescr::Programs & programs = descr->programs();
>  
>  	//  TODO(unknown): This needs reworking. A program can indeed produce iron even if
>  	//  the program name is not any of produce_iron, smelt_iron, prog_iron
> 
> === modified file 'src/wui/fieldaction.cc'
> --- src/wui/fieldaction.cc	2014-11-13 08:25:45 +0000
> +++ src/wui/fieldaction.cc	2014-11-29 08:14:12 +0000
> @@ -177,7 +177,8 @@
>  	~FieldActionWindow();
>  
>  	InteractiveBase & ibase() {
> -		return ref_cast<InteractiveBase, UI::Panel>(*get_parent());
> +		upcast(InteractiveBase, result, get_parent());
> +		return *result;
>  	}
>  
>  	void think() override;
> @@ -656,8 +657,8 @@
>  */
>  void FieldActionWindow::act_watch()
>  {
> -	show_watch_window
> -		(ref_cast<InteractiveGameBase, InteractiveBase>(ibase()), m_node);
> +	upcast(InteractiveGameBase, igbase, &ibase());
> +	show_watch_window(*igbase, m_node);
>  	okdialog();
>  }
>  
> @@ -710,9 +711,10 @@
>  
>  	if (ibase().is_building_road())
>  		ibase().finish_build_road();
> -	else if (game)
> -		ref_cast<InteractivePlayer, InteractiveBase>(ibase())
> -			.set_flag_to_connect(m_node);
> +	else if (game) {
> +		upcast(InteractivePlayer, iaplayer, &ibase());
> +		iaplayer->set_flag_to_connect(m_node);
> +	}
>  
>  	okdialog();
>  }
> @@ -734,22 +736,22 @@
>  {
>  	okdialog();
>  	Widelands::EditorGameBase & egbase = ibase().egbase();
> +	upcast(Game, game, &egbase);
> +	upcast(InteractivePlayer, iaplayer, &ibase());
> +
>  	if (upcast(Widelands::Flag, flag, m_node.field->get_immovable())) {
>  		if (Building * const building = flag->get_building()) {
>  			if (building->get_playercaps() & Building::PCap_Bulldoze) {
>  				if (get_key_state(SDL_SCANCODE_LCTRL) || get_key_state(SDL_SCANCODE_RCTRL)) {
> -					ref_cast<Game, EditorGameBase>(egbase).send_player_bulldoze
> +					game->send_player_bulldoze
>  						(*flag, get_key_state(SDL_SCANCODE_LCTRL) || get_key_state(SDL_SCANCODE_RCTRL));
>  				}
>  				else {
> -					show_bulldoze_confirm
> -						(ref_cast<InteractivePlayer, InteractiveBase>(ibase()),
> -						 *building,
> -						 flag);
> +					show_bulldoze_confirm(*iaplayer, *building, flag);
>  				}
>  			}
>  		} else {
> -			ref_cast<Game, EditorGameBase>(egbase).send_player_bulldoze
> +			game->send_player_bulldoze
>  					(*flag, get_key_state(SDL_SCANCODE_LCTRL) || get_key_state(SDL_SCANCODE_RCTRL));
>  		}
>  	}
> @@ -792,9 +794,11 @@
>  void FieldActionWindow::act_removeroad()
>  {
>  	Widelands::EditorGameBase & egbase = ibase().egbase();
> -	if (upcast(Widelands::Road, road, egbase.map().get_immovable(m_node)))
> -		ref_cast<Game, EditorGameBase>(egbase).send_player_bulldoze
> +	if (upcast(Widelands::Road, road, egbase.map().get_immovable(m_node))) {
> +		upcast(Game, game, &ibase().egbase());
> +		game->send_player_bulldoze
>  			(*road, get_key_state(SDL_SCANCODE_LCTRL) || get_key_state(SDL_SCANCODE_RCTRL));
> +	}
>  	okdialog();
>  }
>  
> @@ -806,15 +810,12 @@
>  */
>  void FieldActionWindow::act_build(Widelands::BuildingIndex idx)
>  {
> -	Widelands::Game & game = ref_cast<Game, EditorGameBase>(ibase().egbase());
> -	game.send_player_build
> -		(ref_cast<InteractivePlayer, InteractiveBase>(ibase()).player_number(),
> -		 m_node,
> -		 Widelands::BuildingIndex(idx));
> -	ibase().reference_player_tribe
> -		(m_plr->player_number(), &m_plr->tribe());
> -	ref_cast<InteractivePlayer, InteractiveBase>(ibase()).set_flag_to_connect
> -		(game.map().br_n(m_node));
> +	upcast(Game, game, &ibase().egbase());
> +	upcast(InteractivePlayer, iaplayer, &ibase());
> +
> +	game->send_player_build(iaplayer->player_number(), m_node, Widelands::BuildingIndex(idx));
> +	ibase().reference_player_tribe(m_plr->player_number(), &m_plr->tribe());
> +	iaplayer->set_flag_to_connect(game->map().br_n(m_node));
>  	okdialog();
>  }
>  
> @@ -848,10 +849,10 @@
>  */
>  void FieldActionWindow::act_geologist()
>  {
> -	Game & game = ref_cast<Game, EditorGameBase>(ibase().egbase());
> -	if (upcast(Widelands::Flag, flag, game.map().get_immovable(m_node)))
> -		game.send_player_flagaction (*flag);
> -
> +	upcast(Game, game, &ibase().egbase());
> +	if (upcast(Widelands::Flag, flag, game->map().get_immovable(m_node))) {
> +		game->send_player_flagaction (*flag);
> +	}
>  	okdialog();
>  }
>  
> @@ -863,15 +864,16 @@
>   */
>  void FieldActionWindow::act_attack ()
>  {
> -	Game & game = ref_cast<Game, EditorGameBase>(ibase().egbase());
> -
>  	assert(m_attack_box);
> -	if (upcast(Building, building, game.map().get_immovable(m_node)))
> -		if (m_attack_box->soldiers() > 0)
> -			game.send_player_enemyflagaction(
> +	upcast(Game, game, &ibase().egbase());
> +	if (upcast(Building, building, game->map().get_immovable(m_node)))
> +		if (m_attack_box->soldiers() > 0) {
> +			upcast(InteractivePlayer const, iaplayer, &ibase());
> +			game->send_player_enemyflagaction(
>  			   building->base_flag(),
> -			   ref_cast<const InteractivePlayer, const InteractiveBase>(ibase()).player_number(),
> +				iaplayer->player_number(),
>  			   m_attack_box->soldiers() /*  number of soldiers */);
> +		}
>  	okdialog();
>  }
>  
> @@ -933,8 +935,8 @@
>  			finish = true;
>  		else if (dynamic_cast<const Widelands::Road *>(i))
>  			if (player->get_buildcaps(target) & Widelands::BUILDCAPS_FLAG) {
> -				ref_cast<Game, EditorGameBase>(player->egbase())
> -					.send_player_build_flag(player->player_number(), target);
> +				upcast(Game, game, &player->egbase());
> +				game->send_player_build_flag(player->player_number(), target);
>  				finish = true;
>  			}
>  		if (finish)
> 
> === modified file 'src/wui/game_debug_ui.cc'
> --- src/wui/game_debug_ui.cc	2014-10-27 10:14:10 +0000
> +++ src/wui/game_debug_ui.cc	2014-11-29 08:14:12 +0000
> @@ -133,7 +133,8 @@
>  	MapObjectDebugWindow(InteractiveBase & parent, Widelands::MapObject &);
>  
>  	InteractiveBase & ibase() {
> -		return ref_cast<InteractiveBase, UI::Panel>(*get_parent());
> +		upcast(InteractiveBase, result, get_parent());
> +		return *result;
>  	}
>  
>  	void think() override;
> @@ -212,7 +213,8 @@
>  	FieldDebugWindow(InteractiveBase & parent, Widelands::Coords);
>  
>  	InteractiveBase & ibase() {
> -		return ref_cast<InteractiveBase, UI::Panel>(*get_parent());
> +		upcast(InteractiveBase, result, get_parent());
> +		return *result;
>  	}
>  
>  	void think() override;
> @@ -273,9 +275,7 @@
>  	UI::Window::think();
>  
>  	// Select information about the field itself
> -	const Widelands::EditorGameBase & egbase =
> -		ref_cast<InteractiveBase const, UI::Panel const>(*get_parent())
> -		.egbase();
> +	const Widelands::EditorGameBase & egbase = ibase().egbase();
>  	{
>  		Widelands::PlayerNumber const owner = m_coords.field->get_owned_by();
>  		str += (boost::format("(%i, %i)\nheight: %u\nowner: %u\n")
> 
> === modified file 'src/wui/game_main_menu_save_game.cc'
> --- src/wui/game_main_menu_save_game.cc	2014-10-27 10:31:04 +0000
> +++ src/wui/game_main_menu_save_game.cc	2014-11-29 08:14:12 +0000
> @@ -35,7 +35,8 @@
>  #include "wui/interactive_gamebase.h"
>  
>  InteractiveGameBase & GameMainMenuSaveGame::igbase() {
> -	return ref_cast<InteractiveGameBase, UI::Panel>(*get_parent());
> +	upcast(InteractiveGameBase, result, get_parent());
> +	return *result;
>  }
>  
>  #define WINDOW_WIDTH                                                        440
> @@ -262,7 +263,8 @@
>  	{}
>  
>  	GameMainMenuSaveGame & menu_save_game() {
> -		return ref_cast<GameMainMenuSaveGame, UI::Panel>(*get_parent());
> +		upcast(GameMainMenuSaveGame, result, get_parent());
> +		return *result;
>  	}
>  
>  
> @@ -328,7 +330,8 @@
>  	void pressed_yes() override
>  	{
>  		g_fs->fs_unlink(m_filename);
> -		ref_cast<GameMainMenuSaveGame, UI::Panel>(*get_parent()).fill_list();
> +		upcast(GameMainMenuSaveGame, panel, get_parent());
> +		panel->fill_list();
>  		die();
>  	}
>  
> 
> === modified file 'src/wui/game_main_menu_save_game.h'
> --- src/wui/game_main_menu_save_game.h	2014-09-10 13:03:40 +0000
> +++ src/wui/game_main_menu_save_game.h	2014-11-29 08:14:12 +0000
> @@ -20,7 +20,6 @@
>  #ifndef WL_WUI_GAME_MAIN_MENU_SAVE_GAME_H
>  #define WL_WUI_GAME_MAIN_MENU_SAVE_GAME_H
>  
> -#include "base/deprecated.h"
>  #include "base/i18n.h"
>  #include "ui_basic/button.h"
>  #include "ui_basic/editbox.h"
> 
> === modified file 'src/wui/game_message_menu.cc'
> --- src/wui/game_message_menu.cc	2014-11-22 10:18:20 +0000
> +++ src/wui/game_message_menu.cc	2014-11-29 08:14:12 +0000
> @@ -21,7 +21,7 @@
>  
>  #include <boost/bind.hpp>
>  
> -#include "base/deprecated.h"
> +#include "base/macros.h"
>  #include "base/time_string.h"
>  #include "graphic/graphic.h"
>  #include "logic/instances.h"
> @@ -35,7 +35,8 @@
>  using Widelands::MessageQueue;
>  
>  inline InteractivePlayer & GameMessageMenu::iplayer() const {
> -	return ref_cast<InteractivePlayer, UI::Panel>(*get_parent());
> +	upcast(InteractivePlayer, result, get_parent());
> +	return *result;
>  }
>  
>  
> 
> === modified file 'src/wui/game_message_menu.h'
> --- src/wui/game_message_menu.h	2014-10-14 06:30:20 +0000
> +++ src/wui/game_message_menu.h	2014-11-29 08:14:12 +0000
> @@ -20,7 +20,6 @@
>  #ifndef WL_WUI_GAME_MESSAGE_MENU_H
>  #define WL_WUI_GAME_MESSAGE_MENU_H
>  
> -#include "base/deprecated.h"
>  #include "base/i18n.h"
>  #include "logic/message_queue.h"
>  #include "ui_basic/button.h"
> 
> === modified file 'src/wui/game_objectives_menu.cc'
> --- src/wui/game_objectives_menu.cc	2014-10-27 10:31:04 +0000
> +++ src/wui/game_objectives_menu.cc	2014-11-29 08:14:12 +0000
> @@ -31,7 +31,8 @@
>  
>  
>  inline InteractivePlayer & GameObjectivesMenu::iplayer() const {
> -	return ref_cast<InteractivePlayer, UI::Panel>(*get_parent());
> +	upcast(InteractivePlayer, result, get_parent());
> +	return *result;
>  }
>  
>  
> 
> === modified file 'src/wui/general_statistics_menu.cc'
> --- src/wui/general_statistics_menu.cc	2014-11-22 11:32:06 +0000
> +++ src/wui/general_statistics_menu.cc	2014-11-29 08:14:12 +0000
> @@ -284,7 +284,8 @@
>  }
>  
>  GeneralStatisticsMenu::~GeneralStatisticsMenu() {
> -	Game & game = ref_cast<InteractiveGameBase, UI::Panel>(*get_parent()).game();
> +	upcast(InteractiveGameBase, igbase, get_parent());
> +	Game & game = igbase->game();
>  	if (game.is_loaded()) {
>  		// Save informations for recreation, if window is reopened
>  		m_my_registry->selected_information = m_selected_information;
> @@ -320,9 +321,8 @@
>   * The radiogroup has changed
>   */
>  void GeneralStatisticsMenu::radiogroup_changed(int32_t const id) {
> -	size_t const statistics_size =
> -		ref_cast<InteractiveGameBase, UI::Panel>(*get_parent()).game()
> -		.get_general_statistics().size();
> +	upcast(InteractiveGameBase, igbase, get_parent());
> +	size_t const statistics_size = igbase->game().get_general_statistics().size();
>  	for (uint32_t i = 0; i < statistics_size; ++i)
>  		if (m_cbs[i]) {
>  			m_plot.show_plot
> 
> === modified file 'src/wui/interactive_base.cc'
> --- src/wui/interactive_base.cc	2014-11-27 11:15:34 +0000
> +++ src/wui/interactive_base.cc	2014-11-29 08:14:12 +0000
> @@ -446,7 +446,8 @@
>  			((fps_format %
>  			  (1000.0 / m_frametime) % (1000.0 / (m_avg_usframetime / 1000)))
>  			 .str(), UI_FONT_SIZE_SMALL);
> -		dst.blit(Point(5, (is_game) ? 25 : 5), UI::g_fh1->render(fps_text), BlendMode::UseAlpha, UI::Align_Left);
> +		dst.blit(Point(5, (is_game) ? 25 : 5),
> +					UI::g_fh1->render(fps_text), BlendMode::UseAlpha, UI::Align_Left);
>  	}
>  }
>  
> 
> === modified file 'src/wui/interactive_gamebase.cc'
> --- src/wui/interactive_gamebase.cc	2014-09-20 09:37:47 +0000
> +++ src/wui/interactive_gamebase.cc	2014-11-29 08:14:12 +0000
> @@ -53,7 +53,8 @@
>  
>  Widelands::Game & InteractiveGameBase::    game() const
>  {
> -	return ref_cast<Widelands::Game, Widelands::EditorGameBase>(egbase());
> +	upcast(Widelands::Game, result, &egbase());
> +	return *result;
>  }
>  
>  void InteractiveGameBase::set_chat_provider(ChatProvider & chat)
> 
> === modified file 'src/wui/interactive_player.cc'
> --- src/wui/interactive_player.cc	2014-11-23 14:34:38 +0000
> +++ src/wui/interactive_player.cc	2014-11-29 08:14:12 +0000
> @@ -304,8 +304,8 @@
>  	(Widelands::MessageId const id, const Widelands::Message & message)
>  {
>  	m_message_menu.create();
> -	ref_cast<GameMessageMenu, UI::UniqueWindow>(*m_message_menu.window)
> -	.show_new_message(id, message);
> +	upcast(GameMessageMenu, menu, m_message_menu.window);
> +	menu->show_new_message(id, message);
>  }
>  
>  
> @@ -470,10 +470,9 @@
>  		for (uint16_t x = 0; x < extent.w; ++x)
>  			overlay_manager.recalc_field_overlays
>  				(map.get_fcoords(Widelands::Coords(x, y)));
> -	if
> -		(UI::UniqueWindow * const building_statistics_window =
> -		 	m_mainm_windows.building_stats.window)
> -		ref_cast<BuildingStatisticsMenu, UI::UniqueWindow>
> -			(*building_statistics_window)
> -			.update();
> +	if (UI::UniqueWindow * const building_statistics_window =
> +		 m_mainm_windows.building_stats.window) {
> +		upcast(BuildingStatisticsMenu, menu, building_statistics_window);
> +		menu->update();
> +	}
>  }
> 
> === modified file 'src/wui/interactive_spectator.cc'
> --- src/wui/interactive_spectator.cc	2014-11-23 14:34:38 +0000
> +++ src/wui/interactive_spectator.cc	2014-11-29 08:14:12 +0000
> @@ -275,8 +275,8 @@
>  			if (!m_chat.window)
>  				GameChatMenu::create_chat_console(this, m_chat, *m_chatProvider);
>  
> -			ref_cast<GameChatMenu, UI::UniqueWindow>(*m_chat.window)
> -				.enter_chat_message();
> +			// NOCOM(#gunchleoc): Compiler did not like upcast. Is dynamic_cast OK?

Yes, I think it is preferable in all places where you are sure about what you are casting into. dynamic_cast is a code smell in the same sense that typeid is - it shows that your design is not quite right if you have to switch on types at runtime. But this is only about getting rid of our own invented stuff.

> +			dynamic_cast<GameChatMenu*>(m_chat.window)->enter_chat_message();
>  			return true;
>  
>  		default:
> 
> === modified file 'src/wui/militarysitewindow.cc'
> --- src/wui/militarysitewindow.cc	2014-09-10 13:03:40 +0000
> +++ src/wui/militarysitewindow.cc	2014-11-29 08:14:12 +0000
> @@ -38,7 +38,8 @@
>  		 UI::Window *       & registry);
>  
>  	MilitarySite & militarysite() {
> -		return ref_cast<MilitarySite, Widelands::Building>(building());
> +		upcast(MilitarySite, result, &building());
> +		return *result;
>  	}
>  
>  protected:
> 
> === modified file 'src/wui/minimap.cc'
> --- src/wui/minimap.cc	2014-11-24 07:10:03 +0000
> +++ src/wui/minimap.cc	2014-11-29 08:14:12 +0000
> @@ -98,7 +98,8 @@
>  
>  	m_ibase.egbase().map().normalize_coords(c);
>  
> -	ref_cast<MiniMap, UI::Panel>(*get_parent()).warpview(c.x * TRIANGLE_WIDTH, c.y * TRIANGLE_HEIGHT);
> +	upcast(MiniMap, minimap, get_parent());
> +	minimap->warpview(c.x * TRIANGLE_WIDTH, c.y * TRIANGLE_HEIGHT);
>  
>  	return true;
>  }
> 
> === modified file 'src/wui/productionsitewindow.h'
> --- src/wui/productionsitewindow.h	2014-09-10 13:03:40 +0000
> +++ src/wui/productionsitewindow.h	2014-11-29 08:14:12 +0000
> @@ -31,7 +31,8 @@
>  		 UI::Window *         & registry);
>  
>  	Widelands::ProductionSite & productionsite() {
> -		return ref_cast<Widelands::ProductionSite, Widelands::Building>(building());
> +		upcast(Widelands::ProductionSite, result, &building());
> +		return *result;
>  	}
>  	void update_worker_table();
>  protected:
> 
> === modified file 'src/wui/shipwindow.cc'
> --- src/wui/shipwindow.cc	2014-11-22 10:18:20 +0000
> +++ src/wui/shipwindow.cc	2014-11-29 08:14:12 +0000
> @@ -295,7 +295,8 @@
>  		m_igbase.game().send_player_sink_ship(m_ship);
>  	}
>  	else {
> -		show_ship_sink_confirm(ref_cast<InteractivePlayer, InteractiveGameBase>(m_igbase), m_ship);
> +		upcast(InteractivePlayer, iaplayer, &m_igbase);
> +		show_ship_sink_confirm(*iaplayer, m_ship);
>  	}
>  }
>  
> @@ -306,8 +307,8 @@
>  		m_igbase.game().send_player_cancel_expedition_ship(m_ship);
>  	}
>  	else {
> -		show_ship_cancel_expedition_confirm
> -			(ref_cast<InteractivePlayer, InteractiveGameBase>(m_igbase), m_ship);
> +		upcast(InteractivePlayer, iaplayer, &m_igbase);
> +		show_ship_cancel_expedition_confirm(*iaplayer, m_ship);
>  	}
>  }
>  
> 
> === modified file 'src/wui/soldierlist.cc'
> --- src/wui/soldierlist.cc	2014-11-22 10:18:20 +0000
> +++ src/wui/soldierlist.cc	2014-11-29 08:14:12 +0000
> @@ -22,7 +22,6 @@
>  #include <boost/bind.hpp>
>  #include <boost/format.hpp>
>  
> -#include "base/deprecated.h"
>  #include "base/macros.h"
>  #include "graphic/font.h"
>  #include "graphic/graphic.h"
> 
> === modified file 'src/wui/trainingsitewindow.cc'
> --- src/wui/trainingsitewindow.cc	2014-09-10 13:03:40 +0000
> +++ src/wui/trainingsitewindow.cc	2014-11-29 08:14:12 +0000
> @@ -37,7 +37,8 @@
>  		(InteractiveGameBase & parent, TrainingSite &, UI::Window * & registry);
>  
>  	TrainingSite & trainingsite() {
> -		return ref_cast<TrainingSite, Widelands::Building>(building());
> +		upcast(TrainingSite, result, &building());
> +		return *result;
>  	}
>  
>  protected:
> 
> === modified file 'src/wui/transport_ui.cc'
> --- src/wui/transport_ui.cc	2014-11-22 11:32:06 +0000
> +++ src/wui/transport_ui.cc	2014-11-29 08:14:12 +0000
> @@ -159,10 +159,10 @@
>  						m_economy.ware_target_quantity(id);
>  					if (1 < tq.permanent) {
>  						Widelands::Player & player = m_economy.owner();
> -						Game & game = ref_cast<Game, EditorGameBase>(player.egbase());
> -						game.send_player_command
> +						upcast(Game, game, &player.egbase());
> +						game->send_player_command
>  							(*new Widelands::CmdSetWareTargetQuantity
> -								(game.get_gametime(), player.player_number(),
> +								(game->get_gametime(), player.player_number(),
>  								 player.get_economy_number(&m_economy), id,
>  								 tq.permanent - 1));
>  					}
> @@ -181,10 +181,10 @@
>  					const Economy::TargetQuantity & tq =
>  						m_economy.ware_target_quantity(id);
>  					Widelands::Player & player = m_economy.owner();
> -					Game & game = ref_cast<Game, EditorGameBase>(player.egbase());
> -					game.send_player_command
> +					upcast(Game, game, &player.egbase());
> +					game->send_player_command
>  						(*new Widelands::CmdSetWareTargetQuantity
> -							(game.get_gametime(), player.player_number(),
> +							(game->get_gametime(), player.player_number(),
>  							 player.get_economy_number(&m_economy), id,
>  							 tq.permanent + 1));
>  				}
> @@ -200,10 +200,10 @@
>  			{
>  				if (m_display.ware_selected(id)) {
>  					Widelands::Player & player = m_economy.owner();
> -					Game & game = ref_cast<Game, EditorGameBase>(player.egbase());
> -					game.send_player_command
> +					upcast(Game, game, &player.egbase());
> +					game->send_player_command
>  						(*new Widelands::CmdResetWareTargetQuantity
> -							(game.get_gametime(), player.player_number(),
> +							(game->get_gametime(), player.player_number(),
>  							 player.get_economy_number(&m_economy), id));
>  				}
>  			}
> @@ -256,10 +256,10 @@
>  						m_economy.worker_target_quantity(id);
>  					if (1 < tq.permanent) {
>  						Widelands::Player & player = m_economy.owner();
> -						Game & game = ref_cast<Game, EditorGameBase>(player.egbase());
> -						game.send_player_command
> +						upcast(Game, game, &player.egbase());
> +						game->send_player_command
>  							(*new Widelands::CmdSetWorkerTargetQuantity
> -								(game.get_gametime(), player.player_number(),
> +								(game->get_gametime(), player.player_number(),
>  								 player.get_economy_number(&m_economy), id,
>  								 tq.permanent - 1));
>  					}
> @@ -278,10 +278,10 @@
>  					const Economy::TargetQuantity & tq =
>  						m_economy.worker_target_quantity(id);
>  					Widelands::Player & player = m_economy.owner();
> -					Game & game = ref_cast<Game, EditorGameBase>(player.egbase());
> -					game.send_player_command
> +					upcast(Game, game, &player.egbase());
> +					game->send_player_command
>  						(*new Widelands::CmdSetWorkerTargetQuantity
> -							(game.get_gametime(), player.player_number(),
> +							(game->get_gametime(), player.player_number(),
>  							 player.get_economy_number(&m_economy), id,
>  							 tq.permanent + 1));
>  				}
> @@ -296,10 +296,10 @@
>  			{
>  				if (m_display.ware_selected(id)) {
>  					Widelands::Player & player = m_economy.owner();
> -					Game & game = ref_cast<Game, EditorGameBase>(player.egbase());
> -					game.send_player_command
> +					upcast(Game, game, &player.egbase());
> +					game->send_player_command
>  						(*new Widelands::CmdResetWorkerTargetQuantity
> -							(game.get_gametime(), player.player_number(),
> +							(game->get_gametime(), player.player_number(),
>  							 player.get_economy_number(&m_economy), id));
>  				}
>  			}
> @@ -313,11 +313,10 @@
>  // users can register for change updates. The registry should be
>  // moved to InteractivePlayer or some other UI component.
>  void Economy::show_options_window() {
> -	if (m_optionswindow_registry.window)
> +	if (m_optionswindow_registry.window) {
>  		m_optionswindow_registry.window->move_to_top();
> -	else
> -		new EconomyOptionsWindow
> -			(ref_cast<InteractiveGameBase, InteractiveBase>
> -			 	(*owner().egbase().get_ibase()),
> -			 *this);
> +	} else {
> +		upcast(InteractiveGameBase, igbase, owner().egbase().get_ibase());
> +		new EconomyOptionsWindow(*igbase, *this);
> +	}
>  }
> 
> === modified file 'src/wui/warehousewindow.cc'
> --- src/wui/warehousewindow.cc	2014-09-10 13:03:40 +0000
> +++ src/wui/warehousewindow.cc	2014-11-29 08:14:12 +0000
> @@ -176,7 +176,8 @@
>  		(InteractiveGameBase & parent, Warehouse &, UI::Window * & registry);
>  
>  	Warehouse & warehouse() {
> -		return ref_cast<Warehouse, Widelands::Building>(building());
> +		upcast(Warehouse, result, &building());
> +		return *result;
>  	}
>  };
>  
> 
> === modified file 'src/wui/watchwindow.cc'
> --- src/wui/watchwindow.cc	2014-11-22 11:32:06 +0000
> +++ src/wui/watchwindow.cc	2014-11-29 08:14:12 +0000
> @@ -56,7 +56,8 @@
>  	~WatchWindow();
>  
>  	Widelands::Game & game() const {
> -		return ref_cast<InteractiveGameBase, UI::Panel>(*get_parent()).game();
> +		upcast(InteractiveGameBase, igbase, get_parent());
> +		return igbase->game();
>  	}
>  
>  	boost::signals2::signal<void (Point)> warp_mainview;
> 


-- 
https://code.launchpad.net/~widelands-dev/widelands/delete_deprecated/+merge/243174
Your team Widelands Developers is subscribed to branch lp:~widelands-dev/widelands/delete_deprecated.


References