From b85a5463a99ea5ca237aab3dee14b19cbfd346de Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Thu, 7 Nov 2024 00:00:42 +0200 Subject: [PATCH 1/9] WHAT HAPPENED AFTER A LONG STREAM Player movement :D Uh..miguel not paralysed Failed to flip miguel when turning Please help --- Cargo.lock | 66 +++++++++++++- Cargo.toml | 1 + assets/shocked-miguel.ldtk | 71 +++++++++------ src/camera.rs | 2 - src/goal.rs | 11 ++- src/level_structure.rs | 154 +++++++++++++++++++++++++++++++- src/logging.rs | 8 +- src/main.rs | 41 +++++---- src/player.rs | 176 +++++++++++++++++++++++-------------- 9 files changed, 410 insertions(+), 120 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dbb41f1..318641b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -826,6 +826,19 @@ version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61baa1bdc1f4a7ac2c18217570a7cc04e1cd54d38456e91782f0371c79afe0a8" +[[package]] +name = "bevy_rapier2d" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17d82b9cbb851249a8859647ae3a2c5d17664df1da27ccd43fddd1faa66b58a6" +dependencies = [ + "bevy", + "bitflags 2.6.0", + "log", + "nalgebra", + "rapier2d 0.21.0", +] + [[package]] name = "bevy_reflect" version = "0.14.2" @@ -2548,6 +2561,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" dependencies = [ "approx", + "glam", "matrixmultiply", "nalgebra-macros", "num-complex", @@ -3061,6 +3075,30 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "parry2d" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8aa1c304489b71ab35ad4080c5a333a5fc24b2a5f244f197dedb93276c9a05" +dependencies = [ + "approx", + "arrayvec", + "bitflags 2.6.0", + "downcast-rs", + "either", + "log", + "nalgebra", + "num-derive", + "num-traits", + "ordered-float", + "rustc-hash 2.0.0", + "simba", + "slab", + "smallvec", + "spade", + "thiserror", +] + [[package]] name = "parry2d" version = "0.17.1" @@ -3261,6 +3299,29 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" +[[package]] +name = "rapier2d" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9a115cec2cd9533e376e23c87a7869508691a7b38ab078cc8a8e1cd24d9d1b" +dependencies = [ + "approx", + "arrayvec", + "bit-vec 0.6.3", + "bitflags 2.6.0", + "crossbeam", + "downcast-rs", + "log", + "nalgebra", + "num-derive", + "num-traits", + "ordered-float", + "parry2d 0.16.1", + "rustc-hash 2.0.0", + "simba", + "thiserror", +] + [[package]] name = "rapier2d" version = "0.22.0" @@ -3278,7 +3339,7 @@ dependencies = [ "num-derive", "num-traits", "ordered-float", - "parry2d", + "parry2d 0.17.1", "rustc-hash 2.0.0", "simba", "thiserror", @@ -3538,7 +3599,8 @@ dependencies = [ "bevy", "bevy_ecs_ldtk", "bevy_ecs_tilemap", - "rapier2d", + "bevy_rapier2d", + "rapier2d 0.22.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 68e3a47..c2f9751 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,3 +8,4 @@ bevy = "0.14.2" bevy_ecs_tilemap = "0.14" bevy_ecs_ldtk = "0.10" rapier2d = "0.22.0" +bevy_rapier2d = "0.27.0" diff --git a/assets/shocked-miguel.ldtk b/assets/shocked-miguel.ldtk index 13780d1..15e2340 100644 --- a/assets/shocked-miguel.ldtk +++ b/assets/shocked-miguel.ldtk @@ -391,7 +391,7 @@ }, { "__type": "IntGrid", - "identifier": "Walls", + "identifier": "Collisions", "type": "IntGrid", "uid": 4, "doc": null, @@ -794,7 +794,7 @@ "limitScope": "PerLevel", "limitBehavior": "MoveLastOne", "pivotX": 0.5, - "pivotY": 0.5, + "pivotY": 1, "fieldDefs": [] }, { @@ -1256,21 +1256,21 @@ { "__identifier": "Goal", "__grid": [34,12], - "__pivot": [0.5,0.5], + "__pivot": [0.5,1], "__tags": [], "__tile": { "tilesetUid": 36, "x": 0, "y": 0, "w": 16, "h": 16 }, "__smartColor": "#EAD4AA", - "iid": "ee9001c0-9b00-11ef-a60d-5b17cba2b0bd", + "iid": "265d9ca0-9b00-11ef-8557-9dc0be7be55f", "width": 16, "height": 24, "defUid": 15, - "px": [552,200], + "px": [552,208], "fieldInstances": [] } ] }, { - "__identifier": "Walls", + "__identifier": "Collisions", "__type": "IntGrid", "__cWid": 35, "__cHei": 20, @@ -1912,7 +1912,7 @@ 0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1 ], "autoLayerTiles": [ @@ -1937,6 +1937,20 @@ { "px": [0,144], "src": [0,16], "f": 0, "t": 2, "d": [31,144], "a": 1 }, { "px": [240,144], "src": [0,0], "f": 0, "t": 0, "d": [31,159], "a": 1 }, { "px": [0,160], "src": [0,0], "f": 0, "t": 0, "d": [31,160], "a": 1 }, + { "px": [16,160], "src": [0,16], "f": 0, "t": 2, "d": [31,161], "a": 1 }, + { "px": [32,160], "src": [0,0], "f": 0, "t": 0, "d": [31,162], "a": 1 }, + { "px": [48,160], "src": [0,16], "f": 0, "t": 2, "d": [31,163], "a": 1 }, + { "px": [64,160], "src": [0,16], "f": 0, "t": 2, "d": [31,164], "a": 1 }, + { "px": [80,160], "src": [0,0], "f": 0, "t": 0, "d": [31,165], "a": 1 }, + { "px": [96,160], "src": [0,16], "f": 0, "t": 2, "d": [31,166], "a": 1 }, + { "px": [112,160], "src": [0,16], "f": 0, "t": 2, "d": [31,167], "a": 1 }, + { "px": [128,160], "src": [0,16], "f": 0, "t": 2, "d": [31,168], "a": 1 }, + { "px": [144,160], "src": [0,0], "f": 0, "t": 0, "d": [31,169], "a": 1 }, + { "px": [160,160], "src": [0,16], "f": 0, "t": 2, "d": [31,170], "a": 1 }, + { "px": [176,160], "src": [0,0], "f": 0, "t": 0, "d": [31,171], "a": 1 }, + { "px": [192,160], "src": [0,16], "f": 0, "t": 2, "d": [31,172], "a": 1 }, + { "px": [208,160], "src": [0,0], "f": 0, "t": 0, "d": [31,173], "a": 1 }, + { "px": [224,160], "src": [0,16], "f": 0, "t": 2, "d": [31,174], "a": 1 }, { "px": [240,160], "src": [0,16], "f": 0, "t": 2, "d": [31,175], "a": 1 } ], "seed": 9045717, @@ -1992,22 +2006,7 @@ "seed": 9284298, "overrideTilesetUid": null, "gridTiles": [], - "entityInstances": [ - { - "__identifier": "Player", - "__grid": [1,9], - "__pivot": [0.5,1], - "__tags": [], - "__tile": { "tilesetUid": 27, "x": 0, "y": 0, "w": 32, "h": 32 }, - "__smartColor": "#D77643", - "iid": "8b5bc310-73f0-11ef-83af-53f2d18f6592", - "width": 16, - "height": 16, - "defUid": 14, - "px": [16,160], - "fieldInstances": [] - } - ] + "entityInstances": [] }, { "__identifier": "Player", @@ -2033,10 +2032,24 @@ "overrideTilesetUid": null, "gridTiles": [], "entityInstances": [ + { + "__identifier": "Player", + "__grid": [1,9], + "__pivot": [0.5,1], + "__tags": [], + "__tile": { "tilesetUid": 27, "x": 0, "y": 0, "w": 32, "h": 32 }, + "__smartColor": "#D77643", + "iid": "8b5bc310-73f0-11ef-83af-53f2d18f6592", + "width": 16, + "height": 16, + "defUid": 14, + "px": [24,160], + "fieldInstances": [] + }, { "__identifier": "Goal", - "__grid": [7,1], - "__pivot": [0.5,0.5], + "__grid": [13,6], + "__pivot": [0.5,1], "__tags": [], "__tile": { "tilesetUid": 36, "x": 0, "y": 0, "w": 16, "h": 16 }, "__smartColor": "#EAD4AA", @@ -2044,13 +2057,13 @@ "width": 16, "height": 24, "defUid": 15, - "px": [120,24], + "px": [216,112], "fieldInstances": [] } ] }, { - "__identifier": "Walls", + "__identifier": "Collisions", "__type": "IntGrid", "__cWid": 16, "__cHei": 11, @@ -2908,7 +2921,7 @@ { "__identifier": "Goal", "__grid": [1,5], - "__pivot": [0.5,0.5], + "__pivot": [0.5,1], "__tags": [], "__tile": { "tilesetUid": 36, "x": 0, "y": 0, "w": 16, "h": 16 }, "__smartColor": "#EAD4AA", @@ -2922,7 +2935,7 @@ ] }, { - "__identifier": "Walls", + "__identifier": "Collisions", "__type": "IntGrid", "__cWid": 85, "__cHei": 14, diff --git a/src/camera.rs b/src/camera.rs index 7e778e4..05b2e80 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -1,9 +1,7 @@ use bevy::prelude::*; -use bevy_ecs_ldtk::prelude::*; use crate::player::Player; - pub struct CameraPlugin; impl Plugin for CameraPlugin { diff --git a/src/goal.rs b/src/goal.rs index fc4d7ef..dab79ec 100644 --- a/src/goal.rs +++ b/src/goal.rs @@ -17,13 +17,16 @@ pub struct GoalBundle { pub fn check_goal( level_selection: ResMut, - players: Query<&GridCoords, (With, Changed)>, - goals: Query<&GridCoords, With>, + players: Query<&Transform, (With, Changed)>, + goals: Query<&Transform, With>, ) { if players .iter() .zip(goals.iter()) - .any(|(player_grid_coords, goal_grid_coords)| player_grid_coords == goal_grid_coords) + .any(|(player_grid_coords, goal_grid_coords)| { + ((player_grid_coords.translation.x - goal_grid_coords.translation.x).abs() <= 3.) + && ((player_grid_coords.translation.y - goal_grid_coords.translation.y).abs() <= 3.) + }) { let indices = match level_selection.into_inner() { LevelSelection::Indices(indices) => indices, @@ -32,4 +35,4 @@ pub fn check_goal( indices.level += 1; } -} \ No newline at end of file +} diff --git a/src/level_structure.rs b/src/level_structure.rs index 9a4fba2..e1bd03b 100644 --- a/src/level_structure.rs +++ b/src/level_structure.rs @@ -1,5 +1,12 @@ -use bevy::prelude::*; +use bevy::{ + prelude::*, + utils::{HashMap, HashSet}, +}; use bevy_ecs_ldtk::prelude::*; +use bevy_rapier2d::{ + dynamics::RigidBody, + geometry::{Collider, Friction}, +}; #[derive(Default, Component)] pub struct Wall; @@ -8,3 +15,148 @@ pub struct Wall; pub struct WallBundle { wall: Wall, } +pub fn spawn_wall_collision( + mut commands: Commands, + wall_query: Query<(&GridCoords, &Parent), Added>, + parent_query: Query<&Parent, Without>, + level_query: Query<(Entity, &LevelIid)>, + ldtk_projects: Query<&Handle>, + ldtk_project_assets: Res>, +) { + /// Represents a wide wall that is 1 tile tall + /// Used to spawn wall collisions + #[derive(Clone, Eq, PartialEq, Debug, Default, Hash)] + struct Plate { + left: i32, + right: i32, + } + + /// A simple rectangle type representing a wall of any size + struct Rect { + left: i32, + right: i32, + top: i32, + bottom: i32, + } + let mut level_to_wall_locations: HashMap> = HashMap::new(); + wall_query.iter().for_each(|(&grid_coords, parent)| { + if let Ok(grandparent) = parent_query.get(parent.get()) { + level_to_wall_locations + .entry(grandparent.get()) + .or_default() + .insert(grid_coords); + } + }); + + if !wall_query.is_empty() { + level_query.iter().for_each(|(level_entity, level_iid)| { + if let Some(level_walls) = level_to_wall_locations.get(&level_entity) { + let ldtk_project = ldtk_project_assets + .get(ldtk_projects.single()) + .expect("Project has to be loaded at this point"); + + let level = ldtk_project + .as_standalone() + .get_loaded_level_by_iid(&level_iid.to_string()) + .expect("Spawned level should exist in LDtk project"); + + let LayerInstance { + c_wid: width, + c_hei: height, + grid_size, + .. + } = level.layer_instances()[0]; + + let mut plate_stack: Vec> = Vec::new(); + + for y in 0..height { + let mut row_plates: Vec = Vec::new(); + let mut plate_start = None; + + for x in 0..width + 1 { + match (plate_start, level_walls.contains(&GridCoords { x, y })) { + (Some(s), false) => { + row_plates.push(Plate { + left: s, + right: x - 1, + }); + plate_start = None; + } + (None, true) => plate_start = Some(x), + _ => (), + } + } + plate_stack.push(row_plates); + } + // combine "plates" into rectangles across multiple rows + let mut rect_builder: HashMap = HashMap::new(); + let mut prev_row: Vec = Vec::new(); + let mut wall_rects: Vec = Vec::new(); + + // an extra empty row so the algorithm "finishes" the rects that touch the top edge + plate_stack.push(Vec::new()); + + for (y, current_row) in plate_stack.into_iter().enumerate() { + for prev_plate in &prev_row { + if !current_row.contains(prev_plate) { + //remove rect so the same plate starts a new rectangle + if let Some(rect) = rect_builder.remove(prev_plate) { + wall_rects.push(rect); + } + } + } + for plate in ¤t_row { + rect_builder + .entry(plate.clone()) + .and_modify(|e| e.top += 1) + .or_insert(Rect { + bottom: y as i32, + top: y as i32, + left: plate.left, + right: plate.right, + }); + } + prev_row = current_row; + } + commands.entity(level_entity).with_children(|level| { + // Spawn colliders for every rectangle.. + // Making the collider a child of the level serves two purposes: + // 1. Adjusts the transforms to be relative to the level for free + // 2. the colliders will be despawned automatically when levels unload + for wall_rect in wall_rects { + level + .spawn_empty() + .insert(Collider::cuboid( + (wall_rect.right as f32 - wall_rect.left as f32 + 1.) + * grid_size as f32 + / 2., + (wall_rect.top as f32 - wall_rect.bottom as f32 + 1.) + * grid_size as f32 + / 2., + )) + .insert(RigidBody::Fixed) + .insert(Friction::new(1.0)) + .insert(Transform::from_xyz( + (wall_rect.left + wall_rect.right + 1) as f32 * grid_size as f32 + / 2., + (wall_rect.bottom + wall_rect.top + 1) as f32 * grid_size as f32 + / 2., + 0., + //this averages xy so it in center yes ) + )) + .insert(GlobalTransform::default()); + } + }); + } + }); + } +} +pub struct WallPlugin; + +impl Plugin for WallPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Update, spawn_wall_collision) + .register_ldtk_int_cell::(1) //dirt + .register_ldtk_int_cell::(3); //stone + } +} diff --git a/src/logging.rs b/src/logging.rs index 7274460..09ac054 100644 --- a/src/logging.rs +++ b/src/logging.rs @@ -1,6 +1,6 @@ use bevy::prelude::*; -use crate::player::Player; +use crate::{goal::Goal, player::Player}; // Yes I used chatgpt for this // sue me, it's a mundane task :P @@ -8,6 +8,7 @@ use crate::player::Player; pub fn log_positions( camera_query: Query<&Transform, With>, player_query: Query<&Transform, With>, + goals: Query<&Transform, With>, ) { // Log camera position if let Ok(camera_transform) = camera_query.get_single() { @@ -22,4 +23,9 @@ pub fn log_positions( } else { info!("Player not found or multiple players detected."); } + if let Ok(goal_transform) = goals.get_single() { + info!("Player Position: {:?}", goal_transform.translation); + } else { + info!("Player not found or multiple players detected."); + } } diff --git a/src/main.rs b/src/main.rs index cb06de1..58908d4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,29 +1,49 @@ use bevy::prelude::*; use bevy_ecs_ldtk::prelude::*; +use bevy_rapier2d::plugin::{NoUserData, RapierConfiguration, RapierPhysicsPlugin, TimestepMode}; use camera::CameraPlugin; +use goal::{check_goal, GoalBundle}; +use ground_detection::GroundDetectionPlugin; +use level_structure::{WallBundle, WallPlugin}; use logging::log_positions; use player::PlayerPlugin; -use goal::{GoalBundle, check_goal}; -use level_structure::WallBundle; mod camera; +mod colliders; +mod goal; +mod ground_detection; +mod level_structure; mod logging; mod player; -mod goal; -mod level_structure; pub const GRID_SIZE: i32 = 16; fn main() { App::new() .add_plugins(DefaultPlugins.set(ImagePlugin::default_nearest())) - .add_plugins(LdtkPlugin) + .add_plugins(( + LdtkPlugin, + RapierPhysicsPlugin::::pixels_per_meter(100.0), + )) + .insert_resource(RapierConfiguration { + gravity: Vec2::new(0.0, -2000.0), + physics_pipeline_active: true, + query_pipeline_active: true, + timestep_mode: TimestepMode::Variable { + max_dt: 1.0 / 60.0, + time_scale: 1.0, + substeps: 1, + }, + scaled_shape_subdivision: 10, + force_update_from_transform_changes: false, + }) .add_plugins(PlayerPlugin) + .add_plugins(WallPlugin) + .add_plugins(GroundDetectionPlugin) .insert_resource(LevelSelection::index(0)) .register_ldtk_entity::("Goal") .register_ldtk_int_cell::(1) .add_systems(Startup, setup) - .add_systems(Update, camera::camera_fit_inside_current_level) .add_plugins(CameraPlugin) .add_systems(Update, (translate_grid_coords_entities, check_goal)) .add_systems(Update, log_positions) @@ -33,14 +53,10 @@ fn main() { fn setup(mut commands: Commands, asset_server: Res) { commands.spawn(LdtkWorldBundle { ldtk_handle: asset_server.load("shocked-miguel.ldtk"), - level_set: LEVEL_SET, - // transform: Transform::from_xyz(-256., -144., 0.), ..Default::default() }); } - - fn translate_grid_coords_entities( mut grid_coords_entities: Query<(&mut Transform, &GridCoords), Changed>, ) { @@ -50,8 +66,3 @@ fn translate_grid_coords_entities( .extend(transform.translation.z); } } - -#[derive(Default, Component)] -struct Wall; - - diff --git a/src/player.rs b/src/player.rs index 967c8a7..29247aa 100644 --- a/src/player.rs +++ b/src/player.rs @@ -1,11 +1,28 @@ -use bevy::{prelude::*, utils::HashSet}; +use bevy::prelude::*; use bevy_ecs_ldtk::prelude::*; +use bevy_rapier2d::dynamics::Velocity; -use crate::level_structure::Wall; +use crate::{colliders::ColliderBundle, ground_detection::GroundDetection, level_structure::Wall}; +use std::f32::consts::PI; +#[derive(Default)] +enum Facing { + LEFT, + #[default] + RIGHT, +} #[derive(Default, Component)] -pub(crate) struct Player; - +pub(crate) struct Player { + direction: Facing, +} +impl Player { + fn swap_direction(&mut self) { + match self.direction { + Facing::RIGHT => self.direction = Facing::LEFT, + Facing::LEFT => self.direction = Facing::RIGHT + } + } +} #[derive(Default, Bundle, LdtkEntity)] struct PlayerBundle { player: Player, @@ -13,85 +30,112 @@ struct PlayerBundle { sprite_bundle: LdtkSpriteSheetBundle, #[grid_coords] grid_coords: GridCoords, + pub ground_detection: GroundDetection, + #[from_entity_instance] + pub collider_bundle: ColliderBundle, } -#[derive(Default, Resource)] -struct LevelWalls { - wall_locations: HashSet, - level_width: i32, - level_height: i32, -} -impl LevelWalls { - fn in_wall(&self, grid_coords: &GridCoords) -> bool { - grid_coords.x < 0 - || grid_coords.y < 0 - || grid_coords.x >= self.level_width - || grid_coords.y >= self.level_height - || self.wall_locations.contains(grid_coords) - } -} +// #[derive(Default, Resource)] +// struct LevelWalls { +// wall_locations: HashSet, +// level_width: i32, +// level_height: i32, +// } +// impl LevelWalls { +// fn in_wall(&self, grid_coords: &GridCoords) -> bool { +// grid_coords.x < 0 +// || grid_coords.y < 0 +// || grid_coords.x >= self.level_width +// || grid_coords.y >= self.level_height +// || self.wall_locations.contains(grid_coords) +// } +// } -fn move_player_from_input( - mut players: Query<&mut GridCoords, With>, +fn player_movement( + mut query: Query<(&mut Velocity, &GroundDetection, &Player), With>, input: Res>, - level_walls: Res, ) { - let movement_direction = - if input.just_pressed(KeyCode::KeyW) || input.just_pressed(KeyCode::Space) { - GridCoords::new(0, 1) - } else if input.just_pressed(KeyCode::KeyA) { - GridCoords::new(-1, 0) - } else if input.just_pressed(KeyCode::KeyS) { - GridCoords::new(0, -1) - } else if input.just_pressed(KeyCode::KeyD) { - GridCoords::new(1, 0) - } else { - return; - }; + // let movement_direction = + // if input.just_pressed(KeyCode::KeyW) || input.just_pressed(KeyCode::Space) { + // GridCoords::new(0, 1) + // } else if input.just_pressed(KeyCode::KeyA) { + // GridCoords::new(-1, 0) + // } else if input.just_pressed(KeyCode::KeyS) { + // GridCoords::new(0, -1) + // } else if input.just_pressed(KeyCode::KeyD) { + // GridCoords::new(1, 0) + // } else { + // return; + // }; + for (mut velocity, ground_detection, player) in &mut query { + // let right = if input.pressed(KeyCode::KeyD) { 1. } else { 0. }; + // let left = if input.pressed(KeyCode::KeyA) { 1. } else { 0. }; - for mut player_grid_coords in players.iter_mut() { - let destination = *player_grid_coords + movement_direction; - if !level_walls.in_wall(&destination) { - *player_grid_coords = destination; + let right = if input.pressed(KeyCode::KeyD) { + // match player.direction { + // Facing::LEFT => player.direction = Facing::RIGHT, + // Facing::RIGHT => (), + + // } + 1. + + } else { + 0. + }; + let left = if input.pressed(KeyCode::KeyA) { + 1. + } else { + 0. + }; + velocity.linvel.x = (right - left) * 200.; + + if input.just_pressed(KeyCode::Space) && ground_detection.on_ground { + velocity.linvel.y = 500.; } } + + // for mut player_grid_coords in players.iter_mut() { + // let destination = *player_grid_coords + movement_direction; + // if !level_walls.in_wall(&destination) { + // *player_grid_coords = destination; + // } + // } } pub struct PlayerPlugin; impl Plugin for PlayerPlugin { fn build(&self, app: &mut App) { - app.add_systems(Update, (move_player_from_input, cache_wall_locations)) - .register_ldtk_entity::("Player") - .init_resource::(); + app.add_systems(Update, player_movement) + .register_ldtk_entity::("Player"); } } -fn cache_wall_locations( - mut level_walls: ResMut, - mut level_events: EventReader, - walls: Query<&GridCoords, With>, - ldtk_project_entities: Query<&Handle>, - ldtk_project_assets: Res>, -) { - for level_event in level_events.read() { - if let LevelEvent::Spawned(level_iid) = level_event { - let ldtk_project = ldtk_project_assets - .get(ldtk_project_entities.single()) - .expect("LdtkProject should be loaded when level is spawned"); - let level = ldtk_project - .get_raw_level_by_iid(level_iid.get()) - .expect("spawned level should exist in project"); +// fn cache_wall_locations( +// mut level_walls: ResMut, +// mut level_events: EventReader, +// walls: Query<&GridCoords, With>, +// ldtk_project_entities: Query<&Handle>, +// ldtk_project_assets: Res>, +// ) { +// for level_event in level_events.read() { +// if let LevelEvent::Spawned(level_iid) = level_event { +// let ldtk_project = ldtk_project_assets +// .get(ldtk_project_entities.single()) +// .expect("LdtkProject should be loaded when level is spawned"); +// let level = ldtk_project +// .get_raw_level_by_iid(level_iid.get()) +// .expect("spawned level should exist in project"); - let wall_locations = walls.iter().copied().collect(); +// let wall_locations = walls.iter().copied().collect(); - let new_level_walls = LevelWalls { - wall_locations, - level_width: level.px_wid / crate::GRID_SIZE, - level_height: level.px_hei / crate::GRID_SIZE, - }; +// let new_level_walls = LevelWalls { +// wall_locations, +// level_width: level.px_wid / crate::GRID_SIZE, +// level_height: level.px_hei / crate::GRID_SIZE, +// }; - *level_walls = new_level_walls; - } - } -} +// *level_walls = new_level_walls; +// } +// } +// } From 0e862aa71f55a6c7dff255a628fc5ba21a95e244 Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Thu, 7 Nov 2024 00:01:40 +0200 Subject: [PATCH 2/9] metamorphisis --- src/colliders.rs | 76 +++++++++++++++++++++++++++++ src/ground_detection.rs | 103 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 src/colliders.rs create mode 100644 src/ground_detection.rs diff --git a/src/colliders.rs b/src/colliders.rs new file mode 100644 index 0000000..e426fb8 --- /dev/null +++ b/src/colliders.rs @@ -0,0 +1,76 @@ +use bevy::prelude::*; +use bevy_ecs_ldtk::prelude::*; + +use bevy_rapier2d::prelude::*; + +#[derive(Clone, Default, Bundle, LdtkIntCell)] +pub struct ColliderBundle { + pub collider: Collider, + pub rigid_body: RigidBody, + pub velocity: Velocity, + pub rotation_constraints: LockedAxes, + pub gravity_scale: GravityScale, + pub friction: Friction, + pub density: ColliderMassProperties, +} + +impl From<&EntityInstance> for ColliderBundle { + fn from(entity_instance: &EntityInstance) -> ColliderBundle { + let rotation_constraints = LockedAxes::ROTATION_LOCKED; + + match entity_instance.identifier.as_ref() { + "Player" => ColliderBundle { + collider: Collider::cuboid(6., 14.), + rigid_body: RigidBody::Dynamic, + friction: Friction { + coefficient: 0.0, + combine_rule: CoefficientCombineRule::Min, + }, + rotation_constraints, + ..Default::default() + }, + "Mob" => ColliderBundle { + collider: Collider::cuboid(5., 5.), + rigid_body: RigidBody::KinematicVelocityBased, + rotation_constraints, + ..Default::default() + }, + "Chest" => ColliderBundle { + collider: Collider::cuboid(8., 8.), + rigid_body: RigidBody::Dynamic, + rotation_constraints, + gravity_scale: GravityScale(1.0), + friction: Friction::new(0.5), + density: ColliderMassProperties::Density(15.0), + ..Default::default() + }, + _ => ColliderBundle::default(), + } + } +} + +#[derive(Clone, Default, Bundle, LdtkIntCell)] +pub struct SensorBundle { + pub collider: Collider, + pub sensor: Sensor, + pub active_events: ActiveEvents, + pub rotation_constraints: LockedAxes, +} + +impl From for SensorBundle { + fn from(int_grid_cell: IntGridCell) -> SensorBundle { + let rotation_constraints = LockedAxes::ROTATION_LOCKED; + + // ladder + if int_grid_cell.value == 2 { + SensorBundle { + collider: Collider::cuboid(8., 8.), + sensor: Sensor, + rotation_constraints, + active_events: ActiveEvents::COLLISION_EVENTS, + } + } else { + SensorBundle::default() + } + } +} diff --git a/src/ground_detection.rs b/src/ground_detection.rs new file mode 100644 index 0000000..391f60f --- /dev/null +++ b/src/ground_detection.rs @@ -0,0 +1,103 @@ +use std::collections::HashSet; + +use bevy::prelude::*; + +use bevy_rapier2d::prelude::*; + +#[derive(Component)] +pub struct GroundSensor { + pub ground_detection_entity: Entity, + pub intersecting_ground_entities: HashSet, +} + +#[derive(Clone, Default, Component)] +pub struct GroundDetection { + pub on_ground: bool, +} + +pub fn spawn_ground_sensor( + mut commands: Commands, + detect_ground_for: Query<(Entity, &Collider), Added>, +) { + for (entity, shape) in &detect_ground_for { + if let Some(cuboid) = shape.as_cuboid() { + let Vec2 { + x: half_extents_x, + y: half_extents_y, + } = cuboid.half_extents(); + + let detector_shape = Collider::cuboid(half_extents_x / 2.0, 2.); + + let sensor_translation = Vec3::new(0., -half_extents_y, 0.); + + commands.entity(entity).with_children(|builder| { + builder + .spawn_empty() + .insert(ActiveEvents::COLLISION_EVENTS) + .insert(detector_shape) + .insert(Sensor) + .insert(Transform::from_translation(sensor_translation)) + .insert(GlobalTransform::default()) + .insert(GroundSensor { + ground_detection_entity: entity, + intersecting_ground_entities: HashSet::new(), + }); + }); + } + } +} + +pub fn ground_detection( + mut ground_sensors: Query<&mut GroundSensor>, + mut collisions: EventReader, + collidables: Query, Without)>, +) { + for collision_event in collisions.read() { + match collision_event { + CollisionEvent::Started(e1, e2, _) => { + if collidables.contains(*e1) { + if let Ok(mut sensor) = ground_sensors.get_mut(*e2) { + sensor.intersecting_ground_entities.insert(*e1); + } + } else if collidables.contains(*e2) { + if let Ok(mut sensor) = ground_sensors.get_mut(*e1) { + sensor.intersecting_ground_entities.insert(*e2); + } + } + } + CollisionEvent::Stopped(e1, e2, _) => { + if collidables.contains(*e1) { + if let Ok(mut sensor) = ground_sensors.get_mut(*e2) { + sensor.intersecting_ground_entities.remove(e1); + } + } else if collidables.contains(*e2) { + if let Ok(mut sensor) = ground_sensors.get_mut(*e1) { + sensor.intersecting_ground_entities.remove(e2); + } + } + } + } + } +} + +pub fn update_on_ground( + mut ground_detectors: Query<&mut GroundDetection>, + ground_sensors: Query<&GroundSensor, Changed>, +) { + for sensor in &ground_sensors { + if let Ok(mut ground_detection) = ground_detectors.get_mut(sensor.ground_detection_entity) { + ground_detection.on_ground = !sensor.intersecting_ground_entities.is_empty(); + } + } +} + +/// Handles platformer-specific physics operations, specifically ground detection. +pub struct GroundDetectionPlugin; + +impl Plugin for GroundDetectionPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Update, spawn_ground_sensor) + .add_systems(Update, ground_detection) + .add_systems(Update, update_on_ground); + } +} From ef375b2da8ebb36b7bfe430ee86d8f616ffe60b4 Mon Sep 17 00:00:00 2001 From: Supermjork Date: Thu, 7 Nov 2024 10:32:38 +0200 Subject: [PATCH 3/9] try controlling the sprite for direction change, also your asset path still sucks --- src/logging.rs | 4 +- src/player.rs | 140 +++++++++++++++++++++++-------------------------- 2 files changed, 67 insertions(+), 77 deletions(-) diff --git a/src/logging.rs b/src/logging.rs index 09ac054..da29444 100644 --- a/src/logging.rs +++ b/src/logging.rs @@ -24,8 +24,8 @@ pub fn log_positions( info!("Player not found or multiple players detected."); } if let Ok(goal_transform) = goals.get_single() { - info!("Player Position: {:?}", goal_transform.translation); + info!("Goal Position: {:?}", goal_transform.translation); } else { - info!("Player not found or multiple players detected."); + info!("Goal not found or multiple players detected."); } } diff --git a/src/player.rs b/src/player.rs index 29247aa..f4c86d6 100644 --- a/src/player.rs +++ b/src/player.rs @@ -2,27 +2,29 @@ use bevy::prelude::*; use bevy_ecs_ldtk::prelude::*; use bevy_rapier2d::dynamics::Velocity; -use crate::{colliders::ColliderBundle, ground_detection::GroundDetection, level_structure::Wall}; -use std::f32::consts::PI; +use crate::{colliders::ColliderBundle, ground_detection::GroundDetection}; -#[derive(Default)] -enum Facing { - LEFT, - #[default] - RIGHT, +pub struct PlayerPlugin; + +impl Plugin for PlayerPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Update, player_movement) + .register_ldtk_entity::("Player"); + } } + +#[derive(Default, Component)] +enum Facing { + Left, + #[default] + Right, +} + #[derive(Default, Component)] pub(crate) struct Player { direction: Facing, } -impl Player { - fn swap_direction(&mut self) { - match self.direction { - Facing::RIGHT => self.direction = Facing::LEFT, - Facing::LEFT => self.direction = Facing::RIGHT - } - } -} + #[derive(Default, Bundle, LdtkEntity)] struct PlayerBundle { player: Player, @@ -35,6 +37,54 @@ struct PlayerBundle { pub collider_bundle: ColliderBundle, } +fn player_movement( + mut query: Query<(&mut Velocity, &GroundDetection, &mut Player, &mut Transform), With>, + input: Res>, +) { + // let movement_direction = + // if input.just_pressed(KeyCode::KeyW) || input.just_pressed(KeyCode::Space) { + // GridCoords::new(0, 1) + // } else if input.just_pressed(KeyCode::KeyA) { + // GridCoords::new(-1, 0) + // } else if input.just_pressed(KeyCode::KeyS) { + // GridCoords::new(0, -1) + // } else if input.just_pressed(KeyCode::KeyD) { + // GridCoords::new(1, 0) + // } else { + // return; + // }; + for (mut velocity, ground_detection, mut player, mut p_transform) in &mut query { + // let Right = if input.pressed(KeyCode::KeyD) { 1. } else { 0. }; + // let left = if input.pressed(KeyCode::KeyA) { 1. } else { 0. }; + + let right = if input.pressed(KeyCode::KeyD) { + 1. + } else { + 0. + }; + let left = if input.pressed(KeyCode::KeyA) { + 1. + } else { + 0. + }; + + // gotta query for sprite to control how the player "appears" to look in either direction + + velocity.linvel.x = (right - left) * 200.; + + if input.just_pressed(KeyCode::Space) && ground_detection.on_ground { + velocity.linvel.y = 500.; + } + } + + // for mut player_grid_coords in players.iter_mut() { + // let destination = *player_grid_coords + movement_direction; + // if !level_walls.in_wall(&destination) { + // *player_grid_coords = destination; + // } + // } +} + // #[derive(Default, Resource)] // struct LevelWalls { // wall_locations: HashSet, @@ -51,66 +101,6 @@ struct PlayerBundle { // } // } -fn player_movement( - mut query: Query<(&mut Velocity, &GroundDetection, &Player), With>, - input: Res>, -) { - // let movement_direction = - // if input.just_pressed(KeyCode::KeyW) || input.just_pressed(KeyCode::Space) { - // GridCoords::new(0, 1) - // } else if input.just_pressed(KeyCode::KeyA) { - // GridCoords::new(-1, 0) - // } else if input.just_pressed(KeyCode::KeyS) { - // GridCoords::new(0, -1) - // } else if input.just_pressed(KeyCode::KeyD) { - // GridCoords::new(1, 0) - // } else { - // return; - // }; - for (mut velocity, ground_detection, player) in &mut query { - // let right = if input.pressed(KeyCode::KeyD) { 1. } else { 0. }; - // let left = if input.pressed(KeyCode::KeyA) { 1. } else { 0. }; - - let right = if input.pressed(KeyCode::KeyD) { - // match player.direction { - // Facing::LEFT => player.direction = Facing::RIGHT, - // Facing::RIGHT => (), - - // } - 1. - - } else { - 0. - }; - let left = if input.pressed(KeyCode::KeyA) { - 1. - } else { - 0. - }; - velocity.linvel.x = (right - left) * 200.; - - if input.just_pressed(KeyCode::Space) && ground_detection.on_ground { - velocity.linvel.y = 500.; - } - } - - // for mut player_grid_coords in players.iter_mut() { - // let destination = *player_grid_coords + movement_direction; - // if !level_walls.in_wall(&destination) { - // *player_grid_coords = destination; - // } - // } -} - -pub struct PlayerPlugin; - -impl Plugin for PlayerPlugin { - fn build(&self, app: &mut App) { - app.add_systems(Update, player_movement) - .register_ldtk_entity::("Player"); - } -} - // fn cache_wall_locations( // mut level_walls: ResMut, // mut level_events: EventReader, From 1bb8313600ea61a8cfbdc5da085f277cee07b6d0 Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Thu, 7 Nov 2024 10:44:18 +0200 Subject: [PATCH 4/9] fixing paths ) --- assets/Characters/dog/.DS_Store | Bin 0 -> 6148 bytes assets/Characters/dog/Sprites/.DS_Store | Bin 0 -> 6148 bytes .../dog/Sprites/Dog-idle/dog-idlet1.png | Bin 0 -> 297 bytes .../dog/Sprites/Dog-idle/dog-idlet2.png | Bin 0 -> 299 bytes .../dog/Sprites/Dog-idle/dog-idlet3.png | Bin 0 -> 292 bytes .../dog/Sprites/Dog-idle/dog-idlet4.png | Bin 0 -> 296 bytes .../dog/Sprites/Dog-idle/dog-idlet5.png | Bin 0 -> 281 bytes .../dog/Sprites/Dog-idle/dog-idlet6.png | Bin 0 -> 301 bytes assets/Characters/dog/Sprites/Dog/dog1.png | Bin 0 -> 621 bytes assets/Characters/dog/Sprites/Dog/dog2.png | Bin 0 -> 662 bytes assets/Characters/dog/Sprites/Dog/dog3.png | Bin 0 -> 555 bytes assets/Characters/dog/Sprites/Dog/dog4.png | Bin 0 -> 565 bytes assets/Characters/dog/Spritesheets/dog-idle.png | Bin 0 -> 786 bytes assets/Characters/dog/Spritesheets/dog.png | Bin 0 -> 1653 bytes assets/Characters/dog/dog.ase | Bin 0 -> 20171 bytes assets/{ => Characters}/miguel/Miguel-Idle.png | Bin assets/{ => Characters}/miguel/Miguel-Walk.png | Bin assets/environment/Forest/.DS_Store | Bin 0 -> 6148 bytes .../Forest/Background Layers/.DS_Store | Bin 0 -> 6148 bytes .../Forest/Background Layers/background.png | Bin 0 -> 4365 bytes .../Forest/Background Layers/middleground.png | Bin 0 -> 15306 bytes .../Forest/sprites/enemies/bee/bee-1.png | Bin 0 -> 830 bytes .../Forest/sprites/enemies/bee/bee-2.png | Bin 0 -> 776 bytes .../Forest/sprites/enemies/bee/bee-3.png | Bin 0 -> 821 bytes .../Forest/sprites/enemies/bee/bee-4.png | Bin 0 -> 789 bytes .../Forest/sprites/enemies/bee/bee-5.png | Bin 0 -> 847 bytes .../Forest/sprites/enemies/bee/bee-6.png | Bin 0 -> 745 bytes .../Forest/sprites/enemies/bee/bee-7.png | Bin 0 -> 788 bytes .../Forest/sprites/enemies/bee/bee-8.png | Bin 0 -> 782 bytes .../piranha-plant-attack-1.png | Bin 0 -> 710 bytes .../piranha-plant-attack-2.png | Bin 0 -> 673 bytes .../piranha-plant-attack-3.png | Bin 0 -> 619 bytes .../piranha-plant-attack-4.png | Bin 0 -> 681 bytes .../enemies/piranha-plant/piranha-plant-1.png | Bin 0 -> 710 bytes .../enemies/piranha-plant/piranha-plant-2.png | Bin 0 -> 673 bytes .../enemies/piranha-plant/piranha-plant-3.png | Bin 0 -> 616 bytes .../enemies/piranha-plant/piranha-plant-4.png | Bin 0 -> 637 bytes .../enemies/piranha-plant/piranha-plant-5.png | Bin 0 -> 670 bytes .../Forest/sprites/enemies/slug/slug-1.png | Bin 0 -> 503 bytes .../Forest/sprites/enemies/slug/slug-2.png | Bin 0 -> 498 bytes .../Forest/sprites/enemies/slug/slug-3.png | Bin 0 -> 478 bytes .../Forest/sprites/enemies/slug/slug-4.png | Bin 0 -> 470 bytes .../Forest/sprites/misc/carrot/carrot-1.png | Bin 0 -> 324 bytes .../Forest/sprites/misc/carrot/carrot-2.png | Bin 0 -> 296 bytes .../Forest/sprites/misc/carrot/carrot-3.png | Bin 0 -> 319 bytes .../Forest/sprites/misc/carrot/carrot-4.png | Bin 0 -> 300 bytes .../Forest/sprites/misc/chest/chest-1.png | Bin 0 -> 449 bytes .../Forest/sprites/misc/chest/chest-2.png | Bin 0 -> 363 bytes .../sprites/misc/enemy-death/enemy-death-1.png | Bin 0 -> 208 bytes .../sprites/misc/enemy-death/enemy-death-2.png | Bin 0 -> 195 bytes .../sprites/misc/enemy-death/enemy-death-3.png | Bin 0 -> 433 bytes .../sprites/misc/enemy-death/enemy-death-4.png | Bin 0 -> 547 bytes .../sprites/misc/enemy-death/enemy-death-5.png | Bin 0 -> 542 bytes .../sprites/misc/enemy-death/enemy-death-6.png | Bin 0 -> 410 bytes .../Forest/sprites/misc/hud/hud-1.png | Bin 0 -> 390 bytes .../Forest/sprites/misc/hud/hud-2.png | Bin 0 -> 417 bytes .../Forest/sprites/misc/hud/hud-3.png | Bin 0 -> 458 bytes .../Forest/sprites/misc/hud/hud-4.png | Bin 0 -> 425 bytes .../Forest/sprites/misc/star/star-1.png | Bin 0 -> 261 bytes .../Forest/sprites/misc/star/star-2.png | Bin 0 -> 254 bytes .../Forest/sprites/misc/star/star-3.png | Bin 0 -> 233 bytes .../Forest/sprites/misc/star/star-4.png | Bin 0 -> 173 bytes .../Forest/sprites/misc/star/star-5.png | Bin 0 -> 240 bytes .../Forest/sprites/misc/star/star-6.png | Bin 0 -> 242 bytes .../player/player-climb/player-climb-1.png | Bin 0 -> 582 bytes .../player/player-climb/player-climb-2.png | Bin 0 -> 581 bytes .../player/player-climb/player-climb-3.png | Bin 0 -> 549 bytes .../player/player-climb/player-climb-4.png | Bin 0 -> 581 bytes .../player/player-duck/player-duck-1.png | Bin 0 -> 486 bytes .../player/player-duck/player-duck-2.png | Bin 0 -> 440 bytes .../player/player-duck/player-duck-3.png | Bin 0 -> 456 bytes .../player/player-duck/player-duck-4.png | Bin 0 -> 462 bytes .../player/player-fall/player-fall-1.png | Bin 0 -> 655 bytes .../player/player-fall/player-fall-2.png | Bin 0 -> 622 bytes .../player/player-fall/player-fall-3.png | Bin 0 -> 602 bytes .../player/player-fall/player-fall-4.png | Bin 0 -> 605 bytes .../player/player-hurt/player-hurt-1.png | Bin 0 -> 690 bytes .../player/player-hurt/player-hurt-2.png | Bin 0 -> 635 bytes .../player/player-idle/player-idle-1.png | Bin 0 -> 636 bytes .../player/player-idle/player-idle-2.png | Bin 0 -> 569 bytes .../player/player-idle/player-idle-3.png | Bin 0 -> 553 bytes .../player/player-idle/player-idle-4.png | Bin 0 -> 488 bytes .../player/player-idle/player-idle-5.png | Bin 0 -> 534 bytes .../player/player-idle/player-idle-6.png | Bin 0 -> 551 bytes .../player/player-idle/player-idle-7.png | Bin 0 -> 546 bytes .../player/player-idle/player-idle-8.png | Bin 0 -> 537 bytes .../player/player-idle/player-idle-9.png | Bin 0 -> 582 bytes .../player/player-jump/player-jump-1.png | Bin 0 -> 618 bytes .../player/player-jump/player-jump-2.png | Bin 0 -> 589 bytes .../player/player-jump/player-jump-3.png | Bin 0 -> 589 bytes .../player/player-jump/player-jump-4.png | Bin 0 -> 581 bytes .../player/player-skip/player-skip-1.png | Bin 0 -> 595 bytes .../player/player-skip/player-skip-2.png | Bin 0 -> 589 bytes .../player/player-skip/player-skip-3.png | Bin 0 -> 559 bytes .../player/player-skip/player-skip-4.png | Bin 0 -> 575 bytes .../player/player-skip/player-skip-5.png | Bin 0 -> 579 bytes .../player/player-skip/player-skip-6.png | Bin 0 -> 530 bytes .../player/player-skip/player-skip-7.png | Bin 0 -> 494 bytes .../player/player-skip/player-skip-8.png | Bin 0 -> 479 bytes .../environment/Forest/spritesheets/.DS_Store | Bin 0 -> 6148 bytes .../Forest/spritesheets/enemies/bee.png | Bin 0 -> 2813 bytes .../enemies/piranha-plant-attack.png | Bin 0 -> 1829 bytes .../spritesheets/enemies/piranha-plant.png | Bin 0 -> 1877 bytes .../Forest/spritesheets/enemies/slug.png | Bin 0 -> 1011 bytes .../Forest/spritesheets/misc/carrot.png | Bin 0 -> 671 bytes .../Forest/spritesheets/misc/chest.png | Bin 0 -> 674 bytes .../Forest/spritesheets/misc/enemy-death.png | Bin 0 -> 1394 bytes .../Forest/spritesheets/misc/hud.png | Bin 0 -> 656 bytes .../Forest/spritesheets/misc/star.png | Bin 0 -> 581 bytes .../Forest/spritesheets/player/climb.png | Bin 0 -> 1277 bytes .../Forest/spritesheets/player/duck.png | Bin 0 -> 895 bytes .../Forest/spritesheets/player/fall.png | Bin 0 -> 1459 bytes .../Forest/spritesheets/player/hurt.png | Bin 0 -> 1037 bytes .../Forest/spritesheets/player/idle.png | Bin 0 -> 2639 bytes .../Forest/spritesheets/player/jump.png | Bin 0 -> 1379 bytes .../Forest/spritesheets/player/skip.png | Bin 0 -> 2313 bytes assets/environment/Forest/tileset.png | Bin 0 -> 15369 bytes assets/shocked-miguel.ldtk | 14 +++++++------- 118 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 assets/Characters/dog/.DS_Store create mode 100644 assets/Characters/dog/Sprites/.DS_Store create mode 100644 assets/Characters/dog/Sprites/Dog-idle/dog-idlet1.png create mode 100644 assets/Characters/dog/Sprites/Dog-idle/dog-idlet2.png create mode 100644 assets/Characters/dog/Sprites/Dog-idle/dog-idlet3.png create mode 100644 assets/Characters/dog/Sprites/Dog-idle/dog-idlet4.png create mode 100644 assets/Characters/dog/Sprites/Dog-idle/dog-idlet5.png create mode 100644 assets/Characters/dog/Sprites/Dog-idle/dog-idlet6.png create mode 100644 assets/Characters/dog/Sprites/Dog/dog1.png create mode 100644 assets/Characters/dog/Sprites/Dog/dog2.png create mode 100644 assets/Characters/dog/Sprites/Dog/dog3.png create mode 100644 assets/Characters/dog/Sprites/Dog/dog4.png create mode 100644 assets/Characters/dog/Spritesheets/dog-idle.png create mode 100644 assets/Characters/dog/Spritesheets/dog.png create mode 100644 assets/Characters/dog/dog.ase rename assets/{ => Characters}/miguel/Miguel-Idle.png (100%) rename assets/{ => Characters}/miguel/Miguel-Walk.png (100%) create mode 100644 assets/environment/Forest/.DS_Store create mode 100644 assets/environment/Forest/Background Layers/.DS_Store create mode 100644 assets/environment/Forest/Background Layers/background.png create mode 100644 assets/environment/Forest/Background Layers/middleground.png create mode 100644 assets/environment/Forest/sprites/enemies/bee/bee-1.png create mode 100644 assets/environment/Forest/sprites/enemies/bee/bee-2.png create mode 100644 assets/environment/Forest/sprites/enemies/bee/bee-3.png create mode 100644 assets/environment/Forest/sprites/enemies/bee/bee-4.png create mode 100644 assets/environment/Forest/sprites/enemies/bee/bee-5.png create mode 100644 assets/environment/Forest/sprites/enemies/bee/bee-6.png create mode 100644 assets/environment/Forest/sprites/enemies/bee/bee-7.png create mode 100644 assets/environment/Forest/sprites/enemies/bee/bee-8.png create mode 100644 assets/environment/Forest/sprites/enemies/piranha-plant-attack/piranha-plant-attack-1.png create mode 100644 assets/environment/Forest/sprites/enemies/piranha-plant-attack/piranha-plant-attack-2.png create mode 100644 assets/environment/Forest/sprites/enemies/piranha-plant-attack/piranha-plant-attack-3.png create mode 100644 assets/environment/Forest/sprites/enemies/piranha-plant-attack/piranha-plant-attack-4.png create mode 100644 assets/environment/Forest/sprites/enemies/piranha-plant/piranha-plant-1.png create mode 100644 assets/environment/Forest/sprites/enemies/piranha-plant/piranha-plant-2.png create mode 100644 assets/environment/Forest/sprites/enemies/piranha-plant/piranha-plant-3.png create mode 100644 assets/environment/Forest/sprites/enemies/piranha-plant/piranha-plant-4.png create mode 100644 assets/environment/Forest/sprites/enemies/piranha-plant/piranha-plant-5.png create mode 100644 assets/environment/Forest/sprites/enemies/slug/slug-1.png create mode 100644 assets/environment/Forest/sprites/enemies/slug/slug-2.png create mode 100644 assets/environment/Forest/sprites/enemies/slug/slug-3.png create mode 100644 assets/environment/Forest/sprites/enemies/slug/slug-4.png create mode 100644 assets/environment/Forest/sprites/misc/carrot/carrot-1.png create mode 100644 assets/environment/Forest/sprites/misc/carrot/carrot-2.png create mode 100644 assets/environment/Forest/sprites/misc/carrot/carrot-3.png create mode 100644 assets/environment/Forest/sprites/misc/carrot/carrot-4.png create mode 100644 assets/environment/Forest/sprites/misc/chest/chest-1.png create mode 100644 assets/environment/Forest/sprites/misc/chest/chest-2.png create mode 100644 assets/environment/Forest/sprites/misc/enemy-death/enemy-death-1.png create mode 100644 assets/environment/Forest/sprites/misc/enemy-death/enemy-death-2.png create mode 100644 assets/environment/Forest/sprites/misc/enemy-death/enemy-death-3.png create mode 100644 assets/environment/Forest/sprites/misc/enemy-death/enemy-death-4.png create mode 100644 assets/environment/Forest/sprites/misc/enemy-death/enemy-death-5.png create mode 100644 assets/environment/Forest/sprites/misc/enemy-death/enemy-death-6.png create mode 100644 assets/environment/Forest/sprites/misc/hud/hud-1.png create mode 100644 assets/environment/Forest/sprites/misc/hud/hud-2.png create mode 100644 assets/environment/Forest/sprites/misc/hud/hud-3.png create mode 100644 assets/environment/Forest/sprites/misc/hud/hud-4.png create mode 100644 assets/environment/Forest/sprites/misc/star/star-1.png create mode 100644 assets/environment/Forest/sprites/misc/star/star-2.png create mode 100644 assets/environment/Forest/sprites/misc/star/star-3.png create mode 100644 assets/environment/Forest/sprites/misc/star/star-4.png create mode 100644 assets/environment/Forest/sprites/misc/star/star-5.png create mode 100644 assets/environment/Forest/sprites/misc/star/star-6.png create mode 100644 assets/environment/Forest/sprites/player/player-climb/player-climb-1.png create mode 100644 assets/environment/Forest/sprites/player/player-climb/player-climb-2.png create mode 100644 assets/environment/Forest/sprites/player/player-climb/player-climb-3.png create mode 100644 assets/environment/Forest/sprites/player/player-climb/player-climb-4.png create mode 100644 assets/environment/Forest/sprites/player/player-duck/player-duck-1.png create mode 100644 assets/environment/Forest/sprites/player/player-duck/player-duck-2.png create mode 100644 assets/environment/Forest/sprites/player/player-duck/player-duck-3.png create mode 100644 assets/environment/Forest/sprites/player/player-duck/player-duck-4.png create mode 100644 assets/environment/Forest/sprites/player/player-fall/player-fall-1.png create mode 100644 assets/environment/Forest/sprites/player/player-fall/player-fall-2.png create mode 100644 assets/environment/Forest/sprites/player/player-fall/player-fall-3.png create mode 100644 assets/environment/Forest/sprites/player/player-fall/player-fall-4.png create mode 100644 assets/environment/Forest/sprites/player/player-hurt/player-hurt-1.png create mode 100644 assets/environment/Forest/sprites/player/player-hurt/player-hurt-2.png create mode 100644 assets/environment/Forest/sprites/player/player-idle/player-idle-1.png create mode 100644 assets/environment/Forest/sprites/player/player-idle/player-idle-2.png create mode 100644 assets/environment/Forest/sprites/player/player-idle/player-idle-3.png create mode 100644 assets/environment/Forest/sprites/player/player-idle/player-idle-4.png create mode 100644 assets/environment/Forest/sprites/player/player-idle/player-idle-5.png create mode 100644 assets/environment/Forest/sprites/player/player-idle/player-idle-6.png create mode 100644 assets/environment/Forest/sprites/player/player-idle/player-idle-7.png create mode 100644 assets/environment/Forest/sprites/player/player-idle/player-idle-8.png create mode 100644 assets/environment/Forest/sprites/player/player-idle/player-idle-9.png create mode 100644 assets/environment/Forest/sprites/player/player-jump/player-jump-1.png create mode 100644 assets/environment/Forest/sprites/player/player-jump/player-jump-2.png create mode 100644 assets/environment/Forest/sprites/player/player-jump/player-jump-3.png create mode 100644 assets/environment/Forest/sprites/player/player-jump/player-jump-4.png create mode 100644 assets/environment/Forest/sprites/player/player-skip/player-skip-1.png create mode 100644 assets/environment/Forest/sprites/player/player-skip/player-skip-2.png create mode 100644 assets/environment/Forest/sprites/player/player-skip/player-skip-3.png create mode 100644 assets/environment/Forest/sprites/player/player-skip/player-skip-4.png create mode 100644 assets/environment/Forest/sprites/player/player-skip/player-skip-5.png create mode 100644 assets/environment/Forest/sprites/player/player-skip/player-skip-6.png create mode 100644 assets/environment/Forest/sprites/player/player-skip/player-skip-7.png create mode 100644 assets/environment/Forest/sprites/player/player-skip/player-skip-8.png create mode 100644 assets/environment/Forest/spritesheets/.DS_Store create mode 100644 assets/environment/Forest/spritesheets/enemies/bee.png create mode 100644 assets/environment/Forest/spritesheets/enemies/piranha-plant-attack.png create mode 100644 assets/environment/Forest/spritesheets/enemies/piranha-plant.png create mode 100644 assets/environment/Forest/spritesheets/enemies/slug.png create mode 100644 assets/environment/Forest/spritesheets/misc/carrot.png create mode 100644 assets/environment/Forest/spritesheets/misc/chest.png create mode 100644 assets/environment/Forest/spritesheets/misc/enemy-death.png create mode 100644 assets/environment/Forest/spritesheets/misc/hud.png create mode 100644 assets/environment/Forest/spritesheets/misc/star.png create mode 100644 assets/environment/Forest/spritesheets/player/climb.png create mode 100644 assets/environment/Forest/spritesheets/player/duck.png create mode 100644 assets/environment/Forest/spritesheets/player/fall.png create mode 100644 assets/environment/Forest/spritesheets/player/hurt.png create mode 100644 assets/environment/Forest/spritesheets/player/idle.png create mode 100644 assets/environment/Forest/spritesheets/player/jump.png create mode 100644 assets/environment/Forest/spritesheets/player/skip.png create mode 100644 assets/environment/Forest/tileset.png diff --git a/assets/Characters/dog/.DS_Store b/assets/Characters/dog/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..65ea0a8fd8d8eb419a0e1789e4900905883f5751 GIT binary patch literal 6148 zcmeHKJ5Iwu5SlhC4x4Z z0;a&a0(){flu!Bq+-p%f#Q dOYspr7}h;cfQe!yh!vRq5ePEaU<&-I0^j{mdffm3 literal 0 HcmV?d00001 diff --git a/assets/Characters/dog/Sprites/.DS_Store b/assets/Characters/dog/Sprites/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e432192e61f2ebba647afe5def03254897fb66a9 GIT binary patch literal 6148 zcmeHKOHRWu5S?i&)QU|dHY|Ms7QKO~!j4@pP_;n?DN(v%@4ImTF2I^gASB*+MkOXK zON3xX8b4<~w(~4yGDO77$9h3DC!#4-a5TekM8q#Tkdax$$+E^`we8ydAkGcHmjSuE zF;&#juG#hPZ?^sPv|Uwgnr;IN;?wiX+tYR5TYux--}hIINW&U=Kf0m^s;Qy7a_6(x zV=-UOaC`Bd&oEf4?TXW!j4RKzmUFo{1I~am@Lw1}%@&!SEBfdRI0MeWfdTnG1gKy% zOp5u_fg!g5zzNJ*Fqd9Ja)MzrOp5S8SW|(T%GP4Aro$dAE*d69O((YIgKcNF4u$jX zSU==&;;87OGvExA42<=0F7^NBbpKx_`I9r?4E!kucv7vZC0@yD>)_?2)&}SrDk5=7 l@sNT^F2#tIQhW)`0(+1NFd8OBSRno*kZJJ28Te5KJ^(g z*IB3Bof5F1uFWkvDX%@+SBT%#E_{_;z!Jd)?;498c{LKPF06H5GCr(X3f3p*K=Xb z&RKKcoh-N;w#n7zdCpzOeBL{k*WbB%^yk#Dg*6LyiZ3!d{!u=qWpiWTiAD~$h`oXP lTaO1`^>*`2ar<{}zw&lw&yU$(UjrS>;OXk;vd$@?2>`sMft~;W literal 0 HcmV?d00001 diff --git a/assets/Characters/dog/Sprites/Dog-idle/dog-idlet3.png b/assets/Characters/dog/Sprites/Dog-idle/dog-idlet3.png new file mode 100644 index 0000000000000000000000000000000000000000..d4803d541b74ecca766cac50681eb4ca37261508 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^ia;#I!3-q%+K(CoDaPU;cPEB*=VV@jWCMIcT!Hl3 z$bfI9Ri&OTzmCo})zQn&3)r!(<^P}mpEjxjWu=tIYO=}l2t}~_KY=Orrk*9 zzxV6y-2j1w->+3|*rd1EQ>)?LGo8B%XBeJdm0Qk##)mJPnfs^eju*+?5B$w@xpsD* d`XyJ#ptO)#QRd3tzd%?_n>v?37lCs$ujZ zfhwyt-*?395Lx~9`;l)?-d8DHc_Wv#U+~)6=QsWAi%;E@ima77a`$!1Zr0ZQoRRrj g2j_+#dTdJKSRW_STMm9V}+Dfv%=atSypJ?e9)16)EzhvK2 zlZHie*K9ItjC6LnvTZ@^;=dic97tR4s37>q%Ru=Q+Wu`u7n_ z7hX~R?mJffi!2ZDUbyLbH`l^pCSTX7RHsunl*9L_{Z;(LvG>%mvxih06C(xOHV0-O mOZzE(WcKBtLwEmF|7ZJe!*o$c;ISXjxeT7JelF{r5}E*qDSiV0 literal 0 HcmV?d00001 diff --git a/assets/Characters/dog/Sprites/Dog/dog1.png b/assets/Characters/dog/Sprites/Dog/dog1.png new file mode 100644 index 0000000000000000000000000000000000000000..e69a46f7c989773f1bf256c15df9d282fac9c46a GIT binary patch literal 621 zcmV-z0+RiSP)Px%CrLy>R7i>Km9c9RQ5?rVCs`UZWT{geEVzVJ9b(9)l~Q}qLP9{u(7(Xo5I89o zksxP_*`)m&0zxFv!nLJ_*r|jLEtMOyBvV{Ego+?MhxA?VlDqS2VyAqUclZ0<-TU14 z_ulWpL=#QqF2yfd&1Zxfi#uXQ$0S#&`M!5ug}f3M+8ZG!wM&h~(bS$O8wX1afZqcpBgEH5V6-aQ7OP|RKeV8u4hT0Aj!fWB-01p=U1Z#l-)qleZtz*qez8)q%o zcdsi?D<3Bwc>dwjyLV``y8x`t&WyZUJa>nm($UB$a}LS194}vGMDyenfWgrYGAoiYJ`LdD)`u#$xnnw)A!sQQvOXTXr)~A|MDE23lS5o>~X-b+-f9-LmK8!u^{gfwrg;QWStK z0BVlhRX=f-MfMSyla9E-{8OK>%ig%um^0@*X`S$P`L2l|l9o5xUB`l4ot+8%jgcXs z?*>4wQd8_8HwH0yZsaO8<7^wkZaF&t*GFV00000NkvXX Hu0mjfIi(=# literal 0 HcmV?d00001 diff --git a/assets/Characters/dog/Sprites/Dog/dog2.png b/assets/Characters/dog/Sprites/Dog/dog2.png new file mode 100644 index 0000000000000000000000000000000000000000..9f13d3cb200e5e3ffb6f17161b258e41dfccf1ea GIT binary patch literal 662 zcmV;H0%`q;P)Px%P)S5VR7i>KmA`9KQ545NkxuaqnKCtl0hf|ShbCl_n2I)1;T55f!N0)Z5GX_= z1ZgUv1&7l91rAQZKp=TamDVXdGAJooggCTQTr$LV30#NgeY_ueZ3<6x$QK^>o_o)` z=gT?Ydk@So!+(f?*G4U;itPM?X}3;$w1*>hS_hv0_)0<&m{V^6Fs}bF_sYk*??haO z)pDw+cKa^J;$oES{K8+!$TjCewc96|iL$x9j{fx<0Gr$ERJ(mzr#%2tA%$8_6@HO$ z;psC~Xw8ZcV_(f#Sx$tOZiH6qU!F|XV*4TUV9)O0{F?~L5 zowHo(Q(TOC9(=a(!bUK-^V+j~E)oFx=e}*s7uL*qIud5NG?*&5ET3HWBH~(1#NrpG zxVRXlJsbgsHXgsL2b{qr0l9Y>T*6FdqNX6_=$xlQ3aO9+7`Mqu05FM8gNfw;<3`Bf z$=kR1@Nvtg0qaBNgtZLQz?F&p-FhHjSOW|#NJ78f8p3Q3M_3;+8Bp5gW1aSJ#Nmmz zZk(8yiT&MrAozVGG9iWY=Oyj{| z$$+EmDqv5y5wK?~&sDMj7c?*l>uov8uA0xbHCQ?lCKXa}HoR$X$E8kMvmzQ=hs;mI z_UapnSX`tdVY6HSU+xA0Sb6yJ!Z>vzv;i-{HxC^098(Qp~Px$Kl+Q~7K@`Woh7iRbyws@<30=fGsd&pQbd>}nDEu4xaR`KH1&J~u z|Bz0BP_z~$)=9Pw{g6G@Ay1t=ND&0nL1vg;_m};E0>78pee-7CXWqPdKuP)4X@YiCINuK;;!jB(}}}Onj}Vi8k^iu9mCMzaznNCHJmg8=mw-4 z07D2Kz?~jr_K(t&EeH)xeQM1Xit@QFgj;XmGr$MtgYP{&0suB9yljpK=vEyNX3EzU zRG(h}02hTf%t!+OtZRq*+o{hi;MMdXvhOMz>4uTfVFplZwzMbWu1`N_rH)KY$;Svq zy@^s6)@(t)mm>%Oj5;2ZaC%lSTuAGHzJi5=k}F?V zG%(fY7l_H6%PI?iMYAfO?2vd&!pizQQepr{Px$?@2^KR7i>Kl(9=2Q5?rV*R+)cDP5EfI#?-4XgjsgscI@}io!ua@NWpscF-mc z7EKj1cj)YpNeEQD7+RVNf{24w$Y4>2gg}$U!Jb0{&mr9Lu6HJPg>Ls<-h03IefRsm z_xt`10t5&UAV2_rP`VK|=2aoD6Zt~dGbRizEh4!OUHLZ>Hs)0kABfswdadGFjG?84 zUaNQ#?MiSH;75p|r3HYOR{*%>M*x7l_jjobEiFs|ve<68-6@G1+&*q5mN|PDm;Wxp z+E9nAd8=@4%~y}l_?o@qRVK{XV82a(DRA%NlAQjOw=`#*VfuMdC+;TGrIU92~Lz4t1@ z@e%;BCVVa)0PS(Rlm+1TdOIeYE%GHLWYi6gPdDYPQx2?q|9JeV~8#Y7gwTjILOKWpXzh3ZV%o|%2aBZ{akDrR2 z@rYHfk5VTTx0Zz&|F1}00000NkvXXu0mjf Duc-Z? literal 0 HcmV?d00001 diff --git a/assets/Characters/dog/Spritesheets/dog-idle.png b/assets/Characters/dog/Spritesheets/dog-idle.png new file mode 100644 index 0000000000000000000000000000000000000000..b1beabb96f52281515f1ae0f350eab87bada30ad GIT binary patch literal 786 zcmV+t1MU2YP)Px#Ay7>H7qV`Zcw4BT-8A@o$a&(V+VIz(MYkjs#MCY&_*)uf^ZH zJd~2e231OzI1^ZejG`Q2xIoT_9FO}+V>U0PXzS9j#}G+kph{M( zt}UGRd&YC9MhdGn)+MnAl`)t(i!q5M5gcE9yr>vJUodi@V$Ce=Ik1nHeU6_|3~t>s ztWxevxVUttxu4r2JPD}_*i7K;V=KBfc?>{%<)pBWnY{shKZBgBJ8|+859(hxvWq#s zoOuv+0eK8GdGb0ShL>Uhk%GE{Hi;D6WcQPwc~G?QNKtESViGyv157|?v`{?n0C|`MC`%zEXaLm>hif=Mxx(4QARu9(bASgB>?mp^!^EiDo`MEo z>xXL`6^d5xnnI0lXiXAeWf-$;9Jqns)?5D{9`y}E~8 zL(M_C-?c#Epzs?W9KnB1;1Ib*^XSiF0Dfy3vVgLSz@vXE^Y58NuJGjH7r=ZH95h79 QLjV8(07*qoM6N<$f-T)<>;M1& literal 0 HcmV?d00001 diff --git a/assets/Characters/dog/Spritesheets/dog.png b/assets/Characters/dog/Spritesheets/dog.png new file mode 100644 index 0000000000000000000000000000000000000000..02d445a49639a5acf4dc20d641554ae411bf9fe0 GIT binary patch literal 1653 zcmV-*28#KKP)Px*FG)l}RA_IbJ;abxYg5t8ZUf^AE;;xYC?13< zZPOBprUZo^T>T4r5DM7_EGF%?ZrW2wbI>ZeETjiL=_Q9$DF|;5&-Z+9G7~46%-U}A z0hynf@ArMbpZR>h?~OngU3Ae!7hQDGMHgK-gmTdiG(#q?5w&lCALsTfDAwv&%Dw%j z{r;ZOG_b~m05mBRYgyM5!fapCeg*)XWIyw3$=y-N zk@QZr;r#t;eyDu|U8QglKbf7(#5I!JuR#A=LC;hWn^(cNx%~>B1VYf&5#p9p>76P< z5kKY^CsEqk1^~=2P9nWigos6h zSkIR+HVVwljbr86O8~%nz6^lA!ReiP9vJ3q6HP{fawXD_KLZEYiT z<2nFH`=Sq4Z!#lII}o2Ik^nd(0#it_Y_+OFcF>8kWt=Tq!L(#d&uWBq_r@(l*ynYf z81svhlI_=TQd02Mz5)JcgxvtNisWvI_fYRr$NYRIt`ReZ0>IU@9dxQ}*;NzE9s-aP z^7>5*rLAqA5HT5u{j3MlLy;Jtbm03CR4ztZ41bJQs*mU3?uT^%9CS_uFo+hQ>2fMq|Ns>8?K zPs;q_q!e7X7BV)Pz@Jl8xxzj#Cjj$_`N58hwK`%`!)^Ow)zq@GbtiEJ!~MMt%`CIs zN<(|@jk-EQ7T5m*031I^NY@zq*c;0f!x$K+i!tJ?<#Rl2jXQkBufU zGdIo`%$6?G?>V9! zJC#d{0syN3fUI=w?CotP*%il2x2wxpCAP6Z9^ZR`P{a@9%CG{ zKhgkcg%oYALx>P%OYM`d$w85c)C$D6o7MK!<;LfI-2J2s1qMlB?*N`0C0-{!fEklJ z6c{98FXQGaWaJQh8DDJdfmwkyAk9($qSkL2;r`xEJkAy-*0M_E5WKO!`S+1jIssXs#5^#> zqV^Tiu|fc6DlxH^RWfmqv&EwJRlx~5MF1m05kHPV1FYxEh(&|g%)4Pp#>84y(bal` z(uuP!Kwd#j?^H3rIO$p}nnG7ch&U6-Z!D1f#=`&he-+3HA=9(kg^zJ4Fi7$n3uJm$ zBh#~TX=LXw#IfmFt$`31=FAU-=~<0*nwR+ zj2uSTa$Ly9hUGA0v+aMay6?|@-=EL-_xt`nkN@>}c)2#V>ph!2ujgs4CqbZZFE@Y` zK++(2kPrw2S`dssH${-p&&wM@8~?oS|IeK}>p>v)?Ao74T?^dtHsA{^|FV6JQd3Fft*b44(L4Vap%&4Bq#^cgVu>r(~SgH?gK z8WbVe2k`~-ieS38uL$;!SORlx&`!aA%Q|4%@CEnN^g|Jt+Nx^6L|GmNX2E%DU@oG9 zfyr)60p?X5C1Acew-=a`afg7pQhEfK{1w6dU%3(m%%leez$`EC0_IR31(+)=t6C6)oSaA2hH(((kFzEP2^ksi}4LEQ? zN`BQJKLft6`O7}AyBcJ9$?Ni35bzZKbrS~JpnUSdz^}^-eg_QV|9Kw@LPtSC&!$re zF|ubi-X!l%nNXCvec1oV{wqWeQD|GEe30F3jPuyKJ zMoI37l)WvrD$Vflk8d#fb!^@5@uuraZEGCeQ0*AFCLBIgGsZH};O;H)eKO>mN2{5+ z^QOLFKBX_bATKMPTM)}s1%Xthn1p)F0NPG+L;+-{JeqE+axyL=*wSf7B~%5Zsxq1q zlc-Zt6?AHUM z>74htSpVm*SszV6*5LNQQt=XA!U}#d(uR@ArR(6uK&>YEFmKQOVzR42F~)TD6p_iY zN)=*aT!9L04hi}&b6D;Y=Zn7Xl_59B`e1XAheWDOiP61fyndwYI#BZAIjMBI$G%sd zIW^%6QhFOfTDKSoPv>OAb)d=*65?zYtXk(xsixNkX8ud#u(XNzzfH2VAm|)4cfSFf_m7MG1&~WN}xkawQb} z=oEOUE>so5JT{WlmR6EU<*oQ{yvuRKirzfhgBUhhJQzp2JKgR15%cOZJoJs1>zzMuuvOu#;5Po3E;|P?pPuPcWu|1KIwkSo5u6q2c1L$N>>Bis zS0rjWQzlRMtrz*dn*zQ{R&qg-*+3wPxA^4Zy{Mzvla{U8h+2&wbh%mU@F?ub)Ps84 zXfF%rG9O_=O7&hb77irerkSh+4{3CPW;ZPugDlE#MVw_Jn zmPLPFkA?1W++0P@&m)w3MR_)uj>?7hdNXk$b-kv!tgCz6lV9=P>cuxH8fxw4&#KMg zlcA8~O>9Lh(<5y6E72{&HG3DF*hDX#NrPX3C*rmNnz6Cw(#g3X1St z_R*Y`>WX$yj)5yzZivrGG2snnwBjLmjm$!&Rk65_N4q}t}Zh3GoBNeKq9o?wYc|?g`R6I{K$M@2OrcoS*l|-jDaV+TF4#-AEQ3<~^cGt#}FjK1KGk9b(s6WMi;-nRzQY zr%B&@U~K(XL{?W=0uqOYOsorimB+G98b+YiWgzduDO$8Gb!YA86)}T_B|fgAXXshI zrU7CJ2zR&^Ub^X2(FY$+`jE%amAP#AxwUAm+0a|TU){myAr-aOL5#M|Zk{nKC0k}Y zM`w|)Mug~s^QE=d6d}o4D(Z2T?Y-ITUQNg-Gq#Itihdm0r#6#FSO|#^TWNMk7z>6ACIGA1 zvqB(q;C)_j=2iB8#O}HnxiedC`aV8!W0RS*RI)DF=&AQu% zKN@ckK=-!XJL_({Bt(7PwcBR3#_D`kMY|>Ny4yUl-8OeVEOkshqduLVNex9%+EYWr zV6ww2{fQg^x(Rx$4&^)hd{PH?DMP)SwgYdah3R`%fj+D%=AnZa!P|*uK>)Z#FHswc z$J{cVY%InF*bSqli%9C;1F(BrW7hM*L~rIs@l`j?6i`o?xH~?1kv(R)tayjqRt@0~ zbMoR60CxA7Nc$gOLGl+j0jMluBKLxs$bz6Zf>b5^tn*<77paqO&PCKJs4hqq+z-DlXY7>)4KjV@%rB*IPjZoP3_Dqw}kRn`#05ygIw&Zox^J0oSjdY z;xEo72U^dzatJ$8*K}IkvoKRgz{px#$lc&CCLHKdf9$pa({VSAGv8_=HACe|fnsy8 z)!|cqvX3L_Dx}-2;}0&1fir=o?G>?PN)H{QR z6ruNeFViwdcEsKa&+t7yCcn}RQI>p*w$2%}L3Sdr-Vp=Dw2j8jNu}cT2(Age_`Iz0 z413a1b~QKisv4BBusIih1r_h0Bp%*~qz{_Uy3BvxbqR~)ZmF}~jVS&3AhfbLIBVBph`~00Luz?OU5-jv zZLo2GC;WmZdsj2kKN;@EdeS$29OgIqhSyblx0YR%L7#jRAuZErNC-P6$9;QeDmo0CD?2K>W1;#8pY|4mu6mqYATewX`y}MJ<_@ z*~2M)ta-u)+b4U(Z4t)Z+<5={H=`W`}pbK`kl zf>V5ZgexO+xR}(@Z<j8OS-RnK6()&s(ENfF@hfVoXG?a- zK4Shmh&vmM#cvqE6|&)%e}Q=SPY@^gM*Ifx*x3)?e}j16A0TcicY_zf{RfDr5GC4a z^4#s#0-vv$6@-Ey_DuTSES-Vr1--jbwcR8+;cdz%Ba8S zT&egRD#_7Zi)!7(HYrZtOVoU;ZNF@;neSE#PwV`lDLpNz$4X+|JU*f6SQGi_J8w6p zFDOSwEBjRT(z`Fol6_+VsVEsY4|`Yv^sQ&qiXJ^vkGMZBcul|nf6AP$^AIszX}BvZ zmLbx1H#8ug8BZ69V4Xy0l$A9jj%|YMgCbNY^UuB}o6+-h<}#)!-y1b@E7+&&f@vnz zwMJ~rt|H(xw3j;08NNATX+8-f!^FbXaoVeKacZQf%iut{|>(o}Rav9&;e< z0Uy#YIftAvA{FaBbRsp?jLl)xmQUn_;kaRF)sYPAUboEG)Z=v?`V!*O<0k&YLCtq5 zMlZ2*FfZ~rWL1tY^U*!j&swE=T^ig#Ocpv`Mdz6 zOD^hOW(4#{^KP0}iCnv%mV=l%Pxy_4*0@1I!9!@U(vyKD>AiNaSWM1>RH*#TRIAs+ zbI5s3k|UHZp8|dvY-|KOU>z;uI{#k)5jo2?e%gG@T>6wL0u*Wzf))Jt0Jc%XHqTKK`QD{`(n%h$z#)K5;!n$&n+y-|#~eiCFS+pt@Qu!(#m3flwsAFQ&V?e|vz zC2jHhTr>38&~+xkEqFLgZbsBKiaLOK9P_p9Jeyg0Y z1+>$QQmi$l|LIZS7JB-kg%}8@U+H7*yk>wJjkf4Swgn0q+fF23X^*fWO-N^y;en^> zzu1QSkZuJM(Vho3chNy0^G3}0`_{Z2kQN>TRus&-R9DM)_;Lm`e+2lON;u+#7f-PU z2OL{WYi!DQlu*4UD(Y%!5xg)GOgLj3GcFJZk4x#lOr5&+BPABol)utSd8-osG5h{sv9bZSsQ*Pi|`o^%~y1 zA^XwbJcG;`DSJm1-miY&-ghK*rmNCZf)!N~7ADF1uwt#79p_6C$*tOn!Z|3--0nlt zN3R56>HYGTu%2$Ia2!YMrY?CPkCS0x2OioXf>cWe0_xglKbZE21QZ(fl)v;TC<&s@cdP87XSH(< z2}ilBIrp`BuFaLZkImxnLk3#Y2au@gpsT6K{m2W&{i-8rClOS|O>|9;{V_wu%$Y84 z8KO4(-DdIKC83n(=?^29%oHhUJGr)#)R3U7h~robMG6dd;y(DUTl)4Z^cO=Sc_VmT z%twk&Rwea|hy}WKM6^r4m0}byV9?Z2M=Ds8+yiH8W~3!}Z;wIDq`DQROEcsOOpoz) zm)S1IG0$vvyB*wCvi?|MC#G_xI#@LuJ^uYS*KY2l7Jd4jgYl|6PpzbdWOZ~UDH3*P zVpH-l3ydUq+P$m%Pz3gI8|I#y5g`FNY-@|Pby0RDTq80Ki^EQ;>JZc-ix9zkR<1L5 zd7|x&sg?PW`L;KPGTBWto^awL%%NG$480Tk5t8dkLFXQmz1p;miSWjdGrRY^OPW;2 z8#X>Wr~6g5c`>oxgH?otVPZTW_(JzZx@Z9=q~~WhJ zSr)nZT9|njSDq?65A8g_o;uA)-(MLx2i4|X1-D=9*%9VlLNQq^ca$7zkfISa^RQFW z^4Jcx`@MIO;b}LA77fj8(K+SD|fDGnY*(p`%MkDpn*Tvd*Rch4(~!cx@7hnL4(7SEc` zbnEc?A|ytY&X3KnxV47USAr)R*csx87Cv~Ivs8ghANVS3S>!qD7IZyJbPlTLyW(bwOdT}fdiEf?!<=107WyL0xLZ@RC5oCuX(-Rl z=(~0XIfxtWnL)cy1xzbjR?0okqbOS}d3^uN;LqvZ*J~zbcU8MOy3zMBwhgIOn7i^r zSD{ED$dV<5ur2?6oS}tqKk#oKgT;P*cJ^B6MURa42G^r2+q^80(qiX46Br=XwW#G2 zZuDeMZPfUI+9w-`rf2xydCv*LKPDc$&Rdb?G%z3IEAbR~E)++=iuTxpa67-aZ7Z6{ zV>iNlUlS#Erb)URiMU+c_&&;aK^s-wg88b_ekP|Fl%aVoxRo!|H#buzAlCx2EwEVx zWc$@`m|g=~_ZOjDUdZyNP+k|~@OQHPR9iYc;;QKFMv1?X?eMjSV+#I7wpCr%*_}W9 z<_BcsYOajUi*>iC&)zeRcNicUDb9hzDfh|XNOWC*zk45d@fnhVS)bWKYzp?9U%BGv zOaCl?2?21xO@26L2iJfENTQ(qRt@UOtY&)dW|hcQU?F3l9=P;q^1%DDR??`+DIe$R zQj9~Lxnb`(Ad2g4q#l`miH=(`uTd%jBrI(JAN@1*2t%oE<9R{mHCY35d&IvKWvZ+O z>Am4X+rxVd?8C1*y&!4ot_7~CfnA7v8Qd8VcVAx=bfuAPF)x?G@esR<1ol!Cm0{Y%i1pdM+EmsM^nv=%X+#FZv4J@mOLs=)f z0T)a#of3<7ZQ6@rv5OWPK&^Mu!&&$mtXEwQw``&Kp$QVem!WkCE9btPt@M| zv19xBNuybD)?bvl+Vt61m}FE;5j6x1ILnvw8&F-ITy(o>5<5RsCew zm}=~l-%5`W>15FwM$%4(@+$DhPY>pfwZWIN9c$6(eIb5Jb|c7)^@Fx+(Hm72iF@Ds zdgE?Dcvll^F`s%RF{XgvK$nE4Z)gt(1QpAnaBRN{MZS;thG)sV{R5&Zt-<;_X0(Fp zgpOv|?RzCobN(W=1l|^Fxe|`4wD6Zt;oteZSDU}WVfmDMPYVgDZWtpvmAh+nN_$E3 zquv9s&HpgksYQ-MZiD20e8mJ{n|FH|`R6O`Cv0c0EAAIzsqVBmyC{HdfL{Be9rz*W zYDwOT*S-k{LvF@O4rYd2arQ3Lnj~IX8(gz%F;sVpe|4+hN7v_ZOP4wEQ$%)4KyBzV zUWvnew+y`Q$tLjS!-Gg#LrbQ$3hFWVW%XEAyGCdozvYl?C?iuquXXUks2;HZC|qml z<<%3V<<$9y7I%rKQdkk9QJ!i}{i<|uu95(@O$4xAX)&(>z;?zXPpIs=@HbQn92zw? zq*)jl67r*;cby5KFQ#!Sz(PQ;XS$34dL5D@20k$gjV;;hP6g;S6h<^Vm~$a{=H*1X znv;H|MA~qPVxl?8ATm;1K(DdCG;;R_lTlefBS#4|a+6$E%j3PVw#dFg3pc2^^kY^K zWZA6(FWhc-u0eKTvVuF3DhxL54wY0mm1R~KF6xn%^)4|Gw-Dwfz6Aq8#nlA#r**v; zewv82nGwJ?7-gED{u8$MrgMIAKnEpYl)RLu!?%)p=KVuReTjNaNtV$Rrw(@P_BCPa4W z&5m2=CC?X4^dCmW4Uzg)6S0Swni&;8VVfM}+)MWQqIdXcj;7%Gpott&0gku^n9wC6ANw-zcT`|UF2rrV`%rElu1%n!-hP2AO=cG6>M zd+cK5v%oftF?a%LR}=neX=XQvcrZs!EAdqNl6Ge@1YptoKJ7!iXQ)n5 z`era!sA?J;ko7LPC1o+>%U&fsYt2r)5eKi|%)IppG4{?x-C zP$GN-ByuQilnm1*J+=>*I36EFu(t0Z^ML+{Ia(_ z1rj;q^;PY4PvjHSZ1O`19%5=!O^W5a8dV>;Z0(PbKeAQyhQbRElN$+-txYyMyioLc zq*l4hb$7Y{sgDuZoAMLnPBY0J0K0xV?@y`z#jYjlAmYAZ1LrMbx4!<&ikJh+xOVB7K2nR)b zS=J;50;iO?6W@XZPqIuGy}ynv(yv26$Lopg<>RBnL({4Q?Q?Gih^GEE6w7kp4$Nc~ zwIAzS7-oro8S`%o1_NBX^mK&06UE?+C1pb_o7Fu4`-<9_)aWucK@S zxtzW+^!AQ(>*o15S8n%8j?lM^EY`8FoSj}pDik>rf(CgF2$e}+uPu4hF>C(E2^{3V zLgfB2BAaHcT-b8_aFH-bYAfS0S*Pk3jSj5AymcmH)h74cL@N)pABZl)3t@6F&_TV_ z$l#aPk6j`3bt18$z3XeZWr(%LJ7{tYC`MLSyS1aj2cXgZf2GmM0FAC1iFw@pln~nV z<0SMuVn5C#f6{2+HM4k~9*h8JG}o~1*d|xzw&ACUlWMXeMMfpNQeGO(<;*PmzuU}P$(Q*_ zqqzW$9wG~9v^Rgyq5A1%e67qny7{7~ZgBc#sb{ zheCVqV4G&+ni?ZwGy%^#4nkL0>4u(RSuC7%S5LKHX9YVS4|vu|^|ilfv?pB?s?(q` z3Y(1u3OUaYvbPc%))IOZ~GHQ5O~=Qg#&-FvuaqGpL{tslKOJo8l`S_ zq~~%1J!7p_T~}}`#v&N5!-}qnWH&h(T*Y}fP}@GkcQYD3IfrADRfu(6Tx{+1cfxc< zS*49VRkm&LY`)I1^6Xv$Iw^|zG_+s`G{KrRQ6@&0=Jv0TeAH)z>>{+7t|)FoTBY)~ zPXILfvifftjrx;D8zfc&G}_=7js7gsYDm6**CX{Z5>_=W=SC&x5m%j{K>@X!@JsFP z&>&gGvf_xDJNR1$azpU!*Kryq+LXRKJI+nO9mAa9Pr9r9X|pbc>wOVbS_{j0`}Jth z0bgQ8;U01hQtMSS^5_J4CmqT)xPr@e?Z=V{&O7GQ0LvN)Sk^r~&;mTo-)dLbTCME$6sqEgG~@MLN^Hg2 z=F04(qCJhq`>wECHLNtKz2Z9Hx7_jl{apGWeptT0zL@@$t8Yq&I{Wsa4%v!d&LD5j zD{zG?T!)%wUb9jO0hS;r&e&=3!)(16!0E2$v^G)|hY6;9btlc*~@KQ9kh)-i={ zfMxx(7ZD&9k8tN|Hul$tS^cuCL$A!eR7$@wmovs$HFhz5$c;P3HX5lBu@e0cG&=5| zG@8Wuk2KojCymzn3yqH9{-)8}{z0Sj#{N$=M$3u=Pgy@vn-#LD^>WC*t@)8_xeqxpMvxC5 zcbqx5thX3V--|=x+A%h8XgXgi=N(A=Uo^T1$Wr{G(ce1deKwH=YIiE@ja71;p2PH~larG(-gS_Blg-k0b7`DLZM!#@)K`Mj$ zfTXt36xI(tIfv>TO0n3f_SR@_`E+8s5GcS%QqAYF;R^*`!m}2NSy|wBWKJOh44U$4 z&>c3T!SoXCh4rk|*MnR(HSEwqe35PsZtf^pcFT`gee;zy;72wbt5i?3EYNjz)B)wM zy6`YJ(yOSs5)aKX7ruE$q4tzyOYO8HCrqct6J)nlLvq@Xeh-4&+WjS9RnT zdR8IeP1l>sD%YNZH4pcqgWE zj4rABi3-MDGSapGV2X~1nZSzUDnjXV#~~xnXQVK@9MEA}<4S$+3%llXJ6G0aSgFz! z9D4R?z*@@gqE5XIyc3h*+hBOz*lvpqrp$X1+?i78(PVT!cGdO2;`fPdt$ zKyZfCdwUXqm|5F}^pQ+nCdyt;GP*u2SVmG1GpolVxaPFdN;M#6cKJ=P&$EHgGv3b0 zccy%O(?$dL9?CbWH|0`0`_q2R+0x&hryV2EpR32keS)R?tWG6oV|xr~nVi5v%Ei>4 zceug==hnAy^2rE+^4*E;kwiEf$ydE}Dow3V&ko#2T3PCEE=p;z5L1Ne`%NvK&PlKQ zjI$A+>!Ju8>Y$whhgtyH0ENEVvpK-W=ydt3Yx~NACQ8O4UlDx)$X>gV;ZR=wm?UN6 z*<95-)@zcn=AKweLE3_&*^jD}^ zU$l!keU-#L6T130w8Ci(?V|M690svoK1Qf~dxY-c2sZ^GO?8hp0B%pu>7fGNYys5awa$ zqKKDubl(mP>jl)-UE62lC^<>E8EjE@S(R5F7+(=~wK}rYXWw$p*OTL>MCTLt*Keyg ztSbI4UZc`Z7{mLgC5j`Y+q6g8vsvvSPWu1{;}VCYpLlj0hKg^JKwGcpUbyV|0!x~j zJ*~=NaF&ZNIh~fBN5?;#AGT+wta=v(r`wY@Hv-P_SN#fTE&E&a53U90{IQ-@`iWO+ zF3DxlbEyd{y4c6_G-dw`zMR^+z?%R6PwtwOwe-WeTS# z^@X957`%{~Zr@GQLVZkP*iaTKp@=Z0|8hsGjX z4qsDLPu5OUFSKl*&1UzDKt_ApTgYa=a%KcU&TOffVp|azMoz6sNRUCrV#~7bELjqz z;GAamcl|migJPrHUpX`Lu)<-gkxrx_XLimpjJ$&k7M36N_H`dlf znVAVcH`}9dTi#AtQRnErEheHudt=sZ`-Rx|wkZ5IsL`yBTG%|Lqc%j4Gy6R7*PPk2 zfn77+POl?mML-~t26oe3*#QScL^#MrA;(kAVQ`lZxzYjCC`e8B=r)Ew7ae*++Ki9G z$sXRf7UZ2(5eKLSs0%AunP?!xv+BcK20HE_zP7&{GvC~7@-xU4!HN}|{4jwnv8izP%Y;oxTMD z-Zn4sGu7q@`9Aal&#f2~sN*J>LuKN&{O?d1kg6_C8sof&^=g%|q(>1TxnJ7{nvkHw zOo;0(zsqh08A?we^=>$m_ECTf|IMZfBav`%W~0fU4ln3~ZeINXxIv%n+s)qc@p#W+ zM58YQk+`tc7`7X_CF1amA7G~<0KndDI%Ko_^36}Hx(<40By0vJ)EQNY=is4ut05%w zyZw*2t8*t6uWwv<^2phB<|ATgZo1WTq&3`PL%Q&Zk+cKN;Tbr)qQP1e`U2})y3h7X z6$iB6en8-UA0_~7LjbUk)1fQfa1Ag3*i5U}l6SBGU=RMXssp3KUEd|?djwg!eS=NN zbT5Hf-~Xa{vj}H@YTgSGmY(W^-H_6?DUFEH0_WjIL?8QsZTGS<3&2qLVoW+c!h5372w)&Y1&u2bSVG_<+fJcf5KrXzo8*&YXB5)1P zwZ4IVp3d;hBi(Z)uz*}RGERgYtv^a?1z&nkv?`mQez=f6o}5mWT6%Z?V2)V>TqRBp zCW5jlG~6{V2Xl;@jI6QRCXpQg+ci}-#PBz?wit4ucA17dCle3HU}_JBd3edaLpys2 z`L##H$Xw>iqwY+#mgzT}pL4Tec^JJ)*b6yYLHSs_e*?y+YwXs+Vfe$~W<0oPTI}3O zm~7R#HXnC()Uik)gQ&64OEq;o=poJWcy?Z| zdk)f$3|XjtPQZyNUa>>EU*ASTRCt3P(4wG0m&5YHZ5Z8W3$-lU0je5ncF?1$8jop) zd14GZ@1uY~WP0i!iL$^=6578KWysRSxtWAvT>C8`QPv?ylxZdt4Pxf3KEnlxG9WO> z)~n<*0)a#sB3%}4cL5^T_Uv5#NkGq}Qyq4?*0?(dMjun|K~#Fzv(5R__f7YBF)C<` zM+$KXQOnsUz_H9gBg49_ugCy=$K!OGgdbi^H@M>YD#e}j$;ww8(7bmt3Cog;^UoUA z{6q83`-kSO`!~&7r)l+oTbiHUe8jLYg*xa~(Y`kl2B9SXSS;a`g+AHa7RSafW}w9L zTl8phv3hf<(ri`>+k*e3Z!9;7MdzRkF7a&T=9lB1%@-zfQdVu=j9DxxWJNOrU5owv zwL|8+Y)9}`izUQt;Tz&@mCeCsq@AykQ?tLKpkKVn&Dxb3eTlrC{? z+ueFy^VKxr)TF#5k=Dre2rq)(@c^;`t1d8V@y1l8d)>A!HlE}ZAlLQGbUU5jK+Cto zH4`t7%e22S?^?WZs2;#;#P@2qVc`QAgo{k^4G*ibr!I_T_;fm$hmMkrJ&i8m2AJL6 z_cN~!mFPDYZknU!hg0m*57HoCz4;|F1--|IOX=Mv+r2}aU4o}du=(K*uwB)G?C9cm zrhsUD&|`L~LOq?_Kvc3n_b!3&rOQwYvuwv_2Y1^7xo~C|`H%pw3uiFu0A3$#rkr?* z;SD-gpNSV9|9}uab?BM0=gl;%7wSf;vu>&#;?e9wLwyfeGa-*7i>Dk7c9db=Y-N;x z*Un_iEpo<-?_dv|36FSvSCgALd1T4`5x*HdCNGmb|7d2rQVGj#^@F?^)inyL2lni}7uAnF|(vm)t@$xca;Nq0*FrvY>^$SPyv%y)xev$0wPS7IuypYDoGMU& z+Lyp>?P ztNIVT&iRektAQfezeMlEv>tW%>76(Dc99Ex+|<3{ z@!Zt*SfJC@wh2WDuc|`ZK}O_3Ns^;!-6~dM5&F?U1Bwz+eueYpYyfq!R~3^qK9k^$ zijOTT+6vkxLWiy&0!){Xb%3Fr8uh2`MyR=f2a6xA!A)I+CyOLWe#sLGY46eQcWm3q+z6VhTE;Sx0)M%1|*-p?z6w21f4j%ysC_{BTSF(^y3VJ$hRJmCm5{57aJwz5vq zIQ%ln>U}5|^ro&D>8w*%JpW_Zqzx-%EC;+;DF(%UGzGf+vVHU`fIn{&W=0ks+alT6 z)aTGlF$T2sD~-Xsw3}F=KOi8j^|gYNt^aOIN|i}bxvQwLQ*)CX7_@)=@V+|lqC^K} zP93&-hWn7q<{>Seg>EEFU3_9$8Y=f=9aHf4o40*|N=WLKx|7*9;X{IDtsnV$<@8f~6!qZ)56SAopQPXK0hppUcM zBmmEWg<}l{rN9V56xP4@`% zjY&xji1O@EW$@c&t6kMLbA&o91Bik{HyWRldcXJyK4k3q=IV;lFnif?MR+LlTCE)Q z#xJk>{wD0ll?wF5y;XI{%NyU;l~jCW*xs?5j=)s5biFhk>2-f{xuoX;l!S0jn}|Rl zEpNeWk&>enRuOC$aEyD&fNXSsQ`Shdm?-U;gP;pI&--?Wb35 zYZ3X=tCrqK@^bF~{4cLMxe`dnQQV}x$4z#V3?0M-UUevZBfiSr0V0TkKfXRamGIN6 zJ_hp}`O~Xj|I@2R9-~qM9EagX`7zh6t4q4Z~-0<3M80unqSKw7!i0_Gw9zqa_ z?haZFnxpc5f+%>UKpW2xXygCpRim6Cr`;SkAv?3F=RO(ad1lgTW8!nV6vqHs<GU3?#v?07>xbvj_OQ1`Zl@qs$qv4$MBo2^# z2Y7agY%LE+g4d606WLn-@T&9G_;*I#jgcuXVQLb!v$cEb`tEq%$;aM9=i7+(UVcTD zMQ%l2oW6)u7(j}T4Y4}746)~MxvH7IBC}H7?7Kuq3$3x2qD-tS>TJHnCHmWy*jIL0 z9vJ=1QFpC=nE$W_LulVG+#ah^VF0*&LfIipMW>e3|70r!)oh!3QXQR640*lhZ*Gl~D+JEBqX6FWa zN_btw+#b$b$3a%w z>~k51ISo+{>YV%HhZ+=Cs~dYjx-%O1l|jWz@Yb7&ZM!Gku@JdaX(Zi*r$mhn_wwif zPDc>ta$0oOnpdXjx9oacyO#I*#SD_2-i0Mli?MMl2&etT?bn%X0JnGl zf!pRIf8utFt^`Ja+m(da(LZt91Hf$^9`_W|F;_b(^KKa9g9=R(NP>H7ISiQ%3%@yd zdR*^a0d~ef=}Grex=H?l;Bzq_wmcoA#Y-9vEU>ztl<@|!7 z>eF=&bsyn$ZfM7GxO<18+K$3n_fziF(P>oBzP=>wn_* zU(ITTKO<&;@@$9Ohi#OlSOs0blHiA~i(J;&V5zW9VvX?bJ7Urs_mv5%*k+2ZSuc)k zYS{SZZIsK%&n7l-an+c?Lp_2fb;y8oWw`ojUpwpLNIR}deg4lvmp~l9q;u#5z_mM+ zX<>38!~Q7W9+))B;ZohJ82Xxsn-0lpL>`o5wufIl zqvtmj1SOgj7XuM3+JiaV(%~T_i$ZHKITNb1y_-c9x|tfmrYsf|OnqvMZOLQfE02_g zPG3RF1Ed+X$u|o57JPmN7W$5vsNckjcCCmH&SwzTfDFKNDEi$%8EiUqjHR9a3FvT3 zGN6nMJH~lWO*W8!Q>V!eZ2sbuP*AZ#YC%)#K^bB_D#>(@^rzZUpiVFVxNKwUh_~F` za8SnH7m}AahuHlrl+cH)i0Mo#dayM9%YfxI^Cyl4S!eYIRSnTodDpoJ# zoK@i(#?w74QjG+&!Gc1g8=O;KC~|5C;31^U!aUuud}{jOr=U|-KvNu_r<>A&3qWW|(C1$}BhRDi#}M3VcU z_rLe4_qr#){N1N6b>xjXe#gBFg};FlB{d+S!2vs}OZdh)l@?0Mw0F%1|GkRkma-U6 zt8_mleso!7TbL-6hO@(3u=vXXj}W>OU%E_RqPjn}MKoS3yAvMFeO481hv+A{jBZ|! ziuW0K)6rGr9c1}*+Cq|>X4s%9p#gq3nVB0#h@`^q{!zuE-|8zSsFg6g+ekH1y1-u+*ySe1)r zKox8GR~4&~JNNWg6>B$(0K=5LKj5EP`-5QfXrp?IbS4#cA?^OJDpv4{GEV$oRjfGA zv0=Yuc;X6>@y7qmcw6tH6}EqW3VvWhisTC`A-&$>wC zuYN!cG!C?rWX>{tb-_>Uv!(1Ogsh%DKdCv;C2LXN>+&4|s)~6XlKl?##m%?DU&h&O z4L$2BWE`3WS^Z|-viCxmPp#k3c(FLp8hs7^KCd9GEd|tkgS$p0L(dSF#=Lu74vj6} z06IkhazMW#uJ%>jdo&@WdoZG31QeY89L$CJwleMo{sVvAf8#F*B>ETLyhF(1|MFQV z|L~?2)*goFt>3izqp9MkS&KrX{JsCln@;=fP4k!setFZ}SGsqu0e$MvUTsoNqr;1j z?Z<>bHc?ohTtzFl#J|@#2a?j!fc4Hki1S8vfc77M9ir8GEbRC>h7jnksT?df(ABL> z*J?x=WGBu145Y$UE`|!Kt5Y-6O3P=fH_vZ1T6ObP&g-Eb)3=Y0jGuC>0|Peo=;JAq zC)}0p-j=ffb4wQKTWOhTEia@(K=q@a8VeraF6B{sENh)g@ImW=k2tAT6o0GspkP|E zFSs2>Un(SnL84&txwl3S-jH^vzr~L#M;DTXL82l|oEUk4Xn#UjQph+ZC-8;NJafCY z45&1gp^1VEKGf#s8IwZ6$J$tnElU93{@*rZgTX<8xvcRtdg37H=H=PiW#%XI7Ayai zfk>HQ%RY66(Zd^3#;_LXrKg8U^Ea>cSO)sST1-Q252}=qye8fu5U_|@Ka#I-h6FPq z@BtiG!v4s7DDx4M{n;$~!!h79Ogf^M*QuZgiRwOgtRT>qkiygT7U+0&z+5gY#(Elz zD?RIhyTKwn3Ak6)%6Ot)FnnvWy3j&&rO_u#t~_N&AL-4>qs%AQB^F|na8qc2^4^FE z+I<$Eo7eNWW3ugLtmg%fDbXT`HX-pMp%CJ z%u9o`;aFYOK6A6fdolIzy205-GVUyc;F$1w_7RR^B@=BcELlq?!sI3UhP=W6X-L{}6Jk9BTjMI|qLVT^Wvd=ZtpIv&zF~3;A8a4@Cwqlyjh8p zw1rUdXgllx$!k<{J?g>Cz#H)|*s5=j4h)dh*k{(g^ZJu3NDdl0zM(6)opLmQT!k;(oMYcwn)7f0W6V|J z9FW8gS2f>vmS!jwxF2)cvuL}Vz_ie!9y^KPcUtD@GQQ z+bmKqaR!4K1)oi6im^N9o=dO|TJc8h!#tNQ`k#;=2F=HJfooK)YSYBqI# zuoAkPsD7`J*uwnL2)4T8t3K_%&qidTMwhNamv*$ug}%kxleEWQScgD7{=Wbo0^$7* z6wLQU!a?3)=+E;6qHJwcy=>%A1__fg&( z$4l*?IgdKVujSUf$)30Cz?+yu)%tDql3l~(uURiGv8Hm;Td@27dpBC=nfz+kdymR`oskKf1S(A8a_4s>kJ`akmp|t*LB2SvN20)yXS{sn+f7hPG ztDBSGkFu3x*)N_4km>ah@siE2av%M^J9{G|SLzG?S(6gtDOscR>?7-waen=GVtrGG z@8ti3_LclSexD23oJz+v@!5F!xtIJW6hGJgI6s$gQYh-TP}F~>-&Bu;lO}nRTsK~_ zp}A4+qwyH^(z0I{XbyeWWKqXO@0*El@wX^be}hS$R|4%}-PFbZ zKkFV_YTaaLpr<@>j5^NjM{^(zSF@2H0Sud}e5kQ?++&Z#avxul1?#72FXdjNj|4D0 zQuUc%3$SpV=CMw)c~Yu}f9hVRw5g-!hrk+tK~R<&_gR znZwuCsr?>Kc)udE8Blh*RGw`nv%-Kd@DCZ_?}LUi`VM1@=F@@3lmNgYhK-=lwFLWU zhrYwuB4!}Ux&p1MawUec?ikn3&UYAFwC)R4@S_a81A33BBLDyZ literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/Background Layers/.DS_Store b/assets/environment/Forest/Background Layers/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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 literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/Background Layers/middleground.png b/assets/environment/Forest/Background Layers/middleground.png new file mode 100644 index 0000000000000000000000000000000000000000..72949f30bd74f85e5baaaebab26f2c42694dabf0 GIT binary patch literal 15306 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 NS9_^i|I9k#{{vq)x32&I literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/bee/bee-1.png b/assets/environment/Forest/sprites/enemies/bee/bee-1.png new file mode 100644 index 0000000000000000000000000000000000000000..12dd06e2879d47e9ef844a0cf183262b46edad48 GIT binary patch literal 830 zcmV-E1Ht@>P)X)ka9AiPh+QO2;7nt3 z5X=P<2`H@mFTTBZvva$%%pM$a4~AuD_uhW<-v8bV=lQ;`TFnlq7PK~$t#z0tJ^T`-rwHy=2T(sI)xb!<3K07Dnf1#`u_(|&5{!>W1Zwgv!>Qc|#vILB}( zQ(&_I)B8#M#72r8Nj=1wj7*XR#X@nElIp>vrAA^;Md-F*E!U?cxQv!_pJIoc3jPp6 zfA&;&!)U$#w(W7cbRhV$jkITKVrZVIB8Gx7%-D(Ex_3YQ*rRLZ*A`u8$0tJ-XVOtr z^K1wu4M0Z^A5kNH8KV;kCZQPY^7V;OG@YOr$i`+mf2-Toow~Ufi_cVfZYsFPbAY9~ z&D^<`r7<>Qu56Cfcr~LQWV=GoF&CxFSSb8>{$@WxAT_v_*H6<}DE%Zb%(I>(*iv>c z6gB6T0H7PW9s*ci*{&1#qoo2}2Tpd=JcbF3EAi|1KWZ~~F}*&;01z|a_+E+}18Kp> zbv?=V_2-HD6!#N2M6{49*g{FsJt72~ep0UesI$ws|LN68U|EM#0vzg*A;5o-QoJ06 z=WmMY>iN9UA9N<$LZb8~IT7&cKlUA>A*)h9Apj;0C^AwE7FWI~eZbVZdQWrC=&}M? z6G)4!FjQP_G^6f6tp-5Qo69-MswGGuxy7KWF5P-a)yO?e-xHgDbb)YRuC9lw>CBbK z1jbfbI~Y{zZuOPw@BKhSwif5~*%&}z42={52v&N#Uv0++Q_|Fal@xq^cgNhUVfW|s zRn}@g7*wqm5Ir+ZxdCJyg`;giLnBJcv|Lws;eYhInaB{_V z)u_*zz8ic$Z72r9h-$o1P^qRbN^{O<^!EQ#ZK(eZ>aPF;0JmB0@x3j)kN^Mx07*qo IM6N<$f{v_&EdT%j literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/bee/bee-2.png b/assets/environment/Forest/sprites/enemies/bee/bee-2.png new file mode 100644 index 0000000000000000000000000000000000000000..dda741d4eab313dcc63e5b3796a1d88ae6a88f53 GIT binary patch literal 776 zcmV+j1NZ!iP)KD2gCNgaj2KorGG7TcJy#&0-r6 zJqJq$;hOJH{`9}cU3wQT65&4h$=%Dnci(;A_ujk2ux(p)8+ue1A|e%$ibzGIB2o<$ zmmb<(N9xke>%On;_4=Z+S+oBCnX0NROaG&B`a}m zkV+?vzN`+9gHIl(m7Rv$TY?;L>%(WYoL{3Gr;;((K{mcu>*^l;QVWwa4$IJA+Q;Vr z#?{qrX`k%KO7P9S@XYL2KYZp1ZR;M^y4uG%kWa-}oHeO3Dfg%hmEJXv-TM2Pk)D}C z$f458g9}6g*5GsR;0o1h=_e6GJ4#m<<(Hgq`w+(a<8dPJ$0|~&O_)%97RH^bHYNnrW#zrd_#%Y? zc!hrbvEZ2cn2qB%V(RHjt4RooFgS0rt(7{yW}i+-ZZU6iuhgAK&&eKM!{m}73CX~R z`sy-0ajU)#)gbq_vAfx3Zb+@#n#Gn$Lh_n_67-5(JT<#YpLnnA3x|}x9B>xM*2ab^ z7eKbJQa%}ji3Wwy&L131R)&_}wIm@}Eq4GvA#a=1X=L^6dA&Dz0;IyOt0M#U;n#v) zcsy_8IB5Tl5kj>?2xWBQPcyg7bv)?NFXV{S|3>OqfB^suTr~=$s9k&j00004K5<%=Be&C>k4jQ52AQZ$!2f?Abbm$^}pin6o6qJaAP((Ti1s5@P zu>?fppj0fx{7*RXyxW_;d)pTbm;>oc-n$>a`#&G|_65~ymDOlP$P-&M& zg)8|+-Pn0xnBG2pPPwb&!9PRI<^u!>+c*GQ2`&~25CR01d`%{| zK{NwPxvo}#T;#VY|b({a+neYssZ+B+CB z{h@7rkv21*7x{|kHn3*aTYO9-m37v>sknHOPMHmxmjS_c_tyu;a{-TY^Zeu^n*Fpy zQ{f_iyp+;FS``5?O;+v_LpB(vm;%tPb6ffQ`P-$2BF*eV*KfXl$sS%7?4^rmS)Dkb z6_o=JzjhzY^5;jq+ z-=8Rc{oA;!hgHfvd%_EmXQK`-bE;G5j6r4M^3QJ(P}t!1O{^e3+O5a;ALJ|gk|$8C zQW!*M6kG;{Y$XBlWX2MpskR_2!lzuMUA71@QI025!GA66;g}gvZ8wHF>fJG1YoCw0 zIH{wH2}Yii_!if6T#!o^-Kzz!jw@Z8W-Ckdx_^B{DcN2UJx^g}8pu{KrC0(8z{ofa zggp+*O07%uIE-wX{;&|ahm0E<>*K5fkZlX%a$wY}mYvZbOx~por&ss${2fXH)&>Ol#In!K7W_8L1k@3CKD>U3G6TQ39Eg2<_oDW< z+Y2i2eZe7W!A(a`pNObv#+4a|t|cK@&0807tDZ!=8qnq`)u*BdNxupL9AZl!d3}Hq z{|{M!bn*2CYMD~2aal{DI&WP%Q0)lyM}PqU7NDpG(1))f00000NkvXXu0mjfa7J?O literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/bee/bee-4.png b/assets/environment/Forest/sprites/enemies/bee/bee-4.png new file mode 100644 index 0000000000000000000000000000000000000000..6fcd29c0d77220b119a63657a2110d89c716ce43 GIT binary patch literal 789 zcmV+w1M2*VP)^$=X)#{BNL_S@2YO0&o-I`8g)9v=S6Ez%&)hc&}W)S%JdFjp!ch<$nLWrokXD@cuD$u#pW^=m_UP9^~FFvC} zXBYK%cZA-@VD+D0eZ_bYNkDg<@03a@8A$%|C^!ZPOP4NCtWq#KfTnMi#PRK!nwS|d zEGCZZ`#;8JMtm+`qEl;2T0pT-SnbX7NjhfP^uwuAeY;(pFJJT&*!u8|mN(o;DA~-V zM^C7BXDo0nZet`CPpHMI15j;uK#ZqrU#QY=2p{oaRVGKTi^0b{vpR7=v7W*gSuFr~ zVFf^Y&Yqykfr6gj_5;sgFrBiYtrQ;80P<4CK=RJRK{if~Ng~(c`+o}@Vj9M_E z92Anx58nU?@wWS@NGrT317Rm~*bkstJ{LY>GOt zI5sNFG<##*pliC{5T!Uo`E}7gczmF4K(UlU5KL!J*2wl`H#VoB2mviTd6sA)D4Z%3 zO-Ml8&M21i-{_M{^~F_)l#K%&E2jVi3y*f2-bA+xGrmb*ELw(cVP35Ojq-9v)D4+{ za(j39exLuc>RSB!n-5I2oU2DKS(AML>fF*^1%&AB%D5HjJm*T*t@^OY`#byXiHmzY zRY;krIT(~%n43P4a|(km^lukSD@VjHt0)yApfIqYBnBuTm!}_!yvX?0;?{@S=OnZT zLRJOEO|wnBI=s_fZyq%Y=4w@u1S*Arq}EjF>l#?QxOU!@*NY#%i@A9_)IuoJQFo!ARbPpidiI^(Q2o5ZxwM~BAd-_=9dg>RE3&| ztJcrJJX9-i-R6nGm-FX*>R=HlfVecdQ7LY=O|Z92Nc=9GsjMdxsNN_XL&2*l{Q($8zx?YnlA?n0!p0dIv`ic zKUFP(K*KigSbZw!IUxE5Gd>&3P9+Wv`&$6=k6S3x=u^6r!u{#H^8V%QsI&%PWbcr& z_r(QDWFI9zqHlOyf~iLueq4ci01mS(ai7vnT;|Qwi3hi?h)?gHd-p*FlFA`ZZ5606 z>ei}~YJ-iVQX(jxTe_S>zL9-^iwl&vCFm9+Aih5)0ZOb?n1V?xs~c4Fub?JWqeA@? ZU;qcTs6}-a^6LNq002ovPDHLkV1mqMeN6xW literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/bee/bee-6.png b/assets/environment/Forest/sprites/enemies/bee/bee-6.png new file mode 100644 index 0000000000000000000000000000000000000000..0251f031200f0ac9c2ce63de29ef17c5b0876821 GIT binary patch literal 745 zcmV}ghApUhk+am!{`9!Fyvx|P|-qCk$|mu(9z^)2zbbj zka+VM94gUJuA<~&h9UtUh!jv z@C5m$C^!xtI>%Vi5frVksKo~4lf&>9qAd7|1AJK*BFLdWjgu&^X3zn02slJd0y_+~N%Iq2bbvxF z+z=uHau6x42a?hhHiKUx7oJc)ObirCu!5GR2_0k!ERBHLS+Fz&qCr?m-xba#w^hnW z&QK66ZJ}ER5(lL>n4>`+Ag9qsR^5lqBAA1aLzLWBC?hoo&5(-_N}9!tqa%5vjv5J$ b0thew|8-Xzx9SsZ00000NkvXXu0mjfAQmgK literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/bee/bee-7.png b/assets/environment/Forest/sprites/enemies/bee/bee-7.png new file mode 100644 index 0000000000000000000000000000000000000000..7871322ab99f8164abebaaf8a5bf069b2455e6ca GIT binary patch literal 788 zcmV+v1MB>WP)$v>+A+q6g^@9qLerGN@A^M3*js2lLXwOJqS{1T6`M(IKb^4}s7n+PowS zQQM&q5~ltB?7O^qy>;FUGq#8M!E@g1?0fI?zP~?jR?qi+)oj+Hn$R++3@U@7m2Qmt zXzc%YC>^5mwiF8}>PB*|Up#nxK(0eKr@W-V8qMXoRCHaTjzdFUR2XdN-LnPja~oKs zK*z*e5mU}e0cdjWUc>LaSgv|uDw}F?K69*dOmTwYeVu{NUw>JX>(SnVZ%$6v*=+aX zV>MdMTgN&ng+U$dJ5^s--uj$im0#cMyQZ6UC@2M(rO)efKUY|@D%Ii&#Kj3&xHZqxwKdMm#51c*;fN>1a@FgPQ5wY?W^L5_4&%oqX1Ck;t8M&#a*hr zdPFUM_#v@`HgT>XZMe@1jXzrX+QoW549LlSTmb462lE1nc6afcfFX|9U|(x0LCv4l zl8i+&T^9S8!C)*5wQ%L4I%x0y9d!j6cd*mPPRJEw34_>j0SZ-$U^KYVbPa?5%C_I4 z60QH#lt70aDUr`UvwBlGF2>-$RoE^r>aom0rBgYObubmO2x}8!ueP;@#WfZbTy=Hy ztn_E+p9bPeuT4wUb@i&N&8k$Q?^D>B4rHt5ES3NQFfz_OR-i0vU7~NE$fhSBR|B6R z8_3nl$ug;T$U690000gL_s6#)axkkdeDIyhUW5TGg@6NzRYbbZ^gB15Tw!k$ibb6F)7 zoC?e~ksrtO)%KF_H}?)hpIQdG(WxKO3fm>*zGd9+E1&7j!h5>X)IvQS4a$BDmOJ?4 zE5;9@1A68BBO|3mAaU>@I0jIqD=LsyDct<+v!wU=`Ma!lWI$ECxOD6fhI;vxx<_qm zi^{%1K%q(jXe8B2+5KMn?_~U1O5MpTu>IpNEo}xr5P-x;PEJ#H?5PK%n;2T3Li#v$ z00Jc1%-U~C_gG#XabuX5Ly!HL3kU{bb;5u`mBJ5MEdb;rQ3Be1?J}iz>xFtdK4&E& zpbjRIQn*PGD4#M05@#M7>S^oe3GL3#2YOx9mBBV~VgN!pC?pm?iW)$OuN{qazc6!y zR*He~DXXHp1b_jCfy4k1>I^{1_Ag~G^0v;!Q4@%dtIK{d%igr*oOnR_>#dh8Z!3E`5<|>QVpTxdMl8^_^LSm&Sv`f{z`Q)EZHi=A=bk2V`969CNcD zyyM2FQG(+$MDENUmUj02eykiXS5YlN>r?VMrxelmaLNNiFbsq63$+a-6E!T;7aXh>O!2{!;Sv?)y_T3t6GykodF#Sy6$cSh4QP2{ zL|Sp?4{Q2%`2N6pfuNf81_&6NT(FNq3+$ z-74hE|Ih5qHi+X`tXkB>3WkUF&>q@DduR{sp*?hUp@SgEd>!m<#Q#~xtF%gYqV>3S z)R6CgSuef40Y+g1Sz1j6q{B3)tJRTF?%VeAQs*>mjO#QvBz~PEDdPg;+3+u z3Zkk^*IcSEW#E{B&lJ}S9`)g_kB?aGP1Yu0{g6T5zD)abp7+V7^zQ-S{3IqpL*cw3 zVb5s-rU{C2R_(z%SMPGNQpZUEyF3PVZf^indkJ8I&FZi5KX?eGv-jQLbFL}rh^BGx zrZ|k&s!_dRYXY{NjBvoR8#-c4+h|_n-sP!>+9rs3N>$e s+l1wM+j0tx&MOj&u(p1iBYp%J0REa@bKr4&c>n+a07*qoM6N<$f*~AIbpQYW literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/piranha-plant-attack/piranha-plant-attack-2.png b/assets/environment/Forest/sprites/enemies/piranha-plant-attack/piranha-plant-attack-2.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa9750f6ec23c7671eb83e0a2a3cba35120194e GIT binary patch literal 673 zcmV;S0$%-zP)P!PwHnu3c83L=QO z7wQoTqKF6Z3NGBZ@c^#e>&A@>uiycs2ttowz`ckdf}&jrMWg>G6UNuPen@6QlJ}rA zc_}5o%>3u84U;4Z>b4p|4VQ=Z&>q@DduR{sp*?iHp|{rO6W6}$THY(vti1uXw$lvm zt_J4(`t~*C`&hU}`;~HU0OFNpS=WALG);hH<;rTBTzis-A$1Q?5dkaC-0$-EY?KB&t|JbDvwXW=Vo9`()M;J9VpdoRE0`rLbR%0MELH?)AW7VXbm zETxceb8_{A!#NRcN1AR$7M^Aic%Bv)bMH}Z&Ckijp>3YJw%fCRzVGbxJvUb`G*1(- zOV9uDjKbWTM{9s}tedxCD1s9#T)Olr%VkjxjE96{0OO%R0wjY?%$q!NuJh!KpVUl@YL3ds%qO8r52s(!H~^&4U%M!fe-;Y%Rkg z{)s>jf)5tBruk$=0$Ocy!biVpV6)sC*9ly546Lqc6WD$N7*f~f$=gtKG0EVt6wqX4 za%XBRT%VPin5aS9H$M*89v)Pp;TQ$1wNwHbxi&OxFVxrstYKwwOHcEYjTW$)rCo!5 z-br=i5AjM&6`DGzZakctw12!4hlaJxkkFBbHA_#vz6BTnPU%%<4mBP@00000NkvXX Hu0mjfQDr!4 literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/piranha-plant-attack/piranha-plant-attack-3.png b/assets/environment/Forest/sprites/enemies/piranha-plant-attack/piranha-plant-attack-3.png new file mode 100644 index 0000000000000000000000000000000000000000..8dbd29e98a84ed5051e08d4f7202539d011e8e46 GIT binary patch literal 619 zcmV-x0+juUP))nfYduR+1zO^A@cD9iRhrfDX_BIzR{L06p)}2RqA|1w1@`v>FLbu*ajd%(LtG z%_zJRXaGyFh|c*a{T*M#DZB}A>(G;cr7!_*6}l)ePxUI(J@OT}KaA3gV(YLYHa)MQ zXNB#)tXB@+b^*pymel8hf!5#hrBTNsHB~OjBCzEh|qcY=ES4 zEiFq0o^OiK+X84KULufhPt(Mze97Qk zX;PPf)%xc5n7yl*zaw8%&I7J8BA39^q%+kv6yCdCt+!=KN)ljq_?H3w0(D*+=%UBT z$D?=u(_3vgxIbO$W>R~<_o;1g6wh~K|1ArEs6#9k7DIImK-F_;@X&cNSrlzzSyNSnw^NQKS^OtWMv@hE(5>@2zwdW1i-{NxsM+a=*uEcFm z2cIeD*al8yz{e*G@%iMuo4VGgzyV4Y4K^wrh=2h~WLwLBiQ=?@!l<&Xz+9yf7{FMC zW0i-2Qoh>?oKYG>dgo%4v~|wL@gXu%L_lA*&eBLWq({P=L1ippEbLx5pE}1Vfqtzl zWU`QcJY7uA0r+UV=3RH+m0tjngNoY%PgL?1)n$h)T5WU|rUEY|Y=KvvoS?!gg$(WL z@|&Cgrs1UopeC&{fQur4EqE+2eLwUAhp9prpvTz|#{3n9zib@Ob0qWwhbeHveh>?T zzxz4UQCV0EYsBpNaM;sc;Zt*O*6S*2@}PP7DpM4lrwcr@;J}aj4=}yj%A1YJ;Eh46 zfYa(CFulUE9h}HsT(rpGMxh7*+D%STrQ@`U*OQN@*3gaJImwHPqTy|P=cH_-VX|Sp?4{Q2%`2N6pfuNf81_&6NT(FNq3+$ z-74hE|Ih5qHi+X`tXkB>3WkUF&>q@DduR{sp*?hUp@SgEd>!m<#Q#~xtF%gYqV>3S z)R6CgSuef40Y+g1Sz1j6q{B3)tJRTF?%VeAQs*>mjO#QvBz~PEDdPg;+3+u z3Zkk^*IcSEW#E{B&lJ}S9`)g_kB?aGP1Yu0{g6T5zD)abp7+V7^zQ-S{3IqpL*cw3 zVb5s-rU{C2R_(z%SMPGNQpZUEyF3PVZf^indkJ8I&FZi5KX?eGv-jQLbFL}rh^BGx zrZ|k&s!_dRYXY{NjBvoR8#-c4+h|_n-sP!>+9rs3N>$e s+l1wM+j0tx&MOj&u(p1iBYp%J0REa@bKr4&c>n+a07*qoM6N<$f*~AIbpQYW literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/piranha-plant/piranha-plant-2.png b/assets/environment/Forest/sprites/enemies/piranha-plant/piranha-plant-2.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa9750f6ec23c7671eb83e0a2a3cba35120194e GIT binary patch literal 673 zcmV;S0$%-zP)P!PwHnu3c83L=QO z7wQoTqKF6Z3NGBZ@c^#e>&A@>uiycs2ttowz`ckdf}&jrMWg>G6UNuPen@6QlJ}rA zc_}5o%>3u84U;4Z>b4p|4VQ=Z&>q@DduR{sp*?iHp|{rO6W6}$THY(vti1uXw$lvm zt_J4(`t~*C`&hU}`;~HU0OFNpS=WALG);hH<;rTBTzis-A$1Q?5dkaC-0$-EY?KB&t|JbDvwXW=Vo9`()M;J9VpdoRE0`rLbR%0MELH?)AW7VXbm zETxceb8_{A!#NRcN1AR$7M^Aic%Bv)bMH}Z&Ckijp>3YJw%fCRzVGbxJvUb`G*1(- zOV9uDjKbWTM{9s}tedxCD1s9#T)Olr%VkjxjE96{0OO%R0wjY?%$q!NuJh!KpVUl@YL3ds%qO8r52s(!H~^&4U%M!fe-;Y%Rkg z{)s>jf)5tBruk$=0$Ocy!biVpV6)sC*9ly546Lqc6WD$N7*f~f$=gtKG0EVt6wqX4 za%XBRT%VPin5aS9H$M*89v)Pp;TQ$1wNwHbxi&OxFVxrstYKwwOHcEYjTW$)rCo!5 z-br=i5AjM&6`DGzZakctw12!4hlaJxkkFBbHA_#vz6BTnPU%%<4mBP@00000NkvXX Hu0mjfQDr!4 literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/piranha-plant/piranha-plant-3.png b/assets/environment/Forest/sprites/enemies/piranha-plant/piranha-plant-3.png new file mode 100644 index 0000000000000000000000000000000000000000..343776466556ea96711c1dd3661f7b82816ae09a GIT binary patch literal 616 zcmV-u0+;=XP)%g1rH!a5Ilkb_u@u`igqCsjeY}DUY^sYo0(*i_aLM* zvuJ*Kf989WFwgU#ZMG7$&;(kb1zMm5TA&45paoi>1zMo3S>*E1j`lZ}>SOO7-$R?v z5xVN90o*-_XXB^aX+XyZH(Tm{pT4Ozo8ZpE8xVlO1p_c0Q^VS_QBiwOC(paawQTRD z;B^`eHas4=1nzDA1o6d0%}odE>i#e;1{)1?Z^N4cn+)?10Q3T@>7w6pgBaHK{XH`HXlx?R%Wl6nN1b^1hqK zg<|Mcc;jJd_-aEKo5leC?!WqfhyZZvDGp5M0Sw)(wRa=7Eb7r@O!E0Jk8L&=m9&- z*;?weFq*?A;CbNQYwtzCyqGoOG_=f%I4QAxcuK!x=R8>QPoyTUD7e8LB%d3e0oaru3xtE5HC!qa5VT%r1}s0000c6pj5KPMHobt%1yoN!~zc zJ8dD~o0kJR@L$)>6G?T2pGngkP}wWV(nvBSuzak`>f(*T!|LK@pX%dM+1>Men#AHZ~=K=ZXmwAE{x zZkR_j8L$y^T*p$t8gYmKrS9hlT#7fA7W@A2t=@+SJUwL%=czeAH!J&q(CNtuK=|BT zM7V0#drM$GT%D=#znHS9C7lI~#o135rxvVM9hr>stop@oByeMz zlOk!YHDNh}mJ<~RqpgWY`8NG*Moj~bU~Eq~IH=ZxJ15Y%aWhvl-@K=knp+jwj{pMz XPXIe$_yaBxvw#tyBXoq0&=ER9N9YJ0p(AvFNJ4z+{?3YX%DK6FD@lKU zNqfoy;O)bT^Yi=mKzsv|Sy7k*?&6hsW3Pb8gD}PVcf7uq|+XskNS^IH)ZN ztX{}a;lG3wu&B~JtueJB_%#jcY4{sO6@PA;6AbjUP36XEZ35n>>LP`VS8JE25gIBu z4Fm=|U`AYCe0WRuB&4Dg7&Zys12Dq6EbuP|j+6dI;XSY!zWl8UP16|O(`&E*s10c> zrLZbA1?2vHEIJhY`YNMD6atPSP z*=GlV=Kp*V@IksPE`s{Nkq4|5DxSvFuAjeK2MGk$P+45*qMvYRXaTD!?P^77)$a5@ z#Rm=bBMXL!PR~rWoSI%%Z9`LIto=0y#?PdGuKf{U0BQ19y#m#lGXMYp07*qoM6N<$ Eg0_$}lmGw# literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/slug/slug-1.png b/assets/environment/Forest/sprites/enemies/slug/slug-1.png new file mode 100644 index 0000000000000000000000000000000000000000..311fcb4bc2c2f6e7ec3cb3993daf6ee9ec28fb32 GIT binary patch literal 503 zcmV^Tw4j`o4F6${pos%OmV+$3_Td|Y zj};eKY|F843`z`K4EL^~IFOO54uJW(Je(iQzjh2&9%eboX@FSEwPjf`EJL;w6e3yz zT-476upkEoHwdF!3IbOj|AzCC9ZGZvpr>N=LdPN-T8`HN zAj_ss)&#SCeuXkP7B`{r<%^rJ>VsK|91=7uh(JDu1wAOmgDeDLkRuQw!GOXh$pMya z5)AHV>==GudI{!(*dX7-0L-T#M<6FOSez5%2%HW8#ktY*{S2RW-2(H^Njfs9ESw2< z42X{{n2{~Q7x(ZI7gu!*D~dsB0cIHt@VTkM9R_kFxveN*rbO5p(lptZz0ZJFh0OTNS tA%Jcl(GIv1pH6f-z~&fS?E!!Q0|0hZ-^i^QuwwuK002ovPDHLkV1n7k%JTpK literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/slug/slug-2.png b/assets/environment/Forest/sprites/enemies/slug/slug-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4208abe58f37398084e6569422e15a43f71938 GIT binary patch literal 498 zcmVD?0E-fn}Qn1D~53ko6MGcRyptz^W&Xk;*{; zInjY=T#1h85CFxw(ewQbpLX2>^Up~-GN>$^$?*HqOE@1E)VO?#9_-i(B1S^BAt>%a zmLUUBsDK;>av(N~kmDTLL1Z}qmm`n?$RXGqK}=mhwL}QA5MS_9TpNOd9hLw==>V2C zVCexC62v4tszd=S9pD47G=eMmiFN?CiUi~!Y>p5vv4w{c2*466E=Mqu(k4WA#GUwb o3^m9Of|MZ);OvXb0RRC80HoOFF0y)~X8-^I07*qoM6N<$f{2vGdjJ3c literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/slug/slug-3.png b/assets/environment/Forest/sprites/enemies/slug/slug-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f21085f35251555a6a2aa91717ef587778577526 GIT binary patch literal 478 zcmV<40U`d0P)cy3sVF?Vz1~~#|DFeeda3WlN`6Eutu{r=`+0@CJV7AY%Pz*jH z0J9W1BxqI;fqV=LdQgf7SqQ=)M<7Ci0fmhY7_rrc0;P;fA<1a~*>ZeA4H6?{IaO*ySO_6oh#n%i zEGN4p1VsZZQU1R4lHm@68X|Na@275cEL>s>XM-$*0a!vrcNoku=xGU8C;$W)0Q>FI U)VoX-)Bpeg07*qoM6N<$f^EvTBLDyZ literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/enemies/slug/slug-4.png b/assets/environment/Forest/sprites/enemies/slug/slug-4.png new file mode 100644 index 0000000000000000000000000000000000000000..a205ce668f177dc634cc160b2289d3279ca9bbb3 GIT binary patch literal 470 zcmV;{0V)28P)g`-ZOcIxUiv)N5Fy|6bdwn0+>%h4na<6usBB!er!>}f*iyGu7Usg+|+=) zmtZmXGj>qfmkdtD0yyh!^i+=QTXaXD14eA^0Z{PYiBD(vwCfgw(ewQb4}0st;%|En zV>JY%20eI@9f9ls^t8l?t3d*C#5qYvI3E%+3}8oLa{$b@_<|c-LMGY)!~k@M;PW{_ z2axLsWQP#)JyAt5Ea=eztDZQR{(b2soDXB)VL;WRvT!C&^8o@30Og*`<>rWddjJ3c M07*qoM6N<$f_4DEH2?qr literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/carrot/carrot-1.png b/assets/environment/Forest/sprites/misc/carrot/carrot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8fa7b85c883ad5d772017421c99234d7197ba1a7 GIT binary patch literal 324 zcmV-K0lWT*P)sA32}fB^u& W%a8Bqq5Gi#0000|6H_V+Po~-c6`k^QaSW-rmGtNTe|u)L2TPP0rrjui%B*Z8Jv&M)hV6;S zr$aaIO_bs35?YgBX4V{0AX)JLXug4b3WMT-7GHt11C7yZ3Z&H9cny-cg(D;y7`7Yg zAHKeMzT}5i&amkXB8#&Rq%!z9PhdPFs?yGR#`|Z^8Xkq7cdnCS7iFq(n0M$nJFqnz zI1<0#)12j*sKAc8SGLz87OyW)&{I5Z9a7ABqAa3f!c(D$S1#9mf;PGH3p+IkhA(W9 sTl(V@AM*);nj3+$|Jy5?GBC0+NUon+XX<(P8qik^p00i_>zopr03*_D-~a#s literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/carrot/carrot-3.png b/assets/environment/Forest/sprites/misc/carrot/carrot-3.png new file mode 100644 index 0000000000000000000000000000000000000000..7aec983b8e791b3ed293fd880fff899860578a7e GIT binary patch literal 319 zcmV-F0l@x=P)X0f36SRE>KBZ} zxP%4SRv4Inh_rx(dj}SfFgCX_FT>ZfpBab_6KpXAGlZB}!Y~9miu2i6!SuvmzwsKz zg3EM}0h(rlVD=0kzJBUG&M0R>7r>?nWB|-yWS8PJ1O`A}0BMF9fXmA`4S~4^78dB< zB-$m&Ey(7F-786!OB^-jN&(iW00~Ha3Hpa2as_#cwblWB?(+giR1+0LW%^Ff08a0a3YhS@VuptE4dlZ^v?@avl8^r(^pX`9eX8_TLz`|#Ux&)RwVJ?8t yxKb@uQY^u|gYG)40AvV0?5NHEpO6}W00RKX!IbZE2s(EF0000X1^@s6S>%lC0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzV@X6oRCwBA{Qv(y!(akT41)}eI%w2E zqYfHz4q_psfRT|AL(EZ|AEh+ifAu3HscLW)$SkD#0Ax{lI6s(u?;65JxElL1 zoZW)3NL!YbA;5qKOoRB?)PNiU!o&cgLI{=~K+yn-0$d@3t_J29bN~t^ibDwGb7TOr z3=}dj3=18)W&5z$Cn%vaWwJPfx;it%u?IiF7+npn(4m@xV7Ugy23fx4*f$1ySuS`Q zK~_Vv5JE3ckhAjZ&(tp%2_|YM9fAL#G_v8s7mV}-%1I#5xe_yxgY>`vEJ|Sj6q@_4 zd|)KIU_>_%xeN-`X1^@s6S>%lC0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz4M{{nRCwBA{Qv(y!(akT41)}eI%w2E zlmZrN8RVoR0MD-bu6$r5Bu-NYfh=9MScc*3md_ZDz$K2$ag3CfLm*4EWm&;&Rbh6b z^lZ5Bg#nktC~^?UF=7I&M60(_V23*hr0>;--x!XfN|eD2CJfk7^uQbi@)*ofR7=#j zLJFT_ksU?#Tt;jt-G2LXv|uDDbkIX~_=OPhIgB_!upB}zU1nO_h=#ClCatN05s0{!D3;+j8nak9uajO6T002ov JPDHLkV1h-AlOq5C literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/enemy-death/enemy-death-1.png b/assets/environment/Forest/sprites/misc/enemy-death/enemy-death-1.png new file mode 100644 index 0000000000000000000000000000000000000000..730013fe05da639b45a8d997ed92b814ab8c1970 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^@<1%h!3HFQ(zY7`DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MMa)2jv*Dd-b^{jb-;kbdG^Eq|BK3QEllmvVAbs29`rHu zNW+sCUD+mW58M8;%XtYkygVyjd|=X&nuPu-6`&(BTjej~DW0_W+RyOviPwYJt~ zwM~C8^Y+;%^A&en`MND#abjh~Z@DSr z1<%~X^wgl##FWaylc_d9MX8=Hjv*Dd-b@SRI-tPgJp1DBc+21S1ag)-hh6sPwe!pt zP{|FC-L{cM{Ey5IcNd0x-ir$=I+T7sJbBt^L%V)X`o?$i%*PLXd$E$!?)=OrJ2O(P sSH*sEwT`?X)oeGRiTj>h9k&6)?K^^&LYAHHffh1&y85}Sb4q9e0Fr-3ivR!s literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/enemy-death/enemy-death-3.png b/assets/environment/Forest/sprites/misc/enemy-death/enemy-death-3.png new file mode 100644 index 0000000000000000000000000000000000000000..c34f2641891c0d753bda53c88b01c025a1737fcb GIT binary patch literal 433 zcmV;i0Z#sjP)8EfIg`d(9RC-z$kWiu1I>E|_m9b`LXE%aik{2)U+4;Vi`M#G?TI=LpkxAYd zzYCtVA1I}wla0G2T_~oP`@?R3`R$ChcL}k^lr6Xza14sW5WplbUe=d*K4@s1#KdfI zOqT1Ds#S6%Fh$Vrg0pe}zXc1R|A>j*ZTram8 zkbujcdB%5utDsrWlkf0ZE*=Co>6P!)D@h^=pEZ1B-)@s573jMqwgSTYAC&d;8ae bp9L5I@7UO)SWPzX00000NkvXXu0mjf01 literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/enemy-death/enemy-death-4.png b/assets/environment/Forest/sprites/misc/enemy-death/enemy-death-4.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4711ba9c0d83903db28e85b5443348f3f1bd6b GIT binary patch literal 547 zcmV+;0^I$HP)E<0utQu^dXqC<39kI2^Of?E>m0Pf~r zBM&gMW*-P-p4>_P*v7@ia7V3=i5gbGqR_Z#`X+zBnRP}}Kp5D-8ywHY_2bJ=h%!&H zVIT5+ar^Y2g2jDZ8w?5);3&8N=uKk5Z~(D2+UC#Sfty*@2GEvMVP&NOg=rOMre*PN z8r$5OYx%2lj)uWU$a{`cXPJQ^xo&0^b14L2+oy9`%2-y*IagwrLK>{eh&)Jx2efTY zs%G*o-OS3XR*LHe*H!>|pLQB=p$ib*(KG3(fR8Ln#g zNE&0T&oZ-4S?g<*XQLFm1|Z?If_qE?^aPR2Ic}x~fH2tSU8`Tu^C3DFcg9Wz`h7o{ l4)@l2e{0opz6$#lU;r{8P8*25;o|@R002ovPDHLkV1oNq^I!k~ literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/enemy-death/enemy-death-5.png b/assets/environment/Forest/sprites/misc/enemy-death/enemy-death-5.png new file mode 100644 index 0000000000000000000000000000000000000000..96c26b147a32e36ffc72e019ac81893c526a2bc0 GIT binary patch literal 542 zcmV+(0^$9MP)(rvQw*yFL2tDB~& zO55ARV#Ddh?R#yVt4o4E-yFBj_74ww_pAVBrL(qxf4;uWvtcTAIpq*vChZznqF+9K z)?Vt_URS@>-PKvQzkgX*tB=1rl%^d4&QEtuA!+(U>JaKDzdc!tAuHY^7_06b?LwD; zFntUhyPh)5gap@uON~=mY8`kqz<#Z>GfN=afh9ncB=xM$*3v;p^`Qki#$tXuaJ0eY zd~c&ImIDrXkRT%#m;{X0LQBO&*n;CCQ(_&`bRz%+Y4tbIetNT=AJk>QUMtsA2Djj*7^s%u!A`7XE^u8p*#lsVs8W{vhKs$8hVB)i zogG?}FbB}}4HpZ*^WOFbmHin7AhhD7>``;idb&Pp&QEq4+2c3wbC&y0!&pj-W^OIb g#MUz3hW!gL04SjJr8-}XSpWb407*qoM6N<$f(LQzK>z>% literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/enemy-death/enemy-death-6.png b/assets/environment/Forest/sprites/misc/enemy-death/enemy-death-6.png new file mode 100644 index 0000000000000000000000000000000000000000..4f0308d380d6ddfbfab92a7ada8a031383496c48 GIT binary patch literal 410 zcmV;L0cHM)P)~I5M0tqew z3k=)@fy6~XLU0lom^cLk8*l?|5ahvCh@8YpO{H3jlsc)O{rqVQV@x5nj_aYJbd(-e zSqRB#GcvtFzqsrd#ytZ)oV$7!I2fdi))h?w;eNTjDvT&5tHVQ4(Se=~j`DuKg3mq& zI4puKxT|BJTwt#J*y2|0Kb8U@%qh|lqm6qvCS_`sOQxWVMTkAjbs(iJwcR2%jR@ej zS%_+1TT=F`R-+7}Q>iqk)PjPl%Mo`N)yg?Fom}dCcVh1b!SUr3BNA0#(GI{VeQP_K z-S5=oIq&8M7B%Un|-Daj~TccwD5cN0pYUR7?~LxpTMQ?MfI14yDV&|E+y1Ly&u-{1)D)eL_b zIEkzP7s3*vaF9FYJ|u+T4DtYSP(eZz;ywrfvXR4;aEM}p$vKK>46?HnT8Lh`{t+$< zWD^;pOn5>RjR6b{w3I}Q2qu`h_Z`HEa5gaj5%s{d*t`T03-IU$hA2cFGoKM7f|jqr zTvnhfflf@v$ZdFXFe9WKg(QCn15U!T1zH-#6eLCjA_zAY*%l(w=x>liF-@ce!0L43 kHL{=;DD-hI82})_0I0y_^B#ZRl>h($07*qoM6N<$f&pZb;Q#;t literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/hud/hud-2.png b/assets/environment/Forest/sprites/misc/hud/hud-2.png new file mode 100644 index 0000000000000000000000000000000000000000..360ae911b664154f2753d0cac9e15755d887c873 GIT binary patch literal 417 zcmV;S0bc%zP)Q0D1uEH#mZOHN#&9P9iJ7g|LJu9OO>94+$YSgFJv7RFDvbxDNt=Y~*ky9HN+D za*iSzgX}DY7NS?Ke}u~d*+hmY6P^%7V*mpKEhP~nf(d5seFt$OoJ|ZsL_IJqHZMWM z0zA5bAqo-4%xA=ipyg{YmlfzrpcB(EavPo;%m^t*A;}-YfRpfSftE&_bOf)TdcT~D z0WFVX=6W=Z$i^buLPQ$<4RR=^iL?M%old+)7PJC|KF%cr00bBSo2d8jc00000 LNkvXXu0mjf_n4hg literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/hud/hud-3.png b/assets/environment/Forest/sprites/misc/hud/hud-3.png new file mode 100644 index 0000000000000000000000000000000000000000..091149d71b037452083e4a6567d7100e79e7f8ee GIT binary patch literal 458 zcmV;*0X6=KP)mXr_yjJ6KQe(DnH9x2xH*`C+74a%1kn#<07-j2 zK4b=5PvkcSPbpE8|GW|peq3S2E&_2S$YY=WF)}fK`^5l3Uw?qO-0Tb){xU#W6AivI zH$MSA4_AN-0X4GV@pF07*qoM6N<$g0i5s AdjJ3c literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/hud/hud-4.png b/assets/environment/Forest/sprites/misc/hud/hud-4.png new file mode 100644 index 0000000000000000000000000000000000000000..b7445b26bcf4c72aa390bac5bc8d2478166e11ca GIT binary patch literal 425 zcmV;a0apHrP)-QYxerOZa0Yn*IjA5Z3UMU_K-@~u z5THgTTym3h6ww%DXDK*>aIakd2$u!2krm)VK){42M9~<)z#v#G5Tj=1-ggiu!r8JpB9H`@R&WKl5Ckwn%28km2XP#b0Vg3P zAF`t%ph-vY`YDuLLW~H+G`O+Iwh)mGII00000NkvXXu0mjf&Gx00 literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/star/star-1.png b/assets/environment/Forest/sprites/misc/star/star-1.png new file mode 100644 index 0000000000000000000000000000000000000000..cc85a3a4a2b9622633b6ded62e12df38ee65fece GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@wC9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$ZGeiFd%8G=RNP8RIKU{g_2+-%2}}-Baq}<#^WWk&qs`u)@2~wO z_1;irVP?q&*1LaKi=AGek>U3&amC!z4Abw|e^pji_F(o|xZqle2=Dv#sf#}3%l%+5 zdBDxAd`4|T=PN!YjaiAa9J(ACmN4cB7cn%L9AY@ZFe532SA&sJh{5xKi2^f_J?p|; z39;WSsscZSJ4p~*s;_Ms-3}u%RMBRiJtpYlk!PC{xWt~$( F697`OS+f8D literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/star/star-2.png b/assets/environment/Forest/sprites/misc/star/star-2.png new file mode 100644 index 0000000000000000000000000000000000000000..503a9973ff97a05d9880fed5388590695ab77fb7 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@wC9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$ZGegvc)B=-RNPAX^Z&m+vsJ+*K?d%3yFWEfWaLgbv~;26O!jlf zR&z!+?`mf7>-Bjd)xp@KV6T|naFdD2oWF+Q^48-01`59?UJRW5-+ot;fWVbm=L(Xd zRJwQ-&MNd4_!{&oI9yPRn4rwggTe~DWM4fT^F;E`x?%pYAKzw+3gZUkH4}>QGdwf^FyUD^O)q5t;PEV@`X>7%wUU=GBi0TvZz{4 dl7U5n;YVqdwB6d)=|E>Oc)I$ztaD0e0ss}wQWpRK literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/star/star-4.png b/assets/environment/Forest/sprites/misc/star/star-4.png new file mode 100644 index 0000000000000000000000000000000000000000..2e576273e639f00f2d7d86fb9b1b77f730e30a2b GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@wC9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$ZGejWJzX3_DsCnH`2XLY+3d}Vv;XC%%lPrS|620@@ud?-9M~50 zsj160{{Qi#B6ro?->nNRXSTPUTkIixB2z(KXldsCsr)@Zeth{V%xsy-uW*1taC;5& U(P?U5fkrcUy85}Sb4q9e0DE3Ry8r+H literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/misc/star/star-5.png b/assets/environment/Forest/sprites/misc/star/star-5.png new file mode 100644 index 0000000000000000000000000000000000000000..7b61a386dd9ab9460a4e7f3ccb7f1dfef14c936d GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@wC9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$ZGegVr&G}`7*P`wv_`iNGa@rlDp^9>$wJFc1KP`9J<0dt{a-#har$39=?6Eknj m>A0*m<9XsgXEp{#Hio4?c^BJ?0-kt>w2bM`l?%6+$bJ^jf`346}7yf2_ zW-}uxg;(JKQ*uL-Sgi7{q=*m6EG(OpQtTCvi?^xGPzq0uKeVv@tXWAk=P}_ko(jD$ m{-wD1SKqiKvrEFEfssMlBAjWb4+AsMeGHzielF{r5}E+$rB#Ih literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-climb/player-climb-1.png b/assets/environment/Forest/sprites/player/player-climb/player-climb-1.png new file mode 100644 index 0000000000000000000000000000000000000000..179b0bbd4d51495e8aaa4aca83e0679b5533e77c GIT binary patch literal 582 zcmV-M0=fN(P)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz=t)FDRCwBA{Qv(y!(anU41*A`;F4fu zWW=e-LrMlEcy~N|!bpr9I=~f6ETsAZX6b@;)8S$XL7D$SmV@Mw#gXM`9(~yhEBfH+WX}5k*+90bmm5mR!5l*woziiDf#s$fmmPrV28HO&NZs?Fd09jC)^+D*t&=;h8tUrsn1 z}0{&9ZMz?SI94uYi{H6(dh)ZqgNH5}A0r$E^rgpmQEXoES3**B7Q zxepXte~Cy#$RUXAAX0K9NhLbS5}2jvG`1-HyLmZEi4Vi*nTMp@hg|ud$V?6q{0(hNen9xv9;T=HIoOt-U zX1wGeIRuDJ=uD(W2f2WhwmJ*3(T1L2XW%I1DecKn+?%0>1E`XwsOcbFb^`<$0R5Ij U98LYnp8x;=07*qoM6N<$f?#I=KmY&$ literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-climb/player-climb-2.png b/assets/environment/Forest/sprites/player/player-climb/player-climb-2.png new file mode 100644 index 0000000000000000000000000000000000000000..11d2ff9fda493643c5f5e4926ef83a15592f6f29 GIT binary patch literal 581 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 Ef@4dti~s-t literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-fall/player-fall-1.png b/assets/environment/Forest/sprites/player/player-fall/player-fall-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8db36babcdb2d9401b9c6cd1b05575439cdcb6c4 GIT binary patch literal 655 zcmV;A0&x9_P)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!F-b&0RCwCNmoZDjKorN5SP)#qO>uGc z11R0x6a+<`>?9oo3*z7x@EbTtp+bk^j&8-pvCzpy>>x-71qX@!Uw!Gzd6(Q> z68hli^)Ai*@_#Syz4~DodMfjMKlXiVX<1zO@b>DCT0fOm2X~Z|<(e{Am9q z1OV1fj}ImnHQS*rn9c$lAQnS6oKjBrsh6?=~T;GEvJ}DQjFq?hRgkZ)8t9%p|bHBhFV=;i0${DK4NS5PSzOA{wqVyN@a-)8QMm* zAg#PmS-IMsQyygFeqD)jiYb-b;2!QG1pe9mmp5O%6a#bq5H_VLaLMF2j0Ox4xR!Mi zV$Pw{3c9gU987fp0VTy123H#QOKWiw-#*^9AO*-Vl>`JEw$7sm!W+n&LFXp#PpNR6 zsViPj%0cB(sv17Ni~%=RCh&(BvD6@v>ZlZ%Hi1T60tV_EW$YxQOyB?PM?iH8Ag3}D zYk>_+2bAPKYbaiLbsYlV(0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!5J^NqRCwCtn7>NIKoG{0TtKi9JO33{ z!aaauXQv`~pq1K)h2Vi$_yWFz2q#z^R(1*=$YE!9>H`Q@T_JKdiiLuOM81^?leo$4 zY!W$eU`cK-%l`J;*_lb)AP5|(EsjlugPKo|ZoH58+n8@V@buz11SEjn?bQglEtr=@ zrL?{*=4DZd8&~P*N3;qyUGC1H!M`?Dy1jQ=AXIG?kD};5SLi zpdS#_u)Whu^Qs|U>C%%)o-~S6Ixqs_5R?-U$LJo5Bs?N0p}T==1;nBq2-7oW83(u?U-& z3eR@sh&??1^i?^W1V?>^`;@M>;>8|f5eKxXrL4+fOh8~9$n-6`u-Epa?+3gP>;+uN zw}hl^0caK=W$>xI+rsF0&}}tT!@YF8Yx5~cav*F@-?sn*08nbQT=R_`Q~&?~07*qo IM6N<$f)8>bTL1t6 literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-fall/player-fall-3.png b/assets/environment/Forest/sprites/player/player-fall/player-fall-3.png new file mode 100644 index 0000000000000000000000000000000000000000..ac9488164981d5cec83b72349e64217d10835662 GIT binary patch literal 602 zcmV-g0;T0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz{7FPXRCwBA{Qv(y10}#iN`{~TJDxpZ zB*jb?N*%Ot{R|Yb)7y4oRY!`$m>32jpsJ(d12Zthrp#VPa`e$Oq{wj)MUFyGPoPlB zNe!adK{N{~N*qMCqp;<=0ZZs0$6za$Kv9<|@ss58i{f$$WC^;(Fn}!nck^-}pSvk>DLbTMSd5CW6@xJV8)CSpPdIfO`Y5V-(n z^x;ZF=#IK2?t#;AwU;|k_<5VY5fzPiqYvEy=;;RJAX6_llw1faDq!r7^NX-12YilW z!IzF;j(|B1M5Bx0a}cs;ET+$ASeQs$%YlWMg7HLVBHSS`hk-D&FX8k7QU}rlG6Uo= zn4?JwDVSnp$H5Fkj|yaf>=9%(wh$$huCOL_eANgn)IfmQH0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz|4BqaRCwBA{Qv(y1G&IMN`|239nYRH zl4>psr4CxSeg=y8>215<>?yO?k!3a$0|fxxLDT{))G`P;geV0}3^W3us3Rvmk?kl@ zdP0u6_`nPl$57%RnuQc44x(xF(KVr?mrW-!6B#lk5d2JupKvwgh8PQ}4gy(92*A{U z)RW^dvZD_aLg?V{=H(cUBc{}+YMMfJ7`lV#lF+e5ou-)}9HRr67&)QEL~7#3YgKtq~I)3AdnbLoUWZwnB}lS)dE^{pgWSB zh8_z!=>wLwu$A)II;*5QjD?bfi!I@U3QFV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!R7pfZRCwCVSG`IDK@h%60z#T#WyHox z@Bx%`b}B*y?W`n)U_dN<5Q`9qU=e%)g$P0I?1Fg!!OBKVDoG<)oi~SbnM`&!Gn)t* z*l>G0v-92jCyb&fKnlY!aM8~4O2Yj3`Qc{tkfAt|4X#O-_d55o-^)y~wZVRq&)%U9comgum zvrJi~jU#oSbN5t>KS8HjNwX04xDYIy!(LhjrUC`DzPXsJLG!|R4)2l2ht$~zUvEuLFQb4XM-E9wnp}aKcGp0)+jEP)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!9Z5t%RCwC#S3OGuK@i=G2bN;xXCZd} zfT*3F2GK&hRALb@5Jar}84`pD7QxC+!H5JqyQn|FPAo){N>V6T$jNLn>vGw-o4HdF z$%Ex`vvYgzX5P+DydVfvQsl-b^~3e&Cojq-29QcJmc}N6W}~JD{HAP4Mn4QG^gc$QHV*ssphwIK+HTI9(|i>Jr*m z+tNo00`GxvyH)R9?EH<~g%}L6rZ5#qzy;fG`*Y#DQpO=9{Sb-Z*+R#yZ5E&2?xb;H z%G4#SQSIx;j?Y8ckOD1nn?FB}NLZw0B2}eA-uy1_?Dah7T9+c|NA*jTUP^^^mF-4I z?RPE*N2gz#pgVW>n$vb_EqITMn3EJZ;uiq{JkRWVE^L2n3h@J|NJVPOju_Qtx@uLN zFGM>^Td_i?&Mb(4oifRMoY>i2f?edO`s9MGCr;U67te6C;6<*Z#|F%Y1Nf}j2xQ(9AT@=d%ro=9Yt|F_u&;*3U?XW}_lHHb?RR1s5U&5yV0|4wa VnQ#0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!9!W$&RCwClm%T~@K@i9HLJF+P-TpE&_n)~S3_~?*R#G!)GYM5r+6;og>tT(hs?LSp>vQ6b)|9~y;)XBKTfeIZ z!SOvBwlgt;q{Cf3g~QG++7oNrTdinLdkiG0hUB5g9sl%5B2nWOVb~e@OdVOLo zmz?r7Ivn269vVaW0_g~42_N^81cIleVGl2XEnmxddkBZhL?=+&TbX#I|s!VWO(UlW8Sz&KwQNUHXhd8p(GF;2AGBBVFW~)#pk$B zN<^-$3t)KY{=$`PzF?&+xrDs=ynWPzJOg>a9Bbp(Obzbdi_0krnY>D?wL4N*G?-5- zBGSVC0&~TilD7`}9>#;iIZgdSq%(;tZaqKj9iauSDk$c7Y;z--4XEb+JLE`NaAk zU&z$H#A#OHU&yAA*=G`P)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz+et)0RCwBA{Qv(y!(ao9qmCMN)TpCK z1Rhc{aKm;yd%{SrIV{w4(8BdIQ1~#1!5mAhLs@9yAP~q&4Z@H^b|_s!3ItAX+lAM$ zAT}`$W1&_kp*v{G>~-MKLKml5^dTo`rD<%o$sl5-!(L75Ui;e3nf^BGQL zCgM~-<0S{f_NR{-X;vg4J4n+^5H5cG)O$D^SsW%e{RKNoMFbPMA%qM-4uN6*#6F5M z3|VOkJv2Z7*)g}oJs8wp?jYMyOw=qA5`r?p^wc@)F`|`bjshiGm}Te|f*iD9-E@@D zqG|NO(i0@wI8hQYwx|R-4pu&a*K)(V0QlI?m{ZhB&#`0tRqRSh{<*osi8)W!0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz%Sl8*RCwBA{Qv(y!(anU41*AiI%?EW zBf?QE)G)+DN(N`Svg6qkM!Gr*=9q=+XP}6m-nI)v4JnReB&YDi!Uo}K_NP!HUX1&rdUSWmQ(lu za>)&L482z#Ie$nW;z)K?ca;plBtvG$+bY zp!9^^8o=csZ1SdFZnO(2Sh_*4`Edb|V~ABtap6fQl&ArSs%AiC6pX$7>0?G@J~05K zhbFBAY!0M_gGi1(n1ev2G^}DC(B2HPgYW@lc~E6cGe?0O1gmgil`gjEfjJyj?N~sI r6jECWWHnttmg4Fx;1VYV00bBSQ-|j};lry`00000NkvXXu0mjfNI}`@ literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-idle/player-idle-4.png b/assets/environment/Forest/sprites/player/player-idle/player-idle-4.png new file mode 100644 index 0000000000000000000000000000000000000000..8701dd2d4b5ee7615acb199b43ac33e13855b253 GIT binary patch literal 488 zcmVP)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzib+I4RCwBA{Qv(y!(anU41*AiI%?EW zBf?QEx9!4EM~>qdNhv%*7G+BOL=m%?J|C~+ zrp#VPvcrgW6taUf%>?1%*H692>NrXqMsY$%cHn^JK5UL)_KiddnE}gvFuVu#=poNOlw`4S_-ne7t z400I+tKYEkDQTyZmC(_fB_NFMIJ$NmkQ4lLv}lAC85Yn`rAviON)9A9=TTHnp(kSW e%s>eM2rvL|irQ(I^tnf literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-idle/player-idle-5.png b/assets/environment/Forest/sprites/player/player-idle/player-idle-5.png new file mode 100644 index 0000000000000000000000000000000000000000..afd98bcb64446deebbe5c4ad9dbed4281fad915f GIT binary patch literal 534 zcmV+x0_pvUP)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzxJg7oRCwBA{Qv(y!(anU41*AiI%?EW z)CMe+8sH%%gOYuBJbS`8ppF7LXyN)97-ArYQQ}w@Y6m^Yk?4*+y=@oVu{3oQwopQL z7|by=k3QrmA=ct4v)9os`allKl=z7vb|Nzor~2tH*vU@#jKtJ^$PUsp6NHOjKlL8Y zMiz(3fgDDTqgcoZA#{h_68B)Z1*Fwp?x26+i5?m-2VrB=tegUc(j-4FAd3qnsz8>T zdbxqwrf7OjZ)0HiyLmZnLJHv^28=WWb5ML>23!uthRIk literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-idle/player-idle-6.png b/assets/environment/Forest/sprites/player/player-idle/player-idle-6.png new file mode 100644 index 0000000000000000000000000000000000000000..beb897ef2465cbefbd4fd36bf811b3f21fdf9cd1 GIT binary patch literal 551 zcmV+?0@(eDP)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz$w@>(RCwBA{Qv(y!(anU41*AiI*O)_ z@{p4G55lx^6bm^HTDX1&oW0}O6Gj*trUoWP7e^sG2n0ZEm}8K|ksV8ykirK}Z`%c? zb5esSau^Gx4j8n#4;CV(UT*Yv6v*=UzznQ%xWs7|eT1?q$y+vfqc*G8;LcSfzlJmv7l%L>4EFp^o_c?4?ToHe2{~Xa~g~d z5~q8S081mVDh1{kWHz!|Wc5^Y6ew}#L4zJ<0VNhuHBF&Ajh}BW(?Ivt> z9H@DM4A32etRJL@6o;`8YMLNtbC4LwF(3z^I|A8}Fg@fpZ}3JR%(tXewCEvBYA6v^ z_Yq3?#J07ln)@he^wFh}M{Foj+Wlf8)j^<^19Ed_z}x7A978P!GZHiEg00*_&Q-{5 pFXR%QoSaA1ejj>uLkR!~FaT_I3bhm!_L=|y002ovPDHLkV1n{W-^u_0 literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-idle/player-idle-7.png b/assets/environment/Forest/sprites/player/player-idle/player-idle-7.png new file mode 100644 index 0000000000000000000000000000000000000000..3801af65721aa9bcbb002f71e35c62cefe3e5714 GIT binary patch literal 546 zcmV+-0^R+IP)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz#7RU!RCwBA{Qv(y!(anU41*AiI%-He ziiI3a9#S&!+_B@?6UG5?6tW{gVBz{17;@Bf91AfHLUu%aUMaaf|8m8BSy-V%0PK1v}YMNp$qV9HeO`2p2ODBLKn?(bDYMtX3r|oP1XhmvRWryf z22jpJ2QbGX%Te7?=#IhXAZ!glSW!W$!cY1t7=3 zLY35zA}XPinkHcFFq)((N*qW@Bah^222?!YYRb^Pm4L5ZMQsNYT~6W4>c|d8u5QTf k-LOzA$dMgGDF6sC0Q(UTGII?2&j0`b07*qoM6N<$g2f8k6aWAK literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-idle/player-idle-8.png b/assets/environment/Forest/sprites/player/player-idle/player-idle-8.png new file mode 100644 index 0000000000000000000000000000000000000000..8da35d0edc6b7689a66a42d937eae252f6e4f758 GIT binary patch literal 537 zcmV+!0_OdRP)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzyGcYrRCwBA{Qv(y!(anU41*AiI%?EW z)CMf1DE5$&foIhn&z>;i5~G`=K$b6DKLf*o*u*Gx93!D}3Y+D~;Pkd#7-CaqucOFe zETn`E%mIHlFDGCuJ6JEd4kJ4HKn_B7jHa0&n7)4MJ%-v$iJx#!k>fDDxesJud|(EK zILtvXHZmVwo+cp$au_0qvBN_F8$fp~!=`VvE2lsXqgHmOYT*eAEo`B5OWcDY4;UiM zzL9V?h{l%I=u)EdC-yOzdbxqwAR3uH{RKM%O>-ZvQ2KcA0RwUwb|Nzo$es@ur%On| zavH9vv6w!eK4}UTO2|126g41+U0>12z;CaBQJ&>Z=m6(Zf zIsg?3AhqPCDVnxC$#obLvE>x8p)??EbZm_}a@0^IO(7?2e2E;^@`R})C$Te<(rrgh zAF#3rR4(BXqiOC#&xP0=gv_T~;fXE5Pe+R$kUXsZv!GRTn9>|b(;@*Iz?O({wdqL( b009O7x*Ypy!a|KD00000NkvXXu0mjfSk>Ac literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-idle/player-idle-9.png b/assets/environment/Forest/sprites/player/player-idle/player-idle-9.png new file mode 100644 index 0000000000000000000000000000000000000000..fc58268818d6d694f35a0583be84e41adf599bb4 GIT binary patch literal 582 zcmV-M0=fN(P)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz=t)FDRCwBA{Qv(y!(anU41*91N=LC! z!w?TC8F(7l@$3mBT^)sNIWkzdeg=vfN*%^Rii1FwpWe0$%s2IN1G8Z?vI8k~7!xTD zLI&6zG++rGcG#5J>rfm^mox>63iR}Z9F-sda#&7k5Pd@mGQ$#iOfW->ZiY8C%Kp)$x+A-(lir< zITKVwkm4}1avwei(XHtM3K>}2307(o<7i}kG|PSD0-82mNOd5&orj^{Lq;w{aTTQ0 zh<1{D$b=k&ERSA*QoZm5l~u@0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!3`s;mRCwBA{Qv(y!(anU41*AiI%?EW zBf?QExFi@E8L^7HOG=}ZAv>QxWkeT;iQxi-iXj$aT@SN#;rbaU;_-nQVDX&PAcWxT zb^i%D3?E>`WG2Gd7Srd$*?%`LN70ul z0gFl+Cv;>7A@k84gf9(Jl+XzQO*26-{c(N~R&jWUoq7)>rAbO-1VajB7%(w|5;R^1 zf}(Qz3w8$n#6B?2+w_gL_nGSll-{ge2}ByQK*y$aiF~divEuWA23{B-T*QPBg7~w zr$COu7WC+8DsMsu1H%MVHIoV|sGrbbg(fWM(Gx8)A3eIjiF`#P*<}{Natb-EphO$g zVa(#U7#OzQLU9O5@K4svw_DlT?Bd%{RjLPvHOzKRza zAh#Gyz1&b71WKcX5<1Z#1#%EJ2M`O83s$Ox6tZ90UptScsqlP;NucaWt*_$O#Q{+UjJt63{~fIoneV zK#2|;CKQD)PHYBaT=MwR9WFaznBv?=PV^A+G(dm>0RM_y*5tKos{jB107*qoM6N<$ Ef)aA`IRF3v literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-jump/player-jump-2.png b/assets/environment/Forest/sprites/player/player-jump/player-jump-2.png new file mode 100644 index 0000000000000000000000000000000000000000..3313f49d76010b52be17f865fb547bd3efbbc1d9 GIT binary patch literal 589 zcmV-T00000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz?@2^KRCwBA{Qv(y!(anU41*AiI%?EW zqmCLVz(T494=EX<3bq~3o-oqfQ833WTt5Rv{Peb6c-52RI7VVhbdUuw$DGJago|5D zpAUD~-_6Uh>Ye_Aon(iR6n)4J!p27inr4DvI`hH*y3B_9$=ie=^O2e1d#9I12gcd0XbsI>~-KwVCv-tXTw4dCQaUh4m zEc!UVh~eYG2Vjg|On}9p9ws(aNh%URhQb^Iau`MwP3T}?n1Cuasi1-^2N9jnL7@XO z9A*KG4dbJi^58_iqLJ(Zl#$prI;`4&r77g100cm}4!P?2yJ;E2^p_lD)q{+rb{vqa z99;Dt2!M(Oaw}*SVnYZyYVcVO0y(KcV2sNgLJq_mQpll#4hR*f$c{peT9{sZ4#Vjv zN*sjlIGCeA(G3b&ibD$7U}7Bu$_(f=0LX)cLWtz{6tN+L+@e4(3P@?bkd^z8iw0~V zLTuWhYSRT*S{v}*45*HS)pO)#0-OL8eWYS{N$LMDPHYBaT=F1Hj@cm0NbXP&CA}3w b03g5spemRBfZA>?00000NkvXXu0mjfFa7!i literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-jump/player-jump-3.png b/assets/environment/Forest/sprites/player/player-jump/player-jump-3.png new file mode 100644 index 0000000000000000000000000000000000000000..794b6655329c3ea6bdf8aac12a4935ca30458c42 GIT binary patch literal 589 zcmV-T00000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz?@2^KRCwBA{Qv(y!(anU41*AiI%?EW zqmCLVz(T494=EX<3bq~3o-oqIQ7{KBTt5Rt?)0`@Sk;o_I7VVibdV(=$DGJago{~B zpAUD?-_6T0^h|%jPL`vX$aN41!1&l41Ok~7KZ%ZRvZ4>&LAb;<%>+>uZ2Csu+y`<1 z3^V&if}@K+v5!7Q0w`U8EW{TgQ)aJ&XMj91LWiP|f`tq+xFzm^p^lOeV<9%7gAy$^ z0CJG2mm9-EAcm!}h3g@?^7^UwK$4yIAqBDsVi^ReajP+WJoo^km;j3biyLxsAPcz( z92w+I=wM)&fU0IvK?Q>C#|3s6v1Jw$F;NFH6gj6Mq6PxcOL!3f`ie&EMFg!v3OOp7 z#cwe%Y`cZxFmROvswo&5$qFqNVl4;x7&&x6X$QH!L$CW_4ua{WdfkVfP+_40atNq= zLI*jiK`7-HsVxUaQo2~MIuHcn12gcdg*go5C{inB7IGYf5mi_KEQCOMNXdC5w-Sf} z*a}&g!)Q`?!a@iZ3fLR~$^gjX#DpqEjsiIbmX>f;J1~dALKa&_ph}tor3d8T$JXE@ zq?hVx3T8O6!JyE9)pN)ITdpLzNen6yNX71w(*Iwa*bK(F0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz=Sf6CRCwBA{Qv(y!(anU41*AiI%?EW zqmCLVz(TG@4=EX(1>BBjPZ;UyD41gwuAc!HJH2feh8jv7#z;zu4zes$;wOrj#q{}L zNB!Nr97TNk3wE+Yjc7+^M>#MsoBaTZ(KsHaQSK6DUV&bW$bv zG5bb>ao(nHgQG~eCGNps>gC2TW%fF7;^$B713L~x!$OeexesI!ESf+Tn-Wk@PMRV* zq(BD4aul`@fE5uZG80jX3z`-Q;M^zv1CoHvg%A=-d5}=ES3pt!@!$i7>&qJ;q4ko3 zq|hQM`cNE$1o9?yFfdF&6`NF0fzU%@1|Tb;UqAT{9EBhny>y51L7{}p6Ev&)7(mg^ z$jET(>n#R`ZMX1NJET@UB&8|z5W!|S4E)`+3?6;3Vk154FWQdkUY!NJ{ABI0)Hte9=v^qmT`QIS5ya0h>6; zVIU7-i)ykR1u~4-L<(wO;R-RB;|Q60000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz^+`lQRCwC#ma$3$K@f)T!hw)R>=ZjY zA3*U56f6XN0ZAbk2q}C6Um%4D5mFqf>=G~_XlEDV1K8S#=_HL{At(Rc%{tl3-R*d{ zF@gg}cK7zOAG0(6j2i@jvuIXv7SR5o{xpSSSvlyvjUoc=wKa)jMh!A&ov2To_zqSuYRccPTO~e^;+t;?eS6qChtrU z6bIVeUQzF#MsI4&*XbR=Bv78@%D9KP5y*0_75+~Av-vB!?hOv4kAJPq5XAA}sak8^ zyiZ-LH7E*NIt(xzh%%9nt<^rn)5SqGo>fI2(1YBXPLYKHz0sV~E678)?>m!+XQY|k z>m%>zzq&!UxFKV?*p}`o9VDEO&J!R|_s_vK1kPSeMKSTMQxx#CYFh|X(8P+a*E_0d z+z2+U-j!Bnvbup;#=)de6;nyjbtemm41E;7lLop-JSlce`Xg%WtVsgg50xhGWO)h6 zfCu}f&0V2>Dr+yU3j#_R`jbExT^|QZYh$>80!CV5#QhX6B}pA~!~tDu>jF=3Z|Jc% hHz>)0MZvxV7ytrMU_$(ZqRapQ002ovPDHLkV1hAV3UmMf literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-skip/player-skip-2.png b/assets/environment/Forest/sprites/player/player-skip/player-skip-2.png new file mode 100644 index 0000000000000000000000000000000000000000..24916b55b7b808f7ca9c1026a0aa385869271c58 GIT binary patch literal 589 zcmV-T00000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz?@2^KRCwBA{Qv(y!(anU41*AiI*M4p zLTv**q-5ZUbjPzNj05T@m}3^MpMlkZ$bgVzS!m%HWRQ~@#9->>24BcUC;=yEr91}Y68%JGB9J|w;p4#v3=F`W4buzDg;b9|WC!6& zFQ9UZF0BMy4giavYQ%5|yf9^C1gpW8TPZF)k;^FLD8N>gAeZduX^YqblxRm`YYBit z1XkB!tB7IsA}BXfwL}Lw2wV2Xdnvt b00bBSltv}Tve9NT00000NkvXXu0mjfF8=i9 literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-skip/player-skip-3.png b/assets/environment/Forest/sprites/player/player-skip/player-skip-3.png new file mode 100644 index 0000000000000000000000000000000000000000..96dcf9960f66c391a59b25ca9c087b36cb012d57 GIT binary patch literal 559 zcmV+~0?_@5P)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz(Md!>RCwBA{Qv(y!(anU41*A`P}@Kc zDH(Xs?|Alv5uHzWM}Zu$aQzGveokr-3ZEE?qIJBV0^ zP?XR?4$74H31(YNpAUA>-_6T$s-OOXon(iRNq$@mAdD+CkR621rn;kG4k83#jzG?Rd7Hk$qYl0L zp<3=kPB$PnD72761mqxCZiKNQ5I0oixTxknmdZTHHj_e?Cf>z37 zKrXXDp|f!Pe1?w)A22Wgb2hT47#P?ocNDDY0dfeaOtOHAgDi$cAvyr5!^NMDl;$W7 zDO?tT>$$JDAk__n0!IDE>=#AbMjmoA1ig|411!}HA-xop=*V>)dOb%9AhuK|xtbxx z5y(XZ)vFm&9YjizL3VEj*3>1%GW5(r(=HY<4uci4)kQjwOsbidX;;U;uc66l`OmN0J%=P)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz;Ymb6RCwBA{Qv(y1G&IMN(QcZ$FnDl z$YL-)Ie>){2Q6Gb1H*wisX=f)xeg=SQRo2Vz|-4yF_?O}f%!QUIE*Te0yzd7n_R%e zFbKi$chr>G>rmL_CUmkL1+p+cFoPfN4j)Nf_#iGNRtA#p|C?TU;if!P7ZjKsJJ!F6Y0|0qtAaH1p3!wl2 N002ovPDHLkV1gtB@!9|Y literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-skip/player-skip-5.png b/assets/environment/Forest/sprites/player/player-skip/player-skip-5.png new file mode 100644 index 0000000000000000000000000000000000000000..36f527656cd0b33f4959325e492a2bb1caaf2b44 GIT binary patch literal 579 zcmV-J0=)f+P)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz(!cqr_2+q@*ci2c6!w3rtU$y^aAS2IIrT zC~+9YX(}f*2*p7#G2|$vsiQ!?j}OcMvrWC+22buob{H}MMcIHB2{4C&LJK*>sO2!S z(-f`{qeeofsGLFunG!$omSt3T6uKkO9q@Paaujx^1Or9o7Qu1~WGK2LKtR(>5YE1S z>OEF*nB4Ri>?DO43n2$h^5X)sxKJ#{nR_pwkK{~!m! z3QP;MN|~0S{zU%q>wEHIS^aOkqQ6;3;0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzv`IukRCwBA{Qv(y!(anU41*AiI%?EW z)CMfnG|WRv2A-97JbS`8;En=0XyN)9D14a1V2&l$p)9m;5V~AWY7mA)=@xw;aC+M= z34{w4IyLza|nN8 zADI3)zli=NI(ldzI|!XUVATxF5%GZ;aIw5i-%z5J>W%_M-6TIQj5Gvt46=h@IT4vn z6Gx#tXwX;4-~_Fdhf-dFiid^k=QDgf_<(@{n6ov_g%~nPj7FlO4-{P>jH?(x2B2~a zQQ(l*P#~(D!c`nF`$odqu=)*Fy8qq0oa_RW=)x1ZYC*1IkaHZYdO@yk$Z1;&SK#uJQ|3Xu_gyK)YBdB{($H&_j%_A%z^B=(&=TkOBxW06ekx UV97#cKL7v#07*qoM6N<$g1j2q<^TWy literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-skip/player-skip-7.png b/assets/environment/Forest/sprites/player/player-skip/player-skip-7.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7dfedbb0ee2a2824c5449699d37904399b2b7d GIT binary patch literal 494 zcmV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzkV!;ARCwBA{Qv(y!(anU41*AiI%?EW zqmCMN)L?fM3pEY%kdi^E9(Fu?!Z=`#f;nd4`WZMKNs0p*DXsfJ7Na``9h}~_i($&_ zbwoRii4w;U;~*HwNe#k?UaCeP$nZ>wpBUmNG80kw%)XIuHYp)Ra`eF*q-iDy7rTDy zJzhQ2U$B#url^w8VGiU^>;uyu=NA#}V2aZeworlrn1j&S16Fv#91$Ow0T;{L^o^`g zBFRypP@3e&1r8;cWgy2OI|!B&k=cW?njtlj6P^2Dp@g1z!D&k=4-#tj3h-jVV)}fB zj|U$xTwmS*w1JUihmjOg=xGF7ngKZoJ!gV42eAbwN#zuBfeEu1RDHmJsh1m^4N6n! zg)1qcMN;93T&*DIH1z5ORC|EZ^pOk5s*useKxqe*Zm@ZTE{;NX9C9v0b{M%1qDm_Pxm=n~X2Paw kHG`heLB#5N0GJfl#o*iPXaE2J07*qoM6N<$f_QPqq5uE@ literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/sprites/player/player-skip/player-skip-8.png b/assets/environment/Forest/sprites/player/player-skip/player-skip-8.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d9832798813c021842586154fb177600dccb76 GIT binary patch literal 479 zcmV<50U-W~P)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzfk{L`RCwBA{Qv(y!(anU41*AiI%?EW zqmCMN)L?fM3niL8q+|$I2RoiUVWf+rV2)Y1eg;Da2 zQlRuS$&U-nzJBT_1F0S%wMby1Bt3ncU&Qe7-~%v*g%T(&f!H8124Ham3fYZDqW@`< z`#@2KkB_yyVq_#MeG*-G!ioe?NP!##O4zu{B~XI@yLma;QAkpWj;(qDC2C{5yvV5ei9~By?f{xoL`p zTuZPy5Y~zywOXNSg^aB!11lDgiv+qghtU%{sEB|S1(X6ta)yG4DMZOlPapsgU;s0L V!>>bP^XC8n002ovPDHLkV1lX8x=H{5 literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/spritesheets/.DS_Store b/assets/environment/Forest/spritesheets/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..74a448ad5bcb77679ad3eecc837b86a9f13a896f GIT binary patch literal 6148 zcmeHKI|@QE5ZqM}!N$@uSMUZw^aNf&L9r1PLBZ}-p39>-`)TxPr;W_QW|GZLLZ*28 zRz!4qUQa|uA~Jv*%FTwh*}i$pIvG(Q9A|9gbXlDCyTg9l%6=a(ZeNbFla*Xw__jx* z0#twsPys4H1-`35*4M%CyT|f0DnJGPKmq$c6u4ncYy$n$fx%khaYwK}VYYTh{x12lN40ESo@Nx|Fa*TzQj$ WYhn}Vbi|zwY7<4MZn+T=^ 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 FV1ob1G*JKm literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/spritesheets/misc/chest.png b/assets/environment/Forest/spritesheets/misc/chest.png new file mode 100644 index 0000000000000000000000000000000000000000..43704d4da1666c6fed9718f5305a0012497a0b51 GIT binary patch literal 674 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 AX8-^I literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/spritesheets/misc/hud.png b/assets/environment/Forest/spritesheets/misc/hud.png new file mode 100644 index 0000000000000000000000000000000000000000..5c41792e94d502d7beaf795a2c5b7872ee4483f9 GIT binary patch literal 656 zcmV;B0&o3^P)1RCwC#SUXDtK@h%N?(i@qYLTEp zi&!ZUZS2L;%3843LVtpd{sb+w7p(mOHkM+eM1qY920;TpB8K4MW0HxJ&Fm9u_p@Dy^k=MM*aIZt?6A2q$c*u%ehH3g#*e z0*4TbJHW4jm;n{#02D*|EU1h*IC;ht39CpeQ9O<$wB1xu zTAZ|gV(OGV0Ei4(LW-c_wW0xj4JC%}D7ioI_i>Cp84IDLvMv6jJ zEZw3|i=|NZ=NwC+XczC9iiNw^jn5{9t_im-;0E`KLOmTdg=z}b6e^=oSTT40qDY~1 z?11PXl%`Nkp_)QFpips`rch0xnnD$(`P)9bpA>3x|BxX7%>nU{sQ_4j_~0WUkyd>0 qHHB&l{f`u?LYSIDBTu2f0t^7qX{Q?Hyc@6p0000@KtY68e^Pt_|Z5HA2INY5Lc30beXkD+bt&%*H7FAFa-ur45Ep?UDSDUzDXZ)$jB$Nu4wQOt9Bld`c+N37bq4UzfEEXqcAH&}kisM2!h%W5$^{Zv&K`j;p8CGFh z4M@hb9|MjRceHn0jKl9XaA5Ipo{4S?d-Hg{DFhQ?+cV70D!jsrB^ zzO|%EZCh)%zlMkPrMApLnBRLvKkq9+UoU;jMZO97T)4`2WY$*4iRM?j_9MUmhjrMM T1;nmc00000NkvXXu0mjfVsH~Z literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/spritesheets/player/climb.png b/assets/environment/Forest/spritesheets/player/climb.png new file mode 100644 index 0000000000000000000000000000000000000000..c5ccec0f199a622520a3dc1661fdb6e5258fa285 GIT binary patch literal 1277 zcmVkQ4qd&vqh}LYQdk< zfDfSf1QLZ5+SwTpG^7xG5Wzx{LRdRHEdmb1v}~}XU}>5*be(A1)_K$V<*RdHZU5)@Hs%~Rjp%sy z%C)(NeEjjP)wou}eDCWM7EPXpslZS$Z{F>kAA9s*YXZW7bM!bpSCcIIP9Q@f0FE=v zP3;ckTp%_HiwpOn@su^>Z9l#*3XK!^`NM%pn5FLl4BW#wNnPM_VRP}hs5~VL3Zl)c z*Y8ELIC!|Oc60)R_qaMviWL0%8V25>pq$!*BV}+ z-KTqRgJ}Ujr#TDkf~V+N9(c`ZM9xG-HWQQb%#TlT54Se6o&(-@duOaRyhxo#MHQO7 zAa^UH0~Jwq#nT|w>yRA&TMFMmCK@yje|VywLlOv_k|agT&@s4QV|YPa_#?I7#TETc z9Z*Y5);u{Q6hskN*u{rXayS6j&^PnQ+&tm}#;-NL0m`>s6@qT=!=1i}o z{iRsCdO@;$clOb-`28 z;xI%i+{+WQ`HEl5g;cthhmoNKlXmBoVyd-%XT?*ppmG|7Ar~W*mY`e(MeA9VG`!^Q zS+BLmXvI@fVN)8au$brC7tOboS{dN+;i_$}b|Wt7d>0GW+B{YLE)UA~xh4OUh#++i zmMElB1>RG0ff(BTZ)LxGv*amBP|}bm?L=@*g)O%RBPPq8kvuW?VUuvx-T`63Q*;i6 zVnVOmJzh@3CW`B<9_#8`zyczv5%-JVC&NA00000NkvXXu0mjfDnn#l literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/spritesheets/player/duck.png b/assets/environment/Forest/spritesheets/player/duck.png new file mode 100644 index 0000000000000000000000000000000000000000..dca5adb9469896cf618b3d2c58f95e9687ea2114 GIT binary patch literal 895 zcmV-_1AzRAP)_sCV;&rQx4FH{w9|I( zypnfM()7J{`sVc9(|c#8FCUM`nZXbXxf#k}hBBC;3}z^U!3Rj?jEb0XHwrREi>>VCwv1fX1 zg69jQ7W(KEd;FBbP*f{pDcqRI*s}e10i(6 z#d3*6#G3*e13WE*&;8A}*|g!(sgAq0PCk>nvXm@yDuZ&AEG`f^K12xIOvtO6F6o>& z(O&YAfz=Kk=frgiDI?HHW9CVmLQT$rSzgmjuUCfhiABJ=1&;G}5K_xjoRf=>kE?uQ zwK!4VvVR2Er<2xlMu<+nELCT!QD0(M&%h?jjU=Ht4X)$l3v6omIMtQxRGi4<*f2ns z99*XIq0_rO$}UnM1Z=x9V_2x1D->sX^u%yZ5P?byK9hK<;NnD}g+!Spq)u8ZiZJVLl5eCLL84>n0hYG|%C&`u|nrVj;>dm9(346HZdFRGjK`q9AFNxh77$ z^xtH2k}k3Q51$VaY0y%U}ZEG zRsnxN#Lg~;fP!{bl0q;b7XA>6AVf$JQrSf?Akoe)>JJdMvhX7|N(u!FS@)gH**$x5 z?#%s~JCkfK3?!4u&NJ_M@408r%x3+5e@Yu!mW};>^Wt27;G6GXGr3Rhw;87M`i`Yb zmxmv?`|V36_woHr49TL6lzesZbZicSakgGQ&wsvu=V2e_!M;Zi?v4)H*zUWUD)t~o zh(%&>M!r9_nTUZ4@*y*688exo$^zI_mO9R(O=b_}sWcSoB5g)tEG#d2 zueFmhWc>s!o6MXV4`&JGvC2?nDwDBJGr-B=3gxk0@?a`cwrV;{L4-D%UAwzG>BFmr zDhnRfQM9$8r?NWxH$R596g=8_pc`14x*L_}+FM;2XhDvrGn+?-#8C+t}AnDTA7jntva<7<%c45$4*2iBM7X? zxQk&X9EdZ5igEkQZ^MzYwb_O9Q6Ww(jjiRyA=B6c?Sd;bfRaN70%lq$7>I-GgrDV7 zO-AtLqW>Rd;;vCAm^{~M<*8aWXm4^j8>;9zseKeF;LHF-6G1=Nm9lPw zNDItBk_peOa2#r{P?M9;a&qz6Ew$2^I6tmyYh@}ZgW60yG843_GB{_f;+d{$W>U|| zl>TN4SDR)ouX704cgd3tOo;EAma)7@CdyJiLBj?PVv$C&<)fP#J_&KHA!aHo0mw{c zJU%N+Y1@F;QJT}s%*0bCWdt&5Xxl)F#&3ViL?R{KMhi7C?MHubax4KE3~$A4@@t zZ6=y%GAr2VL=!KBiPw%Xm}tV;K3;QbY@(p$J&U}FSe$(3#+5P9-tXS9QwyZoX8fkgQ~4D(cmtPJB7FiJfe2+SGH_hT^7j zohfy6%1v3q=0&l(p7NW_)f5vqKq{S_4aEi1Qmg!%X_<@pB?StkEmO+(wr!b0S_Ey< zDRceSi_0jhnPO%r*E_|O9qKl*x$yY1ct6YIx7~CHcN|7&!>}$hwawhVIyt>y=Xwz- z-iP8BET5;fJ$Rh8sW&%c>*e%nO@iOxp5Xr>V3ICBGPunkkh|&NUQ$YnXZ&Wv*wP=vu#3jEg3*G$t*ub-s5b zzY1UV_#y>UDxJKFaxzEpkaujr+0y+fQ@WNNPMOj%bwc2@tb^>8TBNF40pgu9C1OG? zqirDrrrO`z$v4xTp6R@GZIUVV`6q?RxhQvS8Kmfxx2*>?$xQzR7yvQEXop|lxH$j- N002ovPDHLkV1n_gxpx2n literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/spritesheets/player/hurt.png b/assets/environment/Forest/spritesheets/player/hurt.png new file mode 100644 index 0000000000000000000000000000000000000000..a6ff9b436fa17fdfdf111217a7e9d673677675a8 GIT binary patch literal 1037 zcmV+o1oHcdP)k%iM|>w&hu zeJMkIZXtkZF^BiIH|hrGQ%Fj+;W%=ee4o{q(*~&yKYRJ4d8W_YaRBky^eMZWZ|nC_ zB+*}bZYwih0Nn9=w;xp6k^)Iw|I&?Xy^<3ng_D=F1d}3)$QYAiIy*mHEU8)cWJmU% z+%|18NL7?%VTLr}GkX+BauLPJ(sniL`6!TN<|vt%<+7qENlB1(^gVsy9{-<@C@Wu4 z6ruH*m-gSkuB=49JpZfMUS68OMSUC(eNTO;t5V0$B8tcWDC8r0Mnm2Ls4h!_xhpqI zizFGzz$eKAff`xb_}N5}T)cd;ZU^g+)bFVuI(?S}5a+K@>PtiL1^2SOHS@0 zsFP&fB#$hx?J}|Ryo8p5Nwd=?2u&qQ)-%}hX}MugnmL561SEk$7q&ExEF(e_lq$fJ zf=TMPJ{0rQKi^3}mS^VW@#YYCvlMB9v>X-MuG=^rOZ4t!F0V>J7`WI zUOiXWD_S4G%q~3+9&2)vIhJ+f@cEVI-Ke1mQ;q!)SMh0eV%JN((2Lel{HQ|CYBNZV zQzF&Ep7c3MZSIDM95nR7S&4^Z(r|G*ZQSIDlF=l|;Wkn)bXbl>6z-d>u^!&P zVnKN0zmWwF!*rT9K4hnRC*J42>jC7JZ*uWO|ahl}l1FX%b85Swv}- zx^*R!I$q9Mj~9ei{bb$1dP)%2?ExM}PqUQ>tbM8MSun00000NkvXX Hu0mjf?3U{$ literal 0 HcmV?d00001 diff --git a/assets/environment/Forest/spritesheets/player/idle.png b/assets/environment/Forest/spritesheets/player/idle.png new file mode 100644 index 0000000000000000000000000000000000000000..2b972a7b382f58c211bd9c94e5353986522cb446 GIT binary patch literal 2639 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 literal 0 HcmV?d00001 diff --git a/assets/shocked-miguel.ldtk b/assets/shocked-miguel.ldtk index 15e2340..5245cef 100644 --- a/assets/shocked-miguel.ldtk +++ b/assets/shocked-miguel.ldtk @@ -908,7 +908,7 @@ "__cHei": 2, "identifier": "Miguel", "uid": 27, - "relPath": "miguel/Miguel-Idle.png", + "relPath": "Characters/miguel/Miguel-Idle.png", "embedAtlas": null, "pxWid": 64, "pxHei": 64, @@ -927,7 +927,7 @@ "__cHei": 12, "identifier": "Forest", "uid": 2, - "relPath": "Sunny Land Collection Files/Sunny Land Collection Files/Assets/Environments/Forest/Forest Pack/PNG/environment/tileset.png", + "relPath": "environment/Forest/tileset.png", "embedAtlas": null, "pxWid": 320, "pxHei": 192, @@ -949,7 +949,7 @@ "__cHei": 1, "identifier": "RAT", "uid": 24, - "relPath": "Sunny Land Collection Files/Sunny Land Collection Files/Assets/Characters/Enemies and NPC/Dog/Spritesheets/dog-idle.png", + "relPath": "Characters/dog/Spritesheets/dog-idle.png", "embedAtlas": null, "pxWid": 198, "pxHei": 26, @@ -1020,7 +1020,7 @@ "bgPivotX": 0.5, "bgPivotY": 0.5, "__smartColor": "#ADADB5", - "__bgPos": { "topLeftPx": [0,0], "scale": [2.9166666666666665,2.9166666666666665], "cropRect": [0,65.14285714285714,192,109.71428571428572] }, + "__bgPos": null, "externalRelPath": null, "fieldInstances": [], "layerInstances": [ @@ -1279,7 +1279,7 @@ "__pxTotalOffsetX": 0, "__pxTotalOffsetY": 0, "__tilesetDefUid": 2, - "__tilesetRelPath": "Sunny Land Collection Files/Sunny Land Collection Files/Assets/Environments/Forest/Forest Pack/PNG/environment/tileset.png", + "__tilesetRelPath": "environment/Forest/tileset.png", "iid": "6a159530-73f0-11ef-b8f3-478a60fd3c71", "levelId": 0, "layerDefUid": 4, @@ -2072,7 +2072,7 @@ "__pxTotalOffsetX": 0, "__pxTotalOffsetY": 0, "__tilesetDefUid": 2, - "__tilesetRelPath": "Sunny Land Collection Files/Sunny Land Collection Files/Assets/Environments/Forest/Forest Pack/PNG/environment/tileset.png", + "__tilesetRelPath": "environment/Forest/tileset.png", "iid": "e4b98414-73f0-11ef-83af-ed82ee437def", "levelId": 43, "layerDefUid": 4, @@ -2944,7 +2944,7 @@ "__pxTotalOffsetX": 0, "__pxTotalOffsetY": 0, "__tilesetDefUid": 2, - "__tilesetRelPath": "Sunny Land Collection Files/Sunny Land Collection Files/Assets/Environments/Forest/Forest Pack/PNG/environment/tileset.png", + "__tilesetRelPath": "environment/Forest/tileset.png", "iid": "60e1e922-73f0-11ef-b56f-0584aa406eea", "levelId": 22, "layerDefUid": 4, From 74337189d8820faea8e81657b321b2468574e04e Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Thu, 7 Nov 2024 10:47:26 +0200 Subject: [PATCH 5/9] forgot background ) --- assets/shocked-miguel.ldtk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/shocked-miguel.ldtk b/assets/shocked-miguel.ldtk index 5245cef..11d47f3 100644 --- a/assets/shocked-miguel.ldtk +++ b/assets/shocked-miguel.ldtk @@ -1015,12 +1015,12 @@ "__bgColor": "#696A79", "bgColor": null, "useAutoIdentifier": true, - "bgRelPath": "Sunny Land Collection Files/Sunny Land Collection Files/Assets/Environments/Forest/Forest Pack/PNG/environment/Background Layers/background.png", + "bgRelPath": "environment/Forest/Background Layers/background.png", "bgPos": "Cover", "bgPivotX": 0.5, "bgPivotY": 0.5, "__smartColor": "#ADADB5", - "__bgPos": null, + "__bgPos": { "topLeftPx": [0,0], "scale": [2.9166666666666665,2.9166666666666665], "cropRect": [0,65.14285714285714,192,109.71428571428572] }, "externalRelPath": null, "fieldInstances": [], "layerInstances": [ From cd3397603e7555e45cdf9e7988d5f9704d3a98bb Mon Sep 17 00:00:00 2001 From: Supermjork Date: Thu, 7 Nov 2024 19:25:44 +0200 Subject: [PATCH 6/9] Miguel can now look left and right --- src/player.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/player.rs b/src/player.rs index f4c86d6..3f16344 100644 --- a/src/player.rs +++ b/src/player.rs @@ -20,7 +20,7 @@ enum Facing { Right, } -#[derive(Default, Component)] +#[derive(Default, Component, LdtkEntity)] pub(crate) struct Player { direction: Facing, } @@ -38,7 +38,7 @@ struct PlayerBundle { } fn player_movement( - mut query: Query<(&mut Velocity, &GroundDetection, &mut Player, &mut Transform), With>, + mut query: Query<(&mut Velocity, &GroundDetection, &mut Player, &mut Sprite), With>, input: Res>, ) { // let movement_direction = @@ -53,21 +53,25 @@ fn player_movement( // } else { // return; // }; - for (mut velocity, ground_detection, mut player, mut p_transform) in &mut query { - // let Right = if input.pressed(KeyCode::KeyD) { 1. } else { 0. }; - // let left = if input.pressed(KeyCode::KeyA) { 1. } else { 0. }; - + for (mut velocity, ground_detection, mut player, mut p_sprite) in &mut query { let right = if input.pressed(KeyCode::KeyD) { + player.direction = Facing::Right; 1. } else { 0. }; let left = if input.pressed(KeyCode::KeyA) { + player.direction = Facing::Left; 1. } else { 0. }; + match player.direction { + Facing::Right => {p_sprite.flip_x = false;}, + Facing::Left => {p_sprite.flip_x = true;}, + } + // gotta query for sprite to control how the player "appears" to look in either direction velocity.linvel.x = (right - left) * 200.; From 65606557f2f2de430f979d76c46599a4c6f0b224 Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Sat, 9 Nov 2024 21:18:10 +0200 Subject: [PATCH 7/9] removed uncommented code (it sucks) --- src/player.rs | 71 +++++---------------------------------------------- 1 file changed, 6 insertions(+), 65 deletions(-) diff --git a/src/player.rs b/src/player.rs index 3f16344..5c1ccd5 100644 --- a/src/player.rs +++ b/src/player.rs @@ -41,18 +41,6 @@ fn player_movement( mut query: Query<(&mut Velocity, &GroundDetection, &mut Player, &mut Sprite), With>, input: Res>, ) { - // let movement_direction = - // if input.just_pressed(KeyCode::KeyW) || input.just_pressed(KeyCode::Space) { - // GridCoords::new(0, 1) - // } else if input.just_pressed(KeyCode::KeyA) { - // GridCoords::new(-1, 0) - // } else if input.just_pressed(KeyCode::KeyS) { - // GridCoords::new(0, -1) - // } else if input.just_pressed(KeyCode::KeyD) { - // GridCoords::new(1, 0) - // } else { - // return; - // }; for (mut velocity, ground_detection, mut player, mut p_sprite) in &mut query { let right = if input.pressed(KeyCode::KeyD) { player.direction = Facing::Right; @@ -68,8 +56,12 @@ fn player_movement( }; match player.direction { - Facing::Right => {p_sprite.flip_x = false;}, - Facing::Left => {p_sprite.flip_x = true;}, + Facing::Right => { + p_sprite.flip_x = false; + } + Facing::Left => { + p_sprite.flip_x = true; + } } // gotta query for sprite to control how the player "appears" to look in either direction @@ -81,55 +73,4 @@ fn player_movement( } } - // for mut player_grid_coords in players.iter_mut() { - // let destination = *player_grid_coords + movement_direction; - // if !level_walls.in_wall(&destination) { - // *player_grid_coords = destination; - // } - // } } - -// #[derive(Default, Resource)] -// struct LevelWalls { -// wall_locations: HashSet, -// level_width: i32, -// level_height: i32, -// } -// impl LevelWalls { -// fn in_wall(&self, grid_coords: &GridCoords) -> bool { -// grid_coords.x < 0 -// || grid_coords.y < 0 -// || grid_coords.x >= self.level_width -// || grid_coords.y >= self.level_height -// || self.wall_locations.contains(grid_coords) -// } -// } - -// fn cache_wall_locations( -// mut level_walls: ResMut, -// mut level_events: EventReader, -// walls: Query<&GridCoords, With>, -// ldtk_project_entities: Query<&Handle>, -// ldtk_project_assets: Res>, -// ) { -// for level_event in level_events.read() { -// if let LevelEvent::Spawned(level_iid) = level_event { -// let ldtk_project = ldtk_project_assets -// .get(ldtk_project_entities.single()) -// .expect("LdtkProject should be loaded when level is spawned"); -// let level = ldtk_project -// .get_raw_level_by_iid(level_iid.get()) -// .expect("spawned level should exist in project"); - -// let wall_locations = walls.iter().copied().collect(); - -// let new_level_walls = LevelWalls { -// wall_locations, -// level_width: level.px_wid / crate::GRID_SIZE, -// level_height: level.px_hei / crate::GRID_SIZE, -// }; - -// *level_walls = new_level_walls; -// } -// } -// } From 46d3f94426b28eb23b449cf8f10202db212a707e Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Sat, 9 Nov 2024 22:55:50 +0200 Subject: [PATCH 8/9] MIGUEL IDLE ANIMATIONN --- assets/shocked-miguel.ldtk | 94 ++++++++++++++++++++++++++++++++++++-- src/main.rs | 5 +- src/player.rs | 11 ++++- 3 files changed, 102 insertions(+), 8 deletions(-) diff --git a/assets/shocked-miguel.ldtk b/assets/shocked-miguel.ldtk index 11d47f3..e27eaeb 100644 --- a/assets/shocked-miguel.ldtk +++ b/assets/shocked-miguel.ldtk @@ -11,7 +11,7 @@ "iid": "ee0ceef0-73f0-11ef-b8f3-3f3814adfda6", "jsonVersion": "1.5.3", "appBuildId": 473703, - "nextUid": 58, + "nextUid": 60, "identifierStyle": "Capitalize", "toc": [], "worldLayout": "LinearHorizontal", @@ -760,7 +760,82 @@ "limitBehavior": "MoveLastOne", "pivotX": 0.5, "pivotY": 1, - "fieldDefs": [] + "fieldDefs": [ + { + "identifier": "animation_timer", + "doc": null, + "__type": "Float", + "uid": 58, + "type": "F_Float", + "isArray": false, + "canBeNull": false, + "arrayMinLength": null, + "arrayMaxLength": null, + "editorDisplayMode": "Hidden", + "editorDisplayScale": 1, + "editorDisplayPos": "Above", + "editorLinkStyle": "StraightArrow", + "editorDisplayColor": null, + "editorAlwaysShow": false, + "editorShowInWorld": true, + "editorCutLongValues": true, + "editorTextSuffix": null, + "editorTextPrefix": null, + "useForSmartColor": false, + "exportToToc": false, + "searchable": false, + "min": null, + "max": null, + "regex": null, + "acceptFileTypes": null, + "defaultOverride": { "id": "V_Float", "params": [0.3] }, + "textLanguageMode": null, + "symmetricalRef": false, + "autoChainRef": true, + "allowOutOfLevelRef": true, + "allowedRefs": "OnlySame", + "allowedRefsEntityUid": null, + "allowedRefTags": [], + "tilesetUid": null + }, + { + "identifier": "animation_indices", + "doc": null, + "__type": "Array", + "uid": 59, + "type": "F_Int", + "isArray": true, + "canBeNull": false, + "arrayMinLength": 2, + "arrayMaxLength": 2, + "editorDisplayMode": "Hidden", + "editorDisplayScale": 1, + "editorDisplayPos": "Above", + "editorLinkStyle": "StraightArrow", + "editorDisplayColor": null, + "editorAlwaysShow": false, + "editorShowInWorld": true, + "editorCutLongValues": true, + "editorTextSuffix": null, + "editorTextPrefix": null, + "useForSmartColor": false, + "exportToToc": false, + "searchable": false, + "min": null, + "max": null, + "regex": null, + "acceptFileTypes": null, + "defaultOverride": { "id": "V_Int", "params": [0] }, + "textLanguageMode": null, + "symmetricalRef": false, + "autoChainRef": true, + "allowOutOfLevelRef": true, + "allowedRefs": "OnlySame", + "allowedRefsEntityUid": null, + "allowedRefTags": [], + "tilesetUid": null + } + ] }, { "identifier": "Goal", @@ -1251,7 +1326,10 @@ "height": 16, "defUid": 14, "px": [40,144], - "fieldInstances": [] + "fieldInstances": [ + { "__identifier": "animation_timer", "__type": "Float", "__value": 0.3, "__tile": null, "defUid": 58, "realEditorValues": [] }, + { "__identifier": "animation_indices", "__type": "Array", "__value": [0,3], "__tile": null, "defUid": 59, "realEditorValues": [ { "id": "V_Int", "params": [0] }, { "id": "V_Int", "params": [3] } ] } + ] }, { "__identifier": "Goal", @@ -2044,7 +2122,10 @@ "height": 16, "defUid": 14, "px": [24,160], - "fieldInstances": [] + "fieldInstances": [ + { "__identifier": "animation_timer", "__type": "Float", "__value": 0.3, "__tile": null, "defUid": 58, "realEditorValues": [] }, + { "__identifier": "animation_indices", "__type": "Array", "__value": [0,3], "__tile": null, "defUid": 59, "realEditorValues": [ { "id": "V_Int", "params": [0] }, { "id": "V_Int", "params": [3] } ] } + ] }, { "__identifier": "Goal", @@ -2916,7 +2997,10 @@ "height": 16, "defUid": 14, "px": [64,176], - "fieldInstances": [] + "fieldInstances": [ + { "__identifier": "animation_timer", "__type": "Float", "__value": 0.3, "__tile": null, "defUid": 58, "realEditorValues": [] }, + { "__identifier": "animation_indices", "__type": "Array", "__value": [0,3], "__tile": null, "defUid": 59, "realEditorValues": [ null, { "id": "V_Int", "params": [3] } ] } + ] }, { "__identifier": "Goal", diff --git a/src/main.rs b/src/main.rs index 58908d4..a25a4de 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +use animations::ShockingAnimationPlugin; use bevy::prelude::*; use bevy_ecs_ldtk::prelude::*; use bevy_rapier2d::plugin::{NoUserData, RapierConfiguration, RapierPhysicsPlugin, TimestepMode}; @@ -8,6 +9,7 @@ use level_structure::{WallBundle, WallPlugin}; use logging::log_positions; use player::PlayerPlugin; +mod animations; mod camera; mod colliders; mod goal; @@ -45,8 +47,9 @@ fn main() { .register_ldtk_int_cell::(1) .add_systems(Startup, setup) .add_plugins(CameraPlugin) + .add_plugins(ShockingAnimationPlugin) .add_systems(Update, (translate_grid_coords_entities, check_goal)) - .add_systems(Update, log_positions) + // .add_systems(Update, log_positions) .run(); } diff --git a/src/player.rs b/src/player.rs index 5c1ccd5..78a22be 100644 --- a/src/player.rs +++ b/src/player.rs @@ -2,7 +2,11 @@ use bevy::prelude::*; use bevy_ecs_ldtk::prelude::*; use bevy_rapier2d::dynamics::Velocity; -use crate::{colliders::ColliderBundle, ground_detection::GroundDetection}; +use crate::{ + animations::{AnimationIndices, AnimationTimer}, + colliders::ColliderBundle, + ground_detection::GroundDetection, +}; pub struct PlayerPlugin; @@ -35,6 +39,10 @@ struct PlayerBundle { pub ground_detection: GroundDetection, #[from_entity_instance] pub collider_bundle: ColliderBundle, + #[from_entity_instance] + animation_timer: AnimationTimer, + #[from_entity_instance] + animation_indices: AnimationIndices, } fn player_movement( @@ -72,5 +80,4 @@ fn player_movement( velocity.linvel.y = 500.; } } - } From 77dc847c8e129528b1d5724863df50d9e7e82e2f Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Sat, 9 Nov 2024 22:56:13 +0200 Subject: [PATCH 9/9] forgot to commit animation FILE LOL --- src/animations.rs | 74 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/animations.rs diff --git a/src/animations.rs b/src/animations.rs new file mode 100644 index 0000000..74b34ca --- /dev/null +++ b/src/animations.rs @@ -0,0 +1,74 @@ +use bevy::ecs::prelude::{Component, Query, Res}; +use bevy::prelude::*; +use bevy::prelude::{Time, Timer}; +use bevy::sprite::TextureAtlas; +use bevy_ecs_ldtk::ldtk::ldtk_fields::LdtkFields; +use bevy_ecs_ldtk::EntityInstance; + +use crate::player::Player; + +#[derive(Component, Default)] +pub struct AnimationIndices { + first: i32, + last: i32, +} + +#[derive(Component, Deref, DerefMut, Default)] +pub struct AnimationTimer(Timer); + +impl AnimationTimer { + fn default() -> Self { + AnimationTimer(Timer::from_seconds(0.1, TimerMode::Repeating)) + } +} +impl From<&EntityInstance> for AnimationTimer { + fn from(entity_instance: &EntityInstance) -> Self { + AnimationTimer(Timer::from_seconds( + entity_instance + .get_float_field("animation_timer") + .expect("items field should be correctly typed") + .clone(), + TimerMode::Repeating, + )) + } +} + +impl From<&EntityInstance> for AnimationIndices { + fn from(entity_instance: &EntityInstance) -> Self { + let indices: Vec = entity_instance + .iter_ints_field("animation_indices") + .expect("numbers field should be correctly typed") + .cloned() + .collect(); + + let first = indices.get(0).expect("fuck"); + let last = indices.get(1).expect("fuck"); + AnimationIndices { + first: *first, + last: *last, + } + } +} +fn animate_player( + time: Res