Fixed display of negative "expected" values. Cleaned code and fixed typos.

This commit is contained in:
Guillaume Melquiond 2009-03-09 18:17:10 +00:00
parent 5badc71597
commit c0e48a5692
4 changed files with 81 additions and 78 deletions

View file

@ -962,7 +962,7 @@ attack::attack(game_display& gui, const gamemap& map,
const double attacker_inflict = static_cast<double>(d_.get_unit().hitpoints()) - defender.average_hp();
const double defender_inflict = static_cast<double>(a_.get_unit().hitpoints()) - attacker.average_hp();
attack_stats.attack_excepted_damage(attacker_inflict,defender_inflict);
attack_stats.attack_expected_damage(attacker_inflict,defender_inflict);
}
a_.orig_attacks_ = a_stats_->num_blows;

View file

@ -87,10 +87,10 @@ std::vector<scenario_stats> master_stats;
} // end anon namespace
static stats& get_stats(std::string save_id)
static stats &get_stats(const std::string &save_id)
{
if(master_stats.empty()) {
master_stats.push_back(scenario_stats(""));
master_stats.push_back(scenario_stats(std::string()));
}
std::map<std::string,stats>& team_stats = master_stats.back().team_stats;
@ -504,96 +504,101 @@ stats& attack_context::defender_stats()
return get_stats(defender_side);
}
void attack_context::attack_excepted_damage(double attacker_inflict_, double defender_inflict_)
void attack_context::attack_expected_damage(double attacker_inflict_, double defender_inflict_)
{
const long long attacker_inflict = static_cast<long long>(attacker_inflict_ * stats::desimal_shift);
const long long defender_inflict = static_cast<long long>(defender_inflict_ * stats::desimal_shift);
attacker_stats().new_expected_damage_inflicted += attacker_inflict;
attacker_stats().new_expected_damage_taken += defender_inflict;
defender_stats().new_expected_damage_inflicted += defender_inflict;
defender_stats().new_expected_damage_taken += attacker_inflict;
attacker_stats().new_turn_expected_damage_inflicted += attacker_inflict;
attacker_stats().new_turn_expected_damage_taken += defender_inflict;
defender_stats().new_turn_expected_damage_inflicted += defender_inflict;
defender_stats().new_turn_expected_damage_taken += attacker_inflict;
int attacker_inflict = static_cast<int>(attacker_inflict_ * stats::decimal_shift);
int defender_inflict = static_cast<int>(defender_inflict_ * stats::decimal_shift);
stats &att_stats = attacker_stats(), &def_stats = defender_stats();
att_stats.new_expected_damage_inflicted += attacker_inflict;
att_stats.new_expected_damage_taken += defender_inflict;
def_stats.new_expected_damage_inflicted += defender_inflict;
def_stats.new_expected_damage_taken += attacker_inflict;
att_stats.new_turn_expected_damage_inflicted += attacker_inflict;
att_stats.new_turn_expected_damage_taken += defender_inflict;
def_stats.new_turn_expected_damage_inflicted += defender_inflict;
def_stats.new_turn_expected_damage_taken += attacker_inflict;
}
void attack_context::attack_result(attack_context::ATTACK_RESULT res, long long damage, long long drain)
void attack_context::attack_result(hit_result res, int damage, int drain)
{
if(stats_disabled > 0)
return;
attacker_res.push_back(res == MISSES ? '0' : '1');
stats &att_stats = attacker_stats(), &def_stats = defender_stats();
if(res != MISSES) {
// handle drain
attacker_stats().damage_taken -= drain;
defender_stats().damage_inflicted -= drain;
attacker_stats().turn_damage_taken -= drain;
defender_stats().turn_damage_inflicted -= drain;
att_stats.damage_taken -= drain;
def_stats.damage_inflicted -= drain;
att_stats.turn_damage_taken -= drain;
def_stats.turn_damage_inflicted -= drain;
attacker_stats().damage_inflicted += damage;
defender_stats().damage_taken += damage;
attacker_stats().turn_damage_inflicted += damage;
defender_stats().turn_damage_taken += damage;
att_stats.damage_inflicted += damage;
def_stats.damage_taken += damage;
att_stats.turn_damage_inflicted += damage;
def_stats.turn_damage_taken += damage;
}
const int exp_damage = damage * chance_to_hit_defender * 10;
const int exp_drain = drain * chance_to_hit_defender * 10;
attacker_stats().expected_damage_taken -= exp_drain;
defender_stats().expected_damage_inflicted -= exp_drain;
attacker_stats().turn_expected_damage_taken -= exp_drain;
defender_stats().turn_expected_damage_inflicted -= exp_drain;
int exp_damage = damage * chance_to_hit_defender * (stats::decimal_shift / 100);
int exp_drain = drain * chance_to_hit_defender * (stats::decimal_shift / 100);
att_stats.expected_damage_taken -= exp_drain;
def_stats.expected_damage_inflicted -= exp_drain;
att_stats.turn_expected_damage_taken -= exp_drain;
def_stats.turn_expected_damage_inflicted -= exp_drain;
// handle drain
attacker_stats().expected_damage_inflicted += exp_damage;
defender_stats().expected_damage_taken += exp_damage;
attacker_stats().turn_expected_damage_inflicted += exp_damage;
defender_stats().turn_expected_damage_taken += exp_damage;
att_stats.expected_damage_inflicted += exp_damage;
def_stats.expected_damage_taken += exp_damage;
att_stats.turn_expected_damage_inflicted += exp_damage;
def_stats.turn_expected_damage_taken += exp_damage;
if(res == KILLS) {
attacker_stats().killed[defender_type]++;
defender_stats().deaths[defender_type]++;
++att_stats.killed[defender_type];
++def_stats.deaths[defender_type];
}
}
void attack_context::defend_result(attack_context::ATTACK_RESULT res, long long damage, long long drain)
void attack_context::defend_result(hit_result res, int damage, int drain)
{
if(stats_disabled > 0)
return;
defender_res.push_back(res == MISSES ? '0' : '1');
stats &att_stats = attacker_stats(), &def_stats = defender_stats();
if(res != MISSES) {
//handle drain
defender_stats().damage_taken -= drain;
attacker_stats().damage_inflicted -= drain;
defender_stats().turn_damage_taken -= drain;
attacker_stats().turn_damage_inflicted -= drain;
def_stats.damage_taken -= drain;
att_stats.damage_inflicted -= drain;
def_stats.turn_damage_taken -= drain;
att_stats.turn_damage_inflicted -= drain;
attacker_stats().damage_taken += damage;
defender_stats().damage_inflicted += damage;
attacker_stats().turn_damage_taken += damage;
defender_stats().turn_damage_inflicted += damage;
att_stats.damage_taken += damage;
def_stats.damage_inflicted += damage;
att_stats.turn_damage_taken += damage;
def_stats.turn_damage_inflicted += damage;
}
const long long exp_damage = damage * chance_to_hit_attacker * 10;
const long long exp_drain = drain * chance_to_hit_attacker * 10;
//handle drain
defender_stats().expected_damage_taken -= exp_drain;
attacker_stats().expected_damage_inflicted -= exp_drain;
defender_stats().turn_expected_damage_taken -= exp_drain;
attacker_stats().turn_expected_damage_inflicted -= exp_drain;
attacker_stats().expected_damage_taken += exp_damage;
defender_stats().expected_damage_inflicted += exp_damage;
attacker_stats().turn_expected_damage_taken += exp_damage;
defender_stats().turn_expected_damage_inflicted += exp_damage;
int exp_damage = damage * chance_to_hit_attacker * (stats::decimal_shift / 100);
int exp_drain = drain * chance_to_hit_attacker * (stats::decimal_shift / 100);
//handle drain
def_stats.expected_damage_taken -= exp_drain;
att_stats.expected_damage_inflicted -= exp_drain;
def_stats.turn_expected_damage_taken -= exp_drain;
att_stats.turn_expected_damage_inflicted -= exp_drain;
att_stats.expected_damage_taken += exp_damage;
def_stats.expected_damage_inflicted += exp_damage;
att_stats.turn_expected_damage_taken += exp_damage;
def_stats.turn_expected_damage_inflicted += exp_damage;
if(res == KILLS) {
attacker_stats().deaths[attacker_type]++;
defender_stats().killed[attacker_type]++;
++att_stats.deaths[attacker_type];
++def_stats.killed[attacker_type];
}
}

