aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-12-16 02:32:47 +0100
committermetamuffin <metamuffin@disroot.org>2025-12-16 02:32:47 +0100
commite99a71f4f5918e9e43c5f8ff01ce348021f925ea (patch)
treef831db78bd44dba3248e370628e916f29b0aa67d
parentd3ddc7490bbe0b7696faf42ab8510b32fbd86f12 (diff)
downloadhurrycurry-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.gd10
-rw-r--r--client/map/tiles/item_portal.gd2
-rw-r--r--client/map/tiles/player_portal.gd13
-rw-r--r--client/map/tiles/portal.gd12
-rw-r--r--data/maps/debug2.yaml4
-rw-r--r--server/data/src/entities.rs2
-rw-r--r--server/data/src/lib.rs8
-rw-r--r--server/data/src/registry.rs13
-rw-r--r--server/src/entity/mod.rs3
-rw-r--r--server/src/entity/player_portal_pair.rs62
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(())