trigger-rs/crates/hall-server/src/logic/ecs/hall.rs
traffic95 8f606a8256 Add property calculations (#5)
Reviewed-on: #5
Co-authored-by: traffic95 <traffic95@xeondev.com>
Co-committed-by: traffic95 <traffic95@xeondev.com>
2025-03-18 20:44:22 +00:00

98 lines
2.5 KiB
Rust

use bevy_ecs::{prelude::*, query::QueryData};
use tracing::warn;
use trigger_fileconfig::{NapFileCfg, main_city_script::MainCityConfig};
use crate::logic::save::HallSceneSaveData;
use super::player::MainCityPosition;
#[derive(Component)]
pub struct MainCitySection(pub u32);
#[derive(Component)]
pub struct Clock {
pub time_of_day: u16,
pub day_of_week: u8,
}
#[derive(Component)]
pub struct BGMusic(pub u32);
#[derive(Bundle)]
pub struct HallBundle {
pub section: MainCitySection,
pub clock: Clock,
pub bgm: BGMusic,
}
#[derive(QueryData)]
pub struct HallQuery {
pub section: &'static MainCitySection,
pub clock: &'static Clock,
pub bgm: &'static BGMusic,
}
#[derive(Resource)]
pub struct HallInitData {
pub section_id: u32,
pub player_avatar_id: u32,
pub control_avatar_id: u32,
pub initial_position: MainCityPosition,
pub day_of_week: u32,
pub time_of_day: u32,
pub bgm_id: u32,
}
impl HallInitData {
pub fn load_from_save(
player_avatar_id: u32,
control_avatar_id: u32,
ext: Option<String>,
) -> Option<Self> {
ext.map(|data| {
serde_json::from_str::<HallSceneSaveData>(&data)
.inspect_err(|err| {
warn!("failed to deserialize HallSceneSaveData: {err}, data: {data}")
})
.ok()
})
.flatten()
.map(|data| HallInitData {
section_id: data.section_id,
player_avatar_id,
control_avatar_id,
initial_position: data.player_position.into(),
day_of_week: data.day_of_week,
time_of_day: data.time_of_day,
bgm_id: data.bgm_id,
})
}
pub fn create_default_init_data(
filecfg: &NapFileCfg,
main_city_config: &MainCityConfig,
player_avatar_id: u32,
control_avatar_id: u32,
) -> Self {
let section_id = main_city_config.default_section_id;
let section_config = filecfg
.section_config_template_tb()
.data()
.unwrap()
.iter()
.find(|cfg| cfg.section_id() == section_id as i32)
.unwrap();
HallInitData {
section_id,
player_avatar_id,
control_avatar_id,
bgm_id: 1005,
day_of_week: 5,
time_of_day: 360,
initial_position: MainCityPosition::Predefined(
section_config.born_transform().unwrap().to_string(),
),
}
}
}