View file

@ -54,7 +54,7 @@ namespace statistics
long long damage_inflicted, damage_taken;
long long turn_damage_inflicted, turn_damage_taken;
static const long long desimal_shift = 1000;
static const int decimal_shift = 1000;
// Expected value for damage inflicted/taken * 1000, based on
// probability to hit,
@ -92,11 +92,11 @@ namespace statistics
attack_context(const unit& a, const unit& d, int a_cth, int d_cth);
~attack_context();
enum ATTACK_RESULT { MISSES, HITS, KILLS };
enum hit_result { MISSES, HITS, KILLS };
void attack_excepted_damage(double attacker_inflict, double defender_inflict);
void attack_result(ATTACK_RESULT res, long long damage, long long drain);
void defend_result(ATTACK_RESULT res, long long damage, long long drain);
void attack_expected_damage(double attacker_inflict, double defender_inflict);
void attack_result(hit_result res, int damage, int drain);
void defend_result(hit_result res, int damage, int drain);
private:

View file

@ -195,28 +195,26 @@ void statistics_dialog::make_damage_line(std::vector<std::string>& items,
const long long& turn_damage,
const long long& turn_expected)
{
const int dsa = statistics::stats::desimal_shift * damage
- expected;
const int dst = statistics::stats::desimal_shift * turn_damage
- turn_expected;
int shift = statistics::stats::decimal_shift;
std::stringstream str;
int dsa = shift * damage - expected;
int dst = shift * turn_damage - turn_expected;
std::ostringstream str;
str << header << COLUMN_SEPARATOR
<< damage << " / "
<< (expected/100 / (double)statistics::stats::desimal_shift * 100.0)
<< (expected * 10 + shift / 2) / shift * 0.1
<< COLUMN_SEPARATOR
<< ((dsa > 0) ? "+" : "")
<< ((expected == 0) ? 0
: 100 * dsa / expected)
<< "%" << COLUMN_SEPARATOR
<< ((dsa < 0) ^ (expected < 0) ? "" : "+")
<< (expected == 0 ? 0 : 100 * dsa / expected)
<< '%' << COLUMN_SEPARATOR
<< COLUMN_SEPARATOR
<< turn_damage << " / "
<< (turn_expected/100 / (double)statistics::stats::desimal_shift * 100.0)
<< (turn_expected * 10 + shift / 2) / shift * 0.1
<< COLUMN_SEPARATOR
<< ((dst > 0) ? "+" : "")
<< ((turn_expected == 0) ? 0
: 100 * dst / turn_expected)
<< "%";
<< ((dst < 0) ^ (turn_expected < 0) ? "" : "+")
<< (turn_expected == 0 ? 0 : 100 * dst / turn_expected)
<< '%';
items.push_back(str.str());
}