From a8e792fe129901193258b8db298de9148426b45c Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 6 Apr 2025 18:06:47 +0200 Subject: improve tram smoothing --- server/src/entity/mod.rs | 16 +++++++++++++-- server/src/entity/tram.rs | 50 ++++++++++++++++++----------------------------- 2 files changed, 33 insertions(+), 33 deletions(-) (limited to 'server') 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, points: Vec, + 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, - points: Vec, - index: usize, + pub length: usize, + pub character: i32, + pub ids: Vec, + pub points: Vec, + pub progress: f32, + pub spacing: f32, + pub smoothing: f32, } -impl Tram { - pub fn new(character: i32, length: usize, points: Vec) -> 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 }; -- cgit v1.2.3-70-g09d2