diff --git a/scenes/circle_timer.tscn b/scenes/circle_timer.tscn new file mode 100644 index 0000000..4a75be0 --- /dev/null +++ b/scenes/circle_timer.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://assets/UI/Meter_Completion.png" type="Texture" id=1] +[ext_resource path="res://shaders/circle_timer.gdshader" type="Shader" id=2] +[ext_resource path="res://scripts/circle_timer.gd" type="Script" id=3] + +[sub_resource type="ShaderMaterial" id=1] +resource_local_to_scene = true +shader = ExtResource( 2 ) +shader_param/albedo = Color( 0, 1, 0.416667, 1 ) +shader_param/percent = 0.0 + +[node name="circle_timer" type="Sprite3D"] +transform = Transform( 0.25, 0, 0, 0, 0.176777, 0.176777, 0, -0.176777, 0.176777, 0, 0, 0 ) +material_override = SubResource( 1 ) +texture = ExtResource( 1 ) +script = ExtResource( 3 ) diff --git a/scenes/crafting_station.tscn b/scenes/crafting_station.tscn index 5bd3e80..c53120e 100644 --- a/scenes/crafting_station.tscn +++ b/scenes/crafting_station.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=8 format=2] [ext_resource path="res://scenes/item_holder.tscn" type="PackedScene" id=1] [ext_resource path="res://scripts/crafting_station/crafting_station.gd" type="Script" id=2] @@ -6,6 +6,7 @@ [ext_resource path="res://scenes/item_dump.tscn" type="PackedScene" id=4] [ext_resource path="res://scenes/status_light.tscn" type="PackedScene" id=5] [ext_resource path="res://item_types/crystal.tres" type="Resource" id=6] +[ext_resource path="res://scenes/circle_timer.tscn" type="PackedScene" id=7] [node name="crafting_station" type="Spatial" groups=["damageable"]] script = ExtResource( 2 ) @@ -42,6 +43,9 @@ visible = false modulate = Color( 0, 0, 0, 1 ) text = "Progress: 20%" +[node name="circle_timer" parent="." instance=ExtResource( 7 )] +transform = Transform( -1.49012e-08, -0.176777, 0.176777, 0, 0.176777, 0.176777, -0.25, 7.45058e-09, -7.45058e-09, 0.722693, 1.42808, 0.107395 ) + [connection signal="coin_requirement_met" from="coin_machine" to="." method="_on_coin_machine_coin_requirement_met"] [connection signal="timeout" from="gen_timer" to="." method="_on_gen_timer_timeout"] [connection signal="item_dump_completed" from="item_dump" to="." method="_on_item_dump_item_dump_completed"] diff --git a/scenes/hydroponics_station.tscn b/scenes/hydroponics_station.tscn index 63bba8b..21447fb 100644 --- a/scenes/hydroponics_station.tscn +++ b/scenes/hydroponics_station.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=8 format=2] [ext_resource path="res://scenes/item_holder.tscn" type="PackedScene" id=1] [ext_resource path="res://scripts/hydroponics_station/hydroponics_station.gd" type="Script" id=2] @@ -6,6 +6,7 @@ [ext_resource path="res://scenes/status_light.tscn" type="PackedScene" id=4] [ext_resource path="res://scenes/item_dump.tscn" type="PackedScene" id=5] [ext_resource path="res://item_types/ingot.tres" type="Resource" id=6] +[ext_resource path="res://scenes/circle_timer.tscn" type="PackedScene" id=7] [node name="hydroponics_station" type="Spatial"] script = ExtResource( 2 ) @@ -35,6 +36,9 @@ omni_attenuation = 0.933034 unique_name_in_owner = true items_required = [ ExtResource( 6 ) ] +[node name="circle_timer" parent="." instance=ExtResource( 7 )] +transform = Transform( 0.25, 0, 0, 0, 0.176777, 0.176777, 0, -0.176777, 0.176777, 0, 1.42433, 0.280864 ) + [connection signal="coin_requirement_met" from="coin_machine" to="." method="_on_coin_machine_coin_requirement_met"] [connection signal="item_changed" from="item_holder" to="." method="_on_item_holder_item_changed"] [connection signal="timeout" from="grow_timer" to="." method="_on_grow_timer_timeout"] diff --git a/scenes/item_generator.tscn b/scenes/item_generator.tscn index 1c50caa..6df6491 100644 --- a/scenes/item_generator.tscn +++ b/scenes/item_generator.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=2] +[gd_scene load_steps=11 format=2] [ext_resource path="res://scenes/coin_machine.tscn" type="PackedScene" id=1] [ext_resource path="res://scenes/item_holder.tscn" type="PackedScene" id=2] @@ -7,6 +7,14 @@ [ext_resource path="res://scenes/status_light.tscn" type="PackedScene" id=5] [ext_resource path="res://item_types/gem.tres" type="Resource" id=6] [ext_resource path="res://item_types/ore.tres" type="Resource" id=7] +[ext_resource path="res://scenes/circle_timer.tscn" type="PackedScene" id=8] +[ext_resource path="res://shaders/circle_timer.gdshader" type="Shader" id=9] + +[sub_resource type="ShaderMaterial" id=1] +resource_local_to_scene = true +shader = ExtResource( 9 ) +shader_param/albedo = Color( 0, 1, 0.416667, 1 ) +shader_param/percent = 0.0 [node name="item_generator" type="Spatial"] transform = Transform( 1, 0, 3.57628e-07, 0, 1, 0, -3.57628e-07, 0, 1, 0.330428, 0, -8.57503 ) @@ -47,6 +55,10 @@ visible = false modulate = Color( 0, 0, 0, 1 ) text = "Progress: 20%" +[node name="circle_timer" parent="." instance=ExtResource( 8 )] +transform = Transform( 0.25, 0, 0, 0, 0.176777, 0.176777, 0, -0.176777, 0.176777, -1.49012e-07, 1.25146, 0.444146 ) +material_override = SubResource( 1 ) + [connection signal="coin_requirement_met" from="coin_machine" to="." method="_on_coin_machine_coin_requirement_met"] [connection signal="timeout" from="gen_timer" to="." method="_on_gen_timer_timeout"] [connection signal="item_dump_completed" from="item_dump" to="." method="_on_item_dump_item_dump_completed"] diff --git a/scenes/main.tscn b/scenes/main.tscn index 3d1b391..f8ea927 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -417,11 +417,11 @@ transform = Transform( 0.502127, 2.91038e-11, 0.487718, 5.82077e-11, 0.7, -5.456 grow_time = 30.0 [node name="hydroponics_station3" parent="Hydroponics_Room" instance=ExtResource( 11 )] -transform = Transform( 0.502127, 3.7835e-10, 0.487718, 5.82077e-11, 0.700001, -1.04592e-10, -0.487718, 2.61934e-10, 0.502128, 1.79792, 0.00590622, -8.91695 ) +transform = Transform( 0.487718, 2.91038e-10, -0.502128, -4.46562e-10, 0.700001, -2.32831e-10, 0.502127, 3.49246e-10, 0.487718, 1.79792, 0.00590622, -8.91695 ) grow_time = 30.0 [node name="hydroponics_station4" parent="Hydroponics_Room" instance=ExtResource( 11 )] -transform = Transform( 0.502127, 3.7835e-10, 0.487718, 5.82077e-11, 0.700001, -2.37378e-10, -0.487718, 3.7835e-10, 0.502128, 3.28563, 0.006777, -7.36006 ) +transform = Transform( 0.487718, 3.7835e-10, -0.502128, -5.0477e-10, 0.700001, -2.32831e-10, 0.502127, 4.36557e-10, 0.487718, 3.28563, 0.006777, -7.36006 ) grow_time = 30.0 [node name="book" parent="Hydroponics_Room" instance=ExtResource( 23 )] diff --git a/scenes/oven.tscn b/scenes/oven.tscn index 6b306e2..5917e3d 100644 --- a/scenes/oven.tscn +++ b/scenes/oven.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=9 format=2] +[gd_scene load_steps=12 format=2] [ext_resource path="res://scenes/item_holder.tscn" type="PackedScene" id=1] [ext_resource path="res://scripts/oven/oven.gd" type="Script" id=2] @@ -7,10 +7,18 @@ [ext_resource path="res://scenes/status_light.tscn" type="PackedScene" id=5] [ext_resource path="res://item_types/repair_kit.tres" type="Resource" id=6] [ext_resource path="res://item_types/ingot.tres" type="Resource" id=7] +[ext_resource path="res://scenes/circle_timer.tscn" type="PackedScene" id=8] +[ext_resource path="res://shaders/circle_timer.gdshader" type="Shader" id=9] [sub_resource type="BoxShape" id=4] extents = Vector3( 0.648623, 1, 0.516904 ) +[sub_resource type="ShaderMaterial" id=5] +resource_local_to_scene = true +shader = ExtResource( 9 ) +shader_param/albedo = Color( 0, 1, 0.416667, 1 ) +shader_param/percent = 0.0 + [node name="oven" type="Spatial" groups=["damageable"]] script = ExtResource( 2 ) @@ -35,6 +43,10 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.868397 ) [node name="cook_timer" type="Timer" parent="."] one_shot = true +[node name="circle_timer" parent="." instance=ExtResource( 8 )] +transform = Transform( 0.25, 0, 0, 0, 0.176777, 0.176777, 0, -0.176777, 0.176777, 0, 0.943779, 1.02976 ) +material_override = SubResource( 5 ) + [connection signal="coin_requirement_met" from="coin_machine" to="." method="_on_coin_machine_coin_requirement_met"] [connection signal="item_dump_completed" from="item_dump" to="." method="_on_item_dump_completed"] [connection signal="item_changed" from="item_holder" to="." method="_on_item_holder_item_changed"] diff --git a/scripts/circle_timer.gd b/scripts/circle_timer.gd new file mode 100644 index 0000000..84e1807 --- /dev/null +++ b/scripts/circle_timer.gd @@ -0,0 +1,24 @@ +extends Sprite3D + +var timer: Timer + +func _ready(): + material_override + +func set_timer(p_timer: Timer): + timer = p_timer + update() + +func clear_timer(): + timer = null + update() + +func _process(delta): + update() + +func update(): + if timer != null: + visible = true + material_override.set_shader_param("percent", timer.time_left / timer.wait_time) + else: + visible = false diff --git a/scripts/crafting_station/crafting_station.gd b/scripts/crafting_station/crafting_station.gd index 7fdeaba..fcf514d 100644 --- a/scripts/crafting_station/crafting_station.gd +++ b/scripts/crafting_station/crafting_station.gd @@ -20,6 +20,7 @@ onready var gen_timer = $"%gen_timer" onready var progress_text = $"%progress_text" onready var item_dump = $"%item_dump" onready var status_light = $"%status_light" +onready var circle_timer = $circle_timer var item_slots = null var state = null diff --git a/scripts/crafting_station/state/working.gd b/scripts/crafting_station/state/working.gd index f94bee4..282f493 100644 --- a/scripts/crafting_station/state/working.gd +++ b/scripts/crafting_station/state/working.gd @@ -17,9 +17,11 @@ func enter_from(state): ctx.gen_timer.start() ctx.status_light.activate() ctx.progress_text.text = "Progress: 0%" + ctx.circle_timer.set_timer(ctx.gen_timer) func exit_to(state): ctx.gen_timer.stop() + ctx.circle_timer.clear_timer() func update(delta): var time_left : float = ctx.gen_timer.time_left diff --git a/scripts/hydroponics_station/state/growing.gd b/scripts/hydroponics_station/state/growing.gd index e848807..ad1a05a 100644 --- a/scripts/hydroponics_station/state/growing.gd +++ b/scripts/hydroponics_station/state/growing.gd @@ -16,9 +16,10 @@ func enter_from(state): ctx.get_node("grow_timer").start() ctx.status_light.activate() ctx.item_dump.enabled = false + ctx.get_node("circle_timer").set_timer(ctx.get_node("grow_timer")) func exit_to(state): - pass + ctx.get_node("circle_timer").clear_timer() func on_coin_machine_coin_requirement_met(player): assert(false, "coin machine should be disabled while growing") diff --git a/scripts/item_generator/item_generator.gd b/scripts/item_generator/item_generator.gd index 7bdcfd9..f167405 100644 --- a/scripts/item_generator/item_generator.gd +++ b/scripts/item_generator/item_generator.gd @@ -20,6 +20,7 @@ onready var gen_timer = $"%gen_timer" onready var item_dump = $"%item_dump" onready var status_light = $"%status_light" onready var progress_text = $"%progress_text" +onready var circle_timer = $circle_timer var state = null var item_slots diff --git a/scripts/item_generator/state/working.gd b/scripts/item_generator/state/working.gd index e26b3ad..a01c9c7 100644 --- a/scripts/item_generator/state/working.gd +++ b/scripts/item_generator/state/working.gd @@ -17,9 +17,10 @@ func enter_from(state): ctx.status_light.activate() ctx.gen_timer.start() ctx.emit_signal("gen_started") + ctx.circle_timer.set_timer(ctx.gen_timer) func exit_to(state): - pass + ctx.circle_timer.clear_timer() func update(delta): var time_left : float = ctx.gen_timer.time_left diff --git a/scripts/oven/state/cooking.gd b/scripts/oven/state/cooking.gd index 6a7ce59..5623976 100644 --- a/scripts/oven/state/cooking.gd +++ b/scripts/oven/state/cooking.gd @@ -17,9 +17,10 @@ func enter_from(state): ctx.get_node("cook_timer").start() ctx.get_node("status_light").activate() + ctx.get_node("circle_timer").set_timer(ctx.get_node("cook_timer")) func exit_to(state): - pass + ctx.get_node("circle_timer").clear_timer() func on_coin_machine_coin_requirement_met(player): assert(false, "coin machine should be disabled while growing") diff --git a/shaders/circle_timer.gdshader b/shaders/circle_timer.gdshader new file mode 100644 index 0000000..d3338e7 --- /dev/null +++ b/shaders/circle_timer.gdshader @@ -0,0 +1,33 @@ +shader_type spatial; +render_mode unshaded; + +uniform vec4 albedo : hint_color; +uniform float percent; +const float PI = 3.14159; + +vec3 circle(vec2 p) { + float v = (1.0-smoothstep(0.49, 0.50, length(p))) * smoothstep(0.19, 0.2, length(p)); + return vec3(v, v,v); +} + +float atan2(in float y, in float x) { + bool s = (abs(x) > abs(y)); + if (s) { + return PI/2.0 - atan(x,y); + } else { + return atan(y,x); + } +} + +float wipe(vec2 pos, float p_percent) { + float angle = atan2(pos.y , pos.x); + float alpha = step(p_percent *PI * 2.25, angle + PI); + return alpha; +} + +void fragment() { + vec2 base_uv = UV; + vec2 pos = UV - vec2(0.5, 0.5); + ALBEDO = circle(pos) * albedo.xyz; + ALPHA = circle(pos).x * wipe(pos, percent); +}