Added mlc support

This commit is contained in:
p11 2025-04-21 23:40:04 +02:00
parent 5378ee9837
commit bf92f9277d
2 changed files with 41 additions and 5 deletions

View File

@ -607,11 +607,15 @@ fn handle_relative_connection(
.parent() .parent()
.map(|parent| parse_config(&parent.with_extension("vng")).ok()) .map(|parent| parse_config(&parent.with_extension("vng")).ok())
.unwrap_or_default(); .unwrap_or_default();
let mlc_path: Option<PathBuf> = check_path
.parent()
.map(|parent| parent.with_extension("mlc"));
if let Some(config_map) = config_map { if let Some(config_map) = config_map {
if render_novel( if render_novel(
config_map, config_map,
file_paths.pk, file_paths.pk,
mlc_path.as_deref(),
file_paths.mld, file_paths.mld,
&mut stream, &mut stream,
choice, choice,

View File

@ -1,11 +1,17 @@
use std::{collections::HashMap, fs::File, io::prelude::*, net::TcpStream, path::Path}; use std::{
collections::HashMap,
fs::File,
io::{BufReader, prelude::*},
net::TcpStream,
path::Path,
};
use dialogi::{DialogBlock, DialogSequence, ParsingError}; use dialogi::{DialogBlock, DialogSequence, ParsingError};
use event_simulation::Simulation; use event_simulation::Simulation;
use indexmap::IndexMap; use indexmap::IndexMap;
use maud::{Markup, html}; use maud::{Markup, html};
use multilinear::{BorrowedMultilinearSimulation, Event}; use multilinear::{BorrowedMultilinearSimulation, Event};
use multilinear_parser::{NamedMultilinearInfo, parse_multilinear}; use multilinear_parser::{MultilinearParser, NamedMultilinearInfo};
use pukram2html::convert; use pukram2html::convert;
use vn_settings::{Change, Parameter, PlayerSettings, SettingsContext, extract_layers}; use vn_settings::{Change, Parameter, PlayerSettings, SettingsContext, extract_layers};
@ -439,13 +445,39 @@ fn apply_block_changes(
} }
} }
fn load_multilinear(mld_path: &Path) -> Option<NamedMultilinearInfo> { fn load_multilinear(mlc_path: Option<&Path>, mld_path: &Path) -> Option<NamedMultilinearInfo> {
parse_multilinear(File::open(mld_path).ok()?).ok() let mut parser = MultilinearParser::default();
if let Some(mlc_path) = mlc_path {
if let Ok(file) = File::open(mlc_path) {
for line in BufReader::new(file).lines() {
let Ok(line) = line else {
break;
};
if let Some((channel, default_value)) = line.split_once(':') {
let _ = parser.add_new_channel(channel, default_value);
continue;
}
let line = line.trim();
if line.is_empty() {
continue;
}
return None;
}
}
}
parser.parse(File::open(mld_path).ok()?, &[]).ok()?;
Some(parser.into_info())
} }
pub fn render_novel( pub fn render_novel(
mut config_map: IndexMap<Box<str>, Box<str>>, mut config_map: IndexMap<Box<str>, Box<str>>,
pk_path: &Path, pk_path: &Path,
mlc_path: Option<&Path>,
mld_path: &Path, mld_path: &Path,
stream: &mut TcpStream, stream: &mut TcpStream,
mut choice: usize, mut choice: usize,
@ -461,7 +493,7 @@ pub fn render_novel(
let mut sections = Vec::new(); let mut sections = Vec::new();
process_dialog(&dialogs[choice], &mut player_settings, &mut sections); process_dialog(&dialogs[choice], &mut player_settings, &mut sections);
if let Some(named_multilinear_info) = load_multilinear(mld_path) { if let Some(named_multilinear_info) = load_multilinear(mlc_path, mld_path) {
let multilinear_info = &named_multilinear_info.info; let multilinear_info = &named_multilinear_info.info;
let count = named_multilinear_info.channels.into_iter().count(); let count = named_multilinear_info.channels.into_iter().count();
let mut data = vec![0; count]; let mut data = vec![0; count];