Compare commits

..

No commits in common. "80b8b8e9cbd24ea1fcd91272f6f031ac4329838e" and "4a862d86f28140db119e3a8c767de8faa2469bb4" have entirely different histories.

98 changed files with 93 additions and 2889 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cv2r7m0hmnisc"
path="res://.godot/imported/Character 1.png-afa71f25195fe20689a64e6896ff56b2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 10/Character 1.png"
dest_files=["res://.godot/imported/Character 1.png-afa71f25195fe20689a64e6896ff56b2.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://xrx3mkswyhk4"
path="res://.godot/imported/Character 5.png-2b102d72ea782d4f72ce3fce7ecfa309.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 11/Character 5.png"
dest_files=["res://.godot/imported/Character 5.png-2b102d72ea782d4f72ce3fce7ecfa309.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://kcn0es7aibn4"
path="res://.godot/imported/Character 9.png-20b7ff0c0e8caf229c2cea9f835a1f8d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 12/Character 9.png"
dest_files=["res://.godot/imported/Character 9.png-20b7ff0c0e8caf229c2cea9f835a1f8d.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://be58der6eox0y"
path="res://.godot/imported/Character 1.png-209e9f7c016381e65e33e09edba9e5de.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 13/Character 1.png"
dest_files=["res://.godot/imported/Character 1.png-209e9f7c016381e65e33e09edba9e5de.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c18h6nl2eqv4v"
path="res://.godot/imported/Character 5.png-ad7ac62347d04df7ee7d4fcd21e4e771.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 14/Character 5.png"
dest_files=["res://.godot/imported/Character 5.png-ad7ac62347d04df7ee7d4fcd21e4e771.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d4i08l3xoatx8"
path="res://.godot/imported/Character 9.png-5b1e15ebb431bf03e562398622a5152e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 15/Character 9.png"
dest_files=["res://.godot/imported/Character 9.png-5b1e15ebb431bf03e562398622a5152e.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cfhywvi6gyamp"
path="res://.godot/imported/Character 1.png-b4f39778f948e4e2dbca58389e93669a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 16/Character 1.png"
dest_files=["res://.godot/imported/Character 1.png-b4f39778f948e4e2dbca58389e93669a.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://0t14tbvjtdod"
path="res://.godot/imported/Character 5.png-977d6613e9cbe32dc9f227d9102222bd.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 17/Character 5.png"
dest_files=["res://.godot/imported/Character 5.png-977d6613e9cbe32dc9f227d9102222bd.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b2ngs6wkiurmt"
path="res://.godot/imported/Character 9.png-f6fe7a2a6b78344a902e4c0b1b9f52a0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 18/Character 9.png"
dest_files=["res://.godot/imported/Character 9.png-f6fe7a2a6b78344a902e4c0b1b9f52a0.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://drbtkux8n3h8w"
path="res://.godot/imported/Character 5.png-8a54a65555fe02b1dd97b584bda1bcf6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 2/Character 5.png"
dest_files=["res://.godot/imported/Character 5.png-8a54a65555fe02b1dd97b584bda1bcf6.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dqxsaoeb5kcxp"
path="res://.godot/imported/Character 9.png-74e2e4f30d4ba14105d6327336b9b462.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 3/Character 9.png"
dest_files=["res://.godot/imported/Character 9.png-74e2e4f30d4ba14105d6327336b9b462.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d0cpr4umsndgf"
path="res://.godot/imported/Character 1.png-2b4ef941ba65061b5eebeac703ac3820.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 4/Character 1.png"
dest_files=["res://.godot/imported/Character 1.png-2b4ef941ba65061b5eebeac703ac3820.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d38rvmky1mr5f"
path="res://.godot/imported/Character 5.png-e8c35410fad61c8e0b57612479895096.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 5/Character 5.png"
dest_files=["res://.godot/imported/Character 5.png-e8c35410fad61c8e0b57612479895096.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://5iec1dqk4bjb"
path="res://.godot/imported/Character 9.png-7a71dddd0f7aef1237f36ab212a848b2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 6/Character 9.png"
dest_files=["res://.godot/imported/Character 9.png-7a71dddd0f7aef1237f36ab212a848b2.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://1ljb3kglrv0r"
path="res://.godot/imported/Character 1.png-b7d909154284d14dd22087f3dfde5ab2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 7/Character 1.png"
dest_files=["res://.godot/imported/Character 1.png-b7d909154284d14dd22087f3dfde5ab2.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ce8r6xxay7wsw"
path="res://.godot/imported/Character 5.png-0cdabda1dede22b4155356897bbbec69.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 8/Character 5.png"
dest_files=["res://.godot/imported/Character 5.png-0cdabda1dede22b4155356897bbbec69.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://5hg6qondjuyt"
path="res://.godot/imported/Character 9.png-af1d6ab822dbafdecf429ee5a3ef55cc.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 9/Character 9.png"
dest_files=["res://.godot/imported/Character 9.png-af1d6ab822dbafdecf429ee5a3ef55cc.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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 808 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 463 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://uptdcefxlv4c"
path="res://.godot/imported/ppdf_bio_image_placeholder_2.png-95efb56131d6f4393fe011f7f38695e5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Icones/ppdf_bio_image_placeholder_2.png"
dest_files=["res://.godot/imported/ppdf_bio_image_placeholder_2.png-95efb56131d6f4393fe011f7f38695e5.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 MiB

View file

@ -2,8 +2,8 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://db2efj41fwjee"
path.s3tc="res://.godot/imported/Character 1.png-87cd2704255318e889e8123eb8b19238.s3tc.ctex"
uid="uid://cdqch4xk2sner"
path.s3tc="res://.godot/imported/Van_Gogh_-_Starry_Night_skybox.png-d81a74db678abe046adf1d1b3fe33c86.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
@ -11,8 +11,8 @@ metadata={
[deps]
source_file="res://Assets/Characters/72 Character Free/Char 1/Character 1.png"
dest_files=["res://.godot/imported/Character 1.png-87cd2704255318e889e8123eb8b19238.s3tc.ctex"]
source_file="res://Assets/Skybox/Van_Gogh_-_Starry_Night_skybox.png"
dest_files=["res://.godot/imported/Van_Gogh_-_Starry_Night_skybox.png-d81a74db678abe046adf1d1b3fe33c86.s3tc.ctex"]
[params]

View file

@ -11,7 +11,7 @@ signal tower_selected(tower : PackedScene, tower_button : TowerButton)
signal tower_builded(tower : PackedScene)
#Emitter : UpgradeButton.gd
#Emitter :
#Subscriber : tower.gd
signal tower_upgraded(tower_to_upgrade : String, upgrade : TowerUpgrade)

View file

@ -1,11 +1,7 @@
extends Node3D
#TODO Get rid of tower_blueprint, remake player controler
@onready var tower_blueprint = preload("res://Towers/tower.tscn")
@onready var selected_tower : Tower
@onready var selected_tower_button : TowerButton = $CanvasLayer/GameMenu/VBoxContainer/PierreButton
@onready var selected_tower_button : TowerButton = $CanvasLayer/UI/ShopPanel/VBoxContainer/PierreButton
@onready var cam : Camera3D = $Camera3D
@onready var selector : Node3D = $Selector
@ -31,7 +27,7 @@ var selected_collider : CollisionObject3D
func _ready() -> void:
$Spawner.spawn_next_wave()
$CanvasLayer/GameMenu.visible = in_build_menu
$CanvasLayer/UI/ShopPanel.visible = in_build_menu
EventBus.tower_selected.connect(_on_EventBus_tower_selected)
@ -113,7 +109,7 @@ func build_tower(scene : PackedScene) -> void:
EventBus.money_spent.emit(temp_tower.price)
temp_tower.tower_button = selected_tower_button
tower_count += 1
$Towers.add_child(temp_tower)
add_child(temp_tower)
EventBus.tower_builded.emit(temp_tower)
selected_tower_button.tower_in_game = temp_tower
send_to_action(temp_tower)
@ -144,13 +140,13 @@ func open_shop():
return
in_build_menu = true
$CanvasLayer/GameMenu.visible = in_build_menu
$CanvasLayer/UI/ShopPanel.visible = in_build_menu
func close_shop():
in_build_menu = false
$CanvasLayer/GameMenu.visible = in_build_menu
$CanvasLayer/UI/ShopPanel.visible = in_build_menu
func _on_EventBus_tower_selected(tower : PackedScene, tower_button : TowerButton):

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=18 format=3 uid="uid://ky0uewndeuwv"]
[gd_scene load_steps=17 format=3 uid="uid://ky0uewndeuwv"]
[ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://Levels/world.gd" id="1_fj7yv"]
[ext_resource type="PackedScene" uid="uid://d1f6m15niwgt" path="res://Tiles/tile.tscn" id="3_aqk2v"]
@ -8,25 +8,33 @@
[ext_resource type="PackedScene" uid="uid://dpjfo15otkfru" path="res://Tiles/cube.tscn" id="5_wse8f"]
[ext_resource type="Script" uid="uid://chu8s12rtdeqx" path="res://Scripts/Wave.gd" id="6_gbfbk"]
[ext_resource type="Resource" uid="uid://dkbuy7fetnihs" path="res://Waves/wave_1.tres" id="7_ioo17"]
[ext_resource type="PackedScene" uid="uid://djyye2otjju2d" path="res://game_menu.tscn" id="9_44brb"]
[ext_resource type="PackedScene" uid="uid://c54881eookjth" path="res://Assets/Meshes/SM_B26.glb" id="12_44brb"]
[ext_resource type="PackedScene" uid="uid://dbx8ow3v45k4k" path="res://UI/ui.tscn" id="9_ioo17"]
[ext_resource type="Texture2D" uid="uid://cdqch4xk2sner" path="res://Assets/Skybox/Van_Gogh_-_Starry_Night_skybox.png" id="9_k3n1d"]
[ext_resource type="PackedScene" uid="uid://p6a6rb7sgeqd" path="res://UI/gui.tscn" id="11_ic0uy"]
[ext_resource type="Script" uid="uid://xkk2pxkrwsq8" path="res://bullet_container.gd" id="12_k3n1d"]
[ext_resource type="PackedScene" uid="uid://dxeb1kk5ieix2" path="res://Assets/Meshes/SM_MiniHouse.glb" id="13_ju8gl"]
[ext_resource type="PackedScene" uid="uid://3u5ds5imu6d7" path="res://Assets/Meshes/SM_Minoterie.glb" id="14_4eob5"]
[ext_resource type="PackedScene" uid="uid://trsvfgyds26p" path="res://Assets/Meshes/SM_Polyson.glb" id="15_ikoig"]
[ext_resource type="PackedScene" uid="uid://c8qg6bkxv643o" path="res://Assets/Meshes/SM_Studio24.glb" id="16_ju8gl"]
[sub_resource type="Curve3D" id="Curve3D_aqk2v"]
_data = {
"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 1.212, -0.5, 0.5, 0, 0, 0, 0, 0, 0, 9.787, -0.5, 0.5),
"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 1.21236, 0, 0.534171, 0, 0, 0, 0, 0, 0, 9.78741, 0, 0.534171),
"tilts": PackedFloat32Array(0, 0)
}
point_count = 2
[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_2o6r5"]
panorama = ExtResource("9_k3n1d")
energy_multiplier = 0.5
[sub_resource type="Sky" id="Sky_70uel"]
sky_material = SubResource("PanoramaSkyMaterial_2o6r5")
[sub_resource type="Environment" id="Environment_036b0"]
background_mode = 1
background_color = Color(0.924338, 0.849272, 0.847318, 1)
background_mode = 2
background_color = Color(0.298412, 0.776976, 0.672082, 1)
sky = SubResource("Sky_70uel")
sky_custom_fov = 90.0
sky_rotation = Vector3(0, 0, 0.785398)
ambient_light_source = 3
ambient_light_color = Color(0.28519, 0.478909, 0.608112, 1)
tonemap_white = 0.3
volumetric_fog_density = 0.02
volumetric_fog_albedo = Color(1, 1, 2, 1)
@ -39,7 +47,7 @@ adjustment_saturation = 1.2
script = ExtResource("1_fj7yv")
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(-0.992981, -0.0586822, 0.10269, -0.00234758, 0.877843, 0.478943, -0.118251, 0.47534, -0.871819, 5.87173, 2.81458, -3.88415)
transform = Transform3D(-3.90165e-08, -0.228368, 0.973575, 1.97078e-08, 0.973575, 0.228368, -1, 2.80972e-08, -3.34849e-08, 11.3374, 2.49219, 0.496601)
[node name="Selector" parent="." instance=ExtResource("3_tlwt5")]
visible = false
@ -155,7 +163,7 @@ transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 9.5, 0
[node name="TheCube" parent="Map" instance=ExtResource("5_wse8f")]
unique_name_in_owner = true
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 10.1496, 0.209118, 0.497613)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.1496, 0.209118, 0.497613)
[node name="Spawner" type="Path3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
@ -169,34 +177,20 @@ waves = Array[ExtResource("6_gbfbk")]([ExtResource("7_ioo17")])
environment = SubResource("Environment_036b0")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.0532597, 0.998581, 0, -0.998581, 0.0532597, 0, 4, 6)
transform = Transform3D(1, 0, 0, 0, 0.258819, 0.965926, 0, -0.965926, 0.258819, 0, 4, 6)
light_energy = 0.0
[node name="CanvasLayer" type="CanvasLayer" parent="."]
[node name="GameMenu" parent="CanvasLayer" instance=ExtResource("9_44brb")]
visible = false
[node name="UI" parent="CanvasLayer" instance=ExtResource("9_ioo17")]
[node name="GUI" parent="CanvasLayer/UI" instance=ExtResource("11_ic0uy")]
layout_mode = 1
[node name="BulletContainer" type="Node3D" parent="."]
script = ExtResource("12_k3n1d")
[node name="Props" type="Node3D" parent="."]
[node name="SM_B26" parent="Props" instance=ExtResource("12_44brb")]
transform = Transform3D(-1.99902, 0, -0.0625423, 0, 2, 0, 0.0625423, 0, -1.99902, -1.30633, 0, 0.0903215)
[node name="SM_MiniHouse" parent="Props" instance=ExtResource("13_ju8gl")]
transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 3.71264, 0, 2.59755)
[node name="SM_Minoterie" parent="Props" instance=ExtResource("14_4eob5")]
transform = Transform3D(0.0377317, 0, 1.99964, 0, 2, 0, -1.99964, 0, 0.0377317, 6.07778, 0, 3.52353)
[node name="SM_Polyson" parent="Props" instance=ExtResource("15_ikoig")]
transform = Transform3D(-0.0471892, 0, 1.99944, 0, 2, 0, -1.99944, 0, -0.0471892, 9.34047, 0, 3.1498)
[node name="SM_Studio24" parent="Props" instance=ExtResource("16_ju8gl")]
transform = Transform3D(1.08365, 0, 1.68098, 0, 2, 0, -1.68098, 0, 1.08365, 1.44235, 0, 4.63481)
[node name="Towers" type="Node3D" parent="."]
[connection signal="timeout" from="Spawner/SpawnTimer" to="Spawner" method="_on_spawn_timer_timeout"]
[editable path="CanvasLayer/UI"]
[editable path="CanvasLayer/UI/GUI"]

View file

@ -3,5 +3,3 @@ class_name Upgrade
@export var icon : Texture2D = preload("res://Assets/Icones/medal2.png")
@export var text : String = "Upgrade"
var condition : Upgrade

View file

@ -46,34 +46,10 @@ var is_rest : bool = false:
else:
in_action()
@export_category("Upgrades")
var tower_upgrades : Array[TowerUpgrade]
@export var tower_shop : Array[TowerUpgrade]
func get_available_upgrades() -> Array[TowerUpgrade]:
var available_upgrades : Array[TowerUpgrade]
#Check every upgrades in shop
for shop_upgrade in tower_shop:
#If they have no conditions, they are available
if shop_upgrade.condition == null:
available_upgrades.append(shop_upgrade)
continue
else:
# If they have a condition, check for the previously bought upgrades
for owned_upgrade in tower_upgrades: #Check
if shop_upgrade.condition == owned_upgrade:
available_upgrades.append(shop_upgrade)
return available_upgrades
func apply_upgrade(upgrade : TowerUpgrade):
upgrade.apply_upgrade(self)
if tower_shop.has(upgrade):
tower_shop.erase(upgrade)
tower_upgrades.append(upgrade)
else:
printerr("Upgrade already bought")
func _ready() -> void:
EventBus.tower_upgraded.connect(_on_EventBus_tower_upgraded)
energy_bar.set_up(energy, max_energy)
@ -153,8 +129,5 @@ func _on_energy_cooldown_timeout() -> void:
func _on_EventBus_tower_upgraded(tower_to_upgrade : String, upgrade : TowerUpgrade) -> void:
if tower_to_upgrade == tower_name:
apply_upgrade(upgrade)
func _on_input_event(camera: Node, event: InputEvent, event_position: Vector3, normal: Vector3, shape_idx: int) -> void:
if event
upgrade.apply_upgrade(self)
tower_upgrades.append(upgrade)

View file

@ -1,11 +1,8 @@
[gd_scene load_steps=9 format=3 uid="uid://trg7ag3dqr2l"]
[gd_scene load_steps=6 format=3 uid="uid://trg7ag3dqr2l"]
[ext_resource type="Script" uid="uid://8kpvuurr5h5n" path="res://Towers/tower.gd" id="1_egfuc"]
[ext_resource type="Texture2D" uid="uid://bn6ikwol6x8r0" path="res://Assets/Characters/Male1.png" id="2_egfuc"]
[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Scripts/Upgrades/TowerUpgrade.gd" id="2_mnaic"]
[ext_resource type="Resource" uid="uid://c6844q5o2gjhd" path="res://Upgrades/Tower/TowerUpgradeMaxEnergy1.tres" id="3_jv31o"]
[ext_resource type="PackedScene" uid="uid://bm303ot1ck82l" path="res://UI/energy_bar_3d.tscn" id="3_pajr1"]
[ext_resource type="Resource" uid="uid://bus11qw5jg8yo" path="res://Upgrades/Tower/TowerUpgradeMaxEnergy2.tres" id="4_5dr1v"]
[sub_resource type="BoxShape3D" id="BoxShape3D_egfuc"]
size = Vector3(1, 0.1, 1)
@ -17,14 +14,7 @@ radius = 3.0
collision_layer = 4
collision_mask = 4
script = ExtResource("1_egfuc")
tower_name = null
price = null
bullet_damage = 5
action_cooldown = null
max_energy = null
energy_regen = null
energy_cost = null
tower_shop = Array[ExtResource("2_mnaic")]([ExtResource("3_jv31o"), ExtResource("4_5dr1v")])
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.00914001, 0)
@ -40,7 +30,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.475708, 0)
shape = SubResource("SphereShape3D_pajr1")
[node name="Aim" type="Marker3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.572046, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.02026, 0)
[node name="BulletContainer" type="Node" parent="."]
@ -51,7 +41,7 @@ wait_time = 1.5
wait_time = 0.5
[node name="Sprite3D" type="Sprite3D" parent="."]
transform = Transform3D(3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0.385348, 0)
transform = Transform3D(3.5, 0, 0, 0, 3.5, 0, 0, 0, 3.5, 0, 0.515442, 0)
billboard = 2
texture = ExtResource("2_egfuc")
hframes = 8
@ -61,7 +51,6 @@ frame = 75
[node name="EnergyBar3D" parent="." instance=ExtResource("3_pajr1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.44473, 0)
[connection signal="input_event" from="." to="." method="_on_input_event"]
[connection signal="body_entered" from="Range" to="." method="_on_range_body_entered"]
[connection signal="body_exited" from="Range" to="." method="_on_range_body_exited"]
[connection signal="timeout" from="Cooldown" to="." method="_on_cooldown_timeout"]

View file

@ -1,6 +1,12 @@
[gd_scene load_steps=3 format=3 uid="uid://he31g7f3ru1c"]
[gd_scene load_steps=9 format=3 uid="uid://he31g7f3ru1c"]
[ext_resource type="PackedScene" uid="uid://bqpeu50pgsdfk" path="res://UI/tower_button.tscn" id="1_txsyf"]
[ext_resource type="PackedScene" uid="uid://cpdr2a3xqscfa" path="res://UI/upgrade_button.tscn" id="2_pyoxy"]
[ext_resource type="Script" uid="uid://tn3qdhcyaxsg" path="res://UI/upgrade_button.gd" id="3_jgt3m"]
[ext_resource type="Resource" uid="uid://c6844q5o2gjhd" path="res://Upgrades/Tower/TowerUpgradeMaxEnergy1.tres" id="4_jgt3m"]
[ext_resource type="Resource" uid="uid://b50h2sx6xhdb2" path="res://Upgrades/Tower/TowerUpgradeEnergyRegen1.tres" id="5_wvtj5"]
[ext_resource type="Resource" uid="uid://cfyahlbi4apsj" path="res://Upgrades/Tower/TowerUpgradeActionCooldown1.tres" id="6_32wxa"]
[ext_resource type="Resource" uid="uid://bus11qw5jg8yo" path="res://Upgrades/Tower/TowerUpgradeMaxEnergy2.tres" id="7_dyfge"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_oxe32"]
bg_color = Color(0.921569, 0.890196, 0.415686, 1)
@ -38,6 +44,34 @@ grow_vertical = 0
theme_override_styles/fill = SubResource("StyleBoxFlat_oxe32")
show_percentage = false
[node name="UpgradeButton" parent="VBoxContainer" instance=ExtResource("2_pyoxy")]
layout_mode = 2
text = "Max Energy Upgrade +50"
script = ExtResource("3_jgt3m")
upgrade = ExtResource("4_jgt3m")
tower_to_upgrade = "Pierre"
[node name="UpgradeButton2" parent="VBoxContainer" instance=ExtResource("2_pyoxy")]
layout_mode = 2
text = "Energy Regen Upgrade +5"
script = ExtResource("3_jgt3m")
upgrade = ExtResource("5_wvtj5")
tower_to_upgrade = "Pierre"
[node name="UpgradeButton3" parent="VBoxContainer" instance=ExtResource("2_pyoxy")]
layout_mode = 2
text = "Cooldown Upgrade -0.3"
script = ExtResource("3_jgt3m")
upgrade = ExtResource("6_32wxa")
tower_to_upgrade = "Pierre"
[node name="UpgradeButton4" parent="VBoxContainer" instance=ExtResource("2_pyoxy")]
layout_mode = 2
text = "Max Energy Upgrade +100"
script = ExtResource("3_jgt3m")
upgrade = ExtResource("7_dyfge")
tower_to_upgrade = "Pierre"
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
@ -47,3 +81,8 @@ custom_minimum_size = Vector2(0, 50)
layout_mode = 2
text = "Cancel
"
[connection signal="pressed" from="VBoxContainer/UpgradeButton" to="VBoxContainer/UpgradeButton" method="_on_pressed"]
[connection signal="pressed" from="VBoxContainer/UpgradeButton2" to="VBoxContainer/UpgradeButton2" method="_on_pressed"]
[connection signal="pressed" from="VBoxContainer/UpgradeButton3" to="VBoxContainer/UpgradeButton3" method="_on_pressed"]
[connection signal="pressed" from="VBoxContainer/UpgradeButton4" to="VBoxContainer/UpgradeButton4" method="_on_pressed"]

View file

@ -2,7 +2,11 @@ extends Button
class_name TowerButton
@export var tower : PackedScene
#var tower_in_game : Tower
var tower_in_game : Tower
func _on_pressed() -> void:
EventBus.tower_selected.emit(tower, self)
func _process(delta: float) -> void:
if tower_in_game:
$EnergyBar.value = tower_in_game.energy/tower_in_game.max_energy * 100.0

View file

@ -7,4 +7,3 @@ class_name UpgradeButton
func _on_pressed() -> void:
EventBus.tower_upgraded.emit(tower_to_upgrade, upgrade)
queue_free()

View file

@ -1,192 +0,0 @@
## This autoload is responsible for receiving the node path that will be inspected
## from the editor panel and then sending back all the signal data from that node
## parsed into a debugger friendly array
extends Node
## Reference to the currently targeted node in the remote tree
var target_node: Node = null
## On singleton ready in scene
## subscribe to the editor panel's request
func _ready() -> void:
EngineDebugger.register_message_capture("signal_lens", _on_node_signal_data_requested)
## This callback parses a node's signal data into an array that can be sent to the debugger
## The data is packaged in the following structure:
## Pseudo-code: [Name of target node, [All of the node's signals and each signal's respective callables], Class of target node]
## This request is received in the debugger with an array containing the target node's node path
## which will be used to retrieve the target node from the scene
func _on_node_signal_data_requested(prefix, data) -> bool:
var new_target_node = get_tree().root.get_node(data[0])
# If node is not found, return false
# If found, keep going
if new_target_node == null:
printerr("No node found in path " + str(data[0]))
return false
# Avoid error when trying to inspect root node
if new_target_node == get_tree().root:
EngineDebugger.send_message("signal_lens:incoming_node_signal_data", ["Root"])
return false
# Disconnect this autoload's callable connections from the previously targeted node's signals
if target_node != null:
if target_node != new_target_node:
for signal_name in target_node.get_signal_list().map(func(p_signal): return p_signal["name"]):
if target_node.is_connected(signal_name, _on_target_node_signal_emitted):
target_node.disconnect(signal_name, _on_target_node_signal_emitted)
# Acquire newly targeted node reference
target_node = new_target_node
# Initialize the first piece of data that will be sent to the debugger
# The unique name of the targeted node
# This will be used to set the name of the main graph node in the editor panel
var target_node_name: String = target_node.name
# Get target node class using Object.get_class()
var target_node_class: String = target_node.get_class()
# Initialize the array that will store the node's signal data
var target_node_signal_data: Array
# Get unparsed signal data from target node
var target_node_signal_list: Array[Dictionary] = target_node.get_signal_list()
# Iterate all signals in target node and parse signal data
# to debugger-friendly format
for i in range(target_node_signal_list.size()):
var raw_signal_data: Dictionary = target_node_signal_list[i]
# Raw signal data is formatted as:
# [name] is the name of the method, as a String
# [args] is an Array of dictionaries representing the arguments
# [default_args] is the default arguments as an Array of variants
# [flags] is a combination of MethodFlags
# [id] is the method's internal identifier int
# [return] is the returned value, as a Dictionary;
# Parse signal name
var parsed_signal_name: String = raw_signal_data["name"]
# Parse signal callables
var raw_signal_connections: Array[Dictionary] = target_node.get_signal_connection_list(raw_signal_data["name"])
# Raw signal connection is formatted as:
# [signal] is a reference to the Signal;
# [callable] is a reference to the connected Callable;
# [flags] is a combination of ConnectFlags.
var parsed_signal_callables = parse_signal_callables_to_debugger_format(raw_signal_connections)
# Create debugger-friendly signal data dictionary
var parsed_signal_data: Dictionary = {
"signal": parsed_signal_name,
"callables": parsed_signal_callables
}
# Append to overall signal data that will be sent to debugger
target_node_signal_data.append(parsed_signal_data)
# Connect this autoload's signal emission capture callable to currently iterated signal
# so we can send signal emissions to the editor panel
if not target_node.is_connected(parsed_signal_name, _on_target_node_signal_emitted):
var signal_args: Array = raw_signal_data["args"]
if signal_args.size() > 0:
target_node.connect(parsed_signal_name, _on_target_node_signal_emitted.bind(target_node_name, parsed_signal_name).unbind(signal_args.size()))
else:
target_node.connect(parsed_signal_name, _on_target_node_signal_emitted.bind(target_node_name, parsed_signal_name))
# On node data ready, prepare the array as per the debugger's specifications
EngineDebugger.send_message("signal_lens:incoming_node_signal_data", [target_node_name, target_node_signal_data, target_node_class])
return true
func parse_signal_callables_to_debugger_format(raw_signal_connections):
var parsed_signal_callables: Array[Dictionary]
# Iterate all connections of signal to parse callables
for raw_signal_connection: Dictionary in raw_signal_connections:
var parsed_callable_object: Object = raw_signal_connection["callable"].get_object()
var parsed_callable_object_name: String
# If object has property "name", get this property
# Otherwise, get the string value of the object
# This is important to allow parsing anonymous lambdas, which
# don't have name properties. The names in the nodes are not
# very user-friendly right now, so this is a good spot for a
# TODO: improve readability of anonymous lambda nodes
if not parsed_callable_object: return {"object_name": "ERROR: Couldn't parse node name."}
if parsed_callable_object.get("name") != null:
parsed_callable_object_name = parsed_callable_object.get("name")
else:
parsed_callable_object_name = parsed_callable_object.to_string()
var parsed_callable_method_name = str(raw_signal_connection["callable"].get_method())
# Don't parse callable that is in this autoload
if parsed_callable_method_name == "_on_target_node_signal_emitted": continue
var parsed_callable_data = {
"object_name": parsed_callable_object_name,
"method_name": parsed_callable_method_name
}
parsed_signal_callables.append(parsed_callable_data)
return parsed_signal_callables
## This callable receives all signal emissions from the currently targeted node
## and sends them to the editor panel
func _on_target_node_signal_emitted(node_name: String, signal_name: String):
var emission_data: Dictionary = {
"node_name": node_name,
"signal_name": signal_name,
"signal_arguments": [], # NOTE: Empty for now, will be available in a future release targeting Godot 4.5
"datetime": get_current_datetime_string(),
"timestamp": get_engine_ticks_string(),
"process_frames": Engine.get_process_frames(),
"physics_frames": Engine.get_physics_frames(),
}
EngineDebugger.send_message("signal_lens:incoming_node_signal_emission", [emission_data])
# NOTE: This function is compatible with Godot 4.5+ only, but 1.4.0 version of Signal Lens
# will still support 4.3+, so I'm keeping it here so it can reimplemented in a future release.
#func _on_target_node_signal_emitted(...args: Array):
#
#var parsed_args: Array
#var signal_args = args.slice(0, args.size() - 2)
#for arg in signal_args:
#parsed_args.append(str(arg))
#
#var emission_data: Dictionary = {
#"node_name": args[args.size() - 2],
#"signal_name": args[args.size() - 1],
#"datetime": get_current_datetime_string(),
#"timestamp": get_engine_ticks_string(),
#"process_frames": Engine.get_process_frames(),
#"physics_frames": Engine.get_physics_frames(),
#"signal_arguments": parsed_args
#}
#
#EngineDebugger.send_message("signal_lens:incoming_node_signal_emission", [emission_data])
func get_current_datetime_string() -> String:
return Time.get_datetime_string_from_system()
func get_engine_ticks_string() -> String:
var ticks: int = Time.get_ticks_msec()
# Convert milliseconds to total seconds
var total_seconds = ticks / 1000
var milliseconds = ticks % 1000
# Calculate hours, minutes, and seconds
var hours = total_seconds / 3600
var minutes = (total_seconds % 3600) / 60
var seconds = total_seconds % 60
# Format with leading zeros
return "%02d:%02d:%02d:%03d" % [hours, minutes, seconds, milliseconds]

View file

@ -1 +0,0 @@
uid://85rkx60vm7a7

View file

@ -1,77 +0,0 @@
## Backend debugger class that is necessary for debugger plugins
## Handles the engine's debugger callbacks for receiving and sending data
## to the project that is playing
## Sets up the editor panel inside the debugger tab
class_name SignalLensDebugger
extends EditorDebuggerPlugin
## Emitted on debugging session started
## Can happen on engine open or on play
signal started
## Emitted when node data is received from autoload in remote scene
signal received_node_data_from_remote(data)
## Emitted when signal emission data is received from autoload in remote scene
signal received_signal_emission_from_remote(data)
## Emitted when editor panel requests inspection for [param node_path]
signal requested_node_data_from_remote(node_path: NodePath)
## Emitted on a breakpoint activated
## Not used yet, can be useful in the future
signal breaked
## Emitted on continued after breakpoint
## Not used yet, can be useful in the future
signal continued
## Emitted on debugging session stopped
## Can happen on editor quit or on stopped playing
signal stopped
## Identifier for debugger session
## Acquired on session started and cached
var current_session_id: int = 0
## Designates debugger messages containing this prefix
## as being specific to the plugin
const DEBUGGER_MESSAGE_PREFIX := "signal_lens"
## Sends data request message to remote scene with [param node_path]
func request_node_data_from_remote(node_path: NodePath):
get_session(current_session_id).send_message("signal_lens:node_signal_data_requested", [node_path])
requested_node_data_from_remote.emit(node_path)
## Appends editor panel control to Godot's debugger bottom panel
func setup_editor_panel(editor_panel: SignalLensEditorPanel):
get_session(current_session_id).add_session_tab(editor_panel)
## This override is necessary so you can send and receive
## messages from the project that is playing
func _has_capture(prefix) -> bool:
return prefix == DEBUGGER_MESSAGE_PREFIX
## On data from autoload received, send it to the editor panel
func _capture(message, data, session_id) -> bool:
if message == "signal_lens:incoming_node_signal_data":
received_node_data_from_remote.emit(data)
return true
elif message == "signal_lens:incoming_node_signal_emission":
received_signal_emission_from_remote.emit(data)
return true
return false
## Engine callback override where we set up signals
func _setup_session(session_id):
current_session_id = session_id
var session = get_session(current_session_id)
session.started.connect(_on_session_started)
session.stopped.connect(_on_session_stopped)
session.breaked.connect(_on_session_breaked)
session.continued.connect(_on_session_continued)
func _on_session_started(): started.emit()
func _on_session_stopped(): stopped.emit()
func _on_session_breaked(can_debug: bool): breaked.emit(can_debug)
func _on_session_continued(): continued.emit()

View file

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

View file

@ -1,92 +0,0 @@
@tool
class_name Logger
extends Control
const MAX_LOGS := 1000
enum Options {
DATETIME,
TIMESTAMP,
PROCESS_FRAME,
PHYSICS_FRAME
}
@export var log_container: Control
@export var copy_button: Button
@export var clear_button: Button
@export var v_split_container: VSplitContainer
@export var h_split_container: HSplitContainer
@export var log_scroll: ScrollContainer
@export var counter_label: Label
var _logs: Array[String]
var _starting_v_split_margin_end: int
var _starting_h_split_offset: int
var _options_popup: PopupMenu
func _ready() -> void:
copy_button.icon = EditorInterface.get_base_control().get_theme_icon("ActionCopy", "EditorIcons")
clear_button.icon = EditorInterface.get_base_control().get_theme_icon("Clear", "EditorIcons")
_starting_v_split_margin_end = v_split_container.drag_area_margin_end
_starting_h_split_offset = h_split_container.split_offset
counter_label.text = ""
func clear():
_logs.clear()
for child in log_container.get_children():
child.queue_free()
counter_label.text = ""
func create_log(datetime: String, timestamp: String, node_name: String, signal_name: String, signal_arguments: Array, process_frames: int, physics_frames: int):
if _logs.size() >= MAX_LOGS:
_logs.pop_front()
log_container.get_child(0).queue_free()
var raw_log = "%s | %s\n%s | %s\n%s%s" % [datetime, timestamp, process_frames, physics_frames, node_name, signal_name]
if not signal_arguments.is_empty(): raw_log += "\n" + str(signal_arguments)
_logs.append(raw_log)
var pretty_log: String = ""
pretty_log += "[font_size=12]"
pretty_log += "[color=WEB_GRAY]%s | %s\nProcess: %s | Physics: %s[/color]\n" % [datetime, timestamp, process_frames, physics_frames]
pretty_log += "[font_size=13][color=WHITE][b]%s%s[/b]\n" % [node_name, signal_name]
if not signal_arguments.is_empty(): pretty_log += "[color=WHITE]" + str(signal_arguments)
var log_label: RichTextLabel = RichTextLabel.new()
log_label.bbcode_enabled = true
log_label.fit_content = true
log_label.selection_enabled = true
log_label.add_theme_constant_override("line_separation", 5)
log_label.context_menu_enabled = true
log_label.text = pretty_log
log_label.add_theme_stylebox_override("background", StyleBoxEmpty.new())
log_label.add_theme_stylebox_override("normal", StyleBoxEmpty.new())
log_container.add_child(log_label)
await get_tree().process_frame
log_scroll.scroll_vertical = log_scroll.get_v_scroll_bar().max_value
counter_label.text = "(%s)" % [str(_logs.size())]
func _on_clear_button_pressed() -> void:
clear()
func _on_copy_button_pressed() -> void:
var result: String
var index = 0
for pretty_log: String in _logs:
result += pretty_log
index += 1
if index < _logs.size():
result += "\n\n"
DisplayServer.clipboard_set(result)
func _on_h_split_container_dragged(offset: int) -> void:
var h_split_offset_progress = inverse_lerp(_starting_h_split_offset, 0, offset)
var new_v_split_drag_area = lerp(_starting_v_split_margin_end, 0, h_split_offset_progress)
v_split_container.drag_area_margin_end = new_v_split_drag_area

View file

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

View file

@ -1,542 +0,0 @@
## Draw's Signal Lens panel in the debugger bottom tab inside Godot's editor
## Parses data received from the runtime autoload into
## a user-friendly graph of a node's signal and its connections
@tool
class_name SignalLensEditorPanel
extends Control
## Written in the panel's line edit if nothing is selected and a debugger
## session is active
const TUTORIAL_TEXT: String = "Select a node in the remote scene"
## Default duration a signal emission pulse in seconds
## TODO: This could be a user setting
const DEFAULT_EMISSION_DURATION: float = 1.0
## Default opacity of a connection line in the graph when rendered
## TODO: This could be a user setting
const DEFAULT_CONNECTION_OPACITY: float = 0.3
## This enum is used to set up the graph node's ports
## in a way that provides more legibility in the code
enum Direction {LEFT, RIGHT}
## This enum keeps available option IDs
enum Options {
HIDE_SIGNALS_WITHOUT_CONNECTIONS,
HIDE_BUILT_IN_SIGNALS,
SHOW_GRAPH_TOOLBAR,
SHOW_GRAPH_MINIMAP
}
## Emitted on user pressed "refresh" button
signal node_data_requested(node_path)
## Current node path being inspected
var current_node: NodePath = ""
## If true, ignores new incoming data from the remote tree
## effectively locking the panel current node path
var block_new_inspections: bool = false
## If true, all incoming signal emissions will be drawn and won't fade out
var keep_emissions: bool = false
## Multiplier that increases or decreases emission drawing speed
## Acquired from slider in scene
var emission_speed_multiplier: float = 1.0
var connection_opacity: float = DEFAULT_CONNECTION_OPACITY
## Array that collects active pulse connections so that they can be
## all cleanup together when unfreezing emissions
var pulsing_connections: Array = []
## Value of options
var settings: Dictionary = {
Options.HIDE_SIGNALS_WITHOUT_CONNECTIONS: true,
Options.HIDE_BUILT_IN_SIGNALS: false,
Options.SHOW_GRAPH_TOOLBAR: false,
Options.SHOW_GRAPH_MINIMAP: false
}
# Scene references
@export var graph_edit: GraphEdit
@export var logger_button: Button
@export var node_path_line_edit: LineEdit
@export var refresh_button: Button
@export var options_button: MenuButton
@onready var options_popup: PopupMenu = options_button.get_popup()
@export var clear_button: Button
@export var inactive_text: Label
@export var warning_text: Label
@export var pin_checkbox: CheckButton
@export var keep_emissions_checkbox: CheckButton
@export var emission_speed_slider: Slider
@export var emission_speed_icon: Button
@export var connection_opacity_icon: Button
@export var logger: Control
## Initialize panel: Load icons
func _ready() -> void:
_get_parent_editor_split()
options_button.icon = EditorInterface.get_base_control().get_theme_icon("GuiTabMenuHl", "EditorIcons")
clear_button.icon = EditorInterface.get_base_control().get_theme_icon("Clear", "EditorIcons")
refresh_button.icon = EditorInterface.get_base_control().get_theme_icon("Reload", "EditorIcons")
pin_checkbox.icon = EditorInterface.get_base_control().get_theme_icon("Pin", "EditorIcons")
keep_emissions_checkbox.icon = EditorInterface.get_base_control().get_theme_icon("Override", "EditorIcons")
emission_speed_icon.icon = EditorInterface.get_base_control().get_theme_icon("Timer", "EditorIcons")
logger_button.icon = EditorInterface.get_base_control().get_theme_icon("FileList", "EditorIcons")
options_popup.index_pressed.connect(_on_options_index_pressed) # NOTE: ID & index must have same value!
connection_opacity_icon.icon = EditorInterface.get_base_control().get_theme_icon("GuiVisibilityVisible", "EditorIcons")
#main_buttons_container.reparent(graph_edit.get_menu_hbox())
#graph_edit.get_menu_hbox().move_child(main_buttons_container, 0)
#graph_edit.get_menu_hbox().custom_minimum_size.x = graph_edit.size.x
graph_edit.get_menu_hbox().reparent(panel_container)
graph_edit.get_menu_hbox().hide()
#graph_edit.get_menu_hbox().hide()
repo_button.icon = EditorInterface.get_base_control().get_theme_icon("ExternalLink", "EditorIcons")
@onready var repo_button: Button = $EditorPanel/MainButtonsContainer/HBoxContainer2/RepoButton
@onready var panel_container: PanelContainer = $EditorPanel/PanelContainer
@onready var main_buttons_container: MarginContainer = $EditorPanel/MainButtonsContainer
## Requests inspection of [param current_node] in remote scene
func request_node_data():
node_data_requested.emit(current_node)
## Receives node signal data from remote scene
## Data structure is detailed further below
func receive_node_data(data: Array):
draw_node_data(data)
## Sets up editor on project play
func start_session():
clear_graph()
pin_checkbox.button_pressed = false
keep_emissions_checkbox.button_pressed = false
emission_speed_slider.editable = true
emission_speed_icon.disabled = false
node_path_line_edit.text = TUTORIAL_TEXT
inactive_text.hide()
## Cleans up editor on project stop
func stop_session():
clear_graph()
pin_checkbox.disabled = true
keep_emissions_checkbox.disabled = true
refresh_button.disabled = true
clear_button.disabled = true
emission_speed_slider.editable = false
emission_speed_icon.disabled = true
node_path_line_edit.text = ""
pin_checkbox.button_pressed = false
keep_emissions_checkbox.button_pressed = false
inactive_text.show()
warning_text.hide()
warning_text.text = ""
## Assigns a [param target_node] to internal member [param current_node]
func assign_node_path(target_node: NodePath):
# If locked button is toggled, don't change the current node
if block_new_inspections: return
# If incoming node is invalid, disable refreshing to avoid null nodes
refresh_button.disabled = target_node.is_empty()
# Assign incoming node as the current one
current_node = target_node
# Update line edit
node_path_line_edit.text = current_node
node_path_line_edit.caret_column = node_path_line_edit.text.length()
#region Graph Rendering
## Clears all nodes from the debugger panel
## Called on user inspecting new node or on play/quit current
## debug session
func clear_graph():
# If nothing in graph, return
if graph_edit.get_child_count() == 0: return
# Not clearing connection activity can lead to unwanted behaviour
# So this function must be called here for now
clean_connection_activity()
# Frees child nodes
for child: Node in graph_edit.get_children():
# This seems to be necessary as per Godot 4.3
# because this child, despite being internal,
# is iterated in get_children() and if it is
# destroyed, the editor crashed
# so let's ignore it and move on
if child.name == "_connection_layer": continue
child.free()
## Necessary for the minimap to update, it seems
if graph_edit.minimap_enabled:
graph_edit.minimap_enabled = false
graph_edit.minimap_enabled = true
## Draws data received from the runtime autoload
## The data is packages in the following structure:
## Pseudo-code: [Name of target node, [All of the node's signals and each signal's respective callables], Class of target node]
## Print result: [{&"name_of_targeted_node", [{"signal": "item_rect_changed", "callables": [{ "object_name": &"Control", "callable_method": "Control::_size_changed"}], "Control"]
## Is is parsed and drawin into nodes, with connections established between signals and their callables
func draw_node_data(data: Array):
# If lock button toggled on, don't draw incoming data
if block_new_inspections: return
# Clear graph to avoid drawing over old data
clear_graph()
logger.clear()
# This line is super important to avoid random rendering errors
# It seems we need to give a small breathing room for the graph edit
# to fully cleanup, otherwise, artifacts from a previously rendered
# graph edit may appear and mess up the new drawing
await get_tree().create_timer(0.1).timeout
# Retrieve the targeted node from the data array, which is always index 0
var target_node_name = data[0]
# Handle root node inspection edge case
if target_node_name == "Root":
warning_text.show()
warning_text.text = "Root node inspection is not supported."
return
else:
warning_text.hide()
# Retrieve the targeted node signal data, which is always index 1
var target_node_signal_data: Array = data[1]
# Create main node from which connections will be created
# and add it to the graph
var target_node: SignalLensGraphNode = create_node(target_node_name, "(Signals)")
graph_edit.add_child(target_node)
var current_signal_index = 0
# Start iterating signal by signal
for signal_data in target_node_signal_data:
# Check signal connections and skip not connected signals (based on settings)
if settings[Options.HIDE_SIGNALS_WITHOUT_CONNECTIONS] and signal_data["callables"].size() == 0: continue
# Check signal connections and skip if signal is built-in (based on settings)
if settings[Options.HIDE_BUILT_IN_SIGNALS]:
var class_signals: Array = []
for class_signal in ClassDB.class_get_signal_list(data[2]):
class_signals.append(class_signal["name"])
if signal_data["signal"] in class_signals:
continue
# Get the color based on the index so we can have the rainbow vibes
var slot_color = get_slot_color(current_signal_index, target_node_signal_data.size())
# Create the slot button with the signal's name
create_button_slot(signal_data["signal"], target_node, Direction.RIGHT, slot_color)
# Start iterating each callable in the signal
var callables_for_current_signal = signal_data["callables"]
for callable_index in range(callables_for_current_signal.size()):
var object_name: String = callables_for_current_signal[callable_index]["object_name"]
var callable_method: String = callables_for_current_signal[callable_index]["method_name"]
# If a node has already been created for the object that owns the callable
# Then we don't create an entirely new node
# Otherwise, we create a new node
if graph_edit.has_node(object_name):
var callable_node = graph_edit.get_node(object_name)
# If callable's object is the same as signal's
# It means that the target node listens to it's own signals
# So we create a new node to avoid confusion and keep everything legible
# for the user
# Otherwise, we just add a new button to an already existing node
if callable_node.name == target_node.name:
var target_callables_node
if !graph_edit.has_node(target_node_name + " (Callables)"):
target_callables_node = create_node(target_node_name + " (Callables)")
graph_edit.add_child(target_callables_node)
target_callables_node.position_offset += Vector2(250, 0)
else:
target_callables_node = graph_edit.get_node(target_node_name + " (Callables)")
create_button_slot(callable_method, target_callables_node, Direction.LEFT, slot_color)
graph_edit.connect_node(target_node.name, current_signal_index, target_callables_node.name, target_callables_node.get_child_count() - 1)
else:
create_button_slot(callable_method, callable_node, Direction.LEFT, slot_color)
graph_edit.connect_node(target_node.name, current_signal_index, callable_node.name, callable_node.get_child_count() - 1)
else:
var callable_node: SignalLensGraphNode = create_node(object_name, "(Callables)")
create_button_slot(callable_method, callable_node, Direction.LEFT, slot_color)
graph_edit.add_child(callable_node)
# We set the offsets here to se can have the descending stair effect in the resulting graph
# TODO: This could be a user setting
callable_node.position_offset += Vector2(callable_node.get_index() * 250, callable_node.get_index() * 50)
graph_edit.connect_node(target_node.name, current_signal_index, callable_node.name, callable_node.get_child_count() - 1)
# Finally, we add to the current iterator and move on to the next signal
current_signal_index += 1
# Manage button states
# This is important to make sure that if a valid graph is rendered
# in case the buttons are disabled, they are enabled again
if clear_button.disabled:
clear_button.disabled = false
if pin_checkbox.disabled:
pin_checkbox.disabled = false
if keep_emissions_checkbox.disabled:
keep_emissions_checkbox.disabled = false
if emission_speed_slider.editable:
emission_speed_slider.editable = true
emission_speed_icon.disabled = false
func create_node(node_name: String, title_appendix: String = "") -> SignalLensGraphNode:
var new_node = SignalLensGraphNode.new()
new_node.name = node_name
new_node.title = node_name + " " + title_appendix
return new_node
func create_button_slot(button_text: String, parent_node: GraphNode, slot_direction: Direction, slot_color: Color):
var signal_button: Button = Button.new()
signal_button.flat = true
signal_button.name = button_text
signal_button.text = button_text
parent_node.add_child(signal_button)
signal_button.pressed.connect(_on_signal_button_pressed.bind(parent_node, signal_button.get_index()))
signal_button.focus_exited.connect(clean_connection_activity)
parent_node.set_slot(signal_button.get_index(), slot_direction == Direction.LEFT, 0, slot_color, slot_direction == Direction.RIGHT, 0, slot_color)
func get_slot_color(slot_index, signal_amount) -> Color:
var hue = float(slot_index) / float(signal_amount)
return Color.from_hsv(hue, 1.0, 0.5, connection_opacity)
func clean_connection_activity():
for connection in graph_edit.get_connection_list():
graph_edit.set_connection_activity(connection["from_node"], connection["from_port"], connection["to_node"], connection["to_port"], 0)
#endregion
#region Signal Emission Rendering
func draw_signal_emission(data: Array):
logger.create_log(data[0]["datetime"], data[0]["timestamp"], data[0]["node_name"], data[0]["signal_name"], data[0]["signal_arguments"], data[0]["physics_frames"], data[0]["process_frames"])
# Avoid trying to draw signal emission if graph not fully drawn yet
if graph_edit.get_child_count() <= 1: return
var target_node: GraphNode = graph_edit.get_child(1)
var port_index = get_port_index_from_signal_name(data[0]["signal_name"])
if port_index == -1: return
for connection in graph_edit.get_connection_list():
if connection["from_node"] == target_node.name && connection["from_port"] == port_index:
pulse_connection(connection)
func pulse_connection(connection: Dictionary) -> void:
if connection not in pulsing_connections: pulsing_connections.append(connection)
var from_node = connection["from_node"]
var from_port = connection["from_port"]
var to_node = connection["to_node"]
var to_port = connection["to_port"]
if keep_emissions:
graph_edit.set_connection_activity(from_node, from_port, to_node, to_port, 1.0)
else:
fade_out_connection(connection)
func fade_out_connection(connection: Dictionary):
var tween := create_tween()
var fade_out_duration = DEFAULT_EMISSION_DURATION * emission_speed_multiplier
var from_node = connection["from_node"]
var from_port = connection["from_port"]
var to_node = connection["to_node"]
var to_port = connection["to_port"]
tween.tween_method(
func(value): graph_edit.set_connection_activity(from_node, from_port, to_node, to_port, value), 1.0, 0.0, fade_out_duration
).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN)
tween.tween_callback(func(): pulsing_connections.erase(connection))
func get_port_index_from_signal_name(signal_name: String):
var target_node = graph_edit.get_child(1)
for child in target_node.get_children():
if child.name == signal_name:
return child.get_index()
return -1
func keep_signal_emissions():
keep_emissions = true
func dont_keep_signal_emissions():
for connection in pulsing_connections:
fade_out_connection(connection)
keep_emissions = false
#endregion
#region Panel Resizing
# Reference to the Split Container that holds the bottom panel in the editor
var _editor_dock
# split_offset value of editor dock, works as a size for the panel
# Important: the value is negative because of split_offset's implementation
var _original_panel_size: float
## Grabs a reference to the parent split container of the debugger
func _get_parent_editor_split():
var base = EditorInterface.get_base_control()
var waiting := base.get_children()
while not waiting.is_empty():
var node := waiting.pop_back() as Node
if node.name.find("DockVSplitCenter") >= 0:
_editor_dock = node
_original_panel_size = _editor_dock.split_offset
if visible:
_resize_panel(-ProjectSettings.get_setting("addons/Signal Lens/height_to_resize_to"))
else:
_resize_panel(0)
else:
waiting.append_array(node.get_children())
## Resizes panel to new_size if possible
func _resize_panel(new_size: float):
if _can_resize_panel():
_editor_dock.split_offset = new_size
func _can_resize_panel() -> bool:
# If user wants to resize panel on open
if not ProjectSettings.get_setting("addons/Signal Lens/resize_panel_on_open"): return false
# If editor dock reference has been acquired
if not _editor_dock: return false
return true
func _on_visibility_changed() -> void:
# Only resize bottom panel if both visible and visible in editor
if visible and is_visible_in_tree():
_resize_panel(-ProjectSettings.get_setting("addons/Signal Lens/height_to_resize_to"))
else:
_resize_panel(_original_panel_size)
func _open_project_settings():
var base = EditorInterface.get_base_control()
# Find the Project Settings Editor
var settings = base.find_child('*ProjectSettingsEditor*', true, false)
if not settings:
print('ProjectSettingsEditor not found (?)')
return
# Grab the tab container from the sectioned editor
var tab_container = settings.find_child('*TabContainer*', true, false)
if not tab_container is TabContainer:
print('Could not find the tab container')
return
# Set the current tab to General
tab_container.current_tab = 0
# Find the Sectioned Editor inside it
var sectioned_inspector = tab_container.find_child('*SectionedInspector*', true, false)
if not sectioned_inspector:
print('SectionedInspector not found (?)')
return
# Find the Tree inside it
var tree = sectioned_inspector.find_child("Tree", true, false) as Tree
if not tree:
print('Could not find Tree')
return
# Find the entry in the tree
var found_item = null
var item = tree.get_root()
while item:
item = item.get_next_visible()
if not item:
print('--finished')
break
if item.get_text(0) == "Signal Lens":
found_item = item
break
# Select the found item
if found_item:
tree.set_selected(found_item, 0)
tree.ensure_cursor_is_visible()
# Finally popup the Project Settings Editor
settings.popup()
#endregion
#region Signal Callbacks
func _on_refresh_button_pressed() -> void:
if current_node.is_empty(): return
request_node_data()
func _on_signal_button_pressed(graph_node: GraphNode, internal_index: int):
graph_edit.set_selected(null)
clean_connection_activity()
for connection in graph_edit.get_connection_list():
if (connection["from_node"] == graph_node.name && connection["from_port"] == internal_index) or (connection["to_node"] == graph_node.name && connection["to_port"] == internal_index):
graph_edit.set_connection_activity(connection["from_node"], connection["from_port"], connection["to_node"], connection["to_port"], 0.75)
func _on_graph_edit_node_selected(node: Node) -> void:
var graph_node = node as GraphNode
for connection in graph_edit.get_connection_list():
if connection["to_node"] == graph_node.name:
graph_edit.set_connection_activity(connection["from_node"], connection["from_port"], connection["to_node"], connection["to_port"], 0.75)
func _on_graph_edit_node_deselected(node: Node) -> void:
var graph_node = node as GraphNode
for connection in graph_edit.get_connection_list():
if connection["to_node"] == graph_node.name:
graph_edit.set_connection_activity(connection["from_node"], connection["from_port"], connection["to_node"], connection["to_port"], 0)
func _on_clear_button_pressed() -> void:
clear_graph()
func _on_repo_button_pressed() -> void:
OS.shell_open("https://github.com/yannlemos/signal-lens")
func _on_pin_checkbox_toggled(toggled_on: bool) -> void:
block_new_inspections = toggled_on
func _on_emission_speed_slider_value_changed(value: float) -> void:
emission_speed_multiplier = value
func _on_keep_emissions_checkbox_toggled(toggled_on: bool) -> void:
if toggled_on:
keep_signal_emissions()
else:
dont_keep_signal_emissions()
func _on_logger_button_toggled(toggled_on: bool) -> void:
logger.visible = toggled_on
func _on_options_index_pressed(option_index: int) -> void:
if options_popup.is_item_checkable(option_index):
settings[option_index] = not options_popup.is_item_checked(option_index) # Change state
options_popup.set_item_checked(option_index, settings[option_index]) # Apply state
if option_index in [Options.HIDE_SIGNALS_WITHOUT_CONNECTIONS, Options.HIDE_BUILT_IN_SIGNALS]:
refresh_button.pressed.emit()
elif option_index == Options.SHOW_GRAPH_TOOLBAR:
graph_edit.get_menu_hbox().visible = settings[option_index]
elif option_index == Options.SHOW_GRAPH_MINIMAP:
graph_edit.minimap_enabled = settings[option_index]
else:
_open_project_settings()
func _on_connection_opacity_slider_value_changed(value: float) -> void:
connection_opacity = value
if graph_edit.get_child_count() <= 1: return
var target_node: GraphNode = graph_edit.get_child(1)
for slot_index in target_node.get_child_count():
target_node.set_slot_color_right(slot_index, Color(target_node.get_slot_color_right(slot_index), connection_opacity))
#endregion

View file

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

View file

@ -1,357 +0,0 @@
[gd_scene load_steps=21 format=3 uid="uid://f4ie0ytcicf0"]
[ext_resource type="Script" uid="uid://dwepw5abso8f1" path="res://addons/signal_lens/editor/signal_lens_editor_panel.gd" id="1_abwge"]
[ext_resource type="PackedScene" uid="uid://bps1tpcpa1fj2" path="res://addons/signal_lens/editor/signal_lens_logger.tscn" id="3_v6bl3"]
[sub_resource type="Image" id="Image_fhx01"]
data = {
"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 226, 226, 69, 224, 224, 224, 222, 224, 224, 224, 221, 224, 224, 224, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 68, 224, 224, 224, 220, 224, 224, 224, 220, 227, 227, 227, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 226, 226, 69, 224, 224, 224, 222, 224, 224, 224, 221, 224, 224, 224, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 68, 224, 224, 224, 220, 224, 224, 224, 220, 224, 224, 224, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 226, 226, 69, 224, 224, 224, 222, 224, 224, 224, 220, 224, 224, 224, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 68, 224, 224, 224, 220, 224, 224, 224, 220, 224, 224, 224, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
"format": "RGBA8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id="ImageTexture_v6bl3"]
image = SubResource("Image_fhx01")
[sub_resource type="Image" id="Image_qib1m"]
data = {
"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
"format": "RGBA8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id="ImageTexture_kqale"]
image = SubResource("Image_qib1m")
[sub_resource type="Image" id="Image_4h13t"]
data = {
"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 224, 224, 224, 105, 224, 224, 224, 192, 224, 224, 224, 244, 224, 224, 224, 238, 224, 224, 224, 197, 224, 224, 224, 105, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 232, 232, 23, 224, 224, 224, 207, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 198, 226, 226, 226, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 224, 224, 224, 205, 224, 224, 224, 255, 224, 224, 224, 218, 224, 224, 224, 83, 237, 237, 237, 14, 237, 237, 237, 14, 224, 224, 224, 82, 224, 224, 224, 220, 224, 224, 224, 255, 224, 224, 224, 197, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 102, 224, 224, 224, 255, 224, 224, 224, 218, 227, 227, 227, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 221, 224, 224, 224, 255, 224, 224, 224, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 198, 224, 224, 224, 255, 224, 224, 224, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 226, 226, 86, 224, 224, 224, 255, 224, 224, 224, 194, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 4, 224, 224, 224, 238, 224, 224, 224, 255, 227, 227, 227, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 229, 229, 19, 224, 224, 224, 255, 224, 224, 224, 233, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 160, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 20, 224, 224, 224, 255, 224, 224, 224, 237, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 10, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 212, 230, 230, 230, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 90, 224, 224, 224, 255, 224, 224, 224, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 42, 224, 224, 224, 245, 224, 224, 224, 245, 224, 224, 224, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 232, 232, 22, 224, 224, 224, 224, 224, 224, 224, 255, 224, 224, 224, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 96, 226, 226, 226, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 20, 224, 224, 224, 88, 224, 224, 224, 221, 224, 224, 224, 255, 224, 224, 224, 199, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 200, 227, 227, 227, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 236, 224, 224, 224, 195, 224, 224, 224, 96, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
"format": "RGBA8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id="ImageTexture_vbdfx"]
image = SubResource("Image_4h13t")
[sub_resource type="Image" id="Image_5voln"]
data = {
"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 184, 224, 224, 224, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 75, 224, 224, 224, 228, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 227, 224, 224, 224, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 228, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 243, 224, 224, 224, 217, 224, 224, 224, 191, 224, 224, 224, 166, 224, 224, 224, 140, 224, 224, 224, 114, 224, 224, 224, 89, 227, 227, 227, 63, 229, 229, 229, 38, 234, 234, 234, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
"format": "RGBA8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id="ImageTexture_4kas2"]
image = SubResource("Image_5voln")
[sub_resource type="Image" id="Image_dyx7v"]
data = {
"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 127, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 85, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 231, 231, 21, 224, 224, 224, 234, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 234, 231, 231, 231, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 171, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 192, 224, 224, 224, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 64, 227, 227, 227, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
"format": "RGBA8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id="ImageTexture_c4iiw"]
image = SubResource("Image_dyx7v")
[sub_resource type="Image" id="Image_5afs0"]
data = {
"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 75, 224, 224, 224, 228, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 227, 224, 224, 224, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 228, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 75, 224, 224, 224, 228, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 227, 224, 224, 224, 73, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 228, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 226, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 226, 226, 226, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 96, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 245, 224, 224, 224, 42, 0, 0, 0, 0, 0, 0, 0, 0, 226, 226, 226, 43, 224, 224, 224, 245, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 213, 230, 230, 230, 10, 230, 230, 230, 10, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 159, 224, 224, 224, 160, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 227, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 226, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 73, 224, 224, 224, 226, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 226, 227, 227, 227, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
"format": "RGBA8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id="ImageTexture_j6ipi"]
image = SubResource("Image_5afs0")
[sub_resource type="Image" id="Image_jffwt"]
data = {
"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 184, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 237, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 163, 224, 224, 224, 255, 224, 224, 224, 218, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 8, 224, 224, 224, 220, 224, 224, 224, 255, 224, 224, 224, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 228, 228, 28, 224, 224, 224, 235, 224, 224, 224, 255, 224, 224, 224, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 143, 224, 224, 224, 255, 224, 224, 224, 233, 227, 227, 227, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 226, 226, 69, 224, 224, 224, 253, 224, 224, 224, 255, 224, 224, 224, 105, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 110, 224, 224, 224, 255, 224, 224, 224, 252, 224, 224, 224, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 119, 224, 224, 224, 255, 224, 224, 224, 250, 224, 224, 224, 49, 226, 226, 226, 52, 224, 224, 224, 251, 224, 224, 224, 255, 224, 224, 224, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 169, 224, 224, 224, 255, 224, 224, 224, 207, 224, 224, 224, 211, 224, 224, 224, 255, 224, 224, 224, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 170, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 122, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 227, 227, 227, 71, 224, 224, 224, 253, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 252, 224, 224, 224, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 229, 229, 29, 224, 224, 224, 236, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 234, 227, 227, 227, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 164, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 237, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 181, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
"format": "RGBA8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id="ImageTexture_tvsga"]
image = SubResource("Image_jffwt")
[sub_resource type="Image" id="Image_wqlh8"]
data = {
"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 224, 224, 224, 96, 224, 224, 224, 188, 224, 224, 224, 233, 224, 224, 224, 233, 224, 224, 224, 188, 224, 224, 224, 97, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 40, 224, 224, 224, 211, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 213, 224, 224, 224, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 228, 228, 37, 224, 224, 224, 230, 224, 224, 224, 255, 224, 224, 224, 218, 224, 224, 224, 82, 224, 224, 224, 16, 224, 224, 224, 16, 224, 224, 224, 83, 224, 224, 224, 219, 224, 224, 224, 255, 224, 224, 224, 231, 229, 229, 229, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 4, 224, 224, 224, 219, 224, 224, 224, 255, 224, 224, 224, 218, 224, 224, 224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 17, 224, 224, 224, 219, 224, 224, 224, 255, 224, 224, 224, 221, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 97, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 82, 0, 0, 0, 0, 226, 226, 226, 69, 224, 224, 224, 222, 224, 224, 224, 221, 224, 224, 224, 68, 0, 0, 0, 0, 224, 224, 224, 85, 224, 224, 224, 255, 224, 224, 224, 255, 226, 226, 226, 94, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 217, 224, 224, 224, 255, 224, 224, 224, 255, 236, 236, 236, 13, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 219, 0, 0, 0, 0, 227, 227, 227, 18, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 212, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 214, 224, 224, 224, 255, 224, 224, 224, 255, 237, 237, 237, 14, 0, 0, 0, 0, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 217, 0, 0, 0, 0, 230, 230, 230, 20, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 97, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 82, 0, 0, 0, 0, 224, 224, 224, 68, 224, 224, 224, 220, 224, 224, 224, 220, 224, 224, 224, 65, 0, 0, 0, 0, 224, 224, 224, 88, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 93, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 224, 224, 224, 223, 224, 224, 224, 255, 224, 224, 224, 219, 224, 224, 224, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 229, 229, 19, 224, 224, 224, 223, 224, 224, 224, 255, 224, 224, 224, 221, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 42, 224, 224, 224, 234, 224, 224, 224, 255, 224, 224, 224, 219, 224, 224, 224, 84, 224, 224, 224, 17, 227, 227, 227, 18, 226, 226, 226, 87, 224, 224, 224, 223, 224, 224, 224, 255, 224, 224, 224, 233, 224, 224, 224, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 227, 227, 227, 45, 224, 224, 224, 217, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 217, 226, 226, 226, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 224, 224, 224, 99, 224, 224, 224, 189, 224, 224, 224, 233, 224, 224, 224, 233, 224, 224, 224, 189, 224, 224, 224, 98, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
"format": "RGBA8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id="ImageTexture_vayht"]
image = SubResource("Image_wqlh8")
[sub_resource type="Image" id="Image_ioqw6"]
data = {
"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 224, 224, 224, 138, 224, 224, 224, 231, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 176, 0, 0, 0, 0, 224, 224, 224, 129, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 138, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 172, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 129, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 231, 224, 224, 224, 255, 224, 224, 224, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 192, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 128, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 128, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 193, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 128, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 128, 0, 0, 0, 0, 224, 224, 224, 129, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 128, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 129, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 128, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 129, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 194, 224, 224, 224, 193, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 129, 224, 224, 224, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 232, 224, 224, 224, 255, 224, 224, 224, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 76, 224, 224, 224, 255, 224, 224, 224, 230, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 137, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 132, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 224, 224, 224, 135, 224, 224, 224, 230, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 230, 224, 224, 224, 132, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
"format": "RGBA8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id="ImageTexture_0xhoi"]
image = SubResource("Image_ioqw6")
[node name="Signal Lens" type="Control" node_paths=PackedStringArray("graph_edit", "logger_button", "node_path_line_edit", "refresh_button", "options_button", "clear_button", "inactive_text", "warning_text", "pin_checkbox", "keep_emissions_checkbox", "emission_speed_slider", "emission_speed_icon", "connection_opacity_icon", "logger")]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("1_abwge")
graph_edit = NodePath("EditorPanel/GraphEdit")
logger_button = NodePath("EditorPanel/MainButtonsContainer/HBoxContainer2/LoggerButton")
node_path_line_edit = NodePath("EditorPanel/MainButtonsContainer/HBoxContainer2/LineEdit")
refresh_button = NodePath("EditorPanel/MainButtonsContainer/HBoxContainer2/RefreshButton")
options_button = NodePath("EditorPanel/MainButtonsContainer/HBoxContainer2/OptionsButton")
clear_button = NodePath("EditorPanel/MainButtonsContainer/HBoxContainer2/ClearButton")
inactive_text = NodePath("EditorPanel/InactiveTextContainer/InactiveText")
warning_text = NodePath("EditorPanel/WarningTextContainer/WarningText")
pin_checkbox = NodePath("EditorPanel/MainButtonsContainer/HBoxContainer2/PinCheckbox")
keep_emissions_checkbox = NodePath("EditorPanel/MainButtonsContainer/HBoxContainer2/KeepEmissionsCheckbox")
emission_speed_slider = NodePath("EditorPanel/MainButtonsContainer/HBoxContainer2/EmissionSpeedContainer/EmissionSpeedSlider")
emission_speed_icon = NodePath("EditorPanel/MainButtonsContainer/HBoxContainer2/EmissionSpeedContainer/EmissionSpeedIcon")
connection_opacity_icon = NodePath("EditorPanel/MainButtonsContainer/HBoxContainer2/ConnectionOpacityContainer/ConnectionOpacityIcon")
logger = NodePath("EditorPanel/Logger")
[node name="EditorPanel" type="PanelContainer" parent="."]
self_modulate = Color(1, 1, 1, 0)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="GraphEdit" type="GraphEdit" parent="EditorPanel"]
layout_mode = 2
grid_pattern = 1
connection_lines_thickness = 3.0
zoom = 0.8
minimap_enabled = false
minimap_size = Vector2(120, 80)
show_menu = false
show_zoom_label = true
show_grid_buttons = false
show_minimap_button = false
[node name="MainButtonsContainer" type="MarginContainer" parent="EditorPanel"]
layout_mode = 2
size_flags_vertical = 0
theme_override_constants/margin_left = 5
theme_override_constants/margin_top = 10
theme_override_constants/margin_right = 5
theme_override_constants/margin_bottom = 5
[node name="HBoxContainer2" type="HBoxContainer" parent="EditorPanel/MainButtonsContainer"]
layout_mode = 2
size_flags_vertical = 0
mouse_filter = 2
theme_override_constants/separation = 10
[node name="OptionsButton" type="MenuButton" parent="EditorPanel/MainButtonsContainer/HBoxContainer2"]
custom_minimum_size = Vector2(0, 28)
layout_mode = 2
size_flags_horizontal = 8
size_flags_vertical = 0
tooltip_text = "Options Button
See and change options."
icon = SubResource("ImageTexture_v6bl3")
icon_alignment = 1
item_count = 5
popup/item_0/text = "Hide signals without connections"
popup/item_0/checkable = 1
popup/item_0/checked = true
popup/item_0/id = 0
popup/item_1/text = "Hide built-in signals"
popup/item_1/checkable = 1
popup/item_1/id = 1
popup/item_2/text = "Show graph toolbar"
popup/item_2/checkable = 1
popup/item_2/id = 2
popup/item_3/text = "Show graph minimap"
popup/item_3/checkable = 1
popup/item_3/id = 3
popup/item_4/text = "More options..."
popup/item_4/id = 4
[node name="LoggerButton" type="Button" parent="EditorPanel/MainButtonsContainer/HBoxContainer2"]
layout_mode = 2
size_flags_vertical = 0
tooltip_text = "Log Button
Open Signal Log."
toggle_mode = true
icon = SubResource("ImageTexture_kqale")
[node name="RefreshButton" type="Button" parent="EditorPanel/MainButtonsContainer/HBoxContainer2"]
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 0
tooltip_text = "Refresh Button
Redraw the graph."
disabled = true
icon = SubResource("ImageTexture_vbdfx")
[node name="ClearButton" type="Button" parent="EditorPanel/MainButtonsContainer/HBoxContainer2"]
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 0
tooltip_text = "Clear Button
Clear the graph."
disabled = true
icon = SubResource("ImageTexture_4kas2")
[node name="PinCheckbox" type="CheckButton" parent="EditorPanel/MainButtonsContainer/HBoxContainer2"]
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 0
tooltip_text = "Pin This Node
If toggled on, ignores any new selections made in the remote scene."
disabled = true
icon = SubResource("ImageTexture_c4iiw")
[node name="LineEdit" type="LineEdit" parent="EditorPanel/MainButtonsContainer/HBoxContainer2"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 0
theme_override_font_sizes/font_size = 14
placeholder_text = "/root"
editable = false
select_all_on_focus = true
[node name="KeepEmissionsCheckbox" type="CheckButton" parent="EditorPanel/MainButtonsContainer/HBoxContainer2"]
layout_mode = 2
size_flags_vertical = 0
tooltip_text = "Keep emissions
If toggled on, keeps any received signal emissions drawn in the graph.
When toggled off, drawn signal emissions will fade out."
icon = SubResource("ImageTexture_j6ipi")
[node name="EmissionSpeedContainer" type="HBoxContainer" parent="EditorPanel/MainButtonsContainer/HBoxContainer2"]
layout_mode = 2
size_flags_vertical = 0
tooltip_text = "Emission Duration
Controls the speed of the fade out of signal emissions.
Left means means quick, right means slow."
theme_override_constants/separation = 4
[node name="EmissionSpeedIcon" type="Button" parent="EditorPanel/MainButtonsContainer/HBoxContainer2/EmissionSpeedContainer"]
layout_mode = 2
mouse_filter = 2
icon = SubResource("ImageTexture_tvsga")
flat = true
[node name="EmissionSpeedSlider" type="HSlider" parent="EditorPanel/MainButtonsContainer/HBoxContainer2/EmissionSpeedContainer"]
custom_minimum_size = Vector2(40, 0)
layout_mode = 2
size_flags_vertical = 1
min_value = 0.3
max_value = 6.0
step = 0.1
value = 1.0
[node name="ConnectionOpacityContainer" type="HBoxContainer" parent="EditorPanel/MainButtonsContainer/HBoxContainer2"]
layout_mode = 2
size_flags_vertical = 0
tooltip_text = "Connection Opacity
Controls how transparent the connections betweent the nodes are.
Left means more transparent, right means more opaque."
theme_override_constants/separation = 4
[node name="ConnectionOpacityIcon" type="Button" parent="EditorPanel/MainButtonsContainer/HBoxContainer2/ConnectionOpacityContainer"]
layout_mode = 2
mouse_filter = 2
icon = SubResource("ImageTexture_vayht")
flat = true
[node name="ConnectionOpacitySlider" type="HSlider" parent="EditorPanel/MainButtonsContainer/HBoxContainer2/ConnectionOpacityContainer"]
custom_minimum_size = Vector2(40, 0)
layout_mode = 2
size_flags_vertical = 1
min_value = 0.1
max_value = 1.0
step = 0.01
value = 0.3
[node name="RepoButton" type="Button" parent="EditorPanel/MainButtonsContainer/HBoxContainer2"]
modulate = Color(1, 0.372549, 0.372549, 1)
layout_mode = 2
size_flags_horizontal = 0
size_flags_vertical = 0
tooltip_text = "Signal Lens on Github
Access the plugin's repository on Github to report issues, suggest features and contribute to the project."
icon = SubResource("ImageTexture_0xhoi")
flat = true
[node name="Logger" parent="EditorPanel" instance=ExtResource("3_v6bl3")]
visible = false
layout_mode = 2
theme_override_constants/margin_top = 55
theme_override_constants/margin_bottom = 55
[node name="InactiveTextContainer" type="PanelContainer" parent="EditorPanel"]
custom_minimum_size = Vector2(300, 50)
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
mouse_filter = 2
[node name="InactiveText" type="Label" parent="EditorPanel/InactiveTextContainer"]
layout_mode = 2
size_flags_horizontal = 4
text = "Play project to start debugging"
horizontal_alignment = 1
vertical_alignment = 1
[node name="WarningTextContainer" type="PanelContainer" parent="EditorPanel"]
custom_minimum_size = Vector2(300, 50)
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
mouse_filter = 2
[node name="WarningText" type="Label" parent="EditorPanel/WarningTextContainer"]
visible = false
modulate = Color(0.996567, 0.82419, 0.525376, 1)
layout_mode = 2
size_flags_horizontal = 4
horizontal_alignment = 1
vertical_alignment = 1
[node name="PanelContainer" type="PanelContainer" parent="EditorPanel"]
layout_mode = 2
size_flags_vertical = 8
[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"]
[connection signal="node_deselected" from="EditorPanel/GraphEdit" to="." method="_on_graph_edit_node_deselected"]
[connection signal="node_selected" from="EditorPanel/GraphEdit" to="." method="_on_graph_edit_node_selected"]
[connection signal="toggled" from="EditorPanel/MainButtonsContainer/HBoxContainer2/LoggerButton" to="." method="_on_logger_button_toggled"]
[connection signal="pressed" from="EditorPanel/MainButtonsContainer/HBoxContainer2/RefreshButton" to="." method="_on_refresh_button_pressed"]
[connection signal="pressed" from="EditorPanel/MainButtonsContainer/HBoxContainer2/ClearButton" to="." method="_on_clear_button_pressed"]
[connection signal="toggled" from="EditorPanel/MainButtonsContainer/HBoxContainer2/PinCheckbox" to="." method="_on_pin_checkbox_toggled"]
[connection signal="toggled" from="EditorPanel/MainButtonsContainer/HBoxContainer2/KeepEmissionsCheckbox" to="." method="_on_keep_emissions_checkbox_toggled"]
[connection signal="value_changed" from="EditorPanel/MainButtonsContainer/HBoxContainer2/EmissionSpeedContainer/EmissionSpeedSlider" to="." method="_on_emission_speed_slider_value_changed"]
[connection signal="value_changed" from="EditorPanel/MainButtonsContainer/HBoxContainer2/ConnectionOpacityContainer/ConnectionOpacitySlider" to="." method="_on_connection_opacity_slider_value_changed"]
[connection signal="pressed" from="EditorPanel/MainButtonsContainer/HBoxContainer2/RepoButton" to="." method="_on_repo_button_pressed"]

View file

@ -1,9 +0,0 @@
## Base class for all graph nodes instantiated
## in the debugger panel
class_name SignalLensGraphNode
extends GraphNode
# TODO: This node should absorb a lot of the implemenation contained in signal_lens_editor
# Things like instantiating the buttons, and setting up the node
# This would be a next step to make the code in signal_lens_editor.gd
# much more readable and easily testable

View file

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

View file

@ -1,12 +0,0 @@
[gd_scene load_steps=2 format=3 uid="uid://cicwkklbx7x1m"]
[ext_resource type="Script" uid="uid://dibsrsyq5uw81" path="res://addons/signal_lens/editor/signal_lens_graph_node.gd" id="1_p48ar"]
[node name="SignalLensGraphNode" type="GraphNode"]
offset_left = 358.0
offset_top = 170.5
offset_right = 383.0
offset_bottom = 232.5
mouse_filter = 1
position_offset = Vector2(358, 170.5)
script = ExtResource("1_p48ar")

View file

@ -1,222 +0,0 @@
[gd_scene load_steps=13 format=3 uid="uid://bps1tpcpa1fj2"]
[ext_resource type="Script" uid="uid://dpn0ev0370mga" path="res://addons/signal_lens/editor/logger/logger.gd" id="1_16bi3"]
[sub_resource type="StyleBoxLine" id="StyleBoxLine_16bi3"]
content_margin_left = 2.0
content_margin_top = 4.0
content_margin_right = 0.0
content_margin_bottom = 4.0
color = Color(0.499956, 0.499956, 0.499956, 0.479)
thickness = 2
vertical = true
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_v6bl3"]
bg_color = Color(0.0605303, 0.0605303, 0.0605303, 0.878431)
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
border_color = Color(0.0392157, 0.0392157, 0.0392157, 1)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
[sub_resource type="LabelSettings" id="LabelSettings_v6bl3"]
font_size = 12
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_16bi3"]
content_margin_left = 0.0
content_margin_top = 0.0
content_margin_right = 0.0
content_margin_bottom = 0.0
bg_color = Color(0.262933, 0.262932, 0.262932, 0.6)
corner_radius_top_left = 30
corner_radius_top_right = 30
corner_radius_bottom_right = 30
corner_radius_bottom_left = 30
corner_detail = 5
[sub_resource type="LabelSettings" id="LabelSettings_tqw23"]
font_size = 8
[sub_resource type="LabelSettings" id="LabelSettings_16bi3"]
font_size = 10
[sub_resource type="Image" id="Image_16bi3"]
data = {
"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 184, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 184, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 181, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 181, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 181, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
"format": "RGBA8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id="ImageTexture_tqw23"]
image = SubResource("Image_16bi3")
[sub_resource type="Image" id="Image_5voln"]
data = {
"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 184, 224, 224, 224, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 75, 224, 224, 224, 228, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 227, 224, 224, 224, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 228, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 243, 224, 224, 224, 217, 224, 224, 224, 191, 224, 224, 224, 166, 224, 224, 224, 140, 224, 224, 224, 114, 224, 224, 224, 89, 227, 227, 227, 63, 229, 229, 229, 38, 234, 234, 234, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
"format": "RGBA8",
"height": 16,
"mipmaps": false,
"width": 16
}
[sub_resource type="ImageTexture" id="ImageTexture_4kas2"]
image = SubResource("Image_5voln")
[sub_resource type="StyleBoxLine" id="StyleBoxLine_v6bl3"]
color = Color(0.244776, 0.244776, 0.244776, 1)
[node name="Logger" type="MarginContainer" node_paths=PackedStringArray("log_container", "copy_button", "clear_button", "v_split_container", "h_split_container", "log_scroll", "counter_label")]
custom_minimum_size = Vector2(400, 0)
anchors_preset = 9
anchor_bottom = 1.0
offset_right = 277.0
grow_vertical = 2
size_flags_horizontal = 0
mouse_filter = 2
theme_override_constants/margin_left = 5
theme_override_constants/margin_top = 30
theme_override_constants/margin_bottom = 30
script = ExtResource("1_16bi3")
log_container = NodePath("VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/ScrollContainer/LogContainer")
copy_button = NodePath("VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/CopyButton")
clear_button = NodePath("VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/ClearButton")
v_split_container = NodePath("VSplitContainer")
h_split_container = NodePath("VSplitContainer/HSplitContainer")
log_scroll = NodePath("VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/ScrollContainer")
counter_label = NodePath("VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/CounterLabel")
[node name="Control" type="Control" parent="."]
layout_mode = 2
mouse_filter = 2
[node name="VSeparator" type="VSeparator" parent="Control"]
layout_mode = 0
offset_left = 50.0
offset_top = -16.0
offset_right = 54.0
offset_bottom = 4.0
mouse_filter = 2
theme_override_styles/separator = SubResource("StyleBoxLine_16bi3")
[node name="VSplitContainer" type="VSplitContainer" parent="."]
layout_mode = 2
mouse_filter = 2
drag_area_margin_end = 130
[node name="HSplitContainer" type="HSplitContainer" parent="VSplitContainer"]
layout_mode = 2
size_flags_vertical = 3
mouse_filter = 2
split_offset = -130
[node name="Panel" type="MarginContainer" parent="VSplitContainer/HSplitContainer"]
custom_minimum_size = Vector2(260, 80)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_constants/margin_left = 10
theme_override_constants/margin_top = 5
theme_override_constants/margin_right = 5
theme_override_constants/margin_bottom = 5
[node name="PanelContainer" type="PanelContainer" parent="VSplitContainer/HSplitContainer/Panel"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_v6bl3")
[node name="MarginContainer" type="MarginContainer" parent="VSplitContainer/HSplitContainer/Panel/PanelContainer"]
layout_mode = 2
theme_override_constants/margin_left = 10
theme_override_constants/margin_top = 10
theme_override_constants/margin_right = 10
theme_override_constants/margin_bottom = 10
[node name="VBoxContainer" type="VBoxContainer" parent="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer"]
layout_mode = 2
[node name="HBoxContainer" type="HBoxContainer" parent="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="TitleLabel" type="Label" parent="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 0
text = "Signal Log"
label_settings = SubResource("LabelSettings_v6bl3")
[node name="PanelContainer" type="PanelContainer" parent="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"]
custom_minimum_size = Vector2(10, 9)
layout_mode = 2
size_flags_vertical = 4
tooltip_text = "A log will be recorded based on every signal emitted by the currently selected node in the Scene Tree.
The log consists of:
- Datetime: Human-friendly date and time at the time of emission, e.g. 2025-07-08T10:27:33
- Timestamp: Amount of milliseconds passed since the project started running, e.g. 00:00:05:646
- Process: Current _process frame at the time of emission, e.g. 255 (look for _get_process_frame() in the godot documentation for more info)
- Physics: Current _physics_process frame at the time of emission, e.g. 567 (look for _get_physics_frame() in the godot documentation for more info)
- Node Name: The node that is emitting the signal.
- Signal Name: The signal being emitted."
theme_override_styles/panel = SubResource("StyleBoxFlat_16bi3")
[node name="Button" type="Label" parent="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer"]
layout_mode = 2
text = "?"
label_settings = SubResource("LabelSettings_tqw23")
horizontal_alignment = 1
vertical_alignment = 1
[node name="CounterLabel" type="Label" parent="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"]
modulate = Color(0.501407, 0.501406, 0.501406, 1)
layout_mode = 2
size_flags_horizontal = 3
label_settings = SubResource("LabelSettings_16bi3")
horizontal_alignment = 2
[node name="CopyButton" type="Button" parent="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
tooltip_text = "Copy All
Copies all the logs to the clipboard."
icon = SubResource("ImageTexture_tqw23")
flat = true
[node name="ClearButton" type="Button" parent="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
tooltip_text = "Clear
Clears all the logs."
icon = SubResource("ImageTexture_4kas2")
flat = true
[node name="HSeparator" type="HSeparator" parent="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
theme_override_styles/separator = SubResource("StyleBoxLine_v6bl3")
[node name="ScrollContainer" type="ScrollContainer" parent="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="LogContainer" type="VBoxContainer" parent="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_constants/separation = 13
[node name="Control" type="Control" parent="VSplitContainer/HSplitContainer"]
layout_mode = 2
mouse_filter = 2
[node name="Control" type="Control" parent="VSplitContainer"]
layout_mode = 2
mouse_filter = 2
[connection signal="dragged" from="VSplitContainer/HSplitContainer" to="." method="_on_h_split_container_dragged"]
[connection signal="pressed" from="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/CopyButton" to="." method="_on_copy_button_pressed"]
[connection signal="pressed" from="VSplitContainer/HSplitContainer/Panel/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/ClearButton" to="." method="_on_clear_button_pressed"]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

View file

@ -1,35 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://brdnqivcfnsun"
path.bptc="res://.godot/imported/icon_logo.png-5b28148684ce391f1d573fc1b0f67ff7.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://addons/signal_lens/icons/icon_logo.png"
dest_files=["res://.godot/imported/icon_logo.png-5b28148684ce391f1d573fc1b0f67ff7.bptc.ctex"]
[params]
compress/mode=2
compress/high_quality=true
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=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

View file

@ -1,35 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dgayeoxpknqkv"
path.bptc="res://.godot/imported/icon_monogram.png-7d0e77813dbd8089a5f529fe0e619493.bptc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://addons/signal_lens/icons/icon_monogram.png"
dest_files=["res://.godot/imported/icon_monogram.png-7d0e77813dbd8089a5f529fe0e619493.bptc.ctex"]
[params]
compress/mode=2
compress/high_quality=true
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=1

View file

@ -1,20 +0,0 @@
## Initializes a hidden inspector plugin that
## enables the automatic grabbing of node paths when selecting them
## in the remote scene
class_name SignalLensRemoteNodeInspector
extends EditorInspectorPlugin
## Emitted on user selection of node in remote scene
signal node_selected(node_path: NodePath)
func _can_handle(object: Object) -> bool:
# If the requested node is a section in the project settings, it will skip receiving its
# signals. This line use node type inspection, the "SectionedInspectorFilter" type is a
# built-in type in the editor for the project settings. (See #21)
if object.get_property_list()[0]["name"] == "SectionedInspectorFilter": return false
return object.get('Node/path') != null
func _parse_begin(object: Object) -> void:
node_selected.emit(object.get('Node/path'))

View file

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

View file

@ -1,9 +0,0 @@
[plugin]
name="Signal Lens"
description="Signal Lens is a visual debugger for signal connections.
Given any node in a project, it will render a graph with all the connections to that node's signals while the project is playing in the editor.
It doesn't matter if that node is an autoload, or if the signal's are built-in, or custom made - Signal Lens will draw it all when given the node's global path in the remote."
author="Yann Lemos"
version="1.4.0"
script="plugin.gd"

View file

@ -1,121 +0,0 @@
## Initializes Signal Lens plugin and its internal components
@tool
extends EditorPlugin
## Preloaded reference to the editor panel that will be added to
## Godot's debugger bottom panel
const SIGNAL_LENS_EDITOR_PANEL = preload("res://addons/signal_lens/editor/signal_lens_editor_panel.tscn")
## Name of autoload node/class that will be instantiated in the remote scene
## so we can retrieve/send data to it
const AUTOLOAD_NAME = "SignalLens"
## Debugger object that listens to Godot's callbacks
var debugger: SignalLensDebugger = null
## Inspector plugin that allows selecting remote scene nodes
var remote_node_inspector: SignalLensRemoteNodeInspector = null
## Editor panel that draws data received from remote scene
var editor_panel: SignalLensEditorPanel = null
## Setups the plugin and connects internal components
## Called on enter editor scene tree
func initialize():
# Create debugger and inspector objects
debugger = SignalLensDebugger.new()
remote_node_inspector = SignalLensRemoteNodeInspector.new()
# Register plugins in the engine
add_inspector_plugin(remote_node_inspector)
add_debugger_plugin(debugger)
# Add plugin project settings
setup_project_settings()
# Connect node selection in scene tree to backend request for
# that node's signal data
remote_node_inspector.node_selected.connect(debugger.request_node_data_from_remote)
# Create editor panel and add it to the debugger
editor_panel = SIGNAL_LENS_EDITOR_PANEL.instantiate()
debugger.setup_editor_panel(editor_panel)
# Connect data received from debugger to editor panel so data can be
# rendered in graph form
debugger.received_node_data_from_remote.connect(editor_panel.draw_node_data)
# Connect signal emissions from targeted node to editor panel
# so they can be rendered in the graph
debugger.received_signal_emission_from_remote.connect(editor_panel.draw_signal_emission)
# Connect refresh request to debugger so we can retrieve data from
# currently selected node on demand
editor_panel.node_data_requested.connect(debugger.request_node_data_from_remote)
# Connect start and stop debugging signals for editor panel setup/cleanup
debugger.started.connect(editor_panel.start_session)
debugger.stopped.connect(editor_panel.stop_session)
# Connect node selection to editor panel so line edit can reflect currently
# selected node's path
remote_node_inspector.node_selected.connect(editor_panel.assign_node_path)
## Creates and sets default values for Project Settings related to the plugin
func setup_project_settings():
# Resize on open
var setting_resize_panel_on_open = "addons/Signal Lens/resize_panel_on_open"
if not ProjectSettings.has_setting(setting_resize_panel_on_open):
ProjectSettings.set_setting(setting_resize_panel_on_open, true)
ProjectSettings.add_property_info({
"name": setting_resize_panel_on_open,
"type": TYPE_BOOL,
"hint": TYPE_BOOL,
"hint_string": TYPE_BOOL
})
ProjectSettings.set_initial_value(setting_resize_panel_on_open, true)
ProjectSettings.set_as_basic(setting_resize_panel_on_open, true)
# Resize on open
var setting_height_to_resize_to = "addons/Signal Lens/height_to_resize_to"
if not ProjectSettings.has_setting(setting_height_to_resize_to):
ProjectSettings.set_setting(setting_height_to_resize_to, 500)
ProjectSettings.add_property_info({
"name": setting_height_to_resize_to,
"type": TYPE_FLOAT,
"hint": PROPERTY_HINT_RANGE,
"hint_string": "200, 900"
})
ProjectSettings.set_initial_value(setting_height_to_resize_to, 500)
ProjectSettings.set_as_basic(setting_height_to_resize_to, true)
## Removes plugin from editor and cleans references
func cleanup():
# De-register plugins from engine
remove_debugger_plugin(debugger)
remove_inspector_plugin(remote_node_inspector)
# Remove references to initialized components
remote_node_inspector = null
debugger = null
editor_panel = null
#region Engine Callbacks
func _enter_tree() -> void:
initialize()
func _exit_tree() -> void:
cleanup()
func _enable_plugin():
add_autoload_singleton(AUTOLOAD_NAME, "res://addons/signal_lens/autoload/signal_lens_autoload.gd")
func _disable_plugin():
remove_autoload_singleton(AUTOLOAD_NAME)
#endregion

View file

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

View file

@ -1,20 +0,0 @@
extends Control
signal counter_updated(new_value: int)
@onready var counter_value_label: Label = $VBoxContainer/Counter/CounterValueLabel
var _counter: int = 0
func _ready() -> void:
counter_updated.connect(func(value): print("Signal fired from anonymous lambda! Value is " + str(value)))
func _on_counter_updated(new_value: int) -> void:
counter_value_label.text = str(new_value)
func _on_add_button_pressed() -> void:
_counter += 1
counter_updated.emit(_counter)
func _on_counter_value_label_focus_entered() -> void:
print("Player checking out counter value")

View file

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

View file

@ -1,45 +0,0 @@
[gd_scene load_steps=2 format=3 uid="uid://ds8cfe4b5j2x6"]
[ext_resource type="Script" uid="uid://dqa2qee7m1lb0" path="res://addons/signal_lens/test_scene/signal_lens_test_scene.gd" id="1_3ongb"]
[node name="SignalLensTestScene" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_3ongb")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -62.0
offset_top = -29.0
offset_right = 62.0
offset_bottom = 29.0
grow_horizontal = 2
grow_vertical = 2
[node name="AddButton" type="Button" parent="VBoxContainer"]
layout_mode = 2
text = "Add to counter"
[node name="Counter" type="HBoxContainer" parent="VBoxContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/Counter"]
layout_mode = 2
text = "Total times clicked: "
[node name="CounterValueLabel" type="Label" parent="VBoxContainer/Counter"]
layout_mode = 2
text = "0"
[connection signal="counter_updated" from="." to="." method="_on_counter_updated"]
[connection signal="pressed" from="VBoxContainer/AddButton" to="." method="_on_add_button_pressed"]
[connection signal="focus_entered" from="VBoxContainer/Counter/CounterValueLabel" to="." method="_on_counter_value_label_focus_entered"]

View file

@ -1,7 +1,7 @@
[gd_scene load_steps=6 format=3 uid="uid://dknt1oiyei5e5"]
[ext_resource type="Script" uid="uid://dg6f6na1nn2c6" path="res://enemies/enemy.gd" id="1_l7e03"]
[ext_resource type="Texture2D" uid="uid://db2efj41fwjee" path="res://Assets/Characters/72 Character Free/Char 1/Character 1.png" id="2_cmo2f"]
[ext_resource type="Texture2D" uid="uid://d2thnsqp6lb4r" path="res://Assets/Characters/chibi1.png" id="2_cmo2f"]
[ext_resource type="PackedScene" uid="uid://daiqb0q373002" path="res://UI/health_bar_3d.tscn" id="3_cmo2f"]
[sub_resource type="SphereShape3D" id="SphereShape3D_7frlh"]
@ -18,15 +18,13 @@ script = ExtResource("1_l7e03")
speed = 1
[node name="CollisionShape3D" type="CollisionShape3D" parent="EnemyA"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0491967, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.289246, 0)
shape = SubResource("SphereShape3D_7frlh")
[node name="Sprite3D" type="Sprite3D" parent="EnemyA"]
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, -0.0436401, 0)
transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, -0.0436401, 0)
billboard = 2
texture = ExtResource("2_cmo2f")
hframes = 12
vframes = 22
[node name="HealthBar3D" parent="EnemyA" instance=ExtResource("3_cmo2f")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.6, 0)

View file

@ -1,11 +0,0 @@
extends Control
var selected_tower
func _ready() -> void:
EventBus.tower_selected.connect(_on_EventBus_tower_selected)
func _on_EventBus_tower_selected(tower : PackedScene, tower_button : TowerButton):
selected_tower = tower
selected_tower_button = tower_button

View file

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

View file

@ -1,362 +0,0 @@
[gd_scene load_steps=7 format=3 uid="uid://djyye2otjju2d"]
[ext_resource type="Theme" uid="uid://bbp4qcbwkeg7x" path="res://default_theme.tres" id="1_xxfb2"]
[ext_resource type="PackedScene" uid="uid://bqpeu50pgsdfk" path="res://UI/tower_button.tscn" id="2_qus6b"]
[ext_resource type="Script" uid="uid://jg5ny0u7buos" path="res://game_menu.gd" id="2_wr0q8"]
[ext_resource type="Texture2D" uid="uid://uptdcefxlv4c" path="res://Assets/Icones/ppdf_bio_image_placeholder_2.png" id="3_wr0q8"]
[ext_resource type="Script" uid="uid://tn3qdhcyaxsg" path="res://UI/upgrade_button.gd" id="4_3rcmp"]
[ext_resource type="Texture2D" uid="uid://dksohsrys0yy7" path="res://Assets/Icones/baby-face.svg" id="5_pbvm6"]
[node name="GameMenu" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme = ExtResource("1_xxfb2")
script = ExtResource("2_wr0q8")
[node name="Background" type="Panel" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="MenuHeader" type="HBoxContainer" parent="."]
layout_mode = 1
offset_left = 304.0
offset_right = 1918.0
offset_bottom = 82.0
alignment = 1
[node name="ButtonSettings" type="Button" parent="MenuHeader"]
layout_mode = 2
size_flags_horizontal = 3
text = "Settings"
[node name="ButtonPause" type="Button" parent="MenuHeader"]
layout_mode = 2
size_flags_horizontal = 3
text = "Pause"
[node name="ButtonContinue" type="Button" parent="MenuHeader"]
layout_mode = 2
size_flags_horizontal = 3
text = "Continue"
[node name="ButtonQuit" type="Button" parent="MenuHeader"]
layout_mode = 2
size_flags_horizontal = 3
text = "Quit"
[node name="ButtonMoney" type="Button" parent="MenuHeader"]
layout_mode = 2
size_flags_horizontal = 3
text = "Money"
[node name="Towers" type="VBoxContainer" parent="."]
layout_mode = 1
offset_right = 300.0
offset_bottom = 722.0
[node name="ButtonCube" type="Button" parent="Towers"]
layout_mode = 2
text = "Cube"
[node name="TowerButtonPierre" parent="Towers" instance=ExtResource("2_qus6b")]
layout_mode = 2
[node name="TowerButtonAline" parent="Towers" instance=ExtResource("2_qus6b")]
visible = false
layout_mode = 2
[node name="TowerButtonMaxence" parent="Towers" instance=ExtResource("2_qus6b")]
visible = false
layout_mode = 2
[node name="TowerButtonAlex" parent="Towers" instance=ExtResource("2_qus6b")]
visible = false
layout_mode = 2
[node name="TowerButtonGeraldine" parent="Towers" instance=ExtResource("2_qus6b")]
visible = false
layout_mode = 2
[node name="CharacterSheet" type="Control" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="TowerStats" type="Panel" parent="CharacterSheet"]
custom_minimum_size = Vector2(800, 512)
layout_mode = 0
offset_left = 313.0
offset_top = 86.0
offset_right = 1113.0
offset_bottom = 598.0
[node name="MarginContainer2" type="MarginContainer" parent="CharacterSheet/TowerStats"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_constants/margin_left = 20
theme_override_constants/margin_top = 20
theme_override_constants/margin_right = 20
theme_override_constants/margin_bottom = 20
[node name="HBoxContainer" type="HBoxContainer" parent="CharacterSheet/TowerStats/MarginContainer2"]
layout_mode = 2
[node name="VBoxContainer" type="VBoxContainer" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="LabelCharacterSheet" type="Label" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer"]
layout_mode = 2
text = "Fiche Perso :
FRIANDISE"
horizontal_alignment = 1
[node name="MarginContainer" type="MarginContainer" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer"]
custom_minimum_size = Vector2(0, 40)
layout_mode = 2
[node name="StatDamage" type="HBoxContainer" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer"]
layout_mode = 2
[node name="NameStat" type="Label" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer/StatDamage"]
layout_mode = 2
text = "Damage :"
[node name="Stat" type="Label" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer/StatDamage"]
layout_mode = 2
size_flags_horizontal = 3
text = "0"
horizontal_alignment = 2
[node name="StatCooldown" type="HBoxContainer" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer"]
layout_mode = 2
[node name="NameStat" type="Label" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer/StatCooldown"]
layout_mode = 2
text = "Cooldown :"
[node name="Stat" type="Label" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer/StatCooldown"]
layout_mode = 2
size_flags_horizontal = 3
text = "0"
horizontal_alignment = 2
[node name="StatMaxEnergy" type="HBoxContainer" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer"]
layout_mode = 2
[node name="NameStat" type="Label" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer/StatMaxEnergy"]
layout_mode = 2
text = "Max Energy :"
[node name="Stat" type="Label" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer/StatMaxEnergy"]
layout_mode = 2
size_flags_horizontal = 3
text = "0"
horizontal_alignment = 2
[node name="StatRegen" type="HBoxContainer" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer"]
layout_mode = 2
[node name="NameStat" type="Label" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer/StatRegen"]
layout_mode = 2
text = "Energy Regen :"
[node name="Stat" type="Label" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/VBoxContainer/StatRegen"]
layout_mode = 2
size_flags_horizontal = 3
text = "0"
horizontal_alignment = 2
[node name="MarginContainer" type="MarginContainer" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer"]
custom_minimum_size = Vector2(20, 0)
layout_mode = 2
[node name="Bio" type="VBoxContainer" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer"]
layout_mode = 2
[node name="BioImage" type="TextureRect" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/Bio"]
custom_minimum_size = Vector2(300, 300)
layout_mode = 2
texture = ExtResource("3_wr0q8")
expand_mode = 1
[node name="Label" type="Label" parent="CharacterSheet/TowerStats/MarginContainer2/HBoxContainer/Bio"]
custom_minimum_size = Vector2(300, 0)
layout_mode = 2
size_flags_vertical = 3
theme_override_font_sizes/font_size = 30
text = "Aime se promener dans l'herbe et manger des framboises. Sa petite bouille la rend trop mignonne."
horizontal_alignment = 1
autowrap_mode = 2
[node name="TowerUpgrades" type="Panel" parent="CharacterSheet"]
layout_mode = 1
anchors_preset = 3
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -786.0
offset_top = -990.0
offset_right = -19.0
offset_bottom = -28.0
grow_horizontal = 0
grow_vertical = 0
[node name="MarginContainer2" type="MarginContainer" parent="CharacterSheet/TowerUpgrades"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_constants/margin_left = 20
theme_override_constants/margin_top = 20
theme_override_constants/margin_right = 20
theme_override_constants/margin_bottom = 20
[node name="VBoxContainer" type="VBoxContainer" parent="CharacterSheet/TowerUpgrades/MarginContainer2"]
layout_mode = 2
theme_override_constants/separation = 10
[node name="Title" type="Label" parent="CharacterSheet/TowerUpgrades/MarginContainer2/VBoxContainer"]
layout_mode = 2
text = "Boutique"
horizontal_alignment = 1
[node name="MarginContainer" type="MarginContainer" parent="CharacterSheet/TowerUpgrades/MarginContainer2/VBoxContainer"]
custom_minimum_size = Vector2(0, 40)
layout_mode = 2
[node name="UpgradeButton" type="Button" parent="CharacterSheet/TowerUpgrades/MarginContainer2/VBoxContainer"]
layout_mode = 2
text = "Upgrade 1"
script = ExtResource("4_3rcmp")
metadata/_custom_type_script = "uid://tn3qdhcyaxsg"
[node name="UpgradeButton2" type="Button" parent="CharacterSheet/TowerUpgrades/MarginContainer2/VBoxContainer"]
layout_mode = 2
text = "Upgrade 2"
script = ExtResource("4_3rcmp")
metadata/_custom_type_script = "uid://tn3qdhcyaxsg"
[node name="UpgradeButton3" type="Button" parent="CharacterSheet/TowerUpgrades/MarginContainer2/VBoxContainer"]
layout_mode = 2
text = "Upgrade 3"
script = ExtResource("4_3rcmp")
metadata/_custom_type_script = "uid://tn3qdhcyaxsg"
[node name="UpgradeButton4" type="Button" parent="CharacterSheet/TowerUpgrades/MarginContainer2/VBoxContainer"]
layout_mode = 2
text = "Upgrade 4"
script = ExtResource("4_3rcmp")
metadata/_custom_type_script = "uid://tn3qdhcyaxsg"
[node name="UpgradeButton5" type="Button" parent="CharacterSheet/TowerUpgrades/MarginContainer2/VBoxContainer"]
layout_mode = 2
text = "Upgrade 5"
script = ExtResource("4_3rcmp")
metadata/_custom_type_script = "uid://tn3qdhcyaxsg"
[node name="TowerSkills" type="Panel" parent="CharacterSheet"]
layout_mode = 1
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -646.0
offset_top = -471.0
offset_right = 153.0
offset_bottom = -28.0
grow_horizontal = 2
grow_vertical = 0
[node name="MarginContainer" type="MarginContainer" parent="CharacterSheet/TowerSkills"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_constants/margin_left = 20
theme_override_constants/margin_top = 20
theme_override_constants/margin_right = 20
theme_override_constants/margin_bottom = 20
[node name="VBoxContainer" type="VBoxContainer" parent="CharacterSheet/TowerSkills/MarginContainer"]
layout_mode = 2
[node name="Title" type="Label" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer"]
layout_mode = 2
text = "Capacités"
horizontal_alignment = 1
[node name="MarginContainer" type="MarginContainer" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="SkillUI" type="HBoxContainer" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Icone" type="TextureRect" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer/SkillUI"]
custom_minimum_size = Vector2(64, 64)
layout_mode = 2
texture = ExtResource("5_pbvm6")
expand_mode = 1
[node name="MarginContainer" type="MarginContainer" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer/SkillUI"]
custom_minimum_size = Vector2(20, 0)
layout_mode = 2
[node name="Label" type="Label" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer/SkillUI"]
layout_mode = 2
text = "Bonjour"
[node name="SkillUI2" type="HBoxContainer" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Icone" type="TextureRect" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer/SkillUI2"]
custom_minimum_size = Vector2(64, 64)
layout_mode = 2
texture = ExtResource("5_pbvm6")
expand_mode = 1
[node name="MarginContainer" type="MarginContainer" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer/SkillUI2"]
custom_minimum_size = Vector2(20, 0)
layout_mode = 2
[node name="Label" type="Label" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer/SkillUI2"]
layout_mode = 2
text = "Compliments"
[node name="SkillUI3" type="HBoxContainer" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Icone" type="TextureRect" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer/SkillUI3"]
custom_minimum_size = Vector2(64, 64)
layout_mode = 2
texture = ExtResource("5_pbvm6")
expand_mode = 1
[node name="MarginContainer" type="MarginContainer" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer/SkillUI3"]
custom_minimum_size = Vector2(20, 0)
layout_mode = 2
[node name="Label" type="Label" parent="CharacterSheet/TowerSkills/MarginContainer/VBoxContainer/SkillUI3"]
layout_mode = 2
text = "Cinéphile"

View file

@ -20,17 +20,12 @@ config/icon="res://icon.svg"
GameManager="*res://Globals/GameManager.gd"
EventBus="*res://Globals/EventBus.gd"
Transition="*res://Globals/transition.tscn"
SignalLens="*res://addons/signal_lens/autoload/signal_lens_autoload.gd"
[display]
window/size/viewport_width=1920
window/size/viewport_height=1080
[editor_plugins]
enabled=PackedStringArray("res://addons/signal_lens/plugin.cfg")
[file_customization]
folder_colors={

View file

@ -45,6 +45,7 @@ func spawn_manager() -> void:
if enemies_to_spawn > 0:
spawn()
print(GameManager.enemies_alive)
if GameManager.enemies_alive > 0:
wave_on_going = true
else: