Combine deck into one sprite sheet, add aseprite to toolchain

main
Elijah Voigt 1 year ago
parent 41bbca55cc
commit f3b795f9c6

@ -1,36 +1 @@
open_circle_white.png filter=lfs diff=lfs merge=lfs -text
shaded_circle_green.png filter=lfs diff=lfs merge=lfs -text
shaded_circle_purple.png filter=lfs diff=lfs merge=lfs -text
filled_circle_white.png filter=lfs diff=lfs merge=lfs -text
open_circle_green.png filter=lfs diff=lfs merge=lfs -text
shaded_squiggle_white.png filter=lfs diff=lfs merge=lfs -text
filled_diamond_green.png filter=lfs diff=lfs merge=lfs -text
open_squiggle_purple.png filter=lfs diff=lfs merge=lfs -text
filled_squiggle_red.png filter=lfs diff=lfs merge=lfs -text
open_circle_red.png filter=lfs diff=lfs merge=lfs -text
open_circle_purple.png filter=lfs diff=lfs merge=lfs -text
open_squiggle_white.png filter=lfs diff=lfs merge=lfs -text
shaded_squiggle_red.png filter=lfs diff=lfs merge=lfs -text
filled_circle_green.png filter=lfs diff=lfs merge=lfs -text
filled_squiggle_green.png filter=lfs diff=lfs merge=lfs -text
shaded_diamond_purple.png filter=lfs diff=lfs merge=lfs -text
shaded_diamond_white.png filter=lfs diff=lfs merge=lfs -text
shaded_squiggle_purple.png filter=lfs diff=lfs merge=lfs -text
filled_diamond_purple.png filter=lfs diff=lfs merge=lfs -text
shaded_circle_red.png filter=lfs diff=lfs merge=lfs -text
filled_circle_purple.png filter=lfs diff=lfs merge=lfs -text
shaded_squiggle_green.png filter=lfs diff=lfs merge=lfs -text
open_diamond_purple.png filter=lfs diff=lfs merge=lfs -text
open_diamond_white.png filter=lfs diff=lfs merge=lfs -text
open_squiggle_red.png filter=lfs diff=lfs merge=lfs -text
shaded_circle_white.png filter=lfs diff=lfs merge=lfs -text
shaded_diamond_green.png filter=lfs diff=lfs merge=lfs -text
filled_squiggle_purple.png filter=lfs diff=lfs merge=lfs -text
open_diamond_green.png filter=lfs diff=lfs merge=lfs -text
filled_diamond_white.png filter=lfs diff=lfs merge=lfs -text
filled_squiggle_white.png filter=lfs diff=lfs merge=lfs -text
open_diamond_red.png filter=lfs diff=lfs merge=lfs -text
open_squiggle_green.png filter=lfs diff=lfs merge=lfs -text
shaded_diamond_red.png filter=lfs diff=lfs merge=lfs -text
filled_circle_red.png filter=lfs diff=lfs merge=lfs -text
filled_diamond_red.png filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text

BIN
assets/cards.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/filled_circle_green.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/filled_circle_purple.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/filled_circle_red.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/filled_circle_white.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/filled_diamond_green.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/filled_diamond_purple.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/filled_diamond_red.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/filled_diamond_white.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/filled_squiggle_green.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/filled_squiggle_purple.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/filled_squiggle_red.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/filled_squiggle_white.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/its-the-balatro-music.mp3 (Stored with Git LFS)

Binary file not shown.

BIN
assets/its-the-balatro-music.ogg (Stored with Git LFS)

Binary file not shown.

BIN
assets/open_circle_green.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/open_circle_purple.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/open_circle_red.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/open_circle_white.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/open_diamond_green.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/open_diamond_purple.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/open_diamond_red.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/open_diamond_white.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/open_squiggle_green.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/open_squiggle_purple.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/open_squiggle_red.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/open_squiggle_white.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/shaded_circle_green.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/shaded_circle_purple.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/shaded_circle_red.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/shaded_circle_white.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/shaded_diamond_green.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/shaded_diamond_purple.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/shaded_diamond_red.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/shaded_diamond_white.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/shaded_squiggle_green.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/shaded_squiggle_purple.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/shaded_squiggle_red.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/shaded_squiggle_white.png (Stored with Git LFS)

Binary file not shown.

@ -13,6 +13,7 @@
overlays = [ (import rust-overlay) ];
pkgs = (import nixpkgs) {
inherit system overlays;
config.allowUnfree = true;
};
naersk' = pkgs.callPackage naersk { };
buildInputs = with pkgs; [
@ -42,6 +43,7 @@
wasm-pack
wasm-bindgen-cli
simple-http-server
aseprite
] ++ buildInputs ++ nativeBuildInputs;
in
rec {

@ -1,4 +1,4 @@
use bevy::{color::palettes::css::BLACK, prelude::*, window::WindowResized};
use bevy::prelude::*;
use crate::deck::Card;
@ -8,7 +8,6 @@ pub struct DebugPlugin;
impl Plugin for DebugPlugin {
fn build(&self, app: &mut App) {
app.add_observer(track_card_info)
.add_systems(Update, update_window_info)
.add_systems(Startup, init_ui);
}
}
@ -16,9 +15,6 @@ impl Plugin for DebugPlugin {
#[derive(Component)]
pub(crate) struct DebugText;
#[derive(Component)]
pub(crate) struct WindowInfoText;
fn init_ui(mut commands: Commands) {
commands
.spawn((
@ -36,45 +32,6 @@ fn init_ui(mut commands: Commands) {
PickingBehavior::IGNORE,
));
});
commands
.spawn((
Node {
position_type: PositionType::Absolute,
top: Val::Px(0.0),
right: Val::Px(0.0),
..default()
},
BackgroundColor(BLACK.into()),
GlobalZIndex(1),
))
.with_children(|parent| {
parent
.spawn(Button)
.with_children(|parent| {
parent.spawn((
Text("-".into()),
TextFont {
font_size: 60.0,
..default()
},
));
})
.observe(decrease_scale_ratio);
parent
.spawn(Button)
.with_children(|parent| {
parent.spawn((
Text("+".into()),
TextFont {
font_size: 60.0,
..default()
},
));
})
.observe(increase_scale_ratio);
parent.spawn((Text("????x????".to_string()), WindowInfoText));
});
}
fn track_card_info(
@ -114,42 +71,3 @@ pub(crate) fn hide_debug_card(
*v = Visibility::Hidden;
});
}
fn update_window_info(
mut events: EventReader<WindowResized>,
windows: Query<&mut Window>,
mut infos: Query<&mut Text, With<WindowInfoText>>,
) {
events.read().for_each(|_| {
info!("Window resized");
let window = windows.single();
let width = window.resolution.width();
let height = window.resolution.height();
let scale_factor = window.resolution.scale_factor();
let mut info = infos.single_mut();
info.0 = format!("{:.0}x{:.0} ({:.03})", width, height, scale_factor,);
});
}
fn increase_scale_ratio(
_trigger: Trigger<Pointer<Click>>,
// TODO: Move window scale factor out to non-debug system
mut windows: Query<&mut Window>,
) {
info!("increase scale ratio");
let mut window = windows.single_mut();
let current = window.scale_factor();
window.resolution.set_scale_factor(current + 0.05);
}
fn decrease_scale_ratio(
_trigger: Trigger<Pointer<Click>>,
// TODO: Move window scale factor out to non-debug system
mut windows: Query<&mut Window>,
) {
info!("decrease scale ratio");
let mut window = windows.single_mut();
let current = window.scale_factor();
window.resolution.set_scale_factor(current - 0.05);
}

