basic hinting

main
Elijah Voigt 1 year ago
parent a31a624c82
commit 28890a870b

1
Cargo.lock generated

@ -3564,6 +3564,7 @@ name = "set"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"bevy", "bevy",
"getrandom",
"rand", "rand",
"wasm-bindgen", "wasm-bindgen",
] ]

@ -7,6 +7,7 @@ edition = "2021"
wasm-bindgen = { version = "= 0.2.95" } wasm-bindgen = { version = "= 0.2.95" }
bevy = "0.15" bevy = "0.15"
rand = "0.8.5" rand = "0.8.5"
getrandom = { version = "0.2.15", features = ["js"] }
[profile.dev] [profile.dev]
opt-level = 1 opt-level = 1

@ -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 rm -rf ./out/debug/assets
cp -r ./assets ./out/debug/ cp -r ./assets ./out/debug/
out/release/assets: out/release/assets: assets/*
rm -rf ./out/release/assets rm -rf ./out/release/assets
cp -r ./assets ./out/release/ cp -r ./assets ./out/release/
### ###

@ -33,9 +33,9 @@ pub(crate) fn load(
}) })
.collect(); .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 /// Finish boot state by starting setup

@ -3,12 +3,14 @@
use bevy::{ use bevy::{
color::palettes::css::{BLACK, WHITE}, color::palettes::css::{BLACK, WHITE},
prelude::*, prelude::*,
utils::{hashbrown::hash_map::DefaultHashBuilder, tracing::field::debug},
}; };
use crate::{ use crate::{
boot, boot, debug,
deck::{Card, Deck, ItemColor, ItemNumber, ItemPattern, ItemShape}, 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}, view::{button_set_state, ViewState},
}; };
@ -90,6 +92,15 @@ fn setup(mut commands: Commands, server: Res<AssetServer>) {
.observe(button_hover_on) .observe(button_hover_on)
.observe(button_hover_off) .observe(button_hover_off)
.observe(button_set_state(ViewState::Play)); .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 parent
.spawn(button_builder(Node::default())) .spawn(button_builder(Node::default()))
.with_children(|parent| { .with_children(|parent| {
@ -475,6 +486,33 @@ fn quit_button(_trigger: Trigger<Pointer<Click>>, mut exit_event: EventWriter<Ap
exit_event.send(AppExit::Success); exit_event.send(AppExit::Success);
} }
fn reset_game(
_trigger: Trigger<Pointer<Click>>,
cards: Query<Entity, With<Card>>,
deck: Res<Deck>,
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::<SetNumber>()
.remove::<PlayLocation>()
.insert((this_sprite, this_card, order, Visibility::Hidden));
},
);
}
fn button_hover_on(trigger: Trigger<Pointer<Over>>, mut query: Query<&mut BackgroundColor>) { fn button_hover_on(trigger: Trigger<Pointer<Over>>, mut query: Query<&mut BackgroundColor>) {
let mut background_color = query.get_mut(trigger.entity()).unwrap(); let mut background_color = query.get_mut(trigger.entity()).unwrap();
background_color.0.set_alpha(1.0); background_color.0.set_alpha(1.0);

@ -79,20 +79,25 @@ pub(crate) fn check_set(
cards.next().unwrap(), cards.next().unwrap(),
cards.next().unwrap(), cards.next().unwrap(),
); );
if is_set((a, b, c)) { match is_set((a, b, c)) {
query Ok(()) => {
.iter_mut() query
.for_each(|(entity, _, mut visibility, mut transform)| { .iter_mut()
*visibility = Visibility::Hidden; .for_each(|(entity, _, mut visibility, mut transform)| {
*transform = Transform::default(); *visibility = Visibility::Hidden;
let set_number = sets.iter().len() as u8 / 3 + 1; *transform = Transform::default();
commands let set_number = sets.iter().len() as u8 / 3 + 1;
.entity(entity) commands
.remove::<PlayLocation>() .entity(entity)
.remove::<Selected>() .remove::<PlayLocation>()
.insert(SetNumber(set_number)); .remove::<Selected>()
}); .insert(SetNumber(set_number));
commands.trigger(UiMessage("Yipee!".into())); });
commands.trigger(UiMessage("Yipee!".into()));
}
Err(invalid_set_err) => {
commands.trigger(UiMessage(format!("{}", invalid_set_err)));
}
} }
} else if cards.len() > 3 { } else if cards.len() > 3 {
commands.trigger(UiMessage("Too many cards!".into())); 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 /// 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 = { 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))
|| ((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))
|| ((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)] #[derive(Event, Clone)]
@ -227,7 +267,7 @@ pub(crate) fn check_for_sets(
}) })
// return the first valid set // return the first valid set
.find_map(|[(ea, ca), (eb, cb), (ec, cc)]| { .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); info!("\n\t{}\n\t{}\n\t{}", ca, cb, cc);
Some((ea, eb, ec)) Some((ea, eb, ec))
} else { } else {

Loading…
Cancel
Save