rpg_base/rpg_components/src/config/save_game.rs

403 lines
8.5 KiB
Rust
Raw Normal View History

2025-02-28 07:43:35 +00:00
use anyhow::Result;
use engine::prelude::*;
use crate::{
components::{
ability_slots::AbilitySlots, attributes::Attributes, character_status::CharacterStatus,
crafting_materials::CraftingMaterials, inventory::Inventory, item_slots::ItemSlotContainer,
level::Level, statistics::Statistics,
},
items::{ItemAffix, ItemSystem, Rarities, ability_book::Ability},
};
use std::env::var;
use super::{attributes::AttributeSettings, experience::ExperienceSettings, items::ItemSettings};
#[cfg(target_os = "windows")]
pub fn save_game_dir(game: &str) -> String {
let b = var("LOCALAPPDATA").expect("couldn't get local appdata variable");
format!("{b}\\{game}\\saves\\")
}
#[cfg(target_os = "linux")]
pub fn save_game_dir(game: &str) -> String {
let b = var("HOME").expect("couldn't get HOME variable");
format!("{b}/.local/share/{game}/saves/")
}
create_settings_section!(
General,
"General",
{
level: u32,
exp: u32,
name: String,
strength: u32,
agility: u32,
intelligence: u32,
}
);
create_settings_section!(
HelmetSlot,
"Helmet",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
ChestPlateSlot,
"ChestPlate",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
BeltSlot,
"Belt",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
GlovesSlot,
"Gloves",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
BootsSlot,
"Boots",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
FirstRingSlot,
"Ring0",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
SecondRingSlot,
"Ring1",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
ThirdRingSlot,
"Ring2",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
FourthRingSlot,
"Ring3",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
FirstAmuletSlot,
"Amulet0",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
SecondAmuletSlot,
"Amulet1",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
MainHandSlot,
"MainHand",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
OffHandSlot,
"OffHand",
{
used: bool,
level: u32,
strength: u32,
agility: u32,
intelligence: u32,
rarity: Rarities,
[affixes: ItemAffix],
}
);
create_settings_section!(
InventorySave,
"Inventory",
{
[items: String],
[addons: String],
[books: String],
[jewels: String],
[maps: String],
}
);
create_settings_section!(
FirstAbilitySlot,
"FirstAbilitySlot",
{
used: bool,
name: String,
rarity: Rarities,
level: u32,
[addons: String],
}
);
create_settings_section!(
SecondAbilitySlot,
"SecondAbilitySlot",
{
used: bool,
name: String,
rarity: Rarities,
level: u32,
[addons: String],
}
);
create_settings_section!(
ThirdAbilitySlot,
"ThirdAbilitySlot",
{
used: bool,
name: String,
rarity: Rarities,
level: u32,
[addons: String],
}
);
create_settings_section!(
FourthAbilitySlot,
"FourthAbilitySlot",
{
used: bool,
name: String,
rarity: Rarities,
level: u32,
[addons: String],
}
);
create_settings_section!(
CraftingMaterialInfo,
"CraftingMaterials",
{
common: u32,
uncommon: u32,
magical: u32,
rare: u32,
epic: u32,
legendary: u32,
}
);
create_settings_section!(
PassivesInfo,
"Passives",
{
blood_mage: u32,
vampire: u32,
hermes: u32,
thick_skinned: u32,
super_brain: u32,
survivalist: u32,
soul_catcher: u32,
pyromancer: u32,
thunder_god: u32,
sea_monster: u32,
gladiator: u32,
lucky_devil: u32,
rogue: u32,
alchemist: u32,
}
);
create_settings_container!(
SaveGame,
{
general: General,
// items
helmet: HelmetSlot,
chest_plate: ChestPlateSlot,
belt: BeltSlot,
gloves: GlovesSlot,
boots: BootsSlot,
// rings
ring_0: FirstRingSlot,
ring_1: SecondRingSlot,
ring_2: ThirdRingSlot,
ring_3: FourthRingSlot,
// amulets
amulet_0: FirstAmuletSlot,
amulet_1: SecondAmuletSlot,
// hands
main_hand: MainHandSlot,
off_hand: OffHandSlot,
// inventory
inventory: InventorySave,
// abilities
ability_0: FirstAbilitySlot,
ability_1: SecondAbilitySlot,
ability_2: ThirdAbilitySlot,
ability_3: FourthAbilitySlot,
crafting_materials: CraftingMaterialInfo,
passives: PassivesInfo,
}
);
impl SaveGame {
pub fn to_entity_object<A: Ability + 'static>(
self,
world: &mut World,
) -> Result<(Entity, String)> {
let mut entity_object = AssetHandler::create(world).empty_entity();
entity_object.insert_component(Draw::new(Vec::new()));
entity_object.insert_component(Audio::new(world.resources.get_mut::<Context>(), None)?);
Location::new_and_setup(&mut entity_object)?;
let experience_settings = world.resources.get::<ExperienceSettings>();
let attribute_settings = world.resources.get::<AttributeSettings>();
let item_settings = world.resources.get::<ItemSettings>();
let item_system = world.resources.get::<ItemSystem<A>>();
let level = Level::load(self.general.level, self.general.exp, experience_settings);
let mut attributes = Attributes::load(
self.general.strength,
self.general.agility,
self.general.intelligence,
);
let inventory = Inventory::load(&self, &item_system)?;
let abilities = AbilitySlots::load(item_system, &self)?;
let crafting_materials = CraftingMaterials::load(&self);
let items = ItemSlotContainer::load(&self, &item_system)?;
let mut statistics = Statistics::default();
statistics.update(&mut attributes, attribute_settings, (&items, item_settings));
let current_status = CharacterStatus::new_full(&statistics);
entity_object.insert_component(level);
entity_object.insert_component(attributes);
entity_object.insert_component(inventory);
entity_object.insert_component(abilities);
entity_object.insert_component(crafting_materials);
entity_object.insert_component(items);
entity_object.insert_component(statistics);
entity_object.insert_component(current_status);
Ok((world.add_entity(entity_object)?, self.general.name))
}
}