1 /* 2 Copyright (C) 2016 - 2018 by 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 /** 15 * @file 16 * Various functions that implement advancements of units. 17 */ 18 19 #pragma once 20 21 struct map_location; 22 class team; 23 class unit; 24 class config; 25 #include "units/types.hpp" 26 #include "ai/lua/aspect_advancements.hpp" 27 28 #include <string> 29 #include <vector> 30 31 /** 32 advances the unit at loc if it has enough experience, maximum 20 times. 33 if the unit is on the currently active side, and that side is controlled by a human, a dialog pops up. 34 if we are in a non mp game, and the side is controlled by a human then a dialog is shown too. 35 if the side is controlled by an ai, and if ai_advancement is passed, then ai_advancement will be used. 36 otherwise a random decision will be taken. 37 */ 38 struct advance_unit_params 39 { advance_unit_paramsadvance_unit_params40 advance_unit_params(const map_location& loc) : loc_(loc), ai_advancements_(nullptr), force_dialog_(false), fire_events_(true), animate_(true) {} ai_advancementsadvance_unit_params41 advance_unit_params& ai_advancements(const ai::unit_advancements_aspect& value) {ai_advancements_ = &value; return *this;} force_dialogadvance_unit_params42 advance_unit_params& force_dialog(bool value) {force_dialog_ = value; return *this;} fire_eventsadvance_unit_params43 advance_unit_params& fire_events(bool value) {fire_events_ = value; return *this;} animateadvance_unit_params44 advance_unit_params& animate(bool value) {animate_ = value; return *this;} 45 friend void advance_unit_at(const advance_unit_params&); 46 private: 47 map_location loc_; 48 const ai::unit_advancements_aspect* ai_advancements_; 49 bool force_dialog_; 50 bool fire_events_; 51 bool animate_; 52 }; 53 void advance_unit_at(const advance_unit_params& params); 54 /** 55 * Returns the advanced version of a unit (with traits and items retained). 56 */ 57 unit_ptr get_advanced_unit(const unit &u, const std::string &advance_to); 58 59 /** 60 * Returns the AMLA-advanced version of a unit (with traits and items retained). 61 */ 62 unit_ptr get_amla_unit(const unit &u, const config &mod_option); 63 64 using advancement_option = boost::variant<std::string /*change type*/, const config* /*apply amla*/>; 65 66 /** 67 * Function which will advance the unit at @a loc to 'advance_to'. 68 * which is eigher a type to advance to or a config containing the 69 * [advancement] to perform an amla. 70 * Note that 'loc' is not a reference, because if it were a reference, 71 * we couldn't safely pass in a reference to the item in the map 72 * that we're going to delete, since deletion would invalidate the reference. 73 */ 74 void advance_unit(map_location loc, const advancement_option &advance_to, bool fire_event = true); 75