summaryrefslogtreecommitdiff
path: root/pixel-client/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'pixel-client/src/main.rs')
-rw-r--r--pixel-client/src/main.rs65
1 files changed, 46 insertions, 19 deletions
diff --git a/pixel-client/src/main.rs b/pixel-client/src/main.rs
index 76735c35..db2585af 100644
--- a/pixel-client/src/main.rs
+++ b/pixel-client/src/main.rs
@@ -1,5 +1,3 @@
-use anyhow::anyhow;
-use clap::Parser;
/*
Hurry Curry! - a game about cooking
Copyright 2024 metamuffin
@@ -17,8 +15,11 @@ use clap::Parser;
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+use anyhow::anyhow;
+use clap::{Parser, Subcommand};
use game::Game;
use hurrycurry_protocol::glam::{UVec2, Vec2};
+use menu::Menu;
use network::Network;
use render::SpriteRenderer;
use sdl2::{
@@ -33,17 +34,28 @@ use std::{
pub mod game;
pub mod helper;
+pub mod menu;
pub mod network;
pub mod render;
pub mod tilemap;
#[derive(Debug, Parser)]
pub struct Args {
- #[arg(default_value = "ws://127.0.0.1/")]
- server_address: String,
-
#[arg(short = 'r', long, default_value = "320x240")]
logical_resolution: Resolution,
+
+ #[clap(subcommand)]
+ action: Option<Action>,
+}
+
+#[derive(Debug, Subcommand, Default)]
+pub enum Action {
+ #[default]
+ Menu,
+ Join {
+ #[arg(default_value = "ws://127.0.0.1/")]
+ server_address: String,
+ },
}
#[derive(Debug, Clone)]
@@ -56,6 +68,11 @@ impl FromStr for Resolution {
}
}
+enum State {
+ Ingame(Game),
+ Menu(Menu),
+}
+
fn main() {
env_logger::init_from_env("LOG");
@@ -66,6 +83,7 @@ fn main() {
.unwrap();
let sdl_context = sdl2::init().unwrap();
+ let ttf_context = sdl2::ttf::init().unwrap();
let video_subsystem = sdl_context.video().unwrap();
let window = video_subsystem
@@ -82,16 +100,24 @@ fn main() {
.build()
.map_err(|e| e.to_string())
.unwrap();
+
let texture_creator = canvas.texture_creator();
- let mut net = Network::connect(&args.server_address).unwrap();
let mut renderer = SpriteRenderer::init(&texture_creator);
- let mut game = Game::new(&renderer.atlas_layout());
- net.queue_out.push_back(hurrycurry_protocol::PacketS::Join {
- name: "light".to_string(),
- character: 0,
- });
+ let mut state = match args.action.unwrap_or_default() {
+ Action::Menu => State::Menu(Menu::new()),
+ Action::Join { server_address } => State::Ingame(Game::new(
+ Network::connect(&server_address).unwrap(),
+ &renderer.atlas_layout(),
+ )),
+ };
+
+ // let font = ttf_context
+ // .load_font("/usr/share/fonts/noto/NotoSansMono-Regular.ttf", 24)
+ // .unwrap();
+ // let text = font.render("Hello world").blended(Color::WHITE).unwrap();
+ // texture_creator.create_texture_from_surface(text).unwrap();
let mut events = sdl_context.event_pump().unwrap();
@@ -102,21 +128,22 @@ fn main() {
.unwrap();
'mainloop: loop {
- net.poll();
-
let (width, height) = canvas.logical_size();
renderer.size = Vec2::new(width as f32, height as f32);
- for packet in net.queue_in.drain(..) {
- game.packet_in(packet, &mut renderer);
- }
-
let keyboard = KeyboardState::new(&events);
let dt = last_tick.elapsed().min(Duration::from_secs_f32(1. / 30.));
- game.tick(dt.as_secs_f32(), &keyboard, &mut net.queue_out);
+ match &mut state {
+ State::Ingame(x) => x.tick(dt.as_secs_f32(), &keyboard, renderer.atlas_layout()),
+ State::Menu(x) => x.tick(dt.as_secs_f32(), &keyboard, renderer.atlas_layout()),
+ }
+
last_tick += dt;
- game.draw(&mut renderer);
+ match &mut state {
+ State::Ingame(x) => x.draw(&mut renderer),
+ State::Menu(x) => x.draw(&mut renderer),
+ }
canvas.set_draw_color(Color::BLACK);
canvas.clear();