Move encumbrance calculation functions into cPlayer

This commit is contained in:
2019-11-24 13:37:54 -05:00
parent 060be4dd42
commit 3302dd68b7
9 changed files with 42 additions and 44 deletions

View File

@@ -55,7 +55,7 @@ short store_sum_monst_cost;
extern cUniverse univ;
location out_start_loc(20,23);
short hit_chance[51] = {
std::array<short, 51> hit_chance = {
20,30,40,45,50,55,60,65,69,73,
77,81,84,87,90,92,94,96,97,98,99
,99,99,99,99,99,99,99,99,99,99
@@ -534,7 +534,7 @@ void pc_attack(short who_att,iLiving* target) {
auto& weap2 = weapons.second;
hit_adj = (-5 * minmax(-8,8,attacker.status[eStatus::BLESS_CURSE])) + 5 * minmax(-8,8,target->status[eStatus::BLESS_CURSE])
- attacker.stat_adj(eSkill::DEXTERITY) * 5 + (get_encumbrance(who_att)) * 5;
- attacker.stat_adj(eSkill::DEXTERITY) * 5 + (attacker.total_encumbrance(hit_chance)) * 5;
dam_adj = minmax(-8,8,attacker.status[eStatus::BLESS_CURSE]) - minmax(-8,8,target->status[eStatus::BLESS_CURSE])
+ attacker.stat_adj(eSkill::STRENGTH);
@@ -4692,7 +4692,7 @@ bool combat_cast_mage_spell() {
add_string_to_buf("Cast: No spell points.");
else if(univ.current_pc().skill(eSkill::MAGE_SPELLS) == 0)
add_string_to_buf("Cast: No mage skill.");
else if(get_encumbrance(univ.cur_pc) > 1) {
else if(univ.current_pc().total_encumbrance(hit_chance) > 1) {
add_string_to_buf("Cast: Too encumbered.");
take_ap(6);
give_help(40,0);

View File

@@ -347,7 +347,7 @@ static void display_pc_info(cDialog& me, const short pc) {
me[boost::lexical_cast<std::string>(skill)].setText(to_draw.str());
to_draw.str("");
}
me["encumb"].setTextToNum(total_encumbrance(pc));
me["encumb"].setTextToNum(univ.party[pc].armor_encumbrance());
me["name"].setText(univ.party[pc].name);
me["lvl"].setTextToNum(univ.party[pc].level);
me["xp"].setTextToNum(univ.party[pc].experience);
@@ -363,7 +363,7 @@ static void display_pc_info(cDialog& me, const short pc) {
auto& weap1 = weapons.first;
auto& weap2 = weapons.second;
hit_adj = univ.party[pc].stat_adj(eSkill::DEXTERITY) * 5 - (total_encumbrance(pc)) * 5
hit_adj = univ.party[pc].stat_adj(eSkill::DEXTERITY) * 5 - (univ.party[pc].armor_encumbrance()) * 5
+ 5 * minmax(-8,8,univ.party[pc].status[eStatus::BLESS_CURSE]);
if(!univ.party[pc].traits[eTrait::AMBIDEXTROUS] && weap2)
hit_adj -= 25;

View File

@@ -20,7 +20,7 @@
extern eGameMode overall_mode;
extern short which_combat_type;
extern short spell_caster, missile_firer,current_monst_tactic;
extern short hit_chance[21];
extern std::array<short, 51> hit_chance;
extern location center;
extern short boom_gr[8],futzing;
@@ -530,7 +530,7 @@ short switch_target_to_adjacent(short which_m,short orig_target) {
if(is_combat())
for(short i = 0; i < 6; i++)
if(univ.party[i].main_status == eMainStatus::ALIVE && monst_adjacent(univ.party[i].combat_pos,which_m) &&
(get_encumbrance(i) < 2))
(univ.party[i].total_encumbrance(hit_chance) < 2))
return i;
// Check for a nice, adjacent, friendly monster and maybe attack
@@ -1186,26 +1186,6 @@ void activate_monsters(short code,short /*attitude*/) {
}
}
short get_encumbrance(short pc_num) {
short store = 0,what_val;
what_val = univ.party[pc_num].free_weight();
if(what_val < 0) store += what_val / -10;
for(short i = 0; i < univ.party[pc_num].items.size(); i++)
if(univ.party[pc_num].equip[i]) {
what_val = univ.party[pc_num].items[i].awkward;
if(univ.party[pc_num].items[i].ability == eItemAbil::ENCUMBERING)
what_val += univ.party[pc_num].items[i].abil_data[0];
if(what_val == 1 && get_ran(1,0,130) < hit_chance[univ.party[pc_num].skill(eSkill::DEFENSE)])
what_val--;
if(what_val > 1 && get_ran(1,0,70) < hit_chance[univ.party[pc_num].skill(eSkill::DEFENSE)])
what_val--;
store += what_val;
}
return store;
}
mon_num_t get_summon_monster(short summon_class) {
for(short i = 0; i < 200; i++) {
short j = get_ran(1,0,255);

View File

@@ -35,5 +35,4 @@ void record_monst(cCreature* which_m, bool forced=false);
short place_monster(mon_num_t which,location where,bool forced=false);
bool summon_monster(mon_num_t which,location where,short duration,eAttitude given_attitude,bool by_party);
void activate_monsters(short code,short attitude);
short get_encumbrance(short pc_num);
mon_num_t get_summon_monster(short summon_class);

View File

@@ -70,7 +70,8 @@ extern eStatMode stat_screen_mode;
extern effect_pat_type null_pat,single,t,square,radius2,radius3,small_square,open_square;
extern effect_pat_type current_pat;
extern short current_spell_range;
extern short hit_chance[21],combat_active_pc;
extern std::array<short, 51> hit_chance;
extern short combat_active_pc;
extern std::map<eDamageType,int> boom_gr;
extern short current_ground;
extern location golem_m_locs[16];
@@ -2528,7 +2529,7 @@ void set_pc_moves() {
univ.party[i].ap = 0;
else {
univ.party[i].ap = univ.party[i].traits[eTrait::SLUGGISH] ? 3 : 4;
short r = get_encumbrance(i);
short r = univ.party[i].total_encumbrance(hit_chance);
univ.party[i].ap = minmax(1,8,univ.party[i].ap - (r / 3));
if(int speed = univ.party[i].get_prot_level(eItemAbil::SPEED))

View File

@@ -602,19 +602,6 @@ void refresh_stat_areas(short mode) {
rect_draw_some_item(text_area_gworld.getTexture(), rectangle(text_area_gworld), mainPtr, win_to_rects[WINRECT_TRANSCRIPT], x);
}
// get job info gone
short total_encumbrance(short pc_num) {
short store = 0,what_val;
for(short i = 0; i < univ.party[pc_num].items.size(); i++)
if(univ.party[pc_num].equip[i]) {
what_val = univ.party[pc_num].items[i].awkward;
store += what_val;
}
return store;
}
rectangle get_stat_effect_rect(int code) {
rectangle base = {0,0,12,12};
base.offset(12 * (code % 3), 12 * (code / 3));

View File

@@ -12,7 +12,6 @@ void place_item_button(short button_position,short which_slot,eItemButton button
void place_item_graphic(short which_slot,short graphic);
short first_active_pc();
void refresh_stat_areas(short mode);
short total_encumbrance(short pc_num);
void draw_pc_effects(short pc);
void print_party_stats() ;
short do_look(location space);

View File

@@ -658,6 +658,34 @@ short cPlayer::free_weight() const {
return max_weight() - cur_weight();
}
short cPlayer::armor_encumbrance() const {
short total = 0;
for(short i = 0; i < items.size(); i++) {
if(equip[i]) total += items[i].awkward;
}
return total;
}
short cPlayer::total_encumbrance(const std::array<short, 51>& reduce_chance) const {
short total = 0;
short burden = free_weight();
if(burden < 0) total += burden / -10;
for(short i = 0; i < items.size(); i++)
if(equip[i]) {
short item_encumbrance = items[i].awkward;
if(items[i].ability == eItemAbil::ENCUMBERING)
item_encumbrance += items[i].abil_data[0];
if(item_encumbrance == 1 && get_ran(1,0,130) < reduce_chance[skill(eSkill::DEFENSE)])
item_encumbrance--;
if(item_encumbrance > 1 && get_ran(1,0,70) < reduce_chance[skill(eSkill::DEFENSE)])
item_encumbrance--;
total += item_encumbrance;
}
return total;
}
cInvenSlot cPlayer::has_space() {
for(int i = 0; i < items.size(); i++) {
if(items[i].variety == eItemType::NO_ITEM)

View File

@@ -140,6 +140,10 @@ public:
short max_weight() const;
short cur_weight() const;
short free_weight() const;
// Counts the encumbrance from armor only, excluding cursed effects; used for display
short armor_encumbrance() const;
// Counts the actual total encumbrance used for combat calculations
short total_encumbrance(const std::array<short, 51>& reduce_chance) const;
short get_prot_level(eItemAbil abil, short dat = -1) const;
const cInvenSlot has_abil_equip(eItemAbil abil, short dat = -1) const;