diff --git a/Cargo.lock b/Cargo.lock index 3a185ff..da38e5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,6 +38,29 @@ dependencies = [ "thiserror", ] +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "header-config" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534f791edc58252667d692bb3b4b6dead797024ac02ec9cdb5733da81089b21d" +dependencies = [ + "header-parsing", + "indexmap", + "thiserror", +] + [[package]] name = "header-parsing" version = "0.3.1" @@ -50,6 +73,16 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", +] + [[package]] name = "itoa" version = "1.0.14" @@ -136,6 +169,7 @@ version = "0.1.0" dependencies = [ "data-stream", "dialogi", + "header-config", "maud", "percent-encoding", "pukram2html", diff --git a/Cargo.toml b/Cargo.toml index 095d7ad..1fc703b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,3 +11,4 @@ data-stream = "0.3.0" dialogi = "0.3.1" vn-settings = "0.1.0" threadpool = "1.8.1" +header-config = "0.1.5" diff --git a/src/dialog.rs b/src/dialog.rs index 0fb45f8..55da24d 100644 --- a/src/dialog.rs +++ b/src/dialog.rs @@ -1,19 +1,11 @@ -use std::{collections::HashMap, path::Path}; +use std::path::Path; use dialogi::DialogSequence; use vn_settings::{Change, Parameter, SettingsContext}; pub fn parse_map( story_path: &Path, + settings_context: &mut SettingsContext, ) -> Result>, dialogi::ParsingError> { - let mut layers = HashMap::new(); - layers.insert("Background".into(), 0); - layers.insert("Character".into(), 1); - - let mut settings_context = SettingsContext { - object_cache: HashMap::new(), - layers, - }; - - DialogSequence::map_from_path(story_path, &mut settings_context) + DialogSequence::map_from_path(story_path, settings_context) } diff --git a/src/main.rs b/src/main.rs index 87336c1..cd01850 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,6 +19,7 @@ use data_stream::{ from_stream, to_stream, }; use dialog::parse_map; +use header_config::parse_config; use maud::html; use percent_encoding::percent_decode_str; use pukram2html::{Settings, convert, convert_extended, convert_subheader}; @@ -28,7 +29,7 @@ mod request; use request::Request; use vn_settings::{ ColorSettings, ImageSettings, LayoutSettings, Names, ObjectSettings, PlayerSettings, - TimingSettings, + SettingsContext, TimingSettings, }; mod dialog; @@ -597,12 +598,38 @@ fn handle_relative_connection( } let check_path: &Path = relative_path.as_ref(); - let interactive = check_path.parent().is_some_and(|parent| { - std::fs::metadata(parent.with_extension("vng")).is_ok_and(|file| file.is_file()) - }); + let config_map = check_path + .parent() + .map(|parent| parse_config(&parent.with_extension("vng")).ok()) + .unwrap_or_default(); - if interactive { - let Ok(dialogs) = parse_map(file_paths.pk) else { + if let Some(mut config_map) = config_map { + let mut layers = HashMap::new(); + + let keys: Vec<_> = config_map.keys().cloned().collect(); + for key in keys { + let Some(("Layer", name)) = key.split_once(':') else { + continue; + }; + + let value = config_map.shift_remove(&key).expect("Invalid layer"); + if !value.is_empty() { + eprintln!("Layers don't accept arguments!"); + } + layers.insert(name.into(), layers.len()); + } + + if layers.is_empty() { + layers.insert("Background".into(), 0); + layers.insert("Character".into(), 1); + } + + let mut settings_context = SettingsContext { + object_cache: HashMap::new(), + layers, + }; + + let Ok(dialogs) = parse_map(file_paths.pk, &mut settings_context) else { fail(stream); return; };