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( 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::(), None)?); Location::new_and_setup(&mut entity_object)?; let experience_settings = world.resources.get::(); let attribute_settings = world.resources.get::(); let item_settings = world.resources.get::(); let item_system = world.resources.get::>(); 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)) } }