Compare commits
20 Commits
0c31e684e3
...
main
Author | SHA1 | Date | |
---|---|---|---|
96b5bae9d0 | |||
2b58781907 | |||
39aca9aa3f | |||
aea5158d6e | |||
6d75b33775 | |||
3ccf4ebabb | |||
6f1defb3da | |||
379c7007aa | |||
e74896527b | |||
5cd8b8a04b | |||
0f3db7c4a4 | |||
a7dcf760a7 | |||
53ad2da596 | |||
e0dd14c460 | |||
29ebb68215 | |||
7ae9d534ab | |||
58126341ba | |||
3e95481282 | |||
977f17f73b | |||
c7bed57b82 |
27
InteractableArea.gd
Normal file
27
InteractableArea.gd
Normal file
@@ -0,0 +1,27 @@
|
||||
class_name InteractableArea extends Area3D
|
||||
|
||||
signal interactEvent(playerEntity:Player)
|
||||
signal interactable(playerEntity:Player)
|
||||
signal notInteractable(playerEntity:Player)
|
||||
|
||||
func _enter_tree() -> void:
|
||||
area_entered.connect(onAreaEntered)
|
||||
area_exited.connect(onAreaExited)
|
||||
|
||||
func _exit_tree() -> void:
|
||||
area_entered.disconnect(onAreaEntered)
|
||||
area_exited.disconnect(onAreaExited)
|
||||
|
||||
func onAreaEntered(area:Area3D) -> void:
|
||||
if !area.get_parent() or !(area.get_parent() is Player):
|
||||
return
|
||||
|
||||
var player:Player = area.get_parent() as Player
|
||||
interactable.emit(player)
|
||||
|
||||
func onAreaExited(area:Area3D) -> void:
|
||||
if !area.get_parent() or !(area.get_parent() is Player):
|
||||
return
|
||||
|
||||
var player:Player = area.get_parent() as Player
|
||||
notInteractable.emit(player)
|
50
MapChangeInteract.gd
Normal file
50
MapChangeInteract.gd
Normal file
@@ -0,0 +1,50 @@
|
||||
class_name MapChangeInteract extends Node3D
|
||||
|
||||
|
||||
@export var mapResource:PackedScene
|
||||
@export var destinationPointNodeName:String
|
||||
var interactableArea:InteractableArea
|
||||
var shapeChild:CollisionShape3D
|
||||
|
||||
func _enter_tree() -> void:
|
||||
interactableArea = $InteractableArea
|
||||
|
||||
if !mapResource:
|
||||
push_error("MapChangeInteract must have a mapResource set.")
|
||||
return
|
||||
|
||||
# Needs to be exactly one child.
|
||||
if get_child_count() != 2:
|
||||
push_error("MapChangeInteract must have exactly one child InteractableArea node.")
|
||||
return
|
||||
|
||||
var child = get_child(1)
|
||||
if not (child is CollisionShape3D):
|
||||
push_error("MapChangeInteract's child must be an CollisionShape3D node.")
|
||||
|
||||
shapeChild = child
|
||||
remove_child(shapeChild)
|
||||
interactableArea.add_child(shapeChild)
|
||||
|
||||
interactableArea.interactEvent.connect(onInteract)
|
||||
interactableArea.interactable.connect(onInteractable)
|
||||
interactableArea.notInteractable.connect(onNotInteractable)
|
||||
|
||||
func _exit_tree() -> void:
|
||||
interactableArea.interactEvent.disconnect(onInteract)
|
||||
interactableArea.interactable.disconnect(onInteractable)
|
||||
interactableArea.notInteractable.disconnect(onNotInteractable)
|
||||
|
||||
interactableArea.remove_child(shapeChild)
|
||||
add_child(shapeChild)
|
||||
|
||||
func onInteract(_ent:Player) -> void:
|
||||
OVERWORLD.mapChange(mapResource, destinationPointNodeName)
|
||||
|
||||
func onInteractable(_ent:Player) -> void:
|
||||
print("Able to leave map")
|
||||
pass
|
||||
|
||||
func onNotInteractable(_ent:Player) -> void:
|
||||
print("Not able to leave map")
|
||||
pass
|
1
MapChangeInteract.gd.uid
Normal file
1
MapChangeInteract.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cpqmjomfpyifw
|
11
MapChangeInteract.tscn
Normal file
11
MapChangeInteract.tscn
Normal file
@@ -0,0 +1,11 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://cr6h3g15bf6ts"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cpqmjomfpyifw" path="res://MapChangeInteract.gd" id="1_4tqca"]
|
||||
[ext_resource type="Script" uid="uid://b00rxpveu3v4m" path="res://InteractableArea.gd" id="2_3pe6u"]
|
||||
|
||||
[node name="MapChangeInteract" type="Node3D"]
|
||||
script = ExtResource("1_4tqca")
|
||||
|
||||
[node name="InteractableArea" type="Area3D" parent="."]
|
||||
script = ExtResource("2_3pe6u")
|
||||
metadata/_custom_type_script = "uid://b00rxpveu3v4m"
|
@@ -86,7 +86,7 @@ func _enter_tree():
|
||||
_parse_input_actions()
|
||||
|
||||
func _exit_tree():
|
||||
Mapper.queue_free()
|
||||
Mapper = null
|
||||
|
||||
func _parse_input_actions():
|
||||
_custom_input_actions.clear()
|
||||
@@ -189,10 +189,13 @@ func refresh():
|
||||
func get_joypad_type(controller: int = _last_controller) -> ControllerSettings.Devices:
|
||||
return Mapper._get_joypad_type(controller, _settings.joypad_fallback)
|
||||
|
||||
func parse_path(path: String, input_type = _last_input_type, last_controller = _last_controller) -> Texture:
|
||||
func get_last_input_type() -> InputType:
|
||||
return _last_input_type
|
||||
|
||||
func parse_path(path: String, input_type = _last_input_type, last_controller = _last_controller, forced_controller_icon_style = ControllerSettings.Devices.NONE) -> Texture:
|
||||
if typeof(input_type) == TYPE_NIL:
|
||||
return null
|
||||
var root_paths := _expand_path(path, input_type, last_controller)
|
||||
var root_paths := _expand_path(path, input_type, last_controller, forced_controller_icon_style)
|
||||
for root_path in root_paths:
|
||||
if _load_icon(root_path):
|
||||
continue
|
||||
@@ -228,6 +231,7 @@ func parse_event_modifiers(event: InputEvent) -> Array[Texture]:
|
||||
for icon_path in _expand_path(modifier, InputType.KEYBOARD_MOUSE, -1):
|
||||
if _load_icon(icon_path) == OK:
|
||||
icons.push_back(_cached_icons[icon_path])
|
||||
break
|
||||
|
||||
return icons
|
||||
|
||||
@@ -270,7 +274,7 @@ func get_matching_event(path: String, input_type: InputType = _last_input_type,
|
||||
else:
|
||||
events = InputMap.action_get_events(path)
|
||||
|
||||
var fallback = null
|
||||
var fallbacks = []
|
||||
for event in events:
|
||||
if not is_instance_valid(event): continue
|
||||
|
||||
@@ -283,13 +287,15 @@ func get_matching_event(path: String, input_type: InputType = _last_input_type,
|
||||
# Use the first device specific mapping if there is one.
|
||||
if event.device == controller:
|
||||
return event
|
||||
# Otherwise use the first "all devices" mapping.
|
||||
elif fallback == null and event.device < 0:
|
||||
fallback = event
|
||||
# Otherwise, we create a fallback prioritizing events with 'ALL_DEVICE'
|
||||
if event.device < 0: # All-device event
|
||||
fallbacks.push_front(event)
|
||||
else:
|
||||
fallbacks.push_back(event)
|
||||
|
||||
return fallback
|
||||
return fallbacks[0] if not fallbacks.is_empty() else null
|
||||
|
||||
func _expand_path(path: String, input_type: int, controller: int) -> Array:
|
||||
func _expand_path(path: String, input_type: int, controller: int, forced_controller_icon_style = ControllerSettings.Devices.NONE) -> Array:
|
||||
var paths := []
|
||||
var base_paths := [
|
||||
_settings.custom_asset_dir + "/",
|
||||
@@ -298,20 +304,20 @@ func _expand_path(path: String, input_type: int, controller: int) -> Array:
|
||||
for base_path in base_paths:
|
||||
if base_path.is_empty():
|
||||
continue
|
||||
base_path += _convert_path_to_asset_file(path, input_type, controller)
|
||||
base_path += _convert_path_to_asset_file(path, input_type, controller, forced_controller_icon_style)
|
||||
|
||||
paths.push_back(base_path + "." + _base_extension)
|
||||
return paths
|
||||
|
||||
func _convert_path_to_asset_file(path: String, input_type: int, controller: int) -> String:
|
||||
func _convert_path_to_asset_file(path: String, input_type: int, controller: int, forced_controller_icon_style = ControllerSettings.Devices.NONE) -> String:
|
||||
match get_path_type(path):
|
||||
PathType.INPUT_ACTION:
|
||||
var event := get_matching_event(path, input_type, controller)
|
||||
if event:
|
||||
return _convert_event_to_path(event)
|
||||
return _convert_event_to_path(event, controller, forced_controller_icon_style)
|
||||
return path
|
||||
PathType.JOYPAD_PATH:
|
||||
return Mapper._convert_joypad_path(path, controller, _settings.joypad_fallback)
|
||||
return Mapper._convert_joypad_path(path, controller, _settings.joypad_fallback, forced_controller_icon_style)
|
||||
PathType.SPECIFIC_PATH, _:
|
||||
return path
|
||||
|
||||
@@ -372,7 +378,7 @@ func _convert_asset_file_to_tts(path: String) -> String:
|
||||
_:
|
||||
return path
|
||||
|
||||
func _convert_event_to_path(event: InputEvent):
|
||||
func _convert_event_to_path(event: InputEvent, controller: int = _last_controller, forced_controller_icon_style = ControllerSettings.Devices.NONE):
|
||||
if event is InputEventKey:
|
||||
# If this is a physical key, convert to localized scancode
|
||||
if event.keycode == 0:
|
||||
@@ -381,9 +387,9 @@ func _convert_event_to_path(event: InputEvent):
|
||||
elif event is InputEventMouseButton:
|
||||
return _convert_mouse_button_to_path(event.button_index)
|
||||
elif event is InputEventJoypadButton:
|
||||
return _convert_joypad_button_to_path(event.button_index, event.device)
|
||||
return _convert_joypad_button_to_path(event.button_index, controller, forced_controller_icon_style)
|
||||
elif event is InputEventJoypadMotion:
|
||||
return _convert_joypad_motion_to_path(event.axis, event.device)
|
||||
return _convert_joypad_motion_to_path(event.axis, controller, forced_controller_icon_style)
|
||||
|
||||
func _convert_key_to_path(scancode: int):
|
||||
match scancode:
|
||||
@@ -615,7 +621,7 @@ func _convert_mouse_button_to_path(button_index: int):
|
||||
_:
|
||||
return "mouse/sample"
|
||||
|
||||
func _convert_joypad_button_to_path(button_index: int, controller: int):
|
||||
func _convert_joypad_button_to_path(button_index: int, controller: int, forced_controller_icon_style = ControllerSettings.Devices.NONE):
|
||||
var path
|
||||
match button_index:
|
||||
JOY_BUTTON_A:
|
||||
@@ -652,9 +658,9 @@ func _convert_joypad_button_to_path(button_index: int, controller: int):
|
||||
path = "joypad/share"
|
||||
_:
|
||||
return ""
|
||||
return Mapper._convert_joypad_path(path, controller, _settings.joypad_fallback)
|
||||
return Mapper._convert_joypad_path(path, controller, _settings.joypad_fallback, forced_controller_icon_style)
|
||||
|
||||
func _convert_joypad_motion_to_path(axis: int, controller: int):
|
||||
func _convert_joypad_motion_to_path(axis: int, controller: int, forced_controller_icon_style = ControllerSettings.Devices.NONE):
|
||||
var path : String
|
||||
match axis:
|
||||
JOY_AXIS_LEFT_X, JOY_AXIS_LEFT_Y:
|
||||
@@ -667,7 +673,7 @@ func _convert_joypad_motion_to_path(axis: int, controller: int):
|
||||
path = "joypad/rt"
|
||||
_:
|
||||
return ""
|
||||
return Mapper._convert_joypad_path(path, controller, _settings.joypad_fallback)
|
||||
return Mapper._convert_joypad_path(path, controller, _settings.joypad_fallback, forced_controller_icon_style)
|
||||
|
||||
func _load_icon(path: String) -> int:
|
||||
if _cached_icons.has(path): return OK
|
||||
|
@@ -1 +1 @@
|
||||
uid://cxxl7e1hu587n
|
||||
uid://b06g4dpg627b5
|
||||
|
@@ -3,6 +3,7 @@ extends Resource
|
||||
class_name ControllerSettings
|
||||
|
||||
enum Devices {
|
||||
NONE = -1,
|
||||
LUNA,
|
||||
OUYA,
|
||||
PS3,
|
1
addons/controller_icons/ControllerSettings.gd.uid
Normal file
1
addons/controller_icons/ControllerSettings.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bih8ls5msy63l
|
21
addons/controller_icons/LICENSE
Normal file
21
addons/controller_icons/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 Ricardo Subtil
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@@ -1,8 +1,8 @@
|
||||
extends Node
|
||||
extends RefCounted
|
||||
class_name ControllerMapper
|
||||
|
||||
func _convert_joypad_path(path: String, device: int, fallback: ControllerSettings.Devices) -> String:
|
||||
match _get_joypad_type(device, fallback):
|
||||
func _convert_joypad_path(path: String, device: int, fallback: ControllerSettings.Devices, force_controller_icon_style = ControllerSettings.Devices.NONE) -> String:
|
||||
match _get_joypad_type(device, fallback, force_controller_icon_style):
|
||||
ControllerSettings.Devices.LUNA:
|
||||
return _convert_joypad_to_luna(path)
|
||||
ControllerSettings.Devices.PS3:
|
||||
@@ -32,7 +32,9 @@ func _convert_joypad_path(path: String, device: int, fallback: ControllerSetting
|
||||
_:
|
||||
return ""
|
||||
|
||||
func _get_joypad_type(device, fallback):
|
||||
func _get_joypad_type(device, fallback, force_controller_icon_style):
|
||||
if force_controller_icon_style != ControllerSettings.Devices.NONE:
|
||||
return force_controller_icon_style
|
||||
var available = Input.get_connected_joypads()
|
||||
if available.is_empty():
|
||||
return fallback
|
||||
@@ -264,7 +266,7 @@ func _convert_joypad_to_steamdeck(path: String):
|
||||
"rt":
|
||||
return path.replace("/rt", "/r2")
|
||||
"select":
|
||||
return path.replace("/select", "/square")
|
||||
return path.replace("/select", "/inventory")
|
||||
"start":
|
||||
return path.replace("/start", "/menu")
|
||||
"home":
|
||||
|
@@ -1 +1 @@
|
||||
uid://dtgqdoflwmo0b
|
||||
uid://5wx82aghglqr
|
||||
|
@@ -1 +0,0 @@
|
||||
uid://dygveqy02jjgx
|
BIN
addons/controller_icons/assets/steamdeck/inventory.png
Normal file
BIN
addons/controller_icons/assets/steamdeck/inventory.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.5 KiB |
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://ds5yo8kn81uem"
|
||||
path="res://.godot/imported/inventory.png-2e96b194d1562d723597b2d307313c1b.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/controller_icons/assets/steamdeck/inventory.png"
|
||||
dest_files=["res://.godot/imported/inventory.png-2e96b194d1562d723597b2d307313c1b.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
@@ -1 +1 @@
|
||||
uid://lm0qpml4w2mx
|
||||
uid://jcpjcl10iatx
|
||||
|
@@ -1 +1 @@
|
||||
uid://dkn6l8tlu56d8
|
||||
uid://xp37xj8kduow
|
||||
|
@@ -1 +1 @@
|
||||
uid://sg5ntoaywgfd
|
||||
uid://r1qngdbv7gh4
|
||||
|
@@ -1 +1 @@
|
||||
uid://125nay2twqlr
|
||||
uid://bsynmd02318ph
|
||||
|
@@ -1 +1 @@
|
||||
uid://d1hrxvtfr4t5w
|
||||
uid://da3havxu352nb
|
||||
|
@@ -50,7 +50,7 @@ class_name ControllerIconTexture
|
||||
## # res://addons/controller_icons/assets/steam/gyro.png
|
||||
## path = "steam/gyro"
|
||||
## [/codeblock]
|
||||
@export var path : String = "":
|
||||
@export var path: String = "":
|
||||
set(_path):
|
||||
path = _path
|
||||
_load_texture_path()
|
||||
@@ -63,11 +63,25 @@ enum ShowMode {
|
||||
|
||||
## Show the icon only if a specific input method is being used. When hidden,
|
||||
## the icon will not occupy have any space (no width and height).
|
||||
@export var show_mode : ShowMode = ShowMode.ANY:
|
||||
@export var show_mode: ShowMode = ShowMode.ANY:
|
||||
set(_show_mode):
|
||||
show_mode = _show_mode
|
||||
_load_texture_path()
|
||||
|
||||
|
||||
## Forces the icon to show a specific controller style, regardless of the
|
||||
## currently used controller type.
|
||||
##[br][br]
|
||||
## This will override force_device if set to a value other than NONE.
|
||||
##[br][br]
|
||||
## This is only relevant for paths using input actions, and has no effect on
|
||||
## other scenarios.
|
||||
|
||||
@export var force_controller_icon_style: ControllerSettings.Devices = ControllerSettings.Devices.NONE:
|
||||
set(_force_controller_icon_style):
|
||||
force_controller_icon_style = _force_controller_icon_style
|
||||
_load_texture_path()
|
||||
|
||||
enum ForceType {
|
||||
NONE, ## Icon will swap according to the used input method.
|
||||
KEYBOARD_MOUSE, ## Icon will always show the keyboard/mouse action.
|
||||
@@ -79,14 +93,42 @@ enum ForceType {
|
||||
##[br][br]
|
||||
## This is only relevant for paths using input actions, and has no effect on
|
||||
## other scenarios.
|
||||
@export var force_type : ForceType = ForceType.NONE:
|
||||
@export var force_type: ForceType = ForceType.NONE:
|
||||
set(_force_type):
|
||||
force_type = _force_type
|
||||
_load_texture_path()
|
||||
|
||||
enum ForceDevice {
|
||||
DEVICE_0,
|
||||
DEVICE_1,
|
||||
DEVICE_2,
|
||||
DEVICE_3,
|
||||
DEVICE_4,
|
||||
DEVICE_5,
|
||||
DEVICE_6,
|
||||
DEVICE_7,
|
||||
DEVICE_8,
|
||||
DEVICE_9,
|
||||
DEVICE_10,
|
||||
DEVICE_11,
|
||||
DEVICE_12,
|
||||
DEVICE_13,
|
||||
DEVICE_14,
|
||||
DEVICE_15,
|
||||
ANY # No device will be forced
|
||||
}
|
||||
|
||||
## Forces the icon to use the textures for the device connected at the specified index.
|
||||
## For example, if a PlayStation 5 controller is connected at device_index 0,
|
||||
## the icon will always show PlayStation 5 textures.
|
||||
@export var force_device: ForceDevice = ForceDevice.ANY:
|
||||
set(_force_device):
|
||||
force_device = _force_device
|
||||
_load_texture_path()
|
||||
|
||||
@export_subgroup("Text Rendering")
|
||||
## Custom LabelSettings. If set, overrides the addon's global label settings.
|
||||
@export var custom_label_settings : LabelSettings:
|
||||
@export var custom_label_settings: LabelSettings:
|
||||
set(_custom_label_settings):
|
||||
custom_label_settings = _custom_label_settings
|
||||
_load_texture_path()
|
||||
@@ -117,7 +159,7 @@ func _can_be_shown():
|
||||
0, _:
|
||||
return true
|
||||
|
||||
var _textures : Array[Texture2D]:
|
||||
var _textures: Array[Texture2D]:
|
||||
set(__textures):
|
||||
# UPGRADE: In Godot 4.2, for-loop variables can be
|
||||
# statically typed:
|
||||
@@ -147,9 +189,9 @@ var _textures : Array[Texture2D]:
|
||||
if tex:
|
||||
tex.connect("changed", _reload_resource)
|
||||
|
||||
var _font : Font
|
||||
var _label_settings : LabelSettings
|
||||
var _text_size : Vector2
|
||||
var _font: Font
|
||||
var _label_settings: LabelSettings
|
||||
var _text_size: Vector2
|
||||
|
||||
func _on_label_settings_changed():
|
||||
_font = ThemeDB.fallback_font if not _label_settings.font else _label_settings.font
|
||||
@@ -161,13 +203,14 @@ func _reload_resource():
|
||||
emit_changed()
|
||||
|
||||
func _load_texture_path_impl():
|
||||
var textures : Array[Texture2D] = []
|
||||
var textures: Array[Texture2D] = []
|
||||
if ControllerIcons.is_node_ready() and _can_be_shown():
|
||||
var input_type = ControllerIcons._last_input_type if force_type == ForceType.NONE else force_type - 1
|
||||
if ControllerIcons.get_path_type(path) == ControllerIcons.PathType.INPUT_ACTION:
|
||||
var event := ControllerIcons.get_matching_event(path, input_type)
|
||||
textures.append_array(ControllerIcons.parse_event_modifiers(event))
|
||||
var tex := ControllerIcons.parse_path(path, input_type)
|
||||
var target_device = force_device if force_device != ForceDevice.ANY else ControllerIcons._last_controller
|
||||
var tex := ControllerIcons.parse_path(path, input_type, target_device, force_controller_icon_style)
|
||||
if tex:
|
||||
textures.append(tex)
|
||||
_textures = textures
|
||||
@@ -200,7 +243,7 @@ func _get_width() -> int:
|
||||
return accum
|
||||
, 0)
|
||||
if _label_settings:
|
||||
ret += max(0, _textures.size()-1) * _text_size.x
|
||||
ret += max(0, _textures.size() - 1) * _text_size.x
|
||||
# If ret is 0, return a size of 2 to prevent triggering engine checks
|
||||
# for null sizes. The correct size will be set at a later frame.
|
||||
return ret if ret > 0 else _NULL_SIZE
|
||||
@@ -235,7 +278,7 @@ func _draw(to_canvas_item: RID, pos: Vector2, modulate: Color, transpose: bool):
|
||||
var position := pos
|
||||
|
||||
for i in range(_textures.size()):
|
||||
var tex:Texture2D = _textures[i]
|
||||
var tex: Texture2D = _textures[i]
|
||||
if !tex: continue
|
||||
|
||||
if i != 0:
|
||||
@@ -256,7 +299,7 @@ func _draw_rect(to_canvas_item: RID, rect: Rect2, tile: bool, modulate: Color, t
|
||||
var height_ratio := rect.size.y / _get_height()
|
||||
|
||||
for i in range(_textures.size()):
|
||||
var tex:Texture2D = _textures[i]
|
||||
var tex: Texture2D = _textures[i]
|
||||
if !tex: continue
|
||||
|
||||
if i != 0:
|
||||
@@ -278,7 +321,7 @@ func _draw_rect_region(to_canvas_item: RID, rect: Rect2, src_rect: Rect2, modula
|
||||
var height_ratio := rect.size.y / _get_height()
|
||||
|
||||
for i in range(_textures.size()):
|
||||
var tex:Texture2D = _textures[i]
|
||||
var tex: Texture2D = _textures[i]
|
||||
if !tex: continue
|
||||
|
||||
if i != 0:
|
||||
@@ -314,15 +357,15 @@ func _draw_text(to_canvas_item: RID, font_position: Vector2, text: String):
|
||||
_font.draw_string_outline(to_canvas_item, font_position, text, HORIZONTAL_ALIGNMENT_LEFT, -1, _label_settings.font_size, _label_settings.outline_size, _label_settings.outline_color)
|
||||
_font.draw_string(to_canvas_item, font_position, text, HORIZONTAL_ALIGNMENT_CENTER, -1, _label_settings.font_size, _label_settings.font_color)
|
||||
|
||||
var _helper_viewport : Viewport
|
||||
var _is_stitching_texture : bool = false
|
||||
var _helper_viewport: Viewport
|
||||
var _is_stitching_texture: bool = false
|
||||
func _stitch_texture():
|
||||
if _textures.is_empty():
|
||||
return
|
||||
|
||||
_is_stitching_texture = true
|
||||
|
||||
var font_image : Image
|
||||
var font_image: Image
|
||||
if _textures.size() > 1:
|
||||
# Generate a viewport to draw the text
|
||||
_helper_viewport = SubViewport.new()
|
||||
@@ -345,7 +388,7 @@ func _stitch_texture():
|
||||
_helper_viewport.free()
|
||||
|
||||
var position := Vector2i(0, 0)
|
||||
var img : Image
|
||||
var img: Image
|
||||
for i in range(_textures.size()):
|
||||
if !_textures[i]: continue
|
||||
|
||||
@@ -375,7 +418,7 @@ func _stitch_texture():
|
||||
# This is necessary for 3D sprites, as the texture is assigned to a material, and not drawn directly.
|
||||
# For multi prompts, we need to generate a texture
|
||||
var _dirty := true
|
||||
var _texture_3d : Texture
|
||||
var _texture_3d: Texture
|
||||
func _get_rid():
|
||||
if _dirty:
|
||||
if not _is_stitching_texture:
|
||||
|
@@ -1 +1 @@
|
||||
uid://ddxpo5u73ssi2
|
||||
uid://cxab4gf8nejc2
|
||||
|
@@ -1 +1 @@
|
||||
uid://k2tud3diool
|
||||
uid://dlwwg6hbxcg6r
|
||||
|
@@ -1 +1 @@
|
||||
uid://bpos4yaigyeqr
|
||||
uid://dns2c4458ekvc
|
||||
|
@@ -1 +1 @@
|
||||
uid://dmp4w4ojx7klt
|
||||
uid://cispm18xp24wt
|
||||
|
@@ -1 +1 @@
|
||||
uid://bu8t48xqekc8o
|
||||
uid://c6lqhrewwbp61
|
||||
|
@@ -1 +1 @@
|
||||
uid://da1ors8v36hv3
|
||||
uid://texv8inbqrdh
|
||||
|
@@ -1 +1 @@
|
||||
uid://dt82cmmp3uy7l
|
||||
uid://wnl1k7337x2u
|
||||
|
@@ -3,5 +3,5 @@
|
||||
name="Controller Icons"
|
||||
description="Provides icons for all major controllers and keyboard, with automatic icon remapping."
|
||||
author="rsubtil"
|
||||
version="3.1.4"
|
||||
version="3.1.5"
|
||||
script="plugin.gd"
|
||||
|
@@ -1 +1 @@
|
||||
uid://cajvrhetudhyg
|
||||
uid://xvjobdx0h3gi
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[gd_resource type="Resource" script_class="ControllerSettings" load_steps=2 format=3 uid="uid://dolsrvh5w47et"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/controller_icons/Settings.gd" id="1"]
|
||||
[ext_resource type="Script" path="res://addons/controller_icons/ControllerSettings.gd" id="1"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1")
|
||||
|
@@ -28,4 +28,5 @@ func nextItem() -> void:
|
||||
return
|
||||
|
||||
var item = items[itemIndex]
|
||||
item.cutscene = self
|
||||
item.start()
|
@@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://bhvoo48bpbkf3"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://d3rtd0ln7l2gr" path="res://scenes/maps/tundra/MapTundra.tscn" id="1_fsb0j"]
|
||||
[ext_resource type="PackedScene" uid="uid://d3rtd0ln7l2gr" path="res://scenes/maps/MapTundra.tscn" id="1_fsb0j"]
|
||||
|
||||
[node name="CutsceneTest" type="Node3D"]
|
||||
|
@@ -1,5 +1,12 @@
|
||||
class_name CutsceneItem extends Node
|
||||
|
||||
var cutscene:Cutscene = null
|
||||
|
||||
func start() -> void:
|
||||
# This method should be overridden by subclasses
|
||||
pass
|
||||
|
||||
func done() -> void:
|
||||
if !cutscene:
|
||||
return
|
||||
cutscene.nextItem()
|
@@ -21,3 +21,4 @@ func onTextboxClosing() -> void:
|
||||
else:
|
||||
UI.TEXTBOX.textboxClosing.disconnect(onTextboxClosing)
|
||||
UI.TEXTBOX.setText("")
|
||||
done()
|
148
entity/EntityMovement.gd
Normal file
148
entity/EntityMovement.gd
Normal file
@@ -0,0 +1,148 @@
|
||||
@tool
|
||||
class_name EntityMovement extends Node
|
||||
|
||||
const FRICTION = 0.01
|
||||
|
||||
enum FacingDirection {
|
||||
SOUTH = 0,
|
||||
EAST = 1,
|
||||
NORTH = 2,
|
||||
WEST = 3
|
||||
};
|
||||
|
||||
const FacingDirWalkAnimations = {
|
||||
FacingDirection.SOUTH: "walk_south",
|
||||
FacingDirection.EAST: "walk_east",
|
||||
FacingDirection.NORTH: "walk_north",
|
||||
FacingDirection.WEST: "walk_west"
|
||||
};
|
||||
|
||||
const FacingDirAngle = {
|
||||
FacingDirection.SOUTH: 0.0,
|
||||
FacingDirection.EAST: PI / 2,
|
||||
FacingDirection.NORTH: PI,
|
||||
FacingDirection.WEST: -PI / 2
|
||||
};
|
||||
|
||||
var _inputDir:Vector2 = Vector2.ZERO
|
||||
var _facingDir:FacingDirection = FacingDirection.SOUTH
|
||||
var _running:bool = false
|
||||
|
||||
@export var body:CharacterBody3D
|
||||
@export var rotate:Node3D
|
||||
@export var sprite:AnimatedSprite3D
|
||||
@export var walkSpeed:float = 48.0
|
||||
@export var runSpeed:float = 64.0
|
||||
@export var facingDir:FacingDirection = FacingDirection.SOUTH:
|
||||
set(value):
|
||||
_facingDir = value
|
||||
_updateSprite()
|
||||
get:
|
||||
return _facingDir
|
||||
|
||||
#
|
||||
# Private Methods
|
||||
#
|
||||
func _updateSprite() -> void:
|
||||
if !sprite || sprite.animation == FacingDirWalkAnimations[facingDir]:
|
||||
return
|
||||
sprite.animation = FacingDirWalkAnimations[facingDir]
|
||||
|
||||
|
||||
func _applyFacingDir() -> void:
|
||||
if !sprite || _inputDir.length() <= 0.01:
|
||||
return
|
||||
|
||||
if _inputDir.y > 0:
|
||||
if facingDir != FacingDirection.NORTH && _inputDir.x != 0:
|
||||
if _inputDir.x > 0 && facingDir == FacingDirection.EAST:
|
||||
facingDir = FacingDirection.EAST
|
||||
elif _inputDir.x < 0 && facingDir == FacingDirection.WEST:
|
||||
facingDir = FacingDirection.WEST
|
||||
else:
|
||||
facingDir = FacingDirection.NORTH
|
||||
else:
|
||||
facingDir = FacingDirection.NORTH
|
||||
elif _inputDir.y < 0:
|
||||
if facingDir != FacingDirection.SOUTH && _inputDir.x != 0:
|
||||
if _inputDir.x > 0 && facingDir == FacingDirection.EAST:
|
||||
facingDir = FacingDirection.EAST
|
||||
elif _inputDir.x < 0 && facingDir == FacingDirection.WEST:
|
||||
facingDir = FacingDirection.WEST
|
||||
else:
|
||||
facingDir = FacingDirection.SOUTH
|
||||
else:
|
||||
facingDir = FacingDirection.SOUTH
|
||||
elif _inputDir.x > 0:
|
||||
facingDir = FacingDirection.EAST
|
||||
else:
|
||||
facingDir = FacingDirection.WEST
|
||||
|
||||
func _applyGravity() -> void:
|
||||
if !body.is_on_floor():
|
||||
body.velocity += PHYSICS.GRAVITY * get_process_delta_time()
|
||||
|
||||
func _applyMovement() -> void:
|
||||
if !canMove():
|
||||
return
|
||||
|
||||
var cameraCurrent = get_viewport().get_camera_3d()
|
||||
if !cameraCurrent:
|
||||
return
|
||||
|
||||
# Use camera orientation for movement direction
|
||||
var camBasis = cameraCurrent.global_transform.basis
|
||||
|
||||
# Forward and right vectors, ignore vertical component
|
||||
var forward = -camBasis.z
|
||||
forward.y = 0
|
||||
forward = forward.normalized()
|
||||
var right = camBasis.x
|
||||
right.y = 0
|
||||
right = right.normalized()
|
||||
|
||||
var directionAdjusted = (
|
||||
forward * _inputDir.y + right * _inputDir.x
|
||||
).normalized()
|
||||
if directionAdjusted.length() <= 0.01:
|
||||
return
|
||||
|
||||
if rotate:
|
||||
var targetRot = atan2(directionAdjusted.x, directionAdjusted.z)
|
||||
rotate.rotation.y = targetRot
|
||||
|
||||
var speed = walkSpeed
|
||||
if _running:
|
||||
speed = runSpeed
|
||||
|
||||
body.velocity.x = directionAdjusted.x * speed
|
||||
body.velocity.z = directionAdjusted.z * speed
|
||||
|
||||
func _applyFriction(delta:float) -> void:
|
||||
body.velocity.x *= delta * FRICTION
|
||||
body.velocity.z *= delta * FRICTION
|
||||
|
||||
#
|
||||
# Protected Methods
|
||||
#
|
||||
func canMove() -> bool:
|
||||
return true
|
||||
|
||||
#
|
||||
# Callbacks
|
||||
#
|
||||
func _enter_tree() -> void:
|
||||
_updateSprite()
|
||||
|
||||
func _physics_process(delta:float) -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
|
||||
if !body:
|
||||
return
|
||||
|
||||
_applyGravity()
|
||||
_applyFriction(delta)
|
||||
_applyMovement()
|
||||
_applyFacingDir()
|
||||
body.move_and_slide()
|
1
entity/EntityMovement.gd.uid
Normal file
1
entity/EntityMovement.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://b38dxsome4kiq
|
38
entity/npc/NPC.gd
Normal file
38
entity/npc/NPC.gd
Normal file
@@ -0,0 +1,38 @@
|
||||
@tool
|
||||
class_name NPC extends CharacterBody3D
|
||||
|
||||
@export var _movement:NPCMovement
|
||||
|
||||
@export var facingDirection:EntityMovement.FacingDirection:
|
||||
set(value):
|
||||
if _movement:
|
||||
_movement.facingDir = value
|
||||
get:
|
||||
if _movement:
|
||||
return _movement.facingDir
|
||||
return EntityMovement.FacingDirection.SOUTH
|
||||
|
||||
@export var walkSpeed:float = 48.0:
|
||||
set(value):
|
||||
if _movement:
|
||||
_movement.walkSpeed = value
|
||||
get:
|
||||
if _movement:
|
||||
return _movement.walkSpeed
|
||||
return 48.0
|
||||
|
||||
@export var runSpeed:float = 64.0:
|
||||
set(value):
|
||||
if _movement:
|
||||
_movement.runSpeed = value
|
||||
get:
|
||||
if _movement:
|
||||
return _movement.runSpeed
|
||||
return 64.0
|
||||
|
||||
func onInteract(player:Player) -> void:
|
||||
print("Interacted with NPC")
|
||||
pass
|
||||
|
||||
func _enter_tree() -> void:
|
||||
pass
|
1
entity/npc/NPC.gd.uid
Normal file
1
entity/npc/NPC.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://crw7ls7t8cwct
|
96
entity/npc/NPC.tscn
Normal file
96
entity/npc/NPC.tscn
Normal file
@@ -0,0 +1,96 @@
|
||||
[gd_scene load_steps=12 format=3 uid="uid://kabs7mopalmo"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://crw7ls7t8cwct" path="res://entity/npc/NPC.gd" id="1_00k55"]
|
||||
[ext_resource type="Script" uid="uid://b00rxpveu3v4m" path="res://InteractableArea.gd" id="2_x8luf"]
|
||||
[ext_resource type="Script" uid="uid://tlfthv88ki0y" path="res://entity/npc/NPCMovement.gd" id="3_1seh5"]
|
||||
[ext_resource type="Texture2D" uid="uid://xx3qp5xh7tgu" path="res://entity/player/Player.png" id="4_x8luf"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_1seh5"]
|
||||
size = Vector3(16, 16, 16)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_rl6fg"]
|
||||
atlas = ExtResource("4_x8luf")
|
||||
region = Rect2(16, 0, 16, 16)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_q57vx"]
|
||||
atlas = ExtResource("4_x8luf")
|
||||
region = Rect2(48, 0, 16, 16)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_ak4un"]
|
||||
atlas = ExtResource("4_x8luf")
|
||||
region = Rect2(0, 0, 16, 16)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_1ms0h"]
|
||||
atlas = ExtResource("4_x8luf")
|
||||
region = Rect2(32, 0, 16, 16)
|
||||
|
||||
[sub_resource type="SpriteFrames" id="SpriteFrames_1seh5"]
|
||||
animations = [{
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_rl6fg")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"walk_east",
|
||||
"speed": 5.0
|
||||
}, {
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_q57vx")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"walk_north",
|
||||
"speed": 5.0
|
||||
}, {
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_ak4un")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"walk_south",
|
||||
"speed": 5.0
|
||||
}, {
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_1ms0h")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"walk_west",
|
||||
"speed": 5.0
|
||||
}]
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_x8luf"]
|
||||
radius = 8.5
|
||||
|
||||
[node name="NPC" type="CharacterBody3D" node_paths=PackedStringArray("_movement")]
|
||||
script = ExtResource("1_00k55")
|
||||
_movement = NodePath("Scripts/NPCMovement")
|
||||
|
||||
[node name="Scripts" type="Node" parent="."]
|
||||
|
||||
[node name="NPCMovement" type="Node" parent="Scripts" node_paths=PackedStringArray("body", "sprite")]
|
||||
script = ExtResource("3_1seh5")
|
||||
body = NodePath("../..")
|
||||
sprite = NodePath("../../AnimatedSprite3D")
|
||||
|
||||
[node name="InteractableArea" type="Area3D" parent="."]
|
||||
script = ExtResource("2_x8luf")
|
||||
metadata/_custom_type_script = "uid://b00rxpveu3v4m"
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="InteractableArea"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 8, 0)
|
||||
shape = SubResource("BoxShape3D_1seh5")
|
||||
|
||||
[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="."]
|
||||
pixel_size = 1.0
|
||||
axis = 1
|
||||
double_sided = false
|
||||
texture_filter = 0
|
||||
sprite_frames = SubResource("SpriteFrames_1seh5")
|
||||
animation = &"walk_south"
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 8.5, 0)
|
||||
shape = SubResource("SphereShape3D_x8luf")
|
||||
|
||||
[connection signal="interactEvent" from="InteractableArea" to="." method="onInteract"]
|
1
entity/npc/NPCForwarder.gd.uid
Normal file
1
entity/npc/NPCForwarder.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dda6r22r8eow2
|
2
entity/npc/NPCMovement.gd
Normal file
2
entity/npc/NPCMovement.gd
Normal file
@@ -0,0 +1,2 @@
|
||||
@tool
|
||||
class_name NPCMovement extends "res://entity/EntityMovement.gd"
|
1
entity/npc/NPCMovement.gd.uid
Normal file
1
entity/npc/NPCMovement.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://tlfthv88ki0y
|
5
entity/npc/NPCTest.gd
Normal file
5
entity/npc/NPCTest.gd
Normal file
@@ -0,0 +1,5 @@
|
||||
class_name NPCTest extends Node
|
||||
|
||||
func onInteract(playerEntity: Player) -> void:
|
||||
print("Player has interacted with the NPC.")
|
||||
UI.TEXTBOX.setText("You have interacted with the NPC.")
|
1
entity/npc/NPCTest.gd.uid
Normal file
1
entity/npc/NPCTest.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cmwovncvo1n5o
|
31
entity/player/Player.gd
Normal file
31
entity/player/Player.gd
Normal file
@@ -0,0 +1,31 @@
|
||||
@tool
|
||||
class_name Player extends CharacterBody3D
|
||||
|
||||
@export var _movement:PlayerMovement
|
||||
|
||||
@export var facingDirection:EntityMovement.FacingDirection:
|
||||
set(value):
|
||||
if _movement:
|
||||
_movement.facingDir = value
|
||||
get:
|
||||
if _movement:
|
||||
return _movement.facingDir
|
||||
return EntityMovement.FacingDirection.SOUTH
|
||||
|
||||
@export var walkSpeed:float = 48.0:
|
||||
set(value):
|
||||
if _movement:
|
||||
_movement.walkSpeed = value
|
||||
get:
|
||||
if _movement:
|
||||
return _movement.walkSpeed
|
||||
return 48.0
|
||||
|
||||
@export var runSpeed:float = 64.0:
|
||||
set(value):
|
||||
if _movement:
|
||||
_movement.runSpeed = value
|
||||
get:
|
||||
if _movement:
|
||||
return _movement.runSpeed
|
||||
return 64.0
|
BIN
entity/player/Player.png
Normal file
BIN
entity/player/Player.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 237 B |
35
entity/player/Player.png.import
Normal file
35
entity/player/Player.png.import
Normal file
@@ -0,0 +1,35 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://xx3qp5xh7tgu"
|
||||
path.s3tc="res://.godot/imported/Player.png-44a553acafadade6fc26fd4f7692a8d9.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://entity/player/Player.png"
|
||||
dest_files=["res://.godot/imported/Player.png-44a553acafadade6fc26fd4f7692a8d9.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
BIN
entity/player/Player.png.pxo
Normal file
BIN
entity/player/Player.png.pxo
Normal file
Binary file not shown.
115
entity/player/Player.tscn
Normal file
115
entity/player/Player.tscn
Normal file
@@ -0,0 +1,115 @@
|
||||
[gd_scene load_steps=14 format=3 uid="uid://2ch34sio36nv"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ylmy3nvpirgr" path="res://entity/player/Player.gd" id="1_24gqh"]
|
||||
[ext_resource type="Script" uid="uid://bwxdv3kxrs4oj" path="res://entity/player/PlayerMovement.gd" id="2_o7et6"]
|
||||
[ext_resource type="Script" uid="uid://b3nty7pvbo58d" path="res://entity/player/PlayerInteraction.gd" id="3_24gqh"]
|
||||
[ext_resource type="Script" uid="uid://bdv1fj1pwknrs" path="res://entity/player/PlayerInput.gd" id="4_yjynp"]
|
||||
[ext_resource type="Script" uid="uid://bdjgvyiacbg28" path="res://entity/player/PlayerCamera.gd" id="5_g3lhm"]
|
||||
[ext_resource type="Texture2D" uid="uid://xx3qp5xh7tgu" path="res://entity/player/Player.png" id="7_fmb3c"]
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_4pwj0"]
|
||||
radius = 8.5
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_rl6fg"]
|
||||
atlas = ExtResource("7_fmb3c")
|
||||
region = Rect2(16, 0, 16, 16)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_q57vx"]
|
||||
atlas = ExtResource("7_fmb3c")
|
||||
region = Rect2(48, 0, 16, 16)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_ak4un"]
|
||||
atlas = ExtResource("7_fmb3c")
|
||||
region = Rect2(0, 0, 16, 16)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_1ms0h"]
|
||||
atlas = ExtResource("7_fmb3c")
|
||||
region = Rect2(32, 0, 16, 16)
|
||||
|
||||
[sub_resource type="SpriteFrames" id="SpriteFrames_2rv2u"]
|
||||
animations = [{
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_rl6fg")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"walk_east",
|
||||
"speed": 5.0
|
||||
}, {
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_q57vx")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"walk_north",
|
||||
"speed": 5.0
|
||||
}, {
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_ak4un")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"walk_south",
|
||||
"speed": 5.0
|
||||
}, {
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_1ms0h")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"walk_west",
|
||||
"speed": 5.0
|
||||
}]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_g13of"]
|
||||
size = Vector3(10, 16, 8)
|
||||
|
||||
[node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("_movement")]
|
||||
script = ExtResource("1_24gqh")
|
||||
_movement = NodePath("Scripts/PlayerMovement")
|
||||
|
||||
[node name="Scripts" type="Node" parent="."]
|
||||
|
||||
[node name="PlayerMovement" type="Node" parent="Scripts" node_paths=PackedStringArray("body", "rotate", "sprite")]
|
||||
script = ExtResource("2_o7et6")
|
||||
body = NodePath("../..")
|
||||
rotate = NodePath("../../PlayerRotated")
|
||||
sprite = NodePath("../../AnimatedSprite3D")
|
||||
|
||||
[node name="PlayerInteraction" type="Node" parent="Scripts" node_paths=PackedStringArray("interactableArea", "player")]
|
||||
script = ExtResource("3_24gqh")
|
||||
interactableArea = NodePath("../../PlayerRotated/PlayerInteractableArea")
|
||||
player = NodePath("../..")
|
||||
|
||||
[node name="PlayerInput" type="Node" parent="Scripts" node_paths=PackedStringArray("interaction", "movement")]
|
||||
script = ExtResource("4_yjynp")
|
||||
interaction = NodePath("../PlayerInteraction")
|
||||
movement = NodePath("../PlayerMovement")
|
||||
|
||||
[node name="PlayerCamera" type="Node" parent="Scripts" node_paths=PackedStringArray("camera", "target")]
|
||||
script = ExtResource("5_g3lhm")
|
||||
camera = NodePath("../../PlayerCamera")
|
||||
target = NodePath("../..")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 8.5, 0)
|
||||
shape = SubResource("SphereShape3D_4pwj0")
|
||||
|
||||
[node name="PlayerCamera" type="Camera3D" parent="."]
|
||||
|
||||
[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0496178, 0, -0.00852585)
|
||||
pixel_size = 1.0
|
||||
axis = 1
|
||||
double_sided = false
|
||||
texture_filter = 0
|
||||
sprite_frames = SubResource("SpriteFrames_2rv2u")
|
||||
animation = &"walk_south"
|
||||
|
||||
[node name="PlayerRotated" type="Node3D" parent="."]
|
||||
|
||||
[node name="PlayerInteractableArea" type="Area3D" parent="PlayerRotated"]
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerRotated/PlayerInteractableArea"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 8, 10)
|
||||
shape = SubResource("BoxShape3D_g13of")
|
33
entity/player/PlayerCamera.gd
Normal file
33
entity/player/PlayerCamera.gd
Normal file
@@ -0,0 +1,33 @@
|
||||
@tool
|
||||
class_name PlayerCamera extends Node
|
||||
|
||||
const CAMERA_PIXELS_PER_UNIT = 1.0
|
||||
const CAMERA_PIXEL_SCALE = 1.0
|
||||
|
||||
@export var camera:Camera3D = null
|
||||
@export var target:Node3D = null
|
||||
@export var offset:Vector3 = Vector3(0, 0, 12)
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if !camera || !target:
|
||||
return
|
||||
|
||||
# I tried a few things but this is most consistent for both backbuffer and
|
||||
# framebuffer viewports.
|
||||
var viewportHeight = get_viewport().get_visible_rect().size.y;
|
||||
var unitScale = CAMERA_PIXEL_SCALE * CAMERA_PIXELS_PER_UNIT;
|
||||
|
||||
var z:float = (
|
||||
tan((deg_to_rad(180) - deg_to_rad(camera.fov)) / 2.0) *
|
||||
(viewportHeight / 2.0)
|
||||
) / unitScale;
|
||||
|
||||
var look = target.global_position;
|
||||
var position = offset + look;
|
||||
|
||||
camera.look_at_from_position(
|
||||
Vector3(position.x, position.y + z, position.z),
|
||||
look
|
||||
);
|
||||
|
||||
pass
|
1
entity/player/PlayerCamera.gd.uid
Normal file
1
entity/player/PlayerCamera.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bdjgvyiacbg28
|
13
entity/player/PlayerInput.gd
Normal file
13
entity/player/PlayerInput.gd
Normal file
@@ -0,0 +1,13 @@
|
||||
class_name PlayerInput extends Node
|
||||
|
||||
@export var interaction:PlayerInteraction
|
||||
@export var movement:PlayerMovement
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if Input.is_action_just_pressed("pause"):
|
||||
PAUSE.menuPause()
|
||||
|
||||
if Input.is_action_just_pressed("interact"):
|
||||
interaction.interact()
|
||||
|
||||
movement._inputDir = Input.get_vector("move_left", "move_right", "move_back", "move_forward").normalized()
|
1
entity/player/PlayerInput.gd.uid
Normal file
1
entity/player/PlayerInput.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bdv1fj1pwknrs
|
@@ -1,19 +1,17 @@
|
||||
class_name PlayerInteraction extends Node
|
||||
|
||||
@export var interactableArea:Area3D
|
||||
@export var player:CharacterBody3D
|
||||
|
||||
func canInteract() -> bool:
|
||||
if PAUSE.isMovementPaused():
|
||||
return false
|
||||
return true
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
func interact() -> void:
|
||||
if !canInteract():
|
||||
return
|
||||
|
||||
if !Input.is_action_just_pressed("interact"):
|
||||
return
|
||||
|
||||
var overlapping = interactableArea.get_overlapping_areas()
|
||||
var interactable: InteractableArea = null
|
||||
|
||||
@@ -26,4 +24,4 @@ func _process(delta: float) -> void:
|
||||
if !interactable:
|
||||
return
|
||||
|
||||
interactable.interactEvent.emit()
|
||||
interactable.interactEvent.emit(player)
|
13
entity/player/PlayerMaterial.tres
Normal file
13
entity/player/PlayerMaterial.tres
Normal file
@@ -0,0 +1,13 @@
|
||||
[gd_resource type="ShaderMaterial" load_steps=3 format=3 uid="uid://cv8q4cbjyfauh"]
|
||||
|
||||
[ext_resource type="Shader" path="res://materials/EntityMaterialShader.gdshader" id="1_gsq3s"]
|
||||
[ext_resource type="Texture2D" uid="uid://xx3qp5xh7tgu" path="res://entity/player/Player.png" id="2_awgof"]
|
||||
|
||||
[resource]
|
||||
render_priority = 0
|
||||
shader = ExtResource("1_gsq3s")
|
||||
shader_parameter/text = ExtResource("2_awgof")
|
||||
shader_parameter/tileColumnCount = 4
|
||||
shader_parameter/tileRowCount = 1
|
||||
shader_parameter/tile = 0
|
||||
shader_parameter/color = Color(1, 1, 1, 1)
|
7
entity/player/PlayerMovement.gd
Normal file
7
entity/player/PlayerMovement.gd
Normal file
@@ -0,0 +1,7 @@
|
||||
@tool
|
||||
class_name PlayerMovement extends "res://entity/EntityMovement.gd"
|
||||
|
||||
func canMove() -> bool:
|
||||
if PAUSE.isMovementPaused():
|
||||
return false
|
||||
return true
|
1
event/EventItem.gd.uid
Normal file
1
event/EventItem.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c42rc36mudwgh
|
3
event/EventResource.gd
Normal file
3
event/EventResource.gd
Normal file
@@ -0,0 +1,3 @@
|
||||
class_name EventResource extends Resource
|
||||
|
||||
@export var eventName:String
|
1
event/EventResource.gd.uid
Normal file
1
event/EventResource.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://5nyb2g1kghpv
|
BIN
locale/en_AU.mo
Normal file
BIN
locale/en_AU.mo
Normal file
Binary file not shown.
120
locale/en_AU.po
120
locale/en_AU.po
@@ -16,128 +16,10 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 3.4.4\n"
|
||||
"X-Generator: Poedit 3.6\n"
|
||||
|
||||
#
|
||||
# UI
|
||||
#
|
||||
msgid "ui.debug_menu.main_menu"
|
||||
msgstr "Go to main menu"
|
||||
|
||||
msgid "ui.debug_menu.overworld"
|
||||
msgstr "Go to overworld"
|
||||
|
||||
msgid "ui.debug_menu.quest"
|
||||
msgstr "View Quests"
|
||||
|
||||
msgid "ui.debug_menu.inventory"
|
||||
msgstr "View Inventory"
|
||||
|
||||
msgid "ui.debug_menu.event"
|
||||
msgstr "Debug Events"
|
||||
|
||||
msgid "ui.debug_menu.cutscene"
|
||||
msgstr "Debug Cutscenes"
|
||||
|
||||
msgid "ui.debug_menu.cooking"
|
||||
msgstr "Debug Cooking"
|
||||
|
||||
msgid "ui.debug_menu.battle"
|
||||
msgstr "Debug Battle"
|
||||
|
||||
#
|
||||
# EVENTS
|
||||
#
|
||||
msgid "event.get_item.found"
|
||||
msgid_plural "event.get_item.found_plural"
|
||||
msgstr[0] "Found {item.title}."
|
||||
msgstr[1] "Found {quantity} {item.title}."
|
||||
|
||||
msgid "event.get_item.given"
|
||||
msgid_plural "event.get_item.given_plural"
|
||||
msgstr[0] "Received {item.title}."
|
||||
msgstr[1] "Received {quantity} {item.title}."
|
||||
|
||||
#
|
||||
# QUESTS
|
||||
#
|
||||
msgid "quest.test_quest.title"
|
||||
msgstr "Learn to cook!"
|
||||
|
||||
msgid "quest.test_quest.sweet_potato.title"
|
||||
msgstr "Scavenge Sweet Potatoes"
|
||||
|
||||
msgid "quest.test_quest.sweet_potato.description"
|
||||
msgstr "Find and collect {quantity} {item.title} so you can learn to cook!"
|
||||
|
||||
#
|
||||
# ITEMS
|
||||
#
|
||||
msgid "item.onion.title"
|
||||
msgid_plural "item.onion.title_plural"
|
||||
msgstr[0] "Onion"
|
||||
msgstr[1] "Onions"
|
||||
|
||||
msgid "item.onion.description"
|
||||
msgstr "An onion, a staple of many dishes. It can be used in cooking or eaten raw."
|
||||
|
||||
msgid "item.sweet_potato.name"
|
||||
msgid_plural "item.sweet_potato.name_plural"
|
||||
msgstr[0] "Sweet Potato"
|
||||
msgstr[1] "Sweet Potatoes"
|
||||
|
||||
msgid "item.sweet_potato.description"
|
||||
msgstr "A sweet potato, a nutritious and versatile vegetable. It can be used in cooking or eaten raw."
|
||||
|
||||
msgid "item.potion.name"
|
||||
msgid_plural "item.potion.name_plural"
|
||||
msgstr[0] "Potion"
|
||||
msgstr[1] "Potions"
|
||||
|
||||
msgid "item.potion.description"
|
||||
msgstr "A potion that restores health. It can be consumed to regain vitality."
|
||||
|
||||
msgid "item.baked_sweet_potato.name"
|
||||
msgid_plural "item.baked_sweet_potato.name_plural"
|
||||
msgstr[0] "Baked Sweet Potato"
|
||||
msgstr[1] "Baked Sweet Potatoes"
|
||||
|
||||
msgid "item.baked_sweet_potato.description"
|
||||
msgstr "A sweet potato that has been baked to perfection. It is warm and comforting, perfect for a chilly day."
|
||||
|
||||
#
|
||||
# RECIPES
|
||||
#
|
||||
msgid "recipe.baked_sweet_potato.title"
|
||||
msgstr "Baked Sweet Potato"
|
||||
|
||||
#
|
||||
# SCENES
|
||||
#
|
||||
msgid "main_menu.label"
|
||||
msgstr ""
|
||||
"Thyme and Fire\n"
|
||||
"\n"
|
||||
"Press [input action=debug][/input] to open the debug menu"
|
||||
|
||||
# ==============================================================================
|
||||
#
|
||||
# MAPS
|
||||
#
|
||||
# ==============================================================================
|
||||
|
||||
#
|
||||
# Test Map
|
||||
#
|
||||
msgid "map.test_map.title"
|
||||
msgstr "Test Map"
|
||||
|
||||
# Events
|
||||
msgid "map.test_map.event.gather_onion.text0"
|
||||
msgstr "I am giving you a quest to gather some ingredients."
|
||||
|
||||
msgid "map.test_map.event.gather_onion.text1"
|
||||
msgstr "Take this to help you on your way."
|
||||
|
||||
msgid "map.test_map.event.gather_onion.text2"
|
||||
msgstr "How goes the quest? Have you gathered the ingredients?"
|
12
map/TestMap.gd
Normal file
12
map/TestMap.gd
Normal file
@@ -0,0 +1,12 @@
|
||||
extends Node3D
|
||||
|
||||
func _ready():
|
||||
UI.MADTALK.start_dialog("bare_minimum")
|
||||
|
||||
func _input(event):
|
||||
if (
|
||||
(event is InputEventKey) and (event.pressed) and (not event.echo) and (event.keycode in [KEY_SPACE, KEY_ENTER, KEY_KP_ENTER])
|
||||
) or (
|
||||
(event is InputEventMouseButton) and (event.pressed) and (event.button_index == MOUSE_BUTTON_LEFT)
|
||||
):
|
||||
UI.MADTALK.dialog_acknowledge()
|
1
map/TestMap.gd.uid
Normal file
1
map/TestMap.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://xe6pcuq741xi
|
18
map/TestMap.tscn
Normal file
18
map/TestMap.tscn
Normal file
@@ -0,0 +1,18 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://d0ywgijpuqy0r"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://xe6pcuq741xi" path="res://map/TestMap.gd" id="1_6ms5s"]
|
||||
[ext_resource type="PackedScene" uid="uid://cluuhtfjeodwb" path="res://map/TestMapBase.tscn" id="1_ox0si"]
|
||||
[ext_resource type="PackedScene" uid="uid://2ch34sio36nv" path="res://entity/player/Player.tscn" id="2_0d2qr"]
|
||||
[ext_resource type="PackedScene" uid="uid://kabs7mopalmo" path="res://entity/npc/NPC.tscn" id="3_0vfw4"]
|
||||
|
||||
[node name="TestMap" type="Node3D"]
|
||||
script = ExtResource("1_6ms5s")
|
||||
|
||||
[node name="TestMapBase" parent="." instance=ExtResource("1_ox0si")]
|
||||
|
||||
[node name="Player" parent="." instance=ExtResource("2_0d2qr")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 27.142, 1.94879, -59.112)
|
||||
facingDirection = 1
|
||||
|
||||
[node name="NPC" parent="." instance=ExtResource("3_0vfw4")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.30029, 4.06806, 0.563562)
|
25
map/TestMapBase.tscn
Normal file
25
map/TestMapBase.tscn
Normal file
@@ -0,0 +1,25 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://cluuhtfjeodwb"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://cu1hvpqmqn31n" path="res://icon.svg" id="1_x4ibw"]
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_owt5q"]
|
||||
size = Vector2(200, 200)
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_52cv7"]
|
||||
shading_mode = 0
|
||||
albedo_texture = ExtResource("1_x4ibw")
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_x4ibw"]
|
||||
size = Vector3(200, 0.1, 200)
|
||||
|
||||
[node name="TestMapBase" type="Node3D"]
|
||||
|
||||
[node name="Ground" type="StaticBody3D" parent="."]
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground"]
|
||||
mesh = SubResource("PlaneMesh_owt5q")
|
||||
skeleton = NodePath("../..")
|
||||
surface_material_override/0 = SubResource("StandardMaterial3D_52cv7")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"]
|
||||
shape = SubResource("BoxShape3D_x4ibw")
|
7
meta/InitialScene.tscn
Normal file
7
meta/InitialScene.tscn
Normal file
@@ -0,0 +1,7 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://bs41nqi3ocih3"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://d2u7xxqmy8mws" path="res://ui/mainmenu/MainMenu.tscn" id="1_hu3pf"]
|
||||
|
||||
[node name="InitialScene" type="Node3D"]
|
||||
|
||||
[node name="MainMenu" parent="." instance=ExtResource("1_hu3pf")]
|
34
meta/OverworldScene.gd
Normal file
34
meta/OverworldScene.gd
Normal file
@@ -0,0 +1,34 @@
|
||||
class_name OverworldScene extends Node
|
||||
|
||||
@export var map:Node3D = null
|
||||
|
||||
func _enter_tree() -> void:
|
||||
OVERWORLD.mapChanged.connect(onMapChanged)
|
||||
|
||||
func _ready() -> void:
|
||||
pass
|
||||
|
||||
func _exit_tree() -> void:
|
||||
OVERWORLD.mapChanged.disconnect(onMapChanged)
|
||||
|
||||
func onMapChanged(newMap:PackedScene, playerDestinationNodeName:String) -> void:
|
||||
print("New map time.", newMap)
|
||||
for childScene in map.get_children():
|
||||
map.remove_child(childScene)
|
||||
|
||||
if !newMap:
|
||||
return
|
||||
|
||||
var newMapInstance = newMap.instantiate()
|
||||
map.add_child(newMapInstance)
|
||||
|
||||
# Find Player.
|
||||
if playerDestinationNodeName:
|
||||
var player = newMapInstance.get_node("Player")
|
||||
var destNode = newMapInstance.get_node(playerDestinationNodeName)
|
||||
if player && player is Player && destNode:
|
||||
player.global_position = destNode.global_position
|
||||
player.global_rotation.y = destNode.global_rotation.y
|
||||
elif playerDestinationNodeName:
|
||||
push_error("Player, or destination node not found in new map.")
|
||||
pass
|
1
meta/OverworldScene.gd.uid
Normal file
1
meta/OverworldScene.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dpvccegdmn7s6
|
9
meta/OverworldScene.tscn
Normal file
9
meta/OverworldScene.tscn
Normal file
@@ -0,0 +1,9 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://c0k1t3tyiaojl"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dpvccegdmn7s6" path="res://meta/OverworldScene.gd" id="1_fa54r"]
|
||||
|
||||
[node name="OverworldScene" type="Node3D" node_paths=PackedStringArray("map")]
|
||||
script = ExtResource("1_fa54r")
|
||||
map = NodePath("Map")
|
||||
|
||||
[node name="Map" type="Node3D" parent="."]
|
34
meta/RootScene.gd
Normal file
34
meta/RootScene.gd
Normal file
@@ -0,0 +1,34 @@
|
||||
class_name RootScene extends Node3D
|
||||
|
||||
@export var overworld:Node3D = null
|
||||
@export var initial:Node3D = null
|
||||
|
||||
func _enter_tree() -> void:
|
||||
SCENE.sceneChanged.connect(onSceneChange)
|
||||
SCENE.setScene(SceneSingleton.SceneType.INITIAL)
|
||||
|
||||
func _exit_tree() -> void:
|
||||
push_error("RootScene should not be removed from the scene tree. This is a bug.")
|
||||
|
||||
func onSceneChange(newScene:SceneSingleton.SceneType) -> void:
|
||||
print("overworld", overworld)
|
||||
remove_child(overworld)
|
||||
remove_child(initial)
|
||||
|
||||
overworld.visible = false
|
||||
initial.visible = false
|
||||
|
||||
match newScene:
|
||||
SceneSingleton.SceneType.INITIAL:
|
||||
add_child(initial)
|
||||
initial.visible = true
|
||||
|
||||
SceneSingleton.SceneType.OVERWORLD:
|
||||
add_child(overworld)
|
||||
overworld.visible = true
|
||||
|
||||
SceneSingleton.SceneType.UNSET:
|
||||
pass
|
||||
|
||||
_:
|
||||
pass
|
1
meta/RootScene.gd.uid
Normal file
1
meta/RootScene.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ml70iui7qpo4
|
15
meta/RootScene.tscn
Normal file
15
meta/RootScene.tscn
Normal file
@@ -0,0 +1,15 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://ckkewlcugc8ro"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ml70iui7qpo4" path="res://meta/RootScene.gd" id="1_nky1x"]
|
||||
[ext_resource type="PackedScene" uid="uid://bs41nqi3ocih3" path="res://meta/InitialScene.tscn" id="2_hkmoa"]
|
||||
[ext_resource type="PackedScene" uid="uid://c0k1t3tyiaojl" path="res://meta/OverworldScene.tscn" id="2_o1wvd"]
|
||||
|
||||
[node name="RootScene" type="Node3D" node_paths=PackedStringArray("overworld", "initial")]
|
||||
script = ExtResource("1_nky1x")
|
||||
overworld = NodePath("OverworldScene")
|
||||
initial = NodePath("InitialScene")
|
||||
metadata/_custom_type_script = "uid://ml70iui7qpo4"
|
||||
|
||||
[node name="OverworldScene" parent="." instance=ExtResource("2_o1wvd")]
|
||||
|
||||
[node name="InitialScene" parent="." instance=ExtResource("2_hkmoa")]
|
@@ -11,15 +11,21 @@ config_version=5
|
||||
[application]
|
||||
|
||||
config/name="Dawn Godot"
|
||||
run/main_scene="uid://b16ysbx7ah03u"
|
||||
run/main_scene="uid://ckkewlcugc8ro"
|
||||
config/features=PackedStringArray("4.4", "GL Compatibility")
|
||||
config/icon="res://icon.svg"
|
||||
|
||||
[autoload]
|
||||
|
||||
PHYSICS="*res://scripts/singletons/GamePhysics.gd"
|
||||
UI="*res://scenes/singletons/UI.tscn"
|
||||
PAUSE="*res://scripts/singletons/Pause.gd"
|
||||
PHYSICS="*res://singleton/GamePhysics.gd"
|
||||
PAUSE="*res://singleton/Pause.gd"
|
||||
TRANSITION="*res://singleton/Transition.tscn"
|
||||
UI="*res://singleton/UI.tscn"
|
||||
QUEST="*res://singleton/Quest.tscn"
|
||||
OVERWORLD="*res://singleton/Overworld.gd"
|
||||
SCENE="*res://singleton/Scene.gd"
|
||||
MadTalkGlobals="*res://addons/madtalk/runtime/MadTalkGlobals.tscn"
|
||||
ControllerIcons="*res://addons/controller_icons/ControllerIcons.gd"
|
||||
|
||||
[debug]
|
||||
|
||||
@@ -41,7 +47,7 @@ project/assembly_name="Dawn Godot"
|
||||
|
||||
[editor_plugins]
|
||||
|
||||
enabled=PackedStringArray("res://addons/controller_icons/plugin.cfg")
|
||||
enabled=PackedStringArray("res://addons/controller_icons/plugin.cfg", "res://addons/madtalk/plugin.cfg")
|
||||
|
||||
[filesystem]
|
||||
|
||||
|
@@ -1,77 +0,0 @@
|
||||
[gd_scene load_steps=12 format=3 uid="uid://b16ysbx7ah03u"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://d3rtd0ln7l2gr" path="res://scenes/maps/tundra/MapTundra.tscn" id="1_2gju5"]
|
||||
[ext_resource type="PackedScene" uid="uid://2ch34sio36nv" path="res://scenes/entities/Player.tscn" id="2_rlkm5"]
|
||||
[ext_resource type="Script" uid="uid://csb0i132lcu0w" path="res://scripts/entities/MapCamera.gd" id="3_n77mx"]
|
||||
[ext_resource type="PackedScene" uid="uid://bng2mc7fu5aik" path="res://scenes/entities/NPC.tscn" id="4_nb1wl"]
|
||||
[ext_resource type="Script" uid="uid://chxpes3546yoj" path="res://scripts/cutscene/Cutscene.gd" id="5_m5dm6"]
|
||||
[ext_resource type="Script" uid="uid://8updtj1mctra" path="res://scripts/cutscene/item/CutsceneText.gd" id="6_fws1a"]
|
||||
|
||||
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_n77mx"]
|
||||
|
||||
[sub_resource type="Sky" id="Sky_nb1wl"]
|
||||
sky_material = SubResource("ProceduralSkyMaterial_n77mx")
|
||||
|
||||
[sub_resource type="Environment" id="Environment_m5dm6"]
|
||||
background_mode = 2
|
||||
sky = SubResource("Sky_nb1wl")
|
||||
ambient_light_source = 3
|
||||
|
||||
[sub_resource type="Curve3D" id="Curve3D_n77mx"]
|
||||
_data = {
|
||||
"points": PackedVector3Array(0, 0, 0, 0, 0, 0, -11.0524, 3.4238, 4.18537, -19.268, 11.502, 10.843, 2.59274, -0.402428, -8.58782, 16.504, 3.012, 2.882),
|
||||
"tilts": PackedFloat32Array(0, 0)
|
||||
}
|
||||
point_count = 2
|
||||
|
||||
[sub_resource type="Curve3D" id="Curve3D_nb1wl"]
|
||||
_data = {
|
||||
"points": PackedVector3Array(0, 0, 0, 0, 0, 0, -12.26, 1.86, -3.89, 0, 0, 0, 0, 0, 0, 19.103, 1.11, -3.531),
|
||||
"tilts": PackedFloat32Array(0, 0)
|
||||
}
|
||||
point_count = 2
|
||||
|
||||
[node name="TestScene" type="Node3D"]
|
||||
|
||||
[node name="MapTundra" parent="." instance=ExtResource("1_2gju5")]
|
||||
|
||||
[node name="Player" parent="." instance=ExtResource("2_rlkm5")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.06402, 1.54702, -2.35884)
|
||||
|
||||
[node name="NPC" parent="." node_paths=PackedStringArray("cutscene") instance=ExtResource("4_nb1wl")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.20455, 1.94676, -3.51349)
|
||||
interactType = 2
|
||||
cutscene = NodePath("../Cutscenes/TestCutscene")
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="." node_paths=PackedStringArray("targetFollow", "pathFollow", "pathMap")]
|
||||
transform = Transform3D(0.996991, 0.0418507, -0.0652558, 0, 0.841762, 0.539849, 0.0775229, -0.538225, 0.839228, 1.25757, 8.21861, 8.01254)
|
||||
fov = 57.5
|
||||
script = ExtResource("3_n77mx")
|
||||
targetFollow = NodePath("../Player")
|
||||
pathFollow = NodePath("../PathCamera/PathFollow3D")
|
||||
pathMap = NodePath("../PathWorld")
|
||||
metadata/_custom_type_script = "uid://csb0i132lcu0w"
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||
environment = SubResource("Environment_m5dm6")
|
||||
|
||||
[node name="PathCamera" type="Path3D" parent="."]
|
||||
curve = SubResource("Curve3D_n77mx")
|
||||
|
||||
[node name="PathFollow3D" type="PathFollow3D" parent="PathCamera"]
|
||||
transform = Transform3D(0.0672435, 0.0374997, -0.996973, -0.000525827, 0.999215, 0.0375501, 0.99767, -0.00200086, 0.0672163, 1.25757, 8.21861, 8.01254)
|
||||
progress = 14.4593
|
||||
loop = false
|
||||
|
||||
[node name="PathWorld" type="Path3D" parent="."]
|
||||
curve = SubResource("Curve3D_nb1wl")
|
||||
|
||||
[node name="Cutscenes" type="Node" parent="."]
|
||||
|
||||
[node name="TestCutscene" type="Node" parent="Cutscenes"]
|
||||
script = ExtResource("5_m5dm6")
|
||||
|
||||
[node name="CutsceneText" type="Node" parent="Cutscenes/TestCutscene"]
|
||||
script = ExtResource("6_fws1a")
|
||||
interactTexts = Array[String](["test cutscene item 1", "tttt2"])
|
||||
metadata/_custom_type_script = "uid://8updtj1mctra"
|
@@ -1,44 +0,0 @@
|
||||
[gd_scene load_steps=9 format=3 uid="uid://bng2mc7fu5aik"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://jbarxyoib5a7" path="res://scripts/entities/NPC.gd" id="1_nnu5p"]
|
||||
[ext_resource type="Script" uid="uid://b00rxpveu3v4m" path="res://scripts/InteractableArea.gd" id="2_mm6je"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_2m2ha"]
|
||||
|
||||
[sub_resource type="CapsuleMesh" id="CapsuleMesh_g13of"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_nnu5p"]
|
||||
albedo_color = Color(0.389287, 0.389287, 0.389287, 1)
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_g13of"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_g13of"]
|
||||
albedo_color = Color(0.596173, 0.00177814, 0.790136, 1)
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_mm6je"]
|
||||
size = Vector3(0.958008, 0.97168, 0.767578)
|
||||
|
||||
[node name="NPC" type="CharacterBody3D"]
|
||||
script = ExtResource("1_nnu5p")
|
||||
metadata/_custom_type_script = "uid://jbarxyoib5a7"
|
||||
|
||||
[node name="Scripts" type="Node" parent="."]
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||
shape = SubResource("CapsuleShape3D_2m2ha")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
|
||||
mesh = SubResource("CapsuleMesh_g13of")
|
||||
surface_material_override/0 = SubResource("StandardMaterial3D_nnu5p")
|
||||
|
||||
[node name="MeshInstance3D2" type="MeshInstance3D" parent="."]
|
||||
transform = Transform3D(0.598863, 0, 0, 0, 0.598863, 0, 0, 0, 0.598863, 0, 0.441532, 0.539694)
|
||||
mesh = SubResource("BoxMesh_g13of")
|
||||
surface_material_override/0 = SubResource("StandardMaterial3D_g13of")
|
||||
|
||||
[node name="InteractableArea" type="Area3D" parent="."]
|
||||
script = ExtResource("2_mm6je")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="InteractableArea"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0152938, 0.00782323, 0.0022831)
|
||||
shape = SubResource("BoxShape3D_mm6je")
|
@@ -1,49 +0,0 @@
|
||||
[gd_scene load_steps=9 format=3 uid="uid://2ch34sio36nv"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ylmy3nvpirgr" path="res://scripts/entities/player/Player.gd" id="1_24gqh"]
|
||||
[ext_resource type="Script" uid="uid://bwxdv3kxrs4oj" path="res://scripts/entities/player/PlayerMovement.gd" id="2_o7et6"]
|
||||
[ext_resource type="Script" uid="uid://b3nty7pvbo58d" path="res://scripts/entities/player/PlayerInteraction.gd" id="3_24gqh"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_2m2ha"]
|
||||
|
||||
[sub_resource type="CapsuleMesh" id="CapsuleMesh_g13of"]
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_g13of"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_g13of"]
|
||||
albedo_color = Color(0.0156863, 0.282353, 1, 1)
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_g13of"]
|
||||
size = Vector3(0.705444, 0.680542, 1.17688)
|
||||
|
||||
[node name="Player" type="CharacterBody3D"]
|
||||
script = ExtResource("1_24gqh")
|
||||
metadata/_custom_type_script = "uid://c0by5m1upv57h"
|
||||
|
||||
[node name="Scripts" type="Node" parent="."]
|
||||
|
||||
[node name="PlayerMovement" type="Node" parent="Scripts" node_paths=PackedStringArray("player")]
|
||||
script = ExtResource("2_o7et6")
|
||||
player = NodePath("../..")
|
||||
|
||||
[node name="PlayerInteraction" type="Node" parent="Scripts" node_paths=PackedStringArray("interactableArea")]
|
||||
script = ExtResource("3_24gqh")
|
||||
interactableArea = NodePath("../../InteractableArea")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||
shape = SubResource("CapsuleShape3D_2m2ha")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
|
||||
mesh = SubResource("CapsuleMesh_g13of")
|
||||
|
||||
[node name="MeshInstance3D2" type="MeshInstance3D" parent="."]
|
||||
transform = Transform3D(0.598863, 0, 0, 0, 0.598863, 0, 0, 0, 0.598863, 0, 0.441532, 0.539694)
|
||||
mesh = SubResource("BoxMesh_g13of")
|
||||
surface_material_override/0 = SubResource("StandardMaterial3D_g13of")
|
||||
|
||||
[node name="InteractableArea" type="Area3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.185831, 0.817421)
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="InteractableArea"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0123757, 0.0497631, 0.0865124)
|
||||
shape = SubResource("BoxShape3D_g13of")
|
@@ -1,26 +0,0 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://d3rtd0ln7l2gr"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://cu1hvpqmqn31n" path="res://icon.svg" id="1_gnws2"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_ee568"]
|
||||
size = Vector3(100, 0.1, 100)
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_gnws2"]
|
||||
size = Vector2(100, 100)
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2wcmd"]
|
||||
albedo_texture = ExtResource("1_gnws2")
|
||||
|
||||
[node name="MapTundra" type="Node3D"]
|
||||
|
||||
[node name="Ground" type="Node3D" parent="."]
|
||||
|
||||
[node name="RigidBody3D" type="StaticBody3D" parent="Ground"]
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground/RigidBody3D"]
|
||||
shape = SubResource("BoxShape3D_ee568")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.037714, 0, -0.0143986)
|
||||
mesh = SubResource("PlaneMesh_gnws2")
|
||||
surface_material_override/0 = SubResource("StandardMaterial3D_2wcmd")
|
@@ -1,3 +0,0 @@
|
||||
class_name InteractableArea extends Area3D
|
||||
|
||||
signal interactEvent
|
@@ -1 +0,0 @@
|
||||
uid://dr3asofxu1pep
|
@@ -1 +0,0 @@
|
||||
uid://cubx2asrudfyp
|
@@ -1 +0,0 @@
|
||||
uid://dnls1370w0gr4
|
@@ -1 +0,0 @@
|
||||
uid://cctqgee7dumwg
|
@@ -1 +0,0 @@
|
||||
uid://dq7mgokmvo80u
|
@@ -1 +0,0 @@
|
||||
uid://byt6ygesmade5
|
@@ -1 +0,0 @@
|
||||
uid://d1iobq2gqn8dt
|
@@ -1,15 +0,0 @@
|
||||
@tool
|
||||
class_name MapCamera extends Camera3D
|
||||
|
||||
@export var targetFollow:Node3D = null
|
||||
@export var pathFollow:PathFollow3D = null
|
||||
@export var pathMap:Path3D = null
|
||||
|
||||
func _process(delta):
|
||||
if !pathMap || !targetFollow || !pathMap.curve:
|
||||
return
|
||||
|
||||
var point = pathMap.curve.get_closest_point(targetFollow.global_transform.origin)
|
||||
pathFollow.progress_ratio = pathMap.curve.get_closest_offset(point) / pathMap.curve.get_baked_length()
|
||||
global_transform.origin = pathFollow.global_transform.origin
|
||||
look_at(targetFollow.global_transform.origin, Vector3.UP)
|
@@ -1,53 +0,0 @@
|
||||
class_name NPC extends CharacterBody3D
|
||||
|
||||
enum InteractType {
|
||||
NONE,
|
||||
TEXTBOX,
|
||||
CUTSCENE
|
||||
}
|
||||
|
||||
# Movement speed in units per second
|
||||
@export var gravity: float = 24.8
|
||||
@export var interactType:InteractType = InteractType.NONE
|
||||
@export_multiline var interactTexts:Array[String] = []
|
||||
@export var cutscene:Cutscene = null
|
||||
var nextTextIndex:int = 0
|
||||
|
||||
func _enter_tree() -> void:
|
||||
$InteractableArea.interactEvent.connect(_on_interact)
|
||||
|
||||
func _exit_tree() -> void:
|
||||
$InteractableArea.interactEvent.disconnect(_on_interact)
|
||||
UI.TEXTBOX.textboxClosing.disconnect(onTextboxClosing)
|
||||
|
||||
func _physics_process(delta):
|
||||
# Apply gravity if not on floor
|
||||
if !is_on_floor():
|
||||
velocity += PHYSICS.GRAVITY * delta
|
||||
|
||||
move_and_slide()
|
||||
|
||||
func _on_interact() -> void:
|
||||
nextTextIndex = 0
|
||||
match interactType:
|
||||
InteractType.TEXTBOX:
|
||||
if interactTexts.size() == 0:
|
||||
return
|
||||
UI.TEXTBOX.setText(interactTexts[nextTextIndex])
|
||||
UI.TEXTBOX.textboxClosing.connect(onTextboxClosing)
|
||||
return
|
||||
|
||||
InteractType.CUTSCENE:
|
||||
if cutscene:
|
||||
cutscene.start()
|
||||
return
|
||||
_:
|
||||
return
|
||||
|
||||
|
||||
func onTextboxClosing() -> void:
|
||||
nextTextIndex += 1
|
||||
if nextTextIndex < interactTexts.size():
|
||||
UI.TEXTBOX.setText(interactTexts[nextTextIndex])
|
||||
else:
|
||||
UI.TEXTBOX.textboxClosing.disconnect(onTextboxClosing)
|
@@ -1 +0,0 @@
|
||||
uid://b26ki3ljfkulh
|
@@ -1 +0,0 @@
|
||||
class_name Player extends CharacterBody3D
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user