Author: dragonking
Date: Fri Jul 11 21:27:56 2008
New Revision: 27915
URL: http://svn.gna.org/viewcvs/wesnoth?rev=27915&view=rev
Log:
* New class: attack_type_callable
* Added new unit_callable members: undead, attacks, abilities, traits
* Added new unit_type_callable members: undead, attacks, abilities
Modified:
trunk/src/callable_objects.cpp
trunk/src/callable_objects.hpp
Modified: trunk/src/callable_objects.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/callable_objects.cpp?rev=27915&r1=27914&r2=27915&view=diff
==============================================================================
--- trunk/src/callable_objects.cpp (original)
+++ trunk/src/callable_objects.cpp Fri Jul 11 21:27:56 2008
@@ -74,6 +74,56 @@
{
using game_logic::FORMULA_READ_ONLY;
inputs->push_back(game_logic::formula_input("moves",
FORMULA_READ_ONLY));
+}
+
+variant attack_type_callable::get_value(const std::string& key) const
+{
+
+ if(key == "id") {
+ return variant(att_.id());
+ } else if(key == "type") {
+ return variant(att_.type());
+ } else if(key == "range") {
+ return variant(att_.range());
+ } else if(key == "damage") {
+ return variant(att_.damage());
+ } else if(key == "number_of_attacks") {
+ return variant(att_.num_attacks());
+ } else if(key == "specials") {
+ std::string specials = att_.weapon_specials(true);
+ //specials are comma-separated, now it is time to put them into
vector
+ std::vector<variant> res;
+
+ if(specials == "")
+ return variant( &res );
+
+ std::string::iterator tmp_it = specials.begin()-1;
+ for( std::string::iterator it = specials.begin(); it !=
specials.end(); ++it)
+ {
+ if (*it == ',')
+ {
+ res.push_back( variant( std::string(tmp_it+1,
it) ));
+ tmp_it = it;
+ }
+ }
+ if(tmp_it != specials.end())
+ res.push_back( variant( std::string(tmp_it+1,
specials.end() )));
+
+ return variant( &res );
+ }
+
+ return variant();
+}
+
+void attack_type_callable::get_inputs(std::vector<game_logic::formula_input>*
inputs) const
+{
+ using game_logic::FORMULA_READ_ONLY;
+ inputs->push_back(game_logic::formula_input("id", FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("type", FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("range",
FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("damage",
FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("number_of_attacks",
FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("specials",
FORMULA_READ_ONLY));
}
variant unit_callable::get_value(const std::string& key) const
@@ -90,6 +140,48 @@
return variant(u_.type_id());
} else if(key == "leader") {
return variant(u_.can_recruit());
+ } else if(key == "undead") {
+ //undead is a trait, so we need to look if this unit has it
+ std::string traits = u_.traits_description();
+
+ if(traits == "")
+ return variant(0);
+
+ std::string::iterator tmp_it = traits.begin()-1;
+ for( std::string::iterator it = traits.begin(); it !=
traits.end(); ++it)
+ {
+ if (*it == ',')
+ {
+ if( std::string(tmp_it+1, it) == "undead" )
+ return variant(1);
+ tmp_it = it;
+ }
+ }
+ if(tmp_it != traits.end())
+ if( std::string(tmp_it+1, traits.end()) == "undead" )
+ return variant(1);
+
+ return variant( 0 );
+ } else if(key == "attacks") {
+ const std::vector<attack_type>& att = u_.attacks();
+ std::vector<variant> res;
+
+ for( std::vector<attack_type>::const_iterator i = att.begin();
i != att.end(); ++i)
+ res.push_back(variant(new attack_type_callable(*i)));
+ return variant(&res);
+ } else if(key == "abilities") {
+ // for now use unit_ability_tooltips() to get simply list of
abilities
+ // but it is definiately good idea to find another way of
obtaining this list
+ std::vector<std::string> abilities = u_.unit_ability_tooltips();
+ std::vector<variant> res;
+
+ for (std::vector<std::string>::iterator it = abilities.begin();
it != abilities.end(); it+=2)
+ {
+ if(it+1 == abilities.end())
+ return variant( &res );
+ res.push_back( variant(*it) );
+ }
+ return variant( &res );
} else if(key == "hitpoints") {
return variant(u_.hitpoints());
} else if(key == "max_hitpoints") {
@@ -104,6 +196,27 @@
return variant(u_.total_movement());
} else if(key == "movement_left") {
return variant(u_.movement_left());
+ } else if(key == "traits") {
+ std::string traits = u_.traits_description();
+ //traits are comma-separated, now it is time to put them into
vector
+ std::vector<variant> res;
+
+ if(traits == "")
+ return variant( &res );
+
+ std::string::iterator tmp_it = traits.begin()-1;
+ for( std::string::iterator it = traits.begin(); it !=
traits.end(); ++it)
+ {
+ if (*it == ',')
+ {
+ res.push_back( variant( std::string(tmp_it+1,
it) ));
+ tmp_it = it;
+ }
+ }
+ if(tmp_it != traits.end())
+ res.push_back( variant( std::string(tmp_it+1,
traits.end() )));
+
+ return variant( &res );
} else if(key == "side") {
return variant(u_.side()-1);
} else if(key == "cost") {
@@ -126,8 +239,12 @@
inputs->push_back(game_logic::formula_input("y", FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("loc", FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("id", FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("type", FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("leader",
FORMULA_READ_ONLY));
- inputs->push_back(game_logic::formula_input("type", FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("undead",
FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("traits",
FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("attacks",
FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("abilities",
FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("hitpoints",
FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("max_hitpoints",
FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("experience",
FORMULA_READ_ONLY));
@@ -148,6 +265,25 @@
return variant(u_.type_name());
} else if(key == "alignment") {
return variant(u_.alignment_id(u_.alignment()));
+ } else if(key == "abilities") {
+ const std::vector<t_string>& abilities = u_.abilities();
+ std::vector<variant> res;
+
+ if (abilities.empty())
+ return variant( &res );
+
+ for(std::vector<t_string>::const_iterator i =
abilities.begin(); i != abilities.end(); ++i)
+ {
+ res.push_back( variant( i->str() ));
+ }
+ return variant( &res );
+ } else if(key == "attacks") {
+ std::vector<attack_type> att = u_.attacks();
+ std::vector<variant> res;
+
+ for( std::vector<attack_type>::iterator i = att.begin(); i !=
att.end(); ++i)
+ res.push_back(variant(new attack_type_callable(*i)));
+ return variant(&res);
} else if(key == "hitpoints") {
return variant(u_.hitpoints());
} else if(key == "experience") {
@@ -156,6 +292,8 @@
return variant(u_.level());
} else if(key == "total_movement") {
return variant(u_.movement());
+ } else if(key == "undead") {
+ return variant(u_.not_living());
} else if(key == "cost") {
return variant(u_.cost());
} else {
@@ -169,10 +307,13 @@
inputs->push_back(game_logic::formula_input("id", FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("type", FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("alignment",
FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("abilities",
FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("attacks",
FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("hitpoints",
FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("experience",
FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("level",
FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("total_movement",
FORMULA_READ_ONLY));
+ inputs->push_back(game_logic::formula_input("undead",
FORMULA_READ_ONLY));
inputs->push_back(game_logic::formula_input("cost", FORMULA_READ_ONLY));
}
Modified: trunk/src/callable_objects.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/callable_objects.hpp?rev=27915&r1=27914&r2=27915&view=diff
==============================================================================
--- trunk/src/callable_objects.hpp (original)
+++ trunk/src/callable_objects.hpp Fri Jul 11 21:27:56 2008
@@ -139,6 +139,20 @@
const move_map& dstsrc() const { return dstsrc_; }
};
+class attack_type_callable : public game_logic::formula_callable {
+public:
+ typedef gamemap::location location;
+ attack_type_callable(const attack_type attack)
+ : att_(attack)
+ {}
+
+ const attack_type& get_attack_type() const { return att_; }
+ variant get_value(const std::string& key) const;
+ void get_inputs(std::vector<game_logic::formula_input>* inputs) const;
+private:
+ const attack_type att_;
+};
+
class unit_callable : public game_logic::formula_callable {
public:
typedef gamemap::location location;
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits