This commit is contained in:
2026-05-16 11:51:19 +02:00
commit 80c1b6a4e4
229 changed files with 5191 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
class_name ActionMoveCamera
extends ClickAction
@export var target_node: NodePath
func execute(clickable: Node, hit_position: Vector3) -> void:
var target_location = clickable.get_node(target_node) as Node3D
if target_location:
ClickManager.request_camera_move(target_location.global_transform)

View File

@@ -0,0 +1 @@
uid://bxo70v3k38pf

View File

@@ -0,0 +1,9 @@
class_name ActionPickup
extends ClickAction
@export var item_id: String = ""
@export var destroy_path: NodePath
func execute(clickable: Node, hit_position: Vector3) -> void:
clickable.get_node(destroy_path).queue_free()
print("Picked up: " + item_id)

View File

@@ -0,0 +1 @@
uid://vim075gwnpvv

View File

@@ -0,0 +1,5 @@
class_name QuitAction
extends ClickAction
func execute(clickable: Node, hit_position: Vector3) -> void:
clickable.get_tree().quit()

View File

@@ -0,0 +1 @@
uid://de2v1ku4lbmbk

View File

@@ -0,0 +1,6 @@
class_name ClickAction
extends Resource
# Override this in subclasses
func execute(clickable: Node, hit_position: Vector3) -> void:
pass

View File

@@ -0,0 +1 @@
uid://csxn4d2cgn4vv

9
scripts/back_ui.gd Normal file
View File

@@ -0,0 +1,9 @@
extends CanvasLayer
func _on_button_pressed() -> void:
ClickManager.request_back()
func _on_button_2_pressed() -> void:
get_tree().change_scene_to_file("res://main_menu.tscn")

1
scripts/back_ui.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://ccm5q76xwkbj7

View File

@@ -0,0 +1,61 @@
extends Camera3D
@export var height := 1.7
@export var move_duration := 1
var tween: Tween
var _history: Array[Transform3D] = []
var _is_moving := false
func _ready() -> void:
ClickManager.camera_move_requested.connect(_move_to)
func _set_position(pos: Vector3) -> void:
var t := global_transform
t.origin = pos
global_transform = t
func _move_to(target: Transform3D) -> void:
# Save current position before moving
_history.append(global_transform)
var start_transform := global_transform
var end_transform := target
#end_transform.origin.y = height
if tween:
tween.kill()
tween = create_tween().set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
tween.tween_method(_set_position, start_transform.origin, end_transform.origin, move_duration)
tween.parallel().tween_method(
_set_rotation,
Quaternion(start_transform.basis),
Quaternion(end_transform.basis),
move_duration
)
func go_back() -> void:
if _history.is_empty() or _is_moving:
return
var previous: Transform3D = _history.pop_back()
var start_transform := global_transform
var end_transform := previous
if tween:
tween.kill()
_is_moving = true
tween = create_tween().set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
tween.tween_method(_set_position, start_transform.origin, end_transform.origin, move_duration)
tween.parallel().tween_method(
_set_rotation,
Quaternion(start_transform.basis),
Quaternion(end_transform.basis),
move_duration
)
tween.tween_callback(func(): _is_moving = false)
func _set_rotation(q: Quaternion) -> void:
var t := global_transform
t.basis = Basis(q.normalized())
global_transform = t
func has_history() -> bool:
return not _history.is_empty()

View File

@@ -0,0 +1 @@
uid://o07ow17lw045

97
scripts/click_manager.gd Normal file
View File

@@ -0,0 +1,97 @@
extends Node
signal camera_move_requested(destination: Transform3D)
signal back_requested
var _hovered: Clickable = null
func get_camera() -> Camera3D:
return get_viewport().get_camera_3d()
func _ready() -> void:
back_requested.connect(_on_back_requested)
func _process(_delta: float) -> void:
_update_hover(get_viewport().get_mouse_position())
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
_raycast_click(get_viewport().get_mouse_position())
if event is InputEventKey and event.pressed and not event.echo:
if event.keycode == KEY_ESCAPE or event.keycode == KEY_BACKSPACE:
request_back()
func _on_back_requested() -> void:
var cam = get_camera()
if cam and cam.has_method("go_back"):
cam.go_back()
func request_back() -> void:
back_requested.emit()
func _update_hover(screen_pos: Vector2) -> void:
var clickable = _raycast_find_clickable(screen_pos)
if clickable != _hovered:
_hovered = clickable
if _hovered:
CursorManager.set_cursor(_hovered.cursor_hint)
else:
CursorManager.reset()
func _raycast_click(screen_pos: Vector2) -> void:
var clickable = _raycast_find_clickable(screen_pos)
if clickable:
clickable.on_clicked(_raycast_position(screen_pos))
func _raycast_find_clickable(screen_pos: Vector2) -> Clickable:
var result = _raycast(screen_pos)
if result.is_empty():
return null
return _find_clickable_in(result.collider)
func _raycast_position(screen_pos: Vector2) -> Vector3:
var result = _raycast(screen_pos)
return result.get("position", Vector3.ZERO)
func _raycast(screen_pos: Vector2) -> Dictionary:
var camera = get_camera()
if not camera:
return {}
var space = camera.get_world_3d().direct_space_state
var origin = camera.project_ray_origin(screen_pos)
var end = origin + camera.project_ray_normal(screen_pos) * 100.0
var query = PhysicsRayQueryParameters3D.create(origin, end)
return space.intersect_ray(query)
func _find_clickable_in(node: Node) -> Clickable:
while node:
var c = node.find_child("Clickable", false, false)
if c:
return c as Clickable
node = node.get_parent()
return null
func request_camera_move(destination: Transform3D) -> void:
camera_move_requested.emit(destination)

View File

@@ -0,0 +1 @@
uid://dkk6rjysw5at4

12
scripts/clickable.gd Normal file
View File

@@ -0,0 +1,12 @@
class_name Clickable
extends Node
@export var actions: Array[ClickAction] = []
@export var cursor_hint: String = "interact"
signal clicked(hit_position: Vector3)
func on_clicked(hit_position: Vector3) -> void:
clicked.emit(hit_position)
for action in actions:
action.execute(self, hit_position)

1
scripts/clickable.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://csgeq0gmnr2fd

22
scripts/cursor_manager.gd Normal file
View File

@@ -0,0 +1,22 @@
extends Node
# Preload all your cursor images
const CURSORS = {
"default": preload("res://cursors/default.png"),
"interact": preload("res://cursors/hand.png"),
"move": preload("res://cursors/walk.png"),
"look": preload("res://cursors/eye.png"),
"test": preload("res://cursors/test.png"),
}
var _current: String = "default"
func set_cursor(hint: String) -> void:
if hint == _current:
return
var texture = CURSORS.get(hint, CURSORS["default"])
Input.set_custom_mouse_cursor(texture, Input.CURSOR_ARROW, Vector2(32, 32))
_current = hint
func reset() -> void:
set_cursor("default")

View File

@@ -0,0 +1 @@
uid://cm8a48in56shx

9
scripts/main_menu.gd Normal file
View File

@@ -0,0 +1,9 @@
extends Control
func _on_house_scene_button_pressed() -> void:
var house_scene = load("res://main.tscn")
get_tree().change_scene_to_packed(house_scene)
func _on_vestibule_button_pressed() -> void:
var vestibule_scene = load("res://massive_test.tscn")
get_tree().change_scene_to_packed(vestibule_scene)

1
scripts/main_menu.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://du41t41ntqcve