Init
This commit is contained in:
10
scripts/actions/action_move_camera.gd
Normal file
10
scripts/actions/action_move_camera.gd
Normal 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)
|
||||
1
scripts/actions/action_move_camera.gd.uid
Normal file
1
scripts/actions/action_move_camera.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bxo70v3k38pf
|
||||
9
scripts/actions/action_pickup.gd
Normal file
9
scripts/actions/action_pickup.gd
Normal 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)
|
||||
1
scripts/actions/action_pickup.gd.uid
Normal file
1
scripts/actions/action_pickup.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://vim075gwnpvv
|
||||
5
scripts/actions/action_quit.gd
Normal file
5
scripts/actions/action_quit.gd
Normal file
@@ -0,0 +1,5 @@
|
||||
class_name QuitAction
|
||||
extends ClickAction
|
||||
|
||||
func execute(clickable: Node, hit_position: Vector3) -> void:
|
||||
clickable.get_tree().quit()
|
||||
1
scripts/actions/action_quit.gd.uid
Normal file
1
scripts/actions/action_quit.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://de2v1ku4lbmbk
|
||||
6
scripts/actions/click_action.gd
Normal file
6
scripts/actions/click_action.gd
Normal file
@@ -0,0 +1,6 @@
|
||||
class_name ClickAction
|
||||
extends Resource
|
||||
|
||||
# Override this in subclasses
|
||||
func execute(clickable: Node, hit_position: Vector3) -> void:
|
||||
pass
|
||||
1
scripts/actions/click_action.gd.uid
Normal file
1
scripts/actions/click_action.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://csxn4d2cgn4vv
|
||||
9
scripts/back_ui.gd
Normal file
9
scripts/back_ui.gd
Normal 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
1
scripts/back_ui.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ccm5q76xwkbj7
|
||||
61
scripts/camera_controller.gd
Normal file
61
scripts/camera_controller.gd
Normal 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()
|
||||
1
scripts/camera_controller.gd.uid
Normal file
1
scripts/camera_controller.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://o07ow17lw045
|
||||
97
scripts/click_manager.gd
Normal file
97
scripts/click_manager.gd
Normal 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)
|
||||
1
scripts/click_manager.gd.uid
Normal file
1
scripts/click_manager.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dkk6rjysw5at4
|
||||
12
scripts/clickable.gd
Normal file
12
scripts/clickable.gd
Normal 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
1
scripts/clickable.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://csgeq0gmnr2fd
|
||||
22
scripts/cursor_manager.gd
Normal file
22
scripts/cursor_manager.gd
Normal 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")
|
||||
1
scripts/cursor_manager.gd.uid
Normal file
1
scripts/cursor_manager.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cm8a48in56shx
|
||||
9
scripts/main_menu.gd
Normal file
9
scripts/main_menu.gd
Normal 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
1
scripts/main_menu.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://du41t41ntqcve
|
||||
Reference in New Issue
Block a user