Compare commits

...

94 Commits

Author SHA1 Message Date
cblech cc7e8c5c4b Added Credits 2025-07-11 03:49:09 +02:00
cblech c0e002f783 made you win waiting time shorter 2025-07-11 03:01:49 +02:00
cblech e8850ca7c5 Added chuga dialog to fight scene 2025-07-11 03:00:47 +02:00
cblech 69cb63ad89 merge auto fixes 2025-07-11 00:15:28 +02:00
cblech 11790434f5 Merge remote-tracking branch 'origin/feature/showcase_kathi' into feature/fight_system 2025-07-11 00:11:33 +02:00
cblech 8bd2b09232 Added healing 2025-07-10 23:32:16 +02:00
kziolkowski 480d149ede SceneTransition Rework completed 2025-07-10 23:23:20 +02:00
cblech c6fc400994 Added second fight with mavkha 2025-07-10 19:30:57 +02:00
kziolkowski 16251db248 WIP new SceneTransition system 2025-07-10 19:07:46 +02:00
cblech 4752002caf Added action per round 2025-07-10 18:29:18 +02:00
cblech 0e028a2cb9 Renamed signal 2025-07-10 16:12:47 +02:00
cblech 01a281c2aa Fixed camera bounds 2025-07-10 16:04:12 +02:00
cblech 2a46d363e9 Changed music to forrest 2025-07-10 15:43:36 +02:00
cblech 92c3f5e054 Target only alive enemies 2025-07-10 15:25:11 +02:00
cblech 6727339e9a Added audio to fight 2025-07-10 04:39:33 +02:00
cblech e3d67722de Merge remote-tracking branch 'origin/Nao's-Sounds' into feature/fight_system 2025-07-10 03:47:40 +02:00
cblech b6fd6292e3 Basic fighting system 2025-07-10 03:38:48 +02:00
kziolkowski e8c24e18be Added indoor bedroom scene 2025-07-10 01:25:52 +02:00
kziolkowski 199d0873c8 Set up beetroot quest and added cat to indoor scene. 2025-07-10 01:19:00 +02:00
kziolkowski e84ef716f6 Merge remote-tracking branch 'origin/feature_sanel-dialogic' into feature/showcase_kathi
# Conflicts:
#	project.godot
2025-07-09 23:53:40 +02:00
kziolkowski 135ba0d198 Reworked Domovoi kitchen animation and added AnimationStarter script 2025-07-09 23:50:43 +02:00
Sanelschnitte 2940475062 Added dialog in Dialogic
basic char, text, choice - eventually needs more events and functions to work properly
2025-07-09 23:43:02 +02:00
kziolkowski 202f8809aa Fixed plant layering issue 2025-07-09 23:03:56 +02:00
kziolkowski 28bb81c0b0 Added fence gates and fixed dialogic toggle for inventory 2025-07-09 22:58:36 +02:00
kziolkowski b9c5de6dc3 Made labels visible on ducks 2025-07-09 22:49:07 +02:00
kziolkowski 8c18688a69 MVP duck setup 2025-07-09 22:40:03 +02:00
kziolkowski 2429958741 Added Disclaimer scene 2025-07-09 21:40:02 +02:00
kziolkowski 6b5a8ee126 WIP duck behaviour 2025-07-09 20:52:43 +02:00
kziolkowski 8d40529349 Changed StartScreen layout and added Quit button 2025-07-09 20:52:33 +02:00
kziolkowski 9e97cc3b80 WIP duck pushing behaviour 2025-07-08 23:53:50 +02:00
kziolkowski ebc3ee9cf9 Implemented basic duck running away from vesna mechanic 2025-07-08 22:23:28 +02:00
kziolkowski a1bbe44105 Merge remote-tracking branch 'origin/Nao's-Sounds' into feature/showcase_kathi 2025-07-08 21:33:59 +02:00
kziolkowski 3ce10c8ba9 Merge remote-tracking branch 'origin/Nao's-Sounds' into feature/showcase_kathi 2025-07-08 21:33:37 +02:00
kziolkowski 7e6163ed68 updated project.godot 2025-07-07 21:16:36 +02:00
kziolkowski 55d6222698 Added Camera to Indoor Common Room scene and renamend scene asset 2025-07-07 16:37:10 +02:00
kziolkowski d7ad2ba072 reverted / recreated inventory changes 2025-07-07 16:14:07 +02:00
kziolkowski 9c50a63dc3 Merge branch 'develop' into feature/showcase_kathi 2025-07-07 15:34:53 +02:00
kziolkowski 746ac58329 Merge pull request 'Feature: Quest system' (#11) from feature/quest_system into develop
Reviewed-on: #11
2025-07-07 15:24:28 +02:00
cblech a9cb20c8bc Fixed journal references 2025-07-07 04:51:35 +02:00
cblech 32249fde86 Made quest visuals 2025-07-07 04:41:14 +02:00
cblech 27e137bc02 Made quest usable 2025-07-07 04:41:03 +02:00
cblech 01daddee3b Made basic quest setup 2025-07-07 04:40:40 +02:00
Jonathan ba512508f8 Merge pull request 'feature/farm_scene_rework' (#10) from feature/farm_scene_rework into develop
Reviewed-on: #10
2025-07-07 03:46:51 +02:00
kziolkowski ec653aa847 readded camera ref to farming behaviour 2025-07-07 01:17:41 +02:00
kziolkowski 9acea54f28 Added duck sprite 2025-07-07 00:46:57 +02:00
kziolkowski 2f5296e05a Diversified field shapes 2025-07-06 23:48:01 +02:00
kziolkowski e8a58655ad Added grass textures and field borders 2025-07-06 23:28:02 +02:00
kziolkowski aa3789566c Duplicated sunflower field parallaxe layer to ensure seamlessness on big screens 2025-07-06 22:00:39 +02:00
kziolkowski 9c7ae20c18 Reworked Camera controls outside scene 2025-07-06 21:56:15 +02:00
Nao 9f04c8819f SFX for Mavkas (Voices but more "ghostly") Added 2025-07-06 20:20:03 +02:00
Nao 6cd7be196b SFX Wolf + Mavka Voices (when hit in battle) Added 2025-07-06 20:11:50 +02:00
kziolkowski ab2cf3f497 wateringcanstate uid? 2025-07-06 12:26:07 +02:00
kziolkowski bf096aa716 visual improvements on farm scene 2025-07-06 12:25:44 +02:00
kziolkowski 09ef508f49 Fixed field creation bug 2025-07-06 10:57:38 +02:00
Nao 6de8368414 Farm Atmos Added 2025-07-05 23:23:39 +02:00
Nao d20085a67c SFX Water Attack Added (Vesna + Slimes) 2025-07-05 23:17:58 +02:00
kziolkowski a54003c658 Made ground noise texture more seamless 2025-07-05 23:10:23 +02:00
Nao 648ae8395b SFX added for Root Attack, Mavka + Vesna 2025-07-05 23:01:43 +02:00
kziolkowski fbad33213c Finalized new watering can mechanic with vfx and ui 2025-07-05 22:54:52 +02:00
Nao b68eb0953e SFX Duck Flügelflattern "Wings" + Schlappentornado Added 2025-07-05 21:51:19 +02:00
kziolkowski 35c7e9a25e WIP Wasserstand UI 2025-07-05 17:34:03 +02:00
kziolkowski 57896e37df Fixed background music loop and added audio mixers 2025-07-05 15:08:23 +02:00
kziolkowski 242879159a Fixed sfx binding in farming scene 2025-07-05 13:57:14 +02:00
kziolkowski 7ef9fe53b2 Added SignalVisualizer plugin 2025-07-05 13:56:59 +02:00
kziolkowski 600d9cfca1 Made items activate directly when picked up 2025-07-05 13:18:19 +02:00
kziolkowski 48796de1ba Changed dialogic background color to black and opacity to 168 sothat there is a visible dark overlay during dialogues 2025-07-05 12:37:39 +02:00
kziolkowski 4a0b2cd550 Improved Inventory UI (more in the middle, adapt to viewport size, new selector image) 2025-07-05 12:18:28 +02:00
kziolkowski ba429d7b84 wip improving inventory layout 2025-07-04 23:41:15 +02:00
kziolkowski e33776daeb ESC closes inventory now. 2025-07-04 23:15:45 +02:00
kziolkowski 9cfd3bd6f4 Improving farm outside scene performance 2025-07-02 21:36:12 +02:00
Nao 7eb18caaaf Added SFX for Healing magic 2025-07-02 21:24:21 +02:00
Nao e65e82f421 Added SFX Duck & Combat, moved Cat SFX to folder "animals" 2025-07-02 21:23:36 +02:00
kziolkowski c36d0b5866 reduced VRAM load by more than 50% 2025-07-02 17:54:23 +02:00
kziolkowski bcdba7b812 Fixed Vesna sliding issue 2025-07-02 15:48:39 +02:00
kziolkowski 7467ec56d9 Fixed ordering issues in indoor scene 2025-06-28 17:37:39 +02:00
kziolkowski 990494e8b0 Adjusted indoor speed 2025-06-28 17:19:41 +02:00
kziolkowski c6e0cfe4d9 Fixed Button layout behaviour 2025-06-28 17:17:26 +02:00
Nao 691e613a5c Added SFX for Combat 2025-06-28 17:04:20 +02:00
kziolkowski 4e010220bf Improved performance of the first indoor scene 2025-06-28 16:13:06 +02:00
kziolkowski ccc4eb759e Added new house image to farming scene 2025-06-21 16:09:35 +02:00
Nao 250f0d07ca SFX Slime Hit Variations (Pitch) Added 2025-06-17 15:43:33 +02:00
Nao f481f5bea7 SFX Added: UI (Dialog + Confirmation), Slime Hit 2025-06-17 15:39:02 +02:00
Jonathan 58c65fc928 Merge pull request 'First intro sequence with Yeli' (#9) from feature/yeli_intro into develop
Reviewed-on: #9
2025-06-17 02:40:12 +02:00
cblech 937e54e47a Merge branch 'feature/farming_visuals' into develop 2025-06-16 21:03:02 +02:00
Nao b8cb60aec9 Placeholder for Quest Fail added 2025-06-02 16:06:52 +02:00
Nao 55a3e56791 New SFX for Door added 2025-06-02 15:56:36 +02:00
ascheck 1629862759 Merge pull request 'ui elemente hinzugefügt für dialog' (#4) from feature/ui-elements into develop
Reviewed-on: #4
2025-05-27 21:23:34 +02:00
ascheck a53b4c4010 ui elemente hinzugefügt für dialog 2025-05-27 21:11:15 +02:00
Nao 4261789f13 SFX Quest Complete Placeholder added (need more time) 2025-05-18 20:34:00 +02:00
Nao ce18c89c09 Farm Atmos Nighttime added 2025-05-18 19:21:51 +02:00
Nao 7643cccebf New SFX and Forest Atmos Nighttime added 2025-05-18 19:04:02 +02:00
Nao 7e4d733d7c SFX for kitchen added (cutlery, plates, etc) and a few renamed 2025-05-18 17:52:59 +02:00
Nao 1dcd900737 SFX Snoring Added 2025-05-18 15:33:02 +02:00
Nao 74c3540c96 SFX Door Open and Close added 2025-05-18 15:10:08 +02:00
489 changed files with 14124 additions and 2094 deletions
+1
View File
@@ -2,4 +2,5 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AArea3D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F8a54226fa2e1c9371a8091f24cfd744aef11fe6869527dc23b9b837623a29b9_003FArea3D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AArea3D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F8a54226fa2e1c9371a8091f24cfd744aef11fe6869527dc23b9b837623a29b9_003FArea3D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAudioStreamPlayer2D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F848324b1c23114c3f5e8bbb5a42c4ade394c59a7a7a133a66b76581ca571_003FAudioStreamPlayer2D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAudioStreamPlayer2D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F848324b1c23114c3f5e8bbb5a42c4ade394c59a7a7a133a66b76581ca571_003FAudioStreamPlayer2D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACastHelpers_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fd111abf504bf42b5968a609b168fd093b2e200_003Fbb_003F1c116fcd_003FCastHelpers_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACastHelpers_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fd111abf504bf42b5968a609b168fd093b2e200_003Fbb_003F1c116fcd_003FCastHelpers_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACharacterBody2D_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fbba0bbd7a98ee58286e9484fbe86e01afff6232283f6efd3556eb7116453_003FCharacterBody2D_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANode_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Ff1d69ec2da76ccf9bc8a75c8e0fdca9a7ba1adf8c8c9d5047e2fa5991c02eca_003FNode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANode_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Ff1d69ec2da76ccf9bc8a75c8e0fdca9a7ba1adf8c8c9d5047e2fa5991c02eca_003FNode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
+1
View File
@@ -0,0 +1 @@
<svg height="24" viewBox="0 0 16 16" width="24" xmlns="http://www.w3.org/2000/svg"><path d="m8 1a1 1 0 0 0 -1 1v5h-2c-1.108 0-2 .892-2 2v1h10v-1c0-1.108-.892-2-2-2h-2v-5a1 1 0 0 0 -1-1zm-5 10v4l10-1v-3z" fill="#e0e0e0"/></svg>

After

Width:  |  Height:  |  Size: 227 B

+37
View File
@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bmnff63evbdhv"
path="res://.godot/imported/Clear.svg-d661617e27b91e3580171e3447fde514.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/SignalVisualizer/Clear.svg"
dest_files=["res://.godot/imported/Clear.svg-d661617e27b91e3580171e3447fde514.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
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false
@@ -0,0 +1,58 @@
class_name SignalConnection extends Object
# Properties
# |===================================|
# |===================================|
# |===================================|
var signal_id: int
var source_node_name: String
var destination_node_name: String
var method_signature: String
var description: String :
get:
return "ID: {signal_id} Source: {source_node_name} Destination: {destination_node_name} Method: {method_signature}".format({
"signal_id": signal_id,
"source_node_name": source_node_name,
"destination_node_name": destination_node_name,
"method_signature": method_signature,
})
var dictionary_key: String :
get:
return "{signal_id}__{source_node_name}__{destination_node_name}__{method_signature}".format({ "signal_id": signal_id, "source_node_name": source_node_name, "destination_node_name": destination_node_name, "method_signature": method_signature.replace("::", "_") })
var dictionary_representation: Dictionary :
get:
return {
"signal_id": signal_id,
"source_node_name": source_node_name,
"destination_node_name": destination_node_name,
"method_signature": method_signature,
}
# Lifecycle
# |===================================|
# |===================================|
# |===================================|
func _init(signal_id: int, source_node_name: String, destination_node_name: String, method_signature: String):
self.signal_id = signal_id
self.source_node_name = source_node_name
self.destination_node_name = destination_node_name
self.method_signature = method_signature
# Signals
# |===================================|
# |===================================|
# |===================================|
# Methods
# |===================================|
# |===================================|
# |===================================|
@@ -0,0 +1 @@
uid://dm613ct57qfwa
@@ -0,0 +1,56 @@
class_name SignalDescription extends Object
# Properties
# |===================================|
# |===================================|
# |===================================|
var id: int:
get:
if _source_id != null:
return _source_id
return get_instance_id()
var node_name: String
var signal_name: String
var description: String :
get:
return "ID: {id} Node: {node_name} Signal: {signal_name}".format({
"id": id,
"node_name": node_name,
"signal_name": signal_name,
})
var dictionary_representation: Dictionary :
get:
return {
"id": id,
"node_name": node_name,
"signal_name": signal_name,
}
var _source_id = null
# Lifecycle
# |===================================|
# |===================================|
# |===================================|
func _init(node_name: String, signal_name: String):
self.node_name = node_name
self.signal_name = signal_name
# Signals
# |===================================|
# |===================================|
# |===================================|
# Methods
# |===================================|
# |===================================|
# |===================================|
@@ -0,0 +1 @@
uid://dvgsocxisw3ae
@@ -0,0 +1,53 @@
class_name SignalGraph extends Object
# Properties
# |===================================|
# |===================================|
# |===================================|
var name: String
var signals: Array[SignalDescription]
var edges: Array[SignalConnection]
var description: String :
get:
return "Signals: {signals}\nEdges: {edges}".format({
"signals": signals.map(func (item): return item.description),
"edges": edges.map(func (item): return item.description),
})
var dictionary_representation: Dictionary :
get:
return {
"name": name,
"signals": signals.map(func (element): return element.dictionary_representation),
"edges": edges.map(func (element): return element.dictionary_representation),
}
# Lifecycle
# |===================================|
# |===================================|
# |===================================|
func _init(name: String, signals: Array[SignalDescription] = [], edges: Array[SignalConnection] = []):
self.name = name
self.signals = signals
self.edges = edges
# Signals
# |===================================|
# |===================================|
# |===================================|
# Methods
# |===================================|
# |===================================|
# |===================================|
func get_source_signal_for_edge(edge: SignalConnection) -> SignalDescription:
var result = signals.filter(func (item): return item.id == edge.signal_id)
if result.size() > 0:
return result[0]
return null
@@ -0,0 +1 @@
uid://2qj81iy1le0a
@@ -0,0 +1,170 @@
@tool
class_name SignalGraphUtility
static var SignalGraphNode = preload("res://addons/SignalVisualizer/Visualizer/signal_graph_node.tscn")
static var GraphNodeItem = preload("res://addons/SignalVisualizer/Visualizer/signal_graph_node_item.tscn")
const SOURCE_COLOR: Color = Color.SKY_BLUE
const DESTINATION_COLOR: Color = Color.CORAL
const CONNECTION_TYPE: int = 0
#region Methods
static func create_signal_graph(name: String, signals: Array, edges: Array) -> SignalGraph:
var signal_graph = SignalGraph.new(name)
for signal_item in signals:
var new_signal_description = SignalDescription.new(signal_item.node_name, signal_item.signal_name)
new_signal_description._source_id = signal_item.id
signal_graph.signals.append(new_signal_description)
for connection in edges:
var new_edge = SignalConnection.new(connection.signal_id, connection.source_node_name, connection.destination_node_name, connection.method_signature)
signal_graph.edges.append(new_edge)
return signal_graph
static func create_signal_graph_from_node(root_node: Node, is_persistent_only: bool = false):
var signal_graph = SignalGraph.new(root_node.scene_file_path)
var all_nodes: Array[Node] = _gather_nodes_from_node(root_node)
var signals: Array[SignalDescription] = []
var edges: Array[SignalConnection] = []
for node in all_nodes:
for signal_item in node.get_signal_list():
var existing_signals = []
var connection_list = node.get_signal_connection_list(signal_item["name"] as String)
if connection_list.size() > 0:
for connection in connection_list:
var enabled_flags = connection["flags"] == CONNECT_PERSIST if is_persistent_only else true
var should_display_connection = "name" in connection["callable"].get_object() and not connection["callable"].get_object().name.begins_with("@") and enabled_flags
if should_display_connection:
var signal_description: SignalDescription
var filtered_signals = existing_signals.filter(func (element): return element.signal_name == signal_item.name and element.node_name == node.name)
if filtered_signals.size() == 1:
signal_description = filtered_signals[0]
else:
signal_description = SignalDescription.new(node.name, signal_item.name)
existing_signals.append(signal_description)
signals.append(signal_description)
var signal_edge = SignalConnection.new(signal_description.id, signal_description.node_name, connection["callable"].get_object().name, connection["callable"].get_method())
if not signal_graph.edges.any(func (element): return element.signal_id == signal_description.id):
edges.append(signal_edge)
var temp_signals = {}
for item in signals:
temp_signals[item.id] = item
var temp_edges = {}
for item in edges:
temp_edges[item.dictionary_key] = item
signal_graph.signals.assign(temp_signals.keys().map(func (key): return temp_signals[key]))
signal_graph.edges.assign(temp_edges.keys().map(func (key): return temp_edges[key]))
return signal_graph
static func generate_signal_graph_nodes(signal_graph: SignalGraph, graph_node: GraphEdit, open_script_callable: Callable):
var graph_nodes: Dictionary = {}
for signal_item in signal_graph.signals:
var current_graph_node: SignalGraphNode
if graph_nodes.has(signal_item.node_name):
current_graph_node = graph_nodes[signal_item.node_name]
if not current_graph_node:
current_graph_node = SignalGraphNode.instantiate()
current_graph_node.title = signal_item.node_name
current_graph_node.name = _get_graph_node_name(signal_item.node_name)
graph_node.add_child(current_graph_node)
graph_nodes[signal_item.node_name] = current_graph_node
for edge in signal_graph.edges:
var destination_graph_node: SignalGraphNode
if graph_nodes.has(edge.destination_node_name):
destination_graph_node = graph_nodes[edge.destination_node_name]
else:
destination_graph_node = SignalGraphNode.instantiate()
destination_graph_node.title = edge.destination_node_name
destination_graph_node.name = _get_graph_node_name(edge.destination_node_name)
graph_node.add_child(destination_graph_node)
graph_nodes[edge.destination_node_name] = destination_graph_node
var source_signal = signal_graph.get_source_signal_for_edge(edge)
if source_signal != null:
var source_graph_node: SignalGraphNode = graph_nodes[edge.source_node_name] as SignalGraphNode
if not source_graph_node.has_source_signal_description(source_signal.signal_name, edge.destination_node_name):
var source_signal_label = Label.new()
source_signal_label.text = source_signal.signal_name
source_signal_label.name = "source_" + source_signal.signal_name + "_" + edge.destination_node_name
source_graph_node.add_child(source_signal_label)
var destination_signal_name = "destination_" + source_signal.signal_name + "_" + edge.method_signature.replace("::", "__")
var has_destination = destination_graph_node.has_destination_signal_description(source_signal.signal_name, edge.method_signature)
if not has_destination:
var destination_signal_item = GraphNodeItem.instantiate()
destination_signal_item.signal_data = SignalGraphNodeItem.Metadata.new(source_signal.signal_name, edge.method_signature, edge.destination_node_name)
destination_signal_item.text = edge.method_signature
destination_signal_item.name = destination_signal_name
destination_signal_item.open_script.connect(open_script_callable)
destination_graph_node.add_child(destination_signal_item)
for edge in signal_graph.edges:
var source_signal = signal_graph.get_source_signal_for_edge(edge)
if source_signal != null:
var source_graph_node: SignalGraphNode = graph_nodes[edge.source_node_name] as SignalGraphNode
var destination_graph_node: SignalGraphNode = graph_nodes[edge.destination_node_name] as SignalGraphNode
var from_port = source_graph_node.get_source_slot(source_signal.signal_name, edge.destination_node_name)
var to_port = destination_graph_node.get_destination_slot(source_signal.signal_name, edge.method_signature)
source_graph_node.set_slot(from_port, false, CONNECTION_TYPE, Color.BLACK, true, CONNECTION_TYPE, SOURCE_COLOR)
destination_graph_node.set_slot(to_port, true, CONNECTION_TYPE, DESTINATION_COLOR, false, CONNECTION_TYPE, Color.BLACK)
var from_slot_index = source_graph_node.get_next_source_slot(source_signal.signal_name, edge.destination_node_name)
var to_slot_index = destination_graph_node.get_next_destination_slot(source_signal.signal_name, edge.method_signature)
if from_port >= 0 and to_port >= 0:
graph_node.connect_node(source_graph_node.name, from_slot_index, destination_graph_node.name, to_slot_index)
else:
print(">>> Invalid Connection Request")
static func generate_signal_graph_tree(signal_graph: SignalGraph, tree_node: Tree):
var root = tree_node.create_item()
root.set_text(0, signal_graph.name)
var tree_items: Dictionary = {}
for signal_item in signal_graph.signals:
var node_tree_item: TreeItem
if tree_items.has(signal_item.node_name):
node_tree_item = tree_items[signal_item.node_name] as TreeItem
else:
node_tree_item = tree_node.create_item(root)
node_tree_item.set_text(0, signal_item.node_name)
tree_items[signal_item.node_name] = node_tree_item
var signal_tree_item = tree_node.create_item(node_tree_item)
signal_tree_item.set_text(0, signal_item.signal_name)
for edge in signal_graph.edges.filter(func (item): return item.signal_id == signal_item.id):
var signal_connection_tree_item = tree_node.create_item(signal_tree_item)
signal_connection_tree_item.set_text(0, edge.destination_node_name + "::" + edge.method_signature)
static func _get_graph_node_name(name: String) -> String:
return "{node_name}_graph_node".format({ "node_name": name })
static func _gather_nodes_from_node(root_node: Node) -> Array[Node]:
var node_list: Array[Node] = [root_node]
return node_list + __gather_nodes_from_node(root_node)
static func __gather_nodes_from_node(node: Node) -> Array[Node]:
var nodes: Array[Node] = []
for child in node.get_children(false):
nodes.append(child)
nodes += __gather_nodes_from_node(child)
return nodes
#endregion
@@ -0,0 +1 @@
uid://csw8uccbs0vuk
@@ -0,0 +1,146 @@
extends Node
# Properties
# |===================================|
# |===================================|
# |===================================|
var _signal_graph: SignalGraph
var _lambda_map: Dictionary = {}
# Lifecycle
# |===================================|
# |===================================|
# |===================================|
func _ready():
if OS.is_debug_build():
EngineDebugger.register_message_capture("signal_debugger", _on_signal_debugger_message_capture)
# Signals
# |===================================|
# |===================================|
# |===================================|
func _on_signal_debugger_message_capture(message: String, data: Array) -> bool:
if message == "start":
_signal_graph = generate_signal_graph()
for signal_item in _signal_graph.signals:
_connect_to_signal(signal_item)
EngineDebugger.send_message(
"signal_debugger:generated_graph",
[[_signal_graph.signals.map(func (item): return item.dictionary_representation), _signal_graph.edges.map(func (item): return item.dictionary_representation)]]
)
if message == "stop" and _signal_graph:
for signal_item in _signal_graph.signals:
_disconnect_from_signal(signal_item)
if message == "invoke_signal" and data.size() == 2:
var node_name = data[0]
var signal_name = data[1]
var root_node = get_tree().current_scene
var node = root_node if root_node.name == node_name else root_node.find_child(node_name)
if node:
var connection_list = node.get_signal_connection_list(signal_name)
for connection in connection_list:
var callable = connection["callable"]
var bound_args = callable.get_bound_arguments()
var bound_args_count = callable.get_bound_arguments_count()
var method = callable.get_method()
callable.callv([node])
return true
func _on_signal_execution(signal_name: String, node_name: String, args):
EngineDebugger.send_message(
"signal_debugger:signal_executed",
[Time.get_datetime_string_from_system(), node_name, signal_name]
)
# Methods
# |===================================|
# |===================================|
# |===================================|
func generate_signal_graph() -> SignalGraph:
var graph = SignalGraphUtility.create_signal_graph_from_node(get_tree().current_scene)
return graph
#var signal_graph = SignalGraph.new(get_tree().current_scene.name)
#var all_nodes: Array[Node] = _gather_nodes_in_scene()
#var signals: Array[SignalDescription] = []
#var edges: Array[SignalConnection] = []
#
#for node in all_nodes:
#for signal_item in node.get_signal_list():
#var existing_signals = []
#var connection_list = node.get_signal_connection_list(signal_item["name"] as String)
#if connection_list.size() > 0:
#for connection in connection_list:
#var should_display_connection = "name" in connection["callable"].get_object() and not connection["callable"].get_object().name.begins_with("@")
#if should_display_connection:
#var signal_description: SignalDescription
#var filtered_signals = existing_signals.filter(func (element): return element.signal_name == signal_item.name and element.node_name == node.name)
#if filtered_signals.size() == 1:
#signal_description = filtered_signals[0]
#else:
#signal_description = SignalDescription.new(node.name, signal_item.name)
#existing_signals.append(signal_description)
#signals.append(signal_description)
#
#var signal_edge = SignalConnection.new(signal_description.id, signal_description.node_name, connection["callable"].get_object().name, connection["callable"].get_method())
#if not signal_graph.edges.any(func (element): return element.signal_id == signal_description.id):
#edges.append(signal_edge)
#
#var temp_signals = {}
#for item in signals:
#temp_signals[item.id] = item
#
#var temp_edges = {}
#for item in edges:
#temp_edges[item.dictionary_key] = item
#
#signal_graph.signals.assign(temp_signals.keys().map(func (key): return temp_signals[key]))
#signal_graph.edges.assign(temp_edges.keys().map(func (key): return temp_edges[key]))
#
#return signal_graph
#func _gather_nodes_in_scene() -> Array[Node]:
#var scene_root = get_tree().current_scene
#var node_list: Array[Node] = [scene_root]
#return node_list + _gather_nodes_from_node(scene_root)
#
#func _gather_nodes_from_node(node: Node) -> Array[Node]:
#var nodes: Array[Node] = []
#for child in node.get_children(false):
#nodes.append(child)
#nodes += _gather_nodes_from_node(child)
#
#return nodes
func _connect_to_signal(signal_item: SignalDescription):
var root_node = get_tree().current_scene
var _execute: Callable = func (args = []): _on_signal_execution(signal_item.signal_name, signal_item.node_name, args)
if root_node.name == signal_item.node_name:
root_node.connect(signal_item.signal_name, _execute)
_lambda_map[signal_item] = _execute
else:
var child = root_node.find_child(signal_item.node_name)
if child:
child.connect(signal_item.signal_name, _execute)
_lambda_map[signal_item] = _execute
func _disconnect_from_signal(signal_item: SignalDescription):
var root_node = get_tree().current_scene
if root_node.name == signal_item.node_name:
var callable = _lambda_map[signal_item]
if callable:
root_node.disconnect(signal_item.signal_name, callable)
_lambda_map.erase(signal_item)
else:
var child = root_node.find_child(signal_item.node_name)
if child:
var callable = _lambda_map[signal_item]
if callable:
child.disconnect(signal_item.signal_name, callable)
_lambda_map.erase(signal_item)
@@ -0,0 +1 @@
uid://bmsqdh2cnmgw8
@@ -0,0 +1,97 @@
[gd_scene load_steps=5 format=3 uid="uid://cbsmvov8u78q"]
[ext_resource type="Script" path="res://addons/SignalVisualizer/Debugger/signal_debugger_panel.gd" id="1_66cpc"]
[ext_resource type="Texture2D" uid="uid://be3nwoioa311t" path="res://addons/SignalVisualizer/Play.svg" id="2_2wkuv"]
[ext_resource type="Texture2D" uid="uid://oo1oq2colx5b" path="res://addons/SignalVisualizer/Stop.svg" id="3_bg5eu"]
[ext_resource type="Texture2D" uid="uid://bmnff63evbdhv" path="res://addons/SignalVisualizer/Clear.svg" id="4_vg63r"]
[node name="SignalDebugger" type="Control"]
clip_contents = true
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_66cpc")
start_icon = ExtResource("2_2wkuv")
stop_icon = ExtResource("3_bg5eu")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
clip_contents = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
custom_minimum_size = Vector2(2.08165e-12, 50)
layout_mode = 2
theme_override_constants/separation = 8
[node name="ActionButton" type="Button" parent="VBoxContainer/HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
disabled = true
text = "Start"
icon = ExtResource("2_2wkuv")
[node name="ClearAllButton" type="Button" parent="VBoxContainer/HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Clear All"
icon = ExtResource("4_vg63r")
[node name="Spacer" type="Control" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="ClearLogsButton" type="Button" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2
text = "Clear Logs"
icon = ExtResource("4_vg63r")
[node name="HSplitContainer" type="HSplitContainer" parent="VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="SignalTree" type="Tree" parent="VBoxContainer/HSplitContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(250, 2.08165e-12)
layout_mode = 2
columns = 2
allow_reselect = true
allow_rmb_select = true
hide_root = true
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HSplitContainer"]
layout_mode = 2
[node name="TabBar" type="TabBar" parent="VBoxContainer/HSplitContainer/VBoxContainer"]
layout_mode = 2
tab_count = 2
tab_0/title = "Signal Log"
tab_1/title = "Signal Graph"
[node name="LogLabel" type="RichTextLabel" parent="VBoxContainer/HSplitContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_colors/default_color = Color(0.690196, 0.690196, 0.690196, 1)
bbcode_enabled = true
scroll_following = true
[node name="Graph" type="GraphEdit" parent="VBoxContainer/HSplitContainer/VBoxContainer"]
unique_name_in_owner = true
visible = false
layout_mode = 2
size_flags_vertical = 3
[connection signal="pressed" from="VBoxContainer/HBoxContainer/ActionButton" to="." method="_on_action_button_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/ClearAllButton" to="." method="_on_clear_all_button_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/ClearLogsButton" to="." method="_on_clear_logs_button_pressed"]
[connection signal="item_selected" from="VBoxContainer/HSplitContainer/SignalTree" to="." method="_on_signal_tree_item_selected"]
[connection signal="tab_changed" from="VBoxContainer/HSplitContainer/VBoxContainer/TabBar" to="." method="_on_tab_bar_tab_changed"]
@@ -0,0 +1,192 @@
@tool
class_name SignalDebuggerPanel extends Control
signal open_script(node_name: String, method_signature: String)
signal start_signal_debugging
signal stop_signal_debugging
var SignalGraphNode = preload("res://addons/SignalVisualizer/Visualizer/signal_graph_node.tscn")
var GraphNodeItem = preload("res://addons/SignalVisualizer/Visualizer/signal_graph_node_item.tscn")
const SOURCE_COLOR: Color = Color.SKY_BLUE
const DESTINATION_COLOR: Color = Color.CORAL
const CONNECTION_TYPE: int = 0
enum Tabs {
LOG,
GRAPH
}
# Properties
# |===================================|
# |===================================|
# |===================================|
@export var start_icon: Texture2D
@export var stop_icon: Texture2D
@onready var action_button: Button = %ActionButton
@onready var clear_all_button: Button = %ClearAllButton
@onready var signal_tree: Tree = %SignalTree
@onready var log_label: RichTextLabel = %LogLabel
@onready var graph_node: GraphEdit = %Graph
var is_started: bool = false :
get: return is_started
set(new_value):
is_started = new_value
_update_action_button()
var _signals: Array = []
var _signal_filter: Array = []
var _is_stack_trace_enabled: bool = false
var _debugger_tab_state: Tabs = Tabs.LOG
var _graph: SignalGraph
# Lifecycle
# |===================================|
# |===================================|
# |===================================|
func _ready():
disable()
_handle_tab_update(0)
# Signals
# |===================================|
# |===================================|
# |===================================|
func _on_action_button_pressed():
if is_started:
stop()
else:
start()
func _on_clear_all_button_pressed():
log_label.clear()
signal_tree.clear()
graph_node.clear_connections()
for child in graph_node.get_children():
if child is SignalGraphNode:
child.queue_free()
func _on_clear_logs_button_pressed():
log_label.clear()
func _on_signal_tree_item_selected():
# Updates the checkmark button
var selected_item = signal_tree.get_selected()
var is_checked = selected_item.is_checked(1)
selected_item.set_checked(1, (not is_checked))
# Add / Remove signal from filters
var selected_signal = _signals.filter(func (element): return element.signal_name == selected_item.get_text(0))[0]
if _signal_filter.has(selected_signal.signal_name):
var selected_index = _signal_filter.find(selected_signal.signal_name)
_signal_filter.remove_at(selected_index)
else:
_signal_filter.append(selected_signal.signal_name)
func _on_tab_bar_tab_changed(tab: int):
_handle_tab_update(tab)
func _on_stack_trace_button_pressed():
_is_stack_trace_enabled = not _is_stack_trace_enabled
func _on_open_signal_in_script(data: SignalGraphNodeItem.Metadata):
open_script.emit(data.node_name, data.method_signature)
# Methods
# |===================================|
# |===================================|
# |===================================|
func enable():
action_button.disabled = false
func disable():
action_button.disabled = true
func start():
if not is_started:
is_started = true
action_button.icon = stop_icon
start_signal_debugging.emit()
log_label.append_text("[color=#B0B0B0]Signal Debugging Started...[/color]")
log_label.newline()
log_label.newline()
func stop():
if is_started:
is_started = false
action_button.icon = start_icon
stop_signal_debugging.emit()
log_label.newline()
log_label.append_text("[color=#B0B0B0]Signal Debugging Stopped[/color]")
log_label.newline()
log_label.newline()
func create_tree_from_signals(signals: Array):
_signals = signals
var root = signal_tree.create_item()
root.set_text(0, "Signals")
var tree_items: Dictionary = {}
for signal_item in signals:
var node_tree_item: TreeItem
if tree_items.has(signal_item.node_name):
node_tree_item = tree_items[signal_item.node_name] as TreeItem
else:
node_tree_item = signal_tree.create_item(root)
node_tree_item.set_text(0, signal_item.node_name)
node_tree_item.set_selectable(0, false)
node_tree_item.set_selectable(1, false)
tree_items[signal_item.node_name] = node_tree_item
var signal_tree_item = signal_tree.create_item(node_tree_item)
signal_tree_item.set_text(0, signal_item.signal_name)
signal_tree_item.set_cell_mode(1, TreeItem.CELL_MODE_CHECK)
signal_tree_item.set_checked(1, true)
signal_tree_item.set_selectable(0, false)
signal_tree_item.set_selectable(1, true)
func create_signal_graph(signals: Array, edges: Array):
_graph = SignalGraphUtility.create_signal_graph(get_tree().edited_scene_root.scene_file_path, signals, edges)
SignalGraphUtility.generate_signal_graph_nodes(_graph, graph_node, _on_open_signal_in_script)
func log_signal_execution(time: String, node_name: String, signal_name: String):
if _signal_filter != null and _signal_filter.has(signal_name):
return
if not log_label.text.is_empty():
log_label.newline()
log_label.append_text(
"[color=#FFCC00]{time}[/color]\t\t{node_name}\t\t{signal_name}".format({ "time": time, "node_name": node_name, "signal_name": signal_name })
)
log_label.newline()
func _handle_tab_update(selected_tab_index: int):
match selected_tab_index:
1:
_debugger_tab_state = Tabs.GRAPH
_:
_debugger_tab_state = Tabs.LOG
match _debugger_tab_state:
Tabs.LOG:
log_label.show()
graph_node.hide()
Tabs.GRAPH:
log_label.hide()
graph_node.show()
func _update_action_button():
if is_started:
action_button.text = "Stop"
action_button.modulate = Color("#ff3b30")
else:
action_button.text = "Start"
action_button.modulate = Color.WHITE
@@ -0,0 +1 @@
uid://yg8cqm6f1prd
+1
View File
@@ -0,0 +1 @@
<svg height="24" width="24" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M11 1a1 1 0 0 0-1 1v3a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1zM6.732 5A2 2 0 0 1 7 6v1.117L9.268 6A2 2 0 0 1 9 5V3.883zM2 5a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1zm5 3.883V10a2 2 0 0 1-.268 1L9 12.117V11a2 2 0 0 1 .268-1zM11 10a1 1 0 0 0-1 1v3a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1z" fill="#8eef97"/></svg>

After

Width:  |  Height:  |  Size: 437 B

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bxj8ep08wbnm6"
path="res://.godot/imported/GraphEdit.svg-90dae61e8e0b157ab8eff95fe4b91e53.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/SignalVisualizer/GraphEdit.svg"
dest_files=["res://.godot/imported/GraphEdit.svg-90dae61e8e0b157ab8eff95fe4b91e53.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
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false
+1
View File
@@ -0,0 +1 @@
<svg height="24" viewBox="0 0 16 16" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M4 12a1 1 0 0 0 1.555.832l6-4a1 1 0 0 0 0-1.664l-6-4A1 1 0 0 0 4 4z" fill="#e0e0e0"/></svg>

After

Width:  |  Height:  |  Size: 184 B

+37
View File
@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://be3nwoioa311t"
path="res://.godot/imported/Play.svg-a446691ffcef211028bb160b5a2d6ff1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/SignalVisualizer/Play.svg"
dest_files=["res://.godot/imported/Play.svg-a446691ffcef211028bb160b5a2d6ff1.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
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false
+162
View File
@@ -0,0 +1,162 @@
@tool
extends EditorPlugin
class SignalDebuggerPlugin extends EditorDebuggerPlugin:
var SignalDebuggerPanelScene = preload("res://addons/SignalVisualizer/Debugger/SignalDebugger.tscn")
signal open_script
signal start_signal_debugging
signal stop_signal_debugging
var debugger_panel
func _has_capture(prefix) -> bool:
return prefix == "signal_debugger"
func _capture(message, data, session_id) -> bool:
if message == "signal_debugger:signal_executed":
if data.size() == 3:
var time = data[0]
var node_name = data[1]
var signal_name = data[2]
debugger_panel.log_signal_execution(time, node_name, signal_name)
return true
if message == "signal_debugger:generated_graph":
if data.size() == 1:
var signals = data[0][0] as Array
var edges = data[0][1] as Array
debugger_panel.create_tree_from_signals(signals)
debugger_panel.create_signal_graph(signals, edges)
return true
return false
func _setup_session(session_id):
debugger_panel = SignalDebuggerPanelScene.instantiate()
var session = get_session(session_id)
debugger_panel.name = "Signal Debugger"
debugger_panel.open_script.connect(func (arg1, arg2): open_script.emit(arg1, arg2))
debugger_panel.start_signal_debugging.connect(func (): start_signal_debugging.emit())
debugger_panel.stop_signal_debugging.connect(func (): stop_signal_debugging.emit())
session.started.connect(
func ():
debugger_panel.enable()
)
session.stopped.connect(
func ():
debugger_panel.stop()
debugger_panel.disable()
stop_signal_debugging.emit()
)
session.add_session_tab(debugger_panel)
var SignalVisualizerDockScene = preload("res://addons/SignalVisualizer/Visualizer/signal_visualizer_dock.tscn")
class ScriptMethodReference:
var script_reference: Script
var line_number: int
# Properties
# |===================================|
# |===================================|
# |===================================|
var dock: Control
var debugger: SignalDebuggerPlugin
# Lifecycle
# |===================================|
# |===================================|
# |===================================|
func _enter_tree():
dock = SignalVisualizerDockScene.instantiate()
debugger = SignalDebuggerPlugin.new()
dock.open_script.connect(_on_open_signal_in_script)
add_control_to_bottom_panel(dock, "Signal Visualizer")
debugger.start_signal_debugging.connect(_on_debugger_start_signal_debugging)
debugger.stop_signal_debugging.connect(_on_debugger_stop_signal_debugging)
debugger.open_script.connect(_on_open_signal_in_script)
add_debugger_plugin(debugger)
if not ProjectSettings.has_setting("autoload/Signal_Debugger"):
add_autoload_singleton("Signal_Debugger", "res://addons/SignalVisualizer/Debugger/SignalDebugger.gd")
func _exit_tree():
remove_control_from_bottom_panel(dock)
dock.free()
remove_debugger_plugin(debugger)
remove_autoload_singleton("Signal_Debugger")
# Signals
# |===================================|
# |===================================|
# |===================================|
func _on_open_signal_in_script(node_name: String, method_signature: String):
var node: Node
if get_tree().edited_scene_root.name == node_name:
node = get_tree().edited_scene_root
else:
node = get_tree().edited_scene_root.find_child(node_name)
if node != null:
var script: Script = node.get_script()
if script != null:
var editor = get_editor_interface()
var method_reference = _find_method_reference_in_script(script, method_signature)
if method_reference != null:
editor.edit_script(method_reference.script_reference, method_reference.line_number, 0)
editor.set_main_screen_editor("Script")
else:
push_warning("Requested method in script ({script}) for node ({name}) is not available.".format({ "name": node_name, "script": script.name }))
else:
push_warning("Requested script for node ({name}) is not available.".format({ "name": node_name }))
else:
push_warning("Requested script for node ({name}) is not available.".format({ "name": node_name }))
func _on_debugger_start_signal_debugging():
for session in debugger.get_sessions():
session.send_message("signal_debugger:start", [])
func _on_debugger_stop_signal_debugging():
for session in debugger.get_sessions():
session.send_message("signal_debugger:stop", [])
# Methods
# |===================================|
# |===================================|
# |===================================|
func _find_method_reference_in_script(script: Script, method_signature: String) -> ScriptMethodReference:
var line_number = __find_method_line_number_in_script(script, method_signature)
if line_number == -1:
var base_script = script.get_base_script()
if base_script:
return _find_method_reference_in_script(base_script, method_signature)
var reference = ScriptMethodReference.new()
reference.script_reference = script
reference.line_number = line_number
return reference
func __find_method_line_number_in_script(script: Script, method_signature: String) -> int:
var line_number = 0
var found = false
for line in script.source_code.split("\n", true):
line_number += 1
if line.contains(method_signature):
found = true
return line_number
return -1
@@ -0,0 +1 @@
uid://43lcsn3nt3ri
+1
View File
@@ -0,0 +1 @@
<svg height="24" viewBox="0 0 16 16" width="24" xmlns="http://www.w3.org/2000/svg"><rect x="3" y="3" height="10" width="10" rx="1" fill="#e0e0e0"/></svg>

After

Width:  |  Height:  |  Size: 154 B

+37
View File
@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://oo1oq2colx5b"
path="res://.godot/imported/Stop.svg-e085086fb31c334bc2f02ca2bffba522.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/SignalVisualizer/Stop.svg"
dest_files=["res://.godot/imported/Stop.svg-e085086fb31c334bc2f02ca2bffba522.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
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false
@@ -0,0 +1,31 @@
@tool
extends Label
# Properties
# |===================================|
# |===================================|
# |===================================|
# Lifecycle
# |===================================|
# |===================================|
# |===================================|
# Signals
# |===================================|
# |===================================|
# |===================================|
# Methods
# |===================================|
# |===================================|
# |===================================|
func get_text_size() -> Vector2:
return get_theme_default_font().get_string_size(text)
@@ -0,0 +1 @@
uid://d3lyqancfvwup
@@ -0,0 +1,94 @@
@tool
class_name SignalGraphNode extends GraphNode
# Properties
# |===================================|
# |===================================|
# |===================================|
var connections: Array = [] :
get: return connections
set(new_value):
connections = new_value
# Lifecycle
# |===================================|
# |===================================|
# |===================================|
func _ready():
selectable = true
resizable = true
draggable = true
# Signals
# |===================================|
# |===================================|
# |===================================|
func _on_resize_request(new_minsize):
size = new_minsize
# Methods
# |===================================|
# |===================================|
# |===================================|
func has_source_signal_description(signal_name: String, destination_node_name: String) -> bool:
for child in get_children():
if child.name == "source_" + signal_name + "_" + destination_node_name:
return true
return false
func get_source_slot(signal_name: String, destination_node_name: String) -> int:
var index = 0
for child in get_children():
if child.name == "source_" + signal_name + "_" + destination_node_name:
return index
index += 1
return -1
func get_next_source_slot(signal_name: String, destination_node_name: String) -> int:
var index = 0
for child in get_children():
if child.name.begins_with("source_"):
if child.name == "source_" + signal_name + "_" + destination_node_name:
return index
index += 1
return -1
func has_destination_signal_description(signal_name: String, method_signature: String) -> bool:
for child in get_children():
if child.name == "destination_" + signal_name + "_" + _sanitize_method_signature(method_signature):
return true
return false
func get_destination_slot(signal_name: String, method_signature: String) -> int:
var index = 0
for child in get_children():
if child.name == "destination_" + signal_name + "_" + _sanitize_method_signature(method_signature):
return index
index += 1
return -1
func get_next_destination_slot(signal_name: String, method_signature: String) -> int:
var index = 0
for child in get_children():
if child.name.begins_with("destination_"):
if child.name == "destination_" + signal_name + "_" + _sanitize_method_signature(method_signature):
return index
index += 1
return -1
func _sanitize_method_signature(signature: String) -> String:
return signature.replace("::", "__")
@@ -0,0 +1 @@
uid://bdwkkgkhgfrtk
@@ -0,0 +1,12 @@
[gd_scene load_steps=2 format=3 uid="uid://cq10iaub18e54"]
[ext_resource type="Script" path="res://addons/SignalVisualizer/Visualizer/signal_graph_node.gd" id="1_ovklj"]
[node name="SignalGraphNode" type="GraphNode"]
custom_minimum_size = Vector2(100, 50)
offset_right = 232.0
offset_bottom = 54.0
resizable = true
script = ExtResource("1_ovklj")
[connection signal="resize_request" from="." to="." method="_on_resize_request"]
@@ -0,0 +1,57 @@
@tool
class_name SignalGraphNodeItem extends Control
signal open_script(metadata: SignalGraphNodeItem.Metadata)
class Metadata:
var signal_name: String
var method_signature: String
var node_name: String
func _init(signal_name: String, method_signature: String, node_name: String):
self.signal_name = signal_name
self.method_signature = method_signature
self.node_name = node_name
# Properties
# |===================================|
# |===================================|
# |===================================|
@onready var label: Label = %DescriptionLabel
var signal_data: Metadata = null
var text: String = "" :
get: return text
set(new_value):
text = new_value
if label:
label.text = text
# Lifecycle
# |===================================|
# |===================================|
# |===================================|
func _ready():
_update()
# Signals
# |===================================|
# |===================================|
# |===================================|
func _on_open_signal_in_script_button_pressed():
open_script.emit(signal_data)
# Methods
# |===================================|
# |===================================|
# |===================================|
func _update():
label.text = text
var text_size = label.get_text_size()
custom_minimum_size = Vector2((text_size.x * 2) + 50, text_size.y * 3)
@@ -0,0 +1 @@
uid://c0n3sifmbiih0
@@ -0,0 +1,43 @@
[gd_scene load_steps=3 format=3 uid="uid://b2lwtwp6kpwtb"]
[ext_resource type="Script" path="res://addons/SignalVisualizer/Visualizer/signal_graph_node_item.gd" id="1_jrd34"]
[ext_resource type="Script" path="res://addons/SignalVisualizer/Visualizer/resizable_label.gd" id="2_4wwd5"]
[node name="SignalItem" type="Control"]
clip_contents = true
custom_minimum_size = Vector2(51, 23)
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_jrd34")
[node name="HBoxContainer" type="HBoxContainer" parent="."]
custom_minimum_size = Vector2(100, 50)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="DescriptionLabel" type="Label" parent="HBoxContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(100, 50)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 1
vertical_alignment = 1
clip_text = true
script = ExtResource("2_4wwd5")
[node name="OpenSignalInScriptButton" type="Button" parent="HBoxContainer"]
layout_mode = 2
text = "Open"
flat = true
[connection signal="pressed" from="HBoxContainer/OpenSignalInScriptButton" to="." method="_on_open_signal_in_script_button_pressed"]
@@ -0,0 +1,67 @@
@tool
extends Control
signal open_script(node_name: String, method_signature: String)
var SignalGraphNode = preload("res://addons/SignalVisualizer/Visualizer/signal_graph_node.tscn")
var GraphNodeItem = preload("res://addons/SignalVisualizer/Visualizer/signal_graph_node_item.tscn")
# Properties
# |===================================|
# |===================================|
# |===================================|
const SOURCE_COLOR: Color = Color.SKY_BLUE
const DESTINATION_COLOR: Color = Color.CORAL
const CONNECTION_TYPE: int = 0
@onready var arrange_nodes_checkbox: CheckBox = %ArrangeNodesCheckBox
@onready var signal_details_checkbox: CheckBox = %SignalDetailsCheckBox
@onready var signal_tree: Tree = %SignalTree
@onready var graph: GraphEdit = %Graph
# Lifecycle
# |===================================|
# |===================================|
# |===================================|
# Signals
# |===================================|
# |===================================|
# |===================================|
func _on_clear_graph_button_pressed():
clear()
func _on_generate_graph_button_pressed():
clear()
var scene_signal_graph = SignalGraphUtility.create_signal_graph_from_node(get_tree().edited_scene_root, true)
SignalGraphUtility.generate_signal_graph_nodes(scene_signal_graph, graph, _on_open_signal_in_script)
SignalGraphUtility.generate_signal_graph_tree(scene_signal_graph, signal_tree)
if arrange_nodes_checkbox.button_pressed:
graph.arrange_nodes()
func _on_open_signal_in_script(data: SignalGraphNodeItem.Metadata):
open_script.emit(data.node_name, data.method_signature)
# Methods
# |===================================|
# |===================================|
# |===================================|
func clear():
_clear_graph_nodes()
_clear_tree()
func _clear_graph_nodes():
graph.clear_connections()
for child in graph.get_children():
if child is SignalGraphNode:
child.queue_free()
func _clear_tree():
signal_tree.clear()
@@ -0,0 +1 @@
uid://bbd48wbihmuos
@@ -0,0 +1,78 @@
[gd_scene load_steps=5 format=3 uid="uid://dppfamjc0ji40"]
[ext_resource type="Script" path="res://addons/SignalVisualizer/Visualizer/signal_visualizer_dock.gd" id="1_akar5"]
[ext_resource type="Texture2D" uid="uid://bmnff63evbdhv" path="res://addons/SignalVisualizer/Clear.svg" id="2_m8bsv"]
[ext_resource type="Texture2D" uid="uid://bxj8ep08wbnm6" path="res://addons/SignalVisualizer/GraphEdit.svg" id="3_dtmqs"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ae0jg"]
[node name="SignalVisualizerDock" type="Control"]
clip_contents = true
custom_minimum_size = Vector2(2.08165e-12, 200)
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_akar5")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
clip_contents = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
clip_contents = true
custom_minimum_size = Vector2(2.08165e-12, 50)
layout_mode = 2
theme_override_constants/separation = 8
alignment = 2
[node name="ArrangeNodesCheckBox" type="CheckBox" parent="VBoxContainer/HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Arrange Nodes"
[node name="SignalDetailsCheckBox" type="CheckBox" parent="VBoxContainer/HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Signal Details"
[node name="Panel" type="Panel" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_styles/panel = SubResource("StyleBoxEmpty_ae0jg")
[node name="ClearGraphButton" type="Button" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2
text = "Clear Graph"
icon = ExtResource("2_m8bsv")
[node name="GenerateGraphButton" type="Button" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2
text = "Generate Graph"
icon = ExtResource("3_dtmqs")
[node name="HSplitContainer" type="HSplitContainer" parent="VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="SignalTree" type="Tree" parent="VBoxContainer/HSplitContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(200, 2.08165e-12)
layout_mode = 2
column_titles_visible = true
[node name="Graph" type="GraphEdit" parent="VBoxContainer/HSplitContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_vertical = 3
[connection signal="pressed" from="VBoxContainer/HBoxContainer/ClearGraphButton" to="." method="_on_clear_graph_button_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/GenerateGraphButton" to="." method="_on_generate_graph_button_pressed"]
+7
View File
@@ -0,0 +1,7 @@
[plugin]
name="SignalVisualizer"
description="Visual the current scene's signal connections as a graph. Debug the current running scene's signals with automatic logging in a new debugger panel."
author="MiniGameDev"
version="1.7.0"
script="SignalVisualizer.gd"
@@ -21,5 +21,5 @@ anchor_bottom = 1.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
mouse_filter = 2 mouse_filter = 2
color = Color(1, 1, 1, 0) color = Color(0, 0, 0, 0.658824)
script = ExtResource("2_ghan2") script = ExtResource("2_ghan2")
@@ -10,3 +10,4 @@ corner_radius_top_left = 5
corner_radius_top_right = 5 corner_radius_top_right = 5
corner_radius_bottom_right = 5 corner_radius_bottom_right = 5
corner_radius_bottom_left = 5 corner_radius_bottom_left = 5
shadow_color = Color(0, 0, 0, 0.772549)
Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://hvchk6t0xe7j"
path="res://.godot/imported/Ente.png-21ead71377d82aa0401b2345b9713a4b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/animals/Ente.png"
dest_files=["res://.godot/imported/Ente.png-21ead71377d82aa0401b2345b9713a4b.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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c4q12jiligcl7"
path="res://.godot/imported/katze.png-0faf4775b24cd38949e4c4160b5ed047.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/animals/katze.png"
dest_files=["res://.godot/imported/katze.png-0faf4775b24cd38949e4c4160b5ed047.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: 1.5 MiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bexymddkb6l0o"
path="res://.godot/imported/mavkha.png-ab393dd20d4b3f3a305dd600f518b5fe.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/characters/Mavka/mavkha.png"
dest_files=["res://.godot/imported/mavkha.png-ab393dd20d4b3f3a305dd600f518b5fe.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: 476 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bgba1uv0muxat"
path="res://.godot/imported/chugeist_tmp.png-ff2e3a6be0ff4b186834b14d159443da.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/characters/chugeist_tmp.png"
dest_files=["res://.godot/imported/chugeist_tmp.png-ff2e3a6be0ff4b186834b14d159443da.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: 266 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://65e44yde224q"
path="res://.godot/imported/Babushka_house_01.png-2abdaa4b7145961a1de62ba9271ec19d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/farm/Babushka_house_01.png"
dest_files=["res://.godot/imported/Babushka_house_01.png-2abdaa4b7145961a1de62ba9271ec19d.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: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://blb3agipyxnal"
path="res://.godot/imported/fence_door.png-19eb021073131bf04d1c242c32b3c026.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/farm/farming/farmobjekte/zaun/fence_door.png"
dest_files=["res://.godot/imported/fence_door.png-19eb021073131bf04d1c242c32b3c026.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.
@@ -0,0 +1,35 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://bgmdn7uo215q2"
path="res://.godot/imported/RuslanDisplay-Regular.ttf-b21277db87f732a1d4e67ed29c642ff3.fontdata"
[deps]
source_file="res://art/fonts/RuslanDisplay-Regular.ttf"
dest_files=["res://.godot/imported/RuslanDisplay-Regular.ttf-b21277db87f732a1d4e67ed29c642ff3.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=4
keep_rounding_remainders=true
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}
Binary file not shown.

After

Width:  |  Height:  |  Size: 739 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cugtxcfuds31r"
path="res://.godot/imported/Babushka_bg_01.png-0c232a7f5bf4d34c794d027da500ca6b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/indoor/Babushka_bg_01.png"
dest_files=["res://.godot/imported/Babushka_bg_01.png-0c232a7f5bf4d34c794d027da500ca6b.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: 852 KiB

After

Width:  |  Height:  |  Size: 299 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 852 KiB

+102
View File
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 5687 1551" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,1,-2967,0)">
<g id="Cozy-Raven-Logo-breit" serif:id="Cozy Raven Logo breit" transform="matrix(2.29248,0,0,0.625226,2967.64,0)">
<rect x="0" y="0" width="2480.32" height="2480.32" style="fill:none;"/>
<g transform="matrix(0.436208,0,0,1.59942,166.053,-1670.67)">
<g transform="matrix(0.206025,0,0,0.289757,-1186.1,-352.084)">
<g id="rabe" transform="matrix(11.4916,0,0,8.17082,3293.63,-8360.45)">
<g transform="matrix(0.44279,0,0,0.44279,-2784.62,911.446)">
<path d="M9093.2,2236.52L9115.98,2240.43C9167.2,2253.76 9168.8,2284.95 9189.66,2329.1C9138.91,2343.37 9117.71,2368.99 9109.42,2396.97C9107.81,2402.4 9106.69,2407.91 9105.93,2413.44C9104.99,2417.49 9104.54,2421.39 9104.58,2425.14C9104.48,2429.06 9104.51,2443.26 9104.58,2462.99C9104.58,2511.29 9104.59,2574.25 9104.6,2636.4C9103.54,2634.38 9102.52,2632.31 9101.55,2630.19C9099.08,2624.78 9096.93,2619.01 9095.19,2612.78C9091.98,2600.57 9090.17,2586.65 9090.2,2573.24C9090.38,2508.74 9096.85,2433.25 8986.93,2406.91C8989.55,2405.7 8992.14,2404.43 8994.7,2403.13C9011.35,2394.63 9026.82,2384.15 9040.81,2372C9055.93,2358.87 9069.32,2343.78 9080.57,2327.14C9085.77,2319.44 9090.52,2311.41 9094.78,2303.08C9093.73,2300.03 9092.69,2296.57 9091.67,2292.52C9087.98,2277.85 9087.23,2256.61 9087.4,2239.07C9089.31,2238.28 9091.25,2237.43 9093.2,2236.52Z" style="fill:rgb(242,135,183);"/>
</g>
<g id="Tasse">
<g transform="matrix(0.44279,0,0,0.44279,-1189.24,911.446)">
<path d="M5586.66,2329.1C5613.12,2321.66 5647.62,2317.3 5692.51,2317.3C5819.54,2317.3 5874.08,2340.4 5893.03,2392.34C5897.93,2405.8 5900.45,2421.19 5901.22,2438.61L5901.25,2475.31C6048.49,2529.94 5987.72,2703.16 5901.44,2733.12L5901.48,2793.24C5901.52,2845.18 5862.12,2888.66 5810.44,2893.73C5735.82,2901.17 5659.53,2899.87 5581.53,2889.53C5568.38,2887.82 5556.18,2883.38 5545.48,2876.82C5552.57,2868.87 5558.27,2860.45 5562.81,2851.86C5586.85,2806.44 5578.83,2756.42 5576.47,2748.78C5560.49,2697.11 5522.49,2676.14 5501.59,2636.4C5501.58,2574.25 5501.57,2511.29 5501.57,2462.99L5501.57,2433.06C5501.65,2426.56 5502.03,2419.99 5502.93,2413.44C5503.69,2407.91 5504.81,2402.4 5506.41,2396.97C5514.7,2368.99 5535.91,2343.37 5586.66,2329.1ZM5692.88,2437.58C5622.87,2439.34 5553.73,2427.99 5545.97,2392.92C5538.69,2360.07 5581.36,2345.57 5628.34,2339.39L5705.61,2335.1C5721.88,2335.16 5733.77,2335.7 5737.28,2335.86C5740.73,2336.15 5860.41,2329.11 5846.43,2400.22C5842.92,2418.11 5774.35,2434.11 5703.54,2437.21C5706.38,2492.15 5706.65,2510.71 5702.06,2581.99C5726.51,2578.57 5750.55,2577.23 5762.55,2582.38C5776.99,2588.58 5776.71,2737.16 5775.69,2739.33C5775.22,2740.31 5645.24,2755.2 5636.28,2738.1C5623.36,2713.44 5628.31,2650.92 5629.36,2596.55C5634.69,2595.22 5662.12,2588.36 5691.39,2583.61C5691.33,2583.23 5691.32,2582.84 5691.34,2582.44C5695.97,2510.77 5695.71,2492.49 5692.88,2437.62C5692.88,2437.61 5692.88,2437.59 5692.88,2437.58ZM5901.3,2546.46L5901.39,2659.7C5910.03,2651.39 5917.71,2642.46 5922,2632.7C5947.15,2575.5 5919.22,2554.13 5901.3,2546.46Z" style="fill:rgb(64,41,123);"/>
</g>
<g transform="matrix(0.489303,0,0,0.489303,-1454.2,806.259)">
<path d="M5693.21,2420.84C5629.85,2422.43 5567.29,2412.16 5560.26,2380.42C5553.68,2350.69 5592.29,2337.57 5634.8,2331.99L5704.73,2328.1C5719.46,2328.15 5730.22,2328.64 5733.39,2328.79C5736.51,2329.05 5844.82,2322.68 5832.17,2387.03C5828.98,2403.22 5766.94,2417.69 5702.86,2420.51C5702.85,2420.46 5702.85,2420.42 5702.85,2420.38C5702.71,2417.72 5700.44,2415.67 5697.78,2415.81C5695.13,2415.94 5693.09,2418.19 5693.21,2420.84Z" style="fill:rgb(41,39,83);"/>
</g>
</g>
<g transform="matrix(0.44279,0,0,0.44279,-1189.24,911.446)">
<path d="M5545.48,2876.82C5534.85,2888.72 5521.08,2899.53 5503.3,2908.2C5360.7,2977.71 5254.29,2939.17 5207.49,2928.16C5089.61,2970.2 4942.84,2958.57 4877.96,2883.54C4743.74,2728.31 4893.53,2543.12 4902.3,2526.15C4972.1,2391.04 4822.28,2286.46 5030.99,2142.75C5024.02,2151.03 5017.67,2162.31 5022.02,2173.08C5028.66,2189.52 5045.73,2184.78 5060.02,2179.45C5063.64,2178.1 5067.08,2176.71 5070.12,2175.62C5066.04,2181.56 5062.37,2186.89 5059.3,2191.75C5046.79,2211.55 5044.04,2223.78 5062.64,2239.08C5081.51,2346.37 5175.26,2428 5287.92,2428C5313.26,2428 5337.63,2423.87 5360.41,2416.25C5368.46,2413.56 5376.3,2410.44 5383.92,2406.91C5493.84,2433.25 5487.37,2508.74 5487.2,2573.24C5487.15,2588.41 5488.99,2601.37 5492.18,2612.78C5494.59,2621.93 5497.79,2630.12 5501.59,2636.4C5522.49,2676.14 5560.49,2697.11 5576.47,2748.78C5578.83,2756.42 5586.85,2806.44 5562.81,2851.86C5558.27,2860.45 5552.57,2868.87 5545.48,2876.82Z" style="fill:rgb(247,183,211);"/>
</g>
<g transform="matrix(0.44279,0,0,0.44279,-1189.24,911.446)">
<path d="M5501.59,2636.4C5497.79,2630.12 5494.59,2621.93 5492.18,2612.78C5493.93,2619.01 5496.07,2624.78 5498.55,2630.19C5499.51,2632.31 5500.53,2634.38 5501.59,2636.4Z" style="fill:rgb(247,183,211);"/>
</g>
<g id="Kopf">
<g transform="matrix(0.44279,0,0,0.44279,-2784.62,911.446)">
<path d="M8634,2142.75C8639.51,2136.21 8645.4,2131.55 8646.73,2130.51L8648.09,2128.55C8660.73,2114.49 8677.4,2100.8 8690.01,2089.88C8696.11,2084.6 8701.27,2079.96 8704.55,2076.25C8702.07,2076.59 8699.75,2076.84 8697.58,2077.02C8668.48,2079.43 8666.21,2068.32 8663.7,2063.84C8662.94,2062.49 8660.74,2050.62 8695.41,2034.55C8719.86,2023.23 8742.36,2016.15 8759.96,2011.72C8780.33,2006.6 8794.16,2005.03 8796.91,2004.52L8796.95,2003.86C8791.7,2000.81 8792.22,2000.17 8786.72,1997.9C8786.3,1997.73 8785.45,1997.38 8784.32,1996.84C8778.66,1994.17 8765.84,1986.84 8763.93,1973.78C8761.04,1954.09 8829.52,1951.68 8852.1,1954.24C8875.33,1956.87 8874.69,1960.25 8902.35,1962.91C8863.96,1922.8 8881.86,1915.36 8885.88,1915.41C8908.45,1915.73 8950.69,1953.98 8958.87,1959.54C8962.77,1962.19 8963.58,1960.59 9000.24,1980.31C9014.56,1988.02 9040.2,1995.42 9071.78,2057.28C9039.59,2060.12 8999.68,2078.14 8951.13,2124.98C8920.24,2154.79 8935.43,2160.47 8937.01,2203.49C8985,2231.95 9028.37,2263.39 9087.4,2239.07C9087.23,2256.61 9087.98,2277.85 9091.67,2292.52C9092.69,2296.57 9093.73,2300.03 9094.78,2303.08C9090.52,2311.41 9085.77,2319.44 9080.57,2327.14C9069.32,2343.78 9055.93,2358.87 9040.81,2372C9026.82,2384.15 9011.35,2394.63 8994.7,2403.13C8992.14,2404.43 8989.55,2405.7 8986.93,2406.91C8979.31,2410.44 8971.46,2413.56 8963.42,2416.25C8940.64,2423.87 8916.26,2428 8890.93,2428C8778.27,2428 8684.52,2346.37 8665.64,2239.08C8647.05,2223.78 8649.8,2211.55 8662.3,2191.75C8665.38,2186.89 8669.05,2181.56 8673.13,2175.62C8670.09,2176.71 8666.65,2178.1 8663.03,2179.45C8648.74,2184.78 8631.66,2189.52 8625.02,2173.08C8620.67,2162.31 8627.02,2151.03 8634,2142.75ZM8810.9,2143.97C8813.04,2149.66 8809.97,2157.32 8804.34,2159.62C8779.35,2169.86 8765.58,2085.96 8826.5,2071.15C8913.02,2050.11 8909.28,2172.06 8878.18,2145.57C8868.9,2137.66 8882.59,2095.39 8849.06,2093.16C8815.2,2090.91 8800.55,2116.5 8810.9,2143.97ZM8851.47,2202C8850.75,2201.13 8844.88,2195.36 8837.84,2194.64C8829.2,2193.76 8823.67,2198.88 8823.2,2199.12C8821.91,2197.88 8815.31,2191.23 8810.74,2189.4C8806.16,2187.57 8797.65,2187.93 8795.76,2188.14C8791.75,2183.81 8788.72,2181.5 8785.51,2179.95C8781.01,2177.77 8775.69,2177.22 8763.45,2176.61C8755.84,2176.23 8749.36,2182.1 8748.98,2189.71C8748.59,2197.32 8754.47,2203.8 8762.07,2204.18C8767.3,2204.45 8772.28,2204.81 8773.49,2204.9C8774.02,2205.41 8777.98,2211.27 8783.93,2213.69C8789.62,2216 8798.38,2215.66 8800.35,2215.43C8803.84,2218.87 8811.62,2227.47 8819.92,2227.62C8824.8,2227.7 8828.12,2227.36 8834.21,2224.48C8834.48,2224.8 8840.76,2233.51 8850.3,2233.41C8859.4,2233.32 8865.18,2228.58 8871.14,2221.37C8876,2215.5 8876.48,2207.22 8871.08,2201.85C8865.67,2196.48 8856.92,2196.51 8851.55,2201.91L8851.47,2202Z" style="fill:rgb(64,41,123);"/>
</g>
<g transform="matrix(-0.764042,-0.00207054,-0.00207054,0.764042,1545.62,1586.69)">
<path d="M536.732,393.815C537.15,393.314 540.56,389.977 544.641,389.572C549.649,389.074 552.846,392.051 553.117,392.189C553.867,391.472 557.704,387.629 560.358,386.576C563.012,385.524 567.942,385.745 569.041,385.874C571.371,383.369 573.131,382.034 574.994,381.14C577.605,379.887 580.684,379.575 587.781,379.24C592.191,379.031 595.941,382.443 596.149,386.853C596.358,391.264 592.946,395.014 588.536,395.222C585.505,395.365 582.621,395.568 581.916,395.619C581.61,395.915 579.304,399.304 575.853,400.696C572.553,402.028 567.478,401.813 566.333,401.679C564.311,403.667 559.787,408.641 554.975,408.712C552.149,408.754 550.222,408.552 546.698,406.874C546.543,407.057 542.886,412.095 537.361,412.022C532.088,411.953 528.743,409.197 525.301,405.01C522.497,401.599 522.229,396.799 525.37,393.696C528.511,390.593 533.581,390.624 536.683,393.766L536.732,393.815Z" style="fill:rgb(242,135,183);"/>
</g>
<g transform="matrix(0.801288,0.0280515,-0.0280515,0.801288,291.021,326.878)">
<path d="M1096.18,1875.91C1097.48,1879.01 1095.93,1883.3 1092.87,1884.68C1079.27,1890.81 1070.05,1844.77 1103.39,1835.42C1150.74,1822.14 1151.02,1889.52 1133.35,1875.5C1128.07,1871.31 1134.81,1847.72 1116.26,1847.14C1097.53,1846.55 1089.94,1860.95 1096.18,1875.91Z" style="fill:rgb(247,183,211);"/>
</g>
<g transform="matrix(0.632697,0,0,0.594867,-2235.6,594.043)">
<g transform="matrix(0.845639,0,0,0.899416,890.266,150.218)">
<path d="M5441.99,2268.76C5390.67,2271.13 5379.45,2270.73 5337.65,2239.18C5373.06,2221.12 5381.6,2218.77 5417.32,2185.65C5418.86,2184.22 5420.44,2182.74 5422.08,2181.2C5435.24,2168.84 5469.33,2167.8 5491.89,2168.6C5458.33,2189.75 5456.66,2203.69 5433.66,2219.17C5453.07,2237.82 5454.18,2243.09 5463.35,2267.79C5455.51,2268.12 5448.43,2268.46 5441.99,2268.76Z" style="fill:rgb(255,137,0);"/>
</g>
<g transform="matrix(0.845639,0,0,0.899416,890.266,150.218)">
<path d="M5441.76,2279.26C5392.91,2299.39 5357.01,2273.37 5317.3,2249.81C5315.99,2214.21 5303.42,2209.51 5328.98,2184.84C5369.16,2146.07 5402.2,2131.16 5428.83,2128.81C5473.76,2124.85 5500.48,2156.63 5512.57,2169.96C5510.28,2169.74 5502.32,2168.97 5491.89,2168.6C5469.33,2167.8 5435.24,2168.84 5422.08,2181.2C5420.44,2182.74 5418.86,2184.22 5417.32,2185.65C5381.6,2218.77 5373.06,2221.12 5337.65,2239.18C5379.45,2270.73 5390.67,2271.13 5441.99,2268.76C5448.43,2268.46 5455.51,2268.12 5463.35,2267.79C5457.58,2271.52 5451.99,2274.62 5446.56,2277.15C5444.95,2277.91 5443.34,2278.61 5441.76,2279.26Z" style="fill:rgb(255,205,0);"/>
</g>
</g>
</g>
<g id="Etikett">
<g transform="matrix(0.44279,0,0,0.44279,-1189.24,911.446)">
<path d="M5702.06,2581.99C5726.51,2578.57 5750.55,2577.23 5762.55,2582.38C5776.99,2588.58 5776.71,2737.16 5775.69,2739.33C5775.22,2740.31 5645.24,2755.2 5636.28,2738.1C5623.36,2713.44 5628.31,2650.92 5629.36,2596.55C5634.69,2595.22 5662.12,2588.36 5691.39,2583.61C5691.77,2586.02 5693.78,2587.94 5696.32,2588.11C5699.26,2588.3 5701.8,2586.06 5701.98,2583.13C5702.01,2582.75 5702.03,2582.37 5702.06,2581.99ZM5652.42,2670.94C5641.83,2660.2 5641.95,2642.88 5652.69,2632.29C5663.43,2621.7 5680.75,2621.81 5691.34,2632.55L5697.65,2638.94L5705.75,2627.84C5714.64,2615.65 5731.76,2612.98 5743.94,2621.87C5756.13,2630.77 5758.8,2647.88 5749.91,2660.07L5707.91,2717.61C5706.91,2718.98 5705.35,2719.85 5703.65,2719.97C5701.96,2720.1 5700.29,2719.47 5699.09,2718.26L5652.42,2670.94Z" style="fill:rgb(255,205,0);"/>
</g>
<g transform="matrix(1,0,0,1.11432,0,-234.945)">
<path d="M1331.5,1997.38C1331.45,1996.22 1332.45,1995.23 1333.74,1995.17C1335.04,1995.11 1336.15,1996.01 1336.22,1997.17C1336.22,1997.19 1336.22,1997.21 1336.23,1997.23C1335.17,1997.27 1334.11,1997.31 1333.05,1997.34C1332.53,1997.35 1332.02,1997.37 1331.5,1997.38Z" style="fill:rgb(255,205,0);"/>
</g>
<g transform="matrix(1,0,0,1.11432,0,-234.945)">
<path d="M1330.85,2055.41C1331.62,2055.29 1332.4,2055.18 1333.18,2055.08C1333.98,2054.97 1334.77,2054.86 1335.57,2054.76C1335.56,2054.91 1335.55,2055.06 1335.54,2055.21C1335.45,2056.38 1334.33,2057.27 1333.03,2057.19C1331.9,2057.13 1331.02,2056.36 1330.85,2055.41Z" style="fill:rgb(255,205,0);"/>
</g>
<g transform="matrix(1,0,0,1.11432,0,-234.945)">
<path d="M1336.23,1997.23C1337.48,2019.06 1337.6,2026.44 1335.57,2054.76C1334.77,2054.86 1333.98,2054.97 1333.18,2055.08C1332.4,2055.18 1331.62,2055.29 1330.85,2055.41C1330.82,2055.25 1330.81,2055.1 1330.82,2054.94C1332.87,2026.46 1332.76,2019.2 1331.51,1997.39C1331.5,1997.39 1331.5,1997.38 1331.5,1997.38C1332.02,1997.37 1332.53,1997.35 1333.05,1997.34C1334.11,1997.31 1335.17,1997.27 1336.23,1997.23Z" style="fill:rgb(255,205,0);"/>
</g>
<g transform="matrix(0.44279,0,0,0.44279,-1189.72,902.025)">
<path d="M5653.49,2692.22C5642.89,2681.48 5643.01,2664.16 5653.75,2653.56C5664.49,2642.97 5681.82,2643.09 5692.41,2653.83L5698.71,2660.22L5706.82,2649.11C5715.71,2636.93 5732.82,2634.26 5745.01,2643.15C5757.19,2652.04 5759.86,2669.16 5750.97,2681.34L5708.98,2738.88C5707.97,2740.26 5706.41,2741.12 5704.72,2741.25C5703.02,2741.38 5701.35,2740.75 5700.16,2739.54L5653.49,2692.22Z" style="fill:rgb(64,41,123);"/>
</g>
</g>
</g>
<g transform="matrix(1.62827,0,0,1.15775,11647.7,4084.19)">
<path d="M4321.82,2650.17C4335.16,2589.55 4341.48,2548.68 4303.97,2512.3C4237.93,2448.23 3913.01,2168.16 3887.94,1890.96C3874.93,1747.08 3935.52,1570.85 4121.8,1440.01C4173.9,1403.4 4397.02,1274.75 4432.21,1231.5C4504.25,1142.98 4538.6,1064.83 4542.29,1048.12C4550.57,1010.66 4560.73,991.471 4569.86,988.633C4583.78,984.306 4596.96,995.036 4599.38,1002.89C4658.05,1194.08 4629.33,1500.27 4413.17,1606.53C4362.44,1631.47 4311.24,1655.48 4260.39,1680.18C4215.16,1702.15 4095.32,1765.74 4111.32,1894.08C4119.02,1955.8 4203.45,2048.47 4213.96,2060.01C4344.52,2203.31 4556.28,2384.6 4573.53,2484.21C4575.72,2496.87 4588.84,2572.62 4556.75,2643.85C4536.49,2688.84 4528.96,2683.49 4430.93,2778.62C4413.09,2795.93 4374.13,2841.24 4369.34,2846.81C4333.24,2888.8 4336.16,2896.86 4320.63,2894.32C4318.14,2893.92 4302.54,2891.37 4299.77,2870.7C4290.31,2800.04 4318.01,2667.48 4321.82,2650.17Z" style="fill:rgb(247,183,211);"/>
</g>
</g>
<g transform="matrix(0.614148,0,0,0.863747,-8279.46,-6589.16)">
<g transform="matrix(1.62827,0,0,1.18976,-34044.1,-276.538)">
<path d="M29148.3,8369.47C29311.3,8302.85 29383.5,8371.68 29414.3,8300.09C29486.9,8131.31 28924.8,8113.93 28925,8731.37C28925.1,9192.96 29452.3,9066.77 29321.6,8911.81C29263,8842.28 29111.2,8943.43 29065.4,8822.3C28982.5,8603.03 29092.4,8392.3 29148.3,8369.47Z" style="fill:rgb(64,41,123);"/>
</g>
<g transform="matrix(1.62827,0,0,1.12835,-34037.5,287.009)">
<path d="M29700.5,8256.51C29734.3,8261.78 29949.3,8490.54 29838.7,8755.6C29823.3,8792.52 29586.9,9415.61 29354.9,8716.56C29330.1,8641.78 29388.2,8207.8 29700.5,8256.51ZM29622.2,8391.95C29317.7,8551.37 29551,8941.4 29616.7,8904.4C29836.1,8780.72 29720.3,8340.62 29622.2,8391.95Z" style="fill:rgb(64,41,123);"/>
</g>
<g transform="matrix(1.62827,0,0,1.15775,-34021.3,-14.4309)">
<path d="M30237.4,8200.58C30126.9,8165.78 30029.7,8240.31 29857.9,8224.64C29843.2,8223.31 29754,8269 29848,8342.53C29942.4,8416.5 30205.2,8287.39 30115.1,8450.36C29912.9,8815.91 29654.4,9057.23 30069.1,9081.25C30305.2,9094.92 30441.8,8879.44 30371.9,8840.54C30317,8809.93 29993.7,9077.88 30016.1,8804.54C30022.2,8730.54 30470.4,8273.91 30237.4,8200.58Z" style="fill:rgb(64,41,123);"/>
</g>
<g transform="matrix(1.62827,0,0,1.19425,-34005,-317.682)">
<path d="M30500.3,8306.84C30329.7,8264.78 30217.8,8613.62 30340.6,8650.96C30520,8705.51 30485.3,8752.93 30499.4,8938.28C30510.9,9089.91 30682.8,9082.11 30666,8972.85C30641.6,8814.77 30581.4,8757.53 30736.4,8718.88C30897.2,8678.81 30936.3,8187.72 30760.8,8345.76C30688.7,8410.72 30805.5,8581.82 30661.9,8626.45C30510.2,8673.61 30428.3,8545.86 30439.1,8505.03C30468.6,8393.92 30588.2,8328.52 30500.3,8306.84Z" style="fill:rgb(64,41,123);"/>
</g>
</g>
<g transform="matrix(0.614148,0,0,0.863747,-8003.93,-6589.16)">
<g transform="matrix(1.62827,0,0,1.20505,-34005,-468.246)">
<path d="M32086.6,8251.22C32157.8,8254.15 32477.7,8423.34 32280.7,8697.07C32247,8743.96 32313.8,8834.76 32330.4,8903.65C32354.5,9003.74 32384.1,9089.96 32325.4,9097.5C32169,9117.58 32257.3,8827.15 32127.1,8833.91C32057.1,8837.53 32080.9,9097.12 31971.3,9101.97C31856.1,9107.08 31968.4,8812.56 31967.2,8756.93C31962,8516.36 31759.6,8237.78 32086.6,8251.22ZM32098.8,8395C31958.7,8318.67 32040.2,8691.92 32114.1,8694.85C32179.8,8697.45 32325,8518.34 32098.8,8395Z" style="fill:rgb(64,41,123);"/>
</g>
<g transform="matrix(1.62827,0,0,1.0591,-34070.1,878.801)">
<path d="M32631.1,8843.75C32508.8,8868.32 32692.6,9085.46 32564.6,9073.59C32244.9,9043.94 32616.9,7718.13 32868.6,8665.88C32888,8738.99 32922.5,9077.09 32869.7,9083.6C32729.5,9100.93 32802,8809.45 32631.1,8843.75ZM32582.6,8738.08C32654.9,8710.18 32716.1,8743.72 32740.1,8718.69C32798.7,8657.31 32714.5,8520.97 32664.8,8526.23C32585.3,8534.64 32511.9,8765.32 32582.6,8738.08Z" style="fill:rgb(64,41,123);"/>
</g>
<g transform="matrix(1.62827,0,0,1.36008,-34102.7,-1827.28)">
<path d="M33026.4,8550.27C32977.4,8383.16 32834,8271.69 32784.7,8347.52C32758.6,8387.61 32912.6,8395.92 33035.2,8989.39C33052.3,9072.25 33179.2,9126.91 33200.4,8922.24C33252.8,8415.98 33387.5,8298.73 33235.3,8316.62C33093.4,8333.31 33160.2,8765.88 33109.9,8768.02C33065.9,8769.89 33048.9,8627.05 33026.4,8550.27Z" style="fill:rgb(64,41,123);"/>
</g>
<g transform="matrix(1.62827,0,0,1.24265,-34119,-832.44)">
<path d="M33701.5,8300.06C33391.9,8265.58 33401.3,8422.23 33373.1,8623.8C33356.5,8742.87 33256.3,8991.83 33298.2,9070.23C33341.4,9151.04 33781.3,9124.86 33623.2,8985.18C33579.4,8946.47 33327.3,9081.2 33431.3,8823.7C33480.3,8702.31 33588,8786 33600.1,8674.91C33606.2,8618.56 33393.1,8653.76 33501.4,8464.6C33556.1,8368.97 33625.6,8426.08 33720.2,8422.39C33800.5,8419.26 33863.7,8318.14 33701.5,8300.06Z" style="fill:rgb(64,41,123);"/>
</g>
<g transform="matrix(1.62827,0,0,1.15775,-34143.4,-37.5607)">
<path d="M33814.7,8430.06C33689.4,8510.35 33713.9,9051.12 33763.9,9081.07C33935,9183.4 33789.8,8606.13 33866,8692.8C33945.8,8783.43 34007.9,9254.38 34115.9,9016.18C34175.2,8885.4 34174.7,8324.05 34076.5,8296.13C33919.4,8251.45 34100.8,8803.81 34033.2,8737.82C33896.5,8604.46 33878.8,8389.04 33814.7,8430.06Z" style="fill:rgb(64,41,123);"/>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://blbplxfx41f8t"
path="res://.godot/imported/Cozy Raven Logo breit.svg-f5cfe115294b9e3edf05578239074286.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/logos/Cozy Raven Logo breit.svg"
dest_files=["res://.godot/imported/Cozy Raven Logo breit.svg-f5cfe115294b9e3edf05578239074286.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
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cwbv2i8ntq15d"
path="res://.godot/imported/FS_Logo_2zeilig_rot.png-d7f9780942dbf9fad2bbeca2da59457f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/logos/FS_Logo_2zeilig_rot.png"
dest_files=["res://.godot/imported/FS_Logo_2zeilig_rot.png-d7f9780942dbf9fad2bbeca2da59457f.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: 5.6 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cgmu3qlovdr22"
path="res://.godot/imported/field_outline_1.png-6d3fddc82592de77807ed60581b515c5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/masks/field_outline_1.png"
dest_files=["res://.godot/imported/field_outline_1.png-6d3fddc82592de77807ed60581b515c5.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: 6.8 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://eg5ej0mtuac"
path="res://.godot/imported/field_outline_2.png-e3ddb80217ba93d880ff746f003587ee.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/masks/field_outline_2.png"
dest_files=["res://.godot/imported/field_outline_2.png-e3ddb80217ba93d880ff746f003587ee.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: 7.0 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://djpigvoyadvjs"
path="res://.godot/imported/field_outline_3.png-1ae7ea2c620df01f38d55e21a86cbf92.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/masks/field_outline_3.png"
dest_files=["res://.godot/imported/field_outline_3.png-1ae7ea2c620df01f38d55e21a86cbf92.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
@@ -4,11 +4,12 @@ importer="scene"
importer_version=1 importer_version=1
type="PackedScene" type="PackedScene"
uid="uid://b3kyrsoobmkhp" uid="uid://b3kyrsoobmkhp"
valid=false path="res://.godot/imported/best_house_blender.blend-ac89c74aef2f275bdf4b4baadee17c0c.scn"
[deps] [deps]
source_file="res://art/mockups/3d/best_house_blender.blend" source_file="res://art/mockups/3d/best_house_blender.blend"
dest_files=["res://.godot/imported/best_house_blender.blend-ac89c74aef2f275bdf4b4baadee17c0c.scn"]
[params] [params]
Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 696 KiB

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 895 KiB

After

Width:  |  Height:  |  Size: 395 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 895 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 MiB

After

Width:  |  Height:  |  Size: 5.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dgavbfci8x178"
path="res://.godot/imported/grass-1.png-ca7b452843206b712388940e3c3d5532.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/nature/grass/grass-1.png"
dest_files=["res://.godot/imported/grass-1.png-ca7b452843206b712388940e3c3d5532.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: 168 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://h2b5aufaaw7w"
path="res://.godot/imported/grass-2.png-6f43a52066099666b3212aa92bb38a9f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/nature/grass/grass-2.png"
dest_files=["res://.godot/imported/grass-2.png-6f43a52066099666b3212aa92bb38a9f.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: 145 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ct7ea8ikor5rf"
path="res://.godot/imported/grass-3.png-694a7f12b6e32536c4f27363ec79c45a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/nature/grass/grass-3.png"
dest_files=["res://.godot/imported/grass-3.png-694a7f12b6e32536c4f27363ec79c45a.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: 147 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://badnnid7dgnpk"
path="res://.godot/imported/grass-4.png-e2855f1a80a4bb56abcc9b4ab623b57b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/nature/grass/grass-4.png"
dest_files=["res://.godot/imported/grass-4.png-e2855f1a80a4bb56abcc9b4ab623b57b.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: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b644ofy7fml5w"
path="res://.godot/imported/grass-5.png-415eca44a6277d6c20c8cb81e371080f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/nature/grass/grass-5.png"
dest_files=["res://.godot/imported/grass-5.png-415eca44a6277d6c20c8cb81e371080f.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: 106 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d3dwl6ph0pu1d"
path="res://.godot/imported/grass-6.png-78792f43caad598457a381c5989c9eb5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/nature/grass/grass-6.png"
dest_files=["res://.godot/imported/grass-6.png-78792f43caad598457a381c5989c9eb5.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: 11 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bn56p0ytuo060"
path="res://.godot/imported/AttackButton.png-ab1949863046f66b014201d64778c962.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/ui/UI/AttackButton.png"
dest_files=["res://.godot/imported/AttackButton.png-ab1949863046f66b014201d64778c962.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: 4.8 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cvu5dybw31uxn"
path="res://.godot/imported/Circle.png-1776eabbad99f201f3fa20f90655dedf.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/ui/UI/Circle.png"
dest_files=["res://.godot/imported/Circle.png-1776eabbad99f201f3fa20f90655dedf.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: 8.4 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://crak7ton4lab0"
path="res://.godot/imported/EmptyFightButton.png-941012f14ef5a6d6a385ea2e7599c6bb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/ui/UI/EmptyFightButton.png"
dest_files=["res://.godot/imported/EmptyFightButton.png-941012f14ef5a6d6a385ea2e7599c6bb.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: 13 KiB

+34
View File
@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bcs0e1bpu8wm1"
path="res://.godot/imported/MagicButton.png-f688abbb37e617bc75b48afd1bffb745.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://art/ui/UI/MagicButton.png"
dest_files=["res://.godot/imported/MagicButton.png-f688abbb37e617bc75b48afd1bffb745.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: 2.0 MiB

After

Width:  |  Height:  |  Size: 538 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Some files were not shown because too many files have changed in this diff Show More