Recommiting glbs for LFS
Deploy Promiscuity Auth API / deploy (push) Successful in 1m59s
Deploy Promiscuity Character API / deploy (push) Successful in 1m16s
Deploy Promiscuity Inventory API / deploy (push) Has been cancelled
Deploy Promiscuity Locations API / deploy (push) Has been cancelled
Deploy Promiscuity Mail API / deploy (push) Has been cancelled
Deploy Promiscuity World API / deploy (push) Has been cancelled
Deploy Promiscuity Crafting API / deploy (push) Has been cancelled
k8s smoke test / test (push) Has been cancelled
Deploy Promiscuity Auth API / deploy (push) Successful in 1m59s
Deploy Promiscuity Character API / deploy (push) Successful in 1m16s
Deploy Promiscuity Inventory API / deploy (push) Has been cancelled
Deploy Promiscuity Locations API / deploy (push) Has been cancelled
Deploy Promiscuity Mail API / deploy (push) Has been cancelled
Deploy Promiscuity World API / deploy (push) Has been cancelled
Deploy Promiscuity Crafting API / deploy (push) Has been cancelled
k8s smoke test / test (push) Has been cancelled
This commit is contained in:
@@ -21,8 +21,10 @@ func _toggle_menu():
|
||||
_animate_menu(false)
|
||||
|
||||
func _arrange_buttons():
|
||||
var buttons = get_children()
|
||||
var buttons = get_children().filter(func(child): return child is Control)
|
||||
var count = buttons.size()
|
||||
if count == 0:
|
||||
return
|
||||
|
||||
for i in range(count):
|
||||
# Calculate the angle for each button in radians
|
||||
@@ -36,6 +38,6 @@ func _arrange_buttons():
|
||||
|
||||
func _animate_menu(opening: bool):
|
||||
var tween = create_tween().set_parallel(true)
|
||||
for button in get_children():
|
||||
for button in get_children().filter(func(child): return child is Control):
|
||||
var final_scale = Vector2.ONE if opening else Vector2.ZERO
|
||||
tween.tween_property(button, "scale", final_scale, transition_speed).from(Vector2.ZERO if opening else Vector2.ONE)
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
extends Node3D
|
||||
|
||||
@export var player_spawn_position := Vector3(0.0, 0.0, 0.0)
|
||||
@export var day_length := 120.0
|
||||
@export var start_light_angle := -90.0
|
||||
|
||||
@onready var _player: RigidBody3D = get_node_or_null("Player") as RigidBody3D
|
||||
@onready var _sun: DirectionalLight3D = $DirectionalLight3D
|
||||
@onready var _quest_text: RichTextLabel = get_node_or_null("PhoneUI/Control/PhoneFrame/QuestText") as RichTextLabel
|
||||
|
||||
var _time := 0.0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_move_player_to_spawn()
|
||||
_setup_quest_ui()
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
_update_day_night(delta)
|
||||
|
||||
|
||||
func _move_player_to_spawn() -> void:
|
||||
if _player == null:
|
||||
return
|
||||
var spawn_marker := _consume_spawn_marker()
|
||||
if spawn_marker != null:
|
||||
_player.call("teleport_to_spawn", spawn_marker.global_transform)
|
||||
else:
|
||||
_player.global_position = player_spawn_position
|
||||
_player.linear_velocity = Vector3.ZERO
|
||||
_player.angular_velocity = Vector3.ZERO
|
||||
|
||||
|
||||
func _consume_spawn_marker() -> Node3D:
|
||||
if TeleportState == null:
|
||||
return null
|
||||
var spawn_name: StringName = TeleportState.consume_spawn_name()
|
||||
if spawn_name == StringName():
|
||||
return null
|
||||
return find_child(String(spawn_name), true, false) as Node3D
|
||||
|
||||
|
||||
func _update_day_night(delta: float) -> void:
|
||||
if _sun == null or day_length <= 0.0:
|
||||
return
|
||||
_time = fmod(_time + delta, day_length)
|
||||
var t: float = _time / day_length
|
||||
var angle: float = lerp(start_light_angle, start_light_angle + 360.0, t)
|
||||
_sun.rotation_degrees.x = angle
|
||||
var energy_curve: float = -sin((t * TAU) + (start_light_angle * PI / 180.0))
|
||||
_sun.light_energy = clamp((energy_curve * 1.0) + 0.2, 0.0, 1.2)
|
||||
|
||||
|
||||
func _setup_quest_ui() -> void:
|
||||
if QuestManager == null:
|
||||
return
|
||||
if not QuestManager.is_connected("quest_state_changed", Callable(self, "_refresh_quest_ui")):
|
||||
QuestManager.quest_state_changed.connect(_refresh_quest_ui)
|
||||
_refresh_quest_ui()
|
||||
|
||||
|
||||
func _refresh_quest_ui() -> void:
|
||||
if _quest_text == null or QuestManager == null:
|
||||
return
|
||||
var state: Dictionary = QuestManager.get_active_quest_state()
|
||||
if not bool(state.get("active", false)):
|
||||
_quest_text.text = "No active quest."
|
||||
return
|
||||
var title := String(state.get("title", "Quest"))
|
||||
if bool(state.get("completed", false)):
|
||||
_quest_text.text = "[b]%s[/b]\nComplete." % title
|
||||
return
|
||||
var step_index: int = int(state.get("current_step_index", 0))
|
||||
var total_steps: int = int(state.get("total_steps", 0))
|
||||
var step_text := String(state.get("current_step_text", ""))
|
||||
_quest_text.text = "[b]%s[/b]\nStep %d/%d\n%s" % [title, step_index + 1, total_steps, step_text]
|
||||
@@ -0,0 +1 @@
|
||||
uid://dgqayogt2d14g
|
||||
@@ -0,0 +1,134 @@
|
||||
[gd_scene load_steps=11 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/Levels/ashling_level.gd" id="1_level"]
|
||||
[ext_resource type="Script" path="res://scenes/player.gd" id="2_player"]
|
||||
[ext_resource type="PackedScene" path="res://assets/models/TestCharAnimated.glb" id="3_model"]
|
||||
[ext_resource type="PackedScene" path="res://scenes/Interaction/prototype_gateway.tscn" id="4_teleporter"]
|
||||
[ext_resource type="Material" path="res://assets/materials/kenney_prototype_ground_green.tres" id="5_ground_mat"]
|
||||
[ext_resource type="PackedScene" uid="uid://dp6jk0k3o4v1u" path="res://scenes/UI/pause_menu.tscn" id="6_pause_menu"]
|
||||
[ext_resource type="PackedScene" path="res://scenes/Characters/ashling_swarmer.tscn" id="7_ashling"]
|
||||
[ext_resource type="PackedScene" uid="uid://bnwpu7p8sbsfa" path="res://scenes/Interaction/RadialCommandMenu.tscn" id="8_radial_menu"]
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_player"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_ground"]
|
||||
size = Vector3(1080, 2, 1080)
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_ground"]
|
||||
material = ExtResource("5_ground_mat")
|
||||
size = Vector3(1080, 2, 1080)
|
||||
|
||||
[node name="AshlingLevel" type="Node3D"]
|
||||
script = ExtResource("1_level")
|
||||
|
||||
[node name="Ground" type="StaticBody3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"]
|
||||
shape = SubResource("BoxShape3D_ground")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground"]
|
||||
mesh = SubResource("BoxMesh_ground")
|
||||
|
||||
[node name="Player" type="RigidBody3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
|
||||
script = ExtResource("2_player")
|
||||
camera_path = NodePath("Camera3D")
|
||||
phone_path = NodePath("../PhoneUI")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Player"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
|
||||
shape = SubResource("SphereShape3D_player")
|
||||
|
||||
[node name="TestCharAnimated" parent="Player" instance=ExtResource("3_model")]
|
||||
transform = Transform3D(-0.9998549, 0, 0.01703362, 0, 1, 0, -0.01703362, 0, -0.9998549, 0, 0, 0)
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="Player"]
|
||||
transform = Transform3D(0.9989785, -4.651856e-10, -0.045188628, 0.006969331, 0.9880354, 0.15407, 0.044647958, -0.15422754, 0.9870261, 0.22036135, 1.8988357, 0.64972365)
|
||||
current = true
|
||||
fov = 49.0
|
||||
|
||||
[node name="SpotLight3D" type="SpotLight3D" parent="Player"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.906308, -0.422618, 0, 0.422618, 0.906308, 0, 1.7, -0.35)
|
||||
visible = false
|
||||
spot_range = 30.0
|
||||
spot_angle = 25.0
|
||||
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.819152, 0.573576, 0, -0.573576, 0.819152, 0, 6, 0)
|
||||
shadow_enabled = true
|
||||
|
||||
[node name="EntrySpawn" type="Marker3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2)
|
||||
|
||||
[node name="AshlingSwarmer" parent="." instance=ExtResource("7_ashling")]
|
||||
transform = Transform3D(0.8660254, 0, -0.5, 0, 1, 0, 0.5, 0, 0.8660254, 0, 0, -4)
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="AshlingSwarmer"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 2.6, 0)
|
||||
billboard = 1
|
||||
no_depth_test = true
|
||||
pixel_size = 0.012
|
||||
text = "ASHLING"
|
||||
|
||||
[node name="ReturnTeleporter" parent="." instance=ExtResource("4_teleporter")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 5.5)
|
||||
target_scene_path = "res://scenes/Levels/level.tscn"
|
||||
target_spawn_name = &"AshlingReturnSpawn"
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="ReturnTeleporter"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 5.4, 0)
|
||||
billboard = 1
|
||||
no_depth_test = true
|
||||
pixel_size = 0.012
|
||||
text = "PLAYGROUND"
|
||||
|
||||
[node name="PauseMenu" parent="." instance=ExtResource("6_pause_menu")]
|
||||
|
||||
[node name="PhoneUI" type="CanvasLayer" parent="."]
|
||||
layer = 5
|
||||
visible = false
|
||||
|
||||
[node name="Control" type="Control" parent="PhoneUI"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="PhoneFrame" type="ColorRect" parent="PhoneUI/Control"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -180.0
|
||||
offset_top = -320.0
|
||||
offset_right = 180.0
|
||||
offset_bottom = 320.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
color = Color(0.08, 0.08, 0.1, 1)
|
||||
|
||||
[node name="QuestTitle" type="Label" parent="PhoneUI/Control/PhoneFrame"]
|
||||
layout_mode = 0
|
||||
offset_left = 18.0
|
||||
offset_top = 18.0
|
||||
offset_right = 150.0
|
||||
offset_bottom = 41.0
|
||||
text = "Quest Log"
|
||||
|
||||
[node name="QuestText" type="RichTextLabel" parent="PhoneUI/Control/PhoneFrame"]
|
||||
layout_mode = 0
|
||||
offset_left = 18.0
|
||||
offset_top = 52.0
|
||||
offset_right = 344.0
|
||||
offset_bottom = 613.0
|
||||
bbcode_enabled = true
|
||||
text = "No active quest."
|
||||
scroll_active = false
|
||||
|
||||
[node name="RadialCommandMenu" parent="PhoneUI/Control" instance=ExtResource("8_radial_menu")]
|
||||
layout_mode = 1
|
||||
@@ -22,9 +22,9 @@ const FIRST_QUEST := {
|
||||
"description": "Get familiar with movement and vehicles.",
|
||||
"steps": [
|
||||
{
|
||||
"id": "enter_vehicle",
|
||||
"text": "Get in the car (E).",
|
||||
"complete_event": "entered_vehicle",
|
||||
"id": "enter_car_feature",
|
||||
"text": "Walk through the car teleporter.",
|
||||
"complete_event": "entered_car_feature",
|
||||
},
|
||||
{
|
||||
"id": "reach_checkpoint",
|
||||
@@ -35,6 +35,7 @@ const FIRST_QUEST := {
|
||||
}
|
||||
|
||||
func _ready() -> void:
|
||||
_move_player_to_requested_spawn()
|
||||
_apply_sun_state(0.0)
|
||||
_setup_quests()
|
||||
if _should_show_spawn_dialog() and DialogSystem and DialogSystem.has_method("show_text"):
|
||||
@@ -45,7 +46,6 @@ func _ready() -> void:
|
||||
await get_tree().create_timer(spawn_dialog_auto_close_seconds).timeout
|
||||
if DialogSystem and DialogSystem.has_method("close_if_text"):
|
||||
DialogSystem.close_if_text(spawn_dialog_text)
|
||||
_show_quest_intro_dialog()
|
||||
|
||||
func _process(delta):
|
||||
time = fmod((time + delta), day_length)
|
||||
@@ -132,3 +132,23 @@ func _mark_spawn_dialog_shown() -> void:
|
||||
if QuestManager == null:
|
||||
return
|
||||
QuestManager.set_meta(SPAWN_DIALOG_META_KEY, true)
|
||||
|
||||
|
||||
func _move_player_to_requested_spawn() -> void:
|
||||
if _player == null or TeleportState == null:
|
||||
return
|
||||
var spawn_name: StringName = TeleportState.consume_spawn_name()
|
||||
if spawn_name == StringName():
|
||||
return
|
||||
var spawn_marker := find_child(String(spawn_name), true, false) as Node3D
|
||||
if spawn_marker == null:
|
||||
return
|
||||
if _player.has_method("teleport_to_spawn"):
|
||||
_player.call("teleport_to_spawn", spawn_marker.global_transform)
|
||||
elif _player is RigidBody3D:
|
||||
var player_body := _player as RigidBody3D
|
||||
player_body.global_transform = spawn_marker.global_transform
|
||||
player_body.linear_velocity = Vector3.ZERO
|
||||
player_body.angular_velocity = Vector3.ZERO
|
||||
else:
|
||||
(_player as Node3D).global_transform = spawn_marker.global_transform
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
[ext_resource type="Script" uid="uid://bpxggc8nr6tf6" path="res://scenes/player.gd" id="1_muv8p"]
|
||||
[ext_resource type="PackedScene" uid="uid://c5of6aaxop1hl" path="res://scenes/block.tscn" id="2_tc7dm"]
|
||||
[ext_resource type="PackedScene" uid="uid://dp6jk0k3o4v1u" path="res://scenes/UI/pause_menu.tscn" id="3_pause_menu"]
|
||||
[ext_resource type="PackedScene" path="res://scenes/Characters/repo_bot.tscn" id="4_repo"]
|
||||
[ext_resource type="PackedScene" path="res://scenes/Vehicles/car.tscn" id="5_car"]
|
||||
[ext_resource type="PackedScene" uid="uid://bnqaqbgynoyys" path="res://assets/models/TestCharAnimated.glb" id="5_fi66n"]
|
||||
[ext_resource type="Script" uid="uid://bk53njt7i3kmv" path="res://scenes/Interaction/dialog_trigger_area.gd" id="6_dialog"]
|
||||
@@ -15,7 +14,6 @@
|
||||
[ext_resource type="Material" path="res://assets/materials/kenney_prototype_ground_green.tres" id="9_ground_mat"]
|
||||
[ext_resource type="Texture2D" uid="uid://c4ggdp0kg5wjk" path="res://addons/simplegrasstextured/textures/grassbushcc008.png" id="10_loupo"]
|
||||
[ext_resource type="Script" uid="uid://2juaclm8gc1n" path="res://addons/simplegrasstextured/grass.gd" id="11_1meta"]
|
||||
[ext_resource type="Script" uid="uid://bv2ei5rg0dn3d" path="res://scenes/Levels/RadialCommandMenu.gd" id="15_18iqp"]
|
||||
[ext_resource type="Texture2D" uid="uid://b2dmnrm3ubjon" path="res://assets/textures/stolenFire.png" id="16_i35yb"]
|
||||
[ext_resource type="PackedScene" uid="uid://bnwpu7p8sbsfa" path="res://scenes/Interaction/RadialCommandMenu.tscn" id="16_px5jg"]
|
||||
|
||||
@@ -401,10 +399,6 @@ script = ExtResource("1_a4mo8")
|
||||
|
||||
[node name="human" parent="." unique_id=333471061 instance=ExtResource("1_eg4yq")]
|
||||
|
||||
[node name="RepoBot" parent="." unique_id=1519051606 instance=ExtResource("4_repo")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.9426608, 0, -4.4451966)
|
||||
look_target_path = NodePath("../Player")
|
||||
|
||||
[node name="Thing" type="RigidBody3D" parent="." unique_id=32794772]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -3.7986288)
|
||||
physics_material_override = SubResource("PhysicsMaterial_2q6dc")
|
||||
@@ -450,48 +444,6 @@ root_motion_track = NodePath("Armature/Skeleton3D:mixamorig_Hips")
|
||||
tree_root = SubResource("AnimationNodeStateMachine_bwsrl")
|
||||
anim_player = NodePath("../TestCharAnimated/AnimationPlayer")
|
||||
|
||||
[node name="Car" parent="." unique_id=1231424399 instance=ExtResource("5_car")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6, 0, -3)
|
||||
|
||||
[node name="DialogZone" type="Area3D" parent="." unique_id=616412893]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, -2.5)
|
||||
script = ExtResource("6_dialog")
|
||||
prompt_text = "Press E to inspect area"
|
||||
dialog_text = "Dialog trigger area"
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="DialogZone" unique_id=1201310304]
|
||||
shape = SubResource("SphereShape3D_dialog_zone")
|
||||
|
||||
[node name="Visual" type="MeshInstance3D" parent="DialogZone" unique_id=851990198]
|
||||
mesh = SubResource("SphereMesh_dialog_zone")
|
||||
|
||||
[node name="AutoDialogZone" type="Area3D" parent="." unique_id=123053838]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 0, -6.5)
|
||||
script = ExtResource("6_dialog")
|
||||
dialog_text = "Auto dialog trigger"
|
||||
auto_popup = true
|
||||
auto_popup_close_on_exit = true
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="AutoDialogZone" unique_id=54253856]
|
||||
shape = SubResource("SphereShape3D_dialog_zone")
|
||||
|
||||
[node name="Visual" type="MeshInstance3D" parent="AutoDialogZone" unique_id=1933827323]
|
||||
transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 0, 0, 0)
|
||||
mesh = SubResource("SphereMesh_dialog_zone")
|
||||
|
||||
[node name="QuestCheckpoint" type="Area3D" parent="." unique_id=1060088011]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9, 0, -10)
|
||||
script = ExtResource("7_qtrigger")
|
||||
event_name = &"reach_checkpoint"
|
||||
target_group = &"vehicle"
|
||||
quest_id_filter = "first_drive"
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="QuestCheckpoint" unique_id=1399159753]
|
||||
shape = SubResource("SphereShape3D_checkpoint")
|
||||
|
||||
[node name="Visual" type="MeshInstance3D" parent="QuestCheckpoint" unique_id=1488541765]
|
||||
mesh = SubResource("SphereMesh_checkpoint")
|
||||
|
||||
[node name="Ground" type="StaticBody3D" parent="." unique_id=1718381675]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
|
||||
|
||||
@@ -548,7 +500,6 @@ anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("15_18iqp")
|
||||
|
||||
[node name="PhoneFrame" type="ColorRect" parent="PhoneUI/Control" unique_id=1204675817]
|
||||
layout_mode = 1
|
||||
@@ -589,8 +540,66 @@ layout_mode = 1
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1808155101]
|
||||
environment = SubResource("Environment_a4mo8")
|
||||
|
||||
[node name="LevelExitTeleporter" parent="." unique_id=1508738453 instance=ExtResource("8_teleporter")]
|
||||
[node name="CarTeleporter" parent="." unique_id=1508738453 instance=ExtResource("8_teleporter")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 0)
|
||||
target_spawn_name = &"EntrySpawn"
|
||||
quest_event_name = &"entered_car_feature"
|
||||
quest_id_filter = "first_drive"
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="CarTeleporter"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 5.4, 0)
|
||||
billboard = 1
|
||||
no_depth_test = true
|
||||
pixel_size = 0.012
|
||||
text = "CAR"
|
||||
|
||||
[node name="TriggerZonesTeleporter" parent="." instance=ExtResource("8_teleporter")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 6)
|
||||
target_scene_path = "res://scenes/Levels/trigger_zones_level.tscn"
|
||||
target_spawn_name = &"EntrySpawn"
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="TriggerZonesTeleporter"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 5.4, 0)
|
||||
billboard = 1
|
||||
no_depth_test = true
|
||||
pixel_size = 0.012
|
||||
text = "TRIGGERS"
|
||||
|
||||
[node name="RepoBotTeleporter" parent="." instance=ExtResource("8_teleporter")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 12)
|
||||
target_scene_path = "res://scenes/Levels/repo_bot_level.tscn"
|
||||
target_spawn_name = &"EntrySpawn"
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="RepoBotTeleporter"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 5.4, 0)
|
||||
billboard = 1
|
||||
no_depth_test = true
|
||||
pixel_size = 0.012
|
||||
text = "REPO BOT"
|
||||
|
||||
[node name="AshlingTeleporter" parent="." instance=ExtResource("8_teleporter")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 18)
|
||||
target_scene_path = "res://scenes/Levels/ashling_level.tscn"
|
||||
target_spawn_name = &"EntrySpawn"
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="AshlingTeleporter"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 5.4, 0)
|
||||
billboard = 1
|
||||
no_depth_test = true
|
||||
pixel_size = 0.012
|
||||
text = "ASHLING"
|
||||
|
||||
[node name="CarReturnSpawn" type="Marker3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, -3)
|
||||
|
||||
[node name="TriggerZonesReturnSpawn" type="Marker3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 3)
|
||||
|
||||
[node name="RepoBotReturnSpawn" type="Marker3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 9)
|
||||
|
||||
[node name="AshlingReturnSpawn" type="Marker3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 0, 15)
|
||||
|
||||
[node name="GPUParticles3D" type="GPUParticles3D" parent="." unique_id=2107882789]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.8036127, 1.8337743, -6.1764746)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -165,6 +165,26 @@ layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
select_mode = 0
|
||||
|
||||
[node name="RecipesPanel" type="PanelContainer" parent="InventoryMenu/MarginContainer/Panel/VBoxContainer/Columns"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="InventoryMenu/MarginContainer/Panel/VBoxContainer/Columns/RecipesPanel"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/separation = 8
|
||||
|
||||
[node name="RecipesLabel" type="Label" parent="InventoryMenu/MarginContainer/Panel/VBoxContainer/Columns/RecipesPanel/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Crafting"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="RecipesList" type="ItemList" parent="InventoryMenu/MarginContainer/Panel/VBoxContainer/Columns/RecipesPanel/VBoxContainer"]
|
||||
custom_minimum_size = Vector2(0, 240)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
select_mode = 0
|
||||
|
||||
[node name="ControlsPanel" type="PanelContainer" parent="InventoryMenu/MarginContainer/Panel/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
@@ -220,6 +240,11 @@ layout_mode = 2
|
||||
theme = ExtResource("4_button_theme")
|
||||
text = "PICK UP"
|
||||
|
||||
[node name="CraftButton" type="Button" parent="InventoryMenu/MarginContainer/Panel/VBoxContainer/ControlsPanel/VBoxContainer/ActionRow"]
|
||||
layout_mode = 2
|
||||
theme = ExtResource("4_button_theme")
|
||||
text = "CRAFT"
|
||||
|
||||
[node name="RefreshButton" type="Button" parent="InventoryMenu/MarginContainer/Panel/VBoxContainer/ControlsPanel/VBoxContainer/ActionRow"]
|
||||
layout_mode = 2
|
||||
theme = ExtResource("4_button_theme")
|
||||
@@ -377,9 +402,11 @@ text = ""
|
||||
[connection signal="pressed" from="PauseMenu/CenterContainer/Panel/VBoxContainer/MainMenuButton" to="." method="_on_pause_main_menu_pressed"]
|
||||
[connection signal="item_selected" from="InventoryMenu/MarginContainer/Panel/VBoxContainer/Columns/CharacterPanel/VBoxContainer/CharacterItems" to="." method="_on_character_items_selected"]
|
||||
[connection signal="item_selected" from="InventoryMenu/MarginContainer/Panel/VBoxContainer/Columns/GroundPanel/VBoxContainer/GroundItems" to="." method="_on_ground_items_selected"]
|
||||
[connection signal="item_selected" from="InventoryMenu/MarginContainer/Panel/VBoxContainer/Columns/RecipesPanel/VBoxContainer/RecipesList" to="." method="_on_recipe_selected"]
|
||||
[connection signal="pressed" from="InventoryMenu/MarginContainer/Panel/VBoxContainer/ControlsPanel/VBoxContainer/ActionRow/MoveButton" to="." method="_on_inventory_move_pressed"]
|
||||
[connection signal="pressed" from="InventoryMenu/MarginContainer/Panel/VBoxContainer/ControlsPanel/VBoxContainer/ActionRow/DropButton" to="." method="_on_inventory_drop_pressed"]
|
||||
[connection signal="pressed" from="InventoryMenu/MarginContainer/Panel/VBoxContainer/ControlsPanel/VBoxContainer/ActionRow/PickupButton" to="." method="_on_inventory_pickup_pressed"]
|
||||
[connection signal="pressed" from="InventoryMenu/MarginContainer/Panel/VBoxContainer/ControlsPanel/VBoxContainer/ActionRow/CraftButton" to="." method="_on_inventory_craft_pressed"]
|
||||
[connection signal="pressed" from="InventoryMenu/MarginContainer/Panel/VBoxContainer/ControlsPanel/VBoxContainer/ActionRow/RefreshButton" to="." method="_on_inventory_refresh_pressed"]
|
||||
[connection signal="pressed" from="InventoryMenu/MarginContainer/Panel/VBoxContainer/ControlsPanel/VBoxContainer/ActionRow/CloseButton" to="." method="_on_inventory_close_pressed"]
|
||||
[connection signal="item_selected" from="MailMenu/MarginContainer/Panel/VBoxContainer/Columns/InboxPanel/VBoxContainer/InboxItems" to="." method="_on_mail_inbox_selected"]
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
extends Node3D
|
||||
|
||||
@export var player_spawn_position := Vector3(0.0, 0.0, 0.0)
|
||||
@export var day_length := 120.0
|
||||
@export var start_light_angle := -90.0
|
||||
|
||||
@onready var _player: RigidBody3D = get_node_or_null("Player") as RigidBody3D
|
||||
@onready var _sun: DirectionalLight3D = $DirectionalLight3D
|
||||
@onready var _quest_text: RichTextLabel = get_node_or_null("PhoneUI/Control/PhoneFrame/QuestText") as RichTextLabel
|
||||
|
||||
var _time := 0.0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_move_player_to_spawn()
|
||||
_setup_quest_ui()
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
_update_day_night(delta)
|
||||
|
||||
|
||||
func _move_player_to_spawn() -> void:
|
||||
if _player == null:
|
||||
return
|
||||
var spawn_marker := _consume_spawn_marker()
|
||||
if spawn_marker != null:
|
||||
_player.call("teleport_to_spawn", spawn_marker.global_transform)
|
||||
else:
|
||||
_player.global_position = player_spawn_position
|
||||
_player.linear_velocity = Vector3.ZERO
|
||||
_player.angular_velocity = Vector3.ZERO
|
||||
|
||||
|
||||
func _consume_spawn_marker() -> Node3D:
|
||||
if TeleportState == null:
|
||||
return null
|
||||
var spawn_name: StringName = TeleportState.consume_spawn_name()
|
||||
if spawn_name == StringName():
|
||||
return null
|
||||
return find_child(String(spawn_name), true, false) as Node3D
|
||||
|
||||
|
||||
func _update_day_night(delta: float) -> void:
|
||||
if _sun == null or day_length <= 0.0:
|
||||
return
|
||||
_time = fmod(_time + delta, day_length)
|
||||
var t: float = _time / day_length
|
||||
var angle: float = lerp(start_light_angle, start_light_angle + 360.0, t)
|
||||
_sun.rotation_degrees.x = angle
|
||||
var energy_curve: float = -sin((t * TAU) + (start_light_angle * PI / 180.0))
|
||||
_sun.light_energy = clamp((energy_curve * 1.0) + 0.2, 0.0, 1.2)
|
||||
|
||||
|
||||
func _setup_quest_ui() -> void:
|
||||
if QuestManager == null:
|
||||
return
|
||||
if not QuestManager.is_connected("quest_state_changed", Callable(self, "_refresh_quest_ui")):
|
||||
QuestManager.quest_state_changed.connect(_refresh_quest_ui)
|
||||
_refresh_quest_ui()
|
||||
|
||||
|
||||
func _refresh_quest_ui() -> void:
|
||||
if _quest_text == null or QuestManager == null:
|
||||
return
|
||||
var state: Dictionary = QuestManager.get_active_quest_state()
|
||||
if not bool(state.get("active", false)):
|
||||
_quest_text.text = "No active quest."
|
||||
return
|
||||
var title := String(state.get("title", "Quest"))
|
||||
if bool(state.get("completed", false)):
|
||||
_quest_text.text = "[b]%s[/b]\nComplete." % title
|
||||
return
|
||||
var step_index: int = int(state.get("current_step_index", 0))
|
||||
var total_steps: int = int(state.get("total_steps", 0))
|
||||
var step_text := String(state.get("current_step_text", ""))
|
||||
_quest_text.text = "[b]%s[/b]\nStep %d/%d\n%s" % [title, step_index + 1, total_steps, step_text]
|
||||
@@ -0,0 +1 @@
|
||||
uid://cy2vwcmtqsr4o
|
||||
@@ -0,0 +1,135 @@
|
||||
[gd_scene load_steps=11 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/Levels/repo_bot_level.gd" id="1_level"]
|
||||
[ext_resource type="Script" path="res://scenes/player.gd" id="2_player"]
|
||||
[ext_resource type="PackedScene" path="res://assets/models/TestCharAnimated.glb" id="3_model"]
|
||||
[ext_resource type="PackedScene" path="res://scenes/Interaction/prototype_gateway.tscn" id="4_teleporter"]
|
||||
[ext_resource type="Material" path="res://assets/materials/kenney_prototype_ground_green.tres" id="5_ground_mat"]
|
||||
[ext_resource type="PackedScene" uid="uid://dp6jk0k3o4v1u" path="res://scenes/UI/pause_menu.tscn" id="6_pause_menu"]
|
||||
[ext_resource type="PackedScene" path="res://scenes/Characters/repo_bot.tscn" id="7_repo_bot"]
|
||||
[ext_resource type="PackedScene" uid="uid://bnwpu7p8sbsfa" path="res://scenes/Interaction/RadialCommandMenu.tscn" id="8_radial_menu"]
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_player"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_ground"]
|
||||
size = Vector3(1080, 2, 1080)
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_ground"]
|
||||
material = ExtResource("5_ground_mat")
|
||||
size = Vector3(1080, 2, 1080)
|
||||
|
||||
[node name="RepoBotLevel" type="Node3D"]
|
||||
script = ExtResource("1_level")
|
||||
|
||||
[node name="Ground" type="StaticBody3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"]
|
||||
shape = SubResource("BoxShape3D_ground")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground"]
|
||||
mesh = SubResource("BoxMesh_ground")
|
||||
|
||||
[node name="Player" type="RigidBody3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
|
||||
script = ExtResource("2_player")
|
||||
camera_path = NodePath("Camera3D")
|
||||
phone_path = NodePath("../PhoneUI")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Player"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
|
||||
shape = SubResource("SphereShape3D_player")
|
||||
|
||||
[node name="TestCharAnimated" parent="Player" instance=ExtResource("3_model")]
|
||||
transform = Transform3D(-0.9998549, 0, 0.01703362, 0, 1, 0, -0.01703362, 0, -0.9998549, 0, 0, 0)
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="Player"]
|
||||
transform = Transform3D(0.9989785, -4.651856e-10, -0.045188628, 0.006969331, 0.9880354, 0.15407, 0.044647958, -0.15422754, 0.9870261, 0.22036135, 1.8988357, 0.64972365)
|
||||
current = true
|
||||
fov = 49.0
|
||||
|
||||
[node name="SpotLight3D" type="SpotLight3D" parent="Player"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.906308, -0.422618, 0, 0.422618, 0.906308, 0, 1.7, -0.35)
|
||||
visible = false
|
||||
spot_range = 30.0
|
||||
spot_angle = 25.0
|
||||
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.819152, 0.573576, 0, -0.573576, 0.819152, 0, 6, 0)
|
||||
shadow_enabled = true
|
||||
|
||||
[node name="EntrySpawn" type="Marker3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2)
|
||||
|
||||
[node name="RepoBot" parent="." instance=ExtResource("7_repo_bot")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -4)
|
||||
look_target_path = NodePath("../Player")
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="RepoBot"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 2.0, 0)
|
||||
billboard = 1
|
||||
no_depth_test = true
|
||||
pixel_size = 0.012
|
||||
text = "REPO BOT"
|
||||
|
||||
[node name="ReturnTeleporter" parent="." instance=ExtResource("4_teleporter")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 5.5)
|
||||
target_scene_path = "res://scenes/Levels/level.tscn"
|
||||
target_spawn_name = &"RepoBotReturnSpawn"
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="ReturnTeleporter"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 5.4, 0)
|
||||
billboard = 1
|
||||
no_depth_test = true
|
||||
pixel_size = 0.012
|
||||
text = "PLAYGROUND"
|
||||
|
||||
[node name="PauseMenu" parent="." instance=ExtResource("6_pause_menu")]
|
||||
|
||||
[node name="PhoneUI" type="CanvasLayer" parent="."]
|
||||
layer = 5
|
||||
visible = false
|
||||
|
||||
[node name="Control" type="Control" parent="PhoneUI"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="PhoneFrame" type="ColorRect" parent="PhoneUI/Control"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -180.0
|
||||
offset_top = -320.0
|
||||
offset_right = 180.0
|
||||
offset_bottom = 320.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
color = Color(0.08, 0.08, 0.1, 1)
|
||||
|
||||
[node name="QuestTitle" type="Label" parent="PhoneUI/Control/PhoneFrame"]
|
||||
layout_mode = 0
|
||||
offset_left = 18.0
|
||||
offset_top = 18.0
|
||||
offset_right = 150.0
|
||||
offset_bottom = 41.0
|
||||
text = "Quest Log"
|
||||
|
||||
[node name="QuestText" type="RichTextLabel" parent="PhoneUI/Control/PhoneFrame"]
|
||||
layout_mode = 0
|
||||
offset_left = 18.0
|
||||
offset_top = 52.0
|
||||
offset_right = 344.0
|
||||
offset_bottom = 613.0
|
||||
bbcode_enabled = true
|
||||
text = "No active quest."
|
||||
scroll_active = false
|
||||
|
||||
[node name="RadialCommandMenu" parent="PhoneUI/Control" instance=ExtResource("8_radial_menu")]
|
||||
layout_mode = 1
|
||||
@@ -6,12 +6,14 @@ extends Node3D
|
||||
|
||||
@onready var _player: RigidBody3D = get_node_or_null("Player") as RigidBody3D
|
||||
@onready var _sun: DirectionalLight3D = $DirectionalLight3D
|
||||
@onready var _quest_text: RichTextLabel = get_node_or_null("PhoneUI/Control/PhoneFrame/QuestText") as RichTextLabel
|
||||
|
||||
var _time := 0.0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_move_player_to_spawn()
|
||||
_setup_quest_ui()
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
@@ -21,11 +23,24 @@ func _process(delta: float) -> void:
|
||||
func _move_player_to_spawn() -> void:
|
||||
if _player == null:
|
||||
return
|
||||
_player.global_position = player_spawn_position
|
||||
var spawn_marker := _consume_spawn_marker()
|
||||
if spawn_marker != null:
|
||||
_player.call("teleport_to_spawn", spawn_marker.global_transform)
|
||||
else:
|
||||
_player.global_position = player_spawn_position
|
||||
_player.linear_velocity = Vector3.ZERO
|
||||
_player.angular_velocity = Vector3.ZERO
|
||||
|
||||
|
||||
func _consume_spawn_marker() -> Node3D:
|
||||
if TeleportState == null:
|
||||
return null
|
||||
var spawn_name: StringName = TeleportState.consume_spawn_name()
|
||||
if spawn_name == StringName():
|
||||
return null
|
||||
return find_child(String(spawn_name), true, false) as Node3D
|
||||
|
||||
|
||||
func _update_day_night(delta: float) -> void:
|
||||
if _sun == null or day_length <= 0.0:
|
||||
return
|
||||
@@ -35,3 +50,28 @@ func _update_day_night(delta: float) -> void:
|
||||
_sun.rotation_degrees.x = angle
|
||||
var energy_curve: float = -sin((t * TAU) + (start_light_angle * PI / 180.0))
|
||||
_sun.light_energy = clamp((energy_curve * 1.0) + 0.2, 0.0, 1.2)
|
||||
|
||||
|
||||
func _setup_quest_ui() -> void:
|
||||
if QuestManager == null:
|
||||
return
|
||||
if not QuestManager.is_connected("quest_state_changed", Callable(self, "_refresh_quest_ui")):
|
||||
QuestManager.quest_state_changed.connect(_refresh_quest_ui)
|
||||
_refresh_quest_ui()
|
||||
|
||||
|
||||
func _refresh_quest_ui() -> void:
|
||||
if _quest_text == null or QuestManager == null:
|
||||
return
|
||||
var state: Dictionary = QuestManager.get_active_quest_state()
|
||||
if not bool(state.get("active", false)):
|
||||
_quest_text.text = "No active quest."
|
||||
return
|
||||
var title := String(state.get("title", "Quest"))
|
||||
if bool(state.get("completed", false)):
|
||||
_quest_text.text = "[b]%s[/b]\nComplete." % title
|
||||
return
|
||||
var step_index: int = int(state.get("current_step_index", 0))
|
||||
var total_steps: int = int(state.get("total_steps", 0))
|
||||
var step_text := String(state.get("current_step_text", ""))
|
||||
_quest_text.text = "[b]%s[/b]\nStep %d/%d\n%s" % [title, step_index + 1, total_steps, step_text]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=9 format=3 uid="uid://b7p7k1i4t0m2l"]
|
||||
[gd_scene load_steps=15 format=3 uid="uid://b7p7k1i4t0m2l"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/Levels/transportation_level.gd" id="1_6y4q1"]
|
||||
[ext_resource type="Script" path="res://scenes/player.gd" id="2_player"]
|
||||
@@ -6,6 +6,10 @@
|
||||
[ext_resource type="PackedScene" path="res://scenes/Interaction/prototype_gateway.tscn" id="4_teleporter"]
|
||||
[ext_resource type="Material" path="res://assets/materials/kenney_prototype_ground_green.tres" id="5_ground_mat"]
|
||||
[ext_resource type="PackedScene" uid="uid://dp6jk0k3o4v1u" path="res://scenes/UI/pause_menu.tscn" id="6_pause_menu"]
|
||||
[ext_resource type="PackedScene" path="res://scenes/Vehicles/car.tscn" id="7_car"]
|
||||
[ext_resource type="Script" uid="uid://cshtdpjp4xy2f" path="res://scenes/Quests/quest_trigger_area.gd" id="8_qtrigger"]
|
||||
[ext_resource type="Material" path="res://assets/materials/kenney_prototype_prop_red.tres" id="9_checkpoint_mat"]
|
||||
[ext_resource type="PackedScene" uid="uid://bnwpu7p8sbsfa" path="res://scenes/Interaction/RadialCommandMenu.tscn" id="10_radial_menu"]
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_player"]
|
||||
|
||||
@@ -16,6 +20,13 @@ size = Vector3(1080, 2, 1080)
|
||||
material = ExtResource("5_ground_mat")
|
||||
size = Vector3(1080, 2, 1080)
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_checkpoint"]
|
||||
|
||||
[sub_resource type="SphereMesh" id="SphereMesh_checkpoint"]
|
||||
material = ExtResource("9_checkpoint_mat")
|
||||
radius = 1.2
|
||||
height = 2.4
|
||||
|
||||
[node name="TransportationLevel" type="Node3D"]
|
||||
script = ExtResource("1_6y4q1")
|
||||
|
||||
@@ -33,6 +44,7 @@ mesh = SubResource("BoxMesh_ground")
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
|
||||
script = ExtResource("2_player")
|
||||
camera_path = NodePath("Camera3D")
|
||||
phone_path = NodePath("../PhoneUI")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Player"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
|
||||
@@ -56,8 +68,81 @@ spot_angle = 25.0
|
||||
transform = Transform3D(1, 0, 0, 0, 0.819152, 0.573576, 0, -0.573576, 0.819152, 0, 6, 0)
|
||||
shadow_enabled = true
|
||||
|
||||
[node name="EntrySpawn" type="Marker3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2)
|
||||
|
||||
[node name="Car" parent="." instance=ExtResource("7_car")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6, 0, -3)
|
||||
|
||||
[node name="QuestCheckpoint" type="Area3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9, 0, -10)
|
||||
script = ExtResource("8_qtrigger")
|
||||
event_name = &"reach_checkpoint"
|
||||
target_group = &"vehicle"
|
||||
quest_id_filter = "first_drive"
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="QuestCheckpoint"]
|
||||
shape = SubResource("SphereShape3D_checkpoint")
|
||||
|
||||
[node name="Visual" type="MeshInstance3D" parent="QuestCheckpoint"]
|
||||
mesh = SubResource("SphereMesh_checkpoint")
|
||||
|
||||
[node name="ReturnTeleporter" parent="." instance=ExtResource("4_teleporter")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5, 0, 0)
|
||||
target_scene_path = "res://scenes/Levels/level.tscn"
|
||||
target_spawn_name = &"CarReturnSpawn"
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="ReturnTeleporter"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 5.4, 0)
|
||||
pixel_size = 0.012
|
||||
text = "PLAYGROUND"
|
||||
|
||||
[node name="PauseMenu" parent="." instance=ExtResource("6_pause_menu")]
|
||||
|
||||
[node name="PhoneUI" type="CanvasLayer" parent="."]
|
||||
layer = 5
|
||||
visible = false
|
||||
|
||||
[node name="Control" type="Control" parent="PhoneUI"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="PhoneFrame" type="ColorRect" parent="PhoneUI/Control"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -180.0
|
||||
offset_top = -320.0
|
||||
offset_right = 180.0
|
||||
offset_bottom = 320.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
color = Color(0.08, 0.08, 0.1, 1)
|
||||
|
||||
[node name="QuestTitle" type="Label" parent="PhoneUI/Control/PhoneFrame"]
|
||||
layout_mode = 0
|
||||
offset_left = 18.0
|
||||
offset_top = 18.0
|
||||
offset_right = 150.0
|
||||
offset_bottom = 41.0
|
||||
text = "Quest Log"
|
||||
|
||||
[node name="QuestText" type="RichTextLabel" parent="PhoneUI/Control/PhoneFrame"]
|
||||
layout_mode = 0
|
||||
offset_left = 18.0
|
||||
offset_top = 52.0
|
||||
offset_right = 344.0
|
||||
offset_bottom = 613.0
|
||||
bbcode_enabled = true
|
||||
text = "No active quest."
|
||||
scroll_active = false
|
||||
|
||||
[node name="RadialCommandMenu" parent="PhoneUI/Control" instance=ExtResource("10_radial_menu")]
|
||||
layout_mode = 1
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
extends Node3D
|
||||
|
||||
@export var player_spawn_position := Vector3(0.0, 0.0, 0.0)
|
||||
@export var day_length := 120.0
|
||||
@export var start_light_angle := -90.0
|
||||
|
||||
@onready var _player: RigidBody3D = get_node_or_null("Player") as RigidBody3D
|
||||
@onready var _sun: DirectionalLight3D = $DirectionalLight3D
|
||||
@onready var _quest_text: RichTextLabel = get_node_or_null("PhoneUI/Control/PhoneFrame/QuestText") as RichTextLabel
|
||||
|
||||
const FIRST_QUEST_ID := "first_drive"
|
||||
const QUEST_PROMPT_META_PREFIX := "quest_intro_prompt_shown_"
|
||||
const FIRST_QUEST := {
|
||||
"id": FIRST_QUEST_ID,
|
||||
"title": "RepoBot's First Task",
|
||||
"description": "Get familiar with movement and vehicles.",
|
||||
"steps": [
|
||||
{
|
||||
"id": "enter_car_feature",
|
||||
"text": "Walk through the car teleporter.",
|
||||
"complete_event": "entered_car_feature",
|
||||
},
|
||||
{
|
||||
"id": "reach_checkpoint",
|
||||
"text": "Drive the car into the checkpoint marker.",
|
||||
"complete_event": "reach_checkpoint",
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
var _time := 0.0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_move_player_to_spawn()
|
||||
_setup_quests()
|
||||
_show_quest_intro_dialog()
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
_update_day_night(delta)
|
||||
|
||||
|
||||
func _move_player_to_spawn() -> void:
|
||||
if _player == null:
|
||||
return
|
||||
var spawn_marker := _consume_spawn_marker()
|
||||
if spawn_marker != null:
|
||||
_player.call("teleport_to_spawn", spawn_marker.global_transform)
|
||||
else:
|
||||
_player.global_position = player_spawn_position
|
||||
_player.linear_velocity = Vector3.ZERO
|
||||
_player.angular_velocity = Vector3.ZERO
|
||||
|
||||
|
||||
func _consume_spawn_marker() -> Node3D:
|
||||
if TeleportState == null:
|
||||
return null
|
||||
var spawn_name: StringName = TeleportState.consume_spawn_name()
|
||||
if spawn_name == StringName():
|
||||
return null
|
||||
return find_child(String(spawn_name), true, false) as Node3D
|
||||
|
||||
|
||||
func _update_day_night(delta: float) -> void:
|
||||
if _sun == null or day_length <= 0.0:
|
||||
return
|
||||
_time = fmod(_time + delta, day_length)
|
||||
var t: float = _time / day_length
|
||||
var angle: float = lerp(start_light_angle, start_light_angle + 360.0, t)
|
||||
_sun.rotation_degrees.x = angle
|
||||
var energy_curve: float = -sin((t * TAU) + (start_light_angle * PI / 180.0))
|
||||
_sun.light_energy = clamp((energy_curve * 1.0) + 0.2, 0.0, 1.2)
|
||||
|
||||
|
||||
func _setup_quests() -> void:
|
||||
if QuestManager == null:
|
||||
return
|
||||
if not QuestManager.has_quest(FIRST_QUEST_ID):
|
||||
QuestManager.register_quest(FIRST_QUEST)
|
||||
if not QuestManager.is_active_quest(FIRST_QUEST_ID) and not QuestManager.is_quest_completed(FIRST_QUEST_ID):
|
||||
QuestManager.start_quest(FIRST_QUEST_ID)
|
||||
if not QuestManager.is_connected("quest_state_changed", Callable(self, "_refresh_quest_ui")):
|
||||
QuestManager.quest_state_changed.connect(_refresh_quest_ui)
|
||||
_refresh_quest_ui()
|
||||
|
||||
|
||||
func _refresh_quest_ui() -> void:
|
||||
if _quest_text == null or QuestManager == null:
|
||||
return
|
||||
var state: Dictionary = QuestManager.get_active_quest_state()
|
||||
if not bool(state.get("active", false)):
|
||||
_quest_text.text = "No active quest."
|
||||
return
|
||||
var title := String(state.get("title", "Quest"))
|
||||
if bool(state.get("completed", false)):
|
||||
_quest_text.text = "[b]%s[/b]\nComplete." % title
|
||||
return
|
||||
var step_index: int = int(state.get("current_step_index", 0))
|
||||
var total_steps: int = int(state.get("total_steps", 0))
|
||||
var step_text := String(state.get("current_step_text", ""))
|
||||
_quest_text.text = "[b]%s[/b]\nStep %d/%d\n%s" % [title, step_index + 1, total_steps, step_text]
|
||||
|
||||
|
||||
func _show_quest_intro_dialog() -> void:
|
||||
if QuestManager == null:
|
||||
return
|
||||
var state: Dictionary = QuestManager.get_active_quest_state()
|
||||
if not bool(state.get("active", false)) or bool(state.get("completed", false)):
|
||||
return
|
||||
var quest_id := String(state.get("quest_id", "")).strip_edges()
|
||||
var step_id := String(state.get("current_step_id", "")).strip_edges()
|
||||
var step_text := String(state.get("current_step_text", ""))
|
||||
if quest_id.is_empty() or step_id.is_empty() or step_text.is_empty():
|
||||
return
|
||||
var prompt_key := "%s%s_%s" % [QUEST_PROMPT_META_PREFIX, quest_id, step_id]
|
||||
if QuestManager.has_meta(prompt_key) and bool(QuestManager.get_meta(prompt_key)):
|
||||
return
|
||||
if DialogSystem and DialogSystem.has_method("show_text"):
|
||||
DialogSystem.show_text("RepoBot: New task assigned.\n\n%s" % step_text)
|
||||
QuestManager.set_meta(prompt_key, true)
|
||||
@@ -0,0 +1 @@
|
||||
uid://br28dq2hwo7sc
|
||||
@@ -0,0 +1,177 @@
|
||||
[gd_scene load_steps=14 format=3]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/Levels/trigger_zones_level.gd" id="1_level"]
|
||||
[ext_resource type="Script" path="res://scenes/player.gd" id="2_player"]
|
||||
[ext_resource type="PackedScene" path="res://assets/models/TestCharAnimated.glb" id="3_model"]
|
||||
[ext_resource type="PackedScene" path="res://scenes/Interaction/prototype_gateway.tscn" id="4_teleporter"]
|
||||
[ext_resource type="Material" path="res://assets/materials/kenney_prototype_ground_green.tres" id="5_ground_mat"]
|
||||
[ext_resource type="PackedScene" uid="uid://dp6jk0k3o4v1u" path="res://scenes/UI/pause_menu.tscn" id="6_pause_menu"]
|
||||
[ext_resource type="Script" uid="uid://bk53njt7i3kmv" path="res://scenes/Interaction/dialog_trigger_area.gd" id="7_dialog"]
|
||||
[ext_resource type="PackedScene" uid="uid://bnwpu7p8sbsfa" path="res://scenes/Interaction/RadialCommandMenu.tscn" id="8_radial_menu"]
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_player"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_ground"]
|
||||
size = Vector3(1080, 2, 1080)
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_ground"]
|
||||
material = ExtResource("5_ground_mat")
|
||||
size = Vector3(1080, 2, 1080)
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_dialog_zone"]
|
||||
radius = 2.5
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_dialog_zone"]
|
||||
transparency = 1
|
||||
cull_mode = 2
|
||||
shading_mode = 0
|
||||
albedo_color = Color(0.2, 0.8, 0.35, 0.18)
|
||||
|
||||
[sub_resource type="SphereMesh" id="SphereMesh_dialog_zone"]
|
||||
material = SubResource("StandardMaterial3D_dialog_zone")
|
||||
radius = 2.5
|
||||
height = 5.0
|
||||
|
||||
[node name="TriggerZonesLevel" type="Node3D"]
|
||||
script = ExtResource("1_level")
|
||||
|
||||
[node name="Ground" type="StaticBody3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"]
|
||||
shape = SubResource("BoxShape3D_ground")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground"]
|
||||
mesh = SubResource("BoxMesh_ground")
|
||||
|
||||
[node name="Player" type="RigidBody3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
|
||||
script = ExtResource("2_player")
|
||||
camera_path = NodePath("Camera3D")
|
||||
phone_path = NodePath("../PhoneUI")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Player"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
|
||||
shape = SubResource("SphereShape3D_player")
|
||||
|
||||
[node name="TestCharAnimated" parent="Player" instance=ExtResource("3_model")]
|
||||
transform = Transform3D(-0.9998549, 0, 0.01703362, 0, 1, 0, -0.01703362, 0, -0.9998549, 0, 0, 0)
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="Player"]
|
||||
transform = Transform3D(0.9989785, -4.651856e-10, -0.045188628, 0.006969331, 0.9880354, 0.15407, 0.044647958, -0.15422754, 0.9870261, 0.22036135, 1.8988357, 0.64972365)
|
||||
current = true
|
||||
fov = 49.0
|
||||
|
||||
[node name="SpotLight3D" type="SpotLight3D" parent="Player"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.906308, -0.422618, 0, 0.422618, 0.906308, 0, 1.7, -0.35)
|
||||
visible = false
|
||||
spot_range = 30.0
|
||||
spot_angle = 25.0
|
||||
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.819152, 0.573576, 0, -0.573576, 0.819152, 0, 6, 0)
|
||||
shadow_enabled = true
|
||||
|
||||
[node name="EntrySpawn" type="Marker3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2)
|
||||
|
||||
[node name="ManualDialogZone" type="Area3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, -3)
|
||||
script = ExtResource("7_dialog")
|
||||
prompt_text = "Press E to inspect area"
|
||||
dialog_text = "Manual dialog trigger zone"
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="ManualDialogZone"]
|
||||
shape = SubResource("SphereShape3D_dialog_zone")
|
||||
|
||||
[node name="Visual" type="MeshInstance3D" parent="ManualDialogZone"]
|
||||
mesh = SubResource("SphereMesh_dialog_zone")
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="ManualDialogZone"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 3.0, 0)
|
||||
billboard = 1
|
||||
no_depth_test = true
|
||||
pixel_size = 0.012
|
||||
text = "PRESS E"
|
||||
|
||||
[node name="AutoDialogZone" type="Area3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4, 0, -3)
|
||||
script = ExtResource("7_dialog")
|
||||
dialog_text = "Auto dialog trigger zone"
|
||||
auto_popup = true
|
||||
auto_popup_close_on_exit = true
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="AutoDialogZone"]
|
||||
shape = SubResource("SphereShape3D_dialog_zone")
|
||||
|
||||
[node name="Visual" type="MeshInstance3D" parent="AutoDialogZone"]
|
||||
mesh = SubResource("SphereMesh_dialog_zone")
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="AutoDialogZone"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 3.0, 0)
|
||||
billboard = 1
|
||||
no_depth_test = true
|
||||
pixel_size = 0.012
|
||||
text = "AUTO"
|
||||
|
||||
[node name="ReturnTeleporter" parent="." instance=ExtResource("4_teleporter")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 5.5)
|
||||
target_scene_path = "res://scenes/Levels/level.tscn"
|
||||
target_spawn_name = &"TriggerZonesReturnSpawn"
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="ReturnTeleporter"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 5.4, 0)
|
||||
billboard = 1
|
||||
no_depth_test = true
|
||||
pixel_size = 0.012
|
||||
text = "PLAYGROUND"
|
||||
|
||||
[node name="PauseMenu" parent="." instance=ExtResource("6_pause_menu")]
|
||||
|
||||
[node name="PhoneUI" type="CanvasLayer" parent="."]
|
||||
layer = 5
|
||||
visible = false
|
||||
|
||||
[node name="Control" type="Control" parent="PhoneUI"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="PhoneFrame" type="ColorRect" parent="PhoneUI/Control"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -180.0
|
||||
offset_top = -320.0
|
||||
offset_right = 180.0
|
||||
offset_bottom = 320.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
color = Color(0.08, 0.08, 0.1, 1)
|
||||
|
||||
[node name="QuestTitle" type="Label" parent="PhoneUI/Control/PhoneFrame"]
|
||||
layout_mode = 0
|
||||
offset_left = 18.0
|
||||
offset_top = 18.0
|
||||
offset_right = 150.0
|
||||
offset_bottom = 41.0
|
||||
text = "Quest Log"
|
||||
|
||||
[node name="QuestText" type="RichTextLabel" parent="PhoneUI/Control/PhoneFrame"]
|
||||
layout_mode = 0
|
||||
offset_left = 18.0
|
||||
offset_top = 52.0
|
||||
offset_right = 344.0
|
||||
offset_bottom = 613.0
|
||||
bbcode_enabled = true
|
||||
text = "No active quest."
|
||||
scroll_active = false
|
||||
|
||||
[node name="RadialCommandMenu" parent="PhoneUI/Control" instance=ExtResource("8_radial_menu")]
|
||||
layout_mode = 1
|
||||
Reference in New Issue
Block a user