diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..0961395 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,11 @@ +{ + "permissions": { + "allow": [ + "WebSearch", + "Bash(find:*)", + "Bash(godot:*)" + ], + "deny": [], + "ask": [] + } +} diff --git a/.gitignore b/.gitignore index 0af181c..7975bb4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ # Godot 4+ specific ignores .godot/ /android/ + +# Generated files +*.uid +*.tmp +*.import~ diff --git a/audio/817587__silverdubloons__tick06.wav.import b/assets/audio/music/817587__silverdubloons__tick06.wav.import similarity index 100% rename from audio/817587__silverdubloons__tick06.wav.import rename to assets/audio/music/817587__silverdubloons__tick06.wav.import diff --git a/audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav b/assets/audio/music/Space Horror InGame Music (Exploration) _Clement Panchout.wav similarity index 100% rename from audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav rename to assets/audio/music/Space Horror InGame Music (Exploration) _Clement Panchout.wav diff --git a/audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav.import b/assets/audio/music/Space Horror InGame Music (Exploration) _Clement Panchout.wav.import similarity index 62% rename from audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav.import rename to assets/audio/music/Space Horror InGame Music (Exploration) _Clement Panchout.wav.import index dcb021f..f36956c 100644 --- a/audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav.import +++ b/assets/audio/music/Space Horror InGame Music (Exploration) _Clement Panchout.wav.import @@ -3,12 +3,12 @@ importer="wav" type="AudioStreamWAV" uid="uid://dcpehnwdueyyo" -path="res://.godot/imported/Space Horror InGame Music (Exploration) _Clement Panchout.wav-9d35410fa91625c5f4d02f369a39bf2e.sample" +path="res://.godot/imported/Space Horror InGame Music (Exploration) _Clement Panchout.wav-b8a2c544037b0505487a02f0a4760b5c.sample" [deps] -source_file="res://audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav" -dest_files=["res://.godot/imported/Space Horror InGame Music (Exploration) _Clement Panchout.wav-9d35410fa91625c5f4d02f369a39bf2e.sample"] +source_file="res://assets/audio/music/Space Horror InGame Music (Exploration) _Clement Panchout.wav" +dest_files=["res://.godot/imported/Space Horror InGame Music (Exploration) _Clement Panchout.wav-b8a2c544037b0505487a02f0a4760b5c.sample"] [params] diff --git a/audio/817587__silverdubloons__tick06.wav b/assets/audio/sfx/817587__silverdubloons__tick06.wav similarity index 100% rename from audio/817587__silverdubloons__tick06.wav rename to assets/audio/sfx/817587__silverdubloons__tick06.wav diff --git a/assets/audio/sfx/817587__silverdubloons__tick06.wav.import b/assets/audio/sfx/817587__silverdubloons__tick06.wav.import new file mode 100644 index 0000000..13d6574 --- /dev/null +++ b/assets/audio/sfx/817587__silverdubloons__tick06.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bafsd057v7yvg" +path="res://.godot/imported/817587__silverdubloons__tick06.wav-073a8f633d78aad3d77b2f7c8ae0c273.sample" + +[deps] + +source_file="res://assets/audio/sfx/817587__silverdubloons__tick06.wav" +dest_files=["res://.godot/imported/817587__silverdubloons__tick06.wav-073a8f633d78aad3d77b2f7c8ae0c273.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/assets/sources.yaml b/assets/sources.yaml new file mode 100644 index 0000000..a97152a --- /dev/null +++ b/assets/sources.yaml @@ -0,0 +1,424 @@ +# Asset Attribution and Source Information +# Every asset in this project must be documented here with complete metadata +# Required fields: source, license, attribution, modifications, usage + +audio: + music: + "Space Horror InGame Music (Exploration) _Clement Panchout.wav": + source: "https://clement-panchout.itch.io/yet-another-free-music-pack" + license: "" # TODO: Verify license from source + attribution: "Space Horror InGame Music by Clement Panchout" + modifications: "Converted to WAV format, loop configuration applied in AudioManager" + usage: "Background music for all gameplay scenes and menus" + + sfx: + "817587__silverdubloons__tick06.wav": + source: "https://freesound.org/people/SilverDubloons/sounds/817587/" + license: "" # TODO: Verify license from freesound.org + attribution: "Tick06 by SilverDubloons" + modifications: "None" + usage: "UI button click sound effects throughout the application" + +sprites: + characters: + skeleton: + "Skeleton Attack.png": + source: "https://jesse-m.itch.io/skeleton-pack" + license: "" # TODO: Verify license from itch.io page + attribution: "Skeleton Pack by Jesse M" + modifications: "" + usage: "Skeleton character attack animation sprite" + + "Skeleton Dead.png": + source: "https://jesse-m.itch.io/skeleton-pack" + license: "" # TODO: Verify license from itch.io page + attribution: "Skeleton Pack by Jesse M" + modifications: "" + usage: "Skeleton character death animation sprite" + + "Skeleton Hit.png": + source: "https://jesse-m.itch.io/skeleton-pack" + license: "" # TODO: Verify license from itch.io page + attribution: "Skeleton Pack by Jesse M" + modifications: "" + usage: "Skeleton character hit reaction animation sprite" + + "Skeleton Idle.png": + source: "https://jesse-m.itch.io/skeleton-pack" + license: "" # TODO: Verify license from itch.io page + attribution: "Skeleton Pack by Jesse M" + modifications: "" + usage: "Skeleton character idle animation sprite" + + "Skeleton React.png": + source: "https://jesse-m.itch.io/skeleton-pack" + license: "" # TODO: Verify license from itch.io page + attribution: "Skeleton Pack by Jesse M" + modifications: "" + usage: "Skeleton character reaction animation sprite" + + "Skeleton Walk.png": + source: "https://jesse-m.itch.io/skeleton-pack" + license: "" # TODO: Verify license from itch.io page + attribution: "Skeleton Pack by Jesse M" + modifications: "" + usage: "Skeleton character walking animation sprite" + + gems: + # Blue gems + "bg_08.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Blue gem sprite for Match-3 gameplay" + + "bg_16a.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Blue gem variant sprite for Match-3 gameplay" + + "bg_19.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Blue gem variant sprite for Match-3 gameplay" + + "bg_26.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Blue gem variant sprite for Match-3 gameplay" + + "bg_27.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Blue gem variant sprite for Match-3 gameplay" + + "bg_28.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Blue gem variant sprite for Match-3 gameplay" + + # Dark/Gray gems + "dg_08.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Dark gem sprite for Match-3 gameplay" + + "dg_16a.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Dark gem variant sprite for Match-3 gameplay" + + "dg_19.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Dark gem variant sprite for Match-3 gameplay" + + "dg_26.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Dark gem variant sprite for Match-3 gameplay" + + "dg_27.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Dark gem variant sprite for Match-3 gameplay" + + "dg_28.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Dark gem variant sprite for Match-3 gameplay" + + # Green gems + "gg_08.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Green gem sprite for Match-3 gameplay" + + "gg_16a.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Green gem variant sprite for Match-3 gameplay" + + "gg_19.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Green gem variant sprite for Match-3 gameplay" + + "gg_26.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Green gem variant sprite for Match-3 gameplay" + + "gg_27.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Green gem variant sprite for Match-3 gameplay" + + "gg_28.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Green gem variant sprite for Match-3 gameplay" + + # Magenta gems + "mg_08.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Magenta gem sprite for Match-3 gameplay" + + "mg_16a.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Magenta gem variant sprite for Match-3 gameplay" + + "mg_19.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Magenta gem variant sprite for Match-3 gameplay" + + "mg_26.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Magenta gem variant sprite for Match-3 gameplay" + + "mg_27.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Magenta gem variant sprite for Match-3 gameplay" + + "mg_28.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Magenta gem variant sprite for Match-3 gameplay" + + # Purple gems + "pg_08.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Purple gem sprite for Match-3 gameplay" + + "pg_16a.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Purple gem variant sprite for Match-3 gameplay" + + "pg_19.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Purple gem variant sprite for Match-3 gameplay" + + "pg_26.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Purple gem variant sprite for Match-3 gameplay" + + "pg_27.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Purple gem variant sprite for Match-3 gameplay" + + "pg_28.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Purple gem variant sprite for Match-3 gameplay" + + # Red gems + "rg_08.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Red gem sprite for Match-3 gameplay" + + "rg_16a.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Red gem variant sprite for Match-3 gameplay" + + "rg_19.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Red gem variant sprite for Match-3 gameplay" + + "rg_26.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Red gem variant sprite for Match-3 gameplay" + + "rg_27.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Red gem variant sprite for Match-3 gameplay" + + "rg_28.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Red gem variant sprite for Match-3 gameplay" + + # Silver gems + "sg_08.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Silver gem sprite for Match-3 gameplay" + + "sg_16a.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Silver gem variant sprite for Match-3 gameplay" + + "sg_19.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Silver gem variant sprite for Match-3 gameplay" + + "sg_26.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Silver gem variant sprite for Match-3 gameplay" + + "sg_27.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Silver gem variant sprite for Match-3 gameplay" + + "sg_28.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Silver gem variant sprite for Match-3 gameplay" + + # Yellow gems + "yg_08.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Yellow gem sprite for Match-3 gameplay" + + "yg_16a.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Yellow gem variant sprite for Match-3 gameplay" + + "yg_19.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Yellow gem variant sprite for Match-3 gameplay" + + "yg_26.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Yellow gem variant sprite for Match-3 gameplay" + + "yg_27.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Yellow gem variant sprite for Match-3 gameplay" + + "yg_28.png": + source: "https://ilustragm.itch.io/gems-icon-01-free" + license: "" # TODO: Verify license from itch.io page + attribution: "Gems Icon 01 Free by IlustraGM" + modifications: "" + usage: "Yellow gem variant sprite for Match-3 gameplay" + +Referenced in original sources.yaml but file not found: +textures: + backgrounds: + "beanstalk-dark.webp": + source: "https://www.toptal.com/designers/subtlepatterns/beanstalk-dark-pattern/" + license: "" # TODO: Verify license and locate file + attribution: "Beanstalk Dark pattern from Subtle Patterns" + modifications: "" + usage: "Background texture (file location TBD)" + +# TODO: Verify all license information by visiting source URLs +# TODO: Check for any missing assets not documented here +# TODO: Confirm all attribution text meets source requirements diff --git a/resources/animated sprite/Skeleton Sprite/Skeleton Attack.png b/assets/sprites/characters/skeleton/Skeleton Attack.png similarity index 100% rename from resources/animated sprite/Skeleton Sprite/Skeleton Attack.png rename to assets/sprites/characters/skeleton/Skeleton Attack.png diff --git a/resources/animated sprite/Skeleton Sprite/Skeleton Attack.png.import b/assets/sprites/characters/skeleton/Skeleton Attack.png.import similarity index 67% rename from resources/animated sprite/Skeleton Sprite/Skeleton Attack.png.import rename to assets/sprites/characters/skeleton/Skeleton Attack.png.import index b12c8e5..d5294b4 100644 --- a/resources/animated sprite/Skeleton Sprite/Skeleton Attack.png.import +++ b/assets/sprites/characters/skeleton/Skeleton Attack.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cowabod6jrn47" -path="res://.godot/imported/Skeleton Attack.png-049662b12bed4ec69aa7828712b2b871.ctex" +path="res://.godot/imported/Skeleton Attack.png-31a9e5b2c10f873e155f012eeea3cf92.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://resources/animated sprite/Skeleton Sprite/Skeleton Attack.png" -dest_files=["res://.godot/imported/Skeleton Attack.png-049662b12bed4ec69aa7828712b2b871.ctex"] +source_file="res://assets/sprites/characters/skeleton/Skeleton Attack.png" +dest_files=["res://.godot/imported/Skeleton Attack.png-31a9e5b2c10f873e155f012eeea3cf92.ctex"] [params] diff --git a/resources/animated sprite/Skeleton Sprite/Skeleton Dead.png b/assets/sprites/characters/skeleton/Skeleton Dead.png similarity index 100% rename from resources/animated sprite/Skeleton Sprite/Skeleton Dead.png rename to assets/sprites/characters/skeleton/Skeleton Dead.png diff --git a/resources/animated sprite/Skeleton Sprite/Skeleton Dead.png.import b/assets/sprites/characters/skeleton/Skeleton Dead.png.import similarity index 68% rename from resources/animated sprite/Skeleton Sprite/Skeleton Dead.png.import rename to assets/sprites/characters/skeleton/Skeleton Dead.png.import index d2472af..beefb75 100644 --- a/resources/animated sprite/Skeleton Sprite/Skeleton Dead.png.import +++ b/assets/sprites/characters/skeleton/Skeleton Dead.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://660wqxgwh8dr" -path="res://.godot/imported/Skeleton Dead.png-d7a83435b157e05a1d13265f37b1daa6.ctex" +path="res://.godot/imported/Skeleton Dead.png-e1687d67e643bab4b8c92b164a03a547.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://resources/animated sprite/Skeleton Sprite/Skeleton Dead.png" -dest_files=["res://.godot/imported/Skeleton Dead.png-d7a83435b157e05a1d13265f37b1daa6.ctex"] +source_file="res://assets/sprites/characters/skeleton/Skeleton Dead.png" +dest_files=["res://.godot/imported/Skeleton Dead.png-e1687d67e643bab4b8c92b164a03a547.ctex"] [params] diff --git a/resources/animated sprite/Skeleton Sprite/Skeleton Hit.png b/assets/sprites/characters/skeleton/Skeleton Hit.png similarity index 100% rename from resources/animated sprite/Skeleton Sprite/Skeleton Hit.png rename to assets/sprites/characters/skeleton/Skeleton Hit.png diff --git a/resources/animated sprite/Skeleton Sprite/Skeleton Hit.png.import b/assets/sprites/characters/skeleton/Skeleton Hit.png.import similarity index 68% rename from resources/animated sprite/Skeleton Sprite/Skeleton Hit.png.import rename to assets/sprites/characters/skeleton/Skeleton Hit.png.import index 55e9d89..574d370 100644 --- a/resources/animated sprite/Skeleton Sprite/Skeleton Hit.png.import +++ b/assets/sprites/characters/skeleton/Skeleton Hit.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://btfjyc4jfhiii" -path="res://.godot/imported/Skeleton Hit.png-1c1b2b67a260111c2ac7c3f48618da2e.ctex" +path="res://.godot/imported/Skeleton Hit.png-7311c991bcb76e5d6a77397d5558f61c.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://resources/animated sprite/Skeleton Sprite/Skeleton Hit.png" -dest_files=["res://.godot/imported/Skeleton Hit.png-1c1b2b67a260111c2ac7c3f48618da2e.ctex"] +source_file="res://assets/sprites/characters/skeleton/Skeleton Hit.png" +dest_files=["res://.godot/imported/Skeleton Hit.png-7311c991bcb76e5d6a77397d5558f61c.ctex"] [params] diff --git a/resources/animated sprite/Skeleton Sprite/Skeleton Idle.png b/assets/sprites/characters/skeleton/Skeleton Idle.png similarity index 100% rename from resources/animated sprite/Skeleton Sprite/Skeleton Idle.png rename to assets/sprites/characters/skeleton/Skeleton Idle.png diff --git a/resources/animated sprite/Skeleton Sprite/Skeleton Idle.png.import b/assets/sprites/characters/skeleton/Skeleton Idle.png.import similarity index 68% rename from resources/animated sprite/Skeleton Sprite/Skeleton Idle.png.import rename to assets/sprites/characters/skeleton/Skeleton Idle.png.import index feb9d8d..ed460be 100644 --- a/resources/animated sprite/Skeleton Sprite/Skeleton Idle.png.import +++ b/assets/sprites/characters/skeleton/Skeleton Idle.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://bcr4bokw87m5n" -path="res://.godot/imported/Skeleton Idle.png-3aae60d292addc7af911333cb2fced6a.ctex" +path="res://.godot/imported/Skeleton Idle.png-6287b112f02c0e4ac23abbe600ade526.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://resources/animated sprite/Skeleton Sprite/Skeleton Idle.png" -dest_files=["res://.godot/imported/Skeleton Idle.png-3aae60d292addc7af911333cb2fced6a.ctex"] +source_file="res://assets/sprites/characters/skeleton/Skeleton Idle.png" +dest_files=["res://.godot/imported/Skeleton Idle.png-6287b112f02c0e4ac23abbe600ade526.ctex"] [params] diff --git a/resources/animated sprite/Skeleton Sprite/Skeleton React.png b/assets/sprites/characters/skeleton/Skeleton React.png similarity index 100% rename from resources/animated sprite/Skeleton Sprite/Skeleton React.png rename to assets/sprites/characters/skeleton/Skeleton React.png diff --git a/resources/animated sprite/Skeleton Sprite/Skeleton React.png.import b/assets/sprites/characters/skeleton/Skeleton React.png.import similarity index 68% rename from resources/animated sprite/Skeleton Sprite/Skeleton React.png.import rename to assets/sprites/characters/skeleton/Skeleton React.png.import index a63a277..f20d0f2 100644 --- a/resources/animated sprite/Skeleton Sprite/Skeleton React.png.import +++ b/assets/sprites/characters/skeleton/Skeleton React.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cuo2o785qopo3" -path="res://.godot/imported/Skeleton React.png-e4462e4ebc0bd8edc6e0657880709951.ctex" +path="res://.godot/imported/Skeleton React.png-bae9c1ad14cb9e90c7d6e7d717e2699e.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://resources/animated sprite/Skeleton Sprite/Skeleton React.png" -dest_files=["res://.godot/imported/Skeleton React.png-e4462e4ebc0bd8edc6e0657880709951.ctex"] +source_file="res://assets/sprites/characters/skeleton/Skeleton React.png" +dest_files=["res://.godot/imported/Skeleton React.png-bae9c1ad14cb9e90c7d6e7d717e2699e.ctex"] [params] diff --git a/resources/animated sprite/Skeleton Sprite/Skeleton Walk.png b/assets/sprites/characters/skeleton/Skeleton Walk.png similarity index 100% rename from resources/animated sprite/Skeleton Sprite/Skeleton Walk.png rename to assets/sprites/characters/skeleton/Skeleton Walk.png diff --git a/resources/animated sprite/Skeleton Sprite/Skeleton Walk.png.import b/assets/sprites/characters/skeleton/Skeleton Walk.png.import similarity index 68% rename from resources/animated sprite/Skeleton Sprite/Skeleton Walk.png.import rename to assets/sprites/characters/skeleton/Skeleton Walk.png.import index 668a62d..51c5892 100644 --- a/resources/animated sprite/Skeleton Sprite/Skeleton Walk.png.import +++ b/assets/sprites/characters/skeleton/Skeleton Walk.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://b0dqy1at078ct" -path="res://.godot/imported/Skeleton Walk.png-8ad85ceee01590d6218dedb5245e9634.ctex" +path="res://.godot/imported/Skeleton Walk.png-19ec7f5950a5cbfa9505c0dc4dd1b48f.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://resources/animated sprite/Skeleton Sprite/Skeleton Walk.png" -dest_files=["res://.godot/imported/Skeleton Walk.png-8ad85ceee01590d6218dedb5245e9634.ctex"] +source_file="res://assets/sprites/characters/skeleton/Skeleton Walk.png" +dest_files=["res://.godot/imported/Skeleton Walk.png-19ec7f5950a5cbfa9505c0dc4dd1b48f.ctex"] [params] diff --git a/assets/sprites/gems/bg_08.png b/assets/sprites/gems/bg_08.png new file mode 100644 index 0000000..fd6e9be Binary files /dev/null and b/assets/sprites/gems/bg_08.png differ diff --git a/assets/sprites/gems/bg_08.png.import b/assets/sprites/gems/bg_08.png.import new file mode 100644 index 0000000..bff03d7 --- /dev/null +++ b/assets/sprites/gems/bg_08.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://de4qsw4ng151w" +path="res://.godot/imported/bg_08.png-77843132c8e165935c34f3a602db7b39.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/bg_08.png" +dest_files=["res://.godot/imported/bg_08.png-77843132c8e165935c34f3a602db7b39.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 diff --git a/assets/sprites/gems/bg_16a.png b/assets/sprites/gems/bg_16a.png new file mode 100644 index 0000000..6a4df04 Binary files /dev/null and b/assets/sprites/gems/bg_16a.png differ diff --git a/assets/sprites/gems/bg_16a.png.import b/assets/sprites/gems/bg_16a.png.import new file mode 100644 index 0000000..0ac0629 --- /dev/null +++ b/assets/sprites/gems/bg_16a.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://42w3udj6aihh" +path="res://.godot/imported/bg_16a.png-6ded97b625c6e60057ec45129c915099.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/bg_16a.png" +dest_files=["res://.godot/imported/bg_16a.png-6ded97b625c6e60057ec45129c915099.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 diff --git a/assets/sprites/gems/bg_19.png b/assets/sprites/gems/bg_19.png new file mode 100644 index 0000000..8907336 Binary files /dev/null and b/assets/sprites/gems/bg_19.png differ diff --git a/assets/sprites/gems/bg_19.png.import b/assets/sprites/gems/bg_19.png.import new file mode 100644 index 0000000..118f9da --- /dev/null +++ b/assets/sprites/gems/bg_19.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bioo5u6uq721j" +path="res://.godot/imported/bg_19.png-bbd365f1499e75ecf2933feb96ad1bed.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/bg_19.png" +dest_files=["res://.godot/imported/bg_19.png-bbd365f1499e75ecf2933feb96ad1bed.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 diff --git a/assets/sprites/gems/bg_26.png b/assets/sprites/gems/bg_26.png new file mode 100644 index 0000000..60cef54 Binary files /dev/null and b/assets/sprites/gems/bg_26.png differ diff --git a/assets/sprites/gems/bg_26.png.import b/assets/sprites/gems/bg_26.png.import new file mode 100644 index 0000000..0dde165 --- /dev/null +++ b/assets/sprites/gems/bg_26.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3iafjb50br0s" +path="res://.godot/imported/bg_26.png-0aa5f56697cf78e667a16cc7f5663e73.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/bg_26.png" +dest_files=["res://.godot/imported/bg_26.png-0aa5f56697cf78e667a16cc7f5663e73.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 diff --git a/assets/sprites/gems/bg_27.png b/assets/sprites/gems/bg_27.png new file mode 100644 index 0000000..c2ea84a Binary files /dev/null and b/assets/sprites/gems/bg_27.png differ diff --git a/assets/sprites/gems/bg_27.png.import b/assets/sprites/gems/bg_27.png.import new file mode 100644 index 0000000..49b82f2 --- /dev/null +++ b/assets/sprites/gems/bg_27.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dlsbyeg6yk0w6" +path="res://.godot/imported/bg_27.png-8491443789e609ccfc8571a594dabe15.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/bg_27.png" +dest_files=["res://.godot/imported/bg_27.png-8491443789e609ccfc8571a594dabe15.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 diff --git a/assets/sprites/gems/bg_28.png b/assets/sprites/gems/bg_28.png new file mode 100644 index 0000000..8985b17 Binary files /dev/null and b/assets/sprites/gems/bg_28.png differ diff --git a/assets/sprites/gems/bg_28.png.import b/assets/sprites/gems/bg_28.png.import new file mode 100644 index 0000000..3cdae18 --- /dev/null +++ b/assets/sprites/gems/bg_28.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dww0yjm6dlopu" +path="res://.godot/imported/bg_28.png-50f87b44c958560beabb6031acaef57e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/bg_28.png" +dest_files=["res://.godot/imported/bg_28.png-50f87b44c958560beabb6031acaef57e.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 diff --git a/assets/sprites/gems/dg_08.png b/assets/sprites/gems/dg_08.png new file mode 100644 index 0000000..ff98e54 Binary files /dev/null and b/assets/sprites/gems/dg_08.png differ diff --git a/assets/sprites/gems/dg_08.png.import b/assets/sprites/gems/dg_08.png.import new file mode 100644 index 0000000..0867db6 --- /dev/null +++ b/assets/sprites/gems/dg_08.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dudk2umu5bvgs" +path="res://.godot/imported/dg_08.png-e1ad7182c2f8d65510dbdc48ab5e4466.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/dg_08.png" +dest_files=["res://.godot/imported/dg_08.png-e1ad7182c2f8d65510dbdc48ab5e4466.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 diff --git a/assets/sprites/gems/dg_16a.png b/assets/sprites/gems/dg_16a.png new file mode 100644 index 0000000..90ed2e9 Binary files /dev/null and b/assets/sprites/gems/dg_16a.png differ diff --git a/assets/sprites/gems/dg_16a.png.import b/assets/sprites/gems/dg_16a.png.import new file mode 100644 index 0000000..5d7372c --- /dev/null +++ b/assets/sprites/gems/dg_16a.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b533hi1ykb8tq" +path="res://.godot/imported/dg_16a.png-d922762d7a12e7fedcafa504db3276a3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/dg_16a.png" +dest_files=["res://.godot/imported/dg_16a.png-d922762d7a12e7fedcafa504db3276a3.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 diff --git a/assets/sprites/gems/dg_19.png b/assets/sprites/gems/dg_19.png new file mode 100644 index 0000000..65d1113 Binary files /dev/null and b/assets/sprites/gems/dg_19.png differ diff --git a/assets/sprites/gems/dg_19.png.import b/assets/sprites/gems/dg_19.png.import new file mode 100644 index 0000000..8c0631a --- /dev/null +++ b/assets/sprites/gems/dg_19.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2bcge834ofx4" +path="res://.godot/imported/dg_19.png-afb0e64c485081fd339ad679d8fbe83d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/dg_19.png" +dest_files=["res://.godot/imported/dg_19.png-afb0e64c485081fd339ad679d8fbe83d.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 diff --git a/assets/sprites/gems/dg_26.png b/assets/sprites/gems/dg_26.png new file mode 100644 index 0000000..6cb93d1 Binary files /dev/null and b/assets/sprites/gems/dg_26.png differ diff --git a/assets/sprites/gems/dg_26.png.import b/assets/sprites/gems/dg_26.png.import new file mode 100644 index 0000000..18e3acb --- /dev/null +++ b/assets/sprites/gems/dg_26.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3fbxbrovpd2o" +path="res://.godot/imported/dg_26.png-4a2ce0c663c3dde56c5eaddc73ed19f5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/dg_26.png" +dest_files=["res://.godot/imported/dg_26.png-4a2ce0c663c3dde56c5eaddc73ed19f5.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 diff --git a/assets/sprites/gems/dg_27.png b/assets/sprites/gems/dg_27.png new file mode 100644 index 0000000..079ad6c Binary files /dev/null and b/assets/sprites/gems/dg_27.png differ diff --git a/assets/sprites/gems/dg_27.png.import b/assets/sprites/gems/dg_27.png.import new file mode 100644 index 0000000..d1f3286 --- /dev/null +++ b/assets/sprites/gems/dg_27.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://k7gps0h2l8k7" +path="res://.godot/imported/dg_27.png-9c3dcc1b6a689af674d8f443d6f956db.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/dg_27.png" +dest_files=["res://.godot/imported/dg_27.png-9c3dcc1b6a689af674d8f443d6f956db.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 diff --git a/assets/sprites/gems/dg_28.png b/assets/sprites/gems/dg_28.png new file mode 100644 index 0000000..e5796a7 Binary files /dev/null and b/assets/sprites/gems/dg_28.png differ diff --git a/assets/sprites/gems/dg_28.png.import b/assets/sprites/gems/dg_28.png.import new file mode 100644 index 0000000..c726c60 --- /dev/null +++ b/assets/sprites/gems/dg_28.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d07se104e7lyj" +path="res://.godot/imported/dg_28.png-f00e0bdc25ddb8fcf937676717224cc6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/dg_28.png" +dest_files=["res://.godot/imported/dg_28.png-f00e0bdc25ddb8fcf937676717224cc6.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 diff --git a/assets/sprites/gems/gg_08.png b/assets/sprites/gems/gg_08.png new file mode 100644 index 0000000..3c31c71 Binary files /dev/null and b/assets/sprites/gems/gg_08.png differ diff --git a/assets/sprites/gems/gg_08.png.import b/assets/sprites/gems/gg_08.png.import new file mode 100644 index 0000000..17c2c43 --- /dev/null +++ b/assets/sprites/gems/gg_08.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dviy4od6h6kc5" +path="res://.godot/imported/gg_08.png-8ceea676909f242ccf3635c56435dbfc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/gg_08.png" +dest_files=["res://.godot/imported/gg_08.png-8ceea676909f242ccf3635c56435dbfc.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 diff --git a/assets/sprites/gems/gg_16a.png b/assets/sprites/gems/gg_16a.png new file mode 100644 index 0000000..283a2f9 Binary files /dev/null and b/assets/sprites/gems/gg_16a.png differ diff --git a/assets/sprites/gems/gg_16a.png.import b/assets/sprites/gems/gg_16a.png.import new file mode 100644 index 0000000..7aa929a --- /dev/null +++ b/assets/sprites/gems/gg_16a.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://droomr4cpxa47" +path="res://.godot/imported/gg_16a.png-a5f2d2d1bf82cb409314e2c8eb765957.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/gg_16a.png" +dest_files=["res://.godot/imported/gg_16a.png-a5f2d2d1bf82cb409314e2c8eb765957.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 diff --git a/assets/sprites/gems/gg_19.png b/assets/sprites/gems/gg_19.png new file mode 100644 index 0000000..40582c2 Binary files /dev/null and b/assets/sprites/gems/gg_19.png differ diff --git a/assets/sprites/gems/gg_19.png.import b/assets/sprites/gems/gg_19.png.import new file mode 100644 index 0000000..8f02566 --- /dev/null +++ b/assets/sprites/gems/gg_19.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bpidytlj8h7yb" +path="res://.godot/imported/gg_19.png-21aedfea8e7e0a9e8f12ffd11c216539.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/gg_19.png" +dest_files=["res://.godot/imported/gg_19.png-21aedfea8e7e0a9e8f12ffd11c216539.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 diff --git a/assets/sprites/gems/gg_26.png b/assets/sprites/gems/gg_26.png new file mode 100644 index 0000000..470144e Binary files /dev/null and b/assets/sprites/gems/gg_26.png differ diff --git a/assets/sprites/gems/gg_26.png.import b/assets/sprites/gems/gg_26.png.import new file mode 100644 index 0000000..1c1199c --- /dev/null +++ b/assets/sprites/gems/gg_26.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d5atjt05ft1a" +path="res://.godot/imported/gg_26.png-c43cf02dc4dd6355c64375055eceb1d9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/gg_26.png" +dest_files=["res://.godot/imported/gg_26.png-c43cf02dc4dd6355c64375055eceb1d9.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 diff --git a/assets/sprites/gems/gg_27.png b/assets/sprites/gems/gg_27.png new file mode 100644 index 0000000..388b304 Binary files /dev/null and b/assets/sprites/gems/gg_27.png differ diff --git a/assets/sprites/gems/gg_27.png.import b/assets/sprites/gems/gg_27.png.import new file mode 100644 index 0000000..e04ec3f --- /dev/null +++ b/assets/sprites/gems/gg_27.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7nj55ci3d1vn" +path="res://.godot/imported/gg_27.png-281ebc39017ff87a83dc3f919a122e1e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/gg_27.png" +dest_files=["res://.godot/imported/gg_27.png-281ebc39017ff87a83dc3f919a122e1e.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 diff --git a/assets/sprites/gems/gg_28.png b/assets/sprites/gems/gg_28.png new file mode 100644 index 0000000..c2b064f Binary files /dev/null and b/assets/sprites/gems/gg_28.png differ diff --git a/assets/sprites/gems/gg_28.png.import b/assets/sprites/gems/gg_28.png.import new file mode 100644 index 0000000..1f0b83c --- /dev/null +++ b/assets/sprites/gems/gg_28.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://5aw48uyy4i35" +path="res://.godot/imported/gg_28.png-5831ed81867ee3de6f8e19c4165694a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/gg_28.png" +dest_files=["res://.godot/imported/gg_28.png-5831ed81867ee3de6f8e19c4165694a7.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 diff --git a/assets/sprites/gems/mg_08.png b/assets/sprites/gems/mg_08.png new file mode 100644 index 0000000..c0083f1 Binary files /dev/null and b/assets/sprites/gems/mg_08.png differ diff --git a/assets/sprites/gems/mg_08.png.import b/assets/sprites/gems/mg_08.png.import new file mode 100644 index 0000000..e1c0eda --- /dev/null +++ b/assets/sprites/gems/mg_08.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c8bbejkkehjgk" +path="res://.godot/imported/mg_08.png-35fde37512dd0392d35e6c651c76e09f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/mg_08.png" +dest_files=["res://.godot/imported/mg_08.png-35fde37512dd0392d35e6c651c76e09f.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 diff --git a/assets/sprites/gems/mg_16a.png b/assets/sprites/gems/mg_16a.png new file mode 100644 index 0000000..5bf6dbe Binary files /dev/null and b/assets/sprites/gems/mg_16a.png differ diff --git a/assets/sprites/gems/mg_16a.png.import b/assets/sprites/gems/mg_16a.png.import new file mode 100644 index 0000000..b4dfa05 --- /dev/null +++ b/assets/sprites/gems/mg_16a.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnjoksww7jlgw" +path="res://.godot/imported/mg_16a.png-7ae849d894d79a0049515a7654200f21.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/mg_16a.png" +dest_files=["res://.godot/imported/mg_16a.png-7ae849d894d79a0049515a7654200f21.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 diff --git a/assets/sprites/gems/mg_19.png b/assets/sprites/gems/mg_19.png new file mode 100644 index 0000000..5e3990e Binary files /dev/null and b/assets/sprites/gems/mg_19.png differ diff --git a/assets/sprites/gems/mg_19.png.import b/assets/sprites/gems/mg_19.png.import new file mode 100644 index 0000000..919e572 --- /dev/null +++ b/assets/sprites/gems/mg_19.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0r6qvbc33ymb" +path="res://.godot/imported/mg_19.png-e6ce2a91f95c7d9707148890e7bcdd52.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/mg_19.png" +dest_files=["res://.godot/imported/mg_19.png-e6ce2a91f95c7d9707148890e7bcdd52.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 diff --git a/assets/sprites/gems/mg_26.png b/assets/sprites/gems/mg_26.png new file mode 100644 index 0000000..674e783 Binary files /dev/null and b/assets/sprites/gems/mg_26.png differ diff --git a/assets/sprites/gems/mg_26.png.import b/assets/sprites/gems/mg_26.png.import new file mode 100644 index 0000000..773565f --- /dev/null +++ b/assets/sprites/gems/mg_26.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://eiuli343bnkg" +path="res://.godot/imported/mg_26.png-3fd6f66ad255f2b38061a0be3165b0c5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/mg_26.png" +dest_files=["res://.godot/imported/mg_26.png-3fd6f66ad255f2b38061a0be3165b0c5.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 diff --git a/assets/sprites/gems/mg_27.png b/assets/sprites/gems/mg_27.png new file mode 100644 index 0000000..83468a4 Binary files /dev/null and b/assets/sprites/gems/mg_27.png differ diff --git a/assets/sprites/gems/mg_27.png.import b/assets/sprites/gems/mg_27.png.import new file mode 100644 index 0000000..80f7e49 --- /dev/null +++ b/assets/sprites/gems/mg_27.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cm2ihgxtfdb51" +path="res://.godot/imported/mg_27.png-fe3b6731a968b3e67a715e17ffc02b4c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/mg_27.png" +dest_files=["res://.godot/imported/mg_27.png-fe3b6731a968b3e67a715e17ffc02b4c.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 diff --git a/assets/sprites/gems/mg_28.png b/assets/sprites/gems/mg_28.png new file mode 100644 index 0000000..8ed5c91 Binary files /dev/null and b/assets/sprites/gems/mg_28.png differ diff --git a/assets/sprites/gems/mg_28.png.import b/assets/sprites/gems/mg_28.png.import new file mode 100644 index 0000000..17e410a --- /dev/null +++ b/assets/sprites/gems/mg_28.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dp6hg741v6nl4" +path="res://.godot/imported/mg_28.png-ada23e8ea33e5c01e3f34a309139a6ef.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/mg_28.png" +dest_files=["res://.godot/imported/mg_28.png-ada23e8ea33e5c01e3f34a309139a6ef.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 diff --git a/assets/sprites/gems/pg_08.png b/assets/sprites/gems/pg_08.png new file mode 100644 index 0000000..b0b7be7 Binary files /dev/null and b/assets/sprites/gems/pg_08.png differ diff --git a/assets/sprites/gems/pg_08.png.import b/assets/sprites/gems/pg_08.png.import new file mode 100644 index 0000000..f116cc0 --- /dev/null +++ b/assets/sprites/gems/pg_08.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btxdn0rakcngf" +path="res://.godot/imported/pg_08.png-40b30ef563993bb977520b1d559ccd96.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/pg_08.png" +dest_files=["res://.godot/imported/pg_08.png-40b30ef563993bb977520b1d559ccd96.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 diff --git a/assets/sprites/gems/pg_16a.png b/assets/sprites/gems/pg_16a.png new file mode 100644 index 0000000..0582a8d Binary files /dev/null and b/assets/sprites/gems/pg_16a.png differ diff --git a/assets/sprites/gems/pg_16a.png.import b/assets/sprites/gems/pg_16a.png.import new file mode 100644 index 0000000..2f6e395 --- /dev/null +++ b/assets/sprites/gems/pg_16a.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d2wo7k33lptr1" +path="res://.godot/imported/pg_16a.png-a6f68855a1651d866c9eaf27ab706d73.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/pg_16a.png" +dest_files=["res://.godot/imported/pg_16a.png-a6f68855a1651d866c9eaf27ab706d73.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 diff --git a/assets/sprites/gems/pg_19.png b/assets/sprites/gems/pg_19.png new file mode 100644 index 0000000..0b5137f Binary files /dev/null and b/assets/sprites/gems/pg_19.png differ diff --git a/assets/sprites/gems/pg_19.png.import b/assets/sprites/gems/pg_19.png.import new file mode 100644 index 0000000..30409f8 --- /dev/null +++ b/assets/sprites/gems/pg_19.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3e3au4w7yy1c" +path="res://.godot/imported/pg_19.png-3c63dbcd07560310e8fdbf2ac375880e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/pg_19.png" +dest_files=["res://.godot/imported/pg_19.png-3c63dbcd07560310e8fdbf2ac375880e.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 diff --git a/assets/sprites/gems/pg_26.png b/assets/sprites/gems/pg_26.png new file mode 100644 index 0000000..9cf2794 Binary files /dev/null and b/assets/sprites/gems/pg_26.png differ diff --git a/assets/sprites/gems/pg_26.png.import b/assets/sprites/gems/pg_26.png.import new file mode 100644 index 0000000..93469be --- /dev/null +++ b/assets/sprites/gems/pg_26.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b18o5lxlcgnfx" +path="res://.godot/imported/pg_26.png-7aaab46733f9253fac60fe2a5fecdef9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/pg_26.png" +dest_files=["res://.godot/imported/pg_26.png-7aaab46733f9253fac60fe2a5fecdef9.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 diff --git a/assets/sprites/gems/pg_27.png b/assets/sprites/gems/pg_27.png new file mode 100644 index 0000000..c6de50d Binary files /dev/null and b/assets/sprites/gems/pg_27.png differ diff --git a/assets/sprites/gems/pg_27.png.import b/assets/sprites/gems/pg_27.png.import new file mode 100644 index 0000000..bf9d3a0 --- /dev/null +++ b/assets/sprites/gems/pg_27.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bkih4lj2fntas" +path="res://.godot/imported/pg_27.png-ee0e201631ac62b45cf78a5ba2d54596.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/pg_27.png" +dest_files=["res://.godot/imported/pg_27.png-ee0e201631ac62b45cf78a5ba2d54596.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 diff --git a/assets/sprites/gems/pg_28.png b/assets/sprites/gems/pg_28.png new file mode 100644 index 0000000..10deeef Binary files /dev/null and b/assets/sprites/gems/pg_28.png differ diff --git a/assets/sprites/gems/pg_28.png.import b/assets/sprites/gems/pg_28.png.import new file mode 100644 index 0000000..2be9409 --- /dev/null +++ b/assets/sprites/gems/pg_28.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://blai6fdbpxuyp" +path="res://.godot/imported/pg_28.png-6ff41398a128c0b35d6b8332a50f0824.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/pg_28.png" +dest_files=["res://.godot/imported/pg_28.png-6ff41398a128c0b35d6b8332a50f0824.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 diff --git a/assets/sprites/gems/rg_08.png b/assets/sprites/gems/rg_08.png new file mode 100644 index 0000000..3be0b74 Binary files /dev/null and b/assets/sprites/gems/rg_08.png differ diff --git a/assets/sprites/gems/rg_08.png.import b/assets/sprites/gems/rg_08.png.import new file mode 100644 index 0000000..f3b1e9a --- /dev/null +++ b/assets/sprites/gems/rg_08.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqyqpdyg8e4ek" +path="res://.godot/imported/rg_08.png-e769805e5236318cdcf487b1daa0ab70.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/rg_08.png" +dest_files=["res://.godot/imported/rg_08.png-e769805e5236318cdcf487b1daa0ab70.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 diff --git a/assets/sprites/gems/rg_16a.png b/assets/sprites/gems/rg_16a.png new file mode 100644 index 0000000..1fb85cf Binary files /dev/null and b/assets/sprites/gems/rg_16a.png differ diff --git a/assets/sprites/gems/rg_16a.png.import b/assets/sprites/gems/rg_16a.png.import new file mode 100644 index 0000000..6ec77f7 --- /dev/null +++ b/assets/sprites/gems/rg_16a.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3uk7br2yqsyr" +path="res://.godot/imported/rg_16a.png-e568944ca0d125c92b232ea737af957f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/rg_16a.png" +dest_files=["res://.godot/imported/rg_16a.png-e568944ca0d125c92b232ea737af957f.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 diff --git a/assets/sprites/gems/rg_19.png b/assets/sprites/gems/rg_19.png new file mode 100644 index 0000000..4d46f6d Binary files /dev/null and b/assets/sprites/gems/rg_19.png differ diff --git a/assets/sprites/gems/rg_19.png.import b/assets/sprites/gems/rg_19.png.import new file mode 100644 index 0000000..b6c41d1 --- /dev/null +++ b/assets/sprites/gems/rg_19.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ccprr0qrj3lgm" +path="res://.godot/imported/rg_19.png-3dfdfcd3f45c9c1e87986c34ed27d65c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/rg_19.png" +dest_files=["res://.godot/imported/rg_19.png-3dfdfcd3f45c9c1e87986c34ed27d65c.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 diff --git a/assets/sprites/gems/rg_26.png b/assets/sprites/gems/rg_26.png new file mode 100644 index 0000000..0fbd583 Binary files /dev/null and b/assets/sprites/gems/rg_26.png differ diff --git a/assets/sprites/gems/rg_26.png.import b/assets/sprites/gems/rg_26.png.import new file mode 100644 index 0000000..cb91bd7 --- /dev/null +++ b/assets/sprites/gems/rg_26.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://1no532mlqarb" +path="res://.godot/imported/rg_26.png-6529b3c79947f4ba5c25f580580ec971.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/rg_26.png" +dest_files=["res://.godot/imported/rg_26.png-6529b3c79947f4ba5c25f580580ec971.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 diff --git a/assets/sprites/gems/rg_27.png b/assets/sprites/gems/rg_27.png new file mode 100644 index 0000000..5394233 Binary files /dev/null and b/assets/sprites/gems/rg_27.png differ diff --git a/assets/sprites/gems/rg_27.png.import b/assets/sprites/gems/rg_27.png.import new file mode 100644 index 0000000..21cc6e7 --- /dev/null +++ b/assets/sprites/gems/rg_27.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://co7th1qwwxjxn" +path="res://.godot/imported/rg_27.png-8938004b9628f8aeda9262bd786db5a9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/rg_27.png" +dest_files=["res://.godot/imported/rg_27.png-8938004b9628f8aeda9262bd786db5a9.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 diff --git a/assets/sprites/gems/rg_28.png b/assets/sprites/gems/rg_28.png new file mode 100644 index 0000000..1a16e0c Binary files /dev/null and b/assets/sprites/gems/rg_28.png differ diff --git a/assets/sprites/gems/rg_28.png.import b/assets/sprites/gems/rg_28.png.import new file mode 100644 index 0000000..7dbaa64 --- /dev/null +++ b/assets/sprites/gems/rg_28.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fq4b5b1v6icy" +path="res://.godot/imported/rg_28.png-2e048e93fec1403b6ea21c5b1935881c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/rg_28.png" +dest_files=["res://.godot/imported/rg_28.png-2e048e93fec1403b6ea21c5b1935881c.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 diff --git a/assets/sprites/gems/sg_08.png b/assets/sprites/gems/sg_08.png new file mode 100644 index 0000000..c661ce5 Binary files /dev/null and b/assets/sprites/gems/sg_08.png differ diff --git a/resources/textures/beanstalk-dark.webp.import b/assets/sprites/gems/sg_08.png.import similarity index 69% rename from resources/textures/beanstalk-dark.webp.import rename to assets/sprites/gems/sg_08.png.import index 662bc2c..0acb19c 100644 --- a/resources/textures/beanstalk-dark.webp.import +++ b/assets/sprites/gems/sg_08.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://c8y6tlvcgh2gn" -path="res://.godot/imported/beanstalk-dark.webp-c42752b76137a07f19260f250e70ea14.ctex" +uid="uid://ceybivs04remb" +path="res://.godot/imported/sg_08.png-456e723109256e511e4f59271e89a1dd.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://resources/textures/beanstalk-dark.webp" -dest_files=["res://.godot/imported/beanstalk-dark.webp-c42752b76137a07f19260f250e70ea14.ctex"] +source_file="res://assets/sprites/gems/sg_08.png" +dest_files=["res://.godot/imported/sg_08.png-456e723109256e511e4f59271e89a1dd.ctex"] [params] diff --git a/assets/sprites/gems/sg_16a.png b/assets/sprites/gems/sg_16a.png new file mode 100644 index 0000000..251cb00 Binary files /dev/null and b/assets/sprites/gems/sg_16a.png differ diff --git a/assets/sprites/gems/sg_16a.png.import b/assets/sprites/gems/sg_16a.png.import new file mode 100644 index 0000000..b9b88c2 --- /dev/null +++ b/assets/sprites/gems/sg_16a.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c6qtlkpw58jpy" +path="res://.godot/imported/sg_16a.png-129415a1b75d4949e50f566399c1150f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/sg_16a.png" +dest_files=["res://.godot/imported/sg_16a.png-129415a1b75d4949e50f566399c1150f.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 diff --git a/assets/sprites/gems/sg_19.png b/assets/sprites/gems/sg_19.png new file mode 100644 index 0000000..ffba8e2 Binary files /dev/null and b/assets/sprites/gems/sg_19.png differ diff --git a/assets/sprites/gems/sg_19.png.import b/assets/sprites/gems/sg_19.png.import new file mode 100644 index 0000000..95d25fd --- /dev/null +++ b/assets/sprites/gems/sg_19.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d28axjhxribfq" +path="res://.godot/imported/sg_19.png-b1ea45054dc2728d8236c4180e75429d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/sg_19.png" +dest_files=["res://.godot/imported/sg_19.png-b1ea45054dc2728d8236c4180e75429d.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 diff --git a/assets/sprites/gems/sg_26.png b/assets/sprites/gems/sg_26.png new file mode 100644 index 0000000..69c707b Binary files /dev/null and b/assets/sprites/gems/sg_26.png differ diff --git a/assets/sprites/gems/sg_26.png.import b/assets/sprites/gems/sg_26.png.import new file mode 100644 index 0000000..ae2c418 --- /dev/null +++ b/assets/sprites/gems/sg_26.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://yh45c4sn7skv" +path="res://.godot/imported/sg_26.png-57245822a5996857fe99d4c26a38369c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/sg_26.png" +dest_files=["res://.godot/imported/sg_26.png-57245822a5996857fe99d4c26a38369c.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 diff --git a/assets/sprites/gems/sg_27.png b/assets/sprites/gems/sg_27.png new file mode 100644 index 0000000..c7d6877 Binary files /dev/null and b/assets/sprites/gems/sg_27.png differ diff --git a/assets/sprites/gems/sg_27.png.import b/assets/sprites/gems/sg_27.png.import new file mode 100644 index 0000000..4a03c37 --- /dev/null +++ b/assets/sprites/gems/sg_27.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://decoapdi0m4x4" +path="res://.godot/imported/sg_27.png-6d03db4a93eb8c2abbb0bcbe2d02927d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/sg_27.png" +dest_files=["res://.godot/imported/sg_27.png-6d03db4a93eb8c2abbb0bcbe2d02927d.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 diff --git a/assets/sprites/gems/sg_28.png b/assets/sprites/gems/sg_28.png new file mode 100644 index 0000000..09b81c5 Binary files /dev/null and b/assets/sprites/gems/sg_28.png differ diff --git a/assets/sprites/gems/sg_28.png.import b/assets/sprites/gems/sg_28.png.import new file mode 100644 index 0000000..1ec89f7 --- /dev/null +++ b/assets/sprites/gems/sg_28.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bysfv51t2uous" +path="res://.godot/imported/sg_28.png-918eb466ccc52f61327fde547e81c4de.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/sg_28.png" +dest_files=["res://.godot/imported/sg_28.png-918eb466ccc52f61327fde547e81c4de.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 diff --git a/assets/sprites/gems/yg_08.png b/assets/sprites/gems/yg_08.png new file mode 100644 index 0000000..5f06017 Binary files /dev/null and b/assets/sprites/gems/yg_08.png differ diff --git a/assets/sprites/gems/yg_08.png.import b/assets/sprites/gems/yg_08.png.import new file mode 100644 index 0000000..358c3f7 --- /dev/null +++ b/assets/sprites/gems/yg_08.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dr4i4iefhp77u" +path="res://.godot/imported/yg_08.png-d1b083515e21d446d6c29169ce52b36e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/yg_08.png" +dest_files=["res://.godot/imported/yg_08.png-d1b083515e21d446d6c29169ce52b36e.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 diff --git a/assets/sprites/gems/yg_16a.png b/assets/sprites/gems/yg_16a.png new file mode 100644 index 0000000..0ad6f89 Binary files /dev/null and b/assets/sprites/gems/yg_16a.png differ diff --git a/assets/sprites/gems/yg_16a.png.import b/assets/sprites/gems/yg_16a.png.import new file mode 100644 index 0000000..f90961c --- /dev/null +++ b/assets/sprites/gems/yg_16a.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmdr0kpteuyyp" +path="res://.godot/imported/yg_16a.png-092b1b0a8f3c20aca96f1319c03fc488.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/yg_16a.png" +dest_files=["res://.godot/imported/yg_16a.png-092b1b0a8f3c20aca96f1319c03fc488.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 diff --git a/assets/sprites/gems/yg_19.png b/assets/sprites/gems/yg_19.png new file mode 100644 index 0000000..6e1e1ea Binary files /dev/null and b/assets/sprites/gems/yg_19.png differ diff --git a/assets/sprites/gems/yg_19.png.import b/assets/sprites/gems/yg_19.png.import new file mode 100644 index 0000000..76bc30c --- /dev/null +++ b/assets/sprites/gems/yg_19.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dghi2vaasxka7" +path="res://.godot/imported/yg_19.png-522df55e2af2ebec602812d3efd2c465.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/yg_19.png" +dest_files=["res://.godot/imported/yg_19.png-522df55e2af2ebec602812d3efd2c465.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 diff --git a/assets/sprites/gems/yg_26.png b/assets/sprites/gems/yg_26.png new file mode 100644 index 0000000..aa73db1 Binary files /dev/null and b/assets/sprites/gems/yg_26.png differ diff --git a/assets/sprites/gems/yg_26.png.import b/assets/sprites/gems/yg_26.png.import new file mode 100644 index 0000000..a663891 --- /dev/null +++ b/assets/sprites/gems/yg_26.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://q0e2ygr3bpmp" +path="res://.godot/imported/yg_26.png-8d3139f65b23caee79ec7ed924daf47d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/yg_26.png" +dest_files=["res://.godot/imported/yg_26.png-8d3139f65b23caee79ec7ed924daf47d.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 diff --git a/assets/sprites/gems/yg_27.png b/assets/sprites/gems/yg_27.png new file mode 100644 index 0000000..789bff2 Binary files /dev/null and b/assets/sprites/gems/yg_27.png differ diff --git a/assets/sprites/gems/yg_27.png.import b/assets/sprites/gems/yg_27.png.import new file mode 100644 index 0000000..6a3c389 --- /dev/null +++ b/assets/sprites/gems/yg_27.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bp3gfawevhvpo" +path="res://.godot/imported/yg_27.png-8c9608e70f18cfd76ba523f0a4cc04eb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/yg_27.png" +dest_files=["res://.godot/imported/yg_27.png-8c9608e70f18cfd76ba523f0a4cc04eb.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 diff --git a/assets/sprites/gems/yg_28.png b/assets/sprites/gems/yg_28.png new file mode 100644 index 0000000..3c7e0ad Binary files /dev/null and b/assets/sprites/gems/yg_28.png differ diff --git a/assets/sprites/gems/yg_28.png.import b/assets/sprites/gems/yg_28.png.import new file mode 100644 index 0000000..39657d3 --- /dev/null +++ b/assets/sprites/gems/yg_28.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4umsgm8wf6qo" +path="res://.godot/imported/yg_28.png-258091c8e08fe582d235027815a45951.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gems/yg_28.png" +dest_files=["res://.godot/imported/yg_28.png-258091c8e08fe582d235027815a45951.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 diff --git a/resources/textures/beanstalk-dark.webp b/assets/textures/backgrounds/beanstalk-dark.webp similarity index 100% rename from resources/textures/beanstalk-dark.webp rename to assets/textures/backgrounds/beanstalk-dark.webp diff --git a/assets/textures/backgrounds/beanstalk-dark.webp.import b/assets/textures/backgrounds/beanstalk-dark.webp.import new file mode 100644 index 0000000..98f0f4d --- /dev/null +++ b/assets/textures/backgrounds/beanstalk-dark.webp.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c8y6tlvcgh2gn" +path="res://.godot/imported/beanstalk-dark.webp-cdfce4b5eb60c993469ff7fa805e2a15.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/textures/backgrounds/beanstalk-dark.webp" +dest_files=["res://.godot/imported/beanstalk-dark.webp-cdfce4b5eb60c993469ff7fa805e2a15.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 diff --git a/default_bus_layout.tres b/data/default_bus_layout.tres similarity index 100% rename from default_bus_layout.tres rename to data/default_bus_layout.tres diff --git a/docs/CLAUDE.md b/docs/CLAUDE.md new file mode 100644 index 0000000..cd0e49f --- /dev/null +++ b/docs/CLAUDE.md @@ -0,0 +1,140 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +"Skelly" is a Godot 4.4 mobile game project featuring multiple gameplay modes within a unified game framework. The project currently supports match-3 puzzle gameplay with planned support for clickomania gameplay. It includes a modular gameplay system, menu system, settings management, audio handling, localization support, and a comprehensive debug system. + +**For detailed project architecture, see `docs/MAP.md`** + +## Development Commands + +### Running the Project +- Open project in Godot Editor: Import `project.godot` +- Run project: Press F5 in Godot Editor or use "Play" button +- Debug: Use Godot's built-in debugger and remote inspector +- Debug UI: Press F12 in-game or use debug button to toggle debug panels + +### Testing & Development +- Debug mode can be toggled with F12 key or debug button UI (available on all major scenes) +- Match-3 debug controls include gem count adjustment and board reroll +- Difficulty presets: Easy (3 gems), Normal (5 gems), Hard (8 gems) +- Gameplay mode switching: Space+Enter in game scene switches between match-3 and clickomania modes +- Test scripts located in `tests/` directory for system validation +- Use `test_logging.gd` to validate the logging system functionality + +### Audio Configuration +- Music: Located in `assets/audio/music/` directory with loop configuration in AudioManager +- Sound effects: UI clicks and game audio managed through audio bus system +- Audio buses: "Music" and "SFX" buses configured in `data/default_bus_layout.tres` + +### Localization +- Translations stored in `localization/` as `.translation` files +- Currently supports English and Russian +- New translations: Add to `project.godot` internationalization section + +### Asset Management +- **CRITICAL**: Every asset must be documented in `assets/sources.yaml` before committing +- Include source, license, attribution, modifications, and usage information +- Verify license compatibility with project requirements +- Commit asset files and sources.yaml together in the same commit + +## Key Development Guidelines + +### Scene Management +- **ALWAYS** use `GameManager` for scene transitions - never call `get_tree().change_scene_to_file()` directly +- Scene paths are defined as constants in GameManager +- Error handling is built into GameManager for failed scene loads +- Use `GameManager.start_game_with_mode(mode)` to launch specific gameplay modes +- Supported gameplay modes: "match3", "clickomania" + +### Autoload Usage +- Use autoloads for global state management only +- Prefer signals over direct access for loose coupling +- Don't access autoloads from deeply nested components + +### Debug System Integration +- Connect to `DebugManager.debug_ui_toggled` signal for debug UI visibility +- Use F12 key for global debug toggle +- Remove debug prints before committing unless permanently useful + +### Logging System Usage +- **ALWAYS** use `DebugManager` logging functions instead of `print()`, `push_error()`, etc. +- Use appropriate log levels: INFO for general messages, WARN for issues, ERROR for failures +- Include meaningful categories to organize log output: `"GameManager"`, `"Match3"`, `"Settings"` +- Leverage structured logging for better debugging and production monitoring +- Use `DebugManager.set_log_level()` to control verbosity during development and testing + +## Important File References + +### Documentation Structure +- **`docs/MAP.md`** - Complete project architecture and structure +- **`docs/CODE_OF_CONDUCT.md`** - Coding standards and best practices +- **`docs/TESTING.md`** - Testing guidelines and conventions +- **This file** - Claude Code specific development guidelines + +### Key Scripts to Understand +- `src/autoloads/GameManager.gd` - Scene transition patterns and gameplay mode management +- `src/autoloads/DebugManager.gd` - Debug system integration +- `scenes/game/game.gd` - Main game scene with modular gameplay system +- `scenes/game/gameplays/match3_gameplay.gd` - Match-3 implementation reference +- `scenes/game/gameplays/` - Individual gameplay mode implementations +- `project.godot` - Input actions and autoload definitions + +## Development Workflow + +### Before Making Changes +1. Check `docs/MAP.md` for architecture understanding +2. Review `docs/CODE_OF_CONDUCT.md` for coding standards +3. Understand existing patterns before implementing new features +4. If adding assets, prepare `assets/sources.yaml` documentation + +### Testing Changes +- Run project with F5 in Godot Editor +- Test debug UI with F12 toggle +- Verify scene transitions work correctly +- Check mobile compatibility if UI changes made +- Use relevant test scripts from `tests/` directory to validate system functionality +- Run `test_logging.gd` after making changes to the logging system + +### Common Implementation Patterns +- Scene transitions: Use `GameManager.start_game_with_mode()` and related methods +- Debug integration: Connect to `DebugManager` signals and initialize debug state +- Logging: Use `DebugManager.log_*()` functions with appropriate levels and categories +- Gameplay modes: Implement in `scenes/game/gameplays/` directory following modular pattern +- Scoring system: Connect `score_changed` signal from gameplay to main game scene +- Settings: Use `SettingsManager` for persistent configuration +- Audio: Use `AudioManager` for music and sound effects +- Localization: Use `LocalizationManager` for language switching + +### Logging Best Practices +```gdscript +# ✅ Good logging practices +DebugManager.log_info("Scene transition completed", "GameManager") +DebugManager.log_warn("Settings file not found, using defaults", "Settings") +DebugManager.log_error("Failed to load audio resource: " + audio_path, "AudioManager") + +# ❌ Avoid these patterns +print("debug") # Use structured logging instead +push_error("error") # Use DebugManager.log_error() with category +``` + +### Asset Management Workflow +```yaml +# ✅ Required assets/sources.yaml entry format +audio: + music: + "background_music.ogg": + source: "https://freesound.org/people/artist/sounds/123456/" + license: "CC BY 4.0" + attribution: "Background Music by Artist Name" + modifications: "Converted to OGG, adjusted volume" + usage: "Main menu and gameplay background music" + +# ✅ Proper commit workflow +# 1. Add asset to appropriate assets/ subdirectory +# 2. Update assets/sources.yaml with complete metadata +# 3. git add both files together +# 4. Commit with descriptive message including attribution +``` diff --git a/docs/CODE_OF_CONDUCT.md b/docs/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..40af68c --- /dev/null +++ b/docs/CODE_OF_CONDUCT.md @@ -0,0 +1,363 @@ +# Code of Conduct - Skelly Project + +## Overview + +This document establishes coding standards and development practices for the Skelly project. These guidelines are designed to help junior developers contribute effectively while maintaining code quality and project consistency. + +## Core Principles + +### 1. Code Clarity Over Cleverness +- Write code that is easy to read and understand +- Use descriptive variable and function names +- Prefer explicit code over implicit or "clever" solutions +- Comment complex logic and business rules + +### 2. Consistency First +- Follow existing code patterns in the project +- Use the same naming conventions throughout +- Maintain consistent indentation and formatting +- Follow Godot's GDScript style guide + +### 3. Incremental Development +- Make small, focused commits +- Test changes before committing +- Don't break existing functionality +- Use the debug system to verify your changes + +## GDScript Coding Standards + +### Naming Conventions +```gdscript +# Variables and functions: snake_case +var player_health: int = 100 +func calculate_damage() -> int: + +# Constants: SCREAMING_SNAKE_CASE +const MAX_HEALTH := 100 +const TILE_SPACING := 54 + +# Classes: PascalCase +class_name PlayerController + +# Signals: past_tense +signal health_changed +signal game_started + +# Private functions: prefix with underscore +func _ready(): +func _initialize_grid(): +``` + +### File Organization +```gdscript +# 1. extends statement +extends Node2D + +# 2. class_name (if applicable) +class_name Match3Controller + +# 3. Constants +const GRID_SIZE := Vector2i(8, 8) + +# 4. Signals +signal match_found(tiles: Array) + +# 5. Variables +var grid := [] +@onready var debug_ui = $DebugUI + +# 6. Functions (lifecycle first, then custom) +func _ready(): +func _process(delta): +func custom_function(): +``` + +### Documentation Requirements +```gdscript +# Required for all public functions +func set_gem_pool(gem_indices: Array) -> void: + """Set specific gem types as the active pool""" + _update_all_tiles_gem_pool(gem_indices) + print("Set gem pool to: ", gem_indices) + +# Document complex algorithms +func _get_match_line(start: Vector2i, dir: Vector2i) -> Array: + """Find all matching tiles in a line from start position in given direction""" + var line = [grid[start.y][start.x]] + var type = grid[start.y][start.x].tile_type + # Implementation... +``` + +## Project-Specific Guidelines + +### Scene Management +- All scene transitions MUST go through `GameManager` +- Never use `get_tree().change_scene_to_file()` directly +- Define scene paths as constants in GameManager + +```gdscript +# ✅ Correct +GameManager.start_match3_game() + +# ❌ Wrong +GameManager.start_match3_game() # Use GameManager instead of direct scene loading +``` + +### Autoload Usage +- Use autoloads for global state only +- Don't access autoloads from deeply nested components +- Pass data through signals or direct references when possible + +```gdscript +# ✅ Correct - using signals +signal settings_changed +SettingsManager.volume_changed.connect(_on_volume_changed) + +# ✅ Also correct - direct access for global state +var current_language = SettingsManager.get_setting("language") + +# ❌ Wrong - tight coupling +func some_deep_function(): + SettingsManager.set_setting("volume", 0.5) # Too deep in call stack +``` + +### Debug System Integration +- Always connect to DebugManager signals for debug UI +- Use structured logging instead of plain print statements +- Remove temporary debug logs before committing (unless permanently useful) + +```gdscript +# ✅ Correct debug integration +func _connect_to_global_debug() -> void: + DebugManager.debug_ui_toggled.connect(_on_debug_ui_toggled) + debug_ui.visible = DebugManager.is_debug_ui_visible() + +# ✅ Good structured logging +DebugManager.log_debug("Debug UI toggled to: " + str(visible), "Match3") +DebugManager.log_info("Initialized " + str(tiles.size()) + " tiles", "TileSystem") + +# ❌ Bad logging practices +print("test") # Not descriptive, use structured logging +print(some_variable) # No context, use proper log level +``` + +### Logging Standards +- **ALWAYS** use `DebugManager.log_*()` functions instead of `print()` or `push_error()` +- Choose appropriate log levels based on message importance and audience +- Include meaningful categories to organize log output by system/component +- Format messages with clear, descriptive text and relevant context + +```gdscript +# ✅ Correct logging usage +DebugManager.log_info("Game scene loaded successfully", "SceneManager") +DebugManager.log_warn("Audio file not found, using default", "AudioManager") +DebugManager.log_error("Failed to save settings: " + error_message, "Settings") + +# ❌ Wrong approaches +print("loaded") # Use DebugManager.log_info() with category +push_error("error") # Use DebugManager.log_error() with context +if debug_mode: print("debug info") # Use DebugManager.log_debug() +``` + +### Asset Management +- **MANDATORY**: Every asset added to the project must be documented in `assets/sources.yaml` +- Include complete source information, license details, and attribution requirements +- Document any modifications made to original assets +- Verify license compatibility with project usage before adding assets +- Update sources.yaml in the same commit as adding the asset + +```gdscript +# ✅ Correct asset addition workflow +# 1. Add asset file to appropriate assets/ subdirectory +# 2. Update assets/sources.yaml with complete metadata +# 3. Commit both files together with descriptive message + +# Example sources.yaml entry: +# audio: +# sfx: +# "button_click.wav": +# source: "https://freesound.org/people/user/sounds/12345/" +# license: "CC BY 3.0" +# attribution: "Button Click by SoundArtist" +# modifications: "Normalized volume, trimmed silence" +# usage: "UI button interactions" +``` + +### Error Handling +- Always check if resources loaded successfully +- Use `DebugManager.log_error()` for critical failures +- Provide fallback behavior when possible +- Include meaningful context in error messages + +```gdscript +# ✅ Correct error handling with structured logging +func load_scene(path: String) -> void: + var packed_scene := load(path) + if not packed_scene or not packed_scene is PackedScene: + DebugManager.log_error("Failed to load scene at: %s" % path, "SceneLoader") + return + DebugManager.log_info("Successfully loaded scene: %s" % path, "SceneLoader") + get_tree().change_scene_to_packed(packed_scene) +``` + +## Git Workflow + +### Commit Guidelines +- Use clear, descriptive commit messages +- Start with a verb in imperative mood +- Keep first line under 50 characters +- Add body if needed for complex changes + +```bash +# ✅ Good commit messages +Add gem pool management to match-3 system +Fix debug UI visibility toggle issue +Update documentation for new debug system + +# ❌ Bad commit messages +fix bug +update +wip +``` + +### Branch Management +- Create feature branches for new functionality +- Use descriptive branch names: `feature/debug-ui`, `fix/tile-positioning` +- Keep branches focused on single features +- Delete branches after merging + +### Before Committing +1. Test your changes in the Godot editor +2. Check that existing functionality still works +3. Use the debug system to verify your implementation +4. Run the project and navigate through affected areas +5. Remove temporary debug code + +## Code Review Guidelines + +### For Reviewers +- Focus on code clarity and maintainability +- Check for adherence to project patterns +- Verify that autoloads are used appropriately +- Ensure debug integration is properly implemented +- Test the changes yourself + +### For Contributors +- Explain complex logic in commit messages or comments +- Provide context for why changes were made +- Test edge cases and error conditions +- Ask questions if project patterns are unclear + +## Testing Approach + +### Manual Testing Requirements +- Test in Godot editor with F5 run +- Verify debug UI works with F12 toggle +- Check scene transitions work correctly +- Test on different screen sizes (mobile target) +- Verify audio and settings integration + +### Debug System Testing +- Ensure debug panels appear/disappear correctly +- Test all debug buttons and controls +- Verify debug state persists across scene changes +- Check that debug code doesn't affect release builds + +## Common Mistakes to Avoid + +### Architecture Violations +```gdscript +# ❌ Don't bypass GameManager +get_tree().change_scene_to_file("some_scene.tscn") + +# ❌ Don't hardcode paths +var tile = load("res://scenes/game/gameplays/tile.tscn") + +# ❌ Don't ignore null checks +var node = get_node("SomeNode") +node.do_something() # Could crash if node doesn't exist + +# ❌ Don't create global state in random scripts +# Use autoloads instead +``` + +### Asset Management Violations +```gdscript +# ❌ Don't add assets without documentation +# Adding audio/new_music.mp3 without updating sources.yaml + +# ❌ Don't use assets without verifying licenses +# Using copyrighted music without permission + +# ❌ Don't modify assets without documenting changes +# Editing sprites without noting modifications in sources.yaml + +# ❌ Don't commit assets and documentation separately +git add assets/sprites/new_sprite.png +git commit -m "add sprite" # Missing sources.yaml update + +# ✅ Correct approach +git add assets/sprites/new_sprite.png assets/sources.yaml +git commit -m "add new sprite with attribution" +``` + +### Performance Issues +```gdscript +# ❌ Don't search nodes repeatedly +func _process(delta): + var ui = get_node("UI") # Expensive every frame + +# ✅ Cache node references +@onready var ui = $UI +func _process(delta): + ui.update_display() # Much better +``` + +### Debug System Misuse +```gdscript +# ❌ Don't create separate debug systems +var my_debug_enabled = false +print("debug: " + some_info) # Don't use plain print() + +# ✅ Use the global debug and logging systems +if DebugManager.is_debug_enabled(): + show_debug_info() +DebugManager.log_debug("Debug information: " + some_info, "MyComponent") +``` + +## Learning Resources + +### Godot-Specific +- [GDScript Style Guide](https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_styleguide.html) +- [Godot Best Practices](https://docs.godotengine.org/en/stable/tutorials/best_practices/index.html) +- Project documentation in `docs/map.md` + +### General Programming +- Clean Code principles +- SOLID principles (adapted for game development) +- Git best practices + +## Getting Help + +### When Stuck +1. Check existing code for similar patterns +2. Review project documentation (`docs/`) +3. Use the debug system to understand current state +4. Ask specific questions about project architecture +5. Test your understanding with small experiments + +### Code Review Process +- Submit pull requests early and often +- Ask for feedback on approach before implementing large features +- Be open to suggestions and alternative approaches +- Learn from review feedback for future contributions + +## Summary + +This code of conduct emphasizes: +- **Clarity**: Write code that others can understand +- **Consistency**: Follow established patterns +- **Integration**: Use the project's systems properly +- **Learning**: Continuously improve your skills + +Remember: It's better to ask questions and write clear, simple code than to guess and create complex, hard-to-maintain solutions. The goal is to contribute effectively to a codebase that will grow and evolve over time. diff --git a/docs/MAP.md b/docs/MAP.md new file mode 100644 index 0000000..f81d7c7 --- /dev/null +++ b/docs/MAP.md @@ -0,0 +1,340 @@ +# Skelly - Project Structure Map + +## Overview +Skelly is a Godot 4.4 game project featuring multiple gameplay modes with skeleton character themes. The project supports match-3 puzzle gameplay with planned clickomania gameplay through a modular gameplay architecture. It follows a modular structure with clear separation between scenes, autoloads, assets, and data. + +## Project Root Structure + +``` +skelly/ +├── .claude/ # Claude Code configuration +├── .godot/ # Godot engine generated files (ignored) +├── assets/ # Game assets (sprites, audio, textures) +├── data/ # Game data and configuration files +├── docs/ # Documentation +├── localization/ # Internationalization files +├── scenes/ # Godot scenes (.tscn) and scripts (.gd) +├── src/ # Source code organization +├── tests/ # Test scripts and validation utilities +├── project.godot # Main Godot project configuration +└── icon.svg # Project icon +``` + +## Core Architecture + +### Autoloads (Global Singletons) +Located in `src/autoloads/`, these scripts are automatically loaded when the game starts: + +1. **SettingsManager** (`src/autoloads/SettingsManager.gd`) + - Manages game settings and user preferences + - Handles configuration file I/O + - Provides language selection functionality + - Dependencies: `localization/languages.json` + +2. **AudioManager** (`src/autoloads/AudioManager.gd`) + - Controls music and sound effects + - Manages audio bus configuration + - Uses: `data/default_bus_layout.tres` + +3. **GameManager** (`src/autoloads/GameManager.gd`) + - Central game state management and gameplay mode coordination + - Scene transitions between main/game scenes + - Gameplay mode selection and launching (match3, clickomania) + - Navigation flow control + - References: main.tscn, game.tscn and individual gameplay scenes + +4. **LocalizationManager** (`src/autoloads/LocalizationManager.gd`) + - Language switching functionality + - Works with Godot's built-in internationalization system + - Uses translation files in `localization/` + +5. **DebugManager** (`src/autoloads/DebugManager.gd`) + - Global debug state management and centralized logging system + - Debug UI visibility control + - F12 toggle functionality + - Signal-based debug system + - Structured logging with configurable log levels (TRACE, DEBUG, INFO, WARN, ERROR, FATAL) + - Timestamp-based log formatting with category support + - Runtime log level filtering for development and production builds + +## Scene Hierarchy & Flow + +### Main Scenes +``` +main.tscn (Entry Point) +├── PressAnyKeyScreen.tscn +├── MainMenu.tscn +└── SettingsMenu.tscn + +game.tscn (Gameplay Container) +├── GameplayContainer (Dynamic content) +├── UI/ScoreDisplay +├── BackButton +└── DebugToggle +``` + +### Game Flow +1. **Main Scene** (`scenes/main/main.tscn` + `Main.gd`) + - Application entry point + - Manages "Press Any Key" screen + - Transitions to main menu + - Dynamic menu loading system + +2. **Press Any Key Screen** (`scenes/main/PressAnyKeyScreen.tscn` + `PressAnyKeyScreen.gd`) + - Initial splash screen + - Input detection for any key/button + - Signals to main scene for transition + +3. **Main Menu** (`scenes/ui/MainMenu.tscn` + `MainMenu.gd`) + - Primary navigation hub + - Start game, settings, quit options + - Connected to GameManager for scene transitions + +4. **Settings Menu** (`scenes/ui/SettingsMenu.tscn` + `SettingsMenu.gd`) + - User preferences interface + - Language selection + - Audio volume controls + - Connected to SettingsManager and AudioManager + +5. **Game Scene** (`scenes/game/game.tscn` + `game.gd`) + - Main gameplay container with modular gameplay system + - Dynamic loading of gameplay modes into GameplayContainer + - Global score management and display + - Back button for navigation to main menu + - Gameplay mode switching support (Space+Enter debug key) + - Bridge between UI and individual gameplay implementations + +### UI Components +``` +scenes/ui/ +├── DebugToggle.tscn + DebugToggle.gd # Now available on all major scenes +├── DebugMenu.tscn + DebugMenu.gd # Match-3 debug controls +├── MainMenu.tscn + MainMenu.gd +└── SettingsMenu.tscn + SettingsMenu.gd +``` + +## Modular Gameplay System + +The game now uses a modular gameplay architecture where different game modes can be dynamically loaded into the main game scene. + +### Gameplay Architecture +- **Main Game Scene** (`scenes/game/game.gd`) - Container and coordinator +- **Gameplay Directory** (`scenes/game/gameplays/`) - Individual gameplay implementations +- **Dynamic Loading** - Gameplay scenes loaded at runtime based on mode selection +- **Signal-based Communication** - Gameplays communicate with main scene via signals + +### Current Gameplay Modes + +#### Match-3 Mode (`scenes/game/gameplays/match3_gameplay.tscn`) +1. **Match3 Controller** (`scenes/game/gameplays/match3_gameplay.gd`) + - Grid management (8x8 default) + - Match detection algorithms + - Tile dropping and refilling + - Gem pool management (3-8 gem types) + - Debug UI integration + - Score reporting via `score_changed` signal + +2. **Tile System** (`scenes/game/gameplays/tile.gd` + `Tile.tscn`) + - Individual tile behavior + - Gem type management + - Visual representation + - Group membership for coordination + +#### Clickomania Mode (`scenes/game/gameplays/clickomania_gameplay.tscn`) +- Planned implementation for clickomania-style gameplay +- Will integrate with same scoring and UI systems as match-3 + +### Debug System +- Global debug state via DebugManager with proper initialization +- Debug toggle available on all major scenes (MainMenu, SettingsMenu, PressAnyKeyScreen, Game) +- Match-3 specific debug UI panel with gem count controls and difficulty presets +- Gem count controls (+/- buttons) with difficulty presets (Easy: 3, Normal: 5, Hard: 8) +- Board reroll functionality for testing +- F12 toggle support across all scenes +- Debug prints reduced in production code + +## Asset Organization + +### Audio (`assets/audio/`) +``` +audio/ +├── music/ # Background music files +└── sfx/ # Sound effects +``` + +### Visual Assets (`assets/`) +``` +assets/ +├── audio/ +│ ├── music/ # Background music files +│ └── sfx/ # Sound effects +├── sprites/ +│ ├── characters/skeleton/ # Character artwork +│ ├── gems/ # Match-3 gem sprites +│ └── ui/ # User interface elements +├── textures/ +│ └── backgrounds/ # Background images +├── fonts/ # Custom fonts +└── sources.yaml # Asset metadata and attribution +``` + +### Asset Management (`assets/sources.yaml`) +**REQUIRED**: Every asset added to the project must be documented in `assets/sources.yaml` with: +- **Source information** - Where the asset came from (URL, artist, store, etc.) +- **License details** - Usage rights, attribution requirements, commercial permissions +- **Attribution text** - Exact text to use for credits if required +- **Modification notes** - Any changes made to the original asset +- **Usage context** - Where and how the asset is used in the project + +**Example format:** +```yaml +audio: + music: + "Space Horror InGame Music (Exploration) _Clement Panchout.wav": + source: "https://freesound.org/people/ClementPanchout/" + license: "CC BY 4.0" + attribution: "Space Horror InGame Music by Clement Panchout" + modifications: "Converted to WAV, loop points adjusted" + usage: "Background music for all gameplay scenes" + +sprites: + gems: + "gem_blue.png": + source: "Created in-house" + license: "Project proprietary" + attribution: "Skelly development team" + modifications: "None" + usage: "Match-3 blue gem sprite" +``` + +## Data & Configuration + +### Game Data (`data/`) +- `default_bus_layout.tres` - Audio bus configuration for Godot + +### Documentation (`docs/`) +- `MAP.md` - Project architecture and structure overview +- `CLAUDE.md` - Claude Code development guidelines +- `CODE_OF_CONDUCT.md` - Coding standards and best practices +- `TESTING.md` - Testing guidelines and conventions + +### Localization (`localization/`) +- `languages.json` - Available language definitions +- `MainStrings.en.translation` - English translations +- `MainStrings.ru.translation` - Russian translations + +### Testing & Validation (`tests/`) +- `test_logging.gd` - DebugManager logging system validation +- `README.md` - Brief directory overview (see docs/TESTING.md for full guidelines) +- Future test scripts for individual components and integration testing +- Temporary test utilities for development and debugging + +### Project Configuration +- `project.godot` - Main Godot project settings + - Autoload definitions + - Input map configurations + - Rendering settings + - Audio bus references + +## Key Dependencies & Connections + +### Signal Connections +``` +PressAnyKeyScreen --[any_key_pressed]--> Main +MainMenu --[open_settings]--> Main +SettingsMenu --[back_to_main_menu]--> Main +DebugManager --[debug_toggled]--> All scenes with DebugToggle +GameplayModes --[score_changed]--> Game Scene +Game Scene --[score updates]--> UI/ScoreDisplay +``` + +### Scene References +``` +GameManager --> main.tscn, game.tscn +GameManager --> scenes/game/gameplays/*.tscn (via GAMEPLAY_SCENES constant) +Main --> MainMenu.tscn, SettingsMenu.tscn +Game --> GameplayContainer (dynamic loading of gameplay scenes) +Game --> scenes/game/gameplays/match3_gameplay.tscn, clickomania_gameplay.tscn +``` + +### Asset Dependencies +``` +AudioManager --> assets/audio/music/ +SettingsManager --> localization/languages.json +AudioManager --> data/default_bus_layout.tres +Asset Management --> assets/sources.yaml (required for all assets) +``` + +## Logging System + +The project uses a centralized logging system implemented in DebugManager for consistent, structured logging throughout the application. + +### Log Levels +``` +TRACE (0) - Detailed execution tracing (debug mode only) +DEBUG (1) - Development debugging information (debug mode only) +INFO (2) - General application information (always visible) +WARN (3) - Warning messages that don't break functionality +ERROR (4) - Error conditions that may affect functionality +FATAL (5) - Critical errors that may cause application failure +``` + +### Usage Examples +```gdscript +# Basic logging with automatic categorization +DebugManager.log_info("Game started successfully") +DebugManager.log_warn("Settings file not found, using defaults") +DebugManager.log_error("Failed to load audio resource") + +# Logging with custom categories for better organization +DebugManager.log_debug("Grid regenerated with 64 tiles", "Match3") +DebugManager.log_info("Language changed to: en", "SettingsManager") +DebugManager.log_error("Invalid scene path provided", "GameManager") +``` + +### Log Format +``` +[timestamp] LEVEL [category]: message +Example: [2025-09-24T10:48:08] INFO [GameManager]: Loading main scene +``` + +### Runtime Configuration +```gdscript +# Set minimum log level (filters out lower priority messages) +DebugManager.set_log_level(DebugManager.LogLevel.WARN) + +# Get current log level +var current_level = DebugManager.get_log_level() + +# Check if a specific level would be logged +if DebugManager._should_log(DebugManager.LogLevel.DEBUG): + # Expensive debug calculation here +``` + +### Integration with Godot Systems +- **WARN/ERROR/FATAL** levels automatically call `push_warning()` and `push_error()` +- **TRACE/DEBUG** levels only display when debug mode is enabled +- **INFO** and higher levels always display regardless of debug mode +- All levels respect the configured minimum log level threshold + +## Development Notes + +### Current Implementation Status +- Modular gameplay system with dynamic loading architecture +- Match-3 system with 8x8 grid and configurable gem pools +- Global scoring system integrated across gameplay modes +- Debug UI system with F12 toggle functionality across all major scenes +- Scene transition system via GameManager with gameplay mode support +- Internationalization support for English/Russian + +### Architecture Patterns +1. **Autoload Pattern** - Global managers as singletons +2. **Signal-Based Communication** - Loose coupling between components +3. **Modular Gameplay Architecture** - Dynamic loading of gameplay modes +4. **Scene Composition** - Modular scene loading and management +5. **Data-Driven Configuration** - JSON for settings and translations +6. **Component Architecture** - Reusable UI and game components +7. **Centralized Scoring System** - Global score management across gameplay modes +8. **Structured Logging System** - Centralized logging with level-based filtering and formatted output + +This structure provides a clean separation of concerns, making the codebase maintainable and extensible for future features. diff --git a/docs/TESTING.md b/docs/TESTING.md new file mode 100644 index 0000000..7d6aef0 --- /dev/null +++ b/docs/TESTING.md @@ -0,0 +1,156 @@ +# Tests Directory + +This directory contains test scripts and utilities for validating various systems and components in the Skelly project. + +## Overview + +The `tests/` directory is designed to house: +- System validation scripts +- Component testing utilities +- Integration tests +- Performance benchmarks +- Debugging tools + +## Current Test Files + +### `test_logging.gd` +Comprehensive test script for the DebugManager logging system. + +**Features:** +- Tests all log levels (TRACE, DEBUG, INFO, WARN, ERROR, FATAL) +- Validates log level filtering functionality +- Tests category-based logging organization +- Verifies debug mode integration +- Demonstrates proper logging usage patterns + +**Usage:** +```gdscript +# Option 1: Add as temporary autoload +# In project.godot, add: tests/test_logging.gd + +# Option 2: Instantiate in a scene +var test_script = preload("res://tests/test_logging.gd").new() +add_child(test_script) + +# Option 3: Run directly from editor +# Open the script and run the scene containing it +``` + +**Expected Output:** +The script will output formatted log messages demonstrating: +- Proper timestamp formatting +- Log level filtering behavior +- Category organization +- Debug mode dependency for TRACE/DEBUG levels + +## Adding New Tests + +When creating new test files, follow these conventions: + +### File Naming +- Use descriptive names starting with `test_` +- Example: `test_audio_manager.gd`, `test_scene_transitions.gd` + +### File Structure +```gdscript +extends Node + +# Brief description of what this test validates + +func _ready(): + # Wait for system initialization if needed + await get_tree().process_frame + run_tests() + +func run_tests(): + print("=== Starting [System Name] Tests ===") + + # Individual test functions + test_basic_functionality() + test_edge_cases() + test_error_conditions() + + print("=== [System Name] Tests Complete ===") + +func test_basic_functionality(): + print("\\n--- Test: Basic Functionality ---") + # Test implementation + +func test_edge_cases(): + print("\\n--- Test: Edge Cases ---") + # Edge case testing + +func test_error_conditions(): + print("\\n--- Test: Error Conditions ---") + # Error condition testing +``` + +### Testing Guidelines + +1. **Independence**: Each test should be self-contained and not depend on other tests +2. **Cleanup**: Restore original state after testing (settings, debug modes, etc.) +3. **Clear Output**: Use descriptive print statements to show test progress +4. **Error Handling**: Test both success and failure conditions +5. **Documentation**: Include comments explaining complex test scenarios + +### Integration with Main Project + +- **Temporary Usage**: Test files are meant to be added temporarily during development +- **Not in Production**: These files should not be included in release builds +- **Autoload Testing**: Add to autoloads temporarily for automatic execution +- **Manual Testing**: Run individually when testing specific components + +## Test Categories + +### System Tests +Test core autoload managers and global systems: +- `test_logging.gd` - DebugManager logging system +- Future: `test_settings.gd` - SettingsManager functionality +- Future: `test_audio.gd` - AudioManager functionality +- Future: `test_scene_management.gd` - GameManager transitions + +### Component Tests +Test individual game components: +- Future: `test_match3.gd` - Match-3 gameplay mechanics +- Future: `test_tile_system.gd` - Tile behavior and interactions +- Future: `test_ui_components.gd` - Menu and UI functionality + +### Integration Tests +Test system interactions and workflows: +- Future: `test_game_flow.gd` - Complete game session flow +- Future: `test_debug_system.gd` - Debug UI integration +- Future: `test_localization.gd` - Language switching and translations + +## Running Tests + +### During Development +1. Copy or symlink the test file to your scene +2. Add as a child node or autoload temporarily +3. Run the project and observe console output +4. Remove from project when testing is complete + +### Automated Testing +While Godot doesn't have built-in unit testing, these scripts provide: +- Consistent validation approach +- Repeatable test scenarios +- Clear pass/fail output +- System behavior documentation + +## Best Practices + +1. **Document Expected Behavior**: Include comments about what should happen +2. **Test Boundary Conditions**: Include edge cases and error conditions +3. **Measure Performance**: Add timing for performance-critical components +4. **Visual Validation**: For UI components, include visual checks +5. **Cleanup After Tests**: Restore initial state to avoid side effects + +## Contributing + +When adding new test files: +1. Follow the naming and structure conventions +2. Update this README with new test descriptions +3. Ensure tests are self-contained and documented +4. Test both success and failure scenarios +5. Include performance considerations where relevant + +This testing approach helps maintain code quality and provides validation tools for system changes and refactoring. diff --git a/project.godot b/project.godot index ce8cde1..9143630 100644 --- a/project.godot +++ b/project.godot @@ -11,16 +11,21 @@ config_version=5 [application] config/name="Skelly" -run/main_scene="uid://ci2gk11211n0d" +run/main_scene="res://scenes/main/main.tscn" config/features=PackedStringArray("4.4", "Mobile") config/icon="res://icon.svg" +[audio] + +buses/default_bus_layout="res://data/default_bus_layout.tres" + [autoload] -SettingsManager="*res://scripts/SettingsManager.gd" -AudioManager="*res://scripts/AudioManager.gd" -GameManager="*res://scripts/GameManager.gd" -LocalizationManager="*res://scripts/LocalizationManager.gd" +SettingsManager="*res://src/autoloads/SettingsManager.gd" +AudioManager="*res://src/autoloads/AudioManager.gd" +GameManager="*res://src/autoloads/GameManager.gd" +LocalizationManager="*res://src/autoloads/LocalizationManager.gd" +DebugManager="*res://src/autoloads/DebugManager.gd" [input] @@ -51,4 +56,5 @@ locale/translations=PackedStringArray("res://localization/MainStrings.en.transla [rendering] textures/canvas_textures/default_texture_filter=0 -renderer/rendering_method="mobile" +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" diff --git a/scenes/game.gd b/scenes/game.gd deleted file mode 100644 index f51204f..0000000 --- a/scenes/game.gd +++ /dev/null @@ -1,12 +0,0 @@ -extends Node - -@onready var back_button: Button = $BackButtonContainer/BackButton - -func _ready() -> void: - if not back_button.pressed.is_connected(_on_back_button_pressed): - back_button.pressed.connect(_on_back_button_pressed) - -func _on_back_button_pressed() -> void: - AudioManager.play_ui_click() - GameManager.save_game() - GameManager.exit_to_main_menu() diff --git a/scenes/game.gd.uid b/scenes/game.gd.uid deleted file mode 100644 index a218c43..0000000 --- a/scenes/game.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bvtr6yhlyuv4v diff --git a/scenes/game.tscn b/scenes/game.tscn deleted file mode 100644 index 3a73f1d..0000000 --- a/scenes/game.tscn +++ /dev/null @@ -1,17 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://dmwkyeq2l7u04"] - -[ext_resource type="Script" uid="uid://bvtr6yhlyuv4v" path="res://scenes/game.gd" id="1_uwrxv"] - -[node name="Game" type="Node"] -script = ExtResource("1_uwrxv") - -[node name="BackButtonContainer" type="Control" parent="."] -layout_mode = 3 -anchors_preset = 0 -offset_right = 40.0 -offset_bottom = 40.0 - -[node name="BackButton" type="Button" parent="BackButtonContainer"] -offset_right = 45.0 -offset_bottom = 31.0 -text = "back" diff --git a/scenes/game/game.gd b/scenes/game/game.gd new file mode 100644 index 0000000..d39ec2a --- /dev/null +++ b/scenes/game/game.gd @@ -0,0 +1,63 @@ +extends Control + +const GAMEPLAY_SCENES = { + "match3": "res://scenes/game/gameplays/match3_gameplay.tscn", + "clickomania": "res://scenes/game/gameplays/clickomania_gameplay.tscn" +} + +@onready var back_button: Button = $BackButtonContainer/BackButton +@onready var gameplay_container: Control = $GameplayContainer +@onready var score_display: Label = $UI/ScoreDisplay + +var current_gameplay_mode: String +var global_score: int = 0 : set = set_global_score + +func _ready() -> void: + if not back_button.pressed.is_connected(_on_back_button_pressed): + back_button.pressed.connect(_on_back_button_pressed) + + # Default to match3 for now + set_gameplay_mode("match3") + +func set_gameplay_mode(mode: String) -> void: + current_gameplay_mode = mode + load_gameplay(mode) + +func load_gameplay(mode: String) -> void: + # Clear existing gameplay + for child in gameplay_container.get_children(): + child.queue_free() + + # Load new gameplay + if GAMEPLAY_SCENES.has(mode): + var gameplay_scene = load(GAMEPLAY_SCENES[mode]) + var gameplay_instance = gameplay_scene.instantiate() + gameplay_container.add_child(gameplay_instance) + + # Connect gameplay signals to shared systems + if gameplay_instance.has_signal("score_changed"): + gameplay_instance.score_changed.connect(_on_score_changed) + +func set_global_score(value: int) -> void: + global_score = value + if score_display: + score_display.text = "Score: " + str(global_score) + +func _on_score_changed(points: int) -> void: + self.global_score += points + +func _on_back_button_pressed() -> void: + print("Back button pressed in game scene") + AudioManager.play_ui_click() + GameManager.save_game() + GameManager.exit_to_main_menu() + +func _input(event: InputEvent) -> void: + if event.is_action_pressed("ui_accept") and Input.is_action_pressed("ui_select"): + # Debug: Switch to clickomania when Space+Enter pressed together + if current_gameplay_mode == "match3": + set_gameplay_mode("clickomania") + print("Switched to clickomania gameplay") + else: + set_gameplay_mode("match3") + print("Switched to match3 gameplay") diff --git a/scenes/game/game.tscn b/scenes/game/game.tscn new file mode 100644 index 0000000..8b44908 --- /dev/null +++ b/scenes/game/game.tscn @@ -0,0 +1,74 @@ +[gd_scene load_steps=4 format=3 uid="uid://dmwkyeq2l7u04"] + +[ext_resource type="Script" uid="uid://b16jnk7w22mb" path="res://scenes/game/game.gd" id="1_uwrxv"] +[ext_resource type="PackedScene" path="res://scenes/ui/DebugToggle.tscn" id="3_debug"] +[ext_resource type="Texture2D" uid="uid://c8y6tlvcgh2gn" path="res://assets/textures/backgrounds/beanstalk-dark.webp" id="5_background"] + +[node name="Game" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_uwrxv") + +[node name="Background" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("5_background") +stretch_mode = 1 + +[node name="UI" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ScoreDisplay" type="Label" parent="UI"] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_left = 10.0 +offset_top = -31.0 +offset_right = 110.0 +offset_bottom = -10.0 +grow_vertical = 0 +text = "Score: 0" + +[node name="GameplayContainer" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="BackButtonContainer" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 0 +offset_left = 10.0 +offset_top = 10.0 +offset_right = 55.0 +offset_bottom = 41.0 + +[node name="BackButton" type="Button" parent="BackButtonContainer"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "back" + +[node name="DebugToggle" parent="." instance=ExtResource("3_debug")] +layout_mode = 1 + +[connection signal="pressed" from="BackButtonContainer/BackButton" to="." method="_on_back_button_pressed"] diff --git a/scenes/game/gameplays/Match3DebugMenu.gd b/scenes/game/gameplays/Match3DebugMenu.gd new file mode 100644 index 0000000..f137bd2 --- /dev/null +++ b/scenes/game/gameplays/Match3DebugMenu.gd @@ -0,0 +1,129 @@ +extends Control + +@onready var regenerate_button: Button = $VBoxContainer/RegenerateButton +@onready var gem_types_spinbox: SpinBox = $VBoxContainer/GemTypesContainer/GemTypesSpinBox +@onready var gem_types_label: Label = $VBoxContainer/GemTypesContainer/GemTypesLabel +@onready var grid_width_spinbox: SpinBox = $VBoxContainer/GridSizeContainer/GridWidthContainer/GridWidthSpinBox +@onready var grid_height_spinbox: SpinBox = $VBoxContainer/GridSizeContainer/GridHeightContainer/GridHeightSpinBox +@onready var grid_width_label: Label = $VBoxContainer/GridSizeContainer/GridWidthContainer/GridWidthLabel +@onready var grid_height_label: Label = $VBoxContainer/GridSizeContainer/GridHeightContainer/GridHeightLabel + +var match3_scene: Node2D + +func _ready(): + print("Match3DebugMenu: _ready() called") + DebugManager.debug_toggled.connect(_on_debug_toggled) + # Initialize with current debug state + var current_debug_state = DebugManager.is_debug_enabled() + print("Match3DebugMenu: Current debug state is ", current_debug_state) + visible = current_debug_state + print("Match3DebugMenu: Initial visibility set to ", visible) + if current_debug_state: + _on_debug_toggled(true) + regenerate_button.pressed.connect(_on_regenerate_pressed) + gem_types_spinbox.value_changed.connect(_on_gem_types_changed) + grid_width_spinbox.value_changed.connect(_on_grid_width_changed) + grid_height_spinbox.value_changed.connect(_on_grid_height_changed) + +func _find_match3_scene(): + # Debug menu is now: Match3 -> UILayer -> Match3DebugMenu + # So we need to go up two levels: get_parent() = UILayer, get_parent().get_parent() = Match3 + var ui_layer = get_parent() + if ui_layer and ui_layer is CanvasLayer: + match3_scene = ui_layer.get_parent() + if match3_scene and match3_scene.get_script(): + var script_path = match3_scene.get_script().resource_path + if script_path == "res://scenes/game/gameplays/match3_gameplay.gd": + print("Debug: Found match3 scene: ", match3_scene.name, " at path: ", match3_scene.get_path()) + return + + # If we couldn't find it, clear the reference + match3_scene = null + print("Debug: Could not find match3_gameplay scene") + +func _on_debug_toggled(enabled: bool): + print("Match3DebugMenu: Debug toggled to ", enabled) + visible = enabled + print("Match3DebugMenu: Visibility set to ", visible) + if enabled: + # Always refresh match3 scene reference when debug menu opens + if not match3_scene: + _find_match3_scene() + # Update display values + if match3_scene and match3_scene.has_method("get") and "TILE_TYPES" in match3_scene: + gem_types_spinbox.value = match3_scene.TILE_TYPES + gem_types_label.text = "Gem Types: " + str(match3_scene.TILE_TYPES) + + # Update grid size display values + if match3_scene and "GRID_SIZE" in match3_scene: + var grid_size = match3_scene.GRID_SIZE + grid_width_spinbox.value = grid_size.x + grid_height_spinbox.value = grid_size.y + grid_width_label.text = "Width: " + str(grid_size.x) + grid_height_label.text = "Height: " + str(grid_size.y) + +func _on_regenerate_pressed(): + if not match3_scene: + _find_match3_scene() + + if not match3_scene: + print("Error: Could not find match3 scene for regeneration") + return + + if match3_scene.has_method("regenerate_grid"): + print("Debug: Calling regenerate_grid()") + await match3_scene.regenerate_grid() + else: + print("Error: match3_scene does not have regenerate_grid method") + +func _on_gem_types_changed(value: float): + if not match3_scene: + _find_match3_scene() + + if not match3_scene: + print("Error: Could not find match3 scene for gem types change") + return + + var new_value = int(value) + if match3_scene.has_method("set_tile_types"): + print("Debug: Setting tile types to ", new_value) + await match3_scene.set_tile_types(new_value) + gem_types_label.text = "Gem Types: " + str(new_value) + else: + print("Error: match3_scene does not have set_tile_types method") + +func _on_grid_width_changed(value: float): + if not match3_scene: + _find_match3_scene() + + if not match3_scene: + print("Error: Could not find match3 scene for grid width change") + return + + var new_width = int(value) + grid_width_label.text = "Width: " + str(new_width) + + # Get current height + var current_height = int(grid_height_spinbox.value) + + if match3_scene.has_method("set_grid_size"): + print("Debug: Setting grid size to ", new_width, "x", current_height) + await match3_scene.set_grid_size(Vector2i(new_width, current_height)) + +func _on_grid_height_changed(value: float): + if not match3_scene: + _find_match3_scene() + + if not match3_scene: + print("Error: Could not find match3 scene for grid height change") + return + + var new_height = int(value) + grid_height_label.text = "Height: " + str(new_height) + + # Get current width + var current_width = int(grid_width_spinbox.value) + + if match3_scene.has_method("set_grid_size"): + print("Debug: Setting grid size to ", current_width, "x", new_height) + await match3_scene.set_grid_size(Vector2i(current_width, new_height)) diff --git a/scenes/game/gameplays/Match3DebugMenu.tscn b/scenes/game/gameplays/Match3DebugMenu.tscn new file mode 100644 index 0000000..332f6bc --- /dev/null +++ b/scenes/game/gameplays/Match3DebugMenu.tscn @@ -0,0 +1,83 @@ +[gd_scene load_steps=2 format=3 uid="uid://b76oiwlifikl3"] + +[ext_resource type="Script" path="res://scenes/game/gameplays/Match3DebugMenu.gd" id="1_debug_menu"] + +[node name="DebugMenu" type="Control"] +layout_mode = 3 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -201.0 +offset_top = 59.0 +offset_right = -11.0 +offset_bottom = 169.0 +grow_horizontal = 0 +script = ExtResource("1_debug_menu") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 10.0 +offset_top = 10.0 +offset_right = -10.0 +offset_bottom = -10.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TitleLabel" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Match-3 Debug Menu" +horizontal_alignment = 1 + +[node name="RegenerateButton" type="Button" parent="VBoxContainer"] +layout_mode = 2 +text = "Generate New Grid" + +[node name="GemTypesContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="GemTypesLabel" type="Label" parent="VBoxContainer/GemTypesContainer"] +layout_mode = 2 +text = "Gem Types: 5" + +[node name="GemTypesSpinBox" type="SpinBox" parent="VBoxContainer/GemTypesContainer"] +layout_mode = 2 +min_value = 3.0 +max_value = 8.0 +value = 5.0 + +[node name="GridSizeContainer" type="VBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="GridSizeLabel" type="Label" parent="VBoxContainer/GridSizeContainer"] +layout_mode = 2 +text = "Grid Size" +horizontal_alignment = 1 + +[node name="GridWidthContainer" type="HBoxContainer" parent="VBoxContainer/GridSizeContainer"] +layout_mode = 2 + +[node name="GridWidthLabel" type="Label" parent="VBoxContainer/GridSizeContainer/GridWidthContainer"] +layout_mode = 2 +text = "Width: 8" + +[node name="GridWidthSpinBox" type="SpinBox" parent="VBoxContainer/GridSizeContainer/GridWidthContainer"] +layout_mode = 2 +min_value = 4.0 +max_value = 12.0 +value = 8.0 + +[node name="GridHeightContainer" type="HBoxContainer" parent="VBoxContainer/GridSizeContainer"] +layout_mode = 2 + +[node name="GridHeightLabel" type="Label" parent="VBoxContainer/GridSizeContainer/GridHeightContainer"] +layout_mode = 2 +text = "Height: 8" + +[node name="GridHeightSpinBox" type="SpinBox" parent="VBoxContainer/GridSizeContainer/GridHeightContainer"] +layout_mode = 2 +min_value = 4.0 +max_value = 12.0 +value = 8.0 diff --git a/scenes/game/gameplays/Tile.tscn b/scenes/game/gameplays/Tile.tscn new file mode 100644 index 0000000..6747650 --- /dev/null +++ b/scenes/game/gameplays/Tile.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://bnk1gqom3oi6q"] + +[ext_resource type="Script" path="res://scenes/game/gameplays/tile.gd" id="1_tile_script"] + +[node name="Tile" type="Node2D"] +script = ExtResource("1_tile_script") + +[node name="Sprite2D" type="Sprite2D" parent="."] diff --git a/scenes/game/gameplays/clickomania_gameplay.gd b/scenes/game/gameplays/clickomania_gameplay.gd new file mode 100644 index 0000000..a909dad --- /dev/null +++ b/scenes/game/gameplays/clickomania_gameplay.gd @@ -0,0 +1,10 @@ +extends Node2D + +signal score_changed(points: int) + +func _ready(): + print("Clickomania gameplay loaded") + # Example: Add some score after a few seconds to test the system + await get_tree().create_timer(2.0).timeout + score_changed.emit(100) + print("Clickomania awarded 100 points") diff --git a/scenes/game/gameplays/clickomania_gameplay.tscn b/scenes/game/gameplays/clickomania_gameplay.tscn new file mode 100644 index 0000000..d24cc4f --- /dev/null +++ b/scenes/game/gameplays/clickomania_gameplay.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=2 format=3 uid="uid://cl7g8v0eh3mam"] + +[ext_resource type="Script" path="res://scenes/game/gameplays/clickomania_gameplay.gd" id="1_script"] + +[node name="Clickomania" type="Node2D"] +script = ExtResource("1_script") + +[node name="Label" type="Label" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -100.0 +offset_top = -12.0 +offset_right = 100.0 +offset_bottom = 12.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "Clickomania Gameplay (Demo)" +horizontal_alignment = 1 diff --git a/scenes/game/gameplays/match3_gameplay.gd b/scenes/game/gameplays/match3_gameplay.gd new file mode 100644 index 0000000..d82a9e6 --- /dev/null +++ b/scenes/game/gameplays/match3_gameplay.gd @@ -0,0 +1,221 @@ +extends Node2D + +signal score_changed(points: int) + +var GRID_SIZE := Vector2i(8, 8) +var TILE_TYPES := 5 +const TILE_SCENE := preload("res://scenes/game/gameplays/tile.tscn") + +var grid := [] +var tile_size: float = 48.0 +var grid_offset: Vector2 + +func _ready(): + # Set up initial gem pool + var gem_indices = [] + for i in range(TILE_TYPES): + gem_indices.append(i) + + const TileScript = preload("res://scenes/game/gameplays/tile.gd") + TileScript.set_active_gem_pool(gem_indices) + + _calculate_grid_layout() + _initialize_grid() + +func _calculate_grid_layout(): + var viewport_size = get_viewport().get_visible_rect().size + var available_width = viewport_size.x * 0.8 # Use 80% of screen width + var available_height = viewport_size.y * 0.7 # Use 70% of screen height + + # Calculate tile size based on available space + var max_tile_width = available_width / GRID_SIZE.x + var max_tile_height = available_height / GRID_SIZE.y + tile_size = min(max_tile_width, max_tile_height) + + # Align grid to left side with some margin + var total_grid_height = tile_size * GRID_SIZE.y + grid_offset = Vector2( + 50, # Left margin + (viewport_size.y - total_grid_height) / 2 + 50 # Vertically centered with top margin + ) + +func _initialize_grid(): + # Update gem pool BEFORE creating any tiles + var gem_indices = [] + for i in range(TILE_TYPES): + gem_indices.append(i) + + const TileScript = preload("res://scenes/game/gameplays/tile.gd") + TileScript.set_active_gem_pool(gem_indices) + + for y in range(GRID_SIZE.y): + grid.append([]) + for x in range(GRID_SIZE.x): + var tile = TILE_SCENE.instantiate() + tile.position = grid_offset + Vector2(x, y) * tile_size + tile.grid_position = Vector2i(x, y) + add_child(tile) + # Set tile type after adding to scene tree so sprite reference is available + var new_type = randi() % TILE_TYPES + tile.tile_type = new_type + # print("Debug: Created tile at (", x, ",", y, ") with type ", new_type) + grid[y].append(tile) + +func _has_match_at(pos: Vector2i) -> bool: + # Fixed: Add bounds and null checks + if pos.x < 0 or pos.y < 0 or pos.x >= GRID_SIZE.x or pos.y >= GRID_SIZE.y: + return false + if not grid[pos.y][pos.x]: + return false + + var matches_horizontal = _get_match_line(pos, Vector2i(1, 0)) + if matches_horizontal.size() >= 3: + return true + + var matches_vertical = _get_match_line(pos, Vector2i(0, 1)) + return matches_vertical.size() >= 3 + +# Fixed: Add missing function to check for any matches on the board +func _check_for_matches() -> bool: + for y in range(GRID_SIZE.y): + for x in range(GRID_SIZE.x): + if _has_match_at(Vector2i(x, y)): + return true + return false + +func _get_match_line(start: Vector2i, dir: Vector2i) -> Array: + var line = [grid[start.y][start.x]] + var type = grid[start.y][start.x].tile_type + + # Fixed: Check in both directions separately to avoid infinite loops + for offset in [1, -1]: + var current = start + dir * offset + while current.x >= 0 and current.y >= 0 and current.x < GRID_SIZE.x and current.y < GRID_SIZE.y: + var neighbor = grid[current.y][current.x] + # Fixed: Add null check to prevent crashes + if not neighbor or neighbor.tile_type != type: + break + line.append(neighbor) + current += dir * offset + + return line + +func _clear_matches(): + var to_clear := [] + + for y in range(GRID_SIZE.y): + for x in range(GRID_SIZE.x): + # Fixed: Add null check before processing + if not grid[y][x]: + continue + var pos = Vector2i(x, y) + var horiz = _get_match_line(pos, Vector2i(1, 0)) + if horiz.size() >= 3: + to_clear.append_array(horiz) + var vert = _get_match_line(pos, Vector2i(0, 1)) + if vert.size() >= 3: + to_clear.append_array(vert) + + # Remove duplicates using dictionary keys trick + var unique_dict := {} + for tile in to_clear: + unique_dict[tile] = true + to_clear = unique_dict.keys() + + # Fixed: Only proceed if there are matches to clear + if to_clear.size() == 0: + return + + for tile in to_clear: + grid[tile.grid_position.y][tile.grid_position.x] = null + tile.queue_free() + + _drop_tiles() + await get_tree().create_timer(0.2).timeout + _fill_empty_cells() + +func _drop_tiles(): + var moved = true + while moved: + moved = false + for x in range(GRID_SIZE.x): + # Fixed: Start from GRID_SIZE.y - 1 to avoid out of bounds + for y in range(GRID_SIZE.y - 1, -1, -1): + var tile = grid[y][x] + # Fixed: Check bounds before accessing y + 1 + if tile and y + 1 < GRID_SIZE.y and not grid[y + 1][x]: + grid[y + 1][x] = tile + grid[y][x] = null + tile.grid_position = Vector2i(x, y + 1) + # You can animate position here using Tween for smooth drop: + # tween.interpolate_property(tile, "position", tile.position, grid_offset + Vector2(x, y + 1) * tile_size, 0.2) + tile.position = grid_offset + Vector2(x, y + 1) * tile_size + moved = true + +func _fill_empty_cells(): + for y in range(GRID_SIZE.y): + for x in range(GRID_SIZE.x): + if not grid[y][x]: + var tile = TILE_SCENE.instantiate() + tile.grid_position = Vector2i(x, y) + tile.tile_type = randi() % TILE_TYPES + tile.position = grid_offset + Vector2(x, y) * tile_size + grid[y][x] = tile + add_child(tile) + + # Fixed: Add recursion protection to prevent stack overflow + await get_tree().create_timer(0.1).timeout + var max_iterations = 10 + var iteration = 0 + while _check_for_matches() and iteration < max_iterations: + _clear_matches() + await get_tree().create_timer(0.1).timeout + iteration += 1 + +func regenerate_grid(): + # Use time-based seed to ensure different patterns each time + var new_seed = Time.get_ticks_msec() + seed(new_seed) + print("Debug: Regenerating grid with seed: ", new_seed) + + # Fixed: Clear ALL tile children, not just ones in grid array + # This handles any orphaned tiles that might not be tracked in the grid + var children_to_remove = [] + for child in get_children(): + if child.has_method("get_script") and child.get_script(): + var script_path = child.get_script().resource_path + if script_path == "res://scenes/game/gameplays/tile.gd": + children_to_remove.append(child) + + # Remove all found tile children + for child in children_to_remove: + child.free() + + # Also clear grid array references + for y in range(grid.size()): + if grid[y] and grid[y] is Array: + for x in range(grid[y].size()): + # Set to null since we already freed the nodes above + grid[y][x] = null + + # Clear the grid array + grid.clear() + + # No need to wait for nodes to be freed since we used free() + + # Fixed: Recalculate grid layout before regenerating tiles + _calculate_grid_layout() + + # Regenerate the grid (gem pool is updated in _initialize_grid) + _initialize_grid() + +func set_tile_types(new_count: int): + TILE_TYPES = new_count + # Regenerate grid with new tile types (gem pool is updated in regenerate_grid) + await regenerate_grid() + +func set_grid_size(new_size: Vector2i): + print("Debug: Changing grid size from ", GRID_SIZE, " to ", new_size) + GRID_SIZE = new_size + # Regenerate grid with new size + await regenerate_grid() diff --git a/scenes/game/gameplays/match3_gameplay.tscn b/scenes/game/gameplays/match3_gameplay.tscn new file mode 100644 index 0000000..b059adc --- /dev/null +++ b/scenes/game/gameplays/match3_gameplay.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=3 format=3 uid="uid://b4kv7g7kllwgb"] + +[ext_resource type="Script" path="res://scenes/game/gameplays/match3_gameplay.gd" id="1_mvfdp"] +[ext_resource type="PackedScene" path="res://scenes/game/gameplays/Match3DebugMenu.tscn" id="2_debug_menu"] + +[node name="Match3" type="Node2D"] +script = ExtResource("1_mvfdp") + +[node name="GridContainer" type="Node2D" parent="."] + +[node name="UILayer" type="CanvasLayer" parent="."] + +[node name="Match3DebugMenu" parent="UILayer" instance=ExtResource("2_debug_menu")] diff --git a/scenes/game/gameplays/tile.gd b/scenes/game/gameplays/tile.gd new file mode 100644 index 0000000..e1abff4 --- /dev/null +++ b/scenes/game/gameplays/tile.gd @@ -0,0 +1,116 @@ +extends Node2D + +@export var tile_type: int = 0 : set = _set_tile_type +var grid_position: Vector2i + +@onready var sprite: Sprite2D = $Sprite2D + +# Target size for each tile to fit in the 54x54 grid cells +const TILE_SIZE = 48 # Slightly smaller than 54 to leave some padding + +# All available gem textures +var all_gem_textures = [ + preload("res://assets/sprites/gems/bg_19.png"), # 0 - Blue gem + preload("res://assets/sprites/gems/dg_19.png"), # 1 - Dark gem + preload("res://assets/sprites/gems/gg_19.png"), # 2 - Green gem + preload("res://assets/sprites/gems/mg_19.png"), # 3 - Magenta gem + preload("res://assets/sprites/gems/rg_19.png"), # 4 - Red gem + preload("res://assets/sprites/gems/yg_19.png"), # 5 - Yellow gem + preload("res://assets/sprites/gems/pg_19.png"), # 6 - Purple gem + preload("res://assets/sprites/gems/sg_19.png"), # 7 - Silver gem +] + +# Static variable to store the current gem pool for all tiles +static var current_gem_pool = [0, 1, 2, 3, 4] # Start with first 5 gems + +# Currently active gem types (indices into all_gem_textures) +var active_gem_types = [] # Will be set from current_gem_pool + +func _set_tile_type(value: int) -> void: + tile_type = value + print("Debug: _set_tile_type called with value ", value, ", active_gem_types.size() = ", active_gem_types.size()) + # Fixed: Add sprite null check to prevent crashes during initialization + if not sprite: + return + if value >= 0 and value < active_gem_types.size(): + var texture_index = active_gem_types[value] + sprite.texture = all_gem_textures[texture_index] + # print("Debug: Set texture_index ", texture_index, " for tile_type ", value) + _scale_sprite_to_fit() + else: + push_error("Invalid tile type: " + str(value) + ". Available types: 0-" + str(active_gem_types.size() - 1)) + +func _scale_sprite_to_fit() -> void: + # Fixed: Add additional null checks + if sprite and sprite.texture: + var texture_size = sprite.texture.get_size() + var max_dimension = max(texture_size.x, texture_size.y) + var scale_factor = TILE_SIZE / max_dimension + sprite.scale = Vector2(scale_factor, scale_factor) + +# Gem pool management functions +static func set_active_gem_pool(gem_indices: Array) -> void: + # Update static gem pool for new tiles + current_gem_pool = gem_indices.duplicate() + + # Update all existing tile instances to use new gem pool + var scene_tree = Engine.get_main_loop() as SceneTree + if scene_tree: + var tiles = scene_tree.get_nodes_in_group("tiles") + for tile in tiles: + if tile.has_method("_update_active_gems"): + tile._update_active_gems(gem_indices) + +func _update_active_gems(gem_indices: Array) -> void: + active_gem_types = gem_indices.duplicate() + # Re-validate current tile type + if tile_type >= active_gem_types.size(): + # Generate a new random tile type within valid range + tile_type = randi() % active_gem_types.size() + _set_tile_type(tile_type) + +static func get_active_gem_count() -> int: + # Get from any tile instance or default + var scene_tree = Engine.get_main_loop() as SceneTree + if scene_tree: + var tiles = scene_tree.get_nodes_in_group("tiles") + if tiles.size() > 0: + return tiles[0].active_gem_types.size() + return 5 # Default + +static func add_gem_to_pool(gem_index: int) -> void: + var scene_tree = Engine.get_main_loop() as SceneTree + if scene_tree: + var tiles = scene_tree.get_nodes_in_group("tiles") + for tile in tiles: + if tile.has_method("_add_gem_type"): + tile._add_gem_type(gem_index) + +func _add_gem_type(gem_index: int) -> void: + if gem_index >= 0 and gem_index < all_gem_textures.size(): + if not active_gem_types.has(gem_index): + active_gem_types.append(gem_index) + +static func remove_gem_from_pool(gem_index: int) -> void: + var scene_tree = Engine.get_main_loop() as SceneTree + if scene_tree: + var tiles = scene_tree.get_nodes_in_group("tiles") + for tile in tiles: + if tile.has_method("_remove_gem_type"): + tile._remove_gem_type(gem_index) + +func _remove_gem_type(gem_index: int) -> void: + var type_index = active_gem_types.find(gem_index) + if type_index != -1 and active_gem_types.size() > 2: # Keep at least 2 gem types + active_gem_types.erase(gem_index) + # Update tiles that were using removed type + if tile_type >= active_gem_types.size(): + tile_type = 0 + _set_tile_type(tile_type) + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + add_to_group("tiles") # Add to group for gem pool management + # Initialize with current static gem pool + active_gem_types = current_gem_pool.duplicate() + _set_tile_type(tile_type) diff --git a/scripts/Main.gd b/scenes/main/Main.gd similarity index 87% rename from scripts/Main.gd rename to scenes/main/Main.gd index cdb7458..6e10e80 100644 --- a/scripts/Main.gd +++ b/scenes/main/Main.gd @@ -3,8 +3,8 @@ extends Control @onready var press_any_key_screen = $PressAnyKeyScreen var current_menu = null -const MAIN_MENU_SCENE = preload("res://ui/MainMenu.tscn") -const SETTINGS_MENU_SCENE = preload("res://ui/SettingsMenu.tscn") +const MAIN_MENU_SCENE = preload("res://scenes/ui/MainMenu.tscn") +const SETTINGS_MENU_SCENE = preload("res://scenes/ui/SettingsMenu.tscn") func _ready(): print("Main scene ready") diff --git a/scripts/PressAnyKeyScreen.gd b/scenes/main/PressAnyKeyScreen.gd similarity index 100% rename from scripts/PressAnyKeyScreen.gd rename to scenes/main/PressAnyKeyScreen.gd diff --git a/ui/PressAnyKeyScreen.tscn b/scenes/main/PressAnyKeyScreen.tscn similarity index 89% rename from ui/PressAnyKeyScreen.tscn rename to scenes/main/PressAnyKeyScreen.tscn index 574c00d..5f57d7c 100644 --- a/ui/PressAnyKeyScreen.tscn +++ b/scenes/main/PressAnyKeyScreen.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=15 format=3 uid="uid://gbe1jarrwqsi"] +[gd_scene load_steps=16 format=3 uid="uid://gbe1jarrwqsi"] -[ext_resource type="Script" uid="uid://buak21ajgvevl" path="res://scripts/PressAnyKeyScreen.gd" id="1_0a4p2"] -[ext_resource type="Texture2D" uid="uid://bcr4bokw87m5n" path="res://resources/animated sprite/Skeleton Sprite/Skeleton Idle.png" id="2_rjjcb"] +[ext_resource type="Script" uid="uid://cxw2fjj5onja3" path="res://scenes/main/PressAnyKeyScreen.gd" id="1_0a4p2"] +[ext_resource type="Texture2D" uid="uid://bcr4bokw87m5n" path="res://assets/sprites/characters/skeleton/Skeleton Idle.png" id="2_rjjcb"] +[ext_resource type="PackedScene" path="res://scenes/ui/DebugToggle.tscn" id="3_debug"] [sub_resource type="AtlasTexture" id="AtlasTexture_l6pue"] atlas = ExtResource("2_rjjcb") @@ -132,3 +133,6 @@ horizontal_alignment = 1 [node name="PressKeyLabel" type="Label" parent="PressKeyContainer"] layout_mode = 2 text = "`press_ok_continue`" + +[node name="DebugToggle" parent="." instance=ExtResource("3_debug")] +layout_mode = 1 diff --git a/scenes/main.tscn b/scenes/main/main.tscn similarity index 57% rename from scenes/main.tscn rename to scenes/main/main.tscn index d7cf192..a8967f1 100644 --- a/scenes/main.tscn +++ b/scenes/main/main.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=4 format=3 uid="uid://ci2gk11211n0d"] +[gd_scene load_steps=5 format=3 uid="uid://ci2gk11211n0d"] -[ext_resource type="Script" uid="uid://cwlop1ettlqhg" path="res://scripts/Main.gd" id="1_0wfyh"] -[ext_resource type="PackedScene" uid="uid://gbe1jarrwqsi" path="res://ui/PressAnyKeyScreen.tscn" id="1_o5qli"] -[ext_resource type="Texture2D" uid="uid://c8y6tlvcgh2gn" path="res://resources/textures/beanstalk-dark.webp" id="2_sugp2"] +[ext_resource type="Script" uid="uid://b0uwk2jlm6g08" path="res://scenes/main/Main.gd" id="1_0wfyh"] +[ext_resource type="PackedScene" uid="uid://gbe1jarrwqsi" path="res://scenes/main/PressAnyKeyScreen.tscn" id="1_o5qli"] +[ext_resource type="Texture2D" uid="uid://c8y6tlvcgh2gn" path="res://assets/textures/backgrounds/beanstalk-dark.webp" id="2_sugp2"] +[ext_resource type="PackedScene" path="res://scenes/ui/DebugToggle.tscn" id="4_v7g8d"] [node name="main" type="Control"] layout_mode = 3 @@ -25,3 +26,6 @@ stretch_mode = 1 [node name="PressAnyKeyScreen" parent="." instance=ExtResource("1_o5qli")] layout_mode = 1 + +[node name="DebugToggle" parent="." instance=ExtResource("4_v7g8d")] +layout_mode = 1 diff --git a/scenes/ui/DebugButton.tscn b/scenes/ui/DebugButton.tscn new file mode 100644 index 0000000..b35b5df --- /dev/null +++ b/scenes/ui/DebugButton.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=2 format=3 uid="uid://dmjfgs6r4yfwl"] + +[ext_resource type="Script" uid="uid://bt6a8gpw1e31c" path="res://scenes/ui/DebugButton.gd" id="1_debug_script"] + +[node name="DebugButton" type="Control"] +layout_mode = 3 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -80.0 +offset_top = -40.0 +grow_horizontal = 0 +grow_vertical = 0 +script = ExtResource("1_debug_script") + +[node name="Button" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "DEBUG" diff --git a/scenes/ui/DebugMenu.gd b/scenes/ui/DebugMenu.gd new file mode 100644 index 0000000..ae8e61d --- /dev/null +++ b/scenes/ui/DebugMenu.gd @@ -0,0 +1,206 @@ +extends Control + +@onready var regenerate_button: Button = $VBoxContainer/RegenerateButton +@onready var gem_types_spinbox: SpinBox = $VBoxContainer/GemTypesContainer/GemTypesSpinBox +@onready var gem_types_label: Label = $VBoxContainer/GemTypesContainer/GemTypesLabel +@onready var grid_width_spinbox: SpinBox = $VBoxContainer/GridSizeContainer/GridWidthContainer/GridWidthSpinBox +@onready var grid_height_spinbox: SpinBox = $VBoxContainer/GridSizeContainer/GridHeightContainer/GridHeightSpinBox +@onready var grid_width_label: Label = $VBoxContainer/GridSizeContainer/GridWidthContainer/GridWidthLabel +@onready var grid_height_label: Label = $VBoxContainer/GridSizeContainer/GridHeightContainer/GridHeightLabel + +var match3_scene: Node2D +var search_timer: Timer + +# Fixed: Add cleanup function +func _exit_tree(): + if search_timer: + search_timer.queue_free() + +func _ready(): + DebugManager.debug_toggled.connect(_on_debug_toggled) + + # Initialize with current debug state + var current_debug_state = DebugManager.is_debug_enabled() + visible = current_debug_state + regenerate_button.pressed.connect(_on_regenerate_pressed) + gem_types_spinbox.value_changed.connect(_on_gem_types_changed) + grid_width_spinbox.value_changed.connect(_on_grid_width_changed) + grid_height_spinbox.value_changed.connect(_on_grid_height_changed) + + # Initialize gem types spinbox + gem_types_spinbox.min_value = 3 + gem_types_spinbox.max_value = 8 + gem_types_spinbox.step = 1 + gem_types_spinbox.value = 5 # Default value + + # Initialize grid size spinboxes + grid_width_spinbox.min_value = 4 + grid_width_spinbox.max_value = 12 + grid_width_spinbox.step = 1 + grid_width_spinbox.value = 8 # Default value + + grid_height_spinbox.min_value = 4 + grid_height_spinbox.max_value = 12 + grid_height_spinbox.step = 1 + grid_height_spinbox.value = 8 # Default value + + # Fixed: Create timer for periodic match3 scene search + search_timer = Timer.new() + search_timer.wait_time = 0.1 + search_timer.timeout.connect(_find_match3_scene) + add_child(search_timer) + + # Start searching immediately and continue until found + _find_match3_scene() + +func _find_match3_scene(): + # Fixed: Search more thoroughly for match3 scene + if match3_scene: + # Already found, stop searching + if search_timer and search_timer.timeout.is_connected(_find_match3_scene): + search_timer.stop() + return + + # Search in current scene tree + var current_scene = get_tree().current_scene + if current_scene: + # Try to find match3 by class name first + match3_scene = _find_node_by_script(current_scene, "res://scenes/game/gameplays/match3_gameplay.gd") + + # Fallback: search by common node names + if not match3_scene: + for possible_name in ["Match3", "match3", "Match3Game"]: + match3_scene = current_scene.find_child(possible_name, true, false) + if match3_scene: + break + + if match3_scene: + print("Debug: Found match3 scene: ", match3_scene.name) + # Update UI with current values + if match3_scene.has_method("get") and "TILE_TYPES" in match3_scene: + gem_types_spinbox.value = match3_scene.TILE_TYPES + gem_types_label.text = "Gem Types: " + str(match3_scene.TILE_TYPES) + + # Update grid size values + if "GRID_SIZE" in match3_scene: + var grid_size = match3_scene.GRID_SIZE + grid_width_spinbox.value = grid_size.x + grid_height_spinbox.value = grid_size.y + grid_width_label.text = "Width: " + str(grid_size.x) + grid_height_label.text = "Height: " + str(grid_size.y) + + # Stop the search timer + if search_timer and search_timer.timeout.is_connected(_find_match3_scene): + search_timer.stop() + else: + # Continue searching if not found + if search_timer and not search_timer.timeout.is_connected(_find_match3_scene): + search_timer.timeout.connect(_find_match3_scene) + search_timer.start() + +func _find_node_by_script(node: Node, script_path: String) -> Node: + # Helper function to find node by its script path + if node.get_script(): + var node_script = node.get_script() + if node_script.resource_path == script_path: + return node + + for child in node.get_children(): + var result = _find_node_by_script(child, script_path) + if result: + return result + + return null + +func _on_debug_toggled(enabled: bool): + visible = enabled + if enabled: + # Always refresh match3 scene reference when debug menu opens + if not match3_scene: + _find_match3_scene() + # Update display values + if match3_scene and match3_scene.has_method("get") and "TILE_TYPES" in match3_scene: + gem_types_spinbox.value = match3_scene.TILE_TYPES + gem_types_label.text = "Gem Types: " + str(match3_scene.TILE_TYPES) + + # Update grid size display values + if match3_scene and "GRID_SIZE" in match3_scene: + var grid_size = match3_scene.GRID_SIZE + grid_width_spinbox.value = grid_size.x + grid_height_spinbox.value = grid_size.y + grid_width_label.text = "Width: " + str(grid_size.x) + grid_height_label.text = "Height: " + str(grid_size.y) + +func _on_regenerate_pressed(): + if not match3_scene: + _find_match3_scene() + + if not match3_scene: + print("Error: Could not find match3 scene for regeneration") + return + + if match3_scene.has_method("regenerate_grid"): + print("Debug: Calling regenerate_grid()") + await match3_scene.regenerate_grid() + else: + print("Error: match3_scene does not have regenerate_grid method") + +func _on_gem_types_changed(value: float): + if not match3_scene: + _find_match3_scene() + + if not match3_scene: + print("Error: Could not find match3 scene for gem types change") + return + + var new_value = int(value) + if match3_scene.has_method("set_tile_types"): + print("Debug: Setting tile types to ", new_value) + await match3_scene.set_tile_types(new_value) + gem_types_label.text = "Gem Types: " + str(new_value) + else: + print("Error: match3_scene does not have set_tile_types method") + # Fallback: try to set TILE_TYPES directly + if "TILE_TYPES" in match3_scene: + match3_scene.TILE_TYPES = new_value + gem_types_label.text = "Gem Types: " + str(new_value) + +func _on_grid_width_changed(value: float): + if not match3_scene: + _find_match3_scene() + + if not match3_scene: + print("Error: Could not find match3 scene for grid width change") + return + + var new_width = int(value) + grid_width_label.text = "Width: " + str(new_width) + + # Get current height + var current_height = int(grid_height_spinbox.value) + + if match3_scene.has_method("set_grid_size"): + print("Debug: Setting grid size to ", new_width, "x", current_height) + await match3_scene.set_grid_size(Vector2i(new_width, current_height)) + else: + print("Error: match3_scene does not have set_grid_size method") + +func _on_grid_height_changed(value: float): + if not match3_scene: + _find_match3_scene() + + if not match3_scene: + print("Error: Could not find match3 scene for grid height change") + return + + var new_height = int(value) + grid_height_label.text = "Height: " + str(new_height) + + # Get current width + var current_width = int(grid_width_spinbox.value) + + if match3_scene.has_method("set_grid_size"): + print("Debug: Setting grid size to ", current_width, "x", new_height) + await match3_scene.set_grid_size(Vector2i(current_width, new_height)) + else: + print("Error: match3_scene does not have set_grid_size method") diff --git a/scenes/ui/DebugMenu.tscn b/scenes/ui/DebugMenu.tscn new file mode 100644 index 0000000..3ce79da --- /dev/null +++ b/scenes/ui/DebugMenu.tscn @@ -0,0 +1,83 @@ +[gd_scene load_steps=2 format=3 uid="uid://fax5m4ywp1r3"] + +[ext_resource type="Script" uid="uid://b4ppfg1tb0al0" path="res://scenes/ui/DebugMenu.gd" id="1_debug_menu"] + +[node name="DebugMenu" type="Control"] +layout_mode = 3 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -201.0 +offset_top = 59.0 +offset_right = -11.0 +offset_bottom = 169.0 +grow_horizontal = 0 +script = ExtResource("1_debug_menu") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 10.0 +offset_top = 10.0 +offset_right = -10.0 +offset_bottom = -10.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TitleLabel" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Debug Menu" +horizontal_alignment = 1 + +[node name="RegenerateButton" type="Button" parent="VBoxContainer"] +layout_mode = 2 +text = "Generate New Grid" + +[node name="GemTypesContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="GemTypesLabel" type="Label" parent="VBoxContainer/GemTypesContainer"] +layout_mode = 2 +text = "Gem Types: 5" + +[node name="GemTypesSpinBox" type="SpinBox" parent="VBoxContainer/GemTypesContainer"] +layout_mode = 2 +min_value = 3.0 +max_value = 8.0 +value = 5.0 + +[node name="GridSizeContainer" type="VBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="GridSizeLabel" type="Label" parent="VBoxContainer/GridSizeContainer"] +layout_mode = 2 +text = "Grid Size" +horizontal_alignment = 1 + +[node name="GridWidthContainer" type="HBoxContainer" parent="VBoxContainer/GridSizeContainer"] +layout_mode = 2 + +[node name="GridWidthLabel" type="Label" parent="VBoxContainer/GridSizeContainer/GridWidthContainer"] +layout_mode = 2 +text = "Width: 8" + +[node name="GridWidthSpinBox" type="SpinBox" parent="VBoxContainer/GridSizeContainer/GridWidthContainer"] +layout_mode = 2 +min_value = 4.0 +max_value = 12.0 +value = 8.0 + +[node name="GridHeightContainer" type="HBoxContainer" parent="VBoxContainer/GridSizeContainer"] +layout_mode = 2 + +[node name="GridHeightLabel" type="Label" parent="VBoxContainer/GridSizeContainer/GridHeightContainer"] +layout_mode = 2 +text = "Height: 8" + +[node name="GridHeightSpinBox" type="SpinBox" parent="VBoxContainer/GridSizeContainer/GridHeightContainer"] +layout_mode = 2 +min_value = 4.0 +max_value = 12.0 +value = 8.0 diff --git a/scenes/ui/DebugToggle.gd b/scenes/ui/DebugToggle.gd new file mode 100644 index 0000000..2d225cd --- /dev/null +++ b/scenes/ui/DebugToggle.gd @@ -0,0 +1,15 @@ +extends Button + +func _ready(): + pressed.connect(_on_pressed) + DebugManager.debug_toggled.connect(_on_debug_toggled) + + # Initialize with current debug state + var current_state = DebugManager.is_debug_enabled() + text = "Debug: " + ("ON" if current_state else "OFF") + +func _on_pressed(): + DebugManager.toggle_debug() + +func _on_debug_toggled(enabled: bool): + text = "Debug: " + ("ON" if enabled else "OFF") diff --git a/scenes/ui/DebugToggle.tscn b/scenes/ui/DebugToggle.tscn new file mode 100644 index 0000000..c9332d7 --- /dev/null +++ b/scenes/ui/DebugToggle.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=2 format=3 uid="uid://df2b4wn8j6cxl"] + +[ext_resource type="Script" path="res://scenes/ui/DebugToggle.gd" id="1_gn2ol"] + +[node name="DebugToggle" type="Button"] +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -110.0 +offset_top = -40.0 +offset_right = -10.0 +offset_bottom = -10.0 +grow_horizontal = 0 +grow_vertical = 0 +text = "Debug: OFF" +script = ExtResource("1_gn2ol") diff --git a/scripts/MainMenu.gd b/scenes/ui/MainMenu.gd similarity index 100% rename from scripts/MainMenu.gd rename to scenes/ui/MainMenu.gd diff --git a/ui/MainMenu.tscn b/scenes/ui/MainMenu.tscn similarity index 76% rename from ui/MainMenu.tscn rename to scenes/ui/MainMenu.tscn index daa7342..e3f7fd9 100644 --- a/ui/MainMenu.tscn +++ b/scenes/ui/MainMenu.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=2 format=3 uid="uid://m8lf3eh3al5j"] +[gd_scene load_steps=3 format=3 uid="uid://m8lf3eh3al5j"] -[ext_resource type="Script" uid="uid://ctu58xq7btp1n" path="res://scripts/MainMenu.gd" id="1_b00nv"] +[ext_resource type="Script" uid="uid://b2c35v0f6rymd" path="res://scenes/ui/MainMenu.gd" id="1_b00nv"] +[ext_resource type="PackedScene" path="res://scenes/ui/DebugToggle.tscn" id="2_debug"] [node name="MainMenu" type="Control"] layout_mode = 3 @@ -37,6 +38,9 @@ text = "Settings" layout_mode = 2 text = "Exit" +[node name="DebugToggle" parent="." instance=ExtResource("2_debug")] +layout_mode = 1 + [connection signal="pressed" from="MenuContainer/NewGameButton" to="." method="_on_new_game_button_pressed"] [connection signal="pressed" from="MenuContainer/SettingsButton" to="." method="_on_settings_button_pressed"] [connection signal="pressed" from="MenuContainer/ExitButton" to="." method="_on_exit_button_pressed"] diff --git a/scripts/SettingsMenu.gd b/scenes/ui/SettingsMenu.gd similarity index 100% rename from scripts/SettingsMenu.gd rename to scenes/ui/SettingsMenu.gd diff --git a/ui/SettingsMenu.tscn b/scenes/ui/SettingsMenu.tscn similarity index 88% rename from ui/SettingsMenu.tscn rename to scenes/ui/SettingsMenu.tscn index dbc3963..7adb80a 100644 --- a/ui/SettingsMenu.tscn +++ b/scenes/ui/SettingsMenu.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=2 format=3 uid="uid://57obmcwyos2g"] +[gd_scene load_steps=3 format=3 uid="uid://57obmcwyos2g"] -[ext_resource type="Script" uid="uid://c8mlvlerv4y03" path="res://scripts/SettingsMenu.gd" id="1_oqkcn"] +[ext_resource type="Script" uid="uid://bv56qwni68qo" path="res://scenes/ui/SettingsMenu.gd" id="1_oqkcn"] +[ext_resource type="PackedScene" path="res://scenes/ui/DebugToggle.tscn" id="2_debug"] [node name="SettingsMenu" type="Control" groups=["localizable"]] layout_mode = 3 @@ -103,13 +104,18 @@ popup/item_4/id = 2 [node name="BackButtonContainer" type="Control" parent="."] layout_mode = 1 anchors_preset = 0 -offset_right = 40.0 -offset_bottom = 40.0 +offset_left = 10.0 +offset_top = 10.0 +offset_right = 55.0 +offset_bottom = 41.0 [node name="BackButton" type="Button" parent="BackButtonContainer"] -layout_mode = 0 -offset_right = 8.0 -offset_bottom = 8.0 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 text = "back" [node name="ResetSettingsContainer" type="Control" parent="."] @@ -136,6 +142,9 @@ offset_bottom = 31.0 grow_horizontal = 2 text = "Reset settings to default" +[node name="DebugToggle" parent="." instance=ExtResource("2_debug")] +layout_mode = 1 + [connection signal="value_changed" from="SettingsContainer/MasterVolumeContainer/MasterVolumeSlider" to="." method="_on_master_volume_changed"] [connection signal="value_changed" from="SettingsContainer/MusicVolumeContainer/MusicVolumeSlider" to="." method="_on_music_volume_changed"] [connection signal="value_changed" from="SettingsContainer/SFXVolumeContainer/SFXVolumeSlider" to="." method="_on_sfx_volume_changed"] diff --git a/scripts/AudioManager.gd.uid b/scripts/AudioManager.gd.uid deleted file mode 100644 index e3bd194..0000000 --- a/scripts/AudioManager.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cxka0038cwpgp diff --git a/scripts/GameManager.gd b/scripts/GameManager.gd deleted file mode 100644 index dccbee6..0000000 --- a/scripts/GameManager.gd +++ /dev/null @@ -1,21 +0,0 @@ -extends Node - -const GAME_SCENE_PATH := "res://scenes/Game.tscn" -const MAIN_SCENE_PATH := "res://scenes/Main.tscn" - -func start_new_game() -> void: - var packed_scene := load(GAME_SCENE_PATH) - if not packed_scene or not packed_scene is PackedScene: - push_error("Failed to load Game scene at: %s" % GAME_SCENE_PATH) - return - get_tree().change_scene_to_packed(packed_scene) - -func save_game() -> void: - print("Game saved (mock)") - -func exit_to_main_menu() -> void: - var packed_scene := load(MAIN_SCENE_PATH) - if not packed_scene or not packed_scene is PackedScene: - push_error("Failed to load Main scene at: %s" % MAIN_SCENE_PATH) - return - get_tree().change_scene_to_packed(packed_scene) diff --git a/scripts/GameManager.gd.uid b/scripts/GameManager.gd.uid deleted file mode 100644 index 01c9aa0..0000000 --- a/scripts/GameManager.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bmwk2n0b6bb2r diff --git a/scripts/LocalizationManager.gd.uid b/scripts/LocalizationManager.gd.uid deleted file mode 100644 index 0779427..0000000 --- a/scripts/LocalizationManager.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bedt5lbt48out diff --git a/scripts/Main.gd.uid b/scripts/Main.gd.uid deleted file mode 100644 index ee3b621..0000000 --- a/scripts/Main.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cwlop1ettlqhg diff --git a/scripts/MainMenu.gd.uid b/scripts/MainMenu.gd.uid deleted file mode 100644 index 1e079c6..0000000 --- a/scripts/MainMenu.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ctu58xq7btp1n diff --git a/scripts/PressAnyKeyScreen.gd.uid b/scripts/PressAnyKeyScreen.gd.uid deleted file mode 100644 index 22cf1f6..0000000 --- a/scripts/PressAnyKeyScreen.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://buak21ajgvevl diff --git a/scripts/SettingsManager.gd.uid b/scripts/SettingsManager.gd.uid deleted file mode 100644 index d834c90..0000000 --- a/scripts/SettingsManager.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c3btjbwj5p0vu diff --git a/scripts/SettingsMenu.gd.uid b/scripts/SettingsMenu.gd.uid deleted file mode 100644 index 3d2dc32..0000000 --- a/scripts/SettingsMenu.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c8mlvlerv4y03 diff --git a/sources.yaml b/sources.yaml deleted file mode 100644 index 9c06fc8..0000000 --- a/sources.yaml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- fileName: audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav - commonUrl: https://clement-panchout.itch.io/yet-another-free-music-pack -- fileName: audio/817587__silverdubloons__tick06.wav - commonUrl: https://freesound.org/people/SilverDubloons/sounds/817587/ -- fileName: resources/textures/beanstalk-dark.webp - commonUrl: https://www.toptal.com/designers/subtlepatterns/beanstalk-dark-pattern/ -- fileName: resources/animated sprite/Skeleton Sprite - commonUrl: https://jesse-m.itch.io/skeleton-pack diff --git a/scripts/AudioManager.gd b/src/autoloads/AudioManager.gd similarity index 85% rename from scripts/AudioManager.gd rename to src/autoloads/AudioManager.gd index ede30c4..f281f7d 100644 --- a/scripts/AudioManager.gd +++ b/src/autoloads/AudioManager.gd @@ -1,7 +1,7 @@ extends Node -const MUSIC_PATH := "res://audio/Space Horror InGame Music (Exploration) _Clement Panchout.wav" -const UI_CLICK_SOUND_PATH := "res://audio/817587__silverdubloons__tick06.wav" +const MUSIC_PATH := "res://assets/audio/music/Space Horror InGame Music (Exploration) _Clement Panchout.wav" +const UI_CLICK_SOUND_PATH := "res://assets/audio/sfx/817587__silverdubloons__tick06.wav" var music_player: AudioStreamPlayer var ui_click_player: AudioStreamPlayer @@ -19,7 +19,7 @@ func _ready(): var orig_stream = _load_stream() if not orig_stream: - push_error("Failed to load music stream: %s" % MUSIC_PATH) + DebugManager.log_error("Failed to load music stream: %s" % MUSIC_PATH, "AudioManager") return var stream = orig_stream.duplicate(true) as AudioStream diff --git a/src/autoloads/DebugManager.gd b/src/autoloads/DebugManager.gd new file mode 100644 index 0000000..6de48c8 --- /dev/null +++ b/src/autoloads/DebugManager.gd @@ -0,0 +1,109 @@ +extends Node + +signal debug_toggled(enabled: bool) + +enum LogLevel { + TRACE = 0, + DEBUG = 1, + INFO = 2, + WARN = 3, + ERROR = 4, + FATAL = 5 +} + +var debug_enabled: bool = false +var debug_overlay_visible: bool = false +var current_log_level: LogLevel = LogLevel.INFO + +func _ready(): + log_info("DebugManager loaded") + +func toggle_debug(): + debug_enabled = !debug_enabled + debug_toggled.emit(debug_enabled) + log_info("Debug mode: " + ("ON" if debug_enabled else "OFF")) + +func set_debug_enabled(enabled: bool): + if debug_enabled != enabled: + debug_enabled = enabled + debug_toggled.emit(debug_enabled) + +func is_debug_enabled() -> bool: + return debug_enabled + +func toggle_overlay(): + debug_overlay_visible = !debug_overlay_visible + +func set_overlay_visible(visible: bool): + debug_overlay_visible = visible + +func is_overlay_visible() -> bool: + return debug_overlay_visible + +func set_log_level(level: LogLevel): + current_log_level = level + log_info("Log level set to: " + _log_level_to_string(level)) + +func get_log_level() -> LogLevel: + return current_log_level + +func _should_log(level: LogLevel) -> bool: + return level >= current_log_level + +func _log_level_to_string(level: LogLevel) -> String: + match level: + LogLevel.TRACE: + return "TRACE" + LogLevel.DEBUG: + return "DEBUG" + LogLevel.INFO: + return "INFO" + LogLevel.WARN: + return "WARN" + LogLevel.ERROR: + return "ERROR" + LogLevel.FATAL: + return "FATAL" + _: + return "UNKNOWN" + +func _format_log_message(level: LogLevel, message: String, category: String = "") -> String: + var timestamp = Time.get_datetime_string_from_system() + var level_str = _log_level_to_string(level) + var category_str = (" [" + category + "]") if category != "" else "" + return "[%s] %s%s: %s" % [timestamp, level_str, category_str, message] + +func log_trace(message: String, category: String = ""): + if _should_log(LogLevel.TRACE): + var formatted = _format_log_message(LogLevel.TRACE, message, category) + if debug_enabled: + print(formatted) + +func log_debug(message: String, category: String = ""): + if _should_log(LogLevel.DEBUG): + var formatted = _format_log_message(LogLevel.DEBUG, message, category) + if debug_enabled: + print(formatted) + +func log_info(message: String, category: String = ""): + if _should_log(LogLevel.INFO): + var formatted = _format_log_message(LogLevel.INFO, message, category) + print(formatted) + +func log_warn(message: String, category: String = ""): + if _should_log(LogLevel.WARN): + var formatted = _format_log_message(LogLevel.WARN, message, category) + print(formatted) + push_warning(formatted) + +func log_error(message: String, category: String = ""): + if _should_log(LogLevel.ERROR): + var formatted = _format_log_message(LogLevel.ERROR, message, category) + print(formatted) + push_error(formatted) + +func log_fatal(message: String, category: String = ""): + if _should_log(LogLevel.FATAL): + var formatted = _format_log_message(LogLevel.FATAL, message, category) + print(formatted) + push_error(formatted) diff --git a/src/autoloads/GameManager.gd b/src/autoloads/GameManager.gd new file mode 100644 index 0000000..cf29761 --- /dev/null +++ b/src/autoloads/GameManager.gd @@ -0,0 +1,39 @@ +extends Node + +const GAME_SCENE_PATH := "res://scenes/game/game.tscn" +const MAIN_SCENE_PATH := "res://scenes/main/main.tscn" + +var pending_gameplay_mode: String = "match3" + +func start_new_game() -> void: + start_game_with_mode("match3") + +func start_match3_game() -> void: + start_game_with_mode("match3") + +func start_clickomania_game() -> void: + start_game_with_mode("clickomania") + +func start_game_with_mode(gameplay_mode: String) -> void: + pending_gameplay_mode = gameplay_mode + var packed_scene := load(GAME_SCENE_PATH) + if not packed_scene or not packed_scene is PackedScene: + DebugManager.log_error("Failed to load Game scene at: %s" % GAME_SCENE_PATH, "GameManager") + return + get_tree().change_scene_to_packed(packed_scene) + # Wait one frame for the scene to be ready, then set gameplay mode + await get_tree().process_frame + if get_tree().current_scene and get_tree().current_scene.has_method("set_gameplay_mode"): + get_tree().current_scene.set_gameplay_mode(pending_gameplay_mode) + +func save_game() -> void: + DebugManager.log_info("Game saved (mock)", "GameManager") + +func exit_to_main_menu() -> void: + DebugManager.log_info("Attempting to exit to main menu", "GameManager") + var packed_scene := load(MAIN_SCENE_PATH) + if not packed_scene or not packed_scene is PackedScene: + DebugManager.log_error("Failed to load Main scene at: %s" % MAIN_SCENE_PATH, "GameManager") + return + DebugManager.log_info("Loading main scene", "GameManager") + get_tree().change_scene_to_packed(packed_scene) diff --git a/scripts/LocalizationManager.gd b/src/autoloads/LocalizationManager.gd similarity index 100% rename from scripts/LocalizationManager.gd rename to src/autoloads/LocalizationManager.gd diff --git a/scripts/SettingsManager.gd b/src/autoloads/SettingsManager.gd similarity index 77% rename from scripts/SettingsManager.gd rename to src/autoloads/SettingsManager.gd index ab9cf92..ac61caa 100644 --- a/scripts/SettingsManager.gd +++ b/src/autoloads/SettingsManager.gd @@ -18,7 +18,7 @@ var default_settings = { var languages_data = {} func _ready(): - print("SettingsManager ready") + DebugManager.log_info("SettingsManager ready", "SettingsManager") load_languages() load_settings() @@ -27,10 +27,10 @@ func load_settings(): if config.load(SETTINGS_FILE) == OK: for key in default_settings.keys(): settings[key] = config.get_value("settings", key, default_settings[key]) - print("Settings loaded: ", settings) + DebugManager.log_info("Settings loaded: " + str(settings), "SettingsManager") else: - print("No settings file found, using defaults") - print("Language is set to: ", settings["language"]) + DebugManager.log_warn("No settings file found, using defaults", "SettingsManager") + DebugManager.log_info("Language is set to: " + str(settings["language"]), "SettingsManager") TranslationServer.set_locale(settings["language"]) AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), linear_to_db(settings["master_volume"])) AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Music"), linear_to_db(settings["music_volume"])) @@ -42,7 +42,7 @@ func save_settings(): for key in settings.keys(): config.set_value("settings", key, settings[key]) config.save(SETTINGS_FILE) - print("Settings saved: ", settings) + DebugManager.log_info("Settings saved: " + str(settings), "SettingsManager") func get_setting(key: String): return settings.get(key) @@ -65,7 +65,7 @@ func _apply_setting_side_effect(key: String, value) -> void: func load_languages(): var file = FileAccess.open(LANGUAGES_JSON_PATH, FileAccess.READ) if not file: - print("Could not open languages.json") + DebugManager.log_error("Could not open languages.json", "SettingsManager") return var json_string = file.get_as_text() @@ -73,12 +73,12 @@ func load_languages(): var json = JSON.new() if json.parse(json_string) != OK: - print("Error parsing languages.json") + DebugManager.log_error("Error parsing languages.json", "SettingsManager") return languages_data = json.data if languages_data.has("languages"): - print("Languages loaded: ", languages_data.languages.keys()) + DebugManager.log_info("Languages loaded: " + str(languages_data.languages.keys()), "SettingsManager") func get_languages_data(): return languages_data diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..0f1a547 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,22 @@ +# Tests Directory + +This directory contains test scripts and validation utilities for the Skelly project. + +## Documentation + +For complete testing guidelines, conventions, and usage instructions, see: +**[docs/TESTING.md](../docs/TESTING.md)** + +## Current Files + +- `test_logging.gd` - Comprehensive logging system validation script + +## Quick Usage + +```gdscript +# Add as temporary autoload or run in scene +var test_script = preload("res://tests/test_logging.gd").new() +add_child(test_script) +``` + +See [docs/TESTING.md](../docs/TESTING.md) for detailed usage instructions and conventions. diff --git a/tests/test_logging.gd b/tests/test_logging.gd new file mode 100644 index 0000000..df6f5c8 --- /dev/null +++ b/tests/test_logging.gd @@ -0,0 +1,106 @@ +extends Node + +# Test script for the DebugManager logging system +# This script validates all log levels, filtering, and formatting functionality +# Usage: Add to scene or autoload temporarily to run tests + +func _ready(): + # Wait a frame for DebugManager to initialize + await get_tree().process_frame + test_logging_system() + +func test_logging_system(): + print("=== Starting Logging System Tests ===") + + # Test 1: Basic log level functionality + test_basic_logging() + + # Test 2: Log level filtering + test_log_level_filtering() + + # Test 3: Category functionality + test_category_logging() + + # Test 4: Debug mode integration + test_debug_mode_integration() + + print("=== Logging System Tests Complete ===") + +func test_basic_logging(): + print("\n--- Test 1: Basic Log Level Functionality ---") + + # Reset to INFO level for consistent testing + DebugManager.set_log_level(DebugManager.LogLevel.INFO) + + DebugManager.log_trace("TRACE: This should not appear (below INFO level)") + DebugManager.log_debug("DEBUG: This should not appear (below INFO level)") + DebugManager.log_info("INFO: This message should appear") + DebugManager.log_warn("WARN: This warning should appear") + DebugManager.log_error("ERROR: This error should appear") + DebugManager.log_fatal("FATAL: This fatal error should appear") + +func test_log_level_filtering(): + print("\n--- Test 2: Log Level Filtering ---") + + # Test DEBUG level + print("Setting log level to DEBUG...") + DebugManager.set_log_level(DebugManager.LogLevel.DEBUG) + DebugManager.log_trace("TRACE: Should not appear (below DEBUG)") + DebugManager.log_debug("DEBUG: Should appear with debug enabled") + DebugManager.log_info("INFO: Should appear") + + # Test ERROR level (very restrictive) + print("Setting log level to ERROR...") + DebugManager.set_log_level(DebugManager.LogLevel.ERROR) + DebugManager.log_debug("DEBUG: Should not appear (below ERROR)") + DebugManager.log_warn("WARN: Should not appear (below ERROR)") + DebugManager.log_error("ERROR: Should appear") + DebugManager.log_fatal("FATAL: Should appear") + + # Reset to INFO for remaining tests + DebugManager.set_log_level(DebugManager.LogLevel.INFO) + +func test_category_logging(): + print("\n--- Test 3: Category Functionality ---") + + DebugManager.log_info("Message without category") + DebugManager.log_info("Message with TEST category", "TEST") + DebugManager.log_info("Message with LOGGING category", "LOGGING") + DebugManager.log_warn("Warning with VALIDATION category", "VALIDATION") + DebugManager.log_error("Error with SYSTEM category", "SYSTEM") + +func test_debug_mode_integration(): + print("\n--- Test 4: Debug Mode Integration ---") + + # Set to TRACE level to test debug mode dependency + DebugManager.set_log_level(DebugManager.LogLevel.TRACE) + + var original_debug_state = DebugManager.is_debug_enabled() + + # Test with debug mode OFF + DebugManager.set_debug_enabled(false) + print("Debug mode OFF - TRACE and DEBUG should not appear:") + DebugManager.log_trace("TRACE: Should NOT appear (debug mode OFF)") + DebugManager.log_debug("DEBUG: Should NOT appear (debug mode OFF)") + DebugManager.log_info("INFO: Should appear regardless of debug mode") + + # Test with debug mode ON + DebugManager.set_debug_enabled(true) + print("Debug mode ON - TRACE and DEBUG should appear:") + DebugManager.log_trace("TRACE: Should appear (debug mode ON)") + DebugManager.log_debug("DEBUG: Should appear (debug mode ON)") + DebugManager.log_info("INFO: Should still appear") + + # Restore original debug state + DebugManager.set_debug_enabled(original_debug_state) + DebugManager.set_log_level(DebugManager.LogLevel.INFO) + +# Helper function to validate log level enum values +func test_log_level_enum(): + print("\n--- Log Level Enum Values ---") + print("TRACE: ", DebugManager.LogLevel.TRACE) + print("DEBUG: ", DebugManager.LogLevel.DEBUG) + print("INFO: ", DebugManager.LogLevel.INFO) + print("WARN: ", DebugManager.LogLevel.WARN) + print("ERROR: ", DebugManager.LogLevel.ERROR) + print("FATAL: ", DebugManager.LogLevel.FATAL)