Added proper simulation

This commit is contained in:
p11 2025-04-21 15:54:55 +02:00
parent 04d6a09b57
commit 19e1683786
3 changed files with 45 additions and 9 deletions

2
Cargo.lock generated
View File

@ -245,9 +245,11 @@ version = "0.1.0"
dependencies = [
"data-stream",
"dialogi",
"event-simulation",
"header-config",
"indexmap",
"maud",
"multilinear",
"multilinear-parser",
"percent-encoding",
"pukram2html",

View File

@ -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"

View File

@ -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,18 +350,48 @@ 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) {
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::<Vec<_>>()
.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))
}
}
}
if !choices.is_empty() {
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))
}
@for choice in choices {
(choice)
}
}
};
sections.push(choices_html);
}
}
let html = generate_html(sections);
let _ = write!(stream, "{}", html.into_string());