fix bugs #5908, #5914, and #5916; revert accidental changes to some unit cfgs

This commit is contained in:
Dominic Bolin 2006-05-07 18:37:58 +00:00
parent fbcda79ec4
commit 18063042bb
7 changed files with 51 additions and 161 deletions

View file

@ -52,7 +52,6 @@ Special Notes:"+{SPECIAL_NOTES_LEADERSHIP}
damage=9
number=4
#ifdef THE_ANIMATIONS_ARE_FINISHED
#endif
[animation]
hits=no
[frame]
@ -81,6 +80,7 @@ Special Notes:"+{SPECIAL_NOTES_LEADERSHIP}
sound={SOUND_LIST:SWORD_SWISH}
[/frame]
[/animation]
#endif
[/attack]
[attack]
name=crossbow
@ -89,7 +89,6 @@ Special Notes:"+{SPECIAL_NOTES_LEADERSHIP}
damage=7
number=3
#ifdef THE_ANIMATIONS_ARE_FINISHED
#endif
[animation]
hits=no
[missile_frame]
@ -120,5 +119,6 @@ Special Notes:"+{SPECIAL_NOTES_LEADERSHIP}
sound=crossbow.ogg
[/frame]
[/animation]
#endif
[/attack]
[/unit]

View file

@ -3,8 +3,6 @@
name= _ "Halberdier"
race=human
image="units/human-loyalists/halberdier.png"
#ifdef THE_ANIMATIONS_ARE_FINISHED
#endif
profile="portraits/core/Jason_Lutes/human-halberdier.png"
{MAGENTA_IS_THE_TEAM_COLOR}
hitpoints=72
@ -24,6 +22,7 @@ However, a halberd is notably more expensive to craft than a spear, and in the h
Special Notes:"+{SPECIAL_NOTES_FIRSTSTRIKE}
get_hit_sound=human-male-strong-hit.ogg
die_sound=human-male-strong-die.ogg
#ifdef THE_ANIMATIONS_ARE_FINISHED
[defend]
[frame]
begin=-150
@ -31,6 +30,7 @@ Special Notes:"+{SPECIAL_NOTES_FIRSTSTRIKE}
image="units/human-loyalists/halberdier-defend.png"
[/frame]
[/defend]
#endif
[resistance]
pierce=60
[/resistance]
@ -45,7 +45,6 @@ Special Notes:"+{SPECIAL_NOTES_FIRSTSTRIKE}
{WEAPON_SPECIAL_FIRSTSTRIKE}
[/specials]
#ifdef THE_ANIMATIONS_ARE_FINISHED
#endif
[animation]
direction=s
[frame]
@ -82,6 +81,7 @@ Special Notes:"+{SPECIAL_NOTES_FIRSTSTRIKE}
sound=spear.wav
[/frame]
[/animation]
#endif
[/attack]
[attack]
name=halberd
@ -91,7 +91,6 @@ Special Notes:"+{SPECIAL_NOTES_FIRSTSTRIKE}
damage=19
number=2
#ifdef THE_ANIMATIONS_ARE_FINISHED
#endif
[animation]
hits=no
[frame]
@ -130,5 +129,6 @@ Special Notes:"+{SPECIAL_NOTES_FIRSTSTRIKE}
image="units/human-loyalists/halberdier-pierce-se.png"
[/frame]
[/animation]
#endif
[/attack]
[/unit]

View file

@ -4,8 +4,8 @@
race=human
image="units/human-loyalists/lieutenant.png"
#ifdef THE_ANIMATIONS_ARE_FINISHED
#endif
image_leading="units/human-loyalists/lieutenant-leading.png"
#endif
#ifdef CAMPAIGN_EASTERN_INVASION
profile=portraits/gweddry.png
#endif
@ -42,7 +42,6 @@ Special Notes:"+{SPECIAL_NOTES_LEADERSHIP}
damage=9
number=3
#ifdef THE_ANIMATIONS_ARE_FINISHED
#endif
[animation]
[frame]
begin=-101
@ -51,6 +50,7 @@ Special Notes:"+{SPECIAL_NOTES_LEADERSHIP}
sound={SOUND_LIST:SWORD_SWISH}
[/frame]
[/animation]
#endif
[/attack]
[attack]
name=crossbow
@ -59,7 +59,6 @@ Special Notes:"+{SPECIAL_NOTES_LEADERSHIP}
damage=5
number=3
#ifdef THE_ANIMATIONS_ARE_FINISHED
#endif
[animation]
hits=no
[missile_frame]
@ -90,5 +89,6 @@ Special Notes:"+{SPECIAL_NOTES_LEADERSHIP}
sound=crossbow.ogg
[/frame]
[/animation]
#endif
[/attack]
[/unit]

