setup "F to pick" and recharge battery logic
authorEduardo <[email protected]>
Sun, 11 Feb 2024 16:57:00 +0000 (17:57 +0100)
committerEduardo <[email protected]>
Sun, 11 Feb 2024 16:57:00 +0000 (17:57 +0100)
levels/ui.gd
levels/unicorn_level/unicorn_map.tscn
player/Player.gd

index 620aec50dd41b8c828862c4958ed801bb72a584a..8ab4ec99c592790d880a287e39076a9c3bb7f8b9 100644 (file)
@@ -2,12 +2,39 @@ extends Control
 
 @export var battery := 100.0
 @export_range(0, 2) var unChargeSpeedMod: float = 1
+@export_category("Conections")
+@export var player: CharacterBody3D
+@export var camera: Camera3D
+
 @onready var dateLabel := $HBoxContainer/Date
 @onready var batteryLabel := $HBoxContainer/Battery
 @onready var timeLabel := $Time
 @onready var nightmareLabel := $NightmareText
 @onready var rightTopLabel := $RightTopText
 @onready var rightBottomLabel := $RightBottomText
+@onready var actionTextLabel := $CenterContainer2/ActionText
+
+
+func _ready() -> void:
+       camera.connect("object_detected", _on_object_detected)
+       player.connect("recharge_battery", _on_recharge_battery_command)
+
+
+func _on_object_detected(ob: Object):
+       var regex = RegEx.new()
+       regex.compile("^bateria(\\d*)$")
+
+       if !ob:
+               actionTextLabel.set_text("")
+       elif regex.search(ob.name):
+               actionTextLabel.set_text("Press F to pick")
+       else:
+               actionTextLabel.set_text(ob.name)
+
+
+func _on_recharge_battery_command():
+       battery = 100
+       batteryLabel.set_text(format_battery_text(battery))
 
 
 # each 1 seconds
index 0e04b7c0cd13ed2785692658e402c7f6bcec6184..b7306d740cdee5305508b771f1382087fbe0c9db 100644 (file)
@@ -71,7 +71,7 @@ shape = SubResource("BoxShape3D_s6l2r")
 [node name="Ground" type="Node3D" parent="NavigationRegion3D"]
 
 [node name="Sprite3D" type="Sprite3D" parent="NavigationRegion3D/Ground"]
-transform = Transform3D(12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0)
+transform = Transform3D(17.028, 0, 0, 0, 17.028, 0, 0, 0, 17.028, 0, 0, 0)
 axis = 1
 texture = ExtResource("4_8lsu2")
 
@@ -1814,7 +1814,9 @@ transform = Transform3D(-3.0598e-09, 0.07, 0, -0.07, -3.0598e-09, 0, 0, 0, 0.07,
 [node name="bateria2" parent="." instance=ExtResource("9_acsxj")]
 transform = Transform3D(0.0271521, -0.000234109, 0.0645191, 0.000603528, 0.0699974, 0, -0.0645167, 0.000556272, 0.0271531, -116.369, 0.106564, -125.972)
 
-[node name="UI" parent="." instance=ExtResource("8_sxpo7")]
+[node name="UI" parent="." node_paths=PackedStringArray("player", "camera") instance=ExtResource("8_sxpo7")]
+player = NodePath("../Player")
+camera = NodePath("../Player/Camera3D")
 
 [node name="Shaders" type="ColorRect" parent="."]
 material = SubResource("ShaderMaterial_s2ner")
index 676c3793eeec92c160338814a00f8429b5fb1f76..b55106541c00ff1121ad7656726f8bff10f0dd82 100644 (file)
@@ -1,5 +1,7 @@
 extends CharacterBody3D
 
+signal recharge_battery
+
 @export_category("Noise")
 @export_range(0, 2) var squating_noise_mod: float = 1
 @export_range(0, 2) var running_noise_mod: float = 1
@@ -13,6 +15,7 @@ extends CharacterBody3D
 
 @onready var pivot := $Pivot
 @onready var camera := $Camera3D
+@onready var collider := $CollisionShape3D
 
 var target_velocity := Vector3.ZERO
 var noise: float = 0
@@ -22,6 +25,12 @@ const stand_position := 1.7  # Position to which the camera moves when standing
 const move_speed := 8.0  # Speed at which the camera moves from stand to squat and back
 var is_squatting := false
 
+var object_detected: Object = null
+
+
+func _ready() -> void:
+       camera.connect("object_detected", _on_object_detected)
+
 
 # Called every frame. 'delta' is the elapsed time since the previous frame.
 func _physics_process(delta):
@@ -35,9 +44,9 @@ func _physics_process(delta):
                is_squatting = false
 
        if is_squatting and camera.position.y > squat_position:
-               camera.translate(Vector3(0, -move_speed * delta, 0))
+               scale.y = scale.y * -move_speed * delta
        elif not is_squatting and camera.position.y < stand_position:
-               camera.translate(Vector3(0, move_speed * delta, 0))
+               scale.y = scale.y * move_speed * delta
 
        if Input.is_action_pressed("squat"):
                speed_mod = squating_speed_mod
@@ -46,6 +55,16 @@ func _physics_process(delta):
                speed_mod = running_speed_mod
                noise_mod = running_noise_mod
 
+       if Input.is_action_just_pressed("action") && object_detected:
+               var regex = RegEx.new()
+               regex.compile("^bateria(\\d*)$")
+
+               if regex.search(object_detected.name):
+                       object_detected.queue_free()
+                       emit_signal("recharge_battery")
+               else:
+                       print("Action on ", object_detected.name)
+
        if Input.is_action_pressed("move_right"):
                direction += transform.basis.x
        if Input.is_action_pressed("move_left"):
@@ -80,3 +99,8 @@ func _on_timer_timeout():
        noise = clamp(noise - 1, 0, 9)
        set_meta("noise", noise)
        print(noise)
+
+
+# whenever the detection changes it emits an object (or null if nothing detected)
+func _on_object_detected(ob: Object):
+       object_detected = ob