aboutsummaryrefslogtreecommitdiff
path: root/server/game-core/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/game-core/src/lib.rs')
-rw-r--r--server/game-core/src/lib.rs85
1 files changed, 52 insertions, 33 deletions
diff --git a/server/game-core/src/lib.rs b/server/game-core/src/lib.rs
index a0d4d05d..bee97652 100644
--- a/server/game-core/src/lib.rs
+++ b/server/game-core/src/lib.rs
@@ -47,7 +47,7 @@ pub struct Item {
}
pub struct Tile {
- pub kind: TileIndex,
+ pub parts: Vec<TileIndex>,
pub item: Option<Item>,
}
@@ -82,6 +82,7 @@ pub struct Game {
pub item_locations_index: HashSet<ItemLocation>,
pub events: VecDeque<PacketC>,
+ pub map_changes: HashSet<IVec2>,
}
impl Game {
@@ -165,12 +166,10 @@ impl Game {
});
}
}
- PacketC::UpdateMap {
- tile,
- kind,
- neighbors: _,
- } => {
- self.set_tile(tile, kind);
+ PacketC::UpdateMap { changes } => {
+ for (pos, tiles) in changes {
+ self.set_tile(pos, tiles);
+ }
}
PacketC::Communicate {
player,
@@ -196,32 +195,58 @@ impl Game {
}
}
- pub fn set_tile(&mut self, pos: IVec2, kind: Option<TileIndex>) {
+ pub fn set_tile(&mut self, pos: IVec2, parts: Vec<TileIndex>) {
self.tiles.remove(&pos);
self.walkable.remove(&pos);
- if let Some(prev) = self.tiles.get(&pos)
- && let Some(set) = self.tile_index.get_mut(&prev.kind)
- {
- set.remove(&pos);
- }
- if let Some(kind) = kind {
- self.tiles.insert(pos, Tile { kind, item: None });
- if !self.data_index.tile_collide[kind.0] {
- self.walkable.insert(pos);
+ if let Some(prev) = self.tiles.get(&pos) {
+ for &part in &prev.parts {
+ self.tile_index.entry(part).or_default().remove(&pos);
}
- self.tile_index.entry(kind).or_default().insert(pos);
}
- self.events.push_back(PacketC::UpdateMap {
- tile: pos,
- kind,
- neighbors: [
- self.tiles.get(&(pos + IVec2::NEG_Y)).map(|e| e.kind),
- self.tiles.get(&(pos + IVec2::NEG_X)).map(|e| e.kind),
- self.tiles.get(&(pos + IVec2::Y)).map(|e| e.kind),
- self.tiles.get(&(pos + IVec2::X)).map(|e| e.kind),
- ],
+ if self.data.walkable(&parts) {
+ self.walkable.insert(pos);
+ }
+ for &part in &parts {
+ self.tile_index.entry(part).or_default().insert(pos);
+ }
+ if !parts.is_empty() {
+ self.tiles.insert(pos, Tile { parts, item: None });
+ }
+ self.map_changes.insert(pos);
+ }
+ pub fn add_tile_part(&mut self, pos: IVec2, part: TileIndex) {
+ self.map_changes.insert(pos);
+ let tile = self.tiles.entry(pos).or_insert(Tile {
+ item: None,
+ parts: vec![],
});
+ if tile.parts.contains(&part) {
+ return;
+ }
+ tile.parts.push(part);
+ self.tile_index.entry(part).or_default().insert(pos);
+ self.walkable.remove(&pos);
+ if self.data.walkable(&tile.parts) {
+ self.walkable.insert(pos);
+ }
}
+ pub fn remove_tile_part(&mut self, pos: IVec2, part: TileIndex) {
+ let Some(tile) = self.tiles.get_mut(&pos) else {
+ return;
+ };
+ let lb = tile.parts.len();
+ tile.parts.retain(|&p| p != part);
+ if tile.parts.len() == lb {
+ return;
+ }
+ self.map_changes.insert(pos);
+ self.tile_index.entry(part).or_default().remove(&pos);
+ self.walkable.remove(&pos);
+ if self.data.walkable(&tile.parts) {
+ self.walkable.insert(pos);
+ }
+ }
+
pub fn set_item(&mut self, pos: IVec2, kind: Option<ItemIndex>) {
let Some(tile) = self.tiles.get_mut(&pos) else {
return;
@@ -292,9 +317,3 @@ impl Game {
PlayerID(self.player_id_counter)
}
}
-
-impl From<TileIndex> for Tile {
- fn from(kind: TileIndex) -> Self {
- Self { kind, item: None }
- }
-}