View file

@ -82,7 +82,7 @@ unit::unit(const unit& u)
unit::unit(const game_data* gamedata, unit_map* unitmap, const gamemap* map,
const gamestatus* game_status, const std::vector<team>* teams,const config& cfg) :
movement_(0), hold_position_(false),resting_(false),
facing_(gamemap::location::NORTH_EAST),upkeep_(0),
facing_(gamemap::location::NORTH_EAST),
anim_(NULL),gamedata_(gamedata), units_(unitmap), map_(map),
gamestatus_(game_status),teams_(teams)
{
@ -100,7 +100,7 @@ unit::unit(const game_data* gamedata, unit_map* unitmap, const gamemap* map,
unit::unit(const game_data& gamedata,const config& cfg) : movement_(0),
hold_position_(false), resting_(false),
facing_(gamemap::location::NORTH_EAST),
upkeep_(0),anim_(NULL),unit_halo_(0),unit_anim_halo_(0),gamedata_(&gamedata),
anim_(NULL),unit_halo_(0),unit_anim_halo_(0),gamedata_(&gamedata),
units_(NULL),map_(NULL), gamestatus_(NULL)
{
read(cfg);
@ -260,7 +260,7 @@ void unit::advance_to(const unit_type* t)
language_name_ = t->language_name();
cfg_["unit_description"] = t->unit_description();
undead_variation_ = t->undead_variation();
max_experience_ = t->experience_needed();
max_experience_ = t->experience_needed(false);
level_ = t->level();
alignment_ = t->alignment();
alpha_ = t->alpha();
@ -386,7 +386,7 @@ int unit::experience() const
}
int unit::max_experience() const
{
return max_experience_;
return maximum<int>(1,(max_experience_*unit_type::experience_accelerator::get_acceleration() + 50) / 100);
}
int unit::level() const
{
@ -869,20 +869,9 @@ void unit::read(const config& cfg)
variation_ = cfg["variation"];
wassert(gamedata_ != NULL);
const race_map::const_iterator race_it = gamedata_->races.find(cfg["race"]);
if(race_it != gamedata_->races.end()) {
race_ = &race_it->second;
} else {
static const unit_race dummy_race;
race_ = &dummy_race;
}
description_ = cfg["unit_description"];
custom_unit_description_ = cfg["user_description"];
if(utils::string_bool(cfg["generate_description"])) {
custom_unit_description_ = generate_description();
}
underlying_description_ = cfg["description"];
if(description_.empty()) {
description_ = underlying_description_;
@ -909,12 +898,12 @@ void unit::read(const config& cfg)
name_ = cfg["name"];
language_name_ = cfg["language_name"];
undead_variation_ = cfg["undead_variation"];
variation_ = cfg["variation"];
flag_rgb_ = string2rgb(cfg["flag_rgb"]);
alpha_ = lexical_cast_default<fixed_t>(cfg["alpha"]);
level_ = lexical_cast_default<int>(cfg["level"]);
unit_value_ = lexical_cast_default<int>(cfg["value"]);
facing_ = gamemap::location::parse_direction(cfg["facing"]);
if(facing_ == gamemap::location::NDIRECTIONS) facing_ = gamemap::location::NORTH_EAST;
@ -924,9 +913,6 @@ void unit::read(const config& cfg)
recruits_.clear();
}
attacks_left_ = lexical_cast_default<int>(cfg["attacks_left"]);
max_attacks_ = lexical_cast_default<int>(cfg["max_attacks"],1);
emit_zoc_ = lexical_cast_default<int>(cfg["zoc"]);
unit_value_ = lexical_cast_default<int>(cfg["value"]);
const config* mod_desc = cfg.child("modifications_description");
if(mod_desc) {
for(string_map::const_iterator k = mod_desc->values.begin(); k != mod_desc->values.end(); ++k) {
@ -952,8 +938,7 @@ void unit::read(const config& cfg)
} else {
LOG_STREAM(err, engine) << "unit of type " << cfg["type"] << " not found!\n";
}
attacks_left_ = 1;
max_attacks_ = 1;
attacks_left_ = max_attacks_;
if(cfg["moves"]=="") {
movement_ = max_movement_;
}
@ -967,6 +952,22 @@ void unit::read(const config& cfg)
} else {
id_ = cfg_["id"];
}
if(!type_set || cfg["race"] != "") {
const race_map::const_iterator race_it = gamedata_->races.find(cfg["race"]);
if(race_it != gamedata_->races.end()) {
race_ = &race_it->second;
} else {
static const unit_race dummy_race;
race_ = &dummy_race;
}
}
variation_ = cfg["variation"];
if(!type_set || cfg["max_attacks"] != "") {
max_attacks_ = minimum<int>(1,lexical_cast_default<int>(cfg["max_attacks"]));
}
if(!type_set || cfg["zoc"] != "") {
emit_zoc_ = lexical_cast_default<int>(cfg["zoc"]);
}
if(cfg["max_hitpoints"] != "") {
max_hit_points_ = lexical_cast_default<int>(cfg["max_hitpoints"]);
}
@ -1029,6 +1030,10 @@ void unit::read(const config& cfg)
} else if(cfg["type"]=="") {
alignment_ = unit_type::NEUTRAL;
}
if(utils::string_bool(cfg["generate_description"])) {
custom_unit_description_ = generate_description();
}
if(!type_set) {
const config::child_list& defends = cfg_.get_children("defend");
for(config::child_list::const_iterator d = defends.begin(); d != defends.end(); ++d) {
@ -2100,11 +2105,7 @@ void unit::add_modification(const std::string& type, const config& mod,
variation_ = (**i.first)["name"];
wassert(gamedata_ != NULL);
const game_data::unit_type_map::const_iterator var = gamedata_->unit_types.find(id());
advance_to(&var->second);
// type_ = &type_->get_variation(variation_);
// reset_modifications();
// apply_modifications();
// wassert("not done" == "done");
advance_to(&var->second.get_variation(variation_));
} else if(apply_to == "new_attack") {
attacks_.push_back(attack_type(**i.first,id(),image_fighting((**i.first)["range"]=="ranged" ? attack_type::LONG_RANGE : attack_type::SHORT_RANGE)));
} else if(apply_to == "attack") {
@ -2210,8 +2211,7 @@ void unit::add_modification(const std::string& type, const config& mod,
max_experience_ = 1;
}
} else if(apply_to == "loyal") {
if(upkeep_ > 0)
upkeep_ = 0;
cfg_["upkeep"] = "loyal";
} else if(apply_to == "status") {
const std::string& add = (**i.first)["add"];
const std::string& remove = (**i.first)["remove"];

View file

@ -326,7 +326,6 @@ class unit
t_string traits_description_;
int unit_value_;
gamemap::location goto_, interrupted_move_;
int upkeep_;
bool flying_;
// std::map<gamemap::TERRAIN,int> movement_costs_, movement_costs_b_;

View file

@ -608,109 +608,6 @@ const std::map<gamemap::TERRAIN,int>& unit_movement_type::defense_mods() const
}
ability_filter::ability_filter()
{
// we add a null string to prevent the filter to be empty
terrain_filter_chaotic.push_back("");
terrain_filter_neutral.push_back("");
terrain_filter_lawful.push_back("");
}
bool ability_filter::matches_filter(const std::string& terrain, int lawful_bonus) const
{
const std::vector<std::string>* terrain_filter;
if (lawful_bonus < 0) {
terrain_filter = &terrain_filter_chaotic;
} else if (lawful_bonus == 0) {
terrain_filter = &terrain_filter_neutral;
} else {
terrain_filter = &terrain_filter_lawful;
}
if (terrain_filter->empty()) {
return true;
} else {
for (std::string::const_iterator i = terrain.begin(); i != terrain.end(); ++i) {
std::string t(1,*i);
if (std::find(terrain_filter->begin(),terrain_filter->end(),t) != terrain_filter->end())
return true;
}
return false;
}
}
void ability_filter::unfilter()
{
terrain_filter_chaotic.clear();
terrain_filter_neutral.clear();
terrain_filter_lawful.clear();
}
void ability_filter::add_terrain_filter(const std::string& terrains)
{
std::vector<std::string> add_to_filter = utils::split(terrains);
for (std::vector<std::string>::const_iterator t = add_to_filter.begin(); t != add_to_filter.end(); ++t) {
terrain_filter_chaotic.push_back(*t);
terrain_filter_neutral.push_back(*t);
terrain_filter_lawful.push_back(*t);
}
}
void ability_filter::add_tod_filter(const std::string& times)
{
std::vector<std::string> add_to_filter = utils::split(times);
for (std::vector<std::string>::const_iterator t = add_to_filter.begin(); t != add_to_filter.end(); ++t) {
if (*t == "chaotic") {
terrain_filter_chaotic.clear();
} else if (*t == "neutral") {
terrain_filter_neutral.clear();
} else if (*t == "lawful") {
terrain_filter_lawful.clear();
} else {
LOG_STREAM(err, config) << "Unknown time of day type : " << *t << "\n";
}
}
}
void ability_filter::add_filters(const config* cfg)
{
if (cfg) {
std::string tods =(*cfg)["tod"];
std::string terrains =(*cfg)["terrains"];
if (tods == "" && terrains == "") {
unfilter();
return;
} else if (tods == "") {
add_terrain_filter(terrains);
return;
} else if (terrains == "") {
add_tod_filter(tods);
return;
} else {
std::vector<std::string> tod_slices = utils::split(tods);
for (std::vector<std::string>::const_iterator td = tod_slices.begin(); td != tod_slices.end(); ++td) {
std::vector<std::string>* terrain_filter;
if (*td == "chaotic") {
terrain_filter= &terrain_filter_chaotic;
} else if (*td == "neutral") {
terrain_filter= &terrain_filter_neutral;
} else if (*td == "lawful") {
terrain_filter= &terrain_filter_lawful;
} else {
LOG_STREAM(err, config) << "Unknown time of day type : " << *td << "\n";
continue;
}
std::vector<std::string> terrain_slices = utils::split(terrains);
for (std::vector<std::string>::const_iterator te = terrain_slices.begin(); te != terrain_slices.end(); ++te) {
terrain_filter->push_back(*te);
}
}
}
} else {
unfilter();
}
}
unit_type::unit_type(const unit_type& o)
: variations_(o.variations_), cfg_(o.cfg_), race_(o.race_),
alpha_(o.alpha_), abilities_(o.abilities_),ability_tooltips_(o.ability_tooltips_),
@ -1082,11 +979,19 @@ unit_type::experience_accelerator::~experience_accelerator()
experience_modifier = old_value_;
}
int unit_type::experience_needed() const
int unit_type::experience_accelerator::get_acceleration()
{
int exp = (experience_needed_ * experience_modifier + 50) /100;
if(exp < 1) exp = 1;
return exp;
return experience_modifier;
}
int unit_type::experience_needed(bool with_acceleration) const
{
if(with_acceleration) {
int exp = (experience_needed_ * experience_modifier + 50) /100;
if(exp < 1) exp = 1;
return exp;
}
return experience_needed_;
}
std::vector<std::string> unit_type::advances_to() const

View file

@ -153,21 +153,6 @@ private:
typedef std::map<std::string,unit_movement_type> movement_type_map;
class ability_filter
{
public:
ability_filter();
bool matches_filter(const std::string& terrain, int lawful_bonus) const;
void add_filters(const config* cfg);
void add_terrain_filter(const std::string& terrains);
void add_tod_filter(const std::string& times);
void unfilter();
private:
std::vector<std::string> terrain_filter_chaotic;
std::vector<std::string> terrain_filter_neutral;
std::vector<std::string> terrain_filter_lawful;
};
class unit_type
{
public:
@ -211,7 +196,7 @@ public:
std::vector<attack_type> attacks() const;
const unit_movement_type& movement_type() const;
int experience_needed() const;
int experience_needed(bool with_acceleration=true) const;
std::vector<std::string> advances_to() const;
const config::child_list& modification_advancements() const;
const std::string& usage() const;
@ -219,6 +204,7 @@ public:
struct experience_accelerator {
experience_accelerator(int modifier);
~experience_accelerator();
static int get_acceleration();
private:
int old_value_;
};