void Game_Actor::ChangeEquipment(int equip_type, int item_id) { int prev_item = SetEquipment(equip_type, item_id); if (prev_item != 0) { Game_Party::GainItem(prev_item, 1); } if (item_id != 0) { Game_Party::LoseItem(item_id, 1); } }
void Game_Actor::ChangeEquipment(int equip_type, int item_id) { int prev_item = SetEquipment(equip_type, item_id); if (prev_item != 0) { Main_Data::game_party->AddItem(prev_item, 1); } if (item_id != 0) { Main_Data::game_party->RemoveItem(item_id, 1); } // In case you have a two_handed weapon equipped, the other weapon is removed. const RPG::Item* item = ReaderUtil::GetElement(Data::items, GetWeaponId()); const RPG::Item* item2 = ReaderUtil::GetElement(Data::items, GetShieldId()); if (item && item2 && (item->two_handed || item2->two_handed)) { ChangeEquipment(equip_type == RPG::Item::Type_weapon ? equip_type + 1 : equip_type - 1, 0); } }
void Game_Actor::RemoveInvalidData() { /* The following actor data is cleaned up: - Invalid equipment is removed - An invalid class is removed - Invalid states are removed - Level is between 0 and 99, and does not exceed MaxLevel For "external data" (not from LCF Actor or LSD SaveActor) the data is verified in the corresponding functions. */ // Filter out invalid equipment int eq_types[] = { RPG::Item::Type_weapon, HasTwoWeapons() ? RPG::Item::Type_weapon : RPG::Item::Type_shield, RPG::Item::Type_armor, RPG::Item::Type_helmet, RPG::Item::Type_accessory }; auto& equipment = GetWholeEquipment(); for (size_t i = 0; i < equipment.size(); ++i) { int eq_id = equipment[i]; RPG::Item* item = ReaderUtil::GetElement(Data::items, eq_id); if (!item && eq_id != 0) { Output::Debug("Actor %d: Removing invalid item %d from equipment slot %d", GetId(), eq_id, eq_types[i]); SetEquipment(i + 1, 0); } else if (item && item->type != eq_types[i]) { Output::Debug("Actor %d: Removing item %d (of type %d) from equipment slot %d (needs type %d)", GetId(), item->ID, item->type, i + 1, eq_types[i]); SetEquipment(i + 1, 0); } else if (item && !IsItemUsable(item->ID)) { Output::Debug("Actor %d: Removing item %d from equipment slot %d (Not equippable by this actor)", GetId(), item->ID, i + 1); SetEquipment(i + 1, 0); } } // Remove invalid class if (GetData().class_id > 0) { const RPG::Class* cls = ReaderUtil::GetElement(Data::classes, GetData().class_id); if (!cls) { Output::Warning("Actor %d: Removing invalid class %d", GetId(), GetData().class_id); SetClass(0); } } // Remove invalid skills for (int16_t skill_id : GetSkills()) { const RPG::Skill* skill = ReaderUtil::GetElement(Data::skills, skill_id); if (!skill) { Output::Warning("Actor %d: Removing invalid skill %d", GetId(), skill_id); UnlearnSkill(skill_id); } } // Remove invalid states if (GetStates().size() > Data::states.size()) { Output::Warning("Actor %d: State array contains invalid states (%d > %d)", GetId(), GetStates().size(), Data::states.size()); GetStates().resize(Data::states.size()); } // Remove invalid levels // Special handling for the game COLORS: Lost Memories which uses level 0 // through database editing. Hopefully no game uses negative levels. if (GetLevel() == 0) { Output::Debug("Actor %d: Special handling for level 0", GetId()); } else if (GetLevel() < 0) { Output::Warning("Actor %d: Invalid level %d, changed to 1", GetId(), GetLevel()); SetLevel(1); } else if (GetLevel() > GetMaxLevel()) { Output::Warning("Actor %d: Invalid level %d, changed to %d", GetId(), GetLevel(), GetMaxLevel()); SetLevel(GetMaxLevel()); } }