diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-12-16 02:32:47 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-12-16 02:32:47 +0100 |
| commit | e99a71f4f5918e9e43c5f8ff01ce348021f925ea (patch) | |
| tree | f831db78bd44dba3248e370628e916f29b0aa67d | |
| parent | d3ddc7490bbe0b7696faf42ab8510b32fbd86f12 (diff) | |
| download | hurrycurry-e99a71f4f5918e9e43c5f8ff01ce348021f925ea.tar hurrycurry-e99a71f4f5918e9e43c5f8ff01ce348021f925ea.tar.bz2 hurrycurry-e99a71f4f5918e9e43c5f8ff01ce348021f925ea.tar.zst | |
Add grey holes; player portal pair rest state is grey holes
| -rw-r--r-- | client/map/tile_factory.gd | 10 | ||||
| -rw-r--r-- | client/map/tiles/item_portal.gd | 2 | ||||
| -rw-r--r-- | client/map/tiles/player_portal.gd | 13 | ||||
| -rw-r--r-- | client/map/tiles/portal.gd | 12 | ||||
| -rw-r--r-- | data/maps/debug2.yaml | 4 | ||||
| -rw-r--r-- | server/data/src/entities.rs | 2 | ||||
| -rw-r--r-- | server/data/src/lib.rs | 8 | ||||
| -rw-r--r-- | server/data/src/registry.rs | 13 | ||||
| -rw-r--r-- | server/src/entity/mod.rs | 3 | ||||
| -rw-r--r-- | server/src/entity/player_portal_pair.rs | 62 |
10 files changed, 81 insertions, 48 deletions
diff --git a/client/map/tile_factory.gd b/client/map/tile_factory.gd index f3fddfe7..4cd8c745 100644 --- a/client/map/tile_factory.gd +++ b/client/map/tile_factory.gd @@ -47,8 +47,6 @@ func produce(raw_name: String, position: Vector2i, neighbors: Array) -> Tile: ctx.floor_meshers = floor_meshers match tile_name.name: - "black-hole-counter": return ItemPortal.new(ctx, false) - "black-hole": return PlayerPortal.new(ctx, false) "book": return CounterBase.new(ctx, preload("res://map/tiles/book.tscn")) "ceiling-lamp": return GenericTile.new(ctx, preload("res://map/tiles/ceiling_lamp.tscn")) "chair": return Chair.new(ctx) @@ -76,8 +74,12 @@ func produce(raw_name: String, position: Vector2i, neighbors: Array) -> Tile: "tree": return ExteriorTree.new(ctx) "wall-window": return WallWindow.new(ctx) "wall": return Wall.new(ctx) - "white-hole-counter": return ItemPortal.new(ctx, true) - "white-hole": return PlayerPortal.new(ctx, true) + "white-hole-counter": return ItemPortal.new(ctx, 1) + "white-hole": return PlayerPortal.new(ctx) + "grey-hole-counter": return ItemPortal.new(ctx, 0) + "grey-hole": return PlayerPortal.new(ctx) + "black-hole-counter": return ItemPortal.new(ctx, -1) + "black-hole": return PlayerPortal.new(ctx) "house-balcony": return HouseBalcony.new(ctx) "house-door": return HouseDoor.new(ctx) diff --git a/client/map/tiles/item_portal.gd b/client/map/tiles/item_portal.gd index f9d2a2ec..6d292bde 100644 --- a/client/map/tiles/item_portal.gd +++ b/client/map/tiles/item_portal.gd @@ -17,6 +17,6 @@ class_name ItemPortal extends CounterBase var model := preload("res://map/tiles/portal.tscn") -func _init(ctx: TileFactory.TileCC, type: bool): +func _init(ctx: TileFactory.TileCC, type: float): super(ctx, model) model.configure(0.2, type) diff --git a/client/map/tiles/player_portal.gd b/client/map/tiles/player_portal.gd index 222f84ee..8339a797 100644 --- a/client/map/tiles/player_portal.gd +++ b/client/map/tiles/player_portal.gd @@ -17,16 +17,13 @@ class_name PlayerPortal extends Floor var model: PortalModel = load("res://map/tiles/portal.tscn").instantiate() -func _init(ctx: TileFactory.TileCC, type: bool): +func _init(ctx: TileFactory.TileCC): super(ctx) - model.configure(0.4, type) + change(ctx.tile_name.name) base.add_child(model) func change(tn: String) -> bool: - if tn == "white-hole": - model.target_type = 1. - return true - if tn == "black-hole": - model.target_type = -1. - return true + if tn == "white-hole": model.target_type = 1.; model.target_size = 0.4; return true + if tn == "grey-hole": model.target_type = 0.; model.target_size = 0.2; return true + if tn == "black-hole": model.target_type = -1.; model.target_size = 0.4; return true return false diff --git a/client/map/tiles/portal.gd b/client/map/tiles/portal.gd index 75da4980..dbb882c5 100644 --- a/client/map/tiles/portal.gd +++ b/client/map/tiles/portal.gd @@ -20,17 +20,13 @@ var target_type = 0. var current_type = 0. var target_size = 0. var current_size = 0. -var mat: ShaderMaterial - -func configure(size: float, type: bool): - mat = $Mesh.get_active_material(0) - target_type = 1. if type else -1. - target_size = size +@onready var mat: ShaderMaterial = $Mesh.get_active_material(0) func _process(delta: float) -> void: + if not mat: return if abs(target_type - current_type) > 0.01: - current_type = G.interpolate(current_type, target_type, delta * 10.) + current_type = G.interpolate(current_type, target_type, delta * 15.) mat.set_shader_parameter("type", current_type) if abs(target_size - current_size) > 0.01: - current_size = G.interpolate(current_size, target_size, delta * 3.) + current_size = G.interpolate(current_size, target_size, delta * 5.) mat.set_shader_parameter("size", current_size) diff --git a/data/maps/debug2.yaml b/data/maps/debug2.yaml index ea87df8b..878c1d41 100644 --- a/data/maps/debug2.yaml +++ b/data/maps/debug2.yaml @@ -20,9 +20,9 @@ map: - "TTT+...................." - "|||H...................." - "........................" - - "....~..................." - "........................" - "........................" + - "....~..................." - "........................" - "........................" - "........................" @@ -51,7 +51,7 @@ tiles: "D": house-door -c entities: - - !player_portal_pair { a: [5, 8], b: [10, 8] } + - !player_portal_pair { a: [5, 8], b: [15, 8] } - !environment_effect { name: rain, on: 60, off: 40 } - !environment_effect { name: wind, on: 60, off: 40 } # - !tram diff --git a/server/data/src/entities.rs b/server/data/src/entities.rs index 62947b05..cd1ba18d 100644 --- a/server/data/src/entities.rs +++ b/server/data/src/entities.rs @@ -44,6 +44,8 @@ pub enum EntityDecl { #[serde(default = "default_tile")] in_tile: TileIndex, #[serde(default = "default_tile")] + neutral_tile: TileIndex, + #[serde(default = "default_tile")] out_tile: TileIndex, }, Customers { diff --git a/server/data/src/lib.rs b/server/data/src/lib.rs index d06aadd1..b490fbc2 100644 --- a/server/data/src/lib.rs +++ b/server/data/src/lib.rs @@ -225,11 +225,15 @@ fn build_data( exclusive_tiles.entry(*blocker_tile).or_default(); } EntityDecl::PlayerPortalPair { - in_tile, out_tile, .. + in_tile, + out_tile, + neutral_tile, + .. } => { *in_tile = reg.register_tile("black-hole".to_owned()); + *neutral_tile = reg.register_tile("grey-hole".to_owned()); *out_tile = reg.register_tile("white-hole".to_owned()); - tile_walkable.extend([*in_tile, *out_tile]); + tile_walkable.extend([*in_tile, *neutral_tile, *out_tile]); } _ => (), } diff --git a/server/data/src/registry.rs b/server/data/src/registry.rs index 372df653..f405489b 100644 --- a/server/data/src/registry.rs +++ b/server/data/src/registry.rs @@ -93,8 +93,11 @@ pub(crate) fn filter_unused_tiles_and_items(data: &mut Gamedata, serverdata: &mu used_tiles.insert(*blocker_tile); } EntityDecl::PlayerPortalPair { - in_tile, out_tile, .. - } => used_tiles.extend([*in_tile, *out_tile]), + in_tile, + out_tile, + neutral_tile, + .. + } => used_tiles.extend([*in_tile, *out_tile, *neutral_tile]), _ => (), }; } @@ -197,9 +200,13 @@ pub(crate) fn filter_unused_tiles_and_items(data: &mut Gamedata, serverdata: &mu *blocker_tile = tile_map[blocker_tile]; } EntityDecl::PlayerPortalPair { - in_tile, out_tile, .. + in_tile, + out_tile, + neutral_tile, + .. } => { *in_tile = tile_map[in_tile]; + *neutral_tile = tile_map[neutral_tile]; *out_tile = tile_map[out_tile]; } _ => (), diff --git a/server/src/entity/mod.rs b/server/src/entity/mod.rs index ee8a1a74..c10e1dbd 100644 --- a/server/src/entity/mod.rs +++ b/server/src/entity/mod.rs @@ -178,7 +178,8 @@ pub fn construct_entity(decl: &EntityDecl) -> DynEntity { a, b, in_tile, + neutral_tile, out_tile, - } => Box::new(PlayerPortalPair::new(a, b, in_tile, out_tile)), + } => Box::new(PlayerPortalPair::new(a, b, in_tile, neutral_tile, out_tile)), } } diff --git a/server/src/entity/player_portal_pair.rs b/server/src/entity/player_portal_pair.rs index b73f5891..9691ca05 100644 --- a/server/src/entity/player_portal_pair.rs +++ b/server/src/entity/player_portal_pair.rs @@ -30,21 +30,29 @@ pub struct PlayerPortalPair { a_f: Vec2, b_f: Vec2, in_tile: TileIndex, + neutral_tile: TileIndex, out_tile: TileIndex, - a_out: bool, - b_out: bool, + state: i8, + delay: f32, } impl PlayerPortalPair { - pub fn new(a: IVec2, b: IVec2, in_tile: TileIndex, out_tile: TileIndex) -> Self { + pub fn new( + a: IVec2, + b: IVec2, + in_tile: TileIndex, + neutral_tile: TileIndex, + out_tile: TileIndex, + ) -> Self { Self { a_i: a, b_i: b, a_f: a.as_vec2() + vec2(0.5, 0.5), b_f: b.as_vec2() + vec2(0.5, 0.5), in_tile, + neutral_tile, out_tile, - a_out: true, - b_out: true, + state: 1, + delay: 0., } } } @@ -58,38 +66,54 @@ impl Entity for PlayerPortalPair { o }; - if self.a_out && qn(self.a_f, 1.5).is_none() { + self.delay -= c.dt; + + let near_a = qn(self.a_f, 1.5); + let near_b = qn(self.b_f, 1.5); + let in_a = qn(self.a_f, 0.7); + let in_b = qn(self.b_f, 0.7); + + 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)); + self.state = 0; + return Ok(()); + } + + if self.state == 0 && in_a.is_some() { c.game.set_tile(self.a_i, Some(self.in_tile)); - self.a_out = false; + c.game.set_tile(self.b_i, Some(self.out_tile)); + self.state = 1; + self.delay = 0.2; return Ok(()); } - if self.b_out && qn(self.b_f, 1.5).is_none() { + if self.state == 0 && in_b.is_some() { c.game.set_tile(self.b_i, Some(self.in_tile)); - self.b_out = false; + c.game.set_tile(self.a_i, Some(self.out_tile)); + self.state = -1; + self.delay = 0.2; return Ok(()); } - if !self.a_out - && let Some(player) = qn(self.a_f, 0.5) + if self.state == 1 + && self.delay < 0. + && let Some(player) = in_a && let Some(p) = c.game.players.get_mut(&player) { p.movement.position = self.b_f; c.packet_out.push_back(PacketC::MovementSync { player }); - c.game.set_tile(self.b_i, Some(self.out_tile)); - self.b_out = true; - return Ok(()); } - if !self.b_out - && let Some(player) = qn(self.b_f, 0.5) + if self.state == -1 + && self.delay < 0. + && let Some(player) = in_b && let Some(p) = c.game.players.get_mut(&player) { p.movement.position = self.a_f; c.packet_out.push_back(PacketC::MovementSync { player }); - c.game.set_tile(self.a_i, Some(self.out_tile)); - self.a_out = true; - return Ok(()); } Ok(()) |