Example #1
0
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);
	}
}
Example #2
0
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);
	}
}
Example #3
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());
	}
}