From 30570816b3c460b69e6b410cdddb3e6516b80e22 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 29 Sep 2025 21:22:42 +0200 Subject: Support multiple book pages --- server/protocol/src/book.rs | 3 +-- server/protocol/src/helpers.rs | 4 ++-- server/src/entity/tutorial.rs | 5 +++-- server/tools/src/book.rs | 31 +++++++++++++++++++++++++++---- server/tools/src/book_html.rs | 4 ++-- server/tools/src/main.rs | 2 +- server/tools/src/recipe_diagram.rs | 4 ++-- 7 files changed, 38 insertions(+), 15 deletions(-) (limited to 'server') diff --git a/server/protocol/src/book.rs b/server/protocol/src/book.rs index 15c239a1..73b14c07 100644 --- a/server/protocol/src/book.rs +++ b/server/protocol/src/book.rs @@ -36,8 +36,8 @@ pub enum BookPage { paragraphs: Vec, }, Recipe { + title: Message, description: Message, - instruction: Message, diagram: Diagram, }, } @@ -70,4 +70,3 @@ pub struct DiagramEdge { pub dst: usize, pub label: Option, } - diff --git a/server/protocol/src/helpers.rs b/server/protocol/src/helpers.rs index 542f7754..b5c0e82b 100644 --- a/server/protocol/src/helpers.rs +++ b/server/protocol/src/helpers.rs @@ -2,7 +2,7 @@ use crate::{Gamedata, Hand, ItemIndex, ItemLocation, PlayerID, Recipe, RecipeInd use std::fmt::Display; impl Gamedata { - pub fn tile_name(&self, index: TileIndex) -> &String { + pub fn tile_name(&self, index: TileIndex) -> &str { &self.tile_names[index.0] } pub fn is_tile_colliding(&self, index: TileIndex) -> bool { @@ -11,7 +11,7 @@ impl Gamedata { pub fn is_tile_interactable(&self, index: TileIndex) -> bool { self.tile_interact[index.0] } - pub fn item_name(&self, index: ItemIndex) -> &String { + pub fn item_name(&self, index: ItemIndex) -> &str { &self.item_names[index.0] } pub fn recipe(&self, index: RecipeIndex) -> &Recipe { diff --git a/server/src/entity/tutorial.rs b/server/src/entity/tutorial.rs index f4db3571..7da50417 100644 --- a/server/src/entity/tutorial.rs +++ b/server/src/entity/tutorial.rs @@ -201,7 +201,7 @@ impl StepContext<'_> { }) { Err(( Some(*pos), - match self.ent.game.data.tile_name(tile.kind).as_str() { + match self.ent.game.data.tile_name(tile.kind) { "stove" | "oven" => trm!("s.tutorial.prevent_burning"), _ => trm!("s.tutorial.take_now"), }, @@ -320,7 +320,8 @@ impl StepContext<'_> { input, .. } => { - for (_pos, tile) in self.ent.game.tiles.iter().filter(|(_, t)| t.kind == *tile) { + for (_pos, tile) in self.ent.game.tiles.iter().filter(|(_, t)| t.kind == *tile) + { if let Some(item) = &tile.item { if item.kind == *input { return Err((None, trm!("s.tutorial.wait_finish"))); diff --git a/server/tools/src/book.rs b/server/tools/src/book.rs index 802cbaea..fc2a1502 100644 --- a/server/tools/src/book.rs +++ b/server/tools/src/book.rs @@ -24,15 +24,38 @@ use hurrycurry_protocol::{ }; use hurrycurry_server::data::Serverdata; +struct RecipePageParams<'a> { + name: &'a str, + repr_items: &'a [&'a str], +} +static RECIPE_PAGES: &[RecipePageParams] = &[ + RecipePageParams { + name: "cheese-leek-soup", + repr_items: &["plate:cheese-leek-soup"], + }, + RecipePageParams { + name: "burger", + repr_items: &["plate:seared-patty,sliced-bun"], + }, +]; + pub fn book(data: &Gamedata, serverdata: &Serverdata) -> Result { let mut pages = Vec::new(); - for item in ["plate:cheese-leek-soup", "plate:seared-patty,sliced-bun"] { - let mut diagram = recipe_diagram(data, serverdata, &[item.to_owned()])?; + pages.push(BookPage::Contents { table: vec![] }); + + for &RecipePageParams { name, repr_items } in RECIPE_PAGES { + let mut diagram = recipe_diagram(data, serverdata, repr_items)?; diagram_layout(&mut diagram)?; pages.push(BookPage::Recipe { - description: Message::Text("Some text goes here...".to_string()), - instruction: Message::Text("Some text goes here...".to_string()), + title: Message::Translation { + id: format!("b.{name}.title"), + params: vec![], + }, + description: Message::Translation { + id: format!("b.{name}.desc"), + params: vec![], + }, diagram, }); } diff --git a/server/tools/src/book_html.rs b/server/tools/src/book_html.rs index c827fc4a..a1dfaf9b 100644 --- a/server/tools/src/book_html.rs +++ b/server/tools/src/book_html.rs @@ -47,10 +47,10 @@ markup::define! { div.page {} div.page {} } - BookPage::Recipe { description, instruction, diagram } => { + BookPage::Recipe { title, description, diagram } => { div.page { + h1 { @MessageR { data, message: title } } p { @MessageR { data, message: description } } - p { @MessageR { data, message: instruction } } } div.page { @DiagramR { data, diagram } diff --git a/server/tools/src/main.rs b/server/tools/src/main.rs index 1b4a9a51..a18051b0 100644 --- a/server/tools/src/main.rs +++ b/server/tools/src/main.rs @@ -58,7 +58,7 @@ fn main() -> Result<()> { let mut index = DataIndex::default(); index.reload()?; let (data, serverdata, _) = index.generate("5star")?; - let diagram = recipe_diagram(&data, &serverdata, &[out])?; + let diagram = recipe_diagram(&data, &serverdata, &[&out])?; let dot = diagram_dot(&data, &diagram)?; println!("{dot}"); } diff --git a/server/tools/src/recipe_diagram.rs b/server/tools/src/recipe_diagram.rs index 7f72acd3..2ed0179f 100644 --- a/server/tools/src/recipe_diagram.rs +++ b/server/tools/src/recipe_diagram.rs @@ -28,7 +28,7 @@ use std::collections::{BTreeMap, BTreeSet, HashSet}; pub(crate) fn recipe_diagram( data: &Gamedata, serverdata: &Serverdata, - target_items: &[String], + target_items: &[&str], ) -> Result { let ambient_items = serverdata .initial_map @@ -84,7 +84,7 @@ pub(crate) fn recipe_diagram( diag.nodes.push(DiagramNode { label: Message::Item(i), position: Vec2::ZERO, - style: if target_items.contains(data.item_name(i)) { + style: if target_items.contains(&data.item_name(i)) { NodeStyle::FinalProduct } else { NodeStyle::IntermediateProduct -- cgit v1.2.3-70-g09d2