aboutsummaryrefslogtreecommitdiff
path: root/server/src/entity
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/entity')
-rw-r--r--server/src/entity/campaign.rs2
-rw-r--r--server/src/entity/customers.rs14
-rw-r--r--server/src/entity/player_portal_pair.rs20
-rw-r--r--server/src/entity/tag_minigame.rs6
-rw-r--r--server/src/entity/tutorial.rs49
5 files changed, 57 insertions, 34 deletions
diff --git a/server/src/entity/campaign.rs b/server/src/entity/campaign.rs
index b7d7d8db..af6de391 100644
--- a/server/src/entity/campaign.rs
+++ b/server/src/entity/campaign.rs
@@ -60,7 +60,7 @@ impl Entity for Gate {
self.active = false;
self.unlocked = self.condition.check(c.scoreboard);
if !self.unlocked {
- c.game.set_tile(self.pos, Some(self.blocker_tile));
+ c.game.set_tile(self.pos, vec![self.blocker_tile]);
}
}
Ok(())
diff --git a/server/src/entity/customers.rs b/server/src/entity/customers.rs
index c1bfb525..2e2f82af 100644
--- a/server/src/entity/customers.rs
+++ b/server/src/entity/customers.rs
@@ -20,7 +20,7 @@ use crate::random_float;
use anyhow::Result;
use hurrycurry_bot::algos::Customer;
use hurrycurry_locale::TrError;
-use hurrycurry_protocol::{Character, PlayerClass};
+use hurrycurry_protocol::{Character, PlayerClass, TileIndex};
use std::random::random;
pub struct Customers {
@@ -47,10 +47,14 @@ impl Entity for Customers {
fn tick(&mut self, mut c: EntityContext) -> Result<(), TrError> {
let chairs = *self.chair_count.get_or_insert_with(|| {
c.game
- .tiles
- .values()
- .filter(|t| c.game.data.tile_name(t.kind) == "chair")
- .count()
+ .tile_index
+ .get(
+ &c.game
+ .data
+ .get_tile_by_name("chair")
+ .unwrap_or(TileIndex(0)),
+ )
+ .map_or(0, |c| c.len())
});
let max_count = (self.scaling_factor * chairs as f32).max(1.) as usize;
diff --git a/server/src/entity/player_portal_pair.rs b/server/src/entity/player_portal_pair.rs
index fd28b774..b525f4ca 100644
--- a/server/src/entity/player_portal_pair.rs
+++ b/server/src/entity/player_portal_pair.rs
@@ -76,23 +76,31 @@ impl Entity for PlayerPortalPair {
if (self.state == 1 && near_b.is_none() && in_a.is_none())
|| (self.state == -1 && near_a.is_none() && in_b.is_none())
{
- c.game.set_tile(self.b_i, Some(self.neutral_tile));
- c.game.set_tile(self.a_i, Some(self.neutral_tile));
+ c.game.remove_tile_part(self.a_i, self.in_tile);
+ c.game.remove_tile_part(self.a_i, self.out_tile);
+ c.game.add_tile_part(self.a_i, self.neutral_tile);
+ c.game.remove_tile_part(self.b_i, self.in_tile);
+ c.game.remove_tile_part(self.b_i, self.out_tile);
+ c.game.add_tile_part(self.b_i, self.neutral_tile);
self.state = 0;
return Ok(());
}
if self.state == 0 && in_a.is_some() {
- c.game.set_tile(self.a_i, Some(self.in_tile));
- c.game.set_tile(self.b_i, Some(self.out_tile));
+ c.game.remove_tile_part(self.a_i, self.neutral_tile);
+ c.game.remove_tile_part(self.b_i, self.neutral_tile);
+ c.game.add_tile_part(self.a_i, self.in_tile);
+ c.game.add_tile_part(self.b_i, self.out_tile);
self.state = 1;
self.delay = 0.2;
return Ok(());
}
if self.state == 0 && in_b.is_some() {
- c.game.set_tile(self.b_i, Some(self.in_tile));
- c.game.set_tile(self.a_i, Some(self.out_tile));
+ c.game.remove_tile_part(self.b_i, self.neutral_tile);
+ c.game.remove_tile_part(self.a_i, self.neutral_tile);
+ c.game.add_tile_part(self.b_i, self.in_tile);
+ c.game.add_tile_part(self.a_i, self.out_tile);
self.state = -1;
self.delay = 0.2;
return Ok(());
diff --git a/server/src/entity/tag_minigame.rs b/server/src/entity/tag_minigame.rs
index e45422b7..48558b41 100644
--- a/server/src/entity/tag_minigame.rs
+++ b/server/src/entity/tag_minigame.rs
@@ -100,7 +100,7 @@ impl Entity for TagMinigame {
.filter(|(_, v)| **v <= 0.)
.for_each(|(&pos, _)| {
self.wall_remove_timeouts.insert(pos, 3.);
- c.game.set_tile(pos, Some(self.blocker_tile));
+ c.game.add_tile_part(pos, self.blocker_tile);
});
self.wall_place_delays.retain(|_, v| *v > 0.);
@@ -111,9 +111,7 @@ impl Entity for TagMinigame {
.iter()
.filter(|(_, v)| **v <= 0.)
.for_each(|(&pos, _)| {
- if let Some(&(tile, _)) = c.serverdata.initial_map.get(&pos) {
- c.game.set_tile(pos, Some(tile));
- }
+ c.game.remove_tile_part(pos, self.blocker_tile);
});
self.wall_remove_timeouts.retain(|_, v| *v > 0.);
diff --git a/server/src/entity/tutorial.rs b/server/src/entity/tutorial.rs
index d1390b20..87896a09 100644
--- a/server/src/entity/tutorial.rs
+++ b/server/src/entity/tutorial.rs
@@ -169,10 +169,9 @@ impl StepContext<'_> {
fn find_tile(&self, tile: TileIndex) -> Option<IVec2> {
self.ent
.game
- .tiles
- .iter()
- .find(|(_, t)| t.kind == tile)
- .map(|(p, _)| *p)
+ .tile_index
+ .get(&tile)
+ .and_then(|s| s.iter().next().copied())
}
fn aquire_placed_item(&mut self, item: ItemIndex) -> Result<IVec2, (Option<IVec2>, Message)> {
debug!(
@@ -193,9 +192,14 @@ impl StepContext<'_> {
}) {
Err((
Some(*pos),
- match self.ent.game.data.tile_name(tile.kind) {
- "stove" | "oven" => trm!("s.tutorial.prevent_burning"),
- _ => trm!("s.tutorial.take_now"),
+ if tile
+ .parts
+ .iter()
+ .any(|p| matches!(self.ent.game.data.tile_name(*p), "stove" | "oven"))
+ {
+ trm!("s.tutorial.prevent_burning")
+ } else {
+ trm!("s.tutorial.take_now")
},
))
} else {
@@ -288,11 +292,16 @@ impl StepContext<'_> {
speed,
..
} => {
- for (pos, tile) in self.ent.game.tiles.iter().filter(|(_, t)| t.kind == *tile) {
- if let Some(item) = &tile.item
- && item.kind == *input
- {
- return Err((Some(*pos), trm!("s.tutorial.hold_interact")));
+ if let Some(tiles) = self.ent.game.tile_index.get(tile) {
+ for pos in tiles {
+ let Some(tile) = self.ent.game.tiles.get(pos) else {
+ continue;
+ };
+ if let Some(item) = &tile.item
+ && item.kind == *input
+ {
+ return Err((Some(*pos), trm!("s.tutorial.hold_interact")));
+ }
}
}
if let Some(pos) = self.find_tile(*tile) {
@@ -312,12 +321,16 @@ impl StepContext<'_> {
input,
..
} => {
- for (_pos, tile) in self.ent.game.tiles.iter().filter(|(_, t)| t.kind == *tile)
- {
- if let Some(item) = &tile.item
- && item.kind == *input
- {
- return Err((None, trm!("s.tutorial.wait_finish")));
+ if let Some(tiles) = self.ent.game.tile_index.get(tile) {
+ for pos in tiles {
+ let Some(tile) = self.ent.game.tiles.get(pos) else {
+ continue;
+ };
+ if let Some(item) = &tile.item
+ && item.kind == *input
+ {
+ return Err((None, trm!("s.tutorial.wait_finish")));
+ }
}
}
if let Some(pos) = self.find_tile(*tile) {