From 4d883a67ef81ef9428e39734664430724668077f Mon Sep 17 00:00:00 2001 From: nokoe Date: Mon, 29 Sep 2025 23:57:44 +0200 Subject: use deep fryer basket; persist item rotation on counters --- client/game.gd | 6 ++++++ client/global.gd | 4 ++-- client/map/deep_fryer_basket.res | Bin 14285 -> 14274 bytes client/map/items/basket.gd | 7 ++++++- client/map/items/basket.tscn | 2 +- client/map/items/deep_frying.tscn | 26 ++++++++++++++++++++++++++ client/map/items/item.gd | 9 +++++---- client/map/tiles/deep_fryer.gd | 5 +++++ client/map/tiles/floor_like.gd | 1 + client/map/tiles/tile.gd | 10 ++++++++-- client/player/player.gd | 4 ++++ 11 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 client/map/items/deep_frying.tscn (limited to 'client') diff --git a/client/game.gd b/client/game.gd index efb75c9f..7289eed0 100644 --- a/client/game.gd +++ b/client/game.gd @@ -189,6 +189,9 @@ func handle_packet(p): var i = ItemFactory.produce(item_names[p.item], t.item_base) i.animate_spawn() i.position = t.item_base.global_position + i.rotation.y = t.item_base.global_rotation.y + PI + i.position_target = i.position + i.rotation_target = i.rotation.y add_child(i) i.name = item_names[p.item] t.set_item(i) @@ -198,6 +201,9 @@ func handle_packet(p): var i = ItemFactory.produce(item_names[p.item], pl.hand_base[h]) i.animate_spawn() i.position = pl.hand_base[h].global_position + i.rotation.y = pl.hand_base[h].global_rotation.y + i.position_target = i.position + i.rotation_target = i.rotation.y add_child(i) i.name = item_names[p.item] pl.set_item(i, h) diff --git a/client/global.gd b/client/global.gd index a3f6de6b..35fd215e 100644 --- a/client/global.gd +++ b/client/global.gd @@ -97,13 +97,13 @@ static func interpolate_angle(current, target, dt) -> float: return target + (current - target) * exp(-dt) # TODO not working in all cases yet but there was an attempt -static func interpolate_angle_closest_quarter(current, target, dt): +static func angle_closest_quarter(current, target) -> float: current = fmod(current, PI * 2) target = fmod(target, PI * 2) while abs(target - current) > PI / 4.: if target - current < 0: target += PI / 2 else: target -= PI / 2 - return target + (current - target) * exp(-dt) + return target func find_menu(node: Node) -> Menu: if node is Menu: return node diff --git a/client/map/deep_fryer_basket.res b/client/map/deep_fryer_basket.res index afcb1889..40f1c05d 100644 Binary files a/client/map/deep_fryer_basket.res and b/client/map/deep_fryer_basket.res differ diff --git a/client/map/items/basket.gd b/client/map/items/basket.gd index 459d6b81..d90ab25e 100644 --- a/client/map/items/basket.gd +++ b/client/map/items/basket.gd @@ -17,12 +17,15 @@ class_name Basket extends Item var steam: CPUParticles3D = load("res://map/items/steam.tscn").instantiate() +var bubbles: CPUParticles3D = load("res://map/items/deep_frying.tscn").instantiate() func _init(owned_by_: Node3D, contents: Array): super(owned_by_) add_child(load("res://map/items/basket.tscn").instantiate()) base.add_child(steam) - + base.add_child(bubbles) + base.position.y = .15 + for i in contents: match i: _: @@ -31,6 +34,7 @@ func _init(owned_by_: Node3D, contents: Array): func progress(position_: float, speed: float, warn: bool): super(position_, speed, warn) steam.emitting = true + bubbles.emitting = true if warn: steam.color = Color(.2, .2, .2) else: @@ -39,6 +43,7 @@ func progress(position_: float, speed: float, warn: bool): func finish(): super() steam.emitting = false + bubbles.emitting = false static func base_position() -> Vector3: return Vector3(0.,0.015, 0.) diff --git a/client/map/items/basket.tscn b/client/map/items/basket.tscn index c6f92a50..2fcd336d 100644 --- a/client/map/items/basket.tscn +++ b/client/map/items/basket.tscn @@ -5,5 +5,5 @@ [node name="Basket" type="Node3D"] [node name="Mesh" type="MeshInstance3D" parent="."] -transform = Transform3D(0.75, 0, 0, 0, 0.75, 0, 0, 0, 0.75, 0, 0, 0) +transform = Transform3D(-0.75, 0, -6.556708e-08, 0, 0.75, 0, 6.556708e-08, 0, -0.75, 0, 0, 0) mesh = ExtResource("1_7yj46") diff --git a/client/map/items/deep_frying.tscn b/client/map/items/deep_frying.tscn new file mode 100644 index 00000000..81a4ccfb --- /dev/null +++ b/client/map/items/deep_frying.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=3 format=3 uid="uid://c2g5ncvn45263"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3xkdk"] +albedo_color = Color(0.9153118, 0.62961817, 0.44200557, 1) +roughness = 0.0 + +[sub_resource type="SphereMesh" id="SphereMesh_iygiy"] +material = SubResource("StandardMaterial3D_3xkdk") +radius = 0.1 +height = 0.2 + +[node name="DeepFrying" type="CPUParticles3D"] +emitting = false +mesh = SubResource("SphereMesh_iygiy") +emission_shape = 6 +emission_ring_axis = Vector3(0, 1, 0) +emission_ring_height = 0.1 +emission_ring_radius = 0.1 +emission_ring_inner_radius = 0.05 +emission_ring_cone_angle = 90.0 +direction = Vector3(0, 1, 0) +gravity = Vector3(0, -1, 0) +initial_velocity_min = 0.2 +initial_velocity_max = 0.4 +scale_amount_min = 0.2 +scale_amount_max = 0.5 diff --git a/client/map/items/item.gd b/client/map/items/item.gd index bf61966f..ea5b3937 100644 --- a/client/map/items/item.gd +++ b/client/map/items/item.gd @@ -20,6 +20,8 @@ const CHECKMARK: PackedScene = preload("uid://bdbw8whs3data") var owned_by: Node3D var base: Node3D = Node3D.new() +var rotation_target: float = 0. +var position_target: Vector3 = Vector3(0., 0., 0.) var progress_instance: Progress3D = preload("res://map/progress/progress.tscn").instantiate() var take_sound: PlayRandom = preload("res://audio/play_random.tscn").instantiate() @@ -63,12 +65,11 @@ func _process(delta): var player_owned = owned_by.get_parent().get_parent() is Player player_owned_timer = player_owned_timer + delta if player_owned else 0. var anim_speed = 10.0 * exp(player_owned_timer * 3.0) # infinity is fine. G.interpolate can handle it - position = G.interpolate(position, owned_by.global_position, delta * anim_speed) - if player_owned: rotation.y = G.interpolate_angle(rotation.y, owned_by.global_rotation.y, delta * anim_speed) - else: rotation.y = G.interpolate_angle_closest_quarter(rotation.y, owned_by.global_rotation.y, delta * anim_speed) + position = G.interpolate(position, position_target, delta * anim_speed) + rotation.y = G.interpolate_angle(rotation.y, rotation_target, delta * anim_speed) if creation_timer != null: creation_timer += delta * 10.0 - if creation_timer > 1: + if creation_timer > 1: scale = Vector3.ONE creation_timer = null else: scale = Vector3.ONE * creation_timer diff --git a/client/map/tiles/deep_fryer.gd b/client/map/tiles/deep_fryer.gd index b5951630..82204cb8 100644 --- a/client/map/tiles/deep_fryer.gd +++ b/client/map/tiles/deep_fryer.gd @@ -22,5 +22,10 @@ func _init(ctx: TileFactory.TileCC): super(ctx) base.add_child(deep_fryer) +func set_item(i: Item): + super(i) + if i != null: + i.rotation_target = item_base.global_rotation.y + PI + static func interact_target() -> Vector3: return Vector3(0., 0.55, 0.) diff --git a/client/map/tiles/floor_like.gd b/client/map/tiles/floor_like.gd index d3da5fe0..228a95e9 100644 --- a/client/map/tiles/floor_like.gd +++ b/client/map/tiles/floor_like.gd @@ -13,6 +13,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # +@abstract class_name FloorLike extends Tile diff --git a/client/map/tiles/tile.gd b/client/map/tiles/tile.gd index 7cf7be9b..9d4d732e 100644 --- a/client/map/tiles/tile.gd +++ b/client/map/tiles/tile.gd @@ -77,9 +77,15 @@ func pass_to(tile: Tile): tile.set_item(i) func set_item(i: Item): - if item != null: item.remove() + if item != null: + if i != null: + i.rotation.y = item.rotation.y + i.rotation_target = item.rotation_target + item.remove() item = i - if i != null: i.owned_by = item_base + if i != null: + i.owned_by = item_base + i.position_target = item_base.global_position func take_item() -> Item: var i = item diff --git a/client/player/player.gd b/client/player/player.gd index 94034352..58ae9732 100644 --- a/client/player/player.gd +++ b/client/player/player.gd @@ -166,6 +166,10 @@ func pass_to(player: Player, hfrom: int, hto: int): player.set_item(i, hto) func _process(delta): + for h in hand.size(): + if hand[h] != null: + hand[h].rotation_target = hand_base[h].global_rotation.y + hand[h].position_target = hand_base[h].global_position _anim_angle = fmod(_anim_angle + delta, TAU) position_anim = G.interpolate(position_anim, position_, delta * 10) rotation_anim = G.interpolate_angle(rotation_anim, rotation_, delta * 10) -- cgit v1.2.3-70-g09d2