diff options
-rw-r--r-- | client/scenes/progress.tscn | 18 | ||||
-rw-r--r-- | client/scripts/controllable_player.gd | 7 | ||||
-rw-r--r-- | client/scripts/game.gd | 12 | ||||
-rw-r--r-- | client/scripts/item.gd | 11 | ||||
-rw-r--r-- | client/scripts/progress.gd | 7 | ||||
-rw-r--r-- | client/scripts/tiles/floor.gd | 8 | ||||
-rw-r--r-- | client/textures/progress.gdshader | 28 |
7 files changed, 86 insertions, 5 deletions
diff --git a/client/scenes/progress.tscn b/client/scenes/progress.tscn new file mode 100644 index 00000000..8ac60bc6 --- /dev/null +++ b/client/scenes/progress.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=5 format=3 uid="uid://4ewufm6tqhpb"] + +[ext_resource type="Shader" path="res://textures/progress.gdshader" id="1_6f2a0"] +[ext_resource type="Script" path="res://scripts/progress.gd" id="2_bb3u3"] + +[sub_resource type="QuadMesh" id="QuadMesh_m0itj"] +size = Vector2(0.75, 0.1) + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_4k6cy"] +render_priority = 0 +shader = ExtResource("1_6f2a0") +shader_parameter/progress = 0.5 +shader_parameter/bad = true + +[node name="Progress" type="MeshInstance3D"] +mesh = SubResource("QuadMesh_m0itj") +surface_material_override/0 = SubResource("ShaderMaterial_4k6cy") +script = ExtResource("2_bb3u3") diff --git a/client/scripts/controllable_player.gd b/client/scripts/controllable_player.gd index debb86dd..dce81d06 100644 --- a/client/scripts/controllable_player.gd +++ b/client/scripts/controllable_player.gd @@ -74,15 +74,14 @@ func interact(): int(floor(position.z + cos(rotation.y))) ) var tile_idx = str(target) + var t: Floor = game.map.tile_by_pos.get(tile_idx) if Input.is_action_just_pressed("interact"): Multiplayer.send_interact(target, true) - if game.map.tile_by_pos.has(tile_idx): - var t: Floor = game.map.tile_by_pos[tile_idx] + if t != null: t.interact() elif Input.is_action_just_released("interact"): Multiplayer.send_interact(target, false) - if game.map.tile_by_pos.has(tile_idx): - var t: Floor = game.map.tile_by_pos[tile_idx] + if t != null: game.marker.visible = true game.marker_target = t.item_base.global_position else: diff --git a/client/scripts/game.gd b/client/scripts/game.gd index 44875056..5d127e78 100644 --- a/client/scripts/game.gd +++ b/client/scripts/game.gd @@ -38,7 +38,7 @@ func _ready(): players.erase(id) player.queue_free() ) - + Multiplayer.connect("set_tile_item", func(tile: Vector2i, item: int): var t: Floor = map.tile_by_pos[str(tile)] var i = Item.new(item, t.item_base) @@ -77,6 +77,16 @@ func _ready(): p.put_item(t) ) + Multiplayer.connect("set_progress", func(tile: Vector2i, progress: float, warn: bool): + var t: FullTile = map.tile_by_pos[str(tile)] + t.progress(progress, warn) + ) + + Multiplayer.connect("set_finished", func(tile: Vector2i, warn: bool): + var t: FullTile = map.tile_by_pos[str(tile)] + t.finish(warn) + ) + Multiplayer.send_join("Blub", 1) diff --git a/client/scripts/item.gd b/client/scripts/item.gd index c3fba434..5c73db9f 100644 --- a/client/scripts/item.gd +++ b/client/scripts/item.gd @@ -3,7 +3,12 @@ extends Node3D var owned_by: Node3D +var progress_instance: ProgressBar3D = preload("res://scenes/progress.tscn").instantiate() + func _init(idx: int, owned_by_: Node3D): + progress_instance.position.y = 2. + add_child(progress_instance) + progress_instance.visible = false match Multiplayer.item_names[idx]: var t: add_child(load("res://models/prefabs/map/bag.tscn").instantiate()) @@ -28,3 +33,9 @@ func _ready(): func _process(delta): position = lerp(position, owned_by.global_position, delta * 30.0) +func progress(p: float, warn: bool): + progress_instance.visible = true + progress_instance.set_progress(p, warn) + +func finish(warn: bool): + progress_instance.visible = false diff --git a/client/scripts/progress.gd b/client/scripts/progress.gd new file mode 100644 index 00000000..22a2392f --- /dev/null +++ b/client/scripts/progress.gd @@ -0,0 +1,7 @@ +class_name ProgressBar3D +extends MeshInstance3D + +func set_progress(progress: float, bad: bool): + var mat: ShaderMaterial = self.get_active_material(0) + mat.set_shader_parameter("progress", progress) + mat.set_shader_parameter("bad", bad) diff --git a/client/scripts/tiles/floor.gd b/client/scripts/tiles/floor.gd index 0c4af8a0..380f3d6d 100644 --- a/client/scripts/tiles/floor.gd +++ b/client/scripts/tiles/floor.gd @@ -41,6 +41,14 @@ static func interact_target() -> Vector3: func interact(): pass +func progress(p: float, warn: bool): + if item != null: + item.progress(p, warn) + +func finish(warn: bool): + if item != null: + item.finish(warn) + func put_item(i: Item): if item != null: push_error("already holding an item") diff --git a/client/textures/progress.gdshader b/client/textures/progress.gdshader new file mode 100644 index 00000000..0bf3e04a --- /dev/null +++ b/client/textures/progress.gdshader @@ -0,0 +1,28 @@ +shader_type spatial; + +uniform float progress = 0.; +uniform bool bad = false; + +void fragment() { + vec3 color = vec3(0., 1., 0.); + float alpha_fac = 1.; + if (bad) { + color = vec3(1., 0., 0.); + alpha_fac = sin(TIME * 15.) * .5 + 1.; + } + if (UV.x > progress) { + ALPHA = 0.1; + } + ALPHA *= alpha_fac; + ALBEDO = color; +} + +void vertex() { + mat4 modified_model_view = VIEW_MATRIX * mat4( + INV_VIEW_MATRIX[0], + INV_VIEW_MATRIX[1], + INV_VIEW_MATRIX[2], + MODEL_MATRIX[3] + ); + MODELVIEW_MATRIX = modified_model_view; +} |