diff options
author | metamuffin <metamuffin@disroot.org> | 2025-04-06 18:06:47 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-04-06 18:06:47 +0200 |
commit | a8e792fe129901193258b8db298de9148426b45c (patch) | |
tree | da6e19079e164885fe5dae5b291038c1ac0605ad /server | |
parent | b7a59798ea69b403b14de128bc505d9bcb29fa4c (diff) | |
download | hurrycurry-a8e792fe129901193258b8db298de9148426b45c.tar hurrycurry-a8e792fe129901193258b8db298de9148426b45c.tar.bz2 hurrycurry-a8e792fe129901193258b8db298de9148426b45c.tar.zst |
improve tram smoothing
Diffstat (limited to 'server')
-rw-r--r-- | server/src/entity/mod.rs | 16 | ||||
-rw-r--r-- | server/src/entity/tram.rs | 50 |
2 files changed, 33 insertions, 33 deletions
diff --git a/server/src/entity/mod.rs b/server/src/entity/mod.rs index 60f02d2a..ddafc2f7 100644 --- a/server/src/entity/mod.rs +++ b/server/src/entity/mod.rs @@ -1,6 +1,6 @@ /* Hurry Curry! - a game about cooking - Copyright 2024 metamuffin + Copyright 2025 metamuffin This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by @@ -139,6 +139,8 @@ pub enum EntityDecl { length: usize, character: Option<i32>, points: Vec<Vec2>, + spacing: f32, + smoothing: f32, }, Book, } @@ -209,6 +211,16 @@ pub fn construct_entity( length, character, points, - } => Box::new(Tram::new(character.unwrap_or(51), length, points)), + smoothing, + spacing, + } => Box::new(Tram { + length, + character: character.unwrap_or(51), + ids: Vec::new(), + points, + progress: 0., + spacing, + smoothing, + }), }) } diff --git a/server/src/entity/tram.rs b/server/src/entity/tram.rs index 27c3bcbb..5b7fcaa8 100644 --- a/server/src/entity/tram.rs +++ b/server/src/entity/tram.rs @@ -21,24 +21,15 @@ use hurrycurry_protocol::{glam::Vec2, PacketS, PlayerClass, PlayerID}; use rand::random; pub struct Tram { - length: usize, - character: i32, - ids: Vec<PlayerID>, - points: Vec<Vec2>, - index: usize, + pub length: usize, + pub character: i32, + pub ids: Vec<PlayerID>, + pub points: Vec<Vec2>, + pub progress: f32, + pub spacing: f32, + pub smoothing: f32, } -impl Tram { - pub fn new(character: i32, length: usize, points: Vec<Vec2>) -> Self { - Self { - character, - ids: Vec::new(), - length, - points, - index: 0, - } - } -} impl Entity for Tram { fn finished(&self) -> bool { false @@ -57,22 +48,19 @@ impl Entity for Tram { } } - let mut ppos = None; - for id in &self.ids { - if let Some(p) = c.game.players.get(id) { - let target = if let Some(pos) = ppos { - pos - } else { - let tar = self.points[self.index]; - if p.movement.position.distance(tar) < 2. { - self.index += 1; - self.index %= self.points.len(); - } - tar + for (i, id) in self.ids.iter().enumerate() { + if let Some(player) = c.game.players.get(id) { + let t = self.progress + self.spacing * i as f32; + let i = t.trunc() as usize; + let p_a = self.points[i % self.points.len()]; + let p_b = self.points[(i + 1) % self.points.len()]; + let p = p_a.lerp(p_b, t.fract()); + if p.distance(player.movement.position) < self.smoothing { + self.progress += 0.1; + self.progress %= self.points.len() as f32; }; - ppos = Some(p.movement.position); - let dir = if p.movement.position.distance(target) > 2. { - target - p.movement.position + let dir = if player.movement.position.distance(p) > self.smoothing * 0.8 { + p - player.movement.position } else { Vec2::ZERO }; |