1 /*
2    Copyright (C) 2017-2018 the Battle for Wesnoth Project https://www.wesnoth.org/
3 
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2 of the License, or
7    (at your option) any later version.
8    This program is distributed in the hope that it will be useful,
9    but WITHOUT ANY WARRANTY.
10 
11    See the COPYING file for more details.
12 */
13 
14 #include "actions/undo_recruit_action.hpp"
15 #include "actions/create.hpp"
16 
17 #include "gui/dialogs/transient_message.hpp"
18 #include "game_board.hpp"
19 #include "resources.hpp"
20 #include "team.hpp"
21 #include "replay.hpp"
22 #include "units/map.hpp"
23 #include "units/unit.hpp"
24 #include "statistics.hpp"
25 #include "log.hpp"
26 #include "game_display.hpp"
27 
28 static lg::log_domain log_engine("engine");
29 #define ERR_NG LOG_STREAM(err, log_engine)
30 #define LOG_NG LOG_STREAM(info, log_engine)
31 
32 namespace actions
33 {
34 namespace undo
35 {
36 
recruit_action(const unit_const_ptr recruited,const map_location & loc,const map_location & from,int orig_village_owner,bool time_bonus)37 recruit_action::recruit_action(const unit_const_ptr recruited, const map_location& loc,
38 			   const map_location& from, int orig_village_owner, bool time_bonus)
39 	: undo_action()
40 	, shroud_clearing_action(recruited, loc, orig_village_owner, time_bonus)
41 	, u_type(recruited->type())
42 	, recruit_from(from)
43 {}
44 
recruit_action(const config & cfg,const unit_type & type,const map_location & from)45 recruit_action::recruit_action(const config & cfg, const unit_type & type, const map_location& from)
46 	: undo_action(cfg)
47 	, shroud_clearing_action(cfg)
48 	, u_type(type)
49 	, recruit_from(from)
50 {}
51 
52 /**
53  * Writes this into the provided config.
54  */
write(config & cfg) const55 void recruit_action::write(config & cfg) const
56 {
57 	undo_action::write(cfg);
58 	shroud_clearing_action::write(cfg);
59 
60 	recruit_from.write(cfg.add_child("leader"));
61 	config & child = cfg.child("unit");
62 	child["type"] = u_type.base_id();
63 }
64 
65 /**
66  * Undoes this action.
67  * @return true on success; false on an error.
68  */
undo(int side)69 bool recruit_action::undo(int side)
70 {
71 	game_display & gui = *game_display::get_singleton();
72 	unit_map &   units = resources::gameboard->units();
73 	team &current_team = resources::gameboard->get_team(side);
74 
75 	const map_location & recruit_loc = route.front();
76 	unit_map::iterator un_it = units.find(recruit_loc);
77 	if ( un_it == units.end() ) {
78 		return false;
79 	}
80 
81 	const unit &un = *un_it;
82 	statistics::un_recruit_unit(un);
83 	current_team.spend_gold(-un.type().cost());
84 
85 	//MP_COUNTDOWN take away recruit bonus
86 	current_team.set_action_bonus_count(current_team.action_bonus_count() - 1);
87 
88 	// invalidate before erasing allow us
89 	// to also do the overlapped hexes
90 	gui.invalidate(recruit_loc);
91 	units.erase(recruit_loc);
92 	this->return_village();
93 	execute_undo_umc_wml();
94 	return true;
95 }
96 
97 }
98 }
99