aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-04-06 18:06:47 +0200
committermetamuffin <metamuffin@disroot.org>2025-04-06 18:06:47 +0200
commita8e792fe129901193258b8db298de9148426b45c (patch)
treeda6e19079e164885fe5dae5b291038c1ac0605ad /server
parentb7a59798ea69b403b14de128bc505d9bcb29fa4c (diff)
downloadhurrycurry-a8e792fe129901193258b8db298de9148426b45c.tar
hurrycurry-a8e792fe129901193258b8db298de9148426b45c.tar.bz2
hurrycurry-a8e792fe129901193258b8db298de9148426b45c.tar.zst
improve tram smoothing
Diffstat (limited to 'server')
-rw-r--r--server/src/entity/mod.rs16
-rw-r--r--server/src/entity/tram.rs50
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
};