Refactor item equipping into the player class
This commit is contained in:
@@ -99,65 +99,14 @@ short take_food(short amount,bool print_result) {
|
||||
}
|
||||
|
||||
void equip_item(short pc_num,short item_num) {
|
||||
unsigned short num_equipped_of_this_type = 0;
|
||||
unsigned short num_hands_occupied = 0;
|
||||
short i;
|
||||
short equip_item_type = 0;
|
||||
|
||||
if(overall_mode == MODE_COMBAT && univ.party[pc_num].items[item_num].variety == eItemType::FOOD)
|
||||
add_string_to_buf("Equip: Not in combat");
|
||||
else {
|
||||
|
||||
// unequip
|
||||
if(univ.party[pc_num].equip[item_num]) {
|
||||
if(univ.party[pc_num].equip[item_num] && univ.party[pc_num].items[item_num].cursed)
|
||||
add_string_to_buf("Equip: Item is cursed.");
|
||||
else {
|
||||
univ.party[pc_num].equip[item_num] = false;
|
||||
add_string_to_buf("Equip: Unequipped");
|
||||
if(univ.party[pc_num].weap_poisoned == item_num && univ.party[pc_num].status[eStatus::POISONED_WEAPON] > 0) {
|
||||
add_string_to_buf(" Poison lost.");
|
||||
univ.party[pc_num].status[eStatus::POISONED_WEAPON] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else { // equip
|
||||
if(!equippable.count(univ.party[pc_num].items[item_num].variety))
|
||||
add_string_to_buf("Equip: Can't equip this item.");
|
||||
else {
|
||||
for(i = 0; i < 24; i++)
|
||||
if(univ.party[pc_num].equip[i]) {
|
||||
if(univ.party[pc_num].items[i].variety == univ.party[pc_num].items[item_num].variety)
|
||||
num_equipped_of_this_type++;
|
||||
num_hands_occupied = num_hands_occupied + num_hands_to_use.count(univ.party[pc_num].items[i].variety);
|
||||
}
|
||||
|
||||
|
||||
equip_item_type = excluding_types[univ.party[pc_num].items[item_num].variety];
|
||||
// Now if missile is already equipped, no more missiles
|
||||
if(equip_item_type > 0) {
|
||||
for(i = 0; i < 24; i++)
|
||||
if((univ.party[pc_num].equip[i]) && (excluding_types[univ.party[pc_num].items[i].variety] == equip_item_type)) {
|
||||
add_string_to_buf("Equip: You have something of this type equipped.", 2);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
size_t hands_free = 2 - num_hands_occupied;
|
||||
if(is_combat() && univ.party[pc_num].items[item_num].variety == eItemType::ARMOR)
|
||||
add_string_to_buf("Equip: Not armor in combat");
|
||||
else if(hands_free < num_hands_to_use.count(univ.party[pc_num].items[item_num].variety))
|
||||
add_string_to_buf("Equip: Not enough free hands");
|
||||
else if(equippable.count(univ.party[pc_num].items[item_num].variety) <= num_equipped_of_this_type)
|
||||
add_string_to_buf("Equip: Can't equip another");
|
||||
else {
|
||||
univ.party[pc_num].equip[item_num] = true;
|
||||
add_string_to_buf("Equip: OK");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if(univ.party[pc_num].equip[item_num])
|
||||
univ.party[pc_num].unequip_item(item_num, true);
|
||||
else if(is_combat() && univ.party[pc_num].items[item_num].variety == eItemType::ARMOR)
|
||||
add_string_to_buf("Equip: Not armor in combat");
|
||||
else univ.party[pc_num].equip_item(item_num, true);
|
||||
}
|
||||
if(stat_window == pc_num)
|
||||
put_item_screen(stat_window,1);
|
||||
@@ -569,7 +518,10 @@ static bool display_item_event_filter(cDialog& me, std::string id, size_t& first
|
||||
|
||||
set_item_flag(&item);
|
||||
play_sound(0); // formerly force_play_sound
|
||||
univ.party[current_getting_pc].give_item(item, false, allow_overload);
|
||||
int flags = GIVE_DO_PRINT;
|
||||
if(allow_overload)
|
||||
flags |= GIVE_ALLOW_OVERLOAD;
|
||||
univ.party[current_getting_pc].give_item(item, flags);
|
||||
}
|
||||
*item_array[item_hit] = cItem();
|
||||
item_array.erase(item_array.begin() + item_hit);
|
||||
|
@@ -18,6 +18,10 @@
|
||||
#include "mathutil.hpp"
|
||||
#include "fileio.hpp"
|
||||
|
||||
extern const std::multiset<eItemType> equippable;
|
||||
extern const std::multiset<eItemType> num_hands_to_use;
|
||||
extern std::map<const eItemType, const short> excluding_types;
|
||||
|
||||
extern short skill_bonus[21];
|
||||
|
||||
void cPlayer::append(legacy::pc_record_type old){
|
||||
@@ -479,6 +483,72 @@ bool cPlayer::give_item(cItem item, bool do_print, bool allow_overload) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cPlayer::equip_item(int which_item, bool do_print) {
|
||||
if(!equippable.count(items[which_item].variety)) {
|
||||
if(do_print && print_result)
|
||||
print_result("Equip: Can't equip this item.");
|
||||
return false;
|
||||
}
|
||||
unsigned short num_this_type = 0, hands_occupied = 0;
|
||||
for(int i = 0; i < 24; i++)
|
||||
if(equip[i]) {
|
||||
if(items[i].variety == items[which_item].variety)
|
||||
num_this_type++;
|
||||
hands_occupied += num_hands_to_use.count(items[i].variety);
|
||||
}
|
||||
|
||||
|
||||
short equip_item_type = excluding_types[items[which_item].variety];
|
||||
// Now if missile is already equipped, no more missiles
|
||||
if(equip_item_type > 0) {
|
||||
for(int i = 0; i < 24; i++)
|
||||
if(equip[i] && excluding_types[items[i].variety] == equip_item_type) {
|
||||
if(do_print && print_result) {
|
||||
print_result("Equip: You have something of this type");
|
||||
print_result(" equipped.");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
size_t hands_free = 2 - hands_occupied;
|
||||
if(hands_free < num_hands_to_use.count(items[which_item].variety)) {
|
||||
if(do_print && print_result)
|
||||
print_result("Equip: Not enough free hands");
|
||||
return false;
|
||||
} else if(equippable.count(items[which_item].variety) <= num_this_type) {
|
||||
if(do_print && print_result)
|
||||
print_result("Equip: Can't equip another");
|
||||
return false;
|
||||
}
|
||||
equip[which_item] = true;
|
||||
if(do_print && print_result)
|
||||
print_result("Equip: OK");
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cPlayer::unequip_item(int which_item, bool do_print) {
|
||||
if(!equip[which_item]) {
|
||||
if(do_print && print_result)
|
||||
print_result("Equip: Not equipped");
|
||||
return false;
|
||||
}
|
||||
if(items[which_item].cursed) {
|
||||
if(do_print && print_result)
|
||||
print_result("Equip: Item is cursed.");
|
||||
return false;
|
||||
}
|
||||
equip[which_item] = false;
|
||||
if(do_print && print_result)
|
||||
print_result("Equip: Unequipped");
|
||||
if(weap_poisoned == which_item && status[eStatus::POISONED_WEAPON] > 0) {
|
||||
if(do_print && print_result)
|
||||
print_result(" Poison lost.");
|
||||
status[eStatus::POISONED_WEAPON] = 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
short cPlayer::max_weight() const {
|
||||
return 100 + (15 * min(skill(eSkill::STRENGTH),20)) + (traits[eTrait::STRENGTH] * 30)
|
||||
+ (traits[eTrait::BAD_BACK] * -50) + (race == eRace::VAHNATAI) * -25;
|
||||
|
@@ -86,6 +86,8 @@ public:
|
||||
void combine_things();
|
||||
void sort_items();
|
||||
bool give_item(cItem item, bool do_print, bool allow_overload = false);
|
||||
bool equip_item(int which_item, bool do_print);
|
||||
bool unequip_item(int which_item, bool do_print);
|
||||
void take_item(int which_item);
|
||||
void remove_charge(int which_item);
|
||||
short has_space() const;
|
||||
|
Reference in New Issue
Block a user