From 4137f33a21e73b5aaa561eb212608c7f99dd13dc Mon Sep 17 00:00:00 2001 From: legendiguess Date: Tue, 31 Jan 2023 11:08:23 +0500 Subject: [PATCH] feat: reimplement stomp boots --- .../elements/item/stomp_boots/stomp_boots.png | Bin 12762 -> 11298 bytes .../item/stomp_boots/stomp_boots_icon.png | Bin 460 -> 541 bytes core/src/attachment.rs | 12 + core/src/elements.rs | 3 +- core/src/elements/grenade.rs | 2 + core/src/elements/kick_bomb.rs | 2 + core/src/elements/musket.rs | 1 + core/src/elements/stomp_boots.rs | 238 ++++++++++++++++++ core/src/player.rs | 12 + 9 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 core/src/elements/stomp_boots.rs diff --git a/assets/elements/item/stomp_boots/stomp_boots.png b/assets/elements/item/stomp_boots/stomp_boots.png index df43731231f0d30c811361dca7b8b2fc14a1a715..33736254cac47845b708d48726d2304f105a708e 100644 GIT binary patch literal 11298 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 diff --git a/assets/elements/item/stomp_boots/stomp_boots_icon.png b/assets/elements/item/stomp_boots/stomp_boots_icon.png index 81838154b8f2e5f3f1b137faa4b2aa2cffd45151..4002fb2d244edd74b9a9a63395a7c52d83cda2ce 100644 GIT binary patch literal 541 zcmV+&0^Px$*GWV{R7i=vm9c6ZF%X9TG2vdp%@IOs7dxQl8uf1S28X#qMXGy(RDOaj78ioM zLZv%Df{LU$7}Y6^F)31S83J;#maN?icyE`>fM6x<>i;$KNlW+-QB_qOj)f2?cVdiZ zYgJXn&1MsuripFa#arLiO~B4Fm8s4*r#U(7K80ITI9H)f8jQ93Jj& z@%huo{NCf!GroNN25W7v?f~-6lM$`;xD32U^J=;1^{=jPvVkO8W}=LDAskEdP@I`z zt%dhKf1B39Yw1G>ZxFr;#e(8kikCE7YhkU0QVIa@+`faR5jC zl4fRxh-4P#L@oi)KTajhsqVlV%_UI7lQ3GGsDn^MXti9>9Ga)bKmP?&Xr3BJH{leT fce~v*aU#3`pzntsBw23a00000NkvXXu0mjf{3rHP literal 460 zcmV;-0WM0004#NklK-oo|L*k3DulqbWvvay7^c%H09921D0OXfYi-E$oGikC-|2JPuM&b7BBP=GP5a&S1^E|~EV`{@W z2V9`-i^(W#cl+Af%iAZ*l=mJ$_0BPBqjtO7Gw460nC)&)RaHm#92KhuIN4lM zTbAWvqj$$Z#K}b33}e+NnM-Q3ENi7!YB-)zmSutrNPx*CpaEQ0Y5_GI&(e2V>m$HK zqAJED;3BO6#d@P6ND`jr9mWH__o^t00Hms=M0b=-ux8$s+IYCu`md*>, + mut entities: ResMut, + mut hydrated: CompMut, + mut element_handles: CompMut, + element_assets: BevyAssets, + mut stomp_boots: CompMut, + mut atlas_sprites: CompMut, + mut bodies: CompMut, + mut transforms: CompMut, + mut items: CompMut, + mut respawn_points: CompMut, +) { + let mut not_hydrated_bitset = hydrated.bitset().clone(); + not_hydrated_bitset.bit_not(); + not_hydrated_bitset.bit_and(element_handles.bitset()); + + let spawners = entities + .iter_with_bitset(¬_hydrated_bitset) + .collect::>(); + + for spawner_ent in spawners { + let transform = *transforms.get(spawner_ent).unwrap(); + let element_handle = element_handles.get(spawner_ent).unwrap(); + let Some(element_meta) = element_assets.get(&element_handle.get_bevy_handle()) else { + continue; + }; + + if let BuiltinElementKind::StompBoots { + body_size, + body_offset, + map_icon, + .. + } = &element_meta.builtin + { + hydrated.insert(spawner_ent, MapElementHydrated); + + let entity = entities.create(); + items.insert(entity, Item); + stomp_boots.insert( + entity, + StompBoots { + spawner: spawner_ent, + }, + ); + atlas_sprites.insert(entity, AtlasSprite::new(map_icon.clone())); + respawn_points.insert(entity, MapRespawnPoint(transform.translation)); + transforms.insert(entity, transform); + element_handles.insert(entity, element_handle.clone()); + hydrated.insert(entity, MapElementHydrated); + bodies.insert( + entity, + KinematicBody { + size: *body_size, + offset: *body_offset, + has_mass: true, + has_friction: true, + gravity: game_meta.physics.gravity, + ..default() + }, + ); + } + } +} + +fn update( + entities: Res, + element_handles: Comp, + element_assets: BevyAssets, + mut transforms: CompMut, + mut stomp_boots: CompMut, + mut sprites: CompMut, + mut bodies: CompMut, + items_used: Comp, + mut items_dropped: CompMut, + player_inventories: PlayerInventories, + mut inventoris: CompMut, + mut hydrated: CompMut, + mut commands: Commands, +) { + for (entity, (stomp_boots, element_handle)) in + entities.iter_with((&mut stomp_boots, &element_handles)) + { + let spawner = stomp_boots.spawner; + let Some(element_meta) = element_assets.get(&element_handle.get_bevy_handle()) else { + continue; + }; + + let BuiltinElementKind::StompBoots { + grab_offset, + player_decoration, + .. + } = &element_meta.builtin else { + unreachable!(); + }; + + // If the item is being held + if let Some(inventory) = player_inventories + .iter() + .find_map(|x| x.filter(|x| x.inventory == entity)) + { + let player = inventory.player; + let player_sprite = sprites.get_mut(player).unwrap(); + + let body = bodies.get_mut(entity).unwrap(); + body.is_deactivated = true; + + let flip = player_sprite.flip_x; + let sprite = sprites.get_mut(entity).unwrap(); + sprite.flip_x = flip; + let flip_factor = if flip { -1.0 } else { 1.0 }; + let player_translation = transforms.get(player).unwrap().translation; + let transform = transforms.get_mut(entity).unwrap(); + let offset = Vec3::new(grab_offset.x * flip_factor, grab_offset.y, 1.0); + transform.translation = player_translation + offset; + transform.rotation = Quat::IDENTITY; + + // If the item is being used + let is_item_used = items_used.get(entity).is_some(); + let player_decoration = player_decoration.clone(); + + if is_item_used { + hydrated.remove(spawner); + inventoris.insert(player, Inventory(None)); + commands.add( + move |mut entities: ResMut, + mut sprites: CompMut, + mut attachments: CompMut, + mut transforms: CompMut, + mut wearing_stomp_boots: CompMut| { + entities.kill(entity); + + let attachment_ent = entities.create(); + let attachment = Attachment { + entity: player, + offset: Vec3::ZERO, + sync_animation: true, + }; + attachments.insert(attachment_ent, attachment); + sprites.insert(attachment_ent, AtlasSprite::new(player_decoration.clone())); + transforms.insert(attachment_ent, Transform::default()); + wearing_stomp_boots.insert(player, WearingStompBoots); + }, + ); + } + } + + // If the item was dropped + if let Some(dropped) = items_dropped.get(entity).copied() { + let player = dropped.player; + + items_dropped.remove(entity); + let player_translation = transforms.get(dropped.player).unwrap().translation; + let player_velocity = bodies.get(player).unwrap().velocity; + + let body = bodies.get_mut(entity).unwrap(); + let sprite = sprites.get_mut(entity).unwrap(); + + // Re-activate physics + body.is_deactivated = false; + + let horizontal_flip_factor = if sprite.flip_x { + Vec2::new(-1.0, 1.0) + } else { + Vec2::ONE + }; + body.velocity = horizontal_flip_factor + player_velocity; + + body.is_spawning = true; + + let transform = transforms.get_mut(entity).unwrap(); + transform.translation = player_translation; + } + } +} + +fn update_wearer( + entities: Res, + wearing_stomp_boots: Comp, + player_indexes: Comp, + collision_world: CollisionWorld, + mut player_events: ResMut, + kinematic_bodies: Comp, + transforms: Comp, +) { + for (entity, _) in entities.iter_with(&wearing_stomp_boots) { + let kinematic_body = kinematic_bodies.get(entity).unwrap(); + if kinematic_body.velocity.y > 0. + || kinematic_body.is_on_ground + || kinematic_body.is_on_platform + { + continue; + } + collision_world + .actor_collisions(entity) + .into_iter() + .filter(|&x| player_indexes.contains(x)) + .for_each(|player| { + let wearer_transform = transforms + .get(entity) + .expect("stomp boots wearer should have Transform component"); + let player_transform = transforms.get(player).unwrap(); + let player_kinematic_body = kinematic_bodies.get(player).unwrap(); + if kinematic_body + .collider_rect(wearer_transform.translation) + .bottom() + > player_kinematic_body + .collider_rect(player_transform.translation) + .center() + .y + { + player_events.kill(player) + } + }); + } +} diff --git a/core/src/player.rs b/core/src/player.rs index 34305726e5..f4d0c7a404 100644 --- a/core/src/player.rs +++ b/core/src/player.rs @@ -95,6 +95,7 @@ fn handle_player_events( mut items_dropped: CompMut, mut items_used: CompMut, mut inventories: CompMut, + attachments: Comp, player_indexes: Comp, ) { while let Some(event) = player_events.queue.pop_front() { @@ -121,6 +122,16 @@ fn handle_player_events( players_killed.insert(player, PlayerKilled); } PlayerEvent::Despawn { player } => { + entities + .iter_with(&attachments) + .filter(|(_, attachment)| attachment.entity == player) + .map(|(entity, _)| entity) + .collect::>() + .iter() + .for_each(|entity| { + entities.kill(*entity); + }); + if player_indexes.contains(player) { entities.kill(player); } else { @@ -186,6 +197,7 @@ fn hydrate_players( player_states.insert(entity, default()); animation_bank_sprites.insert(entity, animation_bank_sprite); inventories.insert(entity, default()); + atlas_sprites.insert( entity, AtlasSprite {