aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1
-rw-r--r--server/tools/Cargo.toml1
-rw-r--r--server/tools/src/book.rs15
-rw-r--r--server/tools/src/book_html.css23
-rw-r--r--server/tools/src/book_html.rs76
-rw-r--r--server/tools/src/diagram_layout.rs4
-rw-r--r--server/tools/src/main.rs16
-rw-r--r--server/tools/src/recipe_diagram.rs21
8 files changed, 134 insertions, 23 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 6961243b..1fb77195 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1381,6 +1381,7 @@ dependencies = [
"hurrycurry-protocol",
"hurrycurry-server",
"log",
+ "markup",
"serde",
"serde_json",
]
diff --git a/server/tools/Cargo.toml b/server/tools/Cargo.toml
index 1a6d6aa3..8c26cdfe 100644
--- a/server/tools/Cargo.toml
+++ b/server/tools/Cargo.toml
@@ -12,3 +12,4 @@ hurrycurry-protocol = { path = "../protocol" }
hurrycurry-server = { path = ".." }
serde_json = "1.0.145"
serde = { version = "1.0.225", features = ["derive"] }
+markup = "0.15.0"
diff --git a/server/tools/src/book.rs b/server/tools/src/book.rs
index b77525af..971859fe 100644
--- a/server/tools/src/book.rs
+++ b/server/tools/src/book.rs
@@ -19,27 +19,28 @@
use crate::{diagram_layout::diagram_layout, recipe_diagram::recipe_diagram};
use anyhow::Result;
use hurrycurry_protocol::{
- ItemIndex, Message,
+ Gamedata, Message,
book::{Book, BookPage},
};
+use hurrycurry_server::data::Serverdata;
-pub fn book() -> Result<Book> {
- let mut diagram = recipe_diagram(&["plate:cheese-leek-soup".to_owned()])?;
+pub fn book(data: &Gamedata, serverdata: &Serverdata) -> Result<Book> {
+ let mut diagram = recipe_diagram(data, serverdata, &["plate:cheese-leek-soup".to_owned()])?;
diagram_layout(&mut diagram)?;
let mut pages = Vec::new();
pages.push(BookPage::Recipe {
- description: Message::Item(ItemIndex(0)),
- instruction: Message::Item(ItemIndex(0)),
+ description: Message::Text("Some text goes here...".to_string()),
+ instruction: Message::Text("Some text goes here...".to_string()),
diagram,
});
Ok(Book { pages })
}
-pub fn print_book() -> Result<()> {
- let book = book()?;
+pub fn print_book(data: &Gamedata, serverdata: &Serverdata) -> Result<()> {
+ let book = book(data, serverdata)?;
println!("{}", serde_json::to_string_pretty(&book).unwrap());
Ok(())
}
diff --git a/server/tools/src/book_html.css b/server/tools/src/book_html.css
new file mode 100644
index 00000000..9a67de71
--- /dev/null
+++ b/server/tools/src/book_html.css
@@ -0,0 +1,23 @@
+body {
+ margin: 0px;
+ background-color: rgb(74, 74, 74);
+}
+
+.pagegroup {
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+ width: 64em;
+}
+
+.page {
+ float: left;
+ display: block;
+ background-color: antiquewhite;
+ box-sizing: border-box;
+ padding: 2em;
+ margin: 1em;
+ aspect-ratio: 0.707;
+ width: 30em;
+ height: auto;
+} \ No newline at end of file
diff --git a/server/tools/src/book_html.rs b/server/tools/src/book_html.rs
index 370f6901..0af9af06 100644
--- a/server/tools/src/book_html.rs
+++ b/server/tools/src/book_html.rs
@@ -16,9 +16,77 @@
*/
-use anyhow::Result;
-use hurrycurry_protocol::book::Book;
+use hurrycurry_protocol::{
+ Gamedata, Message,
+ book::{Book, BookPage, Diagram},
+};
-pub fn render_html_book(book: Book) -> Result<()> {
- Ok(())
+pub fn render_html_book(data: &Gamedata, book: &Book) -> String {
+ BookR { book, data }.to_string()
+}
+
+markup::define! {
+ BookR<'a>(data: &'a Gamedata, book: &'a Book) {
+ @markup::doctype()
+ html {
+ head {
+ style { @include_str!("book_html.css") }
+ title { "Recipe Book - Hurry Curry!" }
+ }
+ body {
+ @for page in &book.pages {
+ @PageR { data, page }
+ }
+ }
+ }
+ }
+ PageR<'a>(data: &'a Gamedata, page: &'a BookPage) {
+ section.pagegroup {
+ @match page {
+ BookPage::Cover => {
+ div.page {}
+ div.page {}
+ }
+ BookPage::Recipe { description, instruction, diagram } => {
+ div.page {
+ p { @MessageR { data, message: description } }
+ p { @MessageR { data, message: instruction } }
+ }
+ div.page {
+ @DiagramR { data, diagram }
+ }
+ }
+ BookPage::Text { .. } => {
+ div.page {}
+ div.page {}
+ }
+ BookPage::Contents { .. } => {
+ div.page {}
+ div.page {}
+ }
+ }
+ }
+ }
+
+ MessageR<'a>(data: &'a Gamedata, message: &'a Message) {
+ @match message {
+ Message::Translation { id, params } => {}
+ Message::Text(t) => { @t }
+ Message::Item(i) => { @data.item_name(*i) }
+ Message::Tile(i) => { @data.tile_name(*i) }
+ }
+ }
+
+ DiagramR<'a>(data: &'a Gamedata, diagram: &'a Diagram) {
+ div.diagram[style="position: absolute;"] {
+ @for node in &diagram.nodes {
+ div.node[style=format!("position: relative; left: {}px; top: {}px;", node.position.x, 350. - node.position.y / 2.)] {
+ @MessageR { data, message: &node.label }
+ }
+ }
+ @for edge in &diagram.edges {
+
+ }
+ }
+ }
}
diff --git a/server/tools/src/diagram_layout.rs b/server/tools/src/diagram_layout.rs
index e6ae2d76..73bfcb96 100644
--- a/server/tools/src/diagram_layout.rs
+++ b/server/tools/src/diagram_layout.rs
@@ -41,10 +41,14 @@ pub fn diagram_layout(diagram: &mut Diagram) -> Result<()> {
let mut out = String::new();
writeln!(out, "digraph {{")?;
+ for (i, _) in diagram.nodes.iter().enumerate() {
+ writeln!(out, "k{i} [width=2, height=2]")?;
+ }
for edge in &diagram.edges {
writeln!(out, "k{} -> k{}", edge.src, edge.dst)?;
}
writeln!(out, "}}")?;
+ println!("{out}");
child.stdin.as_mut().unwrap().write_all(out.as_bytes())?;
let output = child.wait_with_output()?;
diff --git a/server/tools/src/main.rs b/server/tools/src/main.rs
index 31da0388..4e5c5787 100644
--- a/server/tools/src/main.rs
+++ b/server/tools/src/main.rs
@@ -31,6 +31,7 @@ use crate::{
};
use anyhow::Result;
use clap::Parser;
+use hurrycurry_server::data::DataIndex;
#[derive(Parser)]
enum Action {
@@ -46,8 +47,19 @@ fn main() -> Result<()> {
match action {
Action::Graph => graph()?,
Action::GraphSummary => graph_summary()?,
- Action::Book => print_book()?,
- Action::BookHtml => render_html_book(book()?)?,
+ Action::Book => {
+ let mut index = DataIndex::default();
+ index.reload()?;
+ let (data, serverdata, _) = index.generate("5star")?;
+ print_book(&data, &serverdata)?
+ }
+ Action::BookHtml => {
+ let mut index = DataIndex::default();
+ index.reload()?;
+ let (data, serverdata, _) = index.generate("5star")?;
+ let book = book(&data, &serverdata)?;
+ println!("{}", render_html_book(&data, &book))
+ }
}
Ok(())
diff --git a/server/tools/src/recipe_diagram.rs b/server/tools/src/recipe_diagram.rs
index 25f8040c..7dc42c1e 100644
--- a/server/tools/src/recipe_diagram.rs
+++ b/server/tools/src/recipe_diagram.rs
@@ -17,18 +17,19 @@
*/
use anyhow::Result;
-use hurrycurry_protocol::book::{Diagram, DiagramEdge, DiagramNode};
-use hurrycurry_protocol::glam::Vec2;
-use hurrycurry_protocol::{ItemIndex, Message, RecipeIndex};
-use hurrycurry_server::data::DataIndex;
+use hurrycurry_protocol::{
+ Gamedata, ItemIndex, Message, RecipeIndex,
+ book::{Diagram, DiagramEdge, DiagramNode},
+ glam::Vec2,
+};
+use hurrycurry_server::data::Serverdata;
use std::collections::{BTreeMap, BTreeSet, HashSet};
-pub(crate) fn recipe_diagram(target_items: &[String]) -> Result<Diagram> {
- let mut index = DataIndex::default();
- index.reload()?;
-
- let (data, serverdata, _) = index.generate("5star")?;
-
+pub(crate) fn recipe_diagram(
+ data: &Gamedata,
+ serverdata: &Serverdata,
+ target_items: &[String],
+) -> Result<Diagram> {
let ambient_items = serverdata
.initial_map
.iter()