From 19e16837869d9f569beba4442cbd9d7e1580512c Mon Sep 17 00:00:00 2001 From: p11 Date: Mon, 21 Apr 2025 15:54:55 +0200 Subject: [PATCH] Added proper simulation --- Cargo.lock | 2 ++ Cargo.toml | 2 ++ src/vn.rs | 50 +++++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 986055f..f281d82 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -245,9 +245,11 @@ version = "0.1.0" dependencies = [ "data-stream", "dialogi", + "event-simulation", "header-config", "indexmap", "maud", + "multilinear", "multilinear-parser", "percent-encoding", "pukram2html", diff --git a/Cargo.toml b/Cargo.toml index 0cc6b9c..41ab646 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,4 +13,6 @@ vn-settings = "0.1.1" threadpool = "1.8.1" header-config = "0.1.5" indexmap = "2.9.0" +multilinear = "0.3.1" multilinear-parser = "0.3.3" +event-simulation = "0.1.2" diff --git a/src/vn.rs b/src/vn.rs index b0f0491..8039f29 100644 --- a/src/vn.rs +++ b/src/vn.rs @@ -1,8 +1,10 @@ use std::{collections::HashMap, fs::File, io::prelude::*, net::TcpStream, path::Path}; use dialogi::DialogBlock; +use event_simulation::Simulation; use indexmap::IndexMap; use maud::{Markup, html}; +use multilinear::{BorrowedMultilinearSimulation, Event}; use multilinear_parser::{NamedMultilinearInfo, parse_multilinear}; use pukram2html::convert_subheader; use vn_settings::{Change, Parameter, PlayerSettings, SettingsContext, extract_layers}; @@ -348,17 +350,47 @@ pub fn render_novel( let dialogs = parse_map(pk_path, &mut settings_context)?; let mut sections = process_dialog(&dialogs[choice], &mut player_settings, start_level); - if let Some(_named_multilinear_info) = load_multilinear(mld_path) { - let choices_html = html! { - div .choices-section { - @for (i, dialog_sequence) in dialogs.iter().enumerate() { - @if let Some(block) = dialog_sequence.blocks.first() { - (render_choice(block, i, progress)) - } + if let Some(named_multilinear_info) = load_multilinear(mld_path) { + let multilinear_info = &named_multilinear_info.info; + let count = named_multilinear_info.channels.into_iter().count(); + let mut data = vec![0; count]; + for (i, num) in progress.split('+').enumerate() { + if i == count { + break; + } + if let Ok(num) = num.parse() { + data[i] = num; + } + } + let mut simulation = + BorrowedMultilinearSimulation::from_data(multilinear_info, data).unwrap(); + simulation.try_call(Event(choice)); + let progress: String = simulation + .data() + .iter() + .map(|i| format!("{i}")) + .collect::>() + .join(" "); + + let mut choices = Vec::new(); + for (i, dialog_sequence) in dialogs.iter().enumerate() { + if let Some(block) = dialog_sequence.blocks.first() { + if simulation.callable(Event(i)) { + choices.push(render_choice(block, i, &progress)) } } - }; - sections.push(choices_html); + } + + if !choices.is_empty() { + let choices_html = html! { + div .choices-section { + @for choice in choices { + (choice) + } + } + }; + sections.push(choices_html); + } } let html = generate_html(sections);