@ -1,7 +1,4 @@
use bevy::{
prelude::*,
utils::{HashMap, RandomState},
};
use bevy::{prelude::*, utils::HashMap};
/// Deck and Cards
pub struct DeckPlugin;
@ -82,33 +79,66 @@ pub(crate) struct Card {
impl Card {
pub(crate) fn sprite(&self) -> (String, TextureAtlasLayout, u8) {
let fname = {
let col = match self.color {
ItemColor::Red => "red",
ItemColor::Green => "green",
ItemColor::Purple => "purple",
// Spritesheet contains all cards ordered like so:
// | squiggle | diamond | oval |
// | 1 | 2 | 3 | 1 | 2 | 3 | 1 | 2 | 3 |
// | open green
// | open blue
// | open red
// | shaded green
// | shaded blue
// | shaded red
// | filled green
// | filled blue
// | filled red
// with all sprites being 20x32
// we have 12 rows and 9 columns total
// so the col + row for 1+open+red+squiggle is col 0 + row 3
// and the col + row for 3 filled blue oval is col 8 + row 11
let num = {
let row = {
let pattern_row = match self.pattern {
ItemPattern::Open => 0,
ItemPattern::Striped => 1,
ItemPattern::Solid => 2,
};
let pat = match self.pattern {
ItemPattern::Solid => "filled",
ItemPattern::Striped => "shaded",
ItemPattern::Open => "open",
let color_row = match self.color {
ItemColor::Green => 0,
ItemColor::Purple => 1,
ItemColor::Red => 2,
};
let shape = match self.shape {
ItemShape::Oval => "circle",
ItemShape::Diamond => "diamond",
ItemShape::Squiggle => "squiggle",
(3 * pattern_row) + color_row + 3
};
format!("{}_{}_{}.png", pat, shape, col)
let col = {
let shape_col = match self.shape {
ItemShape::Squiggle => 0,
ItemShape::Diamond => 1,
ItemShape::Oval => 2,
};
let num = match self.number {
let number_col = match self.number {
ItemNumber::One => 0,
ItemNumber::Two => 1,
ItemNumber::Three => 2,
};
(3 * shape_col) + number_col
};
info!("Row: {:?} Col: {:?}", row, col);
assert!(row < 12);
assert!(row > 2);
assert!(col < 9);
// Figure out the sprite number based on row + col
(9 * row) + col
};
info!("Index: {:?}", num);
assert!(num < 108);
let size = UVec2 { x: 20, y: 32 };
let layout = TextureAtlasLayout::from_grid(size, 3, 1, None, None);
let layout = TextureAtlasLayout::from_grid(size, 9, 12, None, None);
(fname, layout, num)
("cards.png".into(), layout, num)
}
}

@ -30,7 +30,7 @@ fn main() {
setup::SetupPlugin,
play::PlayPlugin,
menu::MenuPlugin,
// debug::DebugPlugin,
debug::DebugPlugin,
))
.init_state::<GameState>()
.run();

@ -3,14 +3,12 @@
use bevy::{
color::palettes::css::{BLACK, WHITE},
prelude::*,
utils::{hashbrown::hash_map::DefaultHashBuilder, tracing::field::debug},
};
use crate::{
boot, debug,
boot,
deck::{Card, Deck, ItemColor, ItemNumber, ItemPattern, ItemShape},
play::{self, check_for_sets, check_set, DeckOrder, PlayLocation, SetNumber},
setup::setup_cards,
play::{check_for_sets, check_set, DeckOrder, PlayLocation, SetNumber},
view::{button_set_state, ViewState},
};

@ -228,20 +228,23 @@ pub(crate) fn place_card(
trigger: Trigger<OnAdd, PlayLocation>,
mut query: Query<(&PlayLocation, &mut Visibility, &mut Transform)>,
) {
let (PlayLocation { x, y }, mut visibility, mut transform) =
query.get_mut(trigger.entity()).unwrap();
let (pl, mut visibility, mut transform) = query.get_mut(trigger.entity()).unwrap();
// Set it's transform based on it's placement
transform.translation = card_placement(pl);
// Set it to visible
*visibility = Visibility::Inherited;
}
pub(crate) fn card_placement(PlayLocation { x, y }: &PlayLocation) -> Vec3 {
let card_size = [100.0, 160.0];
let offset = Vec2::new(card_size[0] * 4.0, card_size[1] * 4.0) / 2.5;
transform.translation = Vec3::new(
Vec3::new(
((*x as f32) * card_size[0]) - offset.x,
((*y as f32) * card_size[1]) - offset.y,
0.0,
);
// Set it to visible
*visibility = Visibility::Inherited;
)
}
pub(crate) fn check_for_sets(

@ -119,6 +119,24 @@ fn setup_animations(
.insert("rotate".into(), (graph_handle, animation_index));
}
{
// Pre-req: requires deck location and helper function for each spot's placement
// For each spot on board
// Move from deck location (TBD) to spot
// For each card
// Assign this curve to the target
// todo!("Setup deal animations");
}
{
// Pre-req: requires discard location and helper function for each spot's placement
// For each spot on board
// Move from spot location to discard pile (location TBD)
// For each card
// Assign this curve to the target
// todo!("Setup discard animations");
}
commands.insert_resource(animation_store);
// Card Animations:
// active_card_animation = AnimationClip::default() // simple rotation

Loading…
Cancel
Save