mirror of
https://github.com/wesnoth/wesnoth
synced 2025-05-15 17:25:32 +00:00
doxygen, comments
This commit is contained in:
parent
7dcb2280be
commit
8f3ba4ed6c
@ -12,6 +12,9 @@
|
||||
See the COPYING file for more details.
|
||||
*/
|
||||
|
||||
//! @file game_events.cpp
|
||||
//! Processing of WML-events.
|
||||
|
||||
#include "global.hpp"
|
||||
#include "actions.hpp"
|
||||
#include "construct_dialog.hpp"
|
||||
@ -84,7 +87,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
} //end anonymous namespace
|
||||
} // end anonymous namespace (1)
|
||||
|
||||
#ifdef _MSC_VER
|
||||
// std::getline might be broken in Visual Studio so show a warning
|
||||
@ -97,16 +100,18 @@ public:
|
||||
#endif
|
||||
|
||||
/**
|
||||
* shows the errors encountered in WML thusfar, to avoid a lot of the same messages
|
||||
* to be shown, identical messages are shown once with the between braces the number
|
||||
* of times that message was encountered. The order in which the messages are shown
|
||||
* does not need to be the order in which these messages are encountered.
|
||||
* Messages are always written to std::cerr
|
||||
* Shows a summary of the errors encountered in WML thusfar,
|
||||
* to avoid a lot of the same messages to be shown.
|
||||
* Identical messages are shown once, with (between braces)
|
||||
* the number of times that message was encountered.
|
||||
* The order in which the messages are shown does not need
|
||||
* to be the order in which these messages are encountered.
|
||||
* Messages are always written to std::cerr.
|
||||
*/
|
||||
static void show_wml_errors()
|
||||
{
|
||||
// Get all unique messages in messages with the number of encounters for
|
||||
// these messages
|
||||
// Get all unique messages in messages,
|
||||
// with the number of encounters for these messages
|
||||
std::map<std::string, int> messages;
|
||||
while(true) {
|
||||
std::string msg;
|
||||
@ -126,10 +131,10 @@ static void show_wml_errors()
|
||||
messages[msg]++;
|
||||
}
|
||||
}
|
||||
// make sure the eof flag is cleared otherwise no new messages are shown
|
||||
// Make sure the eof flag is cleared otherwise no new messages are shown
|
||||
lg::wml_error.clear();
|
||||
|
||||
// show the messages collected
|
||||
// Show the messages collected
|
||||
std::string caption = "Deprecated WML found";
|
||||
for(std::map<std::string, int>::const_iterator itor = messages.begin();
|
||||
itor != messages.end(); ++itor) {
|
||||
@ -159,8 +164,8 @@ bool internal_conditional_passed(const unit_map* units,
|
||||
const vconfig cond, bool& backwards_compat)
|
||||
{
|
||||
|
||||
//if the if statement requires we have a certain unit, then
|
||||
//check for that.
|
||||
// If the if statement requires we have a certain unit,
|
||||
// then check for that.
|
||||
const vconfig::child_list& have_unit = cond.get_children("have_unit");
|
||||
backwards_compat = backwards_compat && have_unit.empty();
|
||||
for(vconfig::child_list::const_iterator u = have_unit.begin(); u != have_unit.end(); ++u) {
|
||||
@ -180,8 +185,8 @@ bool internal_conditional_passed(const unit_map* units,
|
||||
}
|
||||
}
|
||||
|
||||
//if the if statement requires we have a certain location, then
|
||||
//check for that.
|
||||
// If the if statement requires we have a certain location,
|
||||
// then check for that.
|
||||
const vconfig::child_list& have_location = cond.get_children("have_location");
|
||||
backwards_compat = backwards_compat && have_location.empty();
|
||||
for(vconfig::child_list::const_iterator v = have_location.begin(); v != have_location.end(); ++v) {
|
||||
@ -193,8 +198,8 @@ bool internal_conditional_passed(const unit_map* units,
|
||||
}
|
||||
}
|
||||
|
||||
//check against each variable statement to see if the variable
|
||||
//matches the conditions or not
|
||||
// Check against each variable statement,
|
||||
// to see if the variable matches the conditions or not.
|
||||
const vconfig::child_list& variables = cond.get_children("variable");
|
||||
backwards_compat = backwards_compat && variables.empty();
|
||||
for(vconfig::child_list::const_iterator var = variables.begin(); var != variables.end(); ++var) {
|
||||
@ -261,7 +266,7 @@ bool conditional_passed(const unit_map* units,
|
||||
utils::string_bool(cond["backwards_compat"],true);
|
||||
bool matches = internal_conditional_passed(units, cond, allow_backwards_compat);
|
||||
|
||||
//handle [and], [or], and [not] with in-order precedence
|
||||
// Handle [and], [or], and [not] with in-order precedence
|
||||
int or_count = 0;
|
||||
config::all_children_iterator cond_i = cond.get_config().ordered_begin();
|
||||
config::all_children_iterator cond_end = cond.get_config().ordered_end();
|
||||
@ -270,19 +275,19 @@ bool conditional_passed(const unit_map* units,
|
||||
const std::string& cond_name = *((*cond_i).first);
|
||||
const vconfig cond_filter(&(*((*cond_i).second)));
|
||||
|
||||
//handle [and]
|
||||
// Handle [and]
|
||||
if(cond_name == "and")
|
||||
{
|
||||
matches = matches && conditional_passed(units, cond_filter, backwards_compat);
|
||||
backwards_compat = false;
|
||||
}
|
||||
//handle [or]
|
||||
// Handle [or]
|
||||
else if(cond_name == "or")
|
||||
{
|
||||
matches = matches || conditional_passed(units, cond_filter, backwards_compat);
|
||||
++or_count;
|
||||
}
|
||||
//handle [not]
|
||||
// Handle [not]
|
||||
else if(cond_name == "not")
|
||||
{
|
||||
matches = matches && !conditional_passed(units, cond_filter, backwards_compat);
|
||||
@ -290,12 +295,12 @@ bool conditional_passed(const unit_map* units,
|
||||
}
|
||||
++cond_i;
|
||||
}
|
||||
//check for deprecated [or] syntax
|
||||
// Check for deprecated [or] syntax
|
||||
if(matches && or_count > 1 && allow_backwards_compat)
|
||||
{
|
||||
lg::wml_error << "possible deprecated [or] syntax: now forcing re-interpretation\n";
|
||||
//for now we will re-interpret it according to the old rules
|
||||
//but this should be later to prevent re-interpretation errors
|
||||
//! @todo For now we will re-interpret it according to the old rules,
|
||||
// but this should be later to prevent re-interpretation errors.
|
||||
const vconfig::child_list& orcfgs = cond.get_children("or");
|
||||
for(unsigned int i=0; i < orcfgs.size(); ++i) {
|
||||
if(conditional_passed(units, orcfgs[i])) {
|
||||
@ -307,7 +312,7 @@ bool conditional_passed(const unit_map* units,
|
||||
return matches;
|
||||
}
|
||||
|
||||
} //end namespace game_events
|
||||
} // end namespace game_events (1)
|
||||
|
||||
namespace {
|
||||
|
||||
@ -318,12 +323,12 @@ This variable controls the maximum number of hexes in a map, that can be parsed
|
||||
It was set to 1024 before and for larger maps this could become a problem. So it is raised to
|
||||
65536 now, which can feature a map of size 256*256 (maps really shouldn't be bigger than that :-).
|
||||
This constant also controls the maximum number of loops for a WML while loop (hence its name).
|
||||
If this is felt to be too high now, we must split it into two constants, but i don't feel the need
|
||||
at the moment.
|
||||
If this is felt to be too high now, we must split it into two constants,
|
||||
but i don't feel the need at the moment.
|
||||
*/
|
||||
const size_t MaxLoop = 65536;
|
||||
|
||||
} //end anonymous namespace
|
||||
} // end anonymous namespace (2)
|
||||
|
||||
static bool events_init() { return screen != NULL; }
|
||||
|
||||
@ -413,7 +418,7 @@ private:
|
||||
vconfig cfg_;
|
||||
};
|
||||
|
||||
} //end anonymous namespace
|
||||
} // end anonymous namespace (3)
|
||||
|
||||
static gamemap::location cfg_to_loc(const vconfig cfg,int defaultx = 0, int defaulty = 0)
|
||||
{
|
||||
@ -432,8 +437,7 @@ namespace {
|
||||
|
||||
std::multimap<std::string,event_handler> events_map;
|
||||
|
||||
//this function handles all the different types of actions that can be triggered
|
||||
//by an event.
|
||||
//! Handles all the different types of actions that can be triggered by an event.
|
||||
bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
const std::string& cmd, const vconfig cfg, bool& mutated)
|
||||
{
|
||||
@ -441,18 +445,18 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
LOG_NG << "handling command: '" << cmd << "'\n";
|
||||
|
||||
bool rval = true;
|
||||
//sub commands that need to be handled in a guaranteed ordering
|
||||
// Sub commands that need to be handled in a guaranteed ordering
|
||||
if(cmd == "command") {
|
||||
if(!handle_event(event_info, cfg)) {
|
||||
mutated = false;
|
||||
}
|
||||
}
|
||||
|
||||
//allow undo sets the flag saying whether the event has mutated the game to false
|
||||
// Allow undo sets the flag saying whether the event has mutated the game to false
|
||||
else if(cmd == "allow_undo") {
|
||||
mutated = false;
|
||||
}
|
||||
//change shroud settings for portions of the map
|
||||
// Change shroud settings for portions of the map
|
||||
else if(cmd == "remove_shroud" || cmd == "place_shroud") {
|
||||
const bool remove = cmd == "remove_shroud";
|
||||
|
||||
@ -476,12 +480,12 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
|
||||
|
||||
//teleport a unit from one location to another
|
||||
// Teleport a unit from one location to another
|
||||
else if(cmd == "teleport") {
|
||||
|
||||
unit_map::iterator u = units->find(event_info.loc1);
|
||||
|
||||
//search for a valid unit filter, and if we have one, look for the matching unit
|
||||
// Search for a valid unit filter, and if we have one, look for the matching unit
|
||||
const vconfig filter = cfg.child("filter");
|
||||
if(!filter.null()) {
|
||||
for(u = units->begin(); u != units->end(); ++u){
|
||||
@ -490,7 +494,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//we have found a unit that matches the filter
|
||||
// We have found a unit that matches the filter
|
||||
if(u != units->end()) {
|
||||
const gamemap::location dst = cfg_to_loc(cfg);
|
||||
if(dst != u->first && game_map->on_board(dst)) {
|
||||
@ -518,10 +522,10 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//remove units from being turned to stone
|
||||
// Remove units from being turned to stone
|
||||
else if(cmd == "unstone") {
|
||||
const vconfig filter = cfg.child("filter");
|
||||
//store which side will need a shroud/fog update
|
||||
// Store which side will need a shroud/fog update
|
||||
std::vector<bool> clear_fog_side(teams->size(),false);
|
||||
|
||||
for(unit_map::iterator i = units->begin(); i != units->end(); ++i) {
|
||||
@ -540,7 +544,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//allow a side to recruit a new type of unit
|
||||
// Allow a side to recruit a new type of unit
|
||||
else if(cmd == "allow_recruit") {
|
||||
std::string side = cfg["side"];
|
||||
wassert(state_of_game != NULL);
|
||||
@ -564,7 +568,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//remove the ability to recruit a unit from a certain side
|
||||
// Remove the ability to recruit a unit from a certain side
|
||||
else if(cmd == "disallow_recruit") {
|
||||
std::string side = cfg["side"];
|
||||
wassert(state_of_game != NULL);
|
||||
@ -670,7 +674,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//an award of gold to a particular side
|
||||
// An award of gold to a particular side
|
||||
else if(cmd == "gold") {
|
||||
std::string side = cfg["side"];
|
||||
std::string amount = cfg["amount"];
|
||||
@ -683,7 +687,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//modifications of some attributes of a side: gold, income, team name
|
||||
// Modifications of some attributes of a side: gold, income, team name
|
||||
else if(cmd == "modify_side") {
|
||||
std::cerr << "modifying side...\n";
|
||||
std::string side = cfg["side"];
|
||||
@ -712,7 +716,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
}
|
||||
//stores of some attributes of a side: gold, income, team name
|
||||
// Stores of some attributes of a side: gold, income, team name
|
||||
else if(cmd == "store_side" || cmd == "store_gold") {
|
||||
t_string *gold_store;
|
||||
std::string side = cfg["side"];
|
||||
@ -824,7 +828,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//provide a means of specifying win/loss conditions:
|
||||
// Provide a means of specifying win/loss conditions:
|
||||
// [event]
|
||||
// name=prestart
|
||||
// [objectives]
|
||||
@ -853,9 +857,9 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
//
|
||||
// If side is set to 0, the new objectives are added to each player.
|
||||
//
|
||||
// The new objectives will be automatically displayed, but only to the
|
||||
// player whose objectives did change, and only when it's this player's
|
||||
// turn.
|
||||
// The new objectives will be automatically displayed,
|
||||
// but only to the player whose objectives did change,
|
||||
// and only when it's this player's turn.
|
||||
else if(cmd == "objectives") {
|
||||
const std::string win_str = "@";
|
||||
const std::string lose_str = "#";
|
||||
@ -928,14 +932,14 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
|
||||
|
||||
//setting a variable
|
||||
// Setting a variable
|
||||
else if(cmd == "set_variable") {
|
||||
wassert(state_of_game != NULL);
|
||||
|
||||
const std::string name = cfg["name"];
|
||||
t_string& var = state_of_game->get_variable(name);
|
||||
|
||||
const t_string& literal = cfg.get_attribute("literal"); //no $var substitution
|
||||
const t_string& literal = cfg.get_attribute("literal"); // no $var substitution
|
||||
if(literal.empty() == false) {
|
||||
var = literal;
|
||||
}
|
||||
@ -945,7 +949,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
var = value;
|
||||
}
|
||||
|
||||
const t_string format = cfg["format"]; //deprecated, use value
|
||||
const t_string format = cfg["format"]; // Deprecated, use value
|
||||
if(format.empty() == false) {
|
||||
var = format;
|
||||
}
|
||||
@ -1001,8 +1005,8 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
// Note maybe we add more options later eg strftime formatting
|
||||
// for now make the stamp mandatory
|
||||
// Note: maybe we add more options later, eg. strftime formatting.
|
||||
// For now make the stamp mandatory.
|
||||
const std::string time = cfg["time"];
|
||||
if(time == "stamp") {
|
||||
char buf[50];
|
||||
@ -1010,15 +1014,15 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
var = buf;
|
||||
}
|
||||
|
||||
// random generation works as follows:
|
||||
// Random generation works as follows:
|
||||
// random=[comma delimited list]
|
||||
// Each element in the list will be considered a separate choice,
|
||||
// unless it contains "..". In this case, it must be a numerical
|
||||
// range. (i.e. -1..-10, 0..100, -10..10, etc)
|
||||
// range (i.e. -1..-10, 0..100, -10..10, etc).
|
||||
const std::string random = cfg["random"];
|
||||
if(random.empty() == false) {
|
||||
std::string random_value;
|
||||
//if we're not replaying create a random number
|
||||
// If we're not replaying, create a random number
|
||||
if(get_replay_source().at_end()) {
|
||||
std::string word;
|
||||
std::vector<std::string> words;
|
||||
@ -1039,12 +1043,12 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
|
||||
|
||||
if (tmp == std::string::npos) {
|
||||
// treat this element as a string
|
||||
// Treat this element as a string
|
||||
ranges.push_back(std::pair<int, int>(0,0));
|
||||
num_choices += 1;
|
||||
}
|
||||
else {
|
||||
// treat as a numerical range
|
||||
// Treat as a numerical range
|
||||
const std::string first = word.substr(0, tmp);
|
||||
const std::string second = word.substr(tmp+2,
|
||||
random.length());
|
||||
@ -1085,7 +1089,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
recorder.set_random_value(random_value.c_str());
|
||||
}
|
||||
|
||||
//otherwise get the random value from the replay data
|
||||
// Otherwise get the random value from the replay data
|
||||
else {
|
||||
const config* const action = get_replay_source().get_next_action();
|
||||
if(action == NULL || action->get_children("random_number").empty()) {
|
||||
@ -1099,7 +1103,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//conditional statements
|
||||
// Conditional statements
|
||||
else if(cmd == "if" || cmd == "while") {
|
||||
log_scope(cmd);
|
||||
const size_t max_iterations = (cmd == "if" ? 1 : MaxLoop);
|
||||
@ -1113,8 +1117,8 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
break;
|
||||
}
|
||||
|
||||
//if the if statement passed, then execute all 'then' statements,
|
||||
//otherwise execute 'else' statements
|
||||
// If the if statement passed, then execute all 'then' statements,
|
||||
// otherwise execute 'else' statements
|
||||
const vconfig::child_list commands = cfg.get_children(type);
|
||||
for(vconfig::child_list::const_iterator cmd = commands.begin();
|
||||
cmd != commands.end(); ++cmd) {
|
||||
@ -1127,14 +1131,14 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
|
||||
else if(cmd == "role") {
|
||||
|
||||
//get a list of the types this unit can be
|
||||
// Get a list of the types this unit can be
|
||||
std::vector<std::string> types = utils::split(cfg["type"]);
|
||||
if (types.size() == 0) types.push_back("");
|
||||
|
||||
std::vector<std::string> sides = utils::split(cfg["side"]);
|
||||
|
||||
//iterate over all the types, and for each type, try to find
|
||||
//a unit that matches
|
||||
// Iterate over all the types, and for each type,
|
||||
// try to find a unit that matches
|
||||
std::vector<std::string>::iterator ti;
|
||||
for(ti = types.begin(); ti != types.end(); ++ti) {
|
||||
config item = cfg.get_config();
|
||||
@ -1165,7 +1169,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
if(!player)
|
||||
continue;
|
||||
|
||||
//iterate over the units, and try to find one that matches
|
||||
// Iterate over the units, and try to find one that matches
|
||||
std::vector<unit>::iterator ui;
|
||||
for(ui = player->available_units.begin();
|
||||
ui != player->available_units.end(); ++ui) {
|
||||
@ -1185,7 +1189,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
for(pi=state_of_game->players.begin();
|
||||
pi!=state_of_game->players.end(); ++pi) {
|
||||
std::vector<unit>::iterator ui;
|
||||
//iterate over the units, and try to find one that matches
|
||||
// Iterate over the units, and try to find one that matches
|
||||
for(ui = pi->second.available_units.begin();
|
||||
ui != pi->second.available_units.end(); ++ui) {
|
||||
wassert(game_data_ptr != NULL);
|
||||
@ -1201,7 +1205,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//if we found a unit, we don't have to keep going.
|
||||
// Stop searching if we found a unit:
|
||||
if(found)
|
||||
break;
|
||||
}
|
||||
@ -1238,7 +1242,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//hiding units
|
||||
// Hiding units
|
||||
else if(cmd == "hide_unit") {
|
||||
const gamemap::location loc = cfg_to_loc(cfg);
|
||||
unit_map::iterator u = units->find(loc);
|
||||
@ -1252,7 +1256,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
else if(cmd == "unhide_unit") {
|
||||
const gamemap::location loc = cfg_to_loc(cfg);
|
||||
unit_map::iterator u;
|
||||
// unhide all for backward compatibility
|
||||
// Unhide all for backward compatibility
|
||||
for(u = units->begin(); u != units->end() ; u++) {
|
||||
u->second.set_hidden(false);
|
||||
screen->invalidate(loc);
|
||||
@ -1260,7 +1264,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//adding new items
|
||||
// Adding new items
|
||||
else if(cmd == "item") {
|
||||
gamemap::location loc = cfg_to_loc(cfg);
|
||||
std::string img = cfg["image"];
|
||||
@ -1305,7 +1309,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
soundsources->remove(cfg["id"]);
|
||||
}
|
||||
|
||||
//changing the terrain
|
||||
// Changing the terrain
|
||||
else if(cmd == "terrain") {
|
||||
const std::vector<gamemap::location> locs = multiple_locs(cfg);
|
||||
|
||||
@ -1334,7 +1338,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//creating a mask of the terrain
|
||||
// Creating a mask of the terrain
|
||||
else if(cmd == "terrain_mask") {
|
||||
gamemap::location loc = cfg_to_loc(cfg, 1, 1);
|
||||
|
||||
@ -1353,7 +1357,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
screen->rebuild_all();
|
||||
}
|
||||
|
||||
//if we should spawn a new unit on the map somewhere
|
||||
// If we should spawn a new unit on the map somewhere
|
||||
else if(cmd == "unit") {
|
||||
wassert(game_data_ptr != NULL);
|
||||
wassert(units != NULL);
|
||||
@ -1397,14 +1401,14 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//if we should recall units that match a certain description
|
||||
// If we should recall units that match a certain description
|
||||
else if(cmd == "recall") {
|
||||
LOG_NG << "recalling unit...\n";
|
||||
bool unit_recalled = false;
|
||||
config unit_filter(cfg.get_config());
|
||||
//prevent the recall unit filter from using the location as a criterion
|
||||
// FIXME: we should design the WML to avoid these types of collisions;
|
||||
// filters should be named consistently and always have a distinct scope
|
||||
// Prevent the recall unit filter from using the location as a criterion
|
||||
//! @todo FIXME: we should design the WML to avoid these types of collisions;
|
||||
// filters should be named consistently and always have a distinct scope.
|
||||
unit_filter["x"] = "";
|
||||
unit_filter["y"] = "";
|
||||
for(int index = 0; !unit_recalled && index < int(teams->size()); ++index) {
|
||||
@ -1427,7 +1431,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
if(game_events::unit_matches_filter(*u, &unit_filter, gamemap::location())) {
|
||||
gamemap::location loc = cfg_to_loc(cfg);
|
||||
unit to_recruit(*u);
|
||||
avail.erase(u); //erase before recruiting, since recruiting can fire more events
|
||||
avail.erase(u); // Erase before recruiting, since recruiting can fire more events
|
||||
unit_mutations++;
|
||||
recruit_unit(*game_map,index+1,*units,to_recruit,loc,utils::string_bool(cfg["show"],true),false,true);
|
||||
unit_recalled = true;
|
||||
@ -1441,7 +1445,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
std::string id = cfg["id"];
|
||||
wassert(state_of_game != NULL);
|
||||
|
||||
//if this item has already been used
|
||||
// If this item has already been used
|
||||
if(id != "" && used_items.count(id))
|
||||
return rval;
|
||||
|
||||
@ -1475,7 +1479,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
screen->select_hex(event_info.loc1);
|
||||
screen->invalidate_unit();
|
||||
|
||||
//mark that this item won't be used again
|
||||
// Mark this item as used up.
|
||||
used_items.insert(id);
|
||||
} else {
|
||||
text = cfg["cannot_use_message"];
|
||||
@ -1489,7 +1493,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
surface.assign(image::get_image(image));
|
||||
}
|
||||
|
||||
//this will redraw the unit, with its new stats
|
||||
// Redraw the unit, with its new stats
|
||||
screen->draw();
|
||||
|
||||
const std::string duration_str = cfg["duration"];
|
||||
@ -1511,7 +1515,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//displaying a message on-screen
|
||||
// Display a message on-screen
|
||||
else if(cmd == "print") {
|
||||
std::string text = cfg["text"];
|
||||
std::string size_str = cfg["size"];
|
||||
@ -1529,7 +1533,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
|
||||
SDL_Color colour = {red,green,blue,255};
|
||||
|
||||
//remove any old one.
|
||||
// Remove any old message.
|
||||
if (floating_label)
|
||||
font::remove_floating_label(floating_label);
|
||||
|
||||
@ -1543,12 +1547,12 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
|
||||
else if(cmd == "deprecated_message") {
|
||||
// note since only used for deprecated things no need to translate the string
|
||||
// Note: no need to translate the string, since only used for deprecated things.
|
||||
const std::string message = cfg["message"];
|
||||
lg::wml_error << message << '\n';
|
||||
}
|
||||
|
||||
//displaying a message dialog
|
||||
// Display a message dialog
|
||||
else if(cmd == "message") {
|
||||
unit_map::iterator speaker = units->end();
|
||||
|
||||
@ -1566,8 +1570,8 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
|
||||
if(speaker == units->end() && speaker_str != "narrator") {
|
||||
//no matching unit found, so the dialog can't come up
|
||||
//continue onto the next message
|
||||
// No matching unit found, so the dialog can't come up.
|
||||
// Continue onto the next message.
|
||||
WRN_NG << "cannot show message\n";
|
||||
return rval;
|
||||
}
|
||||
@ -1639,8 +1643,8 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
|
||||
LOG_DP << "showing dialog...\n";
|
||||
|
||||
//if we're not replaying, or if we are replaying and there is no choice
|
||||
//to be made, show the dialog.
|
||||
// If we're not replaying, or if we are replaying
|
||||
// and there is no choice to be made, show the dialog.
|
||||
if(get_replay_source().at_end() || options.empty()) {
|
||||
const t_string msg = cfg["message"];
|
||||
const std::string duration_str = cfg["duration"];
|
||||
@ -1673,7 +1677,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//otherwise if a choice has to be made, get it from the replay data
|
||||
// Otherwise if a choice has to be made, get it from the replay data
|
||||
else {
|
||||
const config* action = get_replay_source().get_next_action();
|
||||
if (action != NULL && !action->get_children("start").empty()){
|
||||
@ -1687,7 +1691,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
option_chosen = atol(val.c_str());
|
||||
}
|
||||
|
||||
//implement the consequences of the choice
|
||||
// Implement the consequences of the choice
|
||||
if(options.empty() == false) {
|
||||
if(size_t(option_chosen) >= menu_items.size()) {
|
||||
std::stringstream errbuf;
|
||||
@ -1708,7 +1712,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
|
||||
else if(cmd == "kill") {
|
||||
//Use (x,y) iteration because firing events ruins unit_map iteration
|
||||
// Use (x,y) iteration, because firing events ruins unit_map iteration
|
||||
for(gamemap::location loc(0,0); loc.x < game_map->w(); ++loc.x) {
|
||||
for(loc.y = 0; loc.y < game_map->h(); ++loc.y) {
|
||||
unit_map::iterator un = units->find(loc);
|
||||
@ -1733,8 +1737,8 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//if the filter doesn't contain positional information, then it may match
|
||||
//units on all recall lists.
|
||||
// If the filter doesn't contain positional information,
|
||||
// then it may match units on all recall lists.
|
||||
if(cfg["x"].empty() && cfg["y"].empty()) {
|
||||
std::map<std::string, player_info>& players=state_of_game->players;
|
||||
|
||||
@ -1755,12 +1759,12 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//adding of new events
|
||||
// Adding of new events
|
||||
else if(cmd == "event") {
|
||||
new_handlers.push_back(event_handler(cfg.get_config()));
|
||||
}
|
||||
|
||||
//setting of menu items
|
||||
// Setting of menu items
|
||||
else if(cmd == "set_menu_item") {
|
||||
/*
|
||||
[set_menu_item]
|
||||
@ -1806,8 +1810,8 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
wmi_command_changes.push_back(wmi_command_change(id, new_command));
|
||||
}
|
||||
}
|
||||
//unit serialization to and from variables
|
||||
// FIXME: Check that store is automove bug safe
|
||||
// Unit serialization to and from variables
|
||||
//! @todo FIXME: Check that store is automove bug safe
|
||||
else if(cmd == "store_unit") {
|
||||
const config empty_filter;
|
||||
vconfig filter = cfg.child("filter");
|
||||
@ -1900,7 +1904,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
std::string text = cfg["text"];
|
||||
if(!text.empty())
|
||||
{
|
||||
//Print floating label
|
||||
// Print floating label
|
||||
std::string red_str = cfg["red"];
|
||||
std::string green_str = cfg["green"];
|
||||
std::string blue_str = cfg["blue"];
|
||||
@ -1916,17 +1920,17 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
std::cerr << "advance = " << advance << '\n';
|
||||
|
||||
if(utils::string_bool(cfg["advance"], true) && get_replay_source().at_end()) {
|
||||
//Try to advance the unit
|
||||
// Try to advance the unit
|
||||
|
||||
//FIXME: get player_number_ from the play_controller not from the WML vars
|
||||
//! @todo FIXME: get player_number_ from the play_controller, not from the WML vars.
|
||||
const t_string& side_str = state_of_game->get_variable("side_number");
|
||||
const int side = lexical_cast_default<int>(side_str.base_str(), -1);
|
||||
|
||||
//Select advancement if it is on the playing side and the player is a human
|
||||
// Select advancement if it is on the playing side and the player is a human
|
||||
const bool sel = (side == static_cast<int>(u.side())
|
||||
&& (*teams)[side-1].is_human());
|
||||
|
||||
//The code in dialogs::advance_unit tests whether the unit can advance
|
||||
// The code in dialogs::advance_unit tests whether the unit can advance
|
||||
dialogs::advance_unit(*game_data_ptr, *game_map, *units, loc, *screen, !sel, true);
|
||||
}
|
||||
|
||||
@ -1963,7 +1967,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
|
||||
/* [store_villages] : store villages into an array
|
||||
* keys:
|
||||
* Keys:
|
||||
* - variable (mandatory): variable to store in
|
||||
* - side: if present, the village should be owned by this side (0=unowned villages)
|
||||
* - terrain: if present, filter the village types against this list of terrain types
|
||||
@ -1981,7 +1985,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
|
||||
for(std::vector<gamemap::location>::const_iterator j = locs.begin(); j != locs.end(); ++j) {
|
||||
bool matches = false;
|
||||
if(cfg.has_attribute("side")) { //deprecated, use owner_side instead
|
||||
if(cfg.has_attribute("side")) { // deprecated, use owner_side instead
|
||||
lg::wml_error << "side key is no longer accepted in [store_villages],"
|
||||
<< " use owner_side instead.\n";
|
||||
config temp_cfg(cfg.get_config());
|
||||
@ -2019,13 +2023,13 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//command to take control of a village for a certain side
|
||||
// Command to take control of a village for a certain side
|
||||
else if(cmd == "capture_village") {
|
||||
std::string side = cfg["side"];
|
||||
wassert(state_of_game != NULL);
|
||||
const int side_num = lexical_cast_default<int>(side);
|
||||
//if 'side' is 0, then it will become an invalid index, and so
|
||||
//the village will become neutral.
|
||||
// If 'side' is 0, then it will become an invalid index,
|
||||
// and so the village will become neutral.
|
||||
const size_t team_num = size_t(side_num-1);
|
||||
|
||||
const std::vector<gamemap::location> locs(multiple_locs(cfg));
|
||||
@ -2037,7 +2041,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//command to remove a variable
|
||||
// Command to remove a variable
|
||||
else if(cmd == "clear_variable") {
|
||||
const std::string name = cfg["name"];
|
||||
state_of_game->clear_variable(name);
|
||||
@ -2079,7 +2083,8 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
|
||||
unit_map::iterator u = units->find(event_info.loc1);
|
||||
|
||||
//search for a valid unit filter, and if we have one, look for the matching unit
|
||||
// Search for a valid unit filter,
|
||||
// and if we have one, look for the matching unit
|
||||
const vconfig filter = cfg.child("filter");
|
||||
if(!filter.null()) {
|
||||
for(u = units->begin(); u != units->end(); ++u){
|
||||
@ -2088,7 +2093,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
}
|
||||
|
||||
//we have found a unit that matches the filter
|
||||
// We have found a unit that matches the filter
|
||||
if(u != units->end() && ! screen->fogged(u->first)) {
|
||||
screen->highlight_hex(u->first);
|
||||
screen->scroll_to_tile(u->first);
|
||||
@ -2123,7 +2128,7 @@ bool event_handler::handle_event_command(const queued_event& event_info,
|
||||
}
|
||||
|
||||
static void commit_new_handlers() {
|
||||
//commit any spawned events-within-events
|
||||
// Commit any spawned events-within-events
|
||||
while(new_handlers.size() > 0) {
|
||||
event_handler& new_handler = new_handlers.back();
|
||||
events_map.insert(std::pair<std::string,event_handler>(new_handler.name(),new_handler));
|
||||
@ -2134,7 +2139,7 @@ static void commit_new_handlers() {
|
||||
}
|
||||
|
||||
static void commit_wmi_commands() {
|
||||
//commit WML Menu Item command changes
|
||||
// Commit WML Menu Item command changes
|
||||
while(wmi_command_changes.size() > 0) {
|
||||
wmi_command_change wcc = wmi_command_changes.back();
|
||||
wml_menu_item*& mref = state_of_game->wml_menu_items[wcc.first];
|
||||
@ -2174,8 +2179,8 @@ bool event_handler::handle_event(const queued_event& event_info, const vconfig c
|
||||
|
||||
const std::pair<const std::string*,const config*> item = *i;
|
||||
|
||||
// If the user pressed escape, we skip any message that doesn't
|
||||
// require them to make a choice.
|
||||
// If the user pressed escape, we skip any message
|
||||
// that doesn't require them to make a choice.
|
||||
if ((skip_messages) && (*item.first == "message")) {
|
||||
if ((item.second)->get_children("option").size() == 0) {
|
||||
continue;
|
||||
@ -2190,13 +2195,13 @@ bool event_handler::handle_event(const queued_event& event_info, const vconfig c
|
||||
}
|
||||
}
|
||||
|
||||
// We do this once event has completed any music alterations
|
||||
// We do this once the event has completed any music alterations
|
||||
sound::commit_music_changes();
|
||||
|
||||
return mutated;
|
||||
}
|
||||
|
||||
} //end anonymous namespace
|
||||
} // end anonymous namespace (4)
|
||||
|
||||
static bool process_event(event_handler& handler, const queued_event& ev)
|
||||
{
|
||||
@ -2265,16 +2270,16 @@ static bool process_event(event_handler& handler, const queued_event& ev)
|
||||
}
|
||||
if(ev.loc1.requires_unit() && filtered_unit1
|
||||
&& (unit1 == units->end() || !ev.loc1.matches_unit(unit1->second))) {
|
||||
//wrong or missing entity at src location
|
||||
// Wrong or missing entity at src location
|
||||
return false;
|
||||
}
|
||||
if(ev.loc2.requires_unit() && filtered_unit2
|
||||
&& (unit2 == units->end() || !ev.loc2.matches_unit(unit2->second))) {
|
||||
//wrong or missing entity at dst location
|
||||
// Wrong or missing entity at dst location
|
||||
return false;
|
||||
}
|
||||
|
||||
//the event hasn't been filtered out, so execute the handler
|
||||
// The event hasn't been filtered out, so execute the handler
|
||||
const bool res = handler.handle_event(ev);
|
||||
if(ev.name == "select") {
|
||||
state_of_game->last_selected = ev.loc1;
|
||||
@ -2298,8 +2303,8 @@ namespace game_events {
|
||||
|
||||
bool matches_special_filter(const config* cfg, const vconfig filter)
|
||||
{
|
||||
//FIXME: this filter should be deprecated and removed,
|
||||
//instead we should just auto-store $attacker_weapon and check it in a conditional
|
||||
//! @todo FIXME: This filter should be deprecated and removed,
|
||||
// instead we should just auto-store $attacker_weapon and check it in a conditional
|
||||
|
||||
if(!cfg) {
|
||||
return false;
|
||||
@ -2311,7 +2316,7 @@ bool matches_special_filter(const config* cfg, const vconfig filter)
|
||||
}
|
||||
}
|
||||
|
||||
//handle [and], [or], and [not] with in-order precedence
|
||||
// Handle [and], [or], and [not] with in-order precedence
|
||||
config::all_children_iterator cond_i = filter.get_config().ordered_begin();
|
||||
config::all_children_iterator cond_end = filter.get_config().ordered_end();
|
||||
while(cond_i != cond_end)
|
||||
@ -2319,17 +2324,17 @@ bool matches_special_filter(const config* cfg, const vconfig filter)
|
||||
const std::string& cond_name = *((*cond_i).first);
|
||||
const vconfig cond_filter(&(*((*cond_i).second)));
|
||||
|
||||
//handle [and]
|
||||
// Handle [and]
|
||||
if(cond_name == "and")
|
||||
{
|
||||
matches = matches && matches_special_filter(cfg, cond_filter);
|
||||
}
|
||||
//handle [or]
|
||||
// Handle [or]
|
||||
else if(cond_name == "or")
|
||||
{
|
||||
matches = matches || matches_special_filter(cfg, cond_filter);
|
||||
}
|
||||
//handle [not]
|
||||
// Handle [not]
|
||||
else if(cond_name == "not")
|
||||
{
|
||||
matches = matches && !matches_special_filter(cfg, cond_filter);
|
||||
@ -2495,18 +2500,18 @@ bool pump()
|
||||
|
||||
while(events_queue.empty() == false) {
|
||||
queued_event ev = events_queue.front();
|
||||
events_queue.pop_front(); //pop now for exception safety
|
||||
events_queue.pop_front(); // pop now for exception safety
|
||||
const std::string& event_name = ev.name;
|
||||
typedef std::multimap<std::string,event_handler>::iterator itor;
|
||||
|
||||
// clear the unit cache, since the best clearing time is hard to figure out
|
||||
// due to status changes by WML every event will flush the cache.
|
||||
// Clear the unit cache, since the best clearing time is hard to figure out
|
||||
// due to status changes by WML. Every event will flush the cache.
|
||||
unit::clear_status_caches();
|
||||
|
||||
//find all handlers for this event in the map
|
||||
// Find all handlers for this event in the map
|
||||
std::pair<itor,itor> i = events_map.equal_range(event_name);
|
||||
|
||||
//set the variables for the event
|
||||
// Set the variables for the event
|
||||
if(i.first != i.second && state_of_game != NULL) {
|
||||
char buf[50];
|
||||
snprintf(buf,sizeof(buf),"%d",ev.loc1.x+1);
|
||||
@ -2533,7 +2538,7 @@ bool pump()
|
||||
commit_wmi_commands();
|
||||
commit_new_handlers();
|
||||
|
||||
// dialogs can only be shown if the display is not locked
|
||||
// Dialogs can only be shown if the display is not locked
|
||||
if(! screen->video().update_locked()) {
|
||||
show_wml_errors();
|
||||
}
|
||||
@ -2564,4 +2569,5 @@ bool entity_location::requires_unit() const
|
||||
return !id_.empty();
|
||||
}
|
||||
|
||||
} //end namespace game_events
|
||||
} // end namespace game_events (2)
|
||||
|
||||
|
@ -12,6 +12,9 @@
|
||||
See the COPYING file for more details.
|
||||
*/
|
||||
|
||||
//! @file image.cpp
|
||||
//! Routines for images: load, scale, re-color, etc.
|
||||
|
||||
#include "global.hpp"
|
||||
|
||||
#include "config.hpp"
|
||||
@ -39,7 +42,7 @@ typedef std::map<image::locator::value, int> locator_finder_t;
|
||||
typedef std::pair<image::locator::value, int> locator_finder_pair;
|
||||
locator_finder_t locator_finder;
|
||||
|
||||
// Definition of all image maps
|
||||
//! Definition of all image maps
|
||||
image::image_cache images_,hexed_images_,scaled_to_hex_images_,scaled_to_zoom_,unmasked_images_;
|
||||
image::image_cache brightened_images_,semi_brightened_images_;
|
||||
|
||||
@ -51,7 +54,7 @@ std::map<surface, surface> reversed_images_;
|
||||
|
||||
int red_adjust = 0, green_adjust = 0, blue_adjust = 0;
|
||||
|
||||
// list of colors used by the TC image modification
|
||||
//! List of colors used by the TC image modification
|
||||
std::vector<std::string> team_colors;
|
||||
|
||||
std::string image_mask;
|
||||
@ -59,10 +62,11 @@ std::string image_mask;
|
||||
int zoom = image::tile_size;
|
||||
int cached_zoom = 0;
|
||||
|
||||
//The "pointer to surfaces" vector is not cleared anymore (the surface are
|
||||
//still freed, of course.) I do not think it is a problem, as the number of
|
||||
//different surfaces the program may lookup has an upper limit, so its
|
||||
//memory usage won't grow indefinitely over time
|
||||
// The "pointer to surfaces" vector is not cleared anymore
|
||||
// (the surface are still freed, of course).
|
||||
// I do not think it is a problem, as the number of different surfaces
|
||||
// the program may lookup has an upper limit, so its memory usage
|
||||
// won't grow indefinitely over time.
|
||||
template<typename T>
|
||||
void reset_cache(std::vector<image::cache_item<T> >& cache)
|
||||
{
|
||||
@ -74,7 +78,7 @@ void reset_cache(std::vector<image::cache_item<T> >& cache)
|
||||
beg->item = T();
|
||||
}
|
||||
}
|
||||
}
|
||||
} // end anon namespace
|
||||
|
||||
namespace image {
|
||||
|
||||
@ -323,8 +327,8 @@ surface locator::load_image_sub_file() const
|
||||
}
|
||||
std::string field = *j++;
|
||||
|
||||
if("TC" == function){//deprecated team coloring syntax
|
||||
//replace with proper RC syntax
|
||||
if("TC" == function){ // Deprecated team coloring syntax
|
||||
//! @todo replace with proper RC syntax
|
||||
std::string::size_type pos = 0;
|
||||
pos = field.find(',');
|
||||
if (pos == std::string::npos)
|
||||
@ -341,7 +345,7 @@ surface locator::load_image_sub_file() const
|
||||
}
|
||||
}
|
||||
|
||||
if("RC" == function){ //re-color function
|
||||
if("RC" == function){ // Re-color function
|
||||
std::vector<std::string> recolor=utils::split(field,'>');
|
||||
if(recolor.size()>1){
|
||||
std::map<Uint32, Uint32> tmp_map;
|
||||
@ -357,7 +361,7 @@ surface locator::load_image_sub_file() const
|
||||
}
|
||||
}
|
||||
}
|
||||
if("FL" == function){ //flip layer
|
||||
if("FL" == function){ // Flip layer
|
||||
if(field.empty() || field.find("horiz") != std::string::npos) {
|
||||
xflip = !xflip;
|
||||
}
|
||||
@ -465,8 +469,8 @@ void set_team_colors(const std::vector<std::string>& colors)
|
||||
void set_image_mask(const std::string& /*image*/)
|
||||
{
|
||||
|
||||
//image_mask are blitted in display.cpp
|
||||
//so no need to flush the cache here
|
||||
// image_mask are blitted in display.cpp
|
||||
// so no need to flush the cache here
|
||||
/*
|
||||
if(image_mask != image) {
|
||||
image_mask = image;
|
||||
@ -488,9 +492,9 @@ void set_zoom(int amount)
|
||||
reset_cache(semi_brightened_images_);
|
||||
reversed_images_.clear();
|
||||
|
||||
// we keep these caches if:
|
||||
// We keep these caches if:
|
||||
// we use default zoom (it doesn't need those)
|
||||
// or if they are already at the wanted zoom
|
||||
// or if they are already at the wanted zoom.
|
||||
if (zoom != tile_size && zoom != cached_zoom) {
|
||||
reset_cache(scaled_to_zoom_);
|
||||
reset_cache(unmasked_images_);
|
||||
@ -501,8 +505,8 @@ void set_zoom(int amount)
|
||||
|
||||
static surface get_hexed(const locator i_locator)
|
||||
{
|
||||
// we don't want to add it to the unscaled cache
|
||||
// since we will normaly never need the non-hexed one
|
||||
// w.e don't want to add it to the unscaled cache,
|
||||
// since we will normaly never need the non-hexed one.
|
||||
surface image(get_image(i_locator, UNSCALED, false));
|
||||
// Re-cut scaled tiles according to a mask.
|
||||
const surface hex(get_image(game_config::terrain_mask_image,
|
||||
@ -512,8 +516,8 @@ static surface get_hexed(const locator i_locator)
|
||||
|
||||
static surface get_unmasked(const locator i_locator)
|
||||
{
|
||||
// if no scaling needed at this zoom level
|
||||
// we just use the hexed image
|
||||
// If no scaling needed at this zoom level,
|
||||
// we just use the hexed image.
|
||||
surface image(get_image(i_locator, HEXED));
|
||||
if (zoom != tile_size)
|
||||
return scale_surface(image, zoom, zoom);
|
||||
@ -549,7 +553,7 @@ static surface get_scaled_to_zoom(const locator i_locator)
|
||||
wassert(tile_size != 0);
|
||||
|
||||
surface res(get_image(i_locator, UNSCALED));
|
||||
// for some reason haloes seems to have invalid images, protect against crashing
|
||||
// For some reason haloes seems to have invalid images, protect against crashing
|
||||
if(!res.null()) {
|
||||
return scale_surface(res, ((res.get()->w * zoom) / tile_size), ((res.get()->h * zoom) / tile_size));
|
||||
} else {
|
||||
@ -588,7 +592,7 @@ surface get_image(const image::locator& i_locator, TYPE type, bool add_to_cache
|
||||
imap = &scaled_to_hex_images_;
|
||||
break;
|
||||
case SCALED_TO_ZOOM:
|
||||
// only use separate cache if scaled
|
||||
// Only use separate cache if scaled
|
||||
if(zoom != tile_size) {
|
||||
imap = &scaled_to_zoom_;
|
||||
} else {
|
||||
@ -600,7 +604,7 @@ surface get_image(const image::locator& i_locator, TYPE type, bool add_to_cache
|
||||
imap = &hexed_images_;
|
||||
break;
|
||||
case UNMASKED:
|
||||
// only use separate cache if scaled
|
||||
// Only use separate cache if scaled
|
||||
if(zoom != tile_size) {
|
||||
imap = &unmasked_images_;
|
||||
} else {
|
||||
@ -620,8 +624,8 @@ surface get_image(const image::locator& i_locator, TYPE type, bool add_to_cache
|
||||
if(i_locator.in_cache(*imap))
|
||||
return i_locator.locate_in_cache(*imap);
|
||||
|
||||
// If type is unscaled, directly load the image from the disk. Else,
|
||||
// create it from the unscaled image
|
||||
// If type is unscaled, directly load the image from the disk.
|
||||
// Else, create it from the unscaled image.
|
||||
if(is_unscaled) {
|
||||
res = i_locator.load_from_disk();
|
||||
|
||||
@ -657,7 +661,7 @@ surface get_image(const image::locator& i_locator, TYPE type, bool add_to_cache
|
||||
}
|
||||
}
|
||||
|
||||
// optimizes surface before storing it
|
||||
// Optimizes surface before storing it
|
||||
res = create_optimized_surface(res);
|
||||
if(add_to_cache) i_locator.add_to_cache(*imap, res);
|
||||
return res;
|
||||
@ -692,7 +696,7 @@ bool exists(const image::locator& i_locator)
|
||||
if (type != loc::FILE && type != loc::SUB_FILE)
|
||||
return false;
|
||||
|
||||
// the insertion will fail if there is already an element in the cache
|
||||
// The insertion will fail if there is already an element in the cache
|
||||
std::pair< std::map< image::locator, bool >::iterator, bool >
|
||||
it = image_existance_map.insert(std::make_pair(i_locator, false));
|
||||
bool &cache = it.first->second;
|
||||
@ -702,4 +706,5 @@ bool exists(const image::locator& i_locator)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
} // end namespace image
|
||||
|
||||
|
@ -12,6 +12,9 @@
|
||||
See the COPYING file for more details.
|
||||
*/
|
||||
|
||||
//! @file unit_types.cpp
|
||||
//! Handle unit-type specific attributes, animations, advancement.
|
||||
|
||||
#include "global.hpp"
|
||||
|
||||
#include "game_config.hpp"
|
||||
@ -32,12 +35,13 @@
|
||||
|
||||
//! The Halbardier got renamed so this function fixes that, all
|
||||
//! functions which assign id_ in unit or unit_types should use
|
||||
//! this wrapper in order to keep compatibility with older versions
|
||||
//! this wrapper in order to keep compatibility with older versions.
|
||||
//
|
||||
// @param id the id of the unit
|
||||
//
|
||||
// @returns the new id of the unit if id == Halbardier it returns
|
||||
// Halberdier otherwise id unmodified
|
||||
// @returns the new id of the unit.
|
||||
// if id == Halbardier it returns Halberdier,
|
||||
// otherwise id unmodified
|
||||
std::string unit_id_test(const std::string& id)
|
||||
{
|
||||
if(id == "Halbardier") {
|
||||
@ -64,7 +68,8 @@ attack_type::attack_type(const config& cfg,const std::string& id, const std::str
|
||||
}
|
||||
|
||||
if(cfg.child("frame") || cfg.child("missile_frame") || cfg.child("sound")) {
|
||||
LOG_STREAM(err, config) << "the animation for " << cfg["name"] << "in unit " << id << " is directly in the attack, please use [animation]\n" ;
|
||||
LOG_STREAM(err, config) << "the animation for " << cfg["name"] << "in unit " << id
|
||||
<< " is directly in the attack, please use [animation]\n" ;
|
||||
}
|
||||
if(animation_.empty()) {
|
||||
animation_.push_back(attack_animation(cfg));
|
||||
@ -107,7 +112,7 @@ attack_type::attack_type(const config& cfg,const std::string& id, const std::str
|
||||
const attack_animation* attack_type::animation(const game_display& disp, const gamemap::location& loc,const unit* my_unit,
|
||||
const fighting_animation::hit_type hit,const attack_type*secondary_attack,int swing_num,int damage) const
|
||||
{
|
||||
//select one of the matching animations at random
|
||||
// Select one of the matching animations at random
|
||||
std::vector<const attack_animation*> options;
|
||||
int max_val = -3;
|
||||
for(std::vector<attack_animation>::const_iterator i = animation_.begin(); i != animation_.end(); ++i) {
|
||||
@ -241,7 +246,7 @@ bool attack_type::apply_modification(const config& cfg,std::string* description)
|
||||
return true;
|
||||
}
|
||||
|
||||
/* same as above, except only update the descriptions */
|
||||
// Same as above, except only update the descriptions
|
||||
bool attack_type::describe_modification(const config& cfg,std::string* description)
|
||||
{
|
||||
if(!matches_filter(cfg,0))
|
||||
@ -306,7 +311,7 @@ int unit_movement_type::movement_cost(const gamemap& map,
|
||||
return i->second;
|
||||
}
|
||||
|
||||
//if this is an alias, then select the best of all underlying terrains
|
||||
// If this is an alias, then select the best of all underlying terrains.
|
||||
const t_translation::t_list& underlying = map.underlying_mvt_terrain(terrain);
|
||||
if(underlying.size() != 1 || underlying.front() != terrain) {
|
||||
bool revert = (underlying.front() == t_translation::MINUS ? true : false);
|
||||
@ -382,7 +387,7 @@ int unit_movement_type::defense_modifier(const gamemap& map,
|
||||
return i->second;
|
||||
}
|
||||
|
||||
//if this is an alias, then select the best of all underlying terrains
|
||||
// If this is an alias, then select the best of all underlying terrains.
|
||||
const t_translation::t_list& underlying =
|
||||
map.underlying_def_terrain(terrain);
|
||||
|
||||
@ -529,9 +534,11 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
config nvar_cfg(cfg);
|
||||
nvar_cfg.merge_with(var_cfg);
|
||||
nvar_cfg.clear_children("variation");
|
||||
variations_.insert(std::pair<std::string,unit_type*>(nvar_cfg["variation_name"],new unit_type(nvar_cfg,mv_types,races,traits)));
|
||||
variations_.insert(std::pair<std::string,unit_type*>(nvar_cfg["variation_name"],
|
||||
new unit_type(nvar_cfg,mv_types,races,traits)));
|
||||
} else {
|
||||
variations_.insert(std::pair<std::string,unit_type*>((**var)["variation_name"],new unit_type(**var,mv_types,races,traits)));
|
||||
variations_.insert(std::pair<std::string,unit_type*>((**var)["variation_name"],
|
||||
new unit_type(**var,mv_types,races,traits)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -609,7 +616,7 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
race_ = &dummy_race;
|
||||
}
|
||||
|
||||
//insert any traits that are just for this unit type
|
||||
// Insert any traits that are just for this unit type
|
||||
const config::child_list& unit_traits = cfg.get_children("trait");
|
||||
possibleTraits_.insert(possibleTraits_.end(),unit_traits.begin(),unit_traits.end());
|
||||
|
||||
@ -686,7 +693,7 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
//lg::wml_error<<"standing animations are deprecate, support will be removed in 1.3.8 (in unit "<<id()<<")\n";
|
||||
//lg::wml_error<<"please put it with an [animation] tag and apply_to=standing flag\n";
|
||||
}
|
||||
// always have a standing animation
|
||||
// Always have a standing animation
|
||||
animations_.push_back(unit_animation(0,unit_frame(image(),0),"standing",-1));
|
||||
expanded_cfg = unit_animation::prepare_animation(cfg,"idle_anim");
|
||||
const config::child_list& idle_anims = expanded_cfg.get_children("idle_anim");
|
||||
@ -696,7 +703,7 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
//lg::wml_error<<"idling animations are deprecate, support will be removed in 1.3.8 (in unit "<<id()<<")\n";
|
||||
//lg::wml_error<<"please put it with an [animation] tag and apply_to=idling flag\n";
|
||||
}
|
||||
//idle anims can be empty
|
||||
// Idle anims can be empty
|
||||
expanded_cfg = unit_animation::prepare_animation(cfg,"levelin_anim");
|
||||
const config::child_list& levelin_anims = expanded_cfg.get_children("levelin_anim");
|
||||
for(config::child_list::const_iterator levelin_anim = levelin_anims.begin(); levelin_anim != levelin_anims.end(); ++levelin_anim) {
|
||||
@ -706,7 +713,7 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
//lg::wml_error<<"please put it with an [animation] tag and apply_to=levelin flag\n";
|
||||
}
|
||||
animations_.push_back(unit_animation(0,unit_frame(image(),600,"1.0","",display::rgb(255,255,255),"1~0:600"),"levelin",-1));
|
||||
// always have a levelin animation
|
||||
// Always have a levelin animation
|
||||
expanded_cfg = unit_animation::prepare_animation(cfg,"levelout_anim");
|
||||
const config::child_list& levelout_anims = expanded_cfg.get_children("levelout_anim");
|
||||
for(config::child_list::const_iterator levelout_anim = levelout_anims.begin(); levelout_anim != levelout_anims.end(); ++levelout_anim) {
|
||||
@ -716,7 +723,7 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
//lg::wml_error<<"please put it with an [animation] tag and apply_to=levelout flag\n";
|
||||
}
|
||||
animations_.push_back(unit_animation(0,unit_frame(image(),600,"1.0","",display::rgb(255,255,255),"0~1:600"),"levelin",-1));
|
||||
// always have a levelout animation
|
||||
// Always have a levelout animation
|
||||
expanded_cfg = unit_animation::prepare_animation(cfg,"healing_anim");
|
||||
const config::child_list& healing_anims = expanded_cfg.get_children("healing_anim");
|
||||
for(config::child_list::const_iterator healing_anim = healing_anims.begin(); healing_anim != healing_anims.end(); ++healing_anim) {
|
||||
@ -727,7 +734,7 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
//lg::wml_error<<"please put it with an [animation] tag and apply_to=healing flag\n";
|
||||
}
|
||||
animations_.push_back(unit_animation(0,unit_frame(image(),500),"healing",-1));
|
||||
// always have a healing animation
|
||||
// Always have a healing animation
|
||||
expanded_cfg = unit_animation::prepare_animation(cfg,"healed_anim");
|
||||
const config::child_list& healed_anims = expanded_cfg.get_children("healed_anim");
|
||||
for(config::child_list::const_iterator healed_anim = healed_anims.begin(); healed_anim != healed_anims.end(); ++healed_anim) {
|
||||
@ -738,7 +745,7 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
//lg::wml_error<<"please put it with an [animation] tag and apply_to=healed flag\n";
|
||||
}
|
||||
animations_.push_back(unit_animation(0,unit_frame(image(),240,"1.0","",display::rgb(255,255,255),"0:30,0.5:30,0:30,0.5:30,0:30,0.5:30,0:30,0.5:30,0:30"),"healed",-1));
|
||||
// always have a healed animation
|
||||
// Always have a healed animation
|
||||
expanded_cfg = unit_animation::prepare_animation(cfg,"poison_anim");
|
||||
const config::child_list& poison_anims = expanded_cfg.get_children("poison_anim");
|
||||
for(config::child_list::const_iterator poison_anim = poison_anims.begin(); poison_anim != poison_anims.end(); ++poison_anim) {
|
||||
@ -749,9 +756,7 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
//lg::wml_error<<"please put it with an [animation] tag and apply_to=poison flag\n";
|
||||
}
|
||||
animations_.push_back(unit_animation(0,unit_frame(image(),240,"1.0","",display::rgb(0,255,0),"0:30,0.5:30,0:30,0.5:30,0:30,0.5:30,0:30,0.5:30"),"poison",-1));
|
||||
// always have a poison animation
|
||||
|
||||
|
||||
// Always have a poison animation
|
||||
|
||||
|
||||
|
||||
@ -762,7 +767,7 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
}
|
||||
if(defensive_animations_.empty()) {
|
||||
defensive_animations_.push_back(defensive_animation(-150,unit_frame(image(),300)));
|
||||
// always have a defensive animation
|
||||
// Always have a defensive animation
|
||||
}
|
||||
|
||||
expanded_cfg = unit_animation::prepare_animation(cfg,"teleport_anim");
|
||||
@ -772,7 +777,7 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
}
|
||||
if(teleport_animations_.empty()) {
|
||||
teleport_animations_.push_back(unit_animation(-20,unit_frame(image(),40)));
|
||||
// always have a defensive animation
|
||||
// Always have a defensive animation
|
||||
}
|
||||
expanded_cfg = unit_animation::prepare_animation(cfg,"extra_anim");
|
||||
const config::child_list& extra_anims = expanded_cfg.get_children("extra_anim");
|
||||
@ -789,7 +794,7 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
}
|
||||
if(death_animations_.empty()) {
|
||||
death_animations_.push_back(death_animation(0,unit_frame(image(),10)));
|
||||
// always have a defensive animation
|
||||
// Always have a defensive animation
|
||||
}
|
||||
|
||||
expanded_cfg = unit_animation::prepare_animation(cfg,"movement_anim");
|
||||
@ -799,7 +804,7 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
}
|
||||
if(movement_animations_.empty()) {
|
||||
movement_animations_.push_back(movement_animation(0,unit_frame(image(),150)));
|
||||
// always have a movement animation
|
||||
// Always have a movement animation
|
||||
}
|
||||
|
||||
|
||||
@ -810,11 +815,11 @@ unit_type::unit_type(const config& cfg, const movement_type_map& mv_types,
|
||||
}
|
||||
if(victory_animations_.empty()) {
|
||||
victory_animations_.push_back(victory_animation(0,unit_frame(image(),1)));
|
||||
// always have a victory animation
|
||||
// Always have a victory animation
|
||||
}
|
||||
flag_rgb_ = cfg["flag_rgb"];
|
||||
game_config::add_color_info(cfg);
|
||||
// deprecation messages, only seen when unit is parsed for the first time
|
||||
// Deprecation messages, only seen when unit is parsed for the first time.
|
||||
|
||||
hide_help_= cfg_["hide_help"] == "true" ? true : false;
|
||||
}
|
||||
@ -855,7 +860,7 @@ const std::string& unit_type::id() const
|
||||
id_ = unit_id_test(cfg_["id"]);
|
||||
|
||||
if(id_.empty()) {
|
||||
// this code is only for compatibility with old unit defs and savefiles
|
||||
// This code is only for compatibility with old unit defs and savefiles.
|
||||
id_ = unit_id_test(cfg_["name"]);
|
||||
}
|
||||
|
||||
@ -1013,12 +1018,12 @@ void unit_type::add_advancement(const unit_type &to_unit,int xp)
|
||||
const std::string &to_id = to_unit.cfg_["id"];
|
||||
const std::string &from_id = cfg_["id"];
|
||||
|
||||
// add extra advancement path to this unit type
|
||||
// Add extra advancement path to this unit type
|
||||
lg::info(lg::config) << "adding advancement from " << from_id << " to " << to_id << "\n";
|
||||
advances_to_.push_back(to_id);
|
||||
if(xp>0 && experience_needed_>xp) experience_needed_=xp;
|
||||
|
||||
// add advancements to gendered subtypes, if supported by to_unit
|
||||
// Add advancements to gendered subtypes, if supported by to_unit
|
||||
for(int gender=0; gender<=1; ++gender) {
|
||||
if(gender_types_[gender] == NULL) continue;
|
||||
if(to_unit.gender_types_[gender] == NULL) {
|
||||
@ -1029,10 +1034,10 @@ void unit_type::add_advancement(const unit_type &to_unit,int xp)
|
||||
gender_types_[gender]->add_advancement(*(to_unit.gender_types_[gender]),xp);
|
||||
}
|
||||
|
||||
// add advancements to variation subtypes
|
||||
// since these are still a rare and special-purpose feature,
|
||||
// Add advancements to variation subtypes.
|
||||
// Since these are still a rare and special-purpose feature,
|
||||
// we assume that the unit designer knows what they're doing,
|
||||
// and don't block advancements that would remove a variation
|
||||
// and don't block advancements that would remove a variation.
|
||||
for(variations_map::iterator v=variations_.begin();
|
||||
v!=variations_.end(); ++v) {
|
||||
lg::info(lg::config) << "variation advancement: ";
|
||||
@ -1080,7 +1085,7 @@ void game_data::set_config(const config& cfg)
|
||||
}
|
||||
else
|
||||
{
|
||||
//LOAD UNIT TYPES
|
||||
// LOAD UNIT TYPES
|
||||
const unit_type u_type(**i.first,movement_types,races,unit_traits);
|
||||
unit_types.insert(std::pair<std::string,unit_type>(u_type.id(),u_type));
|
||||
increment_set_config_progress();
|
||||
@ -1099,7 +1104,7 @@ void game_data::set_config(const config& cfg)
|
||||
unit_type_map::iterator from_unit = unit_types.find(based_from);
|
||||
if(from_unit != unit_types.end())
|
||||
{
|
||||
//derive a new unit type from an existing base unit id
|
||||
// Derive a new unit type from an existing base unit id
|
||||
config merge_cfg(from_unit->second.cfg_);
|
||||
merge_cfg.merge_with(**i.first);
|
||||
merge_cfg.clear_children("base_unit");
|
||||
@ -1118,7 +1123,7 @@ void game_data::set_config(const config& cfg)
|
||||
}
|
||||
}
|
||||
}
|
||||
//if we iterate through the whole list and no work was done, an error has occurred
|
||||
// If we iterate through the whole list and no work was done, an error has occurred
|
||||
if(new_count >= base_unit_count)
|
||||
{
|
||||
lg::warn(lg::config) << "unknown unit(s) " << skipped
|
||||
@ -1131,7 +1136,7 @@ void game_data::set_config(const config& cfg)
|
||||
}
|
||||
}
|
||||
|
||||
// fix up advance_from references
|
||||
// Fix up advance_from references
|
||||
for(i = cfg.child_range("unit"); i.first != i.second; ++i.first)
|
||||
{
|
||||
config::const_child_itors af;
|
||||
|
Loading…
x
Reference in New Issue
Block a user