From 9381742e823da6cd9957346c1ebaf06e1320b4e5 Mon Sep 17 00:00:00 2001 From: Arthur-Aillet Date: Sun, 8 Feb 2026 19:51:15 +0100 Subject: [PATCH 01/19] feat: first spil + gameplay and pos tweaks --- assets/oilspil.png | 4 +-- src/node.rs | 66 +++++++++++++++++++++++++++++++++++++----- src/player/movement.rs | 4 +-- src/player/spawn.rs | 2 +- src/world.rs | 28 ++++++++++-------- 5 files changed, 79 insertions(+), 25 deletions(-) diff --git a/assets/oilspil.png b/assets/oilspil.png index 1b2f6e6..a1ef59b 100644 --- a/assets/oilspil.png +++ b/assets/oilspil.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8aec93fe5999935aa6a842902f956374f160bd7da613c76dcef259c36a5c35c2 -size 9899 +oid sha256:1e861252f77219347a2ef0006893f30a2d140a92b6d72fae60ed40a42cc81829 +size 9761 diff --git a/src/node.rs b/src/node.rs index 731281a..688eb82 100644 --- a/src/node.rs +++ b/src/node.rs @@ -1,4 +1,7 @@ -use bevy::prelude::*; +use std::f32::consts::PI; + +use bevy::{light::NotShadowCaster, prelude::*}; +use bevy_sprite3d::Sprite3d; #[derive(Component)] pub struct OilNode; @@ -8,11 +11,58 @@ pub struct OilNodeResource { pub nodes_left: usize, } -pub fn spawn_world_nodes(mut commands: Commands) { - commands.spawn_batch([ - (OilNode, Transform::from_xyz(-62.0, -81.0, 22.0)), - (OilNode, Transform::from_xyz(-42.0, -81.0, 22.0)), - (OilNode, Transform::from_xyz(-42.0, -61.0, 22.0)), - (OilNode, Transform::from_xyz(0.0, 0.0, 22.0)), - ]); +#[derive(Resource, Default)] +pub struct OilAsset(Handle); + +pub fn load_oil(asset_server: Res, mut oil: ResMut) { + oil.0 = asset_server.load("oilspil.png"); +} + +pub fn spawn_world_nodes( + mut commands: Commands, + oil: Res, + asset_server: Res, + mut loaded: Local, +) { + if *loaded { + return; + } + + if !asset_server + .get_load_state(oil.0.id()) + .is_some_and(|s| s.is_loaded()) + { + return; + } + *loaded = true; + + for transform in [ + Transform::from_xyz(-62.0, -81.0, 22.15).with_rotation(Quat::from_euler( + EulerRot::XYZ, + 4.5 * PI / 180., + 4.5 * PI / 180., + 0., + )), + Transform::from_xyz(-42.0, -81.0, 22.0), + Transform::from_xyz(-42.0, -61.0, 22.0), + Transform::from_xyz(0.0, 0.0, 22.0), + ] { + commands.spawn(( + Sprite3d { + pixels_per_metre: 400., + alpha_mode: AlphaMode::Blend, + unlit: true, + // pivot: Some(Vec2::new(0.5, 0.5)), + ..default() + }, + Sprite { + image: oil.0.clone(), + ..default() + }, + NotShadowCaster, + Visibility::Visible, + OilNode, + transform.with_scale(Vec3::splat(20.)), + )); + } } diff --git a/src/player/movement.rs b/src/player/movement.rs index 453ac2d..9d749a4 100644 --- a/src/player/movement.rs +++ b/src/player/movement.rs @@ -7,7 +7,7 @@ use crate::{ }; /// Acceleration in m/s^2 -pub const PLAYER_ACCELERATION: f32 = 160.0 / 3.6; +pub const PLAYER_ACCELERATION: f32 = 220.0 / 3.6; /// Velocity in m/s calculated from km/h pub const PLAYER_MAX_SPEED: f32 = 2.9 / 3.6; @@ -15,7 +15,7 @@ pub const PLAYER_MAX_SPEED: f32 = 2.9 / 3.6; pub const PLAYER_MAX_SPEED_2: f32 = PLAYER_MAX_SPEED * PLAYER_MAX_SPEED; // Effective gravity in m/s^2 in Z -pub const PLAYER_BUOYANCY: f32 = -10.; +pub const PLAYER_BUOYANCY: f32 = -20.; // Jump velocity pub const PLAYER_JUMP_IMPULSE: f32 = 0.4; diff --git a/src/player/spawn.rs b/src/player/spawn.rs index 824c50c..c05e8db 100644 --- a/src/player/spawn.rs +++ b/src/player/spawn.rs @@ -89,7 +89,7 @@ pub fn spawn_player(mut commands: Commands) { playercast, avian3d::dynamics::prelude::RigidBody::Kinematic, LinearVelocity::default(), - Transform::from_xyz(-62.0, -81.0, 22.0), + Transform::from_xyz(-72.0, -83.0, 65.0), Visibility::default(), )) .add_child(camera); diff --git a/src/world.rs b/src/world.rs index 7982ef1..358b66c 100644 --- a/src/world.rs +++ b/src/world.rs @@ -5,7 +5,10 @@ use bevy::{light::NotShadowCaster, prelude::*}; use bevy_atmosphere::prelude::*; use bevy_sprite3d::prelude::*; -use crate::{node::spawn_world_nodes, player::PLAYER_FLOOR_LAYER}; +use crate::{ + node::{OilAsset, load_oil, spawn_world_nodes}, + player::PLAYER_FLOOR_LAYER, +}; pub struct WorldPlugin; @@ -19,11 +22,12 @@ impl Plugin for WorldPlugin { load_ladder, setup_world, play_background_audio, - spawn_world_nodes, + load_oil, ), ) - .add_systems(Update, (spawn_ground, spawn_world)) - .insert_resource(Ladder::default()); + .add_systems(Update, (spawn_ground, spawn_world, spawn_world_nodes)) + .insert_resource(Ladder::default()) + .insert_resource(OilAsset::default()); } } @@ -95,7 +99,7 @@ fn spawn_world( let mut ladder_parent = commands.spawn(( Visibility::Visible, - Transform::from_xyz(-62.0, -83.0, 25.5) + Transform::from_xyz(-72.0, -85.0, 25.) .looking_to(Vec3::Y, Vec3::Z) .with_scale(Vec3::splat(3.)), )); @@ -137,7 +141,7 @@ fn spawn_world( commands.spawn(( Mesh3d(meshes.add(Capsule3d::default().mesh().latitudes(7).longitudes(7))), MeshMaterial3d(materials.add(Color::srgb_u8(165, 42, 42))), - Transform::from_xyz(-62.0, -83.0, 500.0).with_scale(Vec3::splat(14.)), + Transform::from_xyz(-72.0, -85.0, 500.0).with_scale(Vec3::splat(14.)), NotShadowCaster, )); let mut light_mat = StandardMaterial::default(); @@ -150,32 +154,32 @@ fn spawn_world( commands.spawn(( SpotLight { color: Color::srgb_u8(255, 252, 220), - intensity: 200000000000_f32, + intensity: 100000000000_f32, range: 500.0, radius: 0.5, shadows_enabled: true, - outer_angle: PI / 2.0 * 0.013, + outer_angle: PI / 2.0 * 0.01, ..Default::default() }, - Transform::from_xyz(-62.0, -83.0, 493.0).looking_to(-Vec3::Z, Vec3::Z), + Transform::from_xyz(-72.0, -85.0, 493.0).looking_to(-Vec3::Z, Vec3::Z), )); commands.spawn(( Mesh3d(light_mesh.clone()), MeshMaterial3d(materials.add(light_mat.clone())), NotShadowCaster, - Transform::from_xyz(-62.0, -89.0, 493.0).with_scale(Vec3::splat(2.)), + Transform::from_xyz(-72.0, -91.0, 493.0).with_scale(Vec3::splat(2.)), )); commands.spawn(( Mesh3d(light_mesh.clone()), MeshMaterial3d(materials.add(light_mat.clone())), NotShadowCaster, - Transform::from_xyz(-59.0, -78.0, 493.0).with_scale(Vec3::splat(2.)), + Transform::from_xyz(-69.0, -80.0, 493.0).with_scale(Vec3::splat(2.)), )); commands.spawn(( Mesh3d(light_mesh), MeshMaterial3d(materials.add(light_mat)), NotShadowCaster, - Transform::from_xyz(-65.0, -78.0, 493.0).with_scale(Vec3::splat(2.)), + Transform::from_xyz(-75.0, -80.0, 493.0).with_scale(Vec3::splat(2.)), )); } From 6e54a009ae3e2a1bcf5f09a19e0b87a8e7f16006 Mon Sep 17 00:00:00 2001 From: Arthur-Aillet Date: Sun, 8 Feb 2026 20:29:59 +0100 Subject: [PATCH 02/19] feat: spils placed --- src/node.rs | 30 +++++++++++++++++++++++------- src/player/movement.rs | 17 ++++++++++------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/node.rs b/src/node.rs index 688eb82..9511de7 100644 --- a/src/node.rs +++ b/src/node.rs @@ -37,17 +37,33 @@ pub fn spawn_world_nodes( *loaded = true; for transform in [ - Transform::from_xyz(-62.0, -81.0, 22.15).with_rotation(Quat::from_euler( + Transform::from_xyz(-62.5, -80.9, 22.16).with_rotation(Quat::from_euler( EulerRot::XYZ, - 4.5 * PI / 180., - 4.5 * PI / 180., + 0.0783, + 0.068, + 0., + )), + Transform::from_xyz(-130., 74., 52.9).with_rotation(Quat::from_euler( + EulerRot::XYZ, + 0.3, + -0.03, + 0., + )), + Transform::from_xyz(-186.7, -111., 53.6).with_rotation(Quat::from_euler( + EulerRot::XYZ, + -0.34, + -0.06, + 0., + )), + Transform::from_xyz(173.4, 46.4, 16.7).with_rotation(Quat::from_euler( + EulerRot::XYZ, + 0.19, + -0.07, 0., )), - Transform::from_xyz(-42.0, -81.0, 22.0), - Transform::from_xyz(-42.0, -61.0, 22.0), - Transform::from_xyz(0.0, 0.0, 22.0), ] { commands.spawn(( + Name::new("Decal"), Sprite3d { pixels_per_metre: 400., alpha_mode: AlphaMode::Blend, @@ -62,7 +78,7 @@ pub fn spawn_world_nodes( NotShadowCaster, Visibility::Visible, OilNode, - transform.with_scale(Vec3::splat(20.)), + transform.with_scale(Vec3::splat(40.)), )); } } diff --git a/src/player/movement.rs b/src/player/movement.rs index 9d749a4..802d8f9 100644 --- a/src/player/movement.rs +++ b/src/player/movement.rs @@ -1,5 +1,5 @@ use avian3d::{math::PI, prelude::*}; -use bevy::{input::mouse::AccumulatedMouseMotion, prelude::*}; +use bevy::{input::mouse::AccumulatedMouseMotion, prelude::*, window::CursorOptions}; use crate::{ player::{Player, PlayerCamera}, @@ -129,6 +129,7 @@ pub fn move_op( } pub fn move_player( + cursor_options: Single<&CursorOptions>, time: Res