Compare commits
21 Commits
0c31e684e3
...
main
Author | SHA1 | Date | |
---|---|---|---|
1e83200bba | |||
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,15 +63,29 @@ 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.
|
||||
CONTROLLER, ## Icon will always show the controller action.
|
||||
CONTROLLER, ## Icon will always show the controller action.
|
||||
}
|
||||
|
||||
## Forces the icon to show either the keyboard/mouse or controller icon,
|
||||
@@ -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
|
||||
pass
|
||||
|
||||
func done() -> void:
|
||||
if !cutscene:
|
||||
return
|
||||
cutscene.nextItem()
|
@@ -20,4 +20,5 @@ func onTextboxClosing() -> void:
|
||||
UI.TEXTBOX.setText(interactTexts[nextTextIndex])
|
||||
else:
|
||||
UI.TEXTBOX.textboxClosing.disconnect(onTextboxClosing)
|
||||
UI.TEXTBOX.setText("")
|
||||
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:
|
||||
UI.TEXTBOX.setText("Hello, I'm an NPC!\nThis is the second line here, I am purposefully adding a tonne of words so that it is forced to go across multiple lines and you can see how the word wrapping works, not only using Godot's built in word wrapping but with my advanced visibile characters smart wrapping. Now I am doing a multiline thing\nLine 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8\nLine 9\nLine 10");
|
||||
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?"
|
1
map/TestMap.gd
Normal file
1
map/TestMap.gd
Normal file
@@ -0,0 +1 @@
|
||||
extends Node3D
|
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, 8.04397, 1.9488, -16.5251)
|
||||
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,38 +0,0 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://bkx3l0kckf4a8"]
|
||||
|
||||
[ext_resource type="Theme" uid="uid://dm7ee4aqjr2dl" path="res://ui/UI Theme.tres" id="1_wx4lp"]
|
||||
[ext_resource type="Script" uid="uid://h8lw23ypcfty" path="res://scripts/ui/VNTextbox.gd" id="2_uo1gm"]
|
||||
[ext_resource type="Script" uid="uid://bjj6upgk1uvxd" path="res://scripts/ui/AdvancedRichText.gd" id="3_m60k3"]
|
||||
|
||||
[node name="VNTextbox" type="PanelContainer"]
|
||||
anchors_preset = 12
|
||||
anchor_top = 1.0
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_top = -58.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 0
|
||||
theme = ExtResource("1_wx4lp")
|
||||
script = ExtResource("2_uo1gm")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="."]
|
||||
layout_mode = 2
|
||||
theme = ExtResource("1_wx4lp")
|
||||
theme_override_constants/margin_left = 4
|
||||
theme_override_constants/margin_top = 4
|
||||
theme_override_constants/margin_right = 4
|
||||
theme_override_constants/margin_bottom = 4
|
||||
|
||||
[node name="Label" type="RichTextLabel" parent="MarginContainer"]
|
||||
layout_mode = 2
|
||||
theme = ExtResource("1_wx4lp")
|
||||
bbcode_enabled = true
|
||||
text = "TEST
|
||||
TEST
|
||||
TEST
|
||||
TEST"
|
||||
script = ExtResource("3_m60k3")
|
||||
advancedText = "TEST
|
||||
TEST
|
||||
TEST
|
||||
TEST"
|
@@ -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
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user