From 08e0f8268bbca8807a4797ee41719f967edc6fce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Sat, 16 Oct 2021 13:46:09 +0300 Subject: [PATCH 1/3] Add Flippers --- assets/Whale/Flippers(45x36).png | Bin 0 -> 7495 bytes assets/Whale/Flippers(65x45).png | Bin 0 -> 12752 bytes assets/levels/test_level.json | 14 +++++- src/items.rs | 13 ++++++ src/items/flippers.rs | 74 +++++++++++++++++++++++++++++++ src/items/shoes.rs | 2 +- src/nodes/player.rs | 68 +++++++++++++++++++++------- 7 files changed, 154 insertions(+), 17 deletions(-) create mode 100644 assets/Whale/Flippers(45x36).png create mode 100644 assets/Whale/Flippers(65x45).png create mode 100644 src/items/flippers.rs diff --git a/assets/Whale/Flippers(45x36).png b/assets/Whale/Flippers(45x36).png new file mode 100644 index 0000000000000000000000000000000000000000..4fd42ea84d6385fbfa42ad41e93ac3d927d2724d GIT binary patch literal 7495 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 literal 0 HcmV?d00001 diff --git a/assets/Whale/Flippers(65x45).png b/assets/Whale/Flippers(65x45).png new file mode 100644 index 0000000000000000000000000000000000000000..1994f1e448797a0fc50a25dd189823c8fcf6bd33 GIT binary patch literal 12752 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 ACjbBd literal 0 HcmV?d00001 diff --git a/assets/levels/test_level.json b/assets/levels/test_level.json index 7f1160c110..e7dc818844 100644 --- a/assets/levels/test_level.json +++ b/assets/levels/test_level.json @@ -286,7 +286,19 @@ "width":0, "x":769.333333333333, "y":552 - }], + }, + { + "height":0, + "id":151, + "name":"flippers", + "point":true, + "rotation":0, + "type":"", + "visible":true, + "width":0, + "x":500, + "y":650 + }], "opacity":1, "type":"objectgroup", "visible":true, diff --git a/src/items.rs b/src/items.rs index 21c92c450b..4c747dc10a 100644 --- a/src/items.rs +++ b/src/items.rs @@ -2,6 +2,7 @@ //! Proto-mods, eventually some of the items will move to some sort of a wasm runtime mod cannon; +pub mod flippers; mod galleon; mod grenades; mod gun; @@ -131,6 +132,18 @@ pub const ITEMS: &[Item] = &[ fxses: &[], network_ready: false, }, + Item { + tiled_name: "flippers", + constructor: flippers::Flippers::spawn, + tiled_offset: (0., 0.), + textures: &[ + ("flippers_item", "assets/Whale/Flippers(65x45).png"), + ("flippers_weared", "assets/Whale/Flippers(45x36).png"), + ], + sounds: &[], + fxses: &[], + network_ready: false, + }, Item { tiled_name: "grenades", constructor: grenades::Grenades::spawn, diff --git a/src/items/flippers.rs b/src/items/flippers.rs new file mode 100644 index 0000000000..594548d754 --- /dev/null +++ b/src/items/flippers.rs @@ -0,0 +1,74 @@ +use macroquad::{ + color, + experimental::{ + animation::{AnimatedSprite, Animation}, + collections::storage, + scene::{HandleUntyped, Node, RefMut}, + }, + prelude::*, +}; + +use crate::{nodes::Player, Resources}; + +pub struct Flippers { + sprite: AnimatedSprite, + pos: Vec2, +} + +impl Flippers { + pub fn spawn(pos: Vec2) -> HandleUntyped { + let sprite = AnimatedSprite::new( + 65, + 45, + &[Animation { + name: "idle".to_string(), + row: 0, + frames: 1, + fps: 1, + }], + false, + ); + + scene::add_node(Flippers { sprite, pos }).untyped() + } +} + +impl Node for Flippers { + fn fixed_update(node: scene::RefMut) { + let flippers_rect = Rect::new(node.pos.x, node.pos.y, 30.0, 30.0); + let mut picked_up = false; + + for mut player in scene::find_nodes_by_type::() { + let player_rect = Rect::new(player.body.pos.x, player.body.pos.y, 30.0, 54.0); + if player_rect.overlaps(&flippers_rect) && !player.can_head_boink { + player.can_extra_jump = true; + player.can_head_boink = true; + picked_up = true; + } + } + + if picked_up { + node.delete(); + } + } + + fn draw(mut node: RefMut) { + node.sprite.update(); + + let resources = storage::get_mut::(); + + draw_texture_ex( + resources.items_textures["flippers/flippers_item"], + node.pos.x, + node.pos.y, + color::WHITE, + DrawTextureParams { + source: Some(node.sprite.frame().source_rect), + dest_size: Some(node.sprite.frame().dest_size), + flip_x: false, + rotation: 0.0, + ..Default::default() + }, + ) + } +} diff --git a/src/items/shoes.rs b/src/items/shoes.rs index 1fd29fcd93..97e0b0aa83 100644 --- a/src/items/shoes.rs +++ b/src/items/shoes.rs @@ -103,7 +103,7 @@ impl Node for Shoes { Self::COLLIDER_HEIGHT, ); for mut player in scene::find_nodes_by_type::() { - if player.get_hitbox().overlaps(&shoes_rect) { + if player.get_hitbox().overlaps(&shoes_rect) && !player.can_extra_jump { player.can_head_boink = true; node.delete(); return; diff --git a/src/nodes/player.rs b/src/nodes/player.rs index 1b7c88b398..9cd91639fa 100644 --- a/src/nodes/player.rs +++ b/src/nodes/player.rs @@ -14,6 +14,7 @@ use macroquad::{ use crate::{ capabilities::{NetworkReplicate, PhysicsObject, Weapon, WeaponTrait}, components::PhysicsBody, + items::flippers::Flippers, items::shoes::Shoes, GameWorld, Input, Resources, }; @@ -90,6 +91,9 @@ pub struct Player { pub incapacitated_duration: f32, pub incapacitated_timer: f32, + pub can_extra_jump: bool, + pub extra_jump_count: i32, + pub back_armor: i32, pub can_head_boink: bool, } @@ -114,6 +118,7 @@ impl Player { pub const JUMP_GRACE_TIME: f32 = 0.15; pub const PICK_GRACE_TIME: f32 = 0.30; pub const FLOAT_SPEED: f32 = 100.0; + pub const MAX_JUMP_COUNT: i32 = 3; pub const INCAPACITATED_BREAK_FACTOR: f32 = 0.9; pub const INCAPACITATED_STOP_THRESHOLD: f32 = 20.0; @@ -243,6 +248,8 @@ impl Player { ai: Some(ai::Ai::new()), camera_box: Rect::new(spawner_pos.x - 30., spawner_pos.y - 150., 100., 210.), can_head_boink: false, + can_extra_jump: false, + extra_jump_count: 0, back_armor: 0, is_crouched: false, incapacitated_timer: 0.0, @@ -363,6 +370,11 @@ impl Player { this.can_head_boink = false; } + if this.can_extra_jump { + Flippers::spawn(this.body.pos); + this.can_extra_jump = false; + } + this.body.pos = { let world = storage::get_mut::(); let objects = &world.map.layers["logic"].objects; @@ -511,10 +523,11 @@ impl Player { } // if in jump and want to jump again - if !node.body.on_ground - && node.input.jump - && !node.last_frame_input.jump + if (node.extra_jump_count >= Self::MAX_JUMP_COUNT || !node.can_extra_jump) && node.jump_grace_timer <= 0.0 + && !node.last_frame_input.jump + && node.input.jump + && !node.body.on_ground { // if !node.was_floating { @@ -551,14 +564,18 @@ impl Player { node.body.descent(); } - if !node.input.down - && node.input.jump - && !node.last_frame_input.jump - && node.jump_grace_timer > 0. - { - node.jump_grace_timer = 0.0; - - node.jump(); + if !node.input.down && node.input.jump && !node.last_frame_input.jump { + if node.can_extra_jump + && node.extra_jump_count < Self::MAX_JUMP_COUNT + && node.jump_grace_timer <= 0. + { + node.jump(); + node.extra_jump_count += 1; + node.jump_grace_timer = Self::JUMP_GRACE_TIME; + } else if node.jump_grace_timer > 0. && node.extra_jump_count == 0 { + node.jump_grace_timer = 0.0; + node.jump(); + } } if node.weapon.is_none() && node.pick_grace_timer > 0. { @@ -706,6 +723,7 @@ impl Player { if node.body.on_ground && !node.input.jump { node.jump_grace_timer = Self::JUMP_GRACE_TIME; + node.extra_jump_count = 0; } else if node.jump_grace_timer > 0. { node.jump_grace_timer -= get_frame_time(); } @@ -720,8 +738,14 @@ impl Player { let is_overlapping = hitbox.overlaps(&other_hitbox); if is_overlapping && hitbox.y + 60.0 < other_hitbox.y + Self::HEAD_THRESHOLD { let resources = storage::get::(); - play_sound_once(resources.jump_sound); - other.kill(!node.body.facing); + if node.can_extra_jump && other.weapon.is_some() { + node.jump(); + other.drop_weapon(); + play_sound_once(resources.player_throw_sound); + } else if !node.can_extra_jump { + other.kill(!node.body.facing); + play_sound_once(resources.jump_sound); + } } } } @@ -759,14 +783,14 @@ impl scene::Node for Player { draw_texture_ex( if node.controller_id == 0 { - if node.can_head_boink { + if node.can_head_boink && !node.can_extra_jump { resources.whale_boots_blue } else { resources.whale_blue } } else { // - if node.can_head_boink { + if node.can_head_boink && !node.can_extra_jump { resources.whale_boots_green } else { resources.whale_green @@ -783,6 +807,20 @@ impl scene::Node for Player { }, ); + // draw flippers + if node.can_extra_jump { + draw_texture_ex( + resources.items_textures["flippers/flippers_weared"], + node.body.pos.x + if node.body.facing { 5. } else { -24. }, + node.body.pos.y + 30., + color::WHITE, + DrawTextureParams { + flip_x: !node.body.facing, + ..Default::default() + }, + ) + } + // draw turtle shell on player if the player has back armor if node.back_armor > 0 { draw_texture_ex( From 2e058289656db87b1591b3334f54d62e9dda023f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Sat, 16 Oct 2021 13:58:20 +0300 Subject: [PATCH 2/3] Fix death coroutine for flippers item --- src/nodes/player.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/nodes/player.rs b/src/nodes/player.rs index 84d0a5c138..0d8a76f6fd 100644 --- a/src/nodes/player.rs +++ b/src/nodes/player.rs @@ -367,14 +367,13 @@ impl Player { let mut this = scene::get_node(handle); - if this.can_head_boink { - Shoes::spawn(this.body.pos); - this.can_head_boink = false; - } - if this.can_extra_jump { Flippers::spawn(this.body.pos); this.can_extra_jump = false; + this.can_head_boink = false; + } else if this.can_head_boink { + Shoes::spawn(this.body.pos); + this.can_head_boink = false; } this.body.pos = { From da87eb5185dc95b038f35cbb54eb2a8c5a394bcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Sat, 16 Oct 2021 14:12:20 +0300 Subject: [PATCH 3/3] Make it possible to break turtle shell with flippers --- src/nodes/player.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/nodes/player.rs b/src/nodes/player.rs index 0d8a76f6fd..258ca45747 100644 --- a/src/nodes/player.rs +++ b/src/nodes/player.rs @@ -739,10 +739,15 @@ impl Player { let is_overlapping = hitbox.overlaps(&other_hitbox); if is_overlapping && hitbox.y + 60.0 < other_hitbox.y + Self::HEAD_THRESHOLD { let resources = storage::get::(); - if node.can_extra_jump && other.weapon.is_some() { - node.jump(); - other.drop_weapon(); - play_sound_once(resources.player_throw_sound); + if node.can_extra_jump { + if other.weapon.is_some() { + other.drop_weapon(); + play_sound_once(resources.player_throw_sound); + node.jump(); + } else if other.back_armor > 0 { + other.back_armor -= 1; + node.jump(); + } } else if !node.can_extra_jump { other.kill(!node.body.facing); play_sound_once(resources.jump_sound);