Compare commits
8 Commits
e74896527b
...
main
Author | SHA1 | Date | |
---|---|---|---|
96b5bae9d0 | |||
2b58781907 | |||
39aca9aa3f | |||
aea5158d6e | |||
6d75b33775 | |||
3ccf4ebabb | |||
6f1defb3da | |||
379c7007aa |
@@ -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")
|
||||
|
@@ -1 +0,0 @@
|
||||
class_name NPC extends CharacterBody3D
|
@@ -1 +0,0 @@
|
||||
class_name NPCMovement extends "res://entities/EntityMovement.gd"
|
@@ -1 +0,0 @@
|
||||
class_name Player extends CharacterBody3D
|
@@ -1,6 +1,6 @@
|
||||
@tool
|
||||
class_name EntityMovement extends Node
|
||||
|
||||
const SPEED = 64.0
|
||||
const FRICTION = 0.01
|
||||
|
||||
enum FacingDirection {
|
||||
@@ -24,61 +24,65 @@ const FacingDirAngle = {
|
||||
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
|
||||
|
||||
var facingDir:FacingDirection = FacingDirection.SOUTH
|
||||
var inputDir:Vector2 = Vector2.ZERO
|
||||
|
||||
func _enter_tree() -> void:
|
||||
if !sprite:
|
||||
#
|
||||
# Private Methods
|
||||
#
|
||||
func _updateSprite() -> void:
|
||||
if !sprite || sprite.animation == FacingDirWalkAnimations[facingDir]:
|
||||
return
|
||||
for dir in FacingDirWalkAnimations:
|
||||
if sprite.animation != FacingDirWalkAnimations[dir]:
|
||||
continue
|
||||
facingDir = dir
|
||||
break
|
||||
sprite.animation = FacingDirWalkAnimations[facingDir]
|
||||
|
||||
func canMove() -> bool:
|
||||
return true
|
||||
|
||||
func applyFacingDir() -> void:
|
||||
if !sprite || inputDir.length() <= 0.01:
|
||||
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:
|
||||
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:
|
||||
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:
|
||||
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:
|
||||
elif _inputDir.x < 0 && facingDir == FacingDirection.WEST:
|
||||
facingDir = FacingDirection.WEST
|
||||
else:
|
||||
facingDir = FacingDirection.SOUTH
|
||||
else:
|
||||
facingDir = FacingDirection.SOUTH
|
||||
elif inputDir.x > 0:
|
||||
elif _inputDir.x > 0:
|
||||
facingDir = FacingDirection.EAST
|
||||
else:
|
||||
facingDir = FacingDirection.WEST
|
||||
|
||||
sprite.animation = FacingDirWalkAnimations[facingDir]
|
||||
|
||||
func applyGravity() -> void:
|
||||
func _applyGravity() -> void:
|
||||
if !body.is_on_floor():
|
||||
body.velocity += PHYSICS.GRAVITY * get_process_delta_time()
|
||||
|
||||
func applyMovement() -> void:
|
||||
func _applyMovement() -> void:
|
||||
if !canMove():
|
||||
return
|
||||
|
||||
@@ -98,7 +102,7 @@ func applyMovement() -> void:
|
||||
right = right.normalized()
|
||||
|
||||
var directionAdjusted = (
|
||||
forward * inputDir.y + right * inputDir.x
|
||||
forward * _inputDir.y + right * _inputDir.x
|
||||
).normalized()
|
||||
if directionAdjusted.length() <= 0.01:
|
||||
return
|
||||
@@ -107,19 +111,38 @@ func applyMovement() -> void:
|
||||
var targetRot = atan2(directionAdjusted.x, directionAdjusted.z)
|
||||
rotate.rotation.y = targetRot
|
||||
|
||||
body.velocity.x = directionAdjusted.x * SPEED
|
||||
body.velocity.z = directionAdjusted.z * SPEED
|
||||
var speed = walkSpeed
|
||||
if _running:
|
||||
speed = runSpeed
|
||||
|
||||
body.velocity.x = directionAdjusted.x * speed
|
||||
body.velocity.z = directionAdjusted.z * speed
|
||||
|
||||
func applyFriction(delta:float) -> void:
|
||||
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()
|
||||
_applyGravity()
|
||||
_applyFriction(delta)
|
||||
_applyMovement()
|
||||
_applyFacingDir()
|
||||
body.move_and_slide()
|
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,10 +1,9 @@
|
||||
[gd_scene load_steps=13 format=3 uid="uid://kabs7mopalmo"]
|
||||
[gd_scene load_steps=12 format=3 uid="uid://kabs7mopalmo"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://crw7ls7t8cwct" path="res://entities/npc/NPC.gd" id="1_00k55"]
|
||||
[ext_resource type="Script" uid="uid://cmwovncvo1n5o" path="res://entities/npc/NPCTest.gd" id="2_1seh5"]
|
||||
[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://entities/npc/NPCMovement.gd" id="3_1seh5"]
|
||||
[ext_resource type="Texture2D" uid="uid://xx3qp5xh7tgu" path="res://entities/player/Player.png" id="4_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)
|
||||
@@ -63,14 +62,12 @@ animations = [{
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_x8luf"]
|
||||
radius = 8.5
|
||||
|
||||
[node name="NPC" type="CharacterBody3D"]
|
||||
[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="NPCTest" type="Node" parent="Scripts"]
|
||||
script = ExtResource("2_1seh5")
|
||||
|
||||
[node name="NPCMovement" type="Node" parent="Scripts" node_paths=PackedStringArray("body", "sprite")]
|
||||
script = ExtResource("3_1seh5")
|
||||
body = NodePath("../..")
|
||||
@@ -90,10 +87,10 @@ axis = 1
|
||||
double_sided = false
|
||||
texture_filter = 0
|
||||
sprite_frames = SubResource("SpriteFrames_1seh5")
|
||||
animation = &"walk_west"
|
||||
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="Scripts/NPCTest" method="onInteract"]
|
||||
[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"
|
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
|
Before Width: | Height: | Size: 237 B After Width: | Height: | Size: 237 B |
@@ -3,7 +3,7 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://xx3qp5xh7tgu"
|
||||
path.s3tc="res://.godot/imported/Player.png-e32651025a39607688584ad92d58078b.s3tc.ctex"
|
||||
path.s3tc="res://.godot/imported/Player.png-44a553acafadade6fc26fd4f7692a8d9.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
@@ -11,8 +11,8 @@ metadata={
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://entities/player/Player.png"
|
||||
dest_files=["res://.godot/imported/Player.png-e32651025a39607688584ad92d58078b.s3tc.ctex"]
|
||||
source_file="res://entity/player/Player.png"
|
||||
dest_files=["res://.godot/imported/Player.png-44a553acafadade6fc26fd4f7692a8d9.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
@@ -1,11 +1,11 @@
|
||||
[gd_scene load_steps=14 format=3 uid="uid://2ch34sio36nv"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ylmy3nvpirgr" path="res://entities/player/Player.gd" id="1_24gqh"]
|
||||
[ext_resource type="Script" uid="uid://bwxdv3kxrs4oj" path="res://entities/player/PlayerMovement.gd" id="2_o7et6"]
|
||||
[ext_resource type="Script" uid="uid://b3nty7pvbo58d" path="res://entities/player/PlayerInteraction.gd" id="3_24gqh"]
|
||||
[ext_resource type="Script" uid="uid://bdv1fj1pwknrs" path="res://entities/player/PlayerInput.gd" id="4_yjynp"]
|
||||
[ext_resource type="Script" uid="uid://bdjgvyiacbg28" path="res://entities/player/PlayerCamera.gd" id="5_g3lhm"]
|
||||
[ext_resource type="Texture2D" uid="uid://xx3qp5xh7tgu" path="res://entities/player/Player.png" id="7_fmb3c"]
|
||||
[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
|
||||
@@ -64,8 +64,9 @@ animations = [{
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_g13of"]
|
||||
size = Vector3(10, 16, 8)
|
||||
|
||||
[node name="Player" type="CharacterBody3D"]
|
||||
[node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("_movement")]
|
||||
script = ExtResource("1_24gqh")
|
||||
_movement = NodePath("Scripts/PlayerMovement")
|
||||
|
||||
[node name="Scripts" type="Node" parent="."]
|
||||
|
@@ -1,13 +1,17 @@
|
||||
@tool
|
||||
class_name PlayerCamera extends Node
|
||||
|
||||
const CAMERA_PIXELS_PER_UNIT = 1.0
|
||||
const CAMERA_PIXEL_SCALE = 2.0
|
||||
const CAMERA_PIXEL_SCALE = 1.0
|
||||
|
||||
@export var camera:Camera3D = null
|
||||
@export var target:Node3D = null
|
||||
@export var offset:Vector3 = Vector3(0, 0, 16)
|
||||
@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;
|
@@ -10,4 +10,4 @@ func _process(delta: float) -> void:
|
||||
if Input.is_action_just_pressed("interact"):
|
||||
interaction.interact()
|
||||
|
||||
movement.inputDir = Input.get_vector("move_left", "move_right", "move_back", "move_forward").normalized()
|
||||
movement._inputDir = Input.get_vector("move_left", "move_right", "move_back", "move_forward").normalized()
|
@@ -1,7 +1,7 @@
|
||||
[gd_resource type="ShaderMaterial" load_steps=3 format=3 uid="uid://cv8q4cbjyfauh"]
|
||||
|
||||
[ext_resource type="Shader" uid="uid://b3vi5kwotike5" path="res://materials/EntityMaterialShader.gdshader" id="1_gsq3s"]
|
||||
[ext_resource type="Texture2D" uid="uid://xx3qp5xh7tgu" path="res://entities/player/Player.png" id="2_awgof"]
|
||||
[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
|
@@ -1,4 +1,5 @@
|
||||
class_name PlayerMovement extends "res://entities/EntityMovement.gd"
|
||||
@tool
|
||||
class_name PlayerMovement extends "res://entity/EntityMovement.gd"
|
||||
|
||||
func canMove() -> bool:
|
||||
if PAUSE.isMovementPaused():
|
0
event/EventItem.gd
Normal file
0
event/EventItem.gd
Normal file
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
|
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
|
@@ -1,15 +1,18 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://d0ywgijpuqy0r"]
|
||||
[gd_scene load_steps=5 format=3 uid="uid://d0ywgijpuqy0r"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://cluuhtfjeodwb" path="res://maps/TestMapBase.tscn" id="1_ox0si"]
|
||||
[ext_resource type="PackedScene" uid="uid://2ch34sio36nv" path="res://entities/player/Player.tscn" id="2_0d2qr"]
|
||||
[ext_resource type="PackedScene" uid="uid://kabs7mopalmo" path="res://entities/npc/NPC.tscn" id="3_0vfw4"]
|
||||
[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, 14.3947, 1.94879, -13.1025)
|
||||
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)
|
@@ -11,6 +11,7 @@ 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)
|
||||
|
||||
|
@@ -17,13 +17,15 @@ config/icon="res://icon.svg"
|
||||
|
||||
[autoload]
|
||||
|
||||
PHYSICS="*res://singletons/GamePhysics.gd"
|
||||
PAUSE="*res://singletons/Pause.gd"
|
||||
TRANSITION="*res://singletons/Transition.tscn"
|
||||
UI="*res://singletons/UI.tscn"
|
||||
QUEST="*res://singletons/Quest.tscn"
|
||||
OVERWORLD="*res://singletons/Overworld.gd"
|
||||
SCENE="*res://singletons/Scene.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]
|
||||
|
||||
@@ -45,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,6 +1,6 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://c8shl8u156rfi"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dfpml5awf5i35" path="res://singletons/Load.gd" id="1_a3iwn"]
|
||||
[ext_resource type="Script" uid="uid://dfpml5awf5i35" path="res://singleton/Load.gd" id="1_a3iwn"]
|
||||
|
||||
[node name="Load" type="Node"]
|
||||
script = ExtResource("1_a3iwn")
|
@@ -18,7 +18,7 @@ func _exit_tree() -> void:
|
||||
TRANSITION.fadeOutEnd.disconnect(onFadeOutEnd)
|
||||
TRANSITION.fadeInEnd.disconnect(onFadeInEnd)
|
||||
|
||||
func _process(delta:float) -> void:
|
||||
func _process(_delta:float) -> void:
|
||||
if(!isMapChanging()):
|
||||
return
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://dodd3jx81w40c"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cd4lf5sm2aquv" path="res://singletons/Quest.gd" id="1_u2r0s"]
|
||||
[ext_resource type="Script" uid="uid://cd4lf5sm2aquv" path="res://singleton/Quest.gd" id="1_u2r0s"]
|
||||
|
||||
[node name="Quest" type="Node"]
|
||||
script = ExtResource("1_u2r0s")
|
@@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://i4ukelrrsujw"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://iu3m73wtjlho" path="res://singletons/Transition.gd" id="1_isjic"]
|
||||
[ext_resource type="Script" uid="uid://iu3m73wtjlho" path="res://singleton/Transition.gd" id="1_isjic"]
|
||||
|
||||
[node name="Transition" type="Control"]
|
||||
layout_mode = 3
|
5
singleton/UI.gd
Normal file
5
singleton/UI.gd
Normal file
@@ -0,0 +1,5 @@
|
||||
class_name UISingleton extends Control
|
||||
|
||||
@export var TEXTBOX: VNTextbox
|
||||
@export var PAUSE: PauseMenu
|
||||
@onready var MADTALK:Node = $VNTextbox/MadTalk;
|
@@ -1,7 +1,7 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://baos0arpiskbp"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://bkx3l0kckf4a8" path="res://ui/component/VNTextbox.tscn" id="1_1mtk3"]
|
||||
[ext_resource type="Script" uid="uid://dq3qyyayugt5l" path="res://singletons/UI.gd" id="1_son71"]
|
||||
[ext_resource type="Script" uid="uid://dq3qyyayugt5l" path="res://singleton/UI.gd" id="1_son71"]
|
||||
[ext_resource type="PackedScene" uid="uid://c0i5e2dj11d8c" path="res://ui/pause/PauseMenu.tscn" id="2_atyu8"]
|
||||
|
||||
[node name="UI" type="Control" node_paths=PackedStringArray("TEXTBOX", "PAUSE")]
|
||||
@@ -16,9 +16,7 @@ TEXTBOX = NodePath("VNTextbox")
|
||||
PAUSE = NodePath("PauseMenu")
|
||||
|
||||
[node name="PauseMenu" parent="." instance=ExtResource("2_atyu8")]
|
||||
visible = false
|
||||
layout_mode = 1
|
||||
|
||||
[node name="VNTextbox" parent="." instance=ExtResource("1_1mtk3")]
|
||||
visible = false
|
||||
layout_mode = 1
|
@@ -1,4 +0,0 @@
|
||||
class_name UISingleton extends Control
|
||||
|
||||
@export var TEXTBOX: VNTextbox
|
||||
@export var PAUSE: PauseMenu
|
@@ -1,44 +0,0 @@
|
||||
@tool
|
||||
class_name AdvancedRichText extends RichTextLabel
|
||||
|
||||
@export_multiline var advancedText:String = "":
|
||||
get():
|
||||
return advancedText
|
||||
set(value):
|
||||
advancedText = value
|
||||
_parseAdvancedText()
|
||||
|
||||
@export var translate:bool = true:
|
||||
set(value):
|
||||
translate = value
|
||||
_parseAdvancedText()
|
||||
get():
|
||||
return translate
|
||||
|
||||
func _init() -> void:
|
||||
self._parseAdvancedText()
|
||||
|
||||
func _enter_tree() -> void:
|
||||
self._parseAdvancedText()
|
||||
|
||||
func _parseAdvancedText() -> void:
|
||||
if advancedText.is_empty():
|
||||
self.text = ""
|
||||
return
|
||||
var key = advancedText
|
||||
if self.translate:
|
||||
key = tr(key)
|
||||
self.text = processInputTags(key)
|
||||
|
||||
func processInputTags(text:String) -> String:
|
||||
var regex = RegEx.new()
|
||||
regex.compile(r"\[input action=(.*?)\](.*?)\[/input\]")
|
||||
var result = text
|
||||
for match in regex.search_all(text):
|
||||
var action = match.get_string(1).to_lower()
|
||||
var height:int = 32
|
||||
# var device = get_current_device_type()
|
||||
# var icon_path = get_icon_for_action(action, device)
|
||||
var img_tag = "[img height=%d valign=center,center]res://textures/input/%s.tres[/img]" % [ height, action ]
|
||||
result = result.replace(match.get_string(0), img_tag)
|
||||
return result
|
@@ -1,8 +1,9 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://bkx3l0kckf4a8"]
|
||||
[gd_scene load_steps=5 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://ui/component/VNTextbox.gd" id="2_uo1gm"]
|
||||
[ext_resource type="Script" uid="uid://bjj6upgk1uvxd" path="res://ui/component/AdvancedRichText.gd" id="3_m60k3"]
|
||||
[ext_resource type="Script" uid="uid://c6av3xe4m2ujl" path="res://addons/madtalk/runtime/madtalk_runtime.gd" id="3_2x6s1"]
|
||||
[ext_resource type="Script" uid="uid://bjj6upgk1uvxd" path="res://ui/component/advancedrichtext/AdvancedRichText.gd" id="3_m60k3"]
|
||||
|
||||
[node name="VNTextbox" type="PanelContainer"]
|
||||
anchors_preset = 12
|
||||
@@ -15,6 +16,12 @@ grow_vertical = 0
|
||||
theme = ExtResource("1_wx4lp")
|
||||
script = ExtResource("2_uo1gm")
|
||||
|
||||
[node name="MadTalk" type="Node" parent="."]
|
||||
script = ExtResource("3_2x6s1")
|
||||
DialogMainControl = NodePath("..")
|
||||
DialogMessageBox = NodePath("../MarginContainer")
|
||||
DialogMessageLabel = NodePath("../MarginContainer/Label")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="."]
|
||||
layout_mode = 2
|
||||
theme = ExtResource("1_wx4lp")
|
||||
@@ -27,12 +34,8 @@ theme_override_constants/margin_bottom = 4
|
||||
layout_mode = 2
|
||||
theme = ExtResource("1_wx4lp")
|
||||
bbcode_enabled = true
|
||||
text = "TEST
|
||||
TEST
|
||||
TEST
|
||||
TEST"
|
||||
text = "To get through tight spaces, press[input action=down][/input]"
|
||||
fit_content = true
|
||||
script = ExtResource("3_m60k3")
|
||||
advancedText = "TEST
|
||||
TEST
|
||||
TEST
|
||||
TEST"
|
||||
userText = "To get through tight spaces, press[input action=down][/input]"
|
||||
finalText = "To get through tight spaces, press[img height=12 valign=center,center]res://ui/input/down.tres[/img]"
|
||||
|
104
ui/component/advancedrichtext/AdvancedRichText.gd
Normal file
104
ui/component/advancedrichtext/AdvancedRichText.gd
Normal file
@@ -0,0 +1,104 @@
|
||||
@tool
|
||||
class_name AdvancedRichText extends RichTextLabel
|
||||
|
||||
@export_multiline var userText:String = "" # The text the user is asking for
|
||||
@export_multiline var finalText:String = "" # The final text after processing (translation, wrapping, etc.)
|
||||
|
||||
# Hides the original RichTextLabel text property
|
||||
func _set(property: StringName, value) -> bool:
|
||||
if property == "text":
|
||||
userText = value
|
||||
_recalcText()
|
||||
return true
|
||||
elif property == "richtextlabel_text":
|
||||
text = value
|
||||
return true
|
||||
return false
|
||||
|
||||
func _get(property: StringName):
|
||||
if property == "text":
|
||||
return userText
|
||||
elif property == "richtextlabel_text":
|
||||
return text
|
||||
return null
|
||||
|
||||
@export var translate:bool = true:
|
||||
set(value):
|
||||
translate = value
|
||||
_recalcText()
|
||||
get():
|
||||
return translate
|
||||
|
||||
@export var smartWrap:bool = true:
|
||||
set(value):
|
||||
smartWrap = value
|
||||
_recalcText()
|
||||
get():
|
||||
return smartWrap
|
||||
|
||||
func _init() -> void:
|
||||
_recalcText()
|
||||
|
||||
func _enter_tree() -> void:
|
||||
_recalcText()
|
||||
self.resized.connect(_recalcText)
|
||||
|
||||
func _exit_tree() -> void:
|
||||
self.resized.disconnect(_recalcText)
|
||||
|
||||
func _recalcText() -> void:
|
||||
if userText.is_empty():
|
||||
self.richtextlabel_text = ""
|
||||
return
|
||||
|
||||
# Translate if needed
|
||||
var textTranslated = userText
|
||||
if self.translate:
|
||||
textTranslated = tr(textTranslated)
|
||||
|
||||
# Replace input bb tags.
|
||||
var regex = RegEx.new()
|
||||
regex.compile(r"\[input action=(.*?)\](.*?)\[/input\]")
|
||||
var inputIconText = textTranslated
|
||||
for match in regex.search_all(textTranslated):
|
||||
var action = match.get_string(1).to_lower()
|
||||
var height:int = get_theme_font_size("normal_font_size")
|
||||
# var device = get_current_device_type()
|
||||
# var icon_path = get_icon_for_action(action, device)
|
||||
var img_tag = "[img height=%d valign=center,center]res://ui/input/%s.tres[/img]" % [ height, action ]
|
||||
inputIconText = inputIconText.replace(match.get_string(0), img_tag)
|
||||
|
||||
# Perform smart wrapping
|
||||
var wrappedText = inputIconText
|
||||
if smartWrap:
|
||||
var unwrappedText = wrappedText.strip_edges()
|
||||
|
||||
self.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART;
|
||||
self.richtextlabel_text = unwrappedText
|
||||
self.visible_characters = -1;
|
||||
self.fit_content = true;
|
||||
var newlineIndexes = [];
|
||||
|
||||
# Determine where the wrapped newlines are
|
||||
var line = 0;
|
||||
var wasNewLine = false;
|
||||
for i in range(0, unwrappedText.length()):
|
||||
var tLine = self.get_character_line(i);
|
||||
if tLine == line || tLine == -1:
|
||||
wasNewLine = false
|
||||
if unwrappedText[i] == "\n":
|
||||
wasNewLine = true
|
||||
continue;
|
||||
if !wasNewLine:
|
||||
newlineIndexes.append(i);
|
||||
line = tLine;
|
||||
|
||||
# Create fake pre-wrapped text.
|
||||
wrappedText = "";
|
||||
for i in range(0, unwrappedText.length()):
|
||||
if newlineIndexes.find(i) != -1 and i != 0:
|
||||
wrappedText += "\n";
|
||||
wrappedText += unwrappedText[i];
|
||||
|
||||
finalText = wrappedText
|
||||
self.richtextlabel_text = wrappedText
|
@@ -1,6 +1,6 @@
|
||||
[gd_resource type="Texture2D" script_class="ControllerIconTexture" load_steps=2 format=3 uid="uid://vb20551utmet"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ddxpo5u73ssi2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_iw3l5"]
|
||||
[ext_resource type="Script" uid="uid://cxab4gf8nejc2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_iw3l5"]
|
||||
|
||||
[resource]
|
||||
resource_local_to_scene = false
|
||||
@@ -8,5 +8,6 @@ resource_name = ""
|
||||
script = ExtResource("1_iw3l5")
|
||||
path = "debug"
|
||||
show_mode = 0
|
||||
force_controller_icon_style = -1
|
||||
force_type = 0
|
||||
metadata/_custom_type_script = "uid://ddxpo5u73ssi2"
|
||||
force_device = 16
|
||||
|
@@ -1,12 +1,13 @@
|
||||
[gd_resource type="Texture2D" script_class="ControllerIconTexture" load_steps=2 format=3 uid="uid://cyfh2wyhh1cjg"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ddxpo5u73ssi2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_p6b3a"]
|
||||
[ext_resource type="Script" uid="uid://cxab4gf8nejc2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_p6b3a"]
|
||||
|
||||
[resource]
|
||||
resource_local_to_scene = false
|
||||
resource_name = ""
|
||||
script = ExtResource("1_p6b3a")
|
||||
path = "down"
|
||||
path = "move_back"
|
||||
show_mode = 0
|
||||
force_controller_icon_style = -1
|
||||
force_type = 0
|
||||
metadata/_custom_type_script = "uid://ddxpo5u73ssi2"
|
||||
force_device = 16
|
||||
|
@@ -1,12 +1,13 @@
|
||||
[gd_resource type="Texture2D" script_class="ControllerIconTexture" load_steps=2 format=3 uid="uid://b3ii1cu3mc7jc"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ddxpo5u73ssi2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_ngf5d"]
|
||||
[ext_resource type="Script" uid="uid://cxab4gf8nejc2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_ngf5d"]
|
||||
|
||||
[resource]
|
||||
resource_local_to_scene = false
|
||||
resource_name = ""
|
||||
script = ExtResource("1_ngf5d")
|
||||
path = "up"
|
||||
path = "interact"
|
||||
show_mode = 0
|
||||
force_controller_icon_style = -1
|
||||
force_type = 0
|
||||
metadata/_custom_type_script = "uid://ddxpo5u73ssi2"
|
||||
force_device = 16
|
||||
|
@@ -1,12 +1,13 @@
|
||||
[gd_resource type="Texture2D" script_class="ControllerIconTexture" load_steps=2 format=3 uid="uid://thb0gnik8oo3"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ddxpo5u73ssi2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_fijpq"]
|
||||
[ext_resource type="Script" uid="uid://cxab4gf8nejc2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_fijpq"]
|
||||
|
||||
[resource]
|
||||
resource_local_to_scene = false
|
||||
resource_name = ""
|
||||
script = ExtResource("1_fijpq")
|
||||
path = "left"
|
||||
path = "move_left"
|
||||
show_mode = 0
|
||||
force_controller_icon_style = -1
|
||||
force_type = 0
|
||||
metadata/_custom_type_script = "uid://ddxpo5u73ssi2"
|
||||
force_device = 16
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[gd_resource type="Texture2D" script_class="ControllerIconTexture" load_steps=2 format=3 uid="uid://byijoyarhygot"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ddxpo5u73ssi2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_o0qtj"]
|
||||
[ext_resource type="Script" uid="uid://cxab4gf8nejc2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_o0qtj"]
|
||||
|
||||
[resource]
|
||||
resource_local_to_scene = false
|
||||
@@ -8,5 +8,6 @@ resource_name = ""
|
||||
script = ExtResource("1_o0qtj")
|
||||
path = "pause"
|
||||
show_mode = 0
|
||||
force_controller_icon_style = -1
|
||||
force_type = 0
|
||||
metadata/_custom_type_script = "uid://ddxpo5u73ssi2"
|
||||
force_device = 16
|
||||
|
@@ -1,12 +1,13 @@
|
||||
[gd_resource type="Texture2D" script_class="ControllerIconTexture" load_steps=2 format=3 uid="uid://dajlk4u1q8rsp"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ddxpo5u73ssi2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_guxqd"]
|
||||
[ext_resource type="Script" uid="uid://cxab4gf8nejc2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_guxqd"]
|
||||
|
||||
[resource]
|
||||
resource_local_to_scene = false
|
||||
resource_name = ""
|
||||
script = ExtResource("1_guxqd")
|
||||
path = "right"
|
||||
path = "move_right"
|
||||
show_mode = 0
|
||||
force_controller_icon_style = -1
|
||||
force_type = 0
|
||||
metadata/_custom_type_script = "uid://ddxpo5u73ssi2"
|
||||
force_device = 16
|
||||
|
@@ -1,12 +1,13 @@
|
||||
[gd_resource type="Texture2D" script_class="ControllerIconTexture" load_steps=2 format=3 uid="uid://blut4glc4n0ck"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ddxpo5u73ssi2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_y6k0e"]
|
||||
[ext_resource type="Script" uid="uid://cxab4gf8nejc2" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_y6k0e"]
|
||||
|
||||
[resource]
|
||||
resource_local_to_scene = false
|
||||
resource_name = ""
|
||||
script = ExtResource("1_y6k0e")
|
||||
path = "left"
|
||||
path = "move_left"
|
||||
show_mode = 0
|
||||
force_controller_icon_style = -1
|
||||
force_type = 0
|
||||
metadata/_custom_type_script = "uid://ddxpo5u73ssi2"
|
||||
force_device = 16
|
||||
|
Reference in New Issue
Block a user