From 28890a870b69ac07b17e1155615a69a99cf037e4 Mon Sep 17 00:00:00 2001 From: Elijah Voigt Date: Sat, 21 Dec 2024 22:33:02 -0800 Subject: [PATCH] basic hinting --- Cargo.lock | 1 + Cargo.toml | 1 + Makefile | 4 +-- src/boot.rs | 4 +-- src/menu.rs | 42 ++++++++++++++++++++++++++++-- src/play.rs | 74 +++++++++++++++++++++++++++++++++++++++++------------ 6 files changed, 103 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba88a52..b039bbe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3564,6 +3564,7 @@ name = "set" version = "0.1.0" dependencies = [ "bevy", + "getrandom", "rand", "wasm-bindgen", ] diff --git a/Cargo.toml b/Cargo.toml index 829c7c8..2a6b329 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" wasm-bindgen = { version = "= 0.2.95" } bevy = "0.15" rand = "0.8.5" +getrandom = { version = "0.2.15", features = ["js"] } [profile.dev] opt-level = 1 diff --git a/Makefile b/Makefile index b55c627..d551ebd 100644 --- a/Makefile +++ b/Makefile @@ -23,11 +23,11 @@ out/release/set.js: target/wasm32-unknown-unknown/release/set.wasm ### ### -out/debug/assets: +out/debug/assets: assets/* rm -rf ./out/debug/assets cp -r ./assets ./out/debug/ -out/release/assets: +out/release/assets: assets/* rm -rf ./out/release/assets cp -r ./assets ./out/release/ ### diff --git a/src/boot.rs b/src/boot.rs index b9c1211..216a5bd 100644 --- a/src/boot.rs +++ b/src/boot.rs @@ -33,9 +33,9 @@ pub(crate) fn load( }) .collect(); - let test_deck = Deck { cards }; + let deck = Deck { cards }; - commands.insert_resource(test_deck); + commands.insert_resource(deck); } /// Finish boot state by starting setup diff --git a/src/menu.rs b/src/menu.rs index 61d7751..27594b4 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -3,12 +3,14 @@ use bevy::{ color::palettes::css::{BLACK, WHITE}, prelude::*, + utils::{hashbrown::hash_map::DefaultHashBuilder, tracing::field::debug}, }; use crate::{ - boot, + boot, debug, deck::{Card, Deck, ItemColor, ItemNumber, ItemPattern, ItemShape}, - play::{check_for_sets, check_set, SetNumber}, + play::{self, check_for_sets, check_set, DeckOrder, PlayLocation, SetNumber}, + setup::setup_cards, view::{button_set_state, ViewState}, }; @@ -90,6 +92,15 @@ fn setup(mut commands: Commands, server: Res) { .observe(button_hover_on) .observe(button_hover_off) .observe(button_set_state(ViewState::Play)); + parent + .spawn(button_builder(Node::default())) + .with_children(|parent| { + parent.spawn(Text("New Game".to_string())); + }) + .observe(button_hover_on) + .observe(button_hover_off) + .observe(reset_game) + .observe(button_set_state(ViewState::Play)); parent .spawn(button_builder(Node::default())) .with_children(|parent| { @@ -475,6 +486,33 @@ fn quit_button(_trigger: Trigger>, mut exit_event: EventWriter>, + cards: Query>, + deck: Res, + mut commands: Commands, +) { + std::iter::zip(Deck::iter_shuffled().enumerate(), cards.iter()).for_each( + |((i, this_card), entity)| { + let this = deck + .cards + .get(&this_card) + .unwrap_or_else(|| panic!("fech card sprite {:?}", this_card)) + .clone(); + let this_sprite = Sprite { + custom_size: Some(Vec2::new(80.0, 128.0)), + ..this + }; + let order = DeckOrder(i as u8); + commands + .entity(entity) + .remove::() + .remove::() + .insert((this_sprite, this_card, order, Visibility::Hidden)); + }, + ); +} + fn button_hover_on(trigger: Trigger>, mut query: Query<&mut BackgroundColor>) { let mut background_color = query.get_mut(trigger.entity()).unwrap(); background_color.0.set_alpha(1.0); diff --git a/src/play.rs b/src/play.rs index dcb3702..52d796f 100644 --- a/src/play.rs +++ b/src/play.rs @@ -79,20 +79,25 @@ pub(crate) fn check_set( cards.next().unwrap(), cards.next().unwrap(), ); - if is_set((a, b, c)) { - query - .iter_mut() - .for_each(|(entity, _, mut visibility, mut transform)| { - *visibility = Visibility::Hidden; - *transform = Transform::default(); - let set_number = sets.iter().len() as u8 / 3 + 1; - commands - .entity(entity) - .remove::() - .remove::() - .insert(SetNumber(set_number)); - }); - commands.trigger(UiMessage("Yipee!".into())); + match is_set((a, b, c)) { + Ok(()) => { + query + .iter_mut() + .for_each(|(entity, _, mut visibility, mut transform)| { + *visibility = Visibility::Hidden; + *transform = Transform::default(); + let set_number = sets.iter().len() as u8 / 3 + 1; + commands + .entity(entity) + .remove::() + .remove::() + .insert(SetNumber(set_number)); + }); + commands.trigger(UiMessage("Yipee!".into())); + } + Err(invalid_set_err) => { + commands.trigger(UiMessage(format!("{}", invalid_set_err))); + } } } else if cards.len() > 3 { commands.trigger(UiMessage("Too many cards!".into())); @@ -101,8 +106,34 @@ pub(crate) fn check_set( } } +struct InvalidSetErr { + color: bool, + number: bool, + pattern: bool, + shape: bool, +} + +impl std::fmt::Display for InvalidSetErr { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + let mut issues = vec![]; + if !self.color { + issues.push("Color is an issue..."); + } + if !self.number { + issues.push("Number is an issue..."); + } + if !self.pattern { + issues.push("Pattern is an issue..."); + } + if !self.shape { + issues.push("Shapes is an issue..."); + } + write!(f, "{}", issues.join("\n")) + } +} + /// Helper function to determine if three cards constitute a set -fn is_set((a, b, c): (&Card, &Card, &Card)) -> bool { +fn is_set((a, b, c): (&Card, &Card, &Card)) -> Result<(), InvalidSetErr> { let color = { ((a.color == b.color) && (b.color == c.color) && (c.color == a.color)) || ((a.color != b.color) && (b.color != c.color) && (c.color != a.color)) @@ -119,7 +150,16 @@ fn is_set((a, b, c): (&Card, &Card, &Card)) -> bool { ((a.shape == b.shape) && (b.shape == c.shape) && (c.shape == a.shape)) || ((a.shape != b.shape) && (b.shape != c.shape) && (c.shape != a.shape)) }; - color && number && pattern && shape + if color && number && pattern && shape { + Ok(()) + } else { + Err(InvalidSetErr { + color, + number, + shape, + pattern, + }) + } } #[derive(Event, Clone)] @@ -227,7 +267,7 @@ pub(crate) fn check_for_sets( }) // return the first valid set .find_map(|[(ea, ca), (eb, cb), (ec, cc)]| { - if is_set((ca, cb, cc)) { + if is_set((ca, cb, cc)).is_ok() { info!("\n\t{}\n\t{}\n\t{}", ca, cb, cc); Some((ea, eb, ec)) } else {