diff options
Diffstat (limited to 'server/game-core/src/lib.rs')
| -rw-r--r-- | server/game-core/src/lib.rs | 85 |
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 } - } -} |