aboutsummaryrefslogtreecommitdiff
path: root/light-client
diff options
context:
space:
mode:
Diffstat (limited to 'light-client')
-rw-r--r--light-client/Cargo.toml4
-rw-r--r--light-client/src/game.rs4
-rw-r--r--light-client/src/main.rs4
-rw-r--r--light-client/src/network.rs51
-rw-r--r--light-client/textures/.gitignore1
-rw-r--r--light-client/textures/makefile16
-rw-r--r--light-client/textures/palette.csv121
-rw-r--r--light-client/textures/tiles/counter.ta36
-rw-r--r--light-client/textures/tiles/crate_back.ta36
-rw-r--r--light-client/textures/tiles/crate_front.ta36
-rw-r--r--light-client/textures/tiles/cutting_board.ta36
-rw-r--r--light-client/textures/tiles/plate.ta36
-rw-r--r--light-client/textures/tiles/player.ta38
-rw-r--r--light-client/textures/tiles/tomato.ta36
-rw-r--r--light-client/textures/tiles/tomato_slice.ta36
-rw-r--r--light-client/tools/Cargo.toml11
-rw-r--r--light-client/tools/src/bin/tex_export.rs58
-rw-r--r--light-client/tools/src/bin/tex_import.rs58
-rw-r--r--light-client/tools/src/bin/tex_pack.rs77
-rw-r--r--light-client/tools/src/lib.rs0
20 files changed, 692 insertions, 3 deletions
diff --git a/light-client/Cargo.toml b/light-client/Cargo.toml
index a7cb5199..ad50130c 100644
--- a/light-client/Cargo.toml
+++ b/light-client/Cargo.toml
@@ -7,3 +7,7 @@ edition = "2021"
sdl2 = { version = "0.37.0", features = ["image", "ttf"] }
hurrycurry-protocol = { path = "../server/protocol" }
tungstenite = "0.23.0"
+serde_json = "1.0.120"
+bincode = "2.0.0-rc.3"
+log = "0.4.22"
+env_logger = "0.11.3"
diff --git a/light-client/src/game.rs b/light-client/src/game.rs
new file mode 100644
index 00000000..fd045f53
--- /dev/null
+++ b/light-client/src/game.rs
@@ -0,0 +1,4 @@
+
+pub struct Game {
+
+}
diff --git a/light-client/src/main.rs b/light-client/src/main.rs
index 03c2fd76..85254ef4 100644
--- a/light-client/src/main.rs
+++ b/light-client/src/main.rs
@@ -1,3 +1,4 @@
+use network::Network;
/*
Hurry Curry! - a game about cooking
Copyright 2024 metamuffin
@@ -24,8 +25,11 @@ use sdl2::{
};
pub mod network;
+pub mod game;
fn main() {
+ let net = Network::connect("ws://127.0.0.1:27032/");
+
let sdl_context = sdl2::init().unwrap();
let video_subsystem = sdl_context.video().unwrap();
let _image_context = sdl2::image::init(InitFlag::WEBP).unwrap();
diff --git a/light-client/src/network.rs b/light-client/src/network.rs
index 2a185b73..dc6e894f 100644
--- a/light-client/src/network.rs
+++ b/light-client/src/network.rs
@@ -1,7 +1,52 @@
-pub struct Network {}
+use hurrycurry_protocol::{PacketC, PacketS, BINCODE_CONFIG};
+use log::warn;
+use std::{collections::VecDeque, net::TcpStream};
+use tungstenite::{stream::MaybeTlsStream, Message, WebSocket};
+
+pub struct Network {
+ sock: WebSocket<MaybeTlsStream<TcpStream>>,
+ queue_in: VecDeque<PacketC>,
+ queue_out: VecDeque<PacketS>,
+}
impl Network {
- pub fn connect(addr: &str) {
- let (sock, resp) = tungstenite::connect(addr).unwrap();
+ pub fn connect(addr: &str) -> Self {
+ let (sock, _resp) = tungstenite::connect(addr).unwrap();
+ Self {
+ sock,
+ queue_in: VecDeque::new(),
+ queue_out: VecDeque::new(),
+ }
+ }
+ pub fn poll(&mut self) {
+ self.queue_in.extend(match self.sock.read() {
+ Ok(Message::Text(packet)) => match serde_json::from_str(&packet) {
+ Ok(p) => Some(p),
+ Err(e) => {
+ warn!("invalid json packet: {e:?}");
+ None
+ }
+ },
+ Ok(Message::Binary(packet)) => {
+ match bincode::decode_from_slice(&packet, BINCODE_CONFIG) {
+ Ok((p, _)) => Some(p),
+ Err(e) => {
+ warn!("invalid bincode packet: {e:?}");
+ None
+ }
+ }
+ }
+ Ok(_) => None,
+ Err(e) => {
+ warn!("{e:?}");
+ None
+ }
+ });
+
+ for packet in self.queue_out.drain(..) {
+ self.sock
+ .write(Message::Text(serde_json::to_string(&packet).unwrap()))
+ .unwrap();
+ }
}
}
diff --git a/light-client/textures/.gitignore b/light-client/textures/.gitignore
new file mode 100644
index 00000000..e33609d2
--- /dev/null
+++ b/light-client/textures/.gitignore
@@ -0,0 +1 @@
+*.png
diff --git a/light-client/textures/makefile b/light-client/textures/makefile
new file mode 100644
index 00000000..1dd60ff4
--- /dev/null
+++ b/light-client/textures/makefile
@@ -0,0 +1,16 @@
+
+
+ALL_TA = $(patsubst %.png,%.ta,$(shell find -name '*.png'))
+ALL_PNG = $(patsubst %.ta,%.png,$(shell find -name '*.ta'))
+
+.PHONY: tex_export tex_import clean
+tex_import: $(ALL_TA)
+tex_export: $(ALL_PNG)
+clean:
+ rm $(ALL_PNG)
+
+%.ta: %.png
+ ../../target/release/tex_import $< $@
+%.png: %.ta
+ ../../target/release/tex_export $< $@
+
diff --git a/light-client/textures/palette.csv b/light-client/textures/palette.csv
new file mode 100644
index 00000000..985d23ab
--- /dev/null
+++ b/light-client/textures/palette.csv
@@ -0,0 +1,121 @@
+ ,0,0,0,0
+a,255,255,255,255
+b,242,242,242,255
+c,230,230,230,255
+d,217,217,217,255
+e,204,204,204,255
+f,191,191,191,255
+g,178,178,178,255
+h,166,166,166,255
+i,153,153,153,255
+j,140,140,140,255
+k,128,128,128,255
+l,115,115,115,255
+m,102,102,102,255
+n,89,89,89,255
+o,76,76,76,255
+p,64,64,64,255
+q,51,51,51,255
+r,38,38,38,255
+s,26,26,26,255
+t,0,0,0,255
+u,242,252,36,255
+v,255,234,0,255
+w,254,167,17,255
+x,254,139,104,255
+y,251,59,2,255
+z,254,53,33,255
+A,208,0,0,255
+B,168,31,61,255
+C,120,4,34,255
+D,43,0,0,255
+E,241,226,197,255
+F,254,228,179,255
+G,254,218,187,255
+H,254,194,142,255
+I,216,143,87,255
+J,189,99,64,255
+K,162,64,43,255
+L,99,53,45,255
+M,107,40,51,255
+N,52,18,12,255
+O,231,203,143,255
+P,209,179,139,255
+Q,193,177,127,255
+R,215,152,11,255
+S,255,177,0,255
+T,254,139,0,255
+U,255,106,0,255
+V,183,65,0,255
+W,95,62,29,255
+X,59,35,0,255
+Y,254,202,218,255
+Z,254,101,203,255
+0,254,19,146,255
+1,221,48,98,255
+2,192,74,109,255
+3,137,22,136,255
+4,77,38,137,255
+5,68,21,33,255
+6,44,17,57,255
+7,36,20,34,255
+8,255,255,125,255
+9,255,255,0,255
+!,255,127,0,255
+",255,125,125,255
+§,255,125,255,255
+$,255,0,254,255
+%,255,0,127,255
+&,255,0,0,255
+/,127,0,0,255
+(,10,10,0,255
+),246,253,255,255
+=,233,247,255,255
+?,207,230,254,255
+[,170,199,254,255
+],119,179,254,255
+{,30,116,253,255
+},0,70,170,255
+^,47,68,118,255
++,0,48,82,255
+-,14,14,37,255
+*,238,245,240,255
+~,214,229,222,255
+#,172,216,185,255
+',108,173,198,255
+.,66,169,175,255
+:,0,127,127,255
+;,73,103,92,255
+\,46,78,78,255
+<,29,50,57,255
+>,15,28,33,255
+|,216,255,244,255
+ö,184,244,245,255
+ä,174,204,181,255
+ü,118,197,120,255
+Ö,53,135,87,255
+Ä,64,155,104,255
+Ü,70,135,104,255
+ß,31,81,43,255
+¿,42,60,55,255
+¡,18,46,29,255
+ẞ,239,255,201,255
+Æ,230,243,133,255
+æ,188,245,28,255
+€,212,220,24,255
+Ø,130,211,34,255
+ł,92,127,0,255
+Ł,89,147,43,255
+Ω,41,127,0,255
+€,0,67,32,255
+«,28,51,34,255
+»,0,255,127,255
+‹,0,255,0,255
+›,125,255,125,255
+„,125,255,255,255
+“,0,255,255,255
+@,125,125,255,255
+Ŧ,127,0,255,255
+ŧ,0,0,255,255
+ø,63,0,127,255
+¤,0,0,127,255
diff --git a/light-client/textures/tiles/counter.ta b/light-client/textures/tiles/counter.ta
new file mode 100644
index 00000000..846fdbe3
--- /dev/null
+++ b/light-client/textures/tiles/counter.ta
@@ -0,0 +1,36 @@
+KKKJJJJJJJJJJJJJJJJJJJJJJJJJJKKK
+KJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK
+KJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK
+JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+KJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+KJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK
+JJKKKKKJJJJJJJJJJJJJJJJJJJKKKKKK
+LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
+LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
+IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
+IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPI
+IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPI
+IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPI
+IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPI
+IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
diff --git a/light-client/textures/tiles/crate_back.ta b/light-client/textures/tiles/crate_back.ta
new file mode 100644
index 00000000..2f434d67
--- /dev/null
+++ b/light-client/textures/tiles/crate_back.ta
@@ -0,0 +1,36 @@
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
+NNNNNNNLNNNNNNNNLNNNNNNNLNNNNNNN
+NNNNNNNLNNNNNNNNLNNNNNNNLNNNNNNN
+NNNNNNNLNNNNNNNNLNNNNNNNLNNNNNNN
+NNNNNNNLNNNNNNNNLNNNNNNNLNNNNNNN
+NNNNNNNLNNNNNNNNLNNNNNNNLNNNNNNN
+NNNNNNNLNNNNNNNLLNNNNNNNLNNNNNNN
+NNNNNNNLNNNNNNNLNNNNNNNNLNNNNNNN
+NNNNNNNLNNNNNNNLNNNNNNNNLNNNNNNN
+NNNNNNNLNNNNNNNLNNNNNNNNLNNNNNNN
+NNNNNNNLNNNNNNNLNNNNNNNNLNNNNNNN
+NNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
diff --git a/light-client/textures/tiles/crate_front.ta b/light-client/textures/tiles/crate_front.ta
new file mode 100644
index 00000000..ff6e2d83
--- /dev/null
+++ b/light-client/textures/tiles/crate_front.ta
@@ -0,0 +1,36 @@
+LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+L L
+LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
+KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
+LKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKL
+KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
+L L
+LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
+KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
+LKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKL
+KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
+L L
+LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
+KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
+LKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKL
diff --git a/light-client/textures/tiles/cutting_board.ta b/light-client/textures/tiles/cutting_board.ta
new file mode 100644
index 00000000..e6137c94
--- /dev/null
+++ b/light-client/textures/tiles/cutting_board.ta
@@ -0,0 +1,36 @@
+
+
+ xPPxxxxxxxxxxxxxxxxxxPPP
+ xxxxxxxxxxxxxxxxxxxxxxxP
+ PxxxxxxxxxxxxxxxxxxxxxxP
+ Pxxxxxxxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxxxxxx
+ Pxxxxxxxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxxxxxP
+ Pxxxxxxxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxxxxxP
+ xxxxxxxxxxxxxxxxxxxxxxxP
+ PxxxxxxxxxxxxxxxxxxxxxxP
+ PPPxxxxxxxxxxxxxxxxxxPPP
+ LLLLLLLLLLLLLLLLLLLLLLLL
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/light-client/textures/tiles/plate.ta b/light-client/textures/tiles/plate.ta
new file mode 100644
index 00000000..6766989f
--- /dev/null
+++ b/light-client/textures/tiles/plate.ta
@@ -0,0 +1,36 @@
+
+ ffffffffffff
+ fffjjjjjjjjfff
+ fffjjjjjjjjjjjjfff
+ fffjjjjjjjjjjjjjjjff
+ fffjjjffffffffffffjjff
+ fffjjfffffffffffffffjjff
+ ffjjfffffffffffffffffjjff
+ ffjfffffffffffffffffffjff
+ ffffffffffffffffffffffffff
+ fffffffffffffffffffffffffff
+ fffffffffffffffffffffffffff
+ fffffffffffffffffffffffffff
+ fffffffffffffffffffffffffff
+ fffffffffffffffffffffffffff
+ ffffffffffffffffffffffffff
+ fffffffffffffffffffffffjf
+ fjfffffffffffffffffffffj
+ jjfffffffffffffffffffj
+ jjfffffffffffffffffj
+ jjffffffffffffffjj
+ jjjffffffffffjjj
+ jjjjjjjjjjjj
+ jjjjjj
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/light-client/textures/tiles/player.ta b/light-client/textures/tiles/player.ta
new file mode 100644
index 00000000..065a3255
--- /dev/null
+++ b/light-client/textures/tiles/player.ta
@@ -0,0 +1,38 @@
+ eeeeeecccee
+ ececcccceaee
+ ecaeeeeccaae
+ eaaaaaaacaae
+ eacaaacaaace
+ eacacacaaace
+ eaceeeeeeeee
+ eeeevvvvvvv
+ vvvvvvvvvvvv
+ vvvvvvvvvvvv
+ vvvvvvvvvvvv
+ vvvvvvvvvvv
+ Rvvvvvvvvvv
+ RvvvvvvvvvR
+ RvvvvvvvR
+ RRvvvRR
+ wwwwRRwww
+ wwwwwwwvvvv
+ wwwwvvvvvvvv
+ vvwvvvvvvvvvv
+ vvvvvvvvvvvvvv
+ vvvvvvvvvvvvvvvv
+ vvvvvvvvvvvvvvvvvv
+ vvvvvvvvvvvvvvvvvvv
+ vvvvvvvvvvvvvvvvvvvvv
+ vvvvvvvvvvvvvvvvvvvvvv
+ vvvvvvvvvvvvvvvvvvvvvvvv
+ vvvvvvvvvvvvvvvvvvvvvvvv
+ vvvvvvvvvvvvvvvvvvvvvvvvvv
+ wvvvvvvvvvvvvvvvvvvvvvvvvw
+ wwvvvvvvvvvvvvvvvvvvvvvvww
+ wwwvvvvvvvvvvvvvvvvvvvwww
+ wwwwwvvvvvvvvvvvvvvvwwww
+ wwwwwwwvvvvvvvvvvwwwww
+ wwwwwwwwwwwwwwwwwwww
+ wwwwwwwwwwwwwwww
+ wwwwwwwwwwwwww
+ wwwwwwwwwwww
diff --git a/light-client/textures/tiles/tomato.ta b/light-client/textures/tiles/tomato.ta
new file mode 100644
index 00000000..694cbb80
--- /dev/null
+++ b/light-client/textures/tiles/tomato.ta
@@ -0,0 +1,36 @@
+
+
+
+ ßßÖÄ
+ ßßßßß
+ ۧ ۅ
+ z€ßÄ€z
+ zÖz€¡ß€yzA
+ zzÄ€€€€€yAAA
+ zzAyy€AA€AAAAA
+ zAAxx€yyy€Azzz
+ zAAxxy€xAAzzzzy
+ AAAAxyxyAAzzAAy
+ zzAAAAAAAAzzAAy
+ yzzAAAAAAAzzAy
+ yyzzAAAAAAyAAy
+ yyzzAAAAyyAy
+ yyzzAyyyyy
+ yyyyyyyy
+ yyy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/light-client/textures/tiles/tomato_slice.ta b/light-client/textures/tiles/tomato_slice.ta
new file mode 100644
index 00000000..199a3d99
--- /dev/null
+++ b/light-client/textures/tiles/tomato_slice.ta
@@ -0,0 +1,36 @@
+
+
+
+
+
+ AAAJ
+ AAzzAAJHAAAA
+ AA///zA/HAAAAAAJ
+ A//x//AHHA////AA
+ A/////zÆHA/x//AA
+ A/////zzÆA/////A
+ AA///zAzzA//x//A
+ Ax/zAAzz/////AA
+ A//zA/zz////zA
+ A//A//zz/x/zz
+ A/A//z///zzz
+ AAA///AAAzz
+ AAA//zzzz
+ Azzz
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/light-client/tools/Cargo.toml b/light-client/tools/Cargo.toml
new file mode 100644
index 00000000..2a1dacb9
--- /dev/null
+++ b/light-client/tools/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "tools"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+image = "0.25.1"
+anyhow = "1.0.86"
+log = "0.4.22"
+env_logger = "0.11.3"
+clap = { version = "4.5.9", features = ["derive"] }
diff --git a/light-client/tools/src/bin/tex_export.rs b/light-client/tools/src/bin/tex_export.rs
new file mode 100644
index 00000000..2132b5ed
--- /dev/null
+++ b/light-client/tools/src/bin/tex_export.rs
@@ -0,0 +1,58 @@
+use clap::Parser;
+use image::Rgba;
+use std::{
+ collections::HashMap,
+ fs::File,
+ io::{BufRead, BufReader},
+ path::PathBuf,
+};
+
+#[derive(Parser)]
+struct Args {
+ input: PathBuf,
+ output: PathBuf,
+}
+
+fn main() {
+ let Args {
+ input,
+ output: out_path,
+ } = Args::parse();
+
+ let palette = include_str!("../../../textures/palette.csv")
+ .split('\n')
+ .filter(|l| !l.is_empty())
+ .map(|s| {
+ let (c, s) = s.split_once(",").unwrap();
+ let (r, s) = s.split_once(",").unwrap();
+ let (g, s) = s.split_once(",").unwrap();
+ let (b, a) = s.split_once(",").unwrap();
+ (
+ c.chars().next().unwrap(),
+ [
+ r.parse().unwrap(),
+ g.parse().unwrap(),
+ b.parse().unwrap(),
+ a.parse().unwrap(),
+ ],
+ )
+ })
+ .collect::<HashMap<_, _>>();
+
+ let file = BufReader::new(File::open(&input).unwrap());
+ let tex = file.lines().map(Result::unwrap).collect::<Vec<String>>();
+ let (width, height) = (tex[0].len(), tex.len());
+
+ let mut output = image::ImageBuffer::<Rgba<u8>, Vec<_>>::new(width as u32, height as u32);
+
+ for (y, line) in tex.iter().enumerate() {
+ if line.is_empty() {
+ continue;
+ }
+ for (x, char) in line.chars().enumerate() {
+ output.put_pixel(x as u32, y as u32, Rgba(*palette.get(&char).unwrap()));
+ }
+ }
+
+ output.save(out_path).unwrap();
+}
diff --git a/light-client/tools/src/bin/tex_import.rs b/light-client/tools/src/bin/tex_import.rs
new file mode 100644
index 00000000..89cbc8c9
--- /dev/null
+++ b/light-client/tools/src/bin/tex_import.rs
@@ -0,0 +1,58 @@
+use clap::Parser;
+use std::{
+ collections::HashMap,
+ fs::File,
+ io::{BufWriter, Write},
+ path::PathBuf,
+ process::exit,
+};
+
+#[derive(Parser)]
+struct Args {
+ input: PathBuf,
+ output: PathBuf,
+}
+
+fn main() {
+ let Args { input, output } = Args::parse();
+
+ let palette = include_str!("../../../textures/palette.csv")
+ .split('\n')
+ .filter(|l| !l.is_empty())
+ .map(|s| {
+ let (c, s) = s.split_once(",").unwrap();
+ let (r, s) = s.split_once(",").unwrap();
+ let (g, s) = s.split_once(",").unwrap();
+ let (b, a) = s.split_once(",").unwrap();
+ (
+ [
+ r.parse().unwrap(),
+ g.parse().unwrap(),
+ b.parse().unwrap(),
+ a.parse().unwrap(),
+ ],
+ c.chars().next().unwrap(),
+ )
+ })
+ .collect::<HashMap<_, _>>();
+
+ let input = image::open(input).unwrap().to_rgba8();
+ let mut output = BufWriter::new(File::create(output).unwrap());
+
+ for y in 0..input.height() {
+ for x in 0..input.width() {
+ let mut c = input.get_pixel(x, y).0;
+ if c[3] == 0 {
+ c = [0, 0, 0, 0];
+ }
+ let Some(char) = palette.get(&c) else {
+ eprintln!("color at {x},{y} not in palette: {c:?}");
+ exit(1);
+ };
+ write!(output, "{char}").unwrap();
+ }
+ writeln!(output).unwrap();
+ }
+ output.flush().unwrap();
+ output.into_inner().unwrap().flush().unwrap()
+}
diff --git a/light-client/tools/src/bin/tex_pack.rs b/light-client/tools/src/bin/tex_pack.rs
new file mode 100644
index 00000000..23056608
--- /dev/null
+++ b/light-client/tools/src/bin/tex_pack.rs
@@ -0,0 +1,77 @@
+use clap::Parser;
+use std::{
+ fs::File,
+ io::{BufRead, BufReader, BufWriter, Write},
+ path::PathBuf,
+};
+
+#[derive(Parser)]
+struct Args {
+ atlas_out: PathBuf,
+ atlas_meta_out: PathBuf,
+ inputs: Vec<PathBuf>,
+}
+
+fn main() {
+ let Args {
+ inputs,
+ atlas_meta_out,
+ atlas_out,
+ } = Args::parse();
+
+ let atlas_size = 1024;
+
+ let mut cursor_x = 0;
+ let mut cursor_y = 0;
+ let mut row_height = 0;
+
+ let mut texels = vec![vec![' '; atlas_size]; atlas_size];
+ let mut metadata = Vec::new();
+
+ for path in inputs {
+ let file = BufReader::new(File::open(&path).unwrap());
+ let tex = file.lines().map(Result::unwrap).collect::<Vec<String>>();
+ let (width, height) = (tex[0].len(), tex.len());
+
+ if cursor_x + width > atlas_size {
+ cursor_y += row_height;
+ row_height = 0;
+ cursor_x = 0;
+ }
+ if cursor_y + height > atlas_size {
+ panic!("texture too big or atlas full")
+ }
+ row_height = row_height.max(atlas_size);
+ let texcoord = [cursor_x, cursor_y];
+
+ for (y, line) in tex.iter().enumerate() {
+ if line.is_empty() {
+ continue;
+ }
+ for (x, char) in line.chars().enumerate() {
+ texels[cursor_y + y][cursor_x + x] = char;
+ }
+ }
+
+ metadata.push((
+ texcoord,
+ path.file_stem().unwrap().to_str().unwrap().to_string(),
+ ));
+
+ cursor_x += atlas_size;
+ }
+
+ let mut atlas_out = BufWriter::new(File::create(atlas_out).unwrap());
+ let mut atlas_meta_out = BufWriter::new(File::create(atlas_meta_out).unwrap());
+
+ for line in texels {
+ for char in line {
+ write!(atlas_out, "{char}").unwrap()
+ }
+ writeln!(atlas_out).unwrap();
+ }
+
+ for ([x, y], name) in metadata {
+ writeln!(atlas_meta_out, "{x},{y},{name}").unwrap();
+ }
+}
diff --git a/light-client/tools/src/lib.rs b/light-client/tools/src/lib.rs
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/light-client/tools/src/lib.rs