diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 6347901..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/.vscode
-/.import
-/.mono
-/.vs
diff --git a/DungeonShooting.csproj b/DungeonShooting.csproj
deleted file mode 100644
index db88a8d..0000000
--- a/DungeonShooting.csproj
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- net472
-
-
\ No newline at end of file
diff --git a/DungeonShooting.sln b/DungeonShooting.sln
deleted file mode 100644
index 746d57c..0000000
--- a/DungeonShooting.sln
+++ /dev/null
@@ -1,19 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2012
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DungeonShooting", "DungeonShooting.csproj", "{1C7B20F3-5430-47C7-988D-0A360C4E9CDB}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- ExportDebug|Any CPU = ExportDebug|Any CPU
- ExportRelease|Any CPU = ExportRelease|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {1C7B20F3-5430-47C7-988D-0A360C4E9CDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {1C7B20F3-5430-47C7-988D-0A360C4E9CDB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {1C7B20F3-5430-47C7-988D-0A360C4E9CDB}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU
- {1C7B20F3-5430-47C7-988D-0A360C4E9CDB}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU
- {1C7B20F3-5430-47C7-988D-0A360C4E9CDB}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU
- {1C7B20F3-5430-47C7-988D-0A360C4E9CDB}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU
- EndGlobalSection
-EndGlobal
diff --git a/DungeonShooting_Art/environment/craftpix-net-228007/All Tileset/16x16.png b/DungeonShooting_Art/environment/craftpix-net-228007/All Tileset/16x16.png
new file mode 100644
index 0000000..4e0828a
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-228007/All Tileset/16x16.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/craftpix-net-228007/All Tileset/16x16.png.import b/DungeonShooting_Art/environment/craftpix-net-228007/All Tileset/16x16.png.import
new file mode 100644
index 0000000..3a2347b
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-228007/All Tileset/16x16.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/16x16.png-ea90e85bdf1fd38dc541589c933c9f3a.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/craftpix-net-228007/All Tileset/16x16.png"
+dest_files=[ "res://.import/16x16.png-ea90e85bdf1fd38dc541589c933c9f3a.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/craftpix-net-228007/Palette/Pallete.txt b/DungeonShooting_Art/environment/craftpix-net-228007/Palette/Pallete.txt
new file mode 100644
index 0000000..ad6e6d8
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-228007/Palette/Pallete.txt
@@ -0,0 +1 @@
+This palette belongs to Kerrie Lake, and can be found and downloaded for free here: https://lospec.com/palette-list/resurrect-64
\ No newline at end of file
diff --git a/DungeonShooting_Art/environment/craftpix-net-228007/license.txt b/DungeonShooting_Art/environment/craftpix-net-228007/license.txt
new file mode 100644
index 0000000..673e1aa
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-228007/license.txt
@@ -0,0 +1 @@
+https://craftpix.net/file-licenses/
\ No newline at end of file
diff --git a/DungeonShooting_Art/environment/craftpix-net-248911/16x16.png b/DungeonShooting_Art/environment/craftpix-net-248911/16x16.png
new file mode 100644
index 0000000..25987fc
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-248911/16x16.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/craftpix-net-248911/16x16.png.import b/DungeonShooting_Art/environment/craftpix-net-248911/16x16.png.import
new file mode 100644
index 0000000..9fef0f8
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-248911/16x16.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/16x16.png-6e9ff775940a8533671e6598dc2d886d.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/craftpix-net-248911/16x16.png"
+dest_files=[ "res://.import/16x16.png-6e9ff775940a8533671e6598dc2d886d.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/craftpix-net-248911/A Note to the Dev.txt b/DungeonShooting_Art/environment/craftpix-net-248911/A Note to the Dev.txt
new file mode 100644
index 0000000..6596983
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-248911/A Note to the Dev.txt
@@ -0,0 +1,15 @@
+Ho ho, the title got you, huh! :)
+
+Hello, thank you for your purchase!
+
+I'm Caio, the Clockwork Raven Studios artist, owner, and i hope this product live up to your expectations, i want you to know that your interest in my projects is what makes me work on it even harder.
+
+In case if it doesn't take up too much of your time, I would like to see what you're thinking about it in the comments, in the page of the store that you purchased the product, this helps me a lot!
+
+You can also see my progress in the creation of new assets and/or make suggestions, follow my twitter here: https://twitter.com/cwrstudios
+
+If you like my work, i would recommend you to take a look at my Patreon, you get spoilers of my upcoming assets, a community and everything i already made for only $5, and for staying as a Patron you'll always receive my new assets for free!
+
+My Patreon: https://www.patreon.com/clockworkravenstudios
+
+Regards, Caio
\ No newline at end of file
diff --git a/DungeonShooting_Art/environment/craftpix-net-248911/All Tileset/16x16.png b/DungeonShooting_Art/environment/craftpix-net-248911/All Tileset/16x16.png
new file mode 100644
index 0000000..25987fc
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-248911/All Tileset/16x16.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/craftpix-net-248911/All Tileset/16x16.png.import b/DungeonShooting_Art/environment/craftpix-net-248911/All Tileset/16x16.png.import
new file mode 100644
index 0000000..1cf5d36
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-248911/All Tileset/16x16.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/16x16.png-03810c2e769fb05274c12adf666f9aa1.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/craftpix-net-248911/All Tileset/16x16.png"
+dest_files=[ "res://.import/16x16.png-03810c2e769fb05274c12adf666f9aa1.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/craftpix-net-248911/EsRson.gif b/DungeonShooting_Art/environment/craftpix-net-248911/EsRson.gif
new file mode 100644
index 0000000..493642d
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-248911/EsRson.gif
Binary files differ
diff --git a/DungeonShooting_Art/environment/craftpix-net-248911/Palette/Pallete.txt b/DungeonShooting_Art/environment/craftpix-net-248911/Palette/Pallete.txt
new file mode 100644
index 0000000..ad6e6d8
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-248911/Palette/Pallete.txt
@@ -0,0 +1 @@
+This palette belongs to Kerrie Lake, and can be found and downloaded for free here: https://lospec.com/palette-list/resurrect-64
\ No newline at end of file
diff --git a/DungeonShooting_Art/environment/craftpix-net-248911/Rww2te.gif b/DungeonShooting_Art/environment/craftpix-net-248911/Rww2te.gif
new file mode 100644
index 0000000..977edd3
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-248911/Rww2te.gif
Binary files differ
diff --git a/DungeonShooting_Art/environment/craftpix-net-248911/license.txt b/DungeonShooting_Art/environment/craftpix-net-248911/license.txt
new file mode 100644
index 0000000..673e1aa
--- /dev/null
+++ b/DungeonShooting_Art/environment/craftpix-net-248911/license.txt
@@ -0,0 +1 @@
+https://craftpix.net/file-licenses/
\ No newline at end of file
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset.v4.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset.v4.png
new file mode 100644
index 0000000..d3061e2
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset.v4.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset.v4.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset.v4.png.import
new file mode 100644
index 0000000..4e37bd6
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset.v4.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/0x72_16x16DungeonTileset.v4.png-dcaf4c9b8c630676bfda11bcff9322cb.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset.v4.png"
+dest_files=[ "res://.import/0x72_16x16DungeonTileset.v4.png-dcaf4c9b8c630676bfda11bcff9322cb.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset_walls.v2.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset_walls.v2.png
new file mode 100644
index 0000000..e1e0412
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset_walls.v2.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset_walls.v2.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset_walls.v2.png.import
new file mode 100644
index 0000000..6b92223
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset_walls.v2.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/0x72_16x16DungeonTileset_walls.v2.png-9d1b5873f4804f7e2e2181eb903c72b1.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset1/0x72_16x16DungeonTileset_walls.v2.png"
+dest_files=[ "res://.import/0x72_16x16DungeonTileset_walls.v2.png-9d1b5873f4804f7e2e2181eb903c72b1.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset2/Dungeon Tileset + Spikes.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset2/Dungeon Tileset + Spikes.png
new file mode 100644
index 0000000..b94b19d
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset2/Dungeon Tileset + Spikes.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset2/Dungeon Tileset + Spikes.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset2/Dungeon Tileset + Spikes.png.import
new file mode 100644
index 0000000..561d1ba
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset2/Dungeon Tileset + Spikes.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Dungeon Tileset + Spikes.png-0b0ac12148fa4f15934514bfbc46c2eb.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset2/Dungeon Tileset + Spikes.png"
+dest_files=[ "res://.import/Dungeon Tileset + Spikes.png-0b0ac12148fa4f15934514bfbc46c2eb.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset2/website.txt b/DungeonShooting_Art/environment/itch-io-DungeonTileset2/website.txt
new file mode 100644
index 0000000..193056a
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset2/website.txt
@@ -0,0 +1 @@
+https://spicestudios.itch.io/dungeon-tileset
\ No newline at end of file
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset3/0x72_DungeonTilesetII_v1.3.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset3/0x72_DungeonTilesetII_v1.3.png
new file mode 100644
index 0000000..aaecb48
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset3/0x72_DungeonTilesetII_v1.3.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset3/0x72_DungeonTilesetII_v1.3.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset3/0x72_DungeonTilesetII_v1.3.png.import
new file mode 100644
index 0000000..e6797f5
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset3/0x72_DungeonTilesetII_v1.3.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/0x72_DungeonTilesetII_v1.3.png-1c858a59f4e435052047bdba37104c6d.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset3/0x72_DungeonTilesetII_v1.3.png"
+dest_files=[ "res://.import/0x72_DungeonTilesetII_v1.3.png-1c858a59f4e435052047bdba37104c6d.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset3/website.txt b/DungeonShooting_Art/environment/itch-io-DungeonTileset3/website.txt
new file mode 100644
index 0000000..ed3a826
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset3/website.txt
@@ -0,0 +1 @@
+https://0x72.itch.io/dungeontileset-ii
\ No newline at end of file
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/16x16 dungeon ii wall reconfig v04 spritesheet.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/16x16 dungeon ii wall reconfig v04 spritesheet.png
new file mode 100644
index 0000000..df021f3
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/16x16 dungeon ii wall reconfig v04 spritesheet.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/16x16 dungeon ii wall reconfig v04 spritesheet.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/16x16 dungeon ii wall reconfig v04 spritesheet.png.import
new file mode 100644
index 0000000..7a81ef8
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/16x16 dungeon ii wall reconfig v04 spritesheet.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/16x16 dungeon ii wall reconfig v04 spritesheet.png-912443f06cd2aff252dec097396c5d34.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset4/16x16 dungeon ii wall reconfig v04 spritesheet.png"
+dest_files=[ "res://.import/16x16 dungeon ii wall reconfig v04 spritesheet.png-912443f06cd2aff252dec097396c5d34.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/arrow.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/arrow.png
new file mode 100644
index 0000000..4baebfb
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/arrow.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/arrow.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/arrow.png.import
new file mode 100644
index 0000000..5f78641
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/arrow.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/arrow.png-d945c13a6ca437c3e71d6adb0e3d6c2d.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset4/bow/arrow.png"
+dest_files=[ "res://.import/arrow.png-d945c13a6ca437c3e71d6adb0e3d6c2d.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/bow.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/bow.png
new file mode 100644
index 0000000..0654ef2
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/bow.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/bow.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/bow.png.import
new file mode 100644
index 0000000..dc6645e
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/bow.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/bow.png-cf7ed3be40c3c132dffe693ed3eaea62.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset4/bow/bow.png"
+dest_files=[ "res://.import/bow.png-cf7ed3be40c3c132dffe693ed3eaea62.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit0.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit0.png
new file mode 100644
index 0000000..a4457f0
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit0.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit0.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit0.png.import
new file mode 100644
index 0000000..6bf9e08
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit0.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/hit0.png-f6ae5bf8aa634586ba35cd298657e88f.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset4/bow/effect/hit0.png"
+dest_files=[ "res://.import/hit0.png-f6ae5bf8aa634586ba35cd298657e88f.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit1.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit1.png
new file mode 100644
index 0000000..fc1e151
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit1.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit1.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit1.png.import
new file mode 100644
index 0000000..6174231
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit1.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/hit1.png-dff71ff18aaf926e3783079227be8aa0.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset4/bow/effect/hit1.png"
+dest_files=[ "res://.import/hit1.png-dff71ff18aaf926e3783079227be8aa0.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit2.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit2.png
new file mode 100644
index 0000000..acf1526
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit2.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit2.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit2.png.import
new file mode 100644
index 0000000..1dbbdc0
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit2.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/hit2.png-08913f6ef3702516923e214eb44be2a2.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset4/bow/effect/hit2.png"
+dest_files=[ "res://.import/hit2.png-08913f6ef3702516923e214eb44be2a2.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit3.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit3.png
new file mode 100644
index 0000000..272462c
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit3.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit3.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit3.png.import
new file mode 100644
index 0000000..78e2243
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit3.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/hit3.png-3e0b6dd0e6800e136aa13a83ec93ddc3.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset4/bow/effect/hit3.png"
+dest_files=[ "res://.import/hit3.png-3e0b6dd0e6800e136aa13a83ec93ddc3.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit4.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit4.png
new file mode 100644
index 0000000..aa1f261
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit4.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit4.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit4.png.import
new file mode 100644
index 0000000..f472b6c
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/bow/effect/hit4.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/hit4.png-13aa48a76ab50428f2595b5c50c88cf3.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset4/bow/effect/hit4.png"
+dest_files=[ "res://.import/hit4.png-13aa48a76ab50428f2595b5c50c88cf3.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset4/website.txt b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/website.txt
new file mode 100644
index 0000000..cea76c3
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset4/website.txt
@@ -0,0 +1 @@
+https://aekae13.itch.io/16x16-dungeon-walls-reconfig
\ No newline at end of file
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ \133lava\135.png" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ \133lava\135.png"
new file mode 100644
index 0000000..78d05b1
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ \133lava\135.png"
Binary files differ
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ \133lava\135.png.import" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ \133lava\135.png.import"
new file mode 100644
index 0000000..93e4420
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ \133lava\135.png.import"
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/dungeon_ [lava].png-4e0a4596f11b9d83c26ad95cd08fe720.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ [lava].png"
+dest_files=[ "res://.import/dungeon_ [lava].png-4e0a4596f11b9d83c26ad95cd08fe720.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ \133water\135.png" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ \133water\135.png"
new file mode 100644
index 0000000..bd805ad
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ \133water\135.png"
Binary files differ
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ \133water\135.png.import" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ \133water\135.png.import"
new file mode 100644
index 0000000..7a92ebe
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ \133water\135.png.import"
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/dungeon_ [water].png-ca865dfc877c036e54e824afef2246c5.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset5/dungeon_/dungeon_ [water].png"
+dest_files=[ "res://.import/dungeon_ [water].png-ca865dfc877c036e54e824afef2246c5.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_.png
new file mode 100644
index 0000000..1716e99
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_.png.import
new file mode 100644
index 0000000..dee74c8
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/dungeon_/dungeon_.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/dungeon_.png-200d6744028e726ab76a4ef1d4a6944f.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset5/dungeon_/dungeon_.png"
+dest_files=[ "res://.import/dungeon_.png-200d6744028e726ab76a4ef1d4a6944f.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_ \133traps\135.png" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_ \133traps\135.png"
new file mode 100644
index 0000000..d55ac7c
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_ \133traps\135.png"
Binary files differ
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_ \133traps\135.png.import" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_ \133traps\135.png.import"
new file mode 100644
index 0000000..6b02fc5
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_ \133traps\135.png.import"
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/shadows_ [traps].png-fbffdea17727dabaad9cbb69323afc04.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset5/shadows/shadows_ [traps].png"
+dest_files=[ "res://.import/shadows_ [traps].png-fbffdea17727dabaad9cbb69323afc04.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_ \133water & lava\135.png" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_ \133water & lava\135.png"
new file mode 100644
index 0000000..b40b97b
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_ \133water & lava\135.png"
Binary files differ
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_ \133water & lava\135.png.import" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_ \133water & lava\135.png.import"
new file mode 100644
index 0000000..731c365
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_ \133water & lava\135.png.import"
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/shadows_ [water & lava].png-26242c25c4b32df1b931eb54bcbed0f0.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset5/shadows/shadows_ [water & lava].png"
+dest_files=[ "res://.import/shadows_ [water & lava].png-26242c25c4b32df1b931eb54bcbed0f0.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_.png
new file mode 100644
index 0000000..5e4d9e7
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_.png.import
new file mode 100644
index 0000000..595f905
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/shadows/shadows_.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/shadows_.png-e2dc9a0834b0a5a1126b98147ff95828.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset5/shadows/shadows_.png"
+dest_files=[ "res://.import/shadows_.png-e2dc9a0834b0a5a1126b98147ff95828.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset5/website.txt b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/website.txt
new file mode 100644
index 0000000..34eae21
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset5/website.txt
@@ -0,0 +1 @@
+https://analogstudios.itch.io/dungeonold
\ No newline at end of file
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/acid_.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/acid_.png
new file mode 100644
index 0000000..3c9aedd
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/acid_.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/acid_.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/acid_.png.import
new file mode 100644
index 0000000..af0d48c
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/acid_.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/acid_.png-b5d3d31bec15e8b2ca4023384fc7d500.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset6/acid_.png"
+dest_files=[ "res://.import/acid_.png-b5d3d31bec15e8b2ca4023384fc7d500.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133blueCarpet\135.png" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133blueCarpet\135.png"
new file mode 100644
index 0000000..797ead0
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133blueCarpet\135.png"
Binary files differ
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133blueCarpet\135.png.import" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133blueCarpet\135.png.import"
new file mode 100644
index 0000000..b089a89
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133blueCarpet\135.png.import"
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/dungeonDecoration_0 [blueCarpet].png-840dfc764551f42372a3aa06c2fa47e1.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset6/dungeonDecoration_0 [blueCarpet].png"
+dest_files=[ "res://.import/dungeonDecoration_0 [blueCarpet].png-840dfc764551f42372a3aa06c2fa47e1.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133greenCarpet\135.png" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133greenCarpet\135.png"
new file mode 100644
index 0000000..8234991
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133greenCarpet\135.png"
Binary files differ
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133greenCarpet\135.png.import" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133greenCarpet\135.png.import"
new file mode 100644
index 0000000..71371f4
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133greenCarpet\135.png.import"
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/dungeonDecoration_0 [greenCarpet].png-dec36a31a95a33923d361db4496a393e.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset6/dungeonDecoration_0 [greenCarpet].png"
+dest_files=[ "res://.import/dungeonDecoration_0 [greenCarpet].png-dec36a31a95a33923d361db4496a393e.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133redCarpet\135.png" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133redCarpet\135.png"
new file mode 100644
index 0000000..8d38949
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133redCarpet\135.png"
Binary files differ
diff --git "a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133redCarpet\135.png.import" "b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133redCarpet\135.png.import"
new file mode 100644
index 0000000..4793f6f
--- /dev/null
+++ "b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0 \133redCarpet\135.png.import"
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/dungeonDecoration_0 [redCarpet].png-b93a3282e127aca48a390a9579676a53.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset6/dungeonDecoration_0 [redCarpet].png"
+dest_files=[ "res://.import/dungeonDecoration_0 [redCarpet].png-b93a3282e127aca48a390a9579676a53.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0.png
new file mode 100644
index 0000000..800e66f
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0.png.import
new file mode 100644
index 0000000..668ff15
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_0.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/dungeonDecoration_0.png-92dd68f5e7bcfd08c5e2a8b04db720c9.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset6/dungeonDecoration_0.png"
+dest_files=[ "res://.import/dungeonDecoration_0.png-92dd68f5e7bcfd08c5e2a8b04db720c9.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_1.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_1.png
new file mode 100644
index 0000000..d89c519
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_1.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_1.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_1.png.import
new file mode 100644
index 0000000..8ca6ef5
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeonDecoration_1.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/dungeonDecoration_1.png-bd9d6885cea4342e19c815e6362b138f.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset6/dungeonDecoration_1.png"
+dest_files=[ "res://.import/dungeonDecoration_1.png-bd9d6885cea4342e19c815e6362b138f.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeon_.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeon_.png
new file mode 100644
index 0000000..31115b3
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeon_.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeon_.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeon_.png.import
new file mode 100644
index 0000000..b06545b
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/dungeon_.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/dungeon_.png-ec8ad1aef6880d2c4764ef73d0ea77e1.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset6/dungeon_.png"
+dest_files=[ "res://.import/dungeon_.png-ec8ad1aef6880d2c4764ef73d0ea77e1.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/fire_.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/fire_.png
new file mode 100644
index 0000000..334d487
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/fire_.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/fire_.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/fire_.png.import
new file mode 100644
index 0000000..b5ba551
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/fire_.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/fire_.png-6bd8e0d2c4b25c5395a15488d122c92b.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset6/fire_.png"
+dest_files=[ "res://.import/fire_.png-6bd8e0d2c4b25c5395a15488d122c92b.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/traps_.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/traps_.png
new file mode 100644
index 0000000..c3c0028
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/traps_.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/traps_.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/traps_.png.import
new file mode 100644
index 0000000..d548524
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/traps_.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/traps_.png-7a96828690fa6445d59a6b1bb1474b74.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset6/traps_.png"
+dest_files=[ "res://.import/traps_.png-7a96828690fa6445d59a6b1bb1474b74.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/waterLavaAcid_.png b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/waterLavaAcid_.png
new file mode 100644
index 0000000..a9f8079
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/waterLavaAcid_.png
Binary files differ
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/waterLavaAcid_.png.import b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/waterLavaAcid_.png.import
new file mode 100644
index 0000000..2f397c3
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/waterLavaAcid_.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/waterLavaAcid_.png-75d6c2bc43e139cd78d2cc0e649ed716.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/itch-io-DungeonTileset6/waterLavaAcid_.png"
+dest_files=[ "res://.import/waterLavaAcid_.png-75d6c2bc43e139cd78d2cc0e649ed716.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Art/environment/itch-io-DungeonTileset6/website.txt b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/website.txt
new file mode 100644
index 0000000..b5dd953
--- /dev/null
+++ b/DungeonShooting_Art/environment/itch-io-DungeonTileset6/website.txt
@@ -0,0 +1 @@
+https://analogstudios.itch.io/dungeon
\ No newline at end of file
diff --git a/DungeonShooting_Art/ui/GUI/GUI.png b/DungeonShooting_Art/ui/GUI/GUI.png
new file mode 100644
index 0000000..c502477
--- /dev/null
+++ b/DungeonShooting_Art/ui/GUI/GUI.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/GUI/Split/template-ui.png b/DungeonShooting_Art/ui/GUI/Split/template-ui.png
new file mode 100644
index 0000000..69f40fb
--- /dev/null
+++ b/DungeonShooting_Art/ui/GUI/Split/template-ui.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/Palette/Palette.txt b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/Palette/Palette.txt
new file mode 100644
index 0000000..7935d5a
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/Palette/Palette.txt
@@ -0,0 +1 @@
+Credit to @PineTreePizza for this wonderful pallete (rosy 42), I also added 3 shades of blue from edg32.
\ No newline at end of file
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/Palette/rosyandblue.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/Palette/rosyandblue.png
new file mode 100644
index 0000000..059079e
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/Palette/rosyandblue.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/Split/Cursor.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/Split/Cursor.png
new file mode 100644
index 0000000..068c198
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/Split/Cursor.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/Thanks.txt b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/Thanks.txt
new file mode 100644
index 0000000..4092176
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/Thanks.txt
@@ -0,0 +1,5 @@
+Thanks for buying this pack and supporting me, I hope you find it useful!
+You can reach me through Twitter (@Vryell) if you have any feedback or want to know more about my work.
+Find more packs at my itch.io page:
+https://vryell.itch.io/
+That's it, Enjoy! :)
\ No newline at end of file
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/controller_minimal.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/controller_minimal.png
new file mode 100644
index 0000000..42f63ad
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/controller_minimal.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/controller_ps.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/controller_ps.png
new file mode 100644
index 0000000..2ddc92d
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/controller_ps.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/controller_switch.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/controller_switch.png
new file mode 100644
index 0000000..c71a38e
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/controller_switch.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/controller_xbox.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/controller_xbox.png
new file mode 100644
index 0000000..9c81125
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/controller_xbox.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/cursors.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/cursors.png
new file mode 100644
index 0000000..b40cfe5
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/cursors.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_dark_all.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_dark_all.png
new file mode 100644
index 0000000..56e5cfe
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_dark_all.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_dark_alphanumeric.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_dark_alphanumeric.png
new file mode 100644
index 0000000..812b06c
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_dark_alphanumeric.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_dark_symbols.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_dark_symbols.png
new file mode 100644
index 0000000..80ec1f0
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_dark_symbols.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_light_all.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_light_all.png
new file mode 100644
index 0000000..d276361
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_light_all.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_light_alphanumeric.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_light_alphanumeric.png
new file mode 100644
index 0000000..042d8bc
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_light_alphanumeric.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_light_symbols.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_light_symbols.png
new file mode 100644
index 0000000..faf5662
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/kb_light_symbols.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/mouse.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/mouse.png
new file mode 100644
index 0000000..a865059
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/mouse.png
Binary files differ
diff --git a/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/sticks.png b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/sticks.png
new file mode 100644
index 0000000..46a5c6e
--- /dev/null
+++ b/DungeonShooting_Art/ui/itch-io-Controllers and Keyboard/sticks.png
Binary files differ
diff --git a/DungeonShooting_Godot/.gitignore b/DungeonShooting_Godot/.gitignore
new file mode 100644
index 0000000..6347901
--- /dev/null
+++ b/DungeonShooting_Godot/.gitignore
@@ -0,0 +1,4 @@
+/.vscode
+/.import
+/.mono
+/.vs
diff --git a/DungeonShooting_Godot/DungeonShooting.csproj b/DungeonShooting_Godot/DungeonShooting.csproj
new file mode 100644
index 0000000..db88a8d
--- /dev/null
+++ b/DungeonShooting_Godot/DungeonShooting.csproj
@@ -0,0 +1,5 @@
+
+
+ net472
+
+
\ No newline at end of file
diff --git a/DungeonShooting_Godot/DungeonShooting.sln b/DungeonShooting_Godot/DungeonShooting.sln
new file mode 100644
index 0000000..746d57c
--- /dev/null
+++ b/DungeonShooting_Godot/DungeonShooting.sln
@@ -0,0 +1,19 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DungeonShooting", "DungeonShooting.csproj", "{1C7B20F3-5430-47C7-988D-0A360C4E9CDB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ ExportDebug|Any CPU = ExportDebug|Any CPU
+ ExportRelease|Any CPU = ExportRelease|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {1C7B20F3-5430-47C7-988D-0A360C4E9CDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1C7B20F3-5430-47C7-988D-0A360C4E9CDB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1C7B20F3-5430-47C7-988D-0A360C4E9CDB}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU
+ {1C7B20F3-5430-47C7-988D-0A360C4E9CDB}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU
+ {1C7B20F3-5430-47C7-988D-0A360C4E9CDB}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU
+ {1C7B20F3-5430-47C7-988D-0A360C4E9CDB}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/DungeonShooting_Godot/addons/vnen.tiled_importer/plugin.cfg b/DungeonShooting_Godot/addons/vnen.tiled_importer/plugin.cfg
new file mode 100644
index 0000000..e0b9ec7
--- /dev/null
+++ b/DungeonShooting_Godot/addons/vnen.tiled_importer/plugin.cfg
@@ -0,0 +1,8 @@
+config_version=3
+[plugin]
+
+name="Tiled Map Importer"
+description="Importer for TileMaps and TileSets made on Tiled Map Editor"
+version="2.4"
+author="George Marques"
+script="vnen.tiled_importer.gd"
diff --git a/DungeonShooting_Godot/addons/vnen.tiled_importer/polygon_sorter.gd b/DungeonShooting_Godot/addons/vnen.tiled_importer/polygon_sorter.gd
new file mode 100644
index 0000000..d646d0b
--- /dev/null
+++ b/DungeonShooting_Godot/addons/vnen.tiled_importer/polygon_sorter.gd
@@ -0,0 +1,67 @@
+# The MIT License (MIT)
+#
+# Copyright (c) 2018 George Marques
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+# Sorter for polygon vertices
+tool
+extends Reference
+
+var center
+
+# Sort the vertices of a convex polygon to clockwise order
+# Receives a PoolVector2Array and returns a new one
+func sort_polygon(vertices):
+ vertices = Array(vertices)
+
+ var centroid = Vector2()
+ var size = vertices.size()
+
+ for i in range(0, size):
+ centroid += vertices[i]
+
+ centroid /= size
+
+ center = centroid
+ vertices.sort_custom(self, "is_less")
+
+ return PoolVector2Array(vertices)
+
+# Sorter function, determines which of the poins should come first
+func is_less(a, b):
+ if a.x - center.x >= 0 and b.x - center.x < 0:
+ return false
+ elif a.x - center.x < 0 and b.x - center.x >= 0:
+ return true
+ elif a.x - center.x == 0 and b.x - center.x == 0:
+ if a.y - center.y >= 0 or b.y - center.y >= 0:
+ return a.y < b.y
+ return a.y > b.y
+
+ var det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y)
+ if det > 0:
+ return true
+ elif det < 0:
+ return false
+
+ var d1 = (a - center).length_squared()
+ var d2 = (b - center).length_squared()
+
+ return d1 < d2
diff --git a/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled.png b/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled.png
new file mode 100644
index 0000000..17d7d49
--- /dev/null
+++ b/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled.png
Binary files differ
diff --git a/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled.png.import b/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled.png.import
new file mode 100644
index 0000000..6d82870
--- /dev/null
+++ b/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/tiled.png-dbbabe58e4f927769540a522a2073689.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/vnen.tiled_importer/tiled.png"
+dest_files=[ "res://.import/tiled.png-dbbabe58e4f927769540a522a2073689.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled_import_plugin.gd b/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled_import_plugin.gd
new file mode 100644
index 0000000..7b45c1d
--- /dev/null
+++ b/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled_import_plugin.gd
@@ -0,0 +1,139 @@
+# The MIT License (MIT)
+#
+# Copyright (c) 2018 George Marques
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+tool
+extends EditorImportPlugin
+
+enum { PRESET_DEFAULT, PRESET_PIXEL_ART }
+
+const TiledMapReader = preload("tiled_map_reader.gd")
+
+func get_importer_name():
+ return "vnen.tiled_importer"
+
+func get_visible_name():
+ return "Scene from Tiled"
+
+func get_recognized_extensions():
+ if ProjectSettings.get_setting("tiled_importer/enable_json_format"):
+ return ["json", "tmx"]
+ else:
+ return ["tmx"]
+
+func get_save_extension():
+ return "scn"
+
+func get_priority():
+ return 1
+
+func get_import_order():
+ return 101
+
+func get_resource_type():
+ return "PackedScene"
+
+func get_preset_count():
+ return 2
+
+func get_preset_name(preset):
+ match preset:
+ PRESET_DEFAULT: return "Default"
+ PRESET_PIXEL_ART: return "Pixel Art"
+
+func get_import_options(preset):
+ return [
+ {
+ "name": "custom_properties",
+ "default_value": true
+ },
+ {
+ "name": "tile_metadata",
+ "default_value": false
+ },
+ {
+ "name": "uv_clip",
+ "default_value": true
+ },
+ {
+ "name": "image_flags",
+ "default_value": 0 if preset == PRESET_PIXEL_ART else Texture.FLAGS_DEFAULT,
+ "property_hint": PROPERTY_HINT_FLAGS,
+ "hint_string": "Mipmaps,Repeat,Filter,Anisotropic,sRGB,Mirrored Repeat"
+ },
+ {
+ "name": "collision_layer",
+ "default_value": 1,
+ "property_hint": PROPERTY_HINT_LAYERS_2D_PHYSICS
+ },
+ {
+ "name": "embed_internal_images",
+ "default_value": true if preset == PRESET_PIXEL_ART else false
+ },
+ {
+ "name": "save_tiled_properties",
+ "default_value": false
+ },
+ {
+ "name": "add_background",
+ "default_value": true
+ },
+ {
+ "name": "post_import_script",
+ "default_value": "",
+ "property_hint": PROPERTY_HINT_FILE,
+ "hint_string": "*.gd;GDScript"
+ }
+ ]
+
+func get_option_visibility(option, options):
+ return true
+
+func import(source_file, save_path, options, r_platform_variants, r_gen_files):
+ var map_reader = TiledMapReader.new()
+
+ var scene = map_reader.build(source_file, options)
+
+ if typeof(scene) != TYPE_OBJECT:
+ # Error happened
+ return scene
+
+ # Post imports script
+ if not options.post_import_script.empty():
+ var script = load(options.post_import_script)
+ if not script or not script is GDScript:
+ printerr("Post import script is not a GDScript.")
+ return ERR_INVALID_PARAMETER
+
+ script = script.new()
+ if not script.has_method("post_import"):
+ printerr("Post import script does not have a 'post_import' method.")
+ return ERR_INVALID_PARAMETER
+
+ scene = script.post_import(scene)
+
+ if not scene or not scene is Node2D:
+ printerr("Invalid scene returned from post import script.")
+ return ERR_INVALID_DATA
+
+ var packed_scene = PackedScene.new()
+ packed_scene.pack(scene)
+ return ResourceSaver.save("%s.%s" % [save_path, get_save_extension()], packed_scene)
diff --git a/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled_map_reader.gd b/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled_map_reader.gd
new file mode 100644
index 0000000..c2cd968
--- /dev/null
+++ b/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled_map_reader.gd
@@ -0,0 +1,1405 @@
+# The MIT License (MIT)
+#
+# Copyright (c) 2018 George Marques
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+tool
+extends Reference
+
+# Constants for tile flipping
+# http://doc.mapeditor.org/reference/tmx-map-format/#tile-flipping
+const FLIPPED_HORIZONTALLY_FLAG = 0x80000000
+const FLIPPED_VERTICALLY_FLAG = 0x40000000
+const FLIPPED_DIAGONALLY_FLAG = 0x20000000
+
+# XML Format reader
+const TiledXMLToDictionary = preload("tiled_xml_to_dict.gd")
+
+# Polygon vertices sorter
+const PolygonSorter = preload("polygon_sorter.gd")
+
+# Prefix for error messages, make easier to identify the source
+const error_prefix = "Tiled Importer: "
+
+# Properties to save the value in the metadata
+const whitelist_properties = [
+ "backgroundcolor",
+ "compression",
+ "draworder",
+ "gid",
+ "height",
+ "imageheight",
+ "imagewidth",
+ "infinite",
+ "margin",
+ "name",
+ "offsetx",
+ "offsety",
+ "orientation",
+ "probability",
+ "spacing",
+ "tilecount",
+ "tiledversion",
+ "tileheight",
+ "tilewidth",
+ "type",
+ "version",
+ "visible",
+ "width",
+ "custom_material"
+]
+
+# All templates loaded, can be looked up by path name
+var _loaded_templates = {}
+# Maps each tileset file used by the map to it's first gid; Used for template parsing
+var _tileset_path_to_first_gid = {}
+
+func reset_global_memebers():
+ _loaded_templates = {}
+ _tileset_path_to_first_gid = {}
+
+# Main function
+# Reads a source file and gives back a scene
+func build(source_path, options):
+ reset_global_memebers()
+ var map = read_file(source_path)
+ if typeof(map) == TYPE_INT:
+ return map
+ if typeof(map) != TYPE_DICTIONARY:
+ return ERR_INVALID_DATA
+
+ var err = validate_map(map)
+ if err != OK:
+ return err
+
+ var cell_size = Vector2(int(map.tilewidth), int(map.tileheight))
+ var map_mode = TileMap.MODE_SQUARE
+ var map_offset = TileMap.HALF_OFFSET_DISABLED
+ var map_pos_offset = Vector2()
+ var map_background = Color()
+ var cell_offset = Vector2()
+ if "orientation" in map:
+ match map.orientation:
+ "isometric":
+ map_mode = TileMap.MODE_ISOMETRIC
+ "staggered":
+ map_pos_offset.y -= cell_size.y / 2
+ match map.staggeraxis:
+ "x":
+ map_offset = TileMap.HALF_OFFSET_Y
+ cell_size.x /= 2.0
+ if map.staggerindex == "even":
+ cell_offset.x += 1
+ map_pos_offset.x -= cell_size.x
+ "y":
+ map_offset = TileMap.HALF_OFFSET_X
+ cell_size.y /= 2.0
+ if map.staggerindex == "even":
+ cell_offset.y += 1
+ map_pos_offset.y -= cell_size.y
+ "hexagonal":
+ # Godot maps are always odd and don't have an "even" setting. To
+ # imitate even staggering we simply start one row/column late and
+ # adjust the position of the whole map.
+ match map.staggeraxis:
+ "x":
+ map_offset = TileMap.HALF_OFFSET_Y
+ cell_size.x = int((cell_size.x + map.hexsidelength) / 2)
+ if map.staggerindex == "even":
+ cell_offset.x += 1
+ map_pos_offset.x -= cell_size.x
+ "y":
+ map_offset = TileMap.HALF_OFFSET_X
+ cell_size.y = int((cell_size.y + map.hexsidelength) / 2)
+ if map.staggerindex == "even":
+ cell_offset.y += 1
+ map_pos_offset.y -= cell_size.y
+
+ var tileset = build_tileset_for_scene(map.tilesets, source_path, options)
+ if typeof(tileset) != TYPE_OBJECT:
+ # Error happened
+ return tileset
+
+ var root = Node2D.new()
+ root.set_name(source_path.get_file().get_basename())
+ if options.save_tiled_properties:
+ set_tiled_properties_as_meta(root, map)
+ if options.custom_properties:
+ set_custom_properties(root, map)
+
+ var map_data = {
+ "options": options,
+ "map_mode": map_mode,
+ "map_offset": map_offset,
+ "map_pos_offset": map_pos_offset,
+ "map_background": map_background,
+ "cell_size": cell_size,
+ "cell_offset": cell_offset,
+ "tileset": tileset,
+ "source_path": source_path,
+ "infinite": bool(map.infinite) if "infinite" in map else false
+ }
+
+ for layer in map.layers:
+ err = make_layer(layer, root, root, map_data)
+ if err != OK:
+ return err
+
+ if options.add_background and "backgroundcolor" in map:
+ var bg_color = str(map.backgroundcolor)
+ if (!bg_color.is_valid_html_color()):
+ print_error("Invalid background color format: " + bg_color)
+ return root
+
+ map_background = Color(bg_color)
+
+ var viewport_size = Vector2(ProjectSettings.get("display/window/size/width"), ProjectSettings.get("display/window/size/height"))
+ var parbg = ParallaxBackground.new()
+ var parlayer = ParallaxLayer.new()
+ var colorizer = ColorRect.new()
+
+ parbg.scroll_ignore_camera_zoom = true
+ parlayer.motion_mirroring = viewport_size
+ colorizer.color = map_background
+ colorizer.rect_size = viewport_size
+ colorizer.rect_min_size = viewport_size
+
+ parbg.name = "Background"
+ root.add_child(parbg)
+ parbg.owner = root
+ parlayer.name = "BackgroundLayer"
+ parbg.add_child(parlayer)
+ parlayer.owner = root
+ colorizer.name = "BackgroundColor"
+ parlayer.add_child(colorizer)
+ colorizer.owner = root
+
+ return root
+
+# Creates a layer node from the data
+# Returns an error code
+func make_layer(layer, parent, root, data):
+ var err = validate_layer(layer)
+ if err != OK:
+ return err
+
+ # Main map data
+ var map_mode = data.map_mode
+ var map_offset = data.map_offset
+ var map_pos_offset = data.map_pos_offset
+ var cell_size = data.cell_size
+ var cell_offset = data.cell_offset
+ var options = data.options
+ var tileset = data.tileset
+ var source_path = data.source_path
+ var infinite = data.infinite
+
+ var opacity = float(layer.opacity) if "opacity" in layer else 1.0
+ var visible = bool(layer.visible) if "visible" in layer else true
+
+ var z_index = 0
+
+ if "properties" in layer and "z_index" in layer.properties:
+ z_index = layer.properties.z_index
+
+ if layer.type == "tilelayer":
+ var layer_size = Vector2(int(layer.width), int(layer.height))
+ var tilemap = TileMap.new()
+ tilemap.set_name(str(layer.name))
+ tilemap.cell_size = cell_size
+ tilemap.modulate = Color(1.0, 1.0, 1.0, opacity);
+ tilemap.visible = visible
+ tilemap.mode = map_mode
+ tilemap.cell_half_offset = map_offset
+ tilemap.format = 1
+ tilemap.cell_clip_uv = options.uv_clip
+ tilemap.cell_y_sort = true
+ tilemap.collision_layer = options.collision_layer
+ tilemap.z_index = z_index
+
+ var offset = Vector2()
+ if "offsetx" in layer:
+ offset.x = int(layer.offsetx)
+ if "offsety" in layer:
+ offset.y = int(layer.offsety)
+
+ tilemap.position = offset + map_pos_offset
+ tilemap.tile_set = tileset
+
+ var chunks = []
+
+ if infinite:
+ chunks = layer.chunks
+ else:
+ chunks = [layer]
+
+ for chunk in chunks:
+ err = validate_chunk(chunk)
+ if err != OK:
+ return err
+
+ var chunk_data = chunk.data
+
+ if "encoding" in layer and layer.encoding == "base64":
+ if "compression" in layer:
+ chunk_data = decompress_layer_data(chunk.data, layer.compression, layer_size)
+ if typeof(chunk_data) == TYPE_INT:
+ # Error happened
+ return chunk_data
+ else:
+ chunk_data = read_base64_layer_data(chunk.data)
+
+ var count = 0
+ for tile_id in chunk_data:
+ var int_id = int(str(tile_id)) & 0xFFFFFFFF
+
+ if int_id == 0:
+ count += 1
+ continue
+
+ var flipped_h = bool(int_id & FLIPPED_HORIZONTALLY_FLAG)
+ var flipped_v = bool(int_id & FLIPPED_VERTICALLY_FLAG)
+ var flipped_d = bool(int_id & FLIPPED_DIAGONALLY_FLAG)
+
+ var gid = int_id & ~(FLIPPED_HORIZONTALLY_FLAG | FLIPPED_VERTICALLY_FLAG | FLIPPED_DIAGONALLY_FLAG)
+
+ var cell_x = cell_offset.x + chunk.x + (count % int(chunk.width))
+ var cell_y = cell_offset.y + chunk.y + int(count / chunk.width)
+ tilemap.set_cell(cell_x, cell_y, gid, flipped_h, flipped_v, flipped_d)
+
+ count += 1
+
+ if options.save_tiled_properties:
+ set_tiled_properties_as_meta(tilemap, layer)
+ if options.custom_properties:
+ set_custom_properties(tilemap, layer)
+
+ tilemap.set("editor/display_folded", true)
+ parent.add_child(tilemap)
+ tilemap.set_owner(root)
+ elif layer.type == "imagelayer":
+ var image = null
+ if layer.image != "":
+ image = load_image(layer.image, source_path, options)
+ if typeof(image) != TYPE_OBJECT:
+ # Error happened
+ return image
+
+ var pos = Vector2()
+ var offset = Vector2()
+
+ if "x" in layer:
+ pos.x = float(layer.x)
+ if "y" in layer:
+ pos.y = float(layer.y)
+ if "offsetx" in layer:
+ offset.x = float(layer.offsetx)
+ if "offsety" in layer:
+ offset.y = float(layer.offsety)
+
+ var sprite = Sprite.new()
+ sprite.set_name(str(layer.name))
+ sprite.centered = false
+ sprite.texture = image
+ sprite.visible = visible
+ sprite.modulate = Color(1.0, 1.0, 1.0, opacity)
+ sprite.z_index = z_index
+ if options.save_tiled_properties:
+ set_tiled_properties_as_meta(sprite, layer)
+ if options.custom_properties:
+ set_custom_properties(sprite, layer)
+
+ sprite.set("editor/display_folded", true)
+ parent.add_child(sprite)
+ sprite.position = pos + offset
+ sprite.set_owner(root)
+ elif layer.type == "objectgroup":
+ var object_layer = Node2D.new()
+ if options.save_tiled_properties:
+ set_tiled_properties_as_meta(object_layer, layer)
+ if options.custom_properties:
+ set_custom_properties(object_layer, layer)
+ object_layer.modulate = Color(1.0, 1.0, 1.0, opacity)
+ object_layer.visible = visible
+ object_layer.z_index = z_index
+ object_layer.set("editor/display_folded", true)
+ parent.add_child(object_layer)
+ object_layer.set_owner(root)
+ if "name" in layer and not str(layer.name).empty():
+ object_layer.set_name(str(layer.name))
+
+ if not "draworder" in layer or layer.draworder == "topdown":
+ layer.objects.sort_custom(self, "object_sorter")
+
+ for object in layer.objects:
+ if "template" in object:
+ var template_file = object["template"]
+ var template_data_immutable = get_template(remove_filename_from_path(data["source_path"]) + template_file)
+ if typeof(template_data_immutable) != TYPE_DICTIONARY:
+ # Error happened
+ print("Error getting template for object with id " + str(data["id"]))
+ continue
+
+ # Overwrite template data with current object data
+ apply_template(object, template_data_immutable)
+
+ set_default_obj_params(object)
+
+ if "point" in object and object.point:
+ var point = Position2D.new()
+ if not "x" in object or not "y" in object:
+ print_error("Missing coordinates for point in object layer.")
+ continue
+ point.position = Vector2(float(object.x), float(object.y))
+ point.visible = bool(object.visible) if "visible" in object else true
+ object_layer.add_child(point)
+ point.set_owner(root)
+ if "name" in object and not str(object.name).empty():
+ point.set_name(str(object.name))
+ elif "id" in object and not str(object.id).empty():
+ point.set_name(str(object.id))
+ if options.save_tiled_properties:
+ set_tiled_properties_as_meta(point, object)
+ if options.custom_properties:
+ set_custom_properties(point, object)
+
+ elif not "gid" in object:
+ # Not a tile object
+ if "type" in object and object.type == "navigation":
+ # Can't make navigation objects right now
+ print_error("Navigation polygons aren't supported in an object layer.")
+ continue # Non-fatal error
+ var shape = shape_from_object(object)
+
+ if typeof(shape) != TYPE_OBJECT:
+ # Error happened
+ return shape
+
+ if "type" in object and object.type == "occluder":
+ var occluder = LightOccluder2D.new()
+ var pos = Vector2()
+ var rot = 0
+
+ if "x" in object:
+ pos.x = float(object.x)
+ if "y" in object:
+ pos.y = float(object.y)
+ if "rotation" in object:
+ rot = float(object.rotation)
+
+ occluder.visible = bool(object.visible) if "visible" in object else true
+ occluder.position = pos
+ occluder.rotation_degrees = rot
+ occluder.occluder = shape
+ if "name" in object and not str(object.name).empty():
+ occluder.set_name(str(object.name))
+ elif "id" in object and not str(object.id).empty():
+ occluder.set_name(str(object.id))
+
+ if options.save_tiled_properties:
+ set_tiled_properties_as_meta(occluder, object)
+ if options.custom_properties:
+ set_custom_properties(occluder, object)
+
+ object_layer.add_child(occluder)
+ occluder.set_owner(root)
+
+ else:
+ var body = Area2D.new() if object.type == "area" else StaticBody2D.new()
+
+ var offset = Vector2()
+ var collision
+ var pos = Vector2()
+ var rot = 0
+
+ if not ("polygon" in object or "polyline" in object):
+ # Regular shape
+ collision = CollisionShape2D.new()
+ collision.shape = shape
+ if shape is RectangleShape2D:
+ offset = shape.extents
+ elif shape is CircleShape2D:
+ offset = Vector2(shape.radius, shape.radius)
+ elif shape is CapsuleShape2D:
+ offset = Vector2(shape.radius, shape.height)
+ if shape.radius > shape.height:
+ var temp = shape.radius
+ shape.radius = shape.height
+ shape.height = temp
+ collision.rotation_degrees = 90
+ shape.height *= 2
+ collision.position = offset
+ else:
+ collision = CollisionPolygon2D.new()
+ var points = null
+ if shape is ConcavePolygonShape2D:
+ points = []
+ var segments = shape.segments
+ for i in range(0, segments.size()):
+ if i % 2 != 0:
+ continue
+ points.push_back(segments[i])
+ collision.build_mode = CollisionPolygon2D.BUILD_SEGMENTS
+ else:
+ points = shape.points
+ collision.build_mode = CollisionPolygon2D.BUILD_SOLIDS
+ collision.polygon = points
+
+ collision.one_way_collision = object.type == "one-way"
+
+ if "x" in object:
+ pos.x = float(object.x)
+ if "y" in object:
+ pos.y = float(object.y)
+ if "rotation" in object:
+ rot = float(object.rotation)
+
+ body.set("editor/display_folded", true)
+ object_layer.add_child(body)
+ body.set_owner(root)
+ body.add_child(collision)
+ collision.set_owner(root)
+
+ if options.save_tiled_properties:
+ set_tiled_properties_as_meta(body, object)
+ if options.custom_properties:
+ set_custom_properties(body, object)
+
+ if "name" in object and not str(object.name).empty():
+ body.set_name(str(object.name))
+ elif "id" in object and not str(object.id).empty():
+ body.set_name(str(object.id))
+ body.visible = bool(object.visible) if "visible" in object else true
+ body.position = pos
+ body.rotation_degrees = rot
+
+ else: # "gid" in object
+ var tile_raw_id = int(str(object.gid)) & 0xFFFFFFFF
+ var tile_id = tile_raw_id & ~(FLIPPED_HORIZONTALLY_FLAG | FLIPPED_VERTICALLY_FLAG | FLIPPED_DIAGONALLY_FLAG)
+
+ var is_tile_object = tileset.tile_get_region(tile_id).get_area() == 0
+ var collisions = tileset.tile_get_shape_count(tile_id)
+ var has_collisions = collisions > 0 && object.has("type") && object.type != "sprite"
+ var sprite = Sprite.new()
+ var pos = Vector2()
+ var rot = 0
+ var scale = Vector2(1, 1)
+ sprite.texture = tileset.tile_get_texture(tile_id)
+ var texture_size = sprite.texture.get_size() if sprite.texture != null else Vector2()
+
+ if not is_tile_object:
+ sprite.region_enabled = true
+ sprite.region_rect = tileset.tile_get_region(tile_id)
+ texture_size = tileset.tile_get_region(tile_id).size
+
+ sprite.flip_h = bool(tile_raw_id & FLIPPED_HORIZONTALLY_FLAG)
+ sprite.flip_v = bool(tile_raw_id & FLIPPED_VERTICALLY_FLAG)
+
+ if "x" in object:
+ pos.x = float(object.x)
+ if "y" in object:
+ pos.y = float(object.y)
+ if "rotation" in object:
+ rot = float(object.rotation)
+ if texture_size != Vector2():
+ if "width" in object and float(object.width) != texture_size.x:
+ scale.x = float(object.width) / texture_size.x
+ if "height" in object and float(object.height) != texture_size.y:
+ scale.y = float(object.height) / texture_size.y
+
+ var obj_root = sprite
+ if has_collisions:
+ match object.type:
+ "area": obj_root = Area2D.new()
+ "kinematic": obj_root = KinematicBody2D.new()
+ "rigid": obj_root = RigidBody2D.new()
+ _: obj_root = StaticBody2D.new()
+
+ object_layer.add_child(obj_root)
+ obj_root.owner = root
+
+ obj_root.add_child(sprite)
+ sprite.owner = root
+
+ var shapes = tileset.tile_get_shapes(tile_id)
+ for s in shapes:
+ var collision_node = CollisionShape2D.new()
+ collision_node.shape = s.shape
+
+ collision_node.transform = s.shape_transform
+ if sprite.flip_h:
+ collision_node.position.x *= -1
+ collision_node.position.x -= cell_size.x
+ collision_node.scale.x *= -1
+ if sprite.flip_v:
+ collision_node.scale.y *= -1
+ collision_node.position.y *= -1
+ collision_node.position.y -= cell_size.y
+ obj_root.add_child(collision_node)
+ collision_node.owner = root
+
+ if "name" in object and not str(object.name).empty():
+ obj_root.set_name(str(object.name))
+ elif "id" in object and not str(object.id).empty():
+ obj_root.set_name(str(object.id))
+
+ obj_root.position = pos
+ obj_root.rotation_degrees = rot
+ obj_root.visible = bool(object.visible) if "visible" in object else true
+ obj_root.scale = scale
+ # Translate from Tiled bottom-left position to Godot top-left
+ sprite.centered = false
+ sprite.region_filter_clip = options.uv_clip
+ sprite.offset = Vector2(0, -texture_size.y)
+
+ if not has_collisions:
+ object_layer.add_child(sprite)
+ sprite.set_owner(root)
+
+ if options.save_tiled_properties:
+ set_tiled_properties_as_meta(obj_root, object)
+ if options.custom_properties:
+ if options.tile_metadata:
+ var tile_meta = tileset.get_meta("tile_meta")
+ if typeof(tile_meta) == TYPE_DICTIONARY and tile_id in tile_meta:
+ for prop in tile_meta[tile_id]:
+ obj_root.set_meta(prop, tile_meta[tile_id][prop])
+ set_custom_properties(obj_root, object)
+
+ elif layer.type == "group":
+ var group = Node2D.new()
+ var pos = Vector2()
+ if "x" in layer:
+ pos.x = float(layer.x)
+ if "y" in layer:
+ pos.y = float(layer.y)
+ group.modulate = Color(1.0, 1.0, 1.0, opacity)
+ group.visible = visible
+ group.position = pos
+ group.z_index = z_index
+
+ if options.save_tiled_properties:
+ set_tiled_properties_as_meta(group, layer)
+ if options.custom_properties:
+ set_custom_properties(group, layer)
+
+ if "name" in layer and not str(layer.name).empty():
+ group.set_name(str(layer.name))
+
+ group.set("editor/display_folded", true)
+ parent.add_child(group)
+ group.set_owner(root)
+
+ for sub_layer in layer.layers:
+ make_layer(sub_layer, group, root, data)
+
+ else:
+ print_error("Unknown layer type ('%s') in '%s'" % [str(layer.type), str(layer.name) if "name" in layer else "[unnamed layer]"])
+ return ERR_INVALID_DATA
+
+ return OK
+
+func set_default_obj_params(object):
+ # Set default values for object
+ for attr in ["width", "height", "rotation", "x", "y"]:
+ if not attr in object:
+ object[attr] = 0
+ if not "type" in object:
+ object.type = ""
+ if not "visible" in object:
+ object.visible = true
+
+var flags
+
+# Makes a tileset from a array of tilesets data
+# Since Godot supports only one TileSet per TileMap, all tilesets from Tiled are combined
+func build_tileset_for_scene(tilesets, source_path, options):
+ var result = TileSet.new()
+ var err = ERR_INVALID_DATA
+ var tile_meta = {}
+
+ for tileset in tilesets:
+ var ts = tileset
+ var ts_source_path = source_path
+ if "source" in ts:
+ if not "firstgid" in tileset or not str(tileset.firstgid).is_valid_integer():
+ print_error("Missing or invalid firstgid tileset property.")
+ return ERR_INVALID_DATA
+
+ ts_source_path = source_path.get_base_dir().plus_file(ts.source)
+ # Used later for templates
+ _tileset_path_to_first_gid[ts_source_path] = tileset.firstgid
+
+ if ts.source.get_extension().to_lower() == "tsx":
+ var tsx_reader = TiledXMLToDictionary.new()
+ ts = tsx_reader.read_tsx(ts_source_path)
+ if typeof(ts) != TYPE_DICTIONARY:
+ # Error happened
+ return ts
+ else: # JSON Tileset
+ var f = File.new()
+ err = f.open(ts_source_path, File.READ)
+ if err != OK:
+ print_error("Error opening tileset '%s'." % [ts.source])
+ return err
+
+ var json_res = JSON.parse(f.get_as_text())
+ if json_res.error != OK:
+ print_error("Error parsing tileset '%s' JSON: %s" % [ts.source, json_res.error_string])
+ return ERR_INVALID_DATA
+
+ ts = json_res.result
+ if typeof(ts) != TYPE_DICTIONARY:
+ print_error("Tileset '%s' is not a dictionary." % [ts.source])
+ return ERR_INVALID_DATA
+
+ ts.firstgid = tileset.firstgid
+
+ err = validate_tileset(ts)
+ if err != OK:
+ return err
+
+ var has_global_image = "image" in ts
+
+ var spacing = int(ts.spacing) if "spacing" in ts and str(ts.spacing).is_valid_integer() else 0
+ var margin = int(ts.margin) if "margin" in ts and str(ts.margin).is_valid_integer() else 0
+ var firstgid = int(ts.firstgid)
+ var columns = int(ts.columns) if "columns" in ts and str(ts.columns).is_valid_integer() else -1
+
+ var image = null
+ var imagesize = Vector2()
+
+ if has_global_image:
+ image = load_image(ts.image, ts_source_path, options)
+ if typeof(image) != TYPE_OBJECT:
+ # Error happened
+ return image
+ imagesize = Vector2(int(ts.imagewidth), int(ts.imageheight))
+
+ var tilesize = Vector2(int(ts.tilewidth), int(ts.tileheight))
+
+ var tilecount
+ if not "tilecount" in ts:
+ tilecount = make_tilecount(tilesize, imagesize, margin, spacing)
+ else:
+ tilecount = int(ts.tilecount)
+
+
+ var gid = firstgid
+
+ var x = margin
+ var y = margin
+
+ var i = 0
+ var column = 0
+
+
+ # Needed to look up textures for animations
+ var tileRegions = []
+ while i < tilecount:
+ var tilepos = Vector2(x, y)
+ var region = Rect2(tilepos, tilesize)
+
+ tileRegions.push_back(region)
+
+ column += 1
+ i += 1
+
+ x += int(tilesize.x) + spacing
+ if (columns > 0 and column >= columns) or x >= int(imagesize.x) - margin or (x + int(tilesize.x)) > int(imagesize.x):
+ x = margin
+ y += int(tilesize.y) + spacing
+ column = 0
+
+ i = 0
+
+ while i < tilecount:
+ var region = tileRegions[i]
+
+ var rel_id = str(gid - firstgid)
+
+ result.create_tile(gid)
+
+ if has_global_image:
+ if rel_id in ts.tiles && "animation" in ts.tiles[rel_id]:
+ var animated_tex = AnimatedTexture.new()
+ animated_tex.frames = ts.tiles[rel_id].animation.size()
+ animated_tex.fps = 0
+ var c = 0
+ # Animated texture wants us to have seperate textures for each frame
+ # so we have to pull them out of the tileset
+ var tilesetTexture = image.get_data()
+ for g in ts.tiles[rel_id].animation:
+ var frameTex = tilesetTexture.get_rect(tileRegions[(int(g.tileid))])
+ var newTex = ImageTexture.new()
+ newTex.create_from_image(frameTex, flags)
+ animated_tex.set_frame_texture(c, newTex)
+ animated_tex.set_frame_delay(c, float(g.duration) * 0.001)
+ c += 1
+ result.tile_set_texture(gid, animated_tex)
+ result.tile_set_region(gid, Rect2(Vector2(0, 0), tilesize))
+ else:
+ result.tile_set_texture(gid, image)
+ result.tile_set_region(gid, region)
+ elif not rel_id in ts.tiles:
+ gid += 1
+ continue
+ else:
+ if rel_id in ts.tiles && "animation" in ts.tiles[rel_id]:
+ var animated_tex = AnimatedTexture.new()
+ animated_tex.frames = ts.tiles[rel_id].animation.size()
+ animated_tex.fps = 0
+ var c = 0
+ #untested
+ var image_path = ts.tiles[rel_id].image
+ for g in ts.tiles[rel_id].animation:
+ animated_tex.set_frame_texture(c, load_image(image_path, ts_source_path, options))
+ animated_tex.set_frame_delay(c, float(g.duration) * 0.001)
+ c += 1
+ result.tile_set_texture(gid, animated_tex)
+ result.tile_set_region(gid, Rect2(Vector2(0, 0), tilesize))
+ else:
+ var image_path = ts.tiles[rel_id].image
+ image = load_image(image_path, ts_source_path, options)
+ if typeof(image) != TYPE_OBJECT:
+ # Error happened
+ return image
+ result.tile_set_texture(gid, image)
+
+ if "tiles" in ts and rel_id in ts.tiles and "objectgroup" in ts.tiles[rel_id] \
+ and "objects" in ts.tiles[rel_id].objectgroup:
+ for object in ts.tiles[rel_id].objectgroup.objects:
+
+ var shape = shape_from_object(object)
+
+ if typeof(shape) != TYPE_OBJECT:
+ # Error happened
+ return shape
+
+ var offset = Vector2(float(object.x), float(object.y))
+ if "width" in object and "height" in object:
+ offset += Vector2(float(object.width) / 2, float(object.height) / 2)
+
+ if object.type == "navigation":
+ result.tile_set_navigation_polygon(gid, shape)
+ result.tile_set_navigation_polygon_offset(gid, offset)
+ elif object.type == "occluder":
+ result.tile_set_light_occluder(gid, shape)
+ result.tile_set_occluder_offset(gid, offset)
+ else:
+ result.tile_add_shape(gid, shape, Transform2D(0, offset), object.type == "one-way")
+
+ if "properties" in ts and "custom_material" in ts.properties:
+ result.tile_set_material(gid, load(ts.properties.custom_material))
+
+ if options.custom_properties and options.tile_metadata and "tileproperties" in ts \
+ and "tilepropertytypes" in ts and rel_id in ts.tileproperties and rel_id in ts.tilepropertytypes:
+ tile_meta[gid] = get_custom_properties(ts.tileproperties[rel_id], ts.tilepropertytypes[rel_id])
+ if options.save_tiled_properties and rel_id in ts.tiles:
+ for property in whitelist_properties:
+ if property in ts.tiles[rel_id]:
+ if not gid in tile_meta: tile_meta[gid] = {}
+ tile_meta[gid][property] = ts.tiles[rel_id][property]
+
+ # If tile has a custom property called 'name', set the tile's name
+ if property == "name":
+ result.tile_set_name(gid, ts.tiles[rel_id].properties.name)
+
+
+ gid += 1
+ i += 1
+
+ if str(ts.name) != "":
+ result.resource_name = str(ts.name)
+
+ if options.save_tiled_properties:
+ set_tiled_properties_as_meta(result, ts)
+ if options.custom_properties:
+ if "properties" in ts and "propertytypes" in ts:
+ set_custom_properties(result, ts)
+
+ if options.custom_properties and options.tile_metadata:
+ result.set_meta("tile_meta", tile_meta)
+
+ return result
+
+# Makes a standalone TileSet. Useful for importing TileSets from Tiled
+# Returns an error code if fails
+func build_tileset(source_path, options):
+ var set = read_tileset_file(source_path)
+ if typeof(set) == TYPE_INT:
+ return set
+ if typeof(set) != TYPE_DICTIONARY:
+ return ERR_INVALID_DATA
+
+ # Just to validate and build correctly using the existing builder
+ set["firstgid"] = 0
+
+ return build_tileset_for_scene([set], source_path, options)
+
+# Loads an image from a given path
+# Returns a Texture
+func load_image(rel_path, source_path, options):
+ flags = options.image_flags if "image_flags" in options else Texture.FLAGS_DEFAULT
+ var embed = options.embed_internal_images if "embed_internal_images" in options else false
+
+ var ext = rel_path.get_extension().to_lower()
+ if ext != "png" and ext != "jpg":
+ print_error("Unsupported image format: %s. Use PNG or JPG instead." % [ext])
+ return ERR_FILE_UNRECOGNIZED
+
+ var total_path = rel_path
+ if rel_path.is_rel_path():
+ total_path = ProjectSettings.globalize_path(source_path.get_base_dir()).plus_file(rel_path)
+ total_path = ProjectSettings.localize_path(total_path)
+
+ var dir = Directory.new()
+ if not dir.file_exists(total_path):
+ print_error("Image not found: %s" % [total_path])
+ return ERR_FILE_NOT_FOUND
+
+ if not total_path.begins_with("res://"):
+ # External images need to be embedded
+ embed = true
+
+ var image = null
+ if embed:
+ var img = Image.new()
+ img.load(total_path)
+ image = ImageTexture.new()
+ image.create_from_image(img, flags)
+ else:
+ image = ResourceLoader.load(total_path, "ImageTexture")
+ if image != null:
+ image.set_flags(flags)
+
+ return image
+
+# Reads a file and returns its contents as a dictionary
+# Returns an error code if fails
+func read_file(path):
+ if path.get_extension().to_lower() == "tmx":
+ var tmx_to_dict = TiledXMLToDictionary.new()
+ var data = tmx_to_dict.read_tmx(path)
+ if typeof(data) != TYPE_DICTIONARY:
+ # Error happened
+ print_error("Error parsing map file '%s'." % [path])
+ # Return error or result
+ return data
+
+ # Not TMX, must be JSON
+ var file = File.new()
+ var err = file.open(path, File.READ)
+ if err != OK:
+ return err
+
+ var content = JSON.parse(file.get_as_text())
+ if content.error != OK:
+ print_error("Error parsing JSON: " + content.error_string)
+ return content.error
+
+ return content.result
+
+# Reads a tileset file and return its contents as a dictionary
+# Returns an error code if fails
+func read_tileset_file(path):
+ if path.get_extension().to_lower() == "tsx":
+ var tmx_to_dict = TiledXMLToDictionary.new()
+ var data = tmx_to_dict.read_tsx(path)
+ if typeof(data) != TYPE_DICTIONARY:
+ # Error happened
+ print_error("Error parsing map file '%s'." % [path])
+ # Return error or result
+ return data
+
+ # Not TSX, must be JSON
+ var file = File.new()
+ var err = file.open(path, File.READ)
+ if err != OK:
+ return err
+
+ var content = JSON.parse(file.get_as_text())
+ if content.error != OK:
+ print_error("Error parsing JSON: " + content.error_string)
+ return content.error
+
+ return content.result
+
+# Creates a shape from an object data
+# Returns a valid shape depending on the object type (collision/occluder/navigation)
+func shape_from_object(object):
+ var shape = ERR_INVALID_DATA
+ set_default_obj_params(object)
+
+ if "polygon" in object or "polyline" in object:
+ var vertices = PoolVector2Array()
+
+ if "polygon" in object:
+ for point in object.polygon:
+ vertices.push_back(Vector2(float(point.x), float(point.y)))
+ else:
+ for point in object.polyline:
+ vertices.push_back(Vector2(float(point.x), float(point.y)))
+
+ if object.type == "navigation":
+ shape = NavigationPolygon.new()
+ shape.vertices = vertices
+ shape.add_outline(vertices)
+ shape.make_polygons_from_outlines()
+ elif object.type == "occluder":
+ shape = OccluderPolygon2D.new()
+ shape.polygon = vertices
+ shape.closed = "polygon" in object
+ else:
+ if is_convex(vertices):
+ var sorter = PolygonSorter.new()
+ vertices = sorter.sort_polygon(vertices)
+ shape = ConvexPolygonShape2D.new()
+ shape.points = vertices
+ else:
+ shape = ConcavePolygonShape2D.new()
+ var segments = [vertices[0]]
+ for x in range(1, vertices.size()):
+ segments.push_back(vertices[x])
+ segments.push_back(vertices[x])
+ segments.push_back(vertices[0])
+ shape.segments = PoolVector2Array(segments)
+
+ elif "ellipse" in object:
+ if object.type == "navigation" or object.type == "occluder":
+ print_error("Ellipse shapes are not supported as navigation or occluder. Use polygon/polyline instead.")
+ return ERR_INVALID_DATA
+
+ if not "width" in object or not "height" in object:
+ print_error("Missing width or height in ellipse shape.")
+ return ERR_INVALID_DATA
+
+ var w = abs(float(object.width))
+ var h = abs(float(object.height))
+
+ if w == h:
+ shape = CircleShape2D.new()
+ shape.radius = w / 2.0
+ else:
+ # Using a capsule since it's the closest from an ellipse
+ shape = CapsuleShape2D.new()
+ shape.radius = w / 2.0
+ shape.height = h / 2.0
+
+ else: # Rectangle
+ if not "width" in object or not "height" in object:
+ print_error("Missing width or height in rectangle shape.")
+ return ERR_INVALID_DATA
+
+ var size = Vector2(float(object.width), float(object.height))
+
+ if object.type == "navigation" or object.type == "occluder":
+ # Those types only accept polygons, so make one from the rectangle
+ var vertices = PoolVector2Array([
+ Vector2(0, 0),
+ Vector2(size.x, 0),
+ size,
+ Vector2(0, size.y)
+ ])
+ if object.type == "navigation":
+ shape = NavigationPolygon.new()
+ shape.vertices = vertices
+ shape.add_outline(vertices)
+ shape.make_polygons_from_outlines()
+ else:
+ shape = OccluderPolygon2D.new()
+ shape.polygon = vertices
+ else:
+ shape = RectangleShape2D.new()
+ shape.extents = size / 2.0
+
+ return shape
+
+# Determines if the set of vertices is convex or not
+# Returns a boolean
+func is_convex(vertices):
+ var size = vertices.size()
+ if size <= 3:
+ # Less than 3 verices can't be concave
+ return true
+
+ var cp = 0
+
+ for i in range(0, size + 2):
+ var p1 = vertices[(i + 0) % size]
+ var p2 = vertices[(i + 1) % size]
+ var p3 = vertices[(i + 2) % size]
+
+ var prev_cp = cp
+ cp = (p2.x - p1.x) * (p3.y - p2.y) - (p2.y - p1.y) * (p3.x - p2.x)
+ if i > 0 and sign(cp) != sign(prev_cp):
+ return false
+
+ return true
+
+# Decompress the data of the layer
+# Compression argument is a string, either "gzip" or "zlib"
+func decompress_layer_data(layer_data, compression, map_size):
+ if compression != "gzip" and compression != "zlib":
+ print_error("Unrecognized compression format: %s" % [compression])
+ return ERR_INVALID_DATA
+
+ var compression_type = File.COMPRESSION_DEFLATE if compression == "zlib" else File.COMPRESSION_GZIP
+ var expected_size = int(map_size.x) * int(map_size.y) * 4
+ var raw_data = Marshalls.base64_to_raw(layer_data).decompress(expected_size, compression_type)
+
+ return decode_layer(raw_data)
+
+# Reads the layer as a base64 data
+# Returns an array of ints as the decoded layer would be
+func read_base64_layer_data(layer_data):
+ var decoded = Marshalls.base64_to_raw(layer_data)
+ return decode_layer(decoded)
+
+# Reads a PoolByteArray and returns the layer array
+# Used for base64 encoded and compressed layers
+func decode_layer(layer_data):
+ var result = []
+ for i in range(0, layer_data.size(), 4):
+ var num = (layer_data[i]) | \
+ (layer_data[i + 1] << 8) | \
+ (layer_data[i + 2] << 16) | \
+ (layer_data[i + 3] << 24)
+ result.push_back(num)
+ return result
+
+# Set the custom properties into the metadata of the object
+func set_custom_properties(object, tiled_object):
+ if not "properties" in tiled_object or not "propertytypes" in tiled_object:
+ return
+
+ var properties = get_custom_properties(tiled_object.properties, tiled_object.propertytypes)
+ for property in properties:
+ object.set_meta(property, properties[property])
+
+# Get the custom properties as a dictionary
+# Useful for tile meta, which is not stored directly
+func get_custom_properties(properties, types):
+ var result = {}
+
+ for property in properties:
+ var value = null
+ if str(types[property]).to_lower() == "bool":
+ value = bool(properties[property])
+ elif str(types[property]).to_lower() == "int":
+ value = int(properties[property])
+ elif str(types[property]).to_lower() == "float":
+ value = float(properties[property])
+ elif str(types[property]).to_lower() == "color":
+ value = Color(properties[property])
+ else:
+ value = str(properties[property])
+ result[property] = value
+ return result
+
+# Get the available whitelisted properties from the Tiled object
+# And them as metadata in the Godot object
+func set_tiled_properties_as_meta(object, tiled_object):
+ for property in whitelist_properties:
+ if property in tiled_object:
+ object.set_meta(property, tiled_object[property])
+
+# Custom function to sort objects in an object layer
+# This is done to support the "topdown" draw order, which sorts by 'y' coordinate
+func object_sorter(first, second):
+ if first.y == second.y:
+ return first.id < second.id
+ return first.y < second.y
+
+# Create the tilecount for the TileSet if not present.
+# Based on the image and tile dimensions.
+func make_tilecount(tilesize, imagesize, margin, spacing):
+ var horizontal_tile_size = int(tilesize.x + margin * 2 + spacing)
+ var vertical_tile_size = int(tilesize.y + margin * 2 + spacing)
+
+ var horizontal_tile_count = int(imagesize.x) / horizontal_tile_size;
+ var vertical_tile_count = int(imagesize.y) / vertical_tile_size;
+
+ return horizontal_tile_count * vertical_tile_count
+
+# Validates the map dictionary content for missing or invalid keys
+# Returns an error code
+func validate_map(map):
+ if not "type" in map or map.type != "map":
+ print_error("Missing or invalid type property.")
+ return ERR_INVALID_DATA
+ elif not "version" in map or int(map.version) != 1:
+ print_error("Missing or invalid map version.")
+ return ERR_INVALID_DATA
+ elif not "tileheight" in map or not str(map.tileheight).is_valid_integer():
+ print_error("Missing or invalid tileheight property.")
+ return ERR_INVALID_DATA
+ elif not "tilewidth" in map or not str(map.tilewidth).is_valid_integer():
+ print_error("Missing or invalid tilewidth property.")
+ return ERR_INVALID_DATA
+ elif not "layers" in map or typeof(map.layers) != TYPE_ARRAY:
+ print_error("Missing or invalid layers property.")
+ return ERR_INVALID_DATA
+ elif not "tilesets" in map or typeof(map.tilesets) != TYPE_ARRAY:
+ print_error("Missing or invalid tilesets property.")
+ return ERR_INVALID_DATA
+ if "orientation" in map and (map.orientation == "staggered" or map.orientation == "hexagonal"):
+ if not "staggeraxis" in map:
+ print_error("Missing stagger axis property.")
+ return ERR_INVALID_DATA
+ elif not "staggerindex" in map:
+ print_error("Missing stagger axis property.")
+ return ERR_INVALID_DATA
+ return OK
+
+# Validates the tileset dictionary content for missing or invalid keys
+# Returns an error code
+func validate_tileset(tileset):
+ if not "firstgid" in tileset or not str(tileset.firstgid).is_valid_integer():
+ print_error("Missing or invalid firstgid tileset property.")
+ return ERR_INVALID_DATA
+ elif not "tilewidth" in tileset or not str(tileset.tilewidth).is_valid_integer():
+ print_error("Missing or invalid tilewidth tileset property.")
+ return ERR_INVALID_DATA
+ elif not "tileheight" in tileset or not str(tileset.tileheight).is_valid_integer():
+ print_error("Missing or invalid tileheight tileset property.")
+ return ERR_INVALID_DATA
+ if not "image" in tileset:
+ for tile in tileset.tiles:
+ if not "image" in tileset.tiles[tile]:
+ print_error("Missing or invalid image in tileset property.")
+ return ERR_INVALID_DATA
+ elif not "imagewidth" in tileset.tiles[tile] or not str(tileset.tiles[tile].imagewidth).is_valid_integer():
+ print_error("Missing or invalid imagewidth tileset property 1.")
+ return ERR_INVALID_DATA
+ elif not "imageheight" in tileset.tiles[tile] or not str(tileset.tiles[tile].imageheight).is_valid_integer():
+ print_error("Missing or invalid imageheight tileset property.")
+ return ERR_INVALID_DATA
+ else:
+ if not "imagewidth" in tileset or not str(tileset.imagewidth).is_valid_integer():
+ print_error("Missing or invalid imagewidth tileset property 2.")
+ return ERR_INVALID_DATA
+ elif not "imageheight" in tileset or not str(tileset.imageheight).is_valid_integer():
+ print_error("Missing or invalid imageheight tileset property.")
+ return ERR_INVALID_DATA
+ return OK
+
+# Validates the layer dictionary content for missing or invalid keys
+# Returns an error code
+func validate_layer(layer):
+ if not "type" in layer:
+ print_error("Missing or invalid type layer property.")
+ return ERR_INVALID_DATA
+ elif not "name" in layer:
+ print_error("Missing or invalid name layer property.")
+ return ERR_INVALID_DATA
+ match layer.type:
+ "tilelayer":
+ if not "height" in layer or not str(layer.height).is_valid_integer():
+ print_error("Missing or invalid layer height property.")
+ return ERR_INVALID_DATA
+ elif not "width" in layer or not str(layer.width).is_valid_integer():
+ print_error("Missing or invalid layer width property.")
+ return ERR_INVALID_DATA
+ elif not "data" in layer:
+ if not "chunks" in layer:
+ print_error("Missing data or chunks layer properties.")
+ return ERR_INVALID_DATA
+ elif typeof(layer.chunks) != TYPE_ARRAY:
+ print_error("Invalid chunks layer property.")
+ return ERR_INVALID_DATA
+ elif "encoding" in layer:
+ if layer.encoding == "base64" and typeof(layer.data) != TYPE_STRING:
+ print_error("Invalid data layer property.")
+ return ERR_INVALID_DATA
+ if layer.encoding != "base64" and typeof(layer.data) != TYPE_ARRAY:
+ print_error("Invalid data layer property.")
+ return ERR_INVALID_DATA
+ elif typeof(layer.data) != TYPE_ARRAY:
+ print_error("Invalid data layer property.")
+ return ERR_INVALID_DATA
+ if "compression" in layer:
+ if layer.compression != "gzip" and layer.compression != "zlib":
+ print_error("Invalid compression type.")
+ return ERR_INVALID_DATA
+ "imagelayer":
+ if not "image" in layer or typeof(layer.image) != TYPE_STRING:
+ print_error("Missing or invalid image path for layer.")
+ return ERR_INVALID_DATA
+ "objectgroup":
+ if not "objects" in layer or typeof(layer.objects) != TYPE_ARRAY:
+ print_error("Missing or invalid objects array for layer.")
+ return ERR_INVALID_DATA
+ "group":
+ if not "layers" in layer or typeof(layer.layers) != TYPE_ARRAY:
+ print_error("Missing or invalid layer array for group layer.")
+ return ERR_INVALID_DATA
+ return OK
+
+func validate_chunk(chunk):
+ if not "data" in chunk:
+ print_error("Missing data chunk property.")
+ return ERR_INVALID_DATA
+ elif not "height" in chunk or not str(chunk.height).is_valid_integer():
+ print_error("Missing or invalid height chunk property.")
+ return ERR_INVALID_DATA
+ elif not "width" in chunk or not str(chunk.width).is_valid_integer():
+ print_error("Missing or invalid width chunk property.")
+ return ERR_INVALID_DATA
+ elif not "x" in chunk or not str(chunk.x).is_valid_integer():
+ print_error("Missing or invalid x chunk property.")
+ return ERR_INVALID_DATA
+ elif not "y" in chunk or not str(chunk.y).is_valid_integer():
+ print_error("Missing or invalid y chunk property.")
+ return ERR_INVALID_DATA
+ return OK
+
+# Custom function to print error, to centralize the prefix addition
+func print_error(err):
+ printerr(error_prefix + err)
+
+func get_template(path):
+ # If this template has not yet been loaded
+ if not _loaded_templates.has(path):
+ # IS XML
+ if path.get_extension().to_lower() == "tx":
+ var parser = XMLParser.new()
+ var err = parser.open(path)
+ if err != OK:
+ print_error("Error opening TX file '%s'." % [path])
+ return err
+ var content = parse_template(parser, path)
+ if typeof(content) != TYPE_DICTIONARY:
+ # Error happened
+ print_error("Error parsing template map file '%s'." % [path])
+ return false
+ _loaded_templates[path] = content
+
+ # IS JSON
+ else:
+ var file = File.new()
+ var err = file.open(path, File.READ)
+ if err != OK:
+ return err
+
+ var json_res = JSON.parse(file.get_as_text())
+ if json_res.error != OK:
+ print_error("Error parsing JSON template map file '%s'." % [path])
+ return json_res.error
+
+ var result = json_res.result
+ if typeof(result) != TYPE_DICTIONARY:
+ print_error("Error parsing JSON template map file '%s'." % [path])
+ return ERR_INVALID_DATA
+
+ var object = result.object
+ if object.has("gid"):
+ if result.has("tileset"):
+ var ts_path = remove_filename_from_path(path) + result.tileset.source
+ var tileset_gid_increment = get_first_gid_from_tileset_path(ts_path) - 1
+ object.gid += tileset_gid_increment
+
+ _loaded_templates[path] = object
+
+ var dict = _loaded_templates[path]
+ var dictCopy = {}
+ for k in dict:
+ dictCopy[k] = dict[k]
+
+ return dictCopy
+
+func parse_template(parser, path):
+ var err = OK
+ # Template root node shouldn't have attributes
+ var data = {}
+ var tileset_gid_increment = 0
+ data.id = 0
+
+ err = parser.read()
+ while err == OK:
+ if parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
+ if parser.get_node_name() == "template":
+ break
+
+ elif parser.get_node_type() == XMLParser.NODE_ELEMENT:
+ if parser.get_node_name() == "tileset":
+ var ts_path = remove_filename_from_path(path) + parser.get_named_attribute_value_safe("source")
+ tileset_gid_increment = get_first_gid_from_tileset_path(ts_path) - 1
+ data.tileset = ts_path
+
+ if parser.get_node_name() == "object":
+ var object = TiledXMLToDictionary.parse_object(parser)
+ for k in object:
+ data[k] = object[k]
+
+ err = parser.read()
+
+ if data.has("gid"):
+ data["gid"] += tileset_gid_increment
+
+ return data
+
+func get_first_gid_from_tileset_path(path):
+ for t in _tileset_path_to_first_gid:
+ if is_same_file(path, t):
+ return _tileset_path_to_first_gid[t]
+
+ return 0
+
+static func get_filename_from_path(path):
+ var substrings = path.split("/", false)
+ var file_name = substrings[substrings.size() - 1]
+ return file_name
+
+static func remove_filename_from_path(path):
+ var file_name = get_filename_from_path(path)
+ var stringSize = path.length() - file_name.length()
+ var file_path = path.substr(0,stringSize)
+ return file_path
+
+static func is_same_file(path1, path2):
+ var file1 = File.new()
+ var err = file1.open(path1, File.READ)
+ if err != OK:
+ return err
+
+ var file2 = File.new()
+ err = file2.open(path2, File.READ)
+ if err != OK:
+ return err
+
+ var file1_str = file1.get_as_text()
+ var file2_str = file2.get_as_text()
+
+ if file1_str == file2_str:
+ return true
+
+ return false
+
+static func apply_template(object, template_immutable):
+ for k in template_immutable:
+ # Do not overwrite any object data
+ if typeof(template_immutable[k]) == TYPE_DICTIONARY:
+ if not object.has(k):
+ object[k] = {}
+ apply_template(object[k], template_immutable[k])
+
+ elif not object.has(k):
+ object[k] = template_immutable[k]
diff --git a/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled_tileset_import_plugin.gd b/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled_tileset_import_plugin.gd
new file mode 100644
index 0000000..9a86758
--- /dev/null
+++ b/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled_tileset_import_plugin.gd
@@ -0,0 +1,121 @@
+# The MIT License (MIT)
+#
+# Copyright (c) 2018 George Marques
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+tool
+extends EditorImportPlugin
+
+enum { PRESET_DEFAULT, PRESET_PIXEL_ART }
+
+const TiledMapReader = preload("tiled_map_reader.gd")
+
+func get_importer_name():
+ return "vnen.tiled_tileset_importer"
+
+func get_visible_name():
+ return "TileSet from Tiled"
+
+func get_recognized_extensions():
+ if ProjectSettings.get_setting("tiled_importer/enable_json_format"):
+ return ["json", "tsx"]
+ else:
+ return ["tsx"]
+
+func get_save_extension():
+ return "res"
+
+func get_import_order():
+ return 100
+
+func get_resource_type():
+ return "TileSet"
+
+func get_preset_count():
+ return 2
+
+func get_preset_name(preset):
+ match preset:
+ PRESET_DEFAULT: return "Default"
+ PRESET_PIXEL_ART: return "Pixel Art"
+
+func get_import_options(preset):
+ return [
+ {
+ "name": "custom_properties",
+ "default_value": true
+ },
+ {
+ "name": "tile_metadata",
+ "default_value": false
+ },
+ {
+ "name": "image_flags",
+ "default_value": 0 if preset == PRESET_PIXEL_ART else Texture.FLAGS_DEFAULT,
+ "property_hint": PROPERTY_HINT_FLAGS,
+ "hint_string": "Mipmaps,Repeat,Filter,Anisotropic,sRGB,Mirrored Repeat"
+ },
+ {
+ "name": "embed_internal_images",
+ "default_value": true if preset == PRESET_PIXEL_ART else false
+ },
+ {
+ "name": "save_tiled_properties",
+ "default_value": false
+ },
+ {
+ "name": "post_import_script",
+ "default_value": "",
+ "property_hint": PROPERTY_HINT_FILE,
+ "hint_string": "*.gd;GDScript"
+ }
+ ]
+
+func get_option_visibility(option, options):
+ return true
+
+func import(source_file, save_path, options, r_platform_variants, r_gen_files):
+ var map_reader = TiledMapReader.new()
+
+ var tileset = map_reader.build_tileset(source_file, options)
+
+ if typeof(tileset) != TYPE_OBJECT:
+ # Error happened
+ return tileset
+
+ # Post imports script
+ if not options.post_import_script.empty():
+ var script = load(options.post_import_script)
+ if not script or not script is GDScript:
+ printerr("Post import script is not a GDScript.")
+ return ERR_INVALID_PARAMETER
+
+ script = script.new()
+ if not script.has_method("post_import"):
+ printerr("Post import script does not have a 'post_import' method.")
+ return ERR_INVALID_PARAMETER
+
+ tileset = script.post_import(tileset)
+
+ if not tileset or not tileset is TileSet:
+ printerr("Invalid TileSet returned from post import script.")
+ return ERR_INVALID_DATA
+
+ return ResourceSaver.save("%s.%s" % [save_path, get_save_extension()], tileset)
diff --git a/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled_xml_to_dict.gd b/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled_xml_to_dict.gd
new file mode 100644
index 0000000..9064b90
--- /dev/null
+++ b/DungeonShooting_Godot/addons/vnen.tiled_importer/tiled_xml_to_dict.gd
@@ -0,0 +1,571 @@
+# The MIT License (MIT)
+#
+# Copyright (c) 2018 George Marques
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+tool
+extends Reference
+
+# Reads a TMX file from a path and return a Dictionary with the same structure
+# as the JSON map format
+# Returns an error code if failed
+func read_tmx(path):
+ var parser = XMLParser.new()
+ var err = parser.open(path)
+ if err != OK:
+ printerr("Error opening TMX file '%s'." % [path])
+ return err
+
+ while parser.get_node_type() != XMLParser.NODE_ELEMENT:
+ err = parser.read()
+ if err != OK:
+ printerr("Error parsing TMX file '%s' (around line %d)." % [path, parser.get_current_line()])
+ return err
+
+ if parser.get_node_name().to_lower() != "map":
+ printerr("Error parsing TMX file '%s'. Expected 'map' element.")
+ return ERR_INVALID_DATA
+
+ var data = attributes_to_dict(parser)
+ if not "infinite" in data:
+ data.infinite = false
+ data.type = "map"
+ data.tilesets = []
+ data.layers = []
+
+ err = parser.read()
+ if err != OK:
+ printerr("Error parsing TMX file '%s' (around line %d)." % [path, parser.get_current_line()])
+ return err
+
+ while err == OK:
+ if parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
+ if parser.get_node_name() == "map":
+ break
+ elif parser.get_node_type() == XMLParser.NODE_ELEMENT:
+ if parser.get_node_name() == "tileset":
+ # Empty element means external tileset
+ if not parser.is_empty():
+ var tileset = parse_tileset(parser)
+ if typeof(tileset) != TYPE_DICTIONARY:
+ # Error happened
+ return err
+ data.tilesets.push_back(tileset)
+ else:
+ var tileset_data = attributes_to_dict(parser)
+ if not "source" in tileset_data:
+ printerr("Error parsing TMX file '%s'. Missing tileset source (around line %d)." % [path, parser.get_current_line()])
+ return ERR_INVALID_DATA
+ data.tilesets.push_back(tileset_data)
+
+ elif parser.get_node_name() == "layer":
+ var layer = parse_tile_layer(parser, data.infinite)
+ if typeof(layer) != TYPE_DICTIONARY:
+ printerr("Error parsing TMX file '%s'. Invalid tile layer data (around line %d)." % [path, parser.get_current_line()])
+ return ERR_INVALID_DATA
+ data.layers.push_back(layer)
+
+ elif parser.get_node_name() == "imagelayer":
+ var layer = parse_image_layer(parser)
+ if typeof(layer) != TYPE_DICTIONARY:
+ printerr("Error parsing TMX file '%s'. Invalid image layer data (around line %d)." % [path, parser.get_current_line()])
+ return ERR_INVALID_DATA
+ data.layers.push_back(layer)
+
+ elif parser.get_node_name() == "objectgroup":
+ var layer = parse_object_layer(parser)
+ if typeof(layer) != TYPE_DICTIONARY:
+ printerr("Error parsing TMX file '%s'. Invalid object layer data (around line %d)." % [path, parser.get_current_line()])
+ return ERR_INVALID_DATA
+ data.layers.push_back(layer)
+
+ elif parser.get_node_name() == "group":
+ var layer = parse_group_layer(parser, data.infinite)
+ if typeof(layer) != TYPE_DICTIONARY:
+ printerr("Error parsing TMX file '%s'. Invalid group layer data (around line %d)." % [path, parser.get_current_line()])
+ return ERR_INVALID_DATA
+ data.layers.push_back(layer)
+
+ elif parser.get_node_name() == "properties":
+ var prop_data = parse_properties(parser)
+ if typeof(prop_data) == TYPE_STRING:
+ return prop_data
+
+ data.properties = prop_data.properties
+ data.propertytypes = prop_data.propertytypes
+
+ err = parser.read()
+
+ return data
+
+# Reads a TSX and return a tileset dictionary
+# Returns an error code if fails
+func read_tsx(path):
+ var parser = XMLParser.new()
+ var err = parser.open(path)
+ if err != OK:
+ printerr("Error opening TSX file '%s'." % [path])
+ return err
+
+ while parser.get_node_type() != XMLParser.NODE_ELEMENT:
+ err = parser.read()
+ if err != OK:
+ printerr("Error parsing TSX file '%s' (around line %d)." % [path, parser.get_current_line()])
+ return err
+
+ if parser.get_node_name().to_lower() != "tileset":
+ printerr("Error parsing TMX file '%s'. Expected 'map' element.")
+ return ERR_INVALID_DATA
+
+ var tileset = parse_tileset(parser)
+
+ return tileset
+
+# Parses a tileset element from the XML and return a dictionary
+# Return an error code if fails
+func parse_tileset(parser):
+ var err = OK
+ var data = attributes_to_dict(parser)
+ data.tiles = {}
+
+ err = parser.read()
+ while err == OK:
+ if parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
+ if parser.get_node_name() == "tileset":
+ break
+
+ elif parser.get_node_type() == XMLParser.NODE_ELEMENT:
+ if parser.get_node_name() == "tile":
+ var attr = attributes_to_dict(parser)
+ var tile_data = parse_tile_data(parser)
+ if typeof(tile_data) != TYPE_DICTIONARY:
+ # Error happened
+ return tile_data
+ if "properties" in tile_data and "propertytypes" in tile_data:
+ if not "tileproperties" in data:
+ data.tileproperties = {}
+ data.tilepropertytypes = {}
+ data.tileproperties[str(attr.id)] = tile_data.properties
+ data.tilepropertytypes[str(attr.id)] = tile_data.propertytypes
+ tile_data.erase("tileproperties")
+ tile_data.erase("tilepropertytypes")
+ data.tiles[str(attr.id)] = tile_data
+
+ elif parser.get_node_name() == "image":
+ var attr = attributes_to_dict(parser)
+ if not "source" in attr:
+ printerr("Error loading image tag. No source attribute found (around line %d)." % [parser.get_current_line()])
+ return ERR_INVALID_DATA
+ data.image = attr.source
+ if "width" in attr:
+ data.imagewidth = attr.width
+ if "height" in attr:
+ data.imageheight = attr.height
+
+ elif parser.get_node_name() == "properties":
+ var prop_data = parse_properties(parser)
+ if typeof(prop_data) != TYPE_DICTIONARY:
+ # Error happened
+ return prop_data
+
+ data.properties = prop_data.properties
+ data.propertytypes = prop_data.propertytypes
+
+ err = parser.read()
+
+ return data
+
+
+# Parses the data of a single tile from the XML and return a dictionary
+# Returns an error code if fails
+func parse_tile_data(parser):
+ var err = OK
+ var data = {}
+ var obj_group = {}
+ if parser.is_empty():
+ return data
+
+ err = parser.read()
+ while err == OK:
+
+ if parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
+ if parser.get_node_name() == "tile":
+ return data
+ elif parser.get_node_name() == "objectgroup":
+ data.objectgroup = obj_group
+
+ elif parser.get_node_type() == XMLParser.NODE_ELEMENT:
+ if parser.get_node_name() == "image":
+ # If there are multiple images in one tile we only use the last one.
+ var attr = attributes_to_dict(parser)
+ if not "source" in attr:
+ printerr("Error loading image tag. No source attribute found (around line %d)." % [parser.get_current_line()])
+ return ERR_INVALID_DATA
+ data.image = attr.source
+ data.imagewidth = attr.width
+ data.imageheight = attr.height
+
+ elif parser.get_node_name() == "objectgroup":
+ obj_group = attributes_to_dict(parser)
+ for attr in ["width", "height", "offsetx", "offsety"]:
+ if not attr in obj_group:
+ data[attr] = 0
+ if not "opacity" in data:
+ data.opacity = 1
+ if not "visible" in data:
+ data.visible = true
+ if parser.is_empty():
+ data.objectgroup = obj_group
+
+ elif parser.get_node_name() == "object":
+ if not "objects" in obj_group:
+ obj_group.objects = []
+ var obj = parse_object(parser)
+ if typeof(obj) != TYPE_DICTIONARY:
+ # Error happened
+ return obj
+ obj_group.objects.push_back(obj)
+
+ elif parser.get_node_name() == "properties":
+ var prop_data = parse_properties(parser)
+ data["properties"] = prop_data.properties
+ data["propertytypes"] = prop_data.propertytypes
+
+ elif parser.get_node_name() == "animation":
+ var frame_list = []
+ var err2 = parser.read()
+ while err2 == OK:
+ if parser.get_node_type() == XMLParser.NODE_ELEMENT:
+ if parser.get_node_name() == "frame":
+ var frame = {"tileid": 0, "duration": 0}
+ for i in parser.get_attribute_count():
+ if parser.get_attribute_name(i) == "tileid":
+ frame["tileid"] = parser.get_attribute_value(i)
+ if parser.get_attribute_name(i) == "duration":
+ frame["duration"] = parser.get_attribute_value(i)
+ frame_list.push_back(frame)
+ elif parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
+ if parser.get_node_name() == "animation":
+ break
+ err2 = parser.read()
+
+ data["animation"] = frame_list
+
+ err = parser.read()
+
+ return data
+
+# Parses the data of a single object from the XML and return a dictionary
+# Returns an error code if fails
+static func parse_object(parser):
+ var err = OK
+ var data = attributes_to_dict(parser)
+
+ if not parser.is_empty():
+ err = parser.read()
+ while err == OK:
+ if parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
+ if parser.get_node_name() == "object":
+ break
+
+ elif parser.get_node_type() == XMLParser.NODE_ELEMENT:
+ if parser.get_node_name() == "properties":
+ var prop_data = parse_properties(parser)
+ data["properties"] = prop_data.properties
+ data["propertytypes"] = prop_data.propertytypes
+
+ elif parser.get_node_name() == "point":
+ data.point = true
+
+ elif parser.get_node_name() == "ellipse":
+ data.ellipse = true
+
+ elif parser.get_node_name() == "polygon" or parser.get_node_name() == "polyline":
+ var points = []
+ var points_raw = parser.get_named_attribute_value("points").split(" ", false, 0)
+
+ for pr in points_raw:
+ points.push_back({
+ "x": float(pr.split(",")[0]),
+ "y": float(pr.split(",")[1]),
+ })
+
+ data[parser.get_node_name()] = points
+
+ err = parser.read()
+
+ return data
+
+
+# Parses a tile layer from the XML and return a dictionary
+# Returns an error code if fails
+func parse_tile_layer(parser, infinite):
+ var err = OK
+ var data = attributes_to_dict(parser)
+ data.type = "tilelayer"
+ if not "x" in data:
+ data.x = 0
+ if not "y" in data:
+ data.y = 0
+ if infinite:
+ data.chunks = []
+ else:
+ data.data = []
+
+ var current_chunk = null
+ var encoding = ""
+
+ if not parser.is_empty():
+ err = parser.read()
+
+ while err == OK:
+ if parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
+ if parser.get_node_name() == "layer":
+ break
+ elif parser.get_node_name() == "chunk":
+ data.chunks.push_back(current_chunk)
+ current_chunk = null
+
+ elif parser.get_node_type() == XMLParser.NODE_ELEMENT:
+ if parser.get_node_name() == "data":
+ var attr = attributes_to_dict(parser)
+
+ if "compression" in attr:
+ data.compression = attr.compression
+
+ if "encoding" in attr:
+ encoding = attr.encoding
+ if attr.encoding != "csv":
+ data.encoding = attr.encoding
+
+ if not infinite:
+ err = parser.read()
+ if err != OK:
+ return err
+
+ if attr.encoding != "csv":
+ data.data = parser.get_node_data().strip_edges()
+ else:
+ var csv = parser.get_node_data().split(",", false)
+
+ for v in csv:
+ data.data.push_back(int(v.strip_edges()))
+
+ elif parser.get_node_name() == "tile":
+ var gid = int(parser.get_named_attribute_value_safe("gid"))
+ if infinite:
+ current_chunk.data.push_back(gid)
+ else:
+ data.data.push_back(gid)
+
+ elif parser.get_node_name() == "chunk":
+ current_chunk = attributes_to_dict(parser)
+ current_chunk.data = []
+ if encoding != "":
+ err = parser.read()
+ if err != OK:
+ return err
+ if encoding != "csv":
+ current_chunk.data = parser.get_node_data().strip_edges()
+ else:
+ var csv = parser.get_node_data().split(",", false)
+ for v in csv:
+ current_chunk.data.push_back(int(v.strip_edges()))
+
+ elif parser.get_node_name() == "properties":
+ var prop_data = parse_properties(parser)
+ if typeof(prop_data) == TYPE_STRING:
+ return prop_data
+
+ data.properties = prop_data.properties
+ data.propertytypes = prop_data.propertytypes
+
+ err = parser.read()
+
+ return data
+
+# Parses an object layer from the XML and return a dictionary
+# Returns an error code if fails
+func parse_object_layer(parser):
+ var err = OK
+ var data = attributes_to_dict(parser)
+ data.type = "objectgroup"
+ data.objects = []
+
+ if not parser.is_empty():
+ err = parser.read()
+ while err == OK:
+ if parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
+ if parser.get_node_name() == "objectgroup":
+ break
+ if parser.get_node_type() == XMLParser.NODE_ELEMENT:
+ if parser.get_node_name() == "object":
+ data.objects.push_back(parse_object(parser))
+ elif parser.get_node_name() == "properties":
+ var prop_data = parse_properties(parser)
+ if typeof(prop_data) != TYPE_DICTIONARY:
+ # Error happened
+ return prop_data
+ data.properties = prop_data.properties
+ data.propertytypes = prop_data.propertytypes
+
+ err = parser.read()
+
+ return data
+
+# Parses an image layer from the XML and return a dictionary
+# Returns an error code if fails
+func parse_image_layer(parser):
+ var err = OK
+ var data = attributes_to_dict(parser)
+ data.type = "imagelayer"
+ data.image = ""
+
+ if not parser.is_empty():
+ err = parser.read()
+
+ while err == OK:
+ if parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
+ if parser.get_node_name().to_lower() == "imagelayer":
+ break
+ elif parser.get_node_type() == XMLParser.NODE_ELEMENT:
+ if parser.get_node_name().to_lower() == "image":
+ var image = attributes_to_dict(parser)
+ if not image.has("source"):
+ printerr("Missing source attribute in imagelayer (around line %d)." % [parser.get_current_line()])
+ return ERR_INVALID_DATA
+ data.image = image.source
+
+ elif parser.get_node_name() == "properties":
+ var prop_data = parse_properties(parser)
+ if typeof(prop_data) != TYPE_DICTIONARY:
+ # Error happened
+ return prop_data
+ data.properties = prop_data.properties
+ data.propertytypes = prop_data.propertytypes
+
+ err = parser.read()
+
+ return data
+
+# Parses a group layer from the XML and return a dictionary
+# Returns an error code if fails
+func parse_group_layer(parser, infinite):
+ var err = OK
+ var result = attributes_to_dict(parser)
+ result.type = "group"
+ result.layers = []
+
+ if not parser.is_empty():
+ err = parser.read()
+
+ while err == OK:
+ if parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
+ if parser.get_node_name().to_lower() == "group":
+ break
+ elif parser.get_node_type() == XMLParser.NODE_ELEMENT:
+ if parser.get_node_name() == "layer":
+ var layer = parse_tile_layer(parser, infinite)
+ if typeof(layer) != TYPE_DICTIONARY:
+ printerr("Error parsing TMX file. Invalid tile layer data (around line %d)." % [parser.get_current_line()])
+ return ERR_INVALID_DATA
+ result.layers.push_back(layer)
+
+ elif parser.get_node_name() == "imagelayer":
+ var layer = parse_image_layer(parser)
+ if typeof(layer) != TYPE_DICTIONARY:
+ printerr("Error parsing TMX file. Invalid image layer data (around line %d)." % [parser.get_current_line()])
+ return ERR_INVALID_DATA
+ result.layers.push_back(layer)
+
+ elif parser.get_node_name() == "objectgroup":
+ var layer = parse_object_layer(parser)
+ if typeof(layer) != TYPE_DICTIONARY:
+ printerr("Error parsing TMX file. Invalid object layer data (around line %d)." % [parser.get_current_line()])
+ return ERR_INVALID_DATA
+ result.layers.push_back(layer)
+
+ elif parser.get_node_name() == "group":
+ var layer = parse_group_layer(parser, infinite)
+ if typeof(layer) != TYPE_DICTIONARY:
+ printerr("Error parsing TMX file. Invalid group layer data (around line %d)." % [parser.get_current_line()])
+ return ERR_INVALID_DATA
+ result.layers.push_back(layer)
+
+ elif parser.get_node_name() == "properties":
+ var prop_data = parse_properties(parser)
+ if typeof(prop_data) == TYPE_STRING:
+ return prop_data
+
+ result.properties = prop_data.properties
+ result.propertytypes = prop_data.propertytypes
+
+ err = parser.read()
+ return result
+
+# Parses properties data from the XML and return a dictionary
+# Returns an error code if fails
+static func parse_properties(parser):
+ var err = OK
+ var data = {
+ "properties": {},
+ "propertytypes": {},
+ }
+
+ if not parser.is_empty():
+ err = parser.read()
+
+ while err == OK:
+ if parser.get_node_type() == XMLParser.NODE_ELEMENT_END:
+ if parser.get_node_name() == "properties":
+ break
+ elif parser.get_node_type() == XMLParser.NODE_ELEMENT:
+ if parser.get_node_name() == "property":
+ var prop_data = attributes_to_dict(parser)
+ if not (prop_data.has("name") and prop_data.has("value")):
+ printerr("Missing information in custom properties (around line %d)." % [parser.get_current_line()])
+ return ERR_INVALID_DATA
+
+ data.properties[prop_data.name] = prop_data.value
+ if prop_data.has("type"):
+ data.propertytypes[prop_data.name] = prop_data.type
+ else:
+ data.propertytypes[prop_data.name] = "string"
+
+ err = parser.read()
+
+ return data
+
+# Reads the attributes of the current element and return them as a dictionary
+static func attributes_to_dict(parser):
+ var data = {}
+ for i in range(parser.get_attribute_count()):
+ var attr = parser.get_attribute_name(i)
+ var val = parser.get_attribute_value(i)
+ if val.is_valid_integer():
+ val = int(val)
+ elif val.is_valid_float():
+ val = float(val)
+ elif val == "true":
+ val = true
+ elif val == "false":
+ val = false
+ data[attr] = val
+ return data
diff --git a/DungeonShooting_Godot/addons/vnen.tiled_importer/vnen.tiled_importer.gd b/DungeonShooting_Godot/addons/vnen.tiled_importer/vnen.tiled_importer.gd
new file mode 100644
index 0000000..6f70315
--- /dev/null
+++ b/DungeonShooting_Godot/addons/vnen.tiled_importer/vnen.tiled_importer.gd
@@ -0,0 +1,45 @@
+# The MIT License (MIT)
+#
+# Copyright (c) 2018 George Marques
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+tool
+extends EditorPlugin
+
+var import_plugin = null
+var tileset_import_plugin = null
+
+func get_name():
+ return "Tiled Map Importer"
+
+func _enter_tree():
+ if not ProjectSettings.has_setting("tiled_importer/enable_json_format"):
+ ProjectSettings.set_setting("tiled_importer/enable_json_format", true)
+
+ import_plugin = preload("tiled_import_plugin.gd").new()
+ tileset_import_plugin = preload("tiled_tileset_import_plugin.gd").new()
+ add_import_plugin(import_plugin)
+ add_import_plugin(tileset_import_plugin)
+
+func _exit_tree():
+ remove_import_plugin(import_plugin)
+ remove_import_plugin(tileset_import_plugin)
+ import_plugin = null
+ tileset_import_plugin = null
diff --git a/DungeonShooting_Godot/default_bus_layout.tres b/DungeonShooting_Godot/default_bus_layout.tres
new file mode 100644
index 0000000..60797cc
--- /dev/null
+++ b/DungeonShooting_Godot/default_bus_layout.tres
@@ -0,0 +1,15 @@
+[gd_resource type="AudioBusLayout" format=2]
+
+[resource]
+bus/1/name = "BGM"
+bus/1/solo = false
+bus/1/mute = false
+bus/1/bypass_fx = false
+bus/1/volume_db = 0.0
+bus/1/send = "Master"
+bus/2/name = "SFX"
+bus/2/solo = false
+bus/2/mute = false
+bus/2/bypass_fx = false
+bus/2/volume_db = 0.0
+bus/2/send = "Master"
diff --git a/DungeonShooting_Godot/default_env.tres b/DungeonShooting_Godot/default_env.tres
new file mode 100644
index 0000000..20207a4
--- /dev/null
+++ b/DungeonShooting_Godot/default_env.tres
@@ -0,0 +1,7 @@
+[gd_resource type="Environment" load_steps=2 format=2]
+
+[sub_resource type="ProceduralSky" id=1]
+
+[resource]
+background_mode = 2
+background_sky = SubResource( 1 )
diff --git a/DungeonShooting_Godot/icon.png b/DungeonShooting_Godot/icon.png
new file mode 100644
index 0000000..c98fbb6
--- /dev/null
+++ b/DungeonShooting_Godot/icon.png
Binary files differ
diff --git a/DungeonShooting_Godot/icon.png.import b/DungeonShooting_Godot/icon.png.import
new file mode 100644
index 0000000..a4c02e6
--- /dev/null
+++ b/DungeonShooting_Godot/icon.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.png"
+dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/prefab/effect/FirePart.tscn b/DungeonShooting_Godot/prefab/effect/FirePart.tscn
new file mode 100644
index 0000000..ecf6b1b
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/effect/FirePart.tscn
@@ -0,0 +1,24 @@
+[gd_scene load_steps=2 format=2]
+
+[sub_resource type="ParticlesMaterial" id=1]
+flag_disable_z = true
+spread = 60.0
+gravity = Vector3( 0, 0, 0 )
+initial_velocity = 200.0
+initial_velocity_random = 1.0
+orbit_velocity = 0.0
+orbit_velocity_random = 0.0
+linear_accel = -200.0
+linear_accel_random = 0.5
+
+[node name="FirePart" type="Particles2D"]
+emitting = false
+amount = 10
+lifetime = 0.2
+one_shot = true
+explosiveness = 1.0
+local_coords = false
+process_material = SubResource( 1 )
+__meta__ = {
+"_edit_vertical_guides_": [ ]
+}
diff --git a/DungeonShooting_Godot/prefab/effect/Hit.tscn b/DungeonShooting_Godot/prefab/effect/Hit.tscn
new file mode 100644
index 0000000..685cc64
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/effect/Hit.tscn
@@ -0,0 +1,24 @@
+[gd_scene load_steps=8 format=2]
+
+[ext_resource path="res://resource/sprite/effect/hit/hit2.png" type="Texture" id=1]
+[ext_resource path="res://resource/sprite/effect/hit/hit1.png" type="Texture" id=2]
+[ext_resource path="res://resource/sprite/effect/hit/hit4.png" type="Texture" id=3]
+[ext_resource path="res://resource/sprite/effect/hit/hit0.png" type="Texture" id=4]
+[ext_resource path="res://resource/sprite/effect/hit/hit3.png" type="Texture" id=5]
+[ext_resource path="res://src/effect/Hit.cs" type="Script" id=6]
+
+[sub_resource type="SpriteFrames" id=1]
+animations = [ {
+"frames": [ ExtResource( 4 ), ExtResource( 2 ), ExtResource( 1 ), ExtResource( 5 ), ExtResource( 3 ) ],
+"loop": true,
+"name": "Hit",
+"speed": 20.0
+} ]
+
+[node name="Hit" type="AnimatedSprite"]
+frames = SubResource( 1 )
+animation = "Hit"
+offset = Vector2( 1, 11 )
+script = ExtResource( 6 )
+
+[connection signal="animation_finished" from="." to="." method="_on_Hit_animation_finished"]
diff --git a/DungeonShooting_Godot/prefab/role/Player.tscn b/DungeonShooting_Godot/prefab/role/Player.tscn
new file mode 100644
index 0000000..0389b0f
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/role/Player.tscn
@@ -0,0 +1,13 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://prefab/role/Role.tscn" type="PackedScene" id=1]
+[ext_resource path="res://src/role/Player.cs" type="Script" id=2]
+[ext_resource path="res://prefab/weapon/Gun.tscn" type="PackedScene" id=4]
+
+[node name="Player" instance=ExtResource( 1 )]
+collision_layer = 8
+script = ExtResource( 2 )
+GunPrefab = ExtResource( 4 )
+
+[node name="AnimatedSprite" parent="." index="0"]
+frame = 0
diff --git a/DungeonShooting_Godot/prefab/role/Role.tscn b/DungeonShooting_Godot/prefab/role/Role.tscn
new file mode 100644
index 0000000..cfaf82e
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/role/Role.tscn
@@ -0,0 +1,122 @@
+[gd_scene load_steps=19 format=2]
+
+[ext_resource path="res://src/role/Role.cs" type="Script" id=1]
+[ext_resource path="res://resource/sprite/role/role2.png" type="Texture" id=2]
+[ext_resource path="res://resource/sprite/role/role1.png" type="Texture" id=3]
+
+[sub_resource type="AtlasTexture" id=17]
+atlas = ExtResource( 3 )
+region = Rect2( 0, 24, 16, 24 )
+
+[sub_resource type="AtlasTexture" id=18]
+atlas = ExtResource( 3 )
+region = Rect2( 16, 24, 16, 24 )
+
+[sub_resource type="AtlasTexture" id=19]
+atlas = ExtResource( 3 )
+region = Rect2( 32, 24, 16, 24 )
+
+[sub_resource type="AtlasTexture" id=20]
+atlas = ExtResource( 3 )
+region = Rect2( 48, 24, 16, 24 )
+
+[sub_resource type="AtlasTexture" id=21]
+atlas = ExtResource( 3 )
+region = Rect2( 0, 48, 16, 24 )
+
+[sub_resource type="AtlasTexture" id=22]
+atlas = ExtResource( 3 )
+region = Rect2( 16, 48, 16, 24 )
+
+[sub_resource type="AtlasTexture" id=23]
+atlas = ExtResource( 3 )
+region = Rect2( 32, 48, 16, 24 )
+
+[sub_resource type="AtlasTexture" id=24]
+atlas = ExtResource( 3 )
+region = Rect2( 48, 48, 16, 24 )
+
+[sub_resource type="AtlasTexture" id=25]
+atlas = ExtResource( 3 )
+region = Rect2( 48, 48, 16, 24 )
+
+[sub_resource type="AtlasTexture" id=26]
+atlas = ExtResource( 3 )
+region = Rect2( 32, 48, 16, 24 )
+
+[sub_resource type="AtlasTexture" id=27]
+atlas = ExtResource( 3 )
+region = Rect2( 16, 48, 16, 24 )
+
+[sub_resource type="AtlasTexture" id=28]
+atlas = ExtResource( 3 )
+region = Rect2( 0, 48, 16, 24 )
+
+[sub_resource type="SpriteFrames" id=6]
+animations = [ {
+"frames": [ SubResource( 17 ), SubResource( 18 ), SubResource( 19 ), SubResource( 20 ) ],
+"loop": true,
+"name": "idle",
+"speed": 7.0
+}, {
+"frames": [ SubResource( 21 ), SubResource( 22 ), SubResource( 23 ), SubResource( 24 ) ],
+"loop": true,
+"name": "run",
+"speed": 10.0
+}, {
+"frames": [ SubResource( 25 ), SubResource( 26 ), SubResource( 27 ), SubResource( 28 ) ],
+"loop": true,
+"name": "reverseRun",
+"speed": 10.0
+} ]
+
+[sub_resource type="RectangleShape2D" id=29]
+extents = Vector2( 5, 7.5 )
+
+[sub_resource type="RectangleShape2D" id=16]
+extents = Vector2( 5, 4.5 )
+
+[node name="Role" type="KinematicBody2D"]
+collision_layer = 0
+script = ExtResource( 1 )
+Texture = ExtResource( 2 )
+
+[node name="AnimatedSprite" type="AnimatedSprite" parent="."]
+position = Vector2( 0, -12 )
+frames = SubResource( 6 )
+animation = "idle"
+frame = 2
+playing = true
+
+[node name="HitArea" type="Area2D" parent="."]
+visible = false
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="HitArea"]
+visible = false
+position = Vector2( 0, -7.5 )
+shape = SubResource( 29 )
+
+[node name="InteractiveArea" type="Area2D" parent="."]
+collision_layer = 0
+collision_mask = 4
+monitorable = false
+
+[node name="Collision" type="CollisionShape2D" parent="InteractiveArea"]
+position = Vector2( 0, -4.5 )
+shape = SubResource( 16 )
+
+[node name="Collision" type="CollisionShape2D" parent="."]
+visible = false
+position = Vector2( 0, -4.5 )
+shape = SubResource( 16 )
+
+[node name="MountPoint" type="Position2D" parent="."]
+position = Vector2( 2, -4 )
+z_index = 1
+
+[node name="BackMountPoint" type="Position2D" parent="."]
+position = Vector2( 0, -10 )
+z_index = -1
+
+[connection signal="area_entered" from="InteractiveArea" to="." method="_OnPropsEnter"]
+[connection signal="area_exited" from="InteractiveArea" to="." method="_OnPropsExit"]
diff --git a/DungeonShooting_Godot/prefab/ui/Cursor.tscn b/DungeonShooting_Godot/prefab/ui/Cursor.tscn
new file mode 100644
index 0000000..3b0e0e7
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/ui/Cursor.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://resource/sprite/ui/Cursor.png" type="Texture" id=1]
+[ext_resource path="res://src/effect/Cursor.cs" type="Script" id=2]
+
+[node name="Cursor" type="Node2D"]
+script = ExtResource( 2 )
+
+[node name="LT" type="Sprite" parent="."]
+texture = ExtResource( 1 )
+offset = Vector2( -2, -2 )
+region_enabled = true
+region_rect = Rect2( 0, 0, 4, 4 )
+
+[node name="LB" type="Sprite" parent="."]
+texture = ExtResource( 1 )
+offset = Vector2( -2, 2 )
+region_enabled = true
+region_rect = Rect2( 0, 4, 4, 4 )
+
+[node name="RT" type="Sprite" parent="."]
+texture = ExtResource( 1 )
+offset = Vector2( 2, -2 )
+region_enabled = true
+region_rect = Rect2( 4, 0, 4, 4 )
+
+[node name="RB" type="Sprite" parent="."]
+texture = ExtResource( 1 )
+offset = Vector2( 2, 2 )
+region_enabled = true
+region_rect = Rect2( 4, 4, 4, 4 )
diff --git a/DungeonShooting_Godot/prefab/ui/RoomUI.tscn b/DungeonShooting_Godot/prefab/ui/RoomUI.tscn
new file mode 100644
index 0000000..dc2944a
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/ui/RoomUI.tscn
@@ -0,0 +1,16 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://src/ui/RoomUI.cs" type="Script" id=1]
+[ext_resource path="res://resource/sprite/ui/template-ui.png" type="Texture" id=2]
+
+[node name="RoomUI" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( 1 )
+
+[node name="TextureRect" type="TextureRect" parent="."]
+margin_left = 13.0
+margin_top = 9.0
+margin_right = 90.0
+margin_bottom = 33.0
+texture = ExtResource( 2 )
diff --git a/DungeonShooting_Godot/prefab/weapon/Gun.tscn b/DungeonShooting_Godot/prefab/weapon/Gun.tscn
new file mode 100644
index 0000000..2c54084
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/weapon/Gun.tscn
@@ -0,0 +1,103 @@
+[gd_scene load_steps=8 format=2]
+
+[ext_resource path="res://src/weapon/gun/OrdinaryGun.cs" type="Script" id=1]
+[ext_resource path="res://resource/materlal/Shadow.gdshader" type="Shader" id=2]
+
+[sub_resource type="ShaderMaterial" id=9]
+resource_local_to_scene = true
+shader = ExtResource( 2 )
+shader_param/shadowColor = Color( 1, 1, 1, 1 )
+shader_param/schedule = 0.0
+
+[sub_resource type="StreamTexture" id=8]
+load_path = "res://.import/gun1.png-f7bc3e27b4b477d47c7353ffb91687ea.stex"
+
+[sub_resource type="Animation" id=3]
+resource_name = "Floodlight"
+length = 3.0
+loop = true
+step = 0.5
+tracks/0/type = "value"
+tracks/0/path = NodePath("GunSprite:material:shader_param/shadowColor")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ Color( 1, 1, 1, 1 ) ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("GunSprite:material:shader_param/schedule")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0, 1.9, 2.4, 2.5, 3 ),
+"transitions": PoolRealArray( 1, 1, 1, 1, 1 ),
+"update": 0,
+"values": [ 0.0, 0.0, 1.0, 1.0, 0.0 ]
+}
+
+[sub_resource type="Animation" id=4]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/path = NodePath("GunSprite:material:shader_param/shadowColor")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ Color( 1, 1, 1, 1 ) ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("GunSprite:material:shader_param/schedule")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ 0.0 ]
+}
+
+[sub_resource type="RectangleShape2D" id=1]
+extents = Vector2( 7.8, 3.5 )
+
+[node name="Gun" type="Area2D"]
+collision_layer = 4
+collision_mask = 0
+script = ExtResource( 1 )
+
+[node name="GunSprite" type="Sprite" parent="."]
+material = SubResource( 9 )
+position = Vector2( 0.4, -2.6 )
+scale = Vector2( 0.8, 0.8 )
+texture = SubResource( 8 )
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+autoplay = "Floodlight"
+playback_process_mode = 0
+anims/Floodlight = SubResource( 3 )
+anims/RESET = SubResource( 4 )
+
+[node name="OriginPoint" type="Position2D" parent="."]
+position = Vector2( -3.60001, -1.1 )
+
+[node name="ShellPoint" type="Position2D" parent="."]
+position = Vector2( -2.60001, -2.60001 )
+
+[node name="FirePoint" type="Position2D" parent="."]
+position = Vector2( 7.39999, -1.1 )
+
+[node name="Collision" type="CollisionShape2D" parent="."]
+position = Vector2( 0.59999, 0.199997 )
+shape = SubResource( 1 )
diff --git a/DungeonShooting_Godot/prefab/weapon/bullet/HighSpeedBullet.tscn b/DungeonShooting_Godot/prefab/weapon/bullet/HighSpeedBullet.tscn
new file mode 100644
index 0000000..f3a97b6
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/weapon/bullet/HighSpeedBullet.tscn
@@ -0,0 +1,27 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://src/weapon/bullet/HighSpeedBullet.cs" type="Script" id=1]
+[ext_resource path="res://prefab/effect/Hit.tscn" type="PackedScene" id=2]
+
+[sub_resource type="Curve" id=1]
+_data = [ Vector2( 0, 0.781588 ), 0.0, 0.0, 0, 0, Vector2( 1, 1 ), 0.0, 0.0, 0, 0 ]
+
+[sub_resource type="Gradient" id=2]
+colors = PoolColorArray( 1, 1, 1, 0, 1, 1, 1, 0.705882 )
+
+[node name="HighSpeedBullet" type="Node2D"]
+script = ExtResource( 1 )
+Hit = ExtResource( 2 )
+
+[node name="Line" type="Line2D" parent="."]
+modulate = Color( 1, 0.937255, 0.843137, 1 )
+points = PoolVector2Array( 0, 0, 0, 10 )
+width = 1.0
+width_curve = SubResource( 1 )
+default_color = Color( 1, 1, 1, 1 )
+gradient = SubResource( 2 )
+begin_cap_mode = 2
+end_cap_mode = 2
+
+[node name="RayCast2D" type="RayCast2D" parent="."]
+visible = false
diff --git a/DungeonShooting_Godot/prefab/weapon/bullet/OrdinaryBullets.tscn b/DungeonShooting_Godot/prefab/weapon/bullet/OrdinaryBullets.tscn
new file mode 100644
index 0000000..f9d4848
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/weapon/bullet/OrdinaryBullets.tscn
@@ -0,0 +1,18 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://src/weapon/bullet/OrdinaryBullets.cs" type="Script" id=1]
+[ext_resource path="res://resource/sprite/bullet/bullet.png" type="Texture" id=2]
+[ext_resource path="res://prefab/effect/Hit.tscn" type="PackedScene" id=3]
+
+[node name="OrdinaryBullets" type="Node2D"]
+script = ExtResource( 1 )
+Hit = ExtResource( 3 )
+
+[node name="RayCast2D" type="RayCast2D" parent="."]
+enabled = true
+cast_to = Vector2( 18, 0 )
+
+[node name="Bullet" type="Sprite" parent="."]
+position = Vector2( 0.5, 0 )
+texture = ExtResource( 2 )
+offset = Vector2( -7.5, 0 )
diff --git a/DungeonShooting_Godot/prefab/weapon/shell/ShellCase.tscn b/DungeonShooting_Godot/prefab/weapon/shell/ShellCase.tscn
new file mode 100644
index 0000000..8741487
--- /dev/null
+++ b/DungeonShooting_Godot/prefab/weapon/shell/ShellCase.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://resource/sprite/shell/shellCase.png" type="Texture" id=1]
+
+[node name="ShellCase" type="Sprite"]
+texture = ExtResource( 1 )
diff --git a/DungeonShooting_Godot/project.godot b/DungeonShooting_Godot/project.godot
new file mode 100644
index 0000000..34cffb4
--- /dev/null
+++ b/DungeonShooting_Godot/project.godot
@@ -0,0 +1,180 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+; [section] ; section goes between []
+; param=value ; assign values to parameters
+
+config_version=4
+
+[application]
+
+config/name="DungeonShooting"
+run/main_scene="res://scene/Room.tscn"
+config/icon="res://icon.png"
+
+[autoload]
+
+GameManager="*res://src/manager/GameManager.cs"
+
+[display]
+
+window/size/width=480
+window/size/height=270
+window/size/test_width=1920
+window/size/test_height=1080
+window/dpi/allow_hidpi=true
+window/vsync/vsync_via_compositor=true
+window/stretch/aspect="keep_width"
+window/stretch/shrink=4.0
+
+[editor_plugins]
+
+enabled=PoolStringArray( "res://addons/vnen.tiled_importer/plugin.cfg" )
+
+[importer_defaults]
+
+texture={
+"compress/bptc_ldr": 0,
+"compress/hdr_mode": 0,
+"compress/lossy_quality": 0.7,
+"compress/mode": 0,
+"compress/normal_map": 0,
+"detect_3d": false,
+"flags/anisotropic": false,
+"flags/filter": false,
+"flags/mipmaps": false,
+"flags/repeat": 0,
+"flags/srgb": 2,
+"process/HDR_as_SRGB": false,
+"process/fix_alpha_border": true,
+"process/invert_color": false,
+"process/normal_map_invert_y": false,
+"process/premult_alpha": false,
+"size_limit": 0,
+"stream": false,
+"svg/scale": 1.0
+}
+vnen.tiled_tileset_importer={
+"custom_properties": true,
+"embed_internal_images": false,
+"image_flags": 3,
+"post_import_script": "",
+"save_tiled_properties": false,
+"tile_metadata": false
+}
+vnen.tiled_importer={
+"add_background": true,
+"collision_layer": 1,
+"custom_properties": true,
+"embed_internal_images": true,
+"image_flags": 0,
+"post_import_script": "",
+"save_tiled_properties": false,
+"tile_metadata": false,
+"uv_clip": true
+}
+
+[input]
+
+ui_left={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
+ ]
+}
+ui_right={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
+ ]
+}
+ui_up={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
+ ]
+}
+ui_down={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
+ ]
+}
+fire={
+"deadzone": 0.5,
+"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null)
+ ]
+}
+move_left={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+move_right={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+move_up={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+move_down={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+exchange={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":81,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+throw={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":71,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+mouse_roll_up={
+"deadzone": 0.5,
+"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":4,"pressed":false,"doubleclick":false,"script":null)
+ ]
+}
+mouse_roll_down={
+"deadzone": 0.5,
+"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":5,"pressed":false,"doubleclick":false,"script":null)
+ ]
+}
+interactive={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":69,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+reload={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+
+[layer_names]
+
+2d_physics/layer_1="wall"
+2d_physics/layer_2="bullet"
+2d_physics/layer_3="props"
+2d_physics/layer_4="player"
+2d_physics/layer_5="enemy"
+
+[physics]
+
+common/enable_pause_aware_picking=true
+
+[rendering]
+
+2d/snapping/use_gpu_pixel_snap=true
+environment/default_environment="res://default_env.tres"
+
+[tiled_importer]
+
+enable_json_format=true
diff --git a/DungeonShooting_Godot/resource/map/dungeon_test.tmx b/DungeonShooting_Godot/resource/map/dungeon_test.tmx
new file mode 100644
index 0000000..fb1ba2f
--- /dev/null
+++ b/DungeonShooting_Godot/resource/map/dungeon_test.tmx
@@ -0,0 +1,101 @@
+
+
diff --git a/DungeonShooting_Godot/resource/map/dungeon_test.tmx.import b/DungeonShooting_Godot/resource/map/dungeon_test.tmx.import
new file mode 100644
index 0000000..4df7810
--- /dev/null
+++ b/DungeonShooting_Godot/resource/map/dungeon_test.tmx.import
@@ -0,0 +1,22 @@
+[remap]
+
+importer="vnen.tiled_importer"
+type="PackedScene"
+path="res://.import/dungeon_test.tmx-238b1188e6139be0bed72a8fdf71cb3b.scn"
+
+[deps]
+
+source_file="res://resource/map/dungeon_test.tmx"
+dest_files=[ "res://.import/dungeon_test.tmx-238b1188e6139be0bed72a8fdf71cb3b.scn" ]
+
+[params]
+
+custom_properties=true
+tile_metadata=false
+uv_clip=true
+image_flags=0
+collision_layer=1
+embed_internal_images=true
+save_tiled_properties=false
+add_background=true
+post_import_script=""
diff --git a/DungeonShooting_Godot/resource/map/itch-io-DungeonTileset4.tsx b/DungeonShooting_Godot/resource/map/itch-io-DungeonTileset4.tsx
new file mode 100644
index 0000000..bf48d8a
--- /dev/null
+++ b/DungeonShooting_Godot/resource/map/itch-io-DungeonTileset4.tsx
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DungeonShooting_Godot/resource/map/itch-io-DungeonTileset4.tsx.import b/DungeonShooting_Godot/resource/map/itch-io-DungeonTileset4.tsx.import
new file mode 100644
index 0000000..83cec63
--- /dev/null
+++ b/DungeonShooting_Godot/resource/map/itch-io-DungeonTileset4.tsx.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="vnen.tiled_tileset_importer"
+type="TileSet"
+path="res://.import/itch-io-DungeonTileset4.tsx-b6c599d7e258d91a298136a5a4002898.res"
+
+[deps]
+
+source_file="res://resource/map/itch-io-DungeonTileset4.tsx"
+dest_files=[ "res://.import/itch-io-DungeonTileset4.tsx-b6c599d7e258d91a298136a5a4002898.res" ]
+
+[params]
+
+custom_properties=true
+tile_metadata=false
+image_flags=3
+embed_internal_images=false
+save_tiled_properties=false
+post_import_script=""
diff --git a/DungeonShooting_Godot/resource/materlal/Shadow.gdshader b/DungeonShooting_Godot/resource/materlal/Shadow.gdshader
new file mode 100644
index 0000000..b3ba457
--- /dev/null
+++ b/DungeonShooting_Godot/resource/materlal/Shadow.gdshader
@@ -0,0 +1,11 @@
+shader_type canvas_item;
+
+uniform vec4 shadowColor : hint_color = vec4(0.0, 0.0, 0.0, 0.8);
+uniform float schedule = 1.0;
+//将贴图渲染为阴影
+
+void fragment() {
+ vec4 textureColor = texture(TEXTURE, UV);
+ vec4 col = mix(textureColor, shadowColor, schedule);
+ COLOR = mix(vec4(0.0, 0.0, 0.0, 0.0), col, textureColor.a);
+}
diff --git a/DungeonShooting_Godot/resource/materlal/Shadow.tres b/DungeonShooting_Godot/resource/materlal/Shadow.tres
new file mode 100644
index 0000000..df4a9bf
--- /dev/null
+++ b/DungeonShooting_Godot/resource/materlal/Shadow.tres
@@ -0,0 +1,9 @@
+[gd_resource type="ShaderMaterial" load_steps=2 format=2]
+
+[ext_resource path="res://resource/materlal/Shadow.gdshader" type="Shader" id=1]
+
+[resource]
+resource_local_to_scene = true
+shader = ExtResource( 1 )
+shader_param/shadowColor = Color( 0, 0, 0, 0.8 )
+shader_param/schedule = 1.0
diff --git a/DungeonShooting_Godot/resource/sound/bgm/Intro.ogg b/DungeonShooting_Godot/resource/sound/bgm/Intro.ogg
new file mode 100644
index 0000000..bffdec1
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sound/bgm/Intro.ogg
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sound/bgm/Intro.ogg.import b/DungeonShooting_Godot/resource/sound/bgm/Intro.ogg.import
new file mode 100644
index 0000000..40e9321
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sound/bgm/Intro.ogg.import
@@ -0,0 +1,15 @@
+[remap]
+
+importer="ogg_vorbis"
+type="AudioStreamOGGVorbis"
+path="res://.import/Intro.ogg-058563f71fb5fd982135a064e68ee173.oggstr"
+
+[deps]
+
+source_file="res://resource/sound/bgm/Intro.ogg"
+dest_files=[ "res://.import/Intro.ogg-058563f71fb5fd982135a064e68ee173.oggstr" ]
+
+[params]
+
+loop=true
+loop_offset=0
diff --git a/DungeonShooting_Godot/resource/sound/sfx/ordinaryBullet.ogg b/DungeonShooting_Godot/resource/sound/sfx/ordinaryBullet.ogg
new file mode 100644
index 0000000..f5a886a
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sound/sfx/ordinaryBullet.ogg
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sound/sfx/ordinaryBullet.ogg.import b/DungeonShooting_Godot/resource/sound/sfx/ordinaryBullet.ogg.import
new file mode 100644
index 0000000..365ebbc
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sound/sfx/ordinaryBullet.ogg.import
@@ -0,0 +1,15 @@
+[remap]
+
+importer="ogg_vorbis"
+type="AudioStreamOGGVorbis"
+path="res://.import/ordinaryBullet.ogg-cfe42761de70631705f4e117ce06ad61.oggstr"
+
+[deps]
+
+source_file="res://resource/sound/sfx/ordinaryBullet.ogg"
+dest_files=[ "res://.import/ordinaryBullet.ogg-cfe42761de70631705f4e117ce06ad61.oggstr" ]
+
+[params]
+
+loop=false
+loop_offset=0
diff --git a/DungeonShooting_Godot/resource/sprite/bullet/arrow.png b/DungeonShooting_Godot/resource/sprite/bullet/arrow.png
new file mode 100644
index 0000000..4baebfb
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/bullet/arrow.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/bullet/arrow.png.import b/DungeonShooting_Godot/resource/sprite/bullet/arrow.png.import
new file mode 100644
index 0000000..4efd751
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/bullet/arrow.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/arrow.png-5f9f0a3c4c243acf30e833eb04add206.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/bullet/arrow.png"
+dest_files=[ "res://.import/arrow.png-5f9f0a3c4c243acf30e833eb04add206.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/bullet/bullet.aseprite b/DungeonShooting_Godot/resource/sprite/bullet/bullet.aseprite
new file mode 100644
index 0000000..19447ed
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/bullet/bullet.aseprite
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/bullet/bullet.png b/DungeonShooting_Godot/resource/sprite/bullet/bullet.png
new file mode 100644
index 0000000..fb6ccea
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/bullet/bullet.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/bullet/bullet.png.import b/DungeonShooting_Godot/resource/sprite/bullet/bullet.png.import
new file mode 100644
index 0000000..f4fef3f
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/bullet/bullet.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/bullet.png-d058b3cd1f93a450750c6a914d76f944.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/bullet/bullet.png"
+dest_files=[ "res://.import/bullet.png-d058b3cd1f93a450750c6a914d76f944.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/Trajectory.png b/DungeonShooting_Godot/resource/sprite/effect/Trajectory.png
new file mode 100644
index 0000000..f6cd27a
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/Trajectory.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/Trajectory.png.import b/DungeonShooting_Godot/resource/sprite/effect/Trajectory.png.import
new file mode 100644
index 0000000..cbd1690
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/Trajectory.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Trajectory.png-76c08620c3b29f4d728c82f31f8f0bb9.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/Trajectory.png"
+dest_files=[ "res://.import/Trajectory.png-76c08620c3b29f4d728c82f31f8f0bb9.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/fire/fire1.aseprite b/DungeonShooting_Godot/resource/sprite/effect/fire/fire1.aseprite
new file mode 100644
index 0000000..1c47cfe
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/fire/fire1.aseprite
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/hit/hit0.png b/DungeonShooting_Godot/resource/sprite/effect/hit/hit0.png
new file mode 100644
index 0000000..a4457f0
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/hit/hit0.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/hit/hit0.png.import b/DungeonShooting_Godot/resource/sprite/effect/hit/hit0.png.import
new file mode 100644
index 0000000..45dbac3
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/hit/hit0.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/hit0.png-17276b3668c4e0cb4c107848aa290086.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/hit/hit0.png"
+dest_files=[ "res://.import/hit0.png-17276b3668c4e0cb4c107848aa290086.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/hit/hit1.png b/DungeonShooting_Godot/resource/sprite/effect/hit/hit1.png
new file mode 100644
index 0000000..fc1e151
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/hit/hit1.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/hit/hit1.png.import b/DungeonShooting_Godot/resource/sprite/effect/hit/hit1.png.import
new file mode 100644
index 0000000..e7c2785
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/hit/hit1.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/hit1.png-4c89ae30862deb32de3206a28a45db55.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/hit/hit1.png"
+dest_files=[ "res://.import/hit1.png-4c89ae30862deb32de3206a28a45db55.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/hit/hit2.png b/DungeonShooting_Godot/resource/sprite/effect/hit/hit2.png
new file mode 100644
index 0000000..acf1526
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/hit/hit2.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/hit/hit2.png.import b/DungeonShooting_Godot/resource/sprite/effect/hit/hit2.png.import
new file mode 100644
index 0000000..1308243
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/hit/hit2.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/hit2.png-0d34746142da1b03f2100dd624526a03.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/hit/hit2.png"
+dest_files=[ "res://.import/hit2.png-0d34746142da1b03f2100dd624526a03.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/hit/hit3.png b/DungeonShooting_Godot/resource/sprite/effect/hit/hit3.png
new file mode 100644
index 0000000..272462c
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/hit/hit3.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/hit/hit3.png.import b/DungeonShooting_Godot/resource/sprite/effect/hit/hit3.png.import
new file mode 100644
index 0000000..7a82b40
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/hit/hit3.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/hit3.png-87522b4136861ca3b16e8936be841355.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/hit/hit3.png"
+dest_files=[ "res://.import/hit3.png-87522b4136861ca3b16e8936be841355.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/hit/hit4.png b/DungeonShooting_Godot/resource/sprite/effect/hit/hit4.png
new file mode 100644
index 0000000..aa1f261
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/hit/hit4.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/hit/hit4.png.import b/DungeonShooting_Godot/resource/sprite/effect/hit/hit4.png.import
new file mode 100644
index 0000000..e703127
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/hit/hit4.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/hit4.png-7d42c20b94c8395d3b41e4bc03afae84.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/hit/hit4.png"
+dest_files=[ "res://.import/hit4.png-7d42c20b94c8395d3b41e4bc03afae84.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 1 - Sprite Sheet.png b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 1 - Sprite Sheet.png
new file mode 100644
index 0000000..92a0442
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 1 - Sprite Sheet.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 1 - Sprite Sheet.png.import b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 1 - Sprite Sheet.png.import
new file mode 100644
index 0000000..fc7366d
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 1 - Sprite Sheet.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Effect 1 - Sprite Sheet.png-d62485e0ad4a6271cbbb86bd241745c5.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/itch-io-pixel-battle-effects/Effect 1 - Sprite Sheet.png"
+dest_files=[ "res://.import/Effect 1 - Sprite Sheet.png-d62485e0ad4a6271cbbb86bd241745c5.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 2 - Sprite Sheet.png b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 2 - Sprite Sheet.png
new file mode 100644
index 0000000..22ca629
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 2 - Sprite Sheet.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 2 - Sprite Sheet.png.import b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 2 - Sprite Sheet.png.import
new file mode 100644
index 0000000..2a301a2
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 2 - Sprite Sheet.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Effect 2 - Sprite Sheet.png-f18966135b9f965b23cc853e0e9cd35b.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/itch-io-pixel-battle-effects/Effect 2 - Sprite Sheet.png"
+dest_files=[ "res://.import/Effect 2 - Sprite Sheet.png-f18966135b9f965b23cc853e0e9cd35b.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 3 - Sprite Sheet.png b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 3 - Sprite Sheet.png
new file mode 100644
index 0000000..26158b5
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 3 - Sprite Sheet.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 3 - Sprite Sheet.png.import b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 3 - Sprite Sheet.png.import
new file mode 100644
index 0000000..d4cf1d6
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 3 - Sprite Sheet.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Effect 3 - Sprite Sheet.png-a092da7a5c5099536b1bad4970dfd831.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/itch-io-pixel-battle-effects/Effect 3 - Sprite Sheet.png"
+dest_files=[ "res://.import/Effect 3 - Sprite Sheet.png-a092da7a5c5099536b1bad4970dfd831.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 4 - Sprite Sheet.png b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 4 - Sprite Sheet.png
new file mode 100644
index 0000000..4e8ebec
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 4 - Sprite Sheet.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 4 - Sprite Sheet.png.import b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 4 - Sprite Sheet.png.import
new file mode 100644
index 0000000..35faa0e
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect 4 - Sprite Sheet.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Effect 4 - Sprite Sheet.png-408c2dd5faca1f1da98ec9fe633107eb.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/itch-io-pixel-battle-effects/Effect 4 - Sprite Sheet.png"
+dest_files=[ "res://.import/Effect 4 - Sprite Sheet.png-408c2dd5faca1f1da98ec9fe633107eb.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect1 Gameboy Spritesheet.png b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect1 Gameboy Spritesheet.png
new file mode 100644
index 0000000..d24f9ea
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect1 Gameboy Spritesheet.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect1 Gameboy Spritesheet.png.import b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect1 Gameboy Spritesheet.png.import
new file mode 100644
index 0000000..5416547
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect1 Gameboy Spritesheet.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Effect1 Gameboy Spritesheet.png-8ecac65dcb760932ecd8c466e32ef8e6.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/itch-io-pixel-battle-effects/Effect1 Gameboy Spritesheet.png"
+dest_files=[ "res://.import/Effect1 Gameboy Spritesheet.png-8ecac65dcb760932ecd8c466e32ef8e6.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect3 Gameboy Spritesheet.png b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect3 Gameboy Spritesheet.png
new file mode 100644
index 0000000..948f427
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect3 Gameboy Spritesheet.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect3 Gameboy Spritesheet.png.import b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect3 Gameboy Spritesheet.png.import
new file mode 100644
index 0000000..92dceb2
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect3 Gameboy Spritesheet.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Effect3 Gameboy Spritesheet.png-68b16fa58108fc3f614e749696c38607.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/itch-io-pixel-battle-effects/Effect3 Gameboy Spritesheet.png"
+dest_files=[ "res://.import/Effect3 Gameboy Spritesheet.png-68b16fa58108fc3f614e749696c38607.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect4 Gameboy Spritesheet.png b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect4 Gameboy Spritesheet.png
new file mode 100644
index 0000000..7e81424
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect4 Gameboy Spritesheet.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect4 Gameboy Spritesheet.png.import b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect4 Gameboy Spritesheet.png.import
new file mode 100644
index 0000000..92e7f91
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effect4 Gameboy Spritesheet.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Effect4 Gameboy Spritesheet.png-39492d49cc19343081c17a903b3ccad1.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/itch-io-pixel-battle-effects/Effect4 Gameboy Spritesheet.png"
+dest_files=[ "res://.import/Effect4 Gameboy Spritesheet.png-39492d49cc19343081c17a903b3ccad1.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effectst2 Gameboy Spritesheet.png b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effectst2 Gameboy Spritesheet.png
new file mode 100644
index 0000000..01a154e
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effectst2 Gameboy Spritesheet.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effectst2 Gameboy Spritesheet.png.import b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effectst2 Gameboy Spritesheet.png.import
new file mode 100644
index 0000000..a9b83ed
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/Effectst2 Gameboy Spritesheet.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Effectst2 Gameboy Spritesheet.png-cfbfb0796e6b6b4f913fc5418fe150b9.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/effect/itch-io-pixel-battle-effects/Effectst2 Gameboy Spritesheet.png"
+dest_files=[ "res://.import/Effectst2 Gameboy Spritesheet.png-cfbfb0796e6b6b4f913fc5418fe150b9.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/website.txt b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/website.txt
new file mode 100644
index 0000000..84a24d0
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/effect/itch-io-pixel-battle-effects/website.txt
@@ -0,0 +1 @@
+https://pimen.itch.io/pixel-battle-effects
\ No newline at end of file
diff --git a/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/16x16.png b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/16x16.png
new file mode 100644
index 0000000..25987fc
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/16x16.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/16x16.png.import b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/16x16.png.import
new file mode 100644
index 0000000..9fef0f8
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/16x16.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/16x16.png-6e9ff775940a8533671e6598dc2d886d.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/craftpix-net-248911/16x16.png"
+dest_files=[ "res://.import/16x16.png-6e9ff775940a8533671e6598dc2d886d.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/A Note to the Dev.txt b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/A Note to the Dev.txt
new file mode 100644
index 0000000..6596983
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/A Note to the Dev.txt
@@ -0,0 +1,15 @@
+Ho ho, the title got you, huh! :)
+
+Hello, thank you for your purchase!
+
+I'm Caio, the Clockwork Raven Studios artist, owner, and i hope this product live up to your expectations, i want you to know that your interest in my projects is what makes me work on it even harder.
+
+In case if it doesn't take up too much of your time, I would like to see what you're thinking about it in the comments, in the page of the store that you purchased the product, this helps me a lot!
+
+You can also see my progress in the creation of new assets and/or make suggestions, follow my twitter here: https://twitter.com/cwrstudios
+
+If you like my work, i would recommend you to take a look at my Patreon, you get spoilers of my upcoming assets, a community and everything i already made for only $5, and for staying as a Patron you'll always receive my new assets for free!
+
+My Patreon: https://www.patreon.com/clockworkravenstudios
+
+Regards, Caio
\ No newline at end of file
diff --git a/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/All Tileset/16x16.png b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/All Tileset/16x16.png
new file mode 100644
index 0000000..25987fc
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/All Tileset/16x16.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/All Tileset/16x16.png.import b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/All Tileset/16x16.png.import
new file mode 100644
index 0000000..1cf5d36
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/All Tileset/16x16.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/16x16.png-03810c2e769fb05274c12adf666f9aa1.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/environment/craftpix-net-248911/All Tileset/16x16.png"
+dest_files=[ "res://.import/16x16.png-03810c2e769fb05274c12adf666f9aa1.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/EsRson.gif b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/EsRson.gif
new file mode 100644
index 0000000..493642d
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/EsRson.gif
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/Palette/Pallete.txt b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/Palette/Pallete.txt
new file mode 100644
index 0000000..ad6e6d8
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/Palette/Pallete.txt
@@ -0,0 +1 @@
+This palette belongs to Kerrie Lake, and can be found and downloaded for free here: https://lospec.com/palette-list/resurrect-64
\ No newline at end of file
diff --git a/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/Rww2te.gif b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/Rww2te.gif
new file mode 100644
index 0000000..977edd3
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/Rww2te.gif
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/license.txt b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/license.txt
new file mode 100644
index 0000000..673e1aa
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/environment/craftpix-net-248911/license.txt
@@ -0,0 +1 @@
+https://craftpix.net/file-licenses/
\ No newline at end of file
diff --git a/DungeonShooting_Godot/resource/sprite/gun/UK.png b/DungeonShooting_Godot/resource/sprite/gun/UK.png
new file mode 100644
index 0000000..58ade3f
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/UK.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/UK.png.import b/DungeonShooting_Godot/resource/sprite/gun/UK.png.import
new file mode 100644
index 0000000..b26a126
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/UK.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/UK.png-0e69e5e3a63ed303220ab24dee91e2e0.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/UK.png"
+dest_files=[ "res://.import/UK.png-0e69e5e3a63ed303220ab24dee91e2e0.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/gun/US.png b/DungeonShooting_Godot/resource/sprite/gun/US.png
new file mode 100644
index 0000000..73a62df
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/US.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/US.png.import b/DungeonShooting_Godot/resource/sprite/gun/US.png.import
new file mode 100644
index 0000000..115c1aa
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/US.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/US.png-4218465449a1caba531b79f6cbaf32fa.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/US.png"
+dest_files=[ "res://.import/US.png-4218465449a1caba531b79f6cbaf32fa.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/gun/USSR.png b/DungeonShooting_Godot/resource/sprite/gun/USSR.png
new file mode 100644
index 0000000..4575498
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/USSR.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/USSR.png.import b/DungeonShooting_Godot/resource/sprite/gun/USSR.png.import
new file mode 100644
index 0000000..f0fb197
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/USSR.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/USSR.png-1b06adab8deb5898a39090b724b84133.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/USSR.png"
+dest_files=[ "res://.import/USSR.png-1b06adab8deb5898a39090b724b84133.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/gun/bow.png b/DungeonShooting_Godot/resource/sprite/gun/bow.png
new file mode 100644
index 0000000..0654ef2
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/bow.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/bow.png.import b/DungeonShooting_Godot/resource/sprite/gun/bow.png.import
new file mode 100644
index 0000000..f113dd0
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/bow.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/bow.png-bf9e685f71e0011b6ec8dc0a31121391.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/bow.png"
+dest_files=[ "res://.import/bow.png-bf9e685f71e0011b6ec8dc0a31121391.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun1.png b/DungeonShooting_Godot/resource/sprite/gun/gun1.png
new file mode 100644
index 0000000..fc6c2ce
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun1.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun1.png.import b/DungeonShooting_Godot/resource/sprite/gun/gun1.png.import
new file mode 100644
index 0000000..087ecf0
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun1.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/gun1.png-f7bc3e27b4b477d47c7353ffb91687ea.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/gun1.png"
+dest_files=[ "res://.import/gun1.png-f7bc3e27b4b477d47c7353ffb91687ea.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun2.png b/DungeonShooting_Godot/resource/sprite/gun/gun2.png
new file mode 100644
index 0000000..8889f01
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun2.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun2.png.import b/DungeonShooting_Godot/resource/sprite/gun/gun2.png.import
new file mode 100644
index 0000000..25a6717
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun2.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/gun2.png-67d4f6125e770591468ba3ab236736ef.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/gun2.png"
+dest_files=[ "res://.import/gun2.png-67d4f6125e770591468ba3ab236736ef.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun3.png b/DungeonShooting_Godot/resource/sprite/gun/gun3.png
new file mode 100644
index 0000000..ebccd94
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun3.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun3.png.import b/DungeonShooting_Godot/resource/sprite/gun/gun3.png.import
new file mode 100644
index 0000000..926b007
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun3.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/gun3.png-f2b98956d7fdf008b4a87a7be920ea12.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/gun3.png"
+dest_files=[ "res://.import/gun3.png-f2b98956d7fdf008b4a87a7be920ea12.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun4.png b/DungeonShooting_Godot/resource/sprite/gun/gun4.png
new file mode 100644
index 0000000..d3643d2
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun4.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun4.png.import b/DungeonShooting_Godot/resource/sprite/gun/gun4.png.import
new file mode 100644
index 0000000..0988715
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun4.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/gun4.png-ba6b1c54aee277c1e95a427dbdaaddeb.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/gun4.png"
+dest_files=[ "res://.import/gun4.png-ba6b1c54aee277c1e95a427dbdaaddeb.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun5.png b/DungeonShooting_Godot/resource/sprite/gun/gun5.png
new file mode 100644
index 0000000..9845085
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun5.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun5.png.import b/DungeonShooting_Godot/resource/sprite/gun/gun5.png.import
new file mode 100644
index 0000000..0ad15f2
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun5.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/gun5.png-6f355c0cd6234d52c0b85a3bec0a414e.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/gun5.png"
+dest_files=[ "res://.import/gun5.png-6f355c0cd6234d52c0b85a3bec0a414e.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun6.png b/DungeonShooting_Godot/resource/sprite/gun/gun6.png
new file mode 100644
index 0000000..b4948f3
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun6.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun6.png.import b/DungeonShooting_Godot/resource/sprite/gun/gun6.png.import
new file mode 100644
index 0000000..902b284
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun6.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/gun6.png-0667c2b2b24159daf259f9cc3faa9fee.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/gun6.png"
+dest_files=[ "res://.import/gun6.png-0667c2b2b24159daf259f9cc3faa9fee.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun7.png b/DungeonShooting_Godot/resource/sprite/gun/gun7.png
new file mode 100644
index 0000000..a4d1cea
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun7.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun7.png.import b/DungeonShooting_Godot/resource/sprite/gun/gun7.png.import
new file mode 100644
index 0000000..4db95d5
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun7.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/gun7.png-c5124593247a40157a5388c936276859.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/gun7.png"
+dest_files=[ "res://.import/gun7.png-c5124593247a40157a5388c936276859.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun8.png b/DungeonShooting_Godot/resource/sprite/gun/gun8.png
new file mode 100644
index 0000000..6186597
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun8.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/gun8.png.import b/DungeonShooting_Godot/resource/sprite/gun/gun8.png.import
new file mode 100644
index 0000000..64a7a07
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/gun8.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/gun8.png-ce26b9cb6654714a9891481124571c4f.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/gun8.png"
+dest_files=[ "res://.import/gun8.png-ce26b9cb6654714a9891481124571c4f.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/gun/out/default.png b/DungeonShooting_Godot/resource/sprite/gun/out/default.png
new file mode 100644
index 0000000..e806751
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/out/default.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/gun/out/default.png.import b/DungeonShooting_Godot/resource/sprite/gun/out/default.png.import
new file mode 100644
index 0000000..debb2c7
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/gun/out/default.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/default.png-e5a685da8f657e6b9105cc7f2f935dc9.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/gun/out/default.png"
+dest_files=[ "res://.import/default.png-e5a685da8f657e6b9105cc7f2f935dc9.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/role/role1.png b/DungeonShooting_Godot/resource/sprite/role/role1.png
new file mode 100644
index 0000000..1418340
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role1.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/role/role1.png.import b/DungeonShooting_Godot/resource/sprite/role/role1.png.import
new file mode 100644
index 0000000..96acdd6
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role1.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/role1.png-958d620452f56d0f9929cebb052b8bfc.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/role/role1.png"
+dest_files=[ "res://.import/role1.png-958d620452f56d0f9929cebb052b8bfc.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/role/role10.png b/DungeonShooting_Godot/resource/sprite/role/role10.png
new file mode 100644
index 0000000..6268724
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role10.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/role/role10.png.import b/DungeonShooting_Godot/resource/sprite/role/role10.png.import
new file mode 100644
index 0000000..cd3ee95
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role10.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/role10.png-9a8cf4092702d6dfcf1fa580c736c7da.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/role/role10.png"
+dest_files=[ "res://.import/role10.png-9a8cf4092702d6dfcf1fa580c736c7da.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/role/role2.png b/DungeonShooting_Godot/resource/sprite/role/role2.png
new file mode 100644
index 0000000..60cd623
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role2.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/role/role2.png.import b/DungeonShooting_Godot/resource/sprite/role/role2.png.import
new file mode 100644
index 0000000..4424f29
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role2.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/role2.png-2684720cd846f0db30590472914d73a4.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/role/role2.png"
+dest_files=[ "res://.import/role2.png-2684720cd846f0db30590472914d73a4.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/role/role3.png b/DungeonShooting_Godot/resource/sprite/role/role3.png
new file mode 100644
index 0000000..802b0bf
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role3.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/role/role3.png.import b/DungeonShooting_Godot/resource/sprite/role/role3.png.import
new file mode 100644
index 0000000..896d073
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role3.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/role3.png-03fa3f4e21f02035205dd8b89a4b74a0.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/role/role3.png"
+dest_files=[ "res://.import/role3.png-03fa3f4e21f02035205dd8b89a4b74a0.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/role/role4.png b/DungeonShooting_Godot/resource/sprite/role/role4.png
new file mode 100644
index 0000000..72031be
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role4.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/role/role4.png.import b/DungeonShooting_Godot/resource/sprite/role/role4.png.import
new file mode 100644
index 0000000..f46acd3
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role4.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/role4.png-59aa7b55db9715bdc94a3da6125357f1.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/role/role4.png"
+dest_files=[ "res://.import/role4.png-59aa7b55db9715bdc94a3da6125357f1.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/role/role5.png b/DungeonShooting_Godot/resource/sprite/role/role5.png
new file mode 100644
index 0000000..a21325b
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role5.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/role/role5.png.import b/DungeonShooting_Godot/resource/sprite/role/role5.png.import
new file mode 100644
index 0000000..4df8a38
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role5.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/role5.png-b1d13e0fab109f267ed1aea30db9f6ca.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/role/role5.png"
+dest_files=[ "res://.import/role5.png-b1d13e0fab109f267ed1aea30db9f6ca.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/role/role6.png b/DungeonShooting_Godot/resource/sprite/role/role6.png
new file mode 100644
index 0000000..0b5d02d
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role6.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/role/role6.png.import b/DungeonShooting_Godot/resource/sprite/role/role6.png.import
new file mode 100644
index 0000000..abf2696
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role6.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/role6.png-3a0c7af11a450a3f019259d4981c6722.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/role/role6.png"
+dest_files=[ "res://.import/role6.png-3a0c7af11a450a3f019259d4981c6722.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/role/role7.png b/DungeonShooting_Godot/resource/sprite/role/role7.png
new file mode 100644
index 0000000..a7846a4
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role7.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/role/role7.png.import b/DungeonShooting_Godot/resource/sprite/role/role7.png.import
new file mode 100644
index 0000000..86a14f8
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role7.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/role7.png-e169f92ca4e11ffdfafe149a3858e615.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/role/role7.png"
+dest_files=[ "res://.import/role7.png-e169f92ca4e11ffdfafe149a3858e615.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/role/role8.png b/DungeonShooting_Godot/resource/sprite/role/role8.png
new file mode 100644
index 0000000..6dc6f6b
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role8.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/role/role8.png.import b/DungeonShooting_Godot/resource/sprite/role/role8.png.import
new file mode 100644
index 0000000..cfce4fb
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role8.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/role8.png-82555aa265153047151369411ccedf05.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/role/role8.png"
+dest_files=[ "res://.import/role8.png-82555aa265153047151369411ccedf05.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/role/role9.png b/DungeonShooting_Godot/resource/sprite/role/role9.png
new file mode 100644
index 0000000..111f8c3
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role9.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/role/role9.png.import b/DungeonShooting_Godot/resource/sprite/role/role9.png.import
new file mode 100644
index 0000000..b6bdadb
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/role/role9.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/role9.png-1ee32c9bfcfb8679171718810a357e09.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/role/role9.png"
+dest_files=[ "res://.import/role9.png-1ee32c9bfcfb8679171718810a357e09.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/shell/shellCase.aseprite b/DungeonShooting_Godot/resource/sprite/shell/shellCase.aseprite
new file mode 100644
index 0000000..fe6c181
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/shell/shellCase.aseprite
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/shell/shellCase.png b/DungeonShooting_Godot/resource/sprite/shell/shellCase.png
new file mode 100644
index 0000000..7a926c6
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/shell/shellCase.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/shell/shellCase.png.import b/DungeonShooting_Godot/resource/sprite/shell/shellCase.png.import
new file mode 100644
index 0000000..b4b5232
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/shell/shellCase.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/shellCase.png-4975fbe4d212e558e86355116ac96ab2.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/shell/shellCase.png"
+dest_files=[ "res://.import/shellCase.png-4975fbe4d212e558e86355116ac96ab2.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/ui/Cursor.png b/DungeonShooting_Godot/resource/sprite/ui/Cursor.png
new file mode 100644
index 0000000..068c198
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/ui/Cursor.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/ui/Cursor.png.import b/DungeonShooting_Godot/resource/sprite/ui/Cursor.png.import
new file mode 100644
index 0000000..d30d1d7
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/ui/Cursor.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Cursor.png-8fd0f20a3d3b122868ba81366de2aaf6.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/ui/Cursor.png"
+dest_files=[ "res://.import/Cursor.png-8fd0f20a3d3b122868ba81366de2aaf6.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/resource/sprite/ui/template-ui.png b/DungeonShooting_Godot/resource/sprite/ui/template-ui.png
new file mode 100644
index 0000000..69f40fb
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/ui/template-ui.png
Binary files differ
diff --git a/DungeonShooting_Godot/resource/sprite/ui/template-ui.png.import b/DungeonShooting_Godot/resource/sprite/ui/template-ui.png.import
new file mode 100644
index 0000000..f947003
--- /dev/null
+++ b/DungeonShooting_Godot/resource/sprite/ui/template-ui.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/template-ui.png-53af29ee4ca2b778b4ce3b198469ccad.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://resource/sprite/ui/template-ui.png"
+dest_files=[ "res://.import/template-ui.png-53af29ee4ca2b778b4ce3b198469ccad.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/DungeonShooting_Godot/scene/Room.tscn b/DungeonShooting_Godot/scene/Room.tscn
new file mode 100644
index 0000000..439a225
--- /dev/null
+++ b/DungeonShooting_Godot/scene/Room.tscn
@@ -0,0 +1,40 @@
+[gd_scene load_steps=7 format=2]
+
+[ext_resource path="res://prefab/role/Player.tscn" type="PackedScene" id=1]
+[ext_resource path="res://resource/map/dungeon_test.tmx" type="PackedScene" id=2]
+[ext_resource path="res://src/room/RoomManager.cs" type="Script" id=3]
+[ext_resource path="res://prefab/ui/Cursor.tscn" type="PackedScene" id=4]
+[ext_resource path="res://src/camera/MainCamera.cs" type="Script" id=5]
+[ext_resource path="res://prefab/ui/RoomUI.tscn" type="PackedScene" id=6]
+
+[node name="Room" type="Node2D"]
+script = ExtResource( 3 )
+MouseCursor = ExtResource( 4 )
+UIPath = NodePath("")
+
+[node name="MapRoot" type="Node2D" parent="."]
+z_index = -10
+
+[node name="dungeon_test" parent="MapRoot" instance=ExtResource( 2 )]
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2( 196, 128 )
+current = true
+process_mode = 0
+smoothing_enabled = true
+smoothing_speed = 8.0
+script = ExtResource( 5 )
+
+[node name="ObjectRoot" type="Node2D" parent="."]
+
+[node name="ItemRoot" type="YSort" parent="."]
+
+[node name="Player" parent="ItemRoot" instance=ExtResource( 1 )]
+position = Vector2( 196, 128 )
+
+[node name="RemoteTransform2D" type="RemoteTransform2D" parent="ItemRoot/Player"]
+remote_path = NodePath("../../../Camera2D")
+
+[node name="CanvasLayer" type="CanvasLayer" parent="."]
+
+[node name="RoomUI" parent="CanvasLayer" instance=ExtResource( 6 )]
diff --git a/DungeonShooting_Godot/scene/TestNavigation.tscn b/DungeonShooting_Godot/scene/TestNavigation.tscn
new file mode 100644
index 0000000..cee8cd1
--- /dev/null
+++ b/DungeonShooting_Godot/scene/TestNavigation.tscn
@@ -0,0 +1,76 @@
+[gd_scene load_steps=8 format=2]
+
+[ext_resource path="res://src/TestNavigation.cs" type="Script" id=1]
+[ext_resource path="res://icon.png" type="Texture" id=2]
+[ext_resource path="res://resource/sprite/environment/craftpix-net-248911/16x16.png" type="Texture" id=3]
+
+[sub_resource type="NavigationPolygon" id=2]
+vertices = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+polygons = [ PoolIntArray( 0, 1, 2, 3 ) ]
+
+[sub_resource type="TileSet" id=3]
+0/name = "16x16.png 0"
+0/texture = ExtResource( 3 )
+0/tex_offset = Vector2( 0, 0 )
+0/modulate = Color( 1, 1, 1, 1 )
+0/region = Rect2( 0, 0, 16, 16 )
+0/tile_mode = 0
+0/occluder_offset = Vector2( 0, 0 )
+0/navigation_offset = Vector2( 0, 0 )
+0/navigation = SubResource( 2 )
+0/shape_offset = Vector2( 0, 0 )
+0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+0/shape_one_way = false
+0/shape_one_way_margin = 0.0
+0/shapes = [ ]
+0/z_index = 0
+
+[sub_resource type="NavigationPolygon" id=4]
+vertices = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+polygons = [ PoolIntArray( 0, 1, 2, 3 ) ]
+
+[sub_resource type="TileSet" id=5]
+0/name = "16x16.png 0"
+0/texture = ExtResource( 3 )
+0/tex_offset = Vector2( 0, 0 )
+0/modulate = Color( 1, 1, 1, 1 )
+0/region = Rect2( 32, 0, 16, 16 )
+0/tile_mode = 0
+0/occluder_offset = Vector2( 0, 0 )
+0/navigation_offset = Vector2( 0, 0 )
+0/navigation = SubResource( 4 )
+0/shape_offset = Vector2( 0, 0 )
+0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+0/shape_one_way = false
+0/shape_one_way_margin = 0.0
+0/shapes = [ ]
+0/z_index = 0
+
+[node name="TestNavigation" type="Node2D"]
+script = ExtResource( 1 )
+
+[node name="Position2D" type="Position2D" parent="."]
+z_index = -3
+
+[node name="Navigation2D" type="Navigation2D" parent="Position2D"]
+
+[node name="Node2D" type="Node2D" parent="Position2D/Navigation2D"]
+
+[node name="TileMap" type="TileMap" parent="Position2D/Navigation2D/Node2D"]
+tile_set = SubResource( 3 )
+cell_size = Vector2( 16, 16 )
+format = 1
+tile_data = PoolIntArray( 131074, 0, 0, 131075, 0, 0, 131076, 0, 0, 131077, 0, 0, 131078, 0, 0, 196610, 0, 0, 196611, 0, 0, 196612, 0, 0, 196613, 0, 0, 196614, 0, 0, 262146, 0, 0, 262147, 0, 0, 262148, 0, 0, 262149, 0, 0, 262150, 0, 0, 327682, 0, 0, 327683, 0, 0, 327684, 0, 0, 327685, 0, 0, 327686, 0, 0, 327699, 0, 0, 327700, 0, 0, 327701, 0, 0, 327702, 0, 0, 327703, 0, 0, 327704, 0, 0, 327705, 0, 0, 393218, 0, 0, 393219, 0, 0, 393220, 0, 0, 393221, 0, 0, 393222, 0, 0, 393223, 0, 0, 393224, 0, 0, 393225, 0, 0, 393226, 0, 0, 393227, 0, 0, 393228, 0, 0, 393229, 0, 0, 393235, 0, 0, 393236, 0, 0, 393237, 0, 0, 393238, 0, 0, 393239, 0, 0, 393240, 0, 0, 393241, 0, 0, 458754, 0, 0, 458755, 0, 0, 458756, 0, 0, 458757, 0, 0, 458758, 0, 0, 458759, 0, 0, 458760, 0, 0, 458761, 0, 0, 458762, 0, 0, 458763, 0, 0, 458764, 0, 0, 458765, 0, 0, 458771, 0, 0, 458772, 0, 0, 458773, 0, 0, 458774, 0, 0, 458775, 0, 0, 458776, 0, 0, 458777, 0, 0, 524299, 0, 0, 524300, 0, 0, 524301, 0, 0, 524307, 0, 0, 524308, 0, 0, 524309, 0, 0, 524310, 0, 0, 524311, 0, 0, 524312, 0, 0, 524313, 0, 0, 589835, 0, 0, 589836, 0, 0, 589837, 0, 0, 589843, 0, 0, 589844, 0, 0, 589845, 0, 0, 589846, 0, 0, 589847, 0, 0, 589848, 0, 0, 589849, 0, 0, 589850, 0, 0, 589851, 0, 0, 655371, 0, 0, 655372, 0, 0, 655373, 0, 0, 655379, 0, 0, 655380, 0, 0, 655381, 0, 0, 655382, 0, 0, 655383, 0, 0, 655384, 0, 0, 655385, 0, 0, 655386, 0, 0, 655387, 0, 0, 720897, 0, 0, 720898, 0, 0, 720899, 0, 0, 720900, 0, 0, 720901, 0, 0, 720902, 0, 0, 720903, 0, 0, 720904, 0, 0, 720905, 0, 0, 720906, 0, 0, 720907, 0, 0, 720908, 0, 0, 720909, 0, 0, 720915, 0, 0, 720916, 0, 0, 720917, 0, 0, 720918, 0, 0, 720919, 0, 0, 720920, 0, 0, 720921, 0, 0, 720922, 0, 0, 720923, 0, 0, 786433, 0, 0, 786434, 0, 0, 786435, 0, 0, 786436, 0, 0, 786437, 0, 0, 786438, 0, 0, 786439, 0, 0, 786440, 0, 0, 786441, 0, 0, 786442, 0, 0, 786443, 0, 0, 786444, 0, 0, 786445, 0, 0, 786446, 0, 0, 786447, 0, 0, 786448, 0, 0, 786449, 0, 0, 786450, 0, 0, 786451, 0, 0, 786452, 0, 0, 786453, 0, 0, 786454, 0, 0, 786455, 0, 0, 786456, 0, 0, 786457, 0, 0, 786458, 0, 0, 786459, 0, 0, 851979, 0, 0, 851980, 0, 0, 851981, 0, 0, 851982, 0, 0, 851983, 0, 0, 851984, 0, 0, 851985, 0, 0, 851986, 0, 0, 851987, 0, 0, 851988, 0, 0, 851989, 0, 0, 851990, 0, 0, 851991, 0, 0, 851992, 0, 0, 851993, 0, 0, 851994, 0, 0, 851995, 0, 0, 917515, 0, 0, 917516, 0, 0, 917517, 0, 0, 917518, 0, 0, 917519, 0, 0, 917520, 0, 0, 917521, 0, 0, 917522, 0, 0, 917523, 0, 0, 917524, 0, 0, 917525, 0, 0, 917526, 0, 0, 917527, 0, 0, 917528, 0, 0, 917529, 0, 0, 917530, 0, 0, 917531, 0, 0, 983051, 0, 0, 983052, 0, 0, 983053, 0, 0, 983054, 0, 0, 983055, 0, 0, 983056, 0, 0, 983057, 0, 0, 983058, 0, 0, 983059, 0, 0, 983060, 0, 0, 983061, 0, 0, 983062, 0, 0, 983063, 0, 0, 983064, 0, 0, 983065, 0, 0, 983066, 0, 0, 983067, 0, 0 )
+
+[node name="Node2D2" type="Node2D" parent="Position2D/Navigation2D"]
+
+[node name="TileMap" type="TileMap" parent="Position2D/Navigation2D/Node2D2"]
+tile_set = SubResource( 5 )
+cell_size = Vector2( 16, 16 )
+format = 1
+tile_data = PoolIntArray( 131088, 0, 0, 131089, 0, 0, 131090, 0, 0, 131091, 0, 0, 131092, 0, 0, 196622, 0, 0, 196623, 0, 0, 196624, 0, 0, 196628, 0, 0, 262156, 0, 0, 262157, 0, 0, 262158, 0, 0, 262164, 0, 0, 327692, 0, 0, 524302, 0, 0, 524303, 0, 0, 524304, 0, 0, 524305, 0, 0, 524306, 0, 0, 589838, 0, 0, 589839, 0, 0, 589840, 0, 0, 589841, 0, 0, 589842, 0, 0 )
+
+[node name="Sprite" type="Sprite" parent="Position2D"]
+position = Vector2( 33, 32 )
+scale = Vector2( 0.2, 0.2 )
+texture = ExtResource( 2 )
diff --git a/DungeonShooting_Godot/src/AnimatorNames.cs b/DungeonShooting_Godot/src/AnimatorNames.cs
new file mode 100644
index 0000000..5645333
--- /dev/null
+++ b/DungeonShooting_Godot/src/AnimatorNames.cs
@@ -0,0 +1,7 @@
+
+public static class AnimatorNames
+{
+ public static readonly string Idle = "idle";
+ public static readonly string Run = "run";
+ public static readonly string ReverseRun = "reverseRun";
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/GameConfig.cs b/DungeonShooting_Godot/src/GameConfig.cs
new file mode 100644
index 0000000..91ebe06
--- /dev/null
+++ b/DungeonShooting_Godot/src/GameConfig.cs
@@ -0,0 +1,12 @@
+
+public static class GameConfig
+{
+ ///
+ /// 散射计算的默认距离
+ ///
+ public static readonly float ScatteringDistance = 300;
+ ///
+ /// 重力加速度
+ ///
+ public static readonly float G = 250f;
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/Pack.cs b/DungeonShooting_Godot/src/Pack.cs
new file mode 100644
index 0000000..a85287a
--- /dev/null
+++ b/DungeonShooting_Godot/src/Pack.cs
@@ -0,0 +1,12 @@
+
+// public class Pack
+// {
+// public uint Size { get; private set; }
+
+// public Pack(uint size)
+// {
+// Size = size;
+// }
+
+
+// }
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/TestNavigation.cs b/DungeonShooting_Godot/src/TestNavigation.cs
new file mode 100644
index 0000000..16ededf
--- /dev/null
+++ b/DungeonShooting_Godot/src/TestNavigation.cs
@@ -0,0 +1,39 @@
+using Godot;
+
+public class TestNavigation : Node2D
+{
+
+ private Navigation2D Navigation2D;
+ private Vector2[] points = new Vector2[0];
+
+ public override void _Ready()
+ {
+ Navigation2D = GetNode("Position2D/Navigation2D");
+ }
+
+ public override void _Input(InputEvent @event)
+ {
+ if (@event is InputEventMouseButton ieb) {
+ if (ieb.ButtonIndex == (int)ButtonList.Left && ieb.Pressed)
+ {
+ points = Navigation2D.GetSimplePath(Vector2.Zero, Navigation2D.ToLocal(ieb.Position));
+ Update();
+ string str = "";
+ foreach (var item in points)
+ {
+ str += item;
+ }
+ GD.Print("路径: " + points.Length + ", " + str);
+ }
+ }
+ }
+ public override void _Draw()
+ {
+ if (points.Length >= 2) {
+ GD.Print("绘制线段...");
+ DrawPolyline(points, Colors.Red);
+ // DrawMultiline(points, Colors.Red);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/camera/MainCamera.cs b/DungeonShooting_Godot/src/camera/MainCamera.cs
new file mode 100644
index 0000000..8f97587
--- /dev/null
+++ b/DungeonShooting_Godot/src/camera/MainCamera.cs
@@ -0,0 +1,107 @@
+using System.Collections.Generic;
+using Godot;
+
+public class MainCamera : Camera2D
+{
+ ///
+ /// 当前场景的相机对象
+ ///
+ public static MainCamera Main { get; private set; }
+
+ ///
+ /// 恢复系数
+ ///
+ [Export]
+ public float RecoveryCoefficient = 100f;
+ ///
+ /// 抖动开关
+ ///
+ public bool Enable { get; set; } = true;
+
+ private long _index = 0;
+ private Vector2 _prossesDistance = Vector2.Zero;
+ private Vector2 _prossesDirectiona = Vector2.Zero;
+ private readonly Dictionary _shakeMap = new Dictionary();
+
+ public override void _Ready()
+ {
+ Main = this;
+ }
+ public override void _PhysicsProcess(float delta)
+ {
+ _Shake(delta);
+ }
+
+ ///
+ /// 设置帧抖动, 结束后自动清零, 需要每一帧调用
+ ///
+ /// 抖动的力度
+ public void ProssesShake(Vector2 value)
+ {
+ if (value.Length() > _prossesDistance.Length())
+ {
+ _prossesDistance = value;
+ }
+ }
+
+ public void ProssesDirectionalShake(Vector2 value)
+ {
+ _prossesDirectiona += value;
+ }
+
+ ///
+ /// 创建一个抖动, 并设置抖动时间
+ ///
+ /// 抖动力度
+ /// 抖动生效时间
+ public async void CreateShake(Vector2 value, float time)
+ {
+ if (time > 0)
+ {
+ long tempIndex = _index++;
+ SceneTreeTimer sceneTreeTimer = GetTree().CreateTimer(time);
+ _shakeMap[tempIndex] = value;
+ await ToSignal(sceneTreeTimer, "timeout");
+ _shakeMap.Remove(tempIndex);
+ }
+ }
+
+ //抖动调用
+ private void _Shake(float delta)
+ {
+ if (Enable)
+ {
+ var _distance = _CalculateDistance();
+ Offset += new Vector2(
+ (float)GD.RandRange(-_distance.x, _distance.x) - Offset.x,
+ (float)GD.RandRange(-_distance.y, _distance.y) - Offset.y
+ );
+ Offset += _prossesDirectiona;
+ _prossesDistance = Vector2.Zero;
+ _prossesDirectiona = Vector2.Zero;
+ }
+ else
+ {
+ Offset = Offset.LinearInterpolate(Vector2.Zero, RecoveryCoefficient * delta);
+ }
+ }
+
+ //计算相机需要抖动的值
+ private Vector2 _CalculateDistance()
+ {
+ Vector2 temp = Vector2.Zero;
+ float length = 0;
+ foreach (var item in _shakeMap)
+ {
+ var value = item.Value;
+ float tempLenght = value.Length();
+ if (tempLenght > length)
+ {
+ length = tempLenght;
+ temp = value;
+ }
+ }
+ return _prossesDistance.Length() > length ? _prossesDistance : temp;
+ }
+
+}
diff --git a/DungeonShooting_Godot/src/effect/Cursor.cs b/DungeonShooting_Godot/src/effect/Cursor.cs
new file mode 100644
index 0000000..06f6894
--- /dev/null
+++ b/DungeonShooting_Godot/src/effect/Cursor.cs
@@ -0,0 +1,60 @@
+using Godot;
+
+///
+/// 鼠标指针
+///
+public class Cursor : Node2D
+{
+
+ private Sprite lt;
+ private Sprite lb;
+ private Sprite rt;
+ private Sprite rb;
+
+ public override void _Ready()
+ {
+ lt = GetNode("LT");
+ lb = GetNode("LB");
+ rt = GetNode("RT");
+ rb = GetNode("RB");
+ }
+
+ public override void _Process(float delta)
+ {
+ var targetGun = RoomManager.Current?.Player?.Holster.ActiveGun;
+ if (targetGun != null)
+ {
+ SetScope(targetGun.CurrScatteringRange, targetGun);
+ }
+ else
+ {
+ SetScope(0, targetGun);
+ }
+ SetCursorPos();
+ }
+
+ ///
+ /// 设置光标半径范围
+ ///
+ private void SetScope(float scope, Gun targetGun)
+ {
+ if (targetGun != null)
+ {
+ var len = GlobalPosition.DistanceTo(targetGun.GlobalPosition);
+ if (targetGun.Attribute != null)
+ {
+ len = Mathf.Max(0, len - targetGun.Attribute.FirePosition.x);
+ }
+ scope = len / GameConfig.ScatteringDistance * scope;
+ }
+ lt.Position = new Vector2(-scope, -scope);
+ lb.Position = new Vector2(-scope, scope);
+ rt.Position = new Vector2(scope, -scope);
+ rb.Position = new Vector2(scope, scope);
+ }
+
+ private void SetCursorPos()
+ {
+ Position = GetGlobalMousePosition();
+ }
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/effect/Hit.cs b/DungeonShooting_Godot/src/effect/Hit.cs
new file mode 100644
index 0000000..99b4b4d
--- /dev/null
+++ b/DungeonShooting_Godot/src/effect/Hit.cs
@@ -0,0 +1,19 @@
+using Godot;
+
+public class Hit : AnimatedSprite
+{
+
+ public override void _Ready()
+ {
+ Frame = 0;
+ Playing = true;
+ }
+
+ ///
+ /// 动画结束, 销毁
+ ///
+ private void _on_Hit_animation_finished()
+ {
+ QueueFree();
+ }
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/effect/ThrowNode.cs b/DungeonShooting_Godot/src/effect/ThrowNode.cs
new file mode 100644
index 0000000..882a718
--- /dev/null
+++ b/DungeonShooting_Godot/src/effect/ThrowNode.cs
@@ -0,0 +1,208 @@
+using System;
+using Godot;
+
+///
+/// 模拟抛出的物体, 使用时将对象挂载到该节点上即可
+///
+public class ThrowNode : KinematicBody2D
+{
+ ///
+ /// 是否已经结束
+ ///
+ ///
+ public bool IsOver { get; protected set; } = true;
+ ///
+ /// 物体大小
+ ///
+ public Vector2 Size { get; protected set; }
+ ///
+ /// 起始坐标
+ ///
+ public Vector2 StartPosition { get; protected set; }
+ ///
+ /// 移动方向, 0 - 360
+ ///
+ ///
+ public float Direction { get; protected set; }
+ ///
+ /// x速度, 也就是水平速度
+ ///
+ public float XSpeed { get; protected set; }
+ ///
+ /// y轴速度, 也就是竖直速度
+ ///
+ ///
+ public float YSpeed { get; protected set; }
+ ///
+ /// 初始x轴组队
+ ///
+ ///
+ public float StartXSpeed { get; protected set; }
+ ///
+ /// 初始y轴速度
+ ///
+ public float StartYSpeed { get; protected set; }
+ ///
+ /// 旋转速度
+ ///
+ public float RotateSpeed { get; protected set; }
+ ///
+ /// 挂载的对象
+ ///
+ public Node2D Mount { get; protected set; }
+ ///
+ /// 碰撞组件
+ ///
+ ///
+ public CollisionShape2D CollisionShape { get; protected set; }
+ ///
+ /// 绘制阴影的精灵
+ ///
+ public Sprite ShadowSprite { get; protected set; }
+
+ protected Sprite ShadowTarget { get; set; }
+
+ private bool inversionX = false;
+
+ public override void _Ready()
+ {
+ //只与墙壁碰撞
+ CollisionMask = 1;
+ CollisionLayer = 0;
+ //创建碰撞器
+ CollisionShape = new CollisionShape2D();
+ var shape = new RectangleShape2D();
+ shape.Extents = Size * 0.5f;
+ CollisionShape.Shape = shape;
+ AddChild(CollisionShape);
+ }
+
+ ///
+ /// 初始化该抛物线对象的基础数据
+ ///
+ /// 抛射的物体所占大小, 用于碰撞检测
+ /// 起始点
+ /// 起始高度
+ /// 角度, 0 - 360
+ /// 横轴速度
+ /// 纵轴速度
+ /// 旋转速度
+ /// 需要挂载的节点
+ /// 抛射的节点显示的纹理, 用于渲染阴影用
+ public void InitThrow(Vector2 size, Vector2 start, float startHeight, float direction, float xSpeed, float ySpeed, float rotate, Node2D mount)
+ {
+ if (CollisionShape != null)
+ {
+ CollisionShape.Disabled = false;
+ }
+
+ IsOver = false;
+ Size = size;
+ GlobalPosition = StartPosition = start;
+ Direction = direction;
+ XSpeed = xSpeed;
+ YSpeed = ySpeed;
+ StartXSpeed = xSpeed;
+ StartYSpeed = ySpeed;
+ RotateSpeed = rotate;
+
+ if (mount != null)
+ {
+ Mount = mount;
+ AddChild(mount);
+ mount.Position = new Vector2(0, -startHeight);
+ }
+ }
+
+ ///
+ /// 初始化该抛物线对象的基础数据, 并且渲染阴影
+ ///
+ /// 抛射的物体所占大小, 用于碰撞检测
+ /// 起始点
+ /// 起始高度
+ /// 角度, 0 - 360
+ /// 横轴速度
+ /// 纵轴速度
+ /// 旋转速度
+ /// 需要挂载的节点
+ /// 抛射的节点显示的纹理, 用于渲染阴影用
+ public void InitThrow(Vector2 size, Vector2 start, float startHeight, float direction, float xSpeed, float ySpeed, float rotate, Node2D mount, Sprite shadowTarget)
+ {
+ InitThrow(size, start, startHeight, direction, xSpeed, ySpeed, rotate, mount);
+ ShadowTarget = shadowTarget;
+ if (shadowTarget != null)
+ {
+ if (ShadowSprite == null)
+ {
+ //阴影
+ ShadowSprite = new Sprite();
+ ShadowSprite.ZIndex = -5;
+ ShadowSprite.Material = ResourceManager.ShadowMaterial;
+ AddChild(ShadowSprite);
+ }
+ inversionX = mount.Scale.y < 0 ? true : false;
+ if (inversionX)
+ {
+ ShadowSprite.Scale = shadowTarget.Scale * new Vector2(1, -1);
+ }
+ else
+ {
+ ShadowSprite.Scale = shadowTarget.Scale;
+ }
+ ShadowSprite.Texture = shadowTarget.Texture;
+ }
+ else if (ShadowSprite != null)
+ {
+ ShadowSprite.Texture = null;
+ }
+ }
+
+ ///
+ /// 达到最高点时调用
+ ///
+ protected virtual void OnMaxHeight(float height)
+ {
+
+ }
+
+ ///
+ /// 结束的调用
+ ///
+ protected virtual void OnOver()
+ {
+
+ }
+
+ public override void _Process(float delta)
+ {
+ if (!IsOver)
+ {
+ MoveAndSlide(new Vector2(XSpeed, 0).Rotated(Direction * Mathf.Pi / 180));
+ Mount.Position = new Vector2(0, Mount.Position.y - YSpeed * delta);
+ var rotate = Mount.GlobalRotationDegrees + RotateSpeed * delta;
+ Mount.GlobalRotationDegrees = rotate;
+ if (ShadowSprite != null)
+ {
+ ShadowSprite.GlobalRotationDegrees = rotate;
+ // ShadowSprite.GlobalRotationDegrees = rotate + (inversionX ? 180 : 0);
+ ShadowSprite.GlobalPosition = ShadowTarget.GlobalPosition + new Vector2(0, 1 - Mount.Position.y);
+ }
+ var ysp = YSpeed;
+ YSpeed -= GameConfig.G * delta;
+ //达到最高点
+ if (ysp * YSpeed < 0)
+ {
+ OnMaxHeight(-Mount.Position.y);
+ }
+ //落地判断
+ if (Mount.Position.y >= 0)
+ {
+ Mount.Position = new Vector2(0, 0);
+ IsOver = true;
+ CollisionShape.Disabled = true;
+ OnOver();
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/manager/GameManager.cs b/DungeonShooting_Godot/src/manager/GameManager.cs
new file mode 100644
index 0000000..29d3962
--- /dev/null
+++ b/DungeonShooting_Godot/src/manager/GameManager.cs
@@ -0,0 +1,13 @@
+using Godot;
+
+///
+/// 游戏主管理器, 自动加载
+///
+public class GameManager : Node2D
+{
+ public static GameManager Instance { get; private set; }
+ public GameManager()
+ {
+ GameManager.Instance = this;
+ }
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/manager/ResourceManager.cs b/DungeonShooting_Godot/src/manager/ResourceManager.cs
new file mode 100644
index 0000000..83f9688
--- /dev/null
+++ b/DungeonShooting_Godot/src/manager/ResourceManager.cs
@@ -0,0 +1,77 @@
+using System.Collections.Generic;
+using Godot;
+
+public static class ResourceManager
+{
+
+ ///
+ /// 2D阴影的材质
+ ///
+ public static ShaderMaterial ShadowMaterial
+ {
+ get
+ {
+ if (_shadowMaterial == null)
+ {
+ _shadowMaterial = ResourceLoader.Load("res://resource/materlal/Shadow.tres");
+ }
+ return _shadowMaterial;
+ }
+ }
+ private static ShaderMaterial _shadowMaterial;
+
+ ///
+ /// 2D阴影的Shader
+ ///
+ public static Shader ShadowShader
+ {
+ get
+ {
+ if (_shadowShader == null)
+ {
+ _shadowShader = ResourceLoader.Load("res://resource/materlal/Shadow.gdshader");
+ }
+ return _shadowShader;
+ }
+ }
+ private static Shader _shadowShader;
+
+ private static readonly Dictionary CachePack = new Dictionary();
+
+ ///
+ /// 加载资源对象, 并且缓存当前资源对象, 可频繁获取
+ ///
+ /// 资源路径
+ public static T Load(string path) where T : class
+ {
+ if (CachePack.TryGetValue(path, out var pack))
+ {
+ return (T)pack;
+ }
+ else
+ {
+ pack = ResourceLoader.Load(path);
+ if (pack != null)
+ {
+ CachePack.Add(path, pack);
+ return (T)pack;
+ }
+ }
+ return default(T);
+ }
+
+ ///
+ /// 加载并实例化一个武器对象
+ ///
+ /// 资源路径
+ public static Gun LoadGunAndInstance(string path)
+ {
+ var pack = Load(path);
+ if (pack != null)
+ {
+ return pack.Instance();
+ }
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/manager/SoundManager.cs b/DungeonShooting_Godot/src/manager/SoundManager.cs
new file mode 100644
index 0000000..2cf4f34
--- /dev/null
+++ b/DungeonShooting_Godot/src/manager/SoundManager.cs
@@ -0,0 +1,84 @@
+using System;
+using Godot;
+
+///
+/// 音频总线 区分不同的声音 添加声音效果 目前只有背景音乐 和音效 两个bus
+///
+public enum BUS
+{
+ BGM = 0,
+ SFX = 1
+}
+
+///
+/// 声音管理 背景音乐管理 音效
+///
+public class SoundManager
+{
+ public static SoundManager Instance { get => SingleTon.singleTon; }
+
+ private static class SingleTon
+ {
+ internal static SoundManager singleTon = new SoundManager();
+ }
+
+ private static AudioStreamPlayer audioStreamPlayer = new AudioStreamPlayer();
+
+
+ ///
+ /// 背景音乐路径
+ ///
+ public static string BGMPath = "res://resource/sound/bgm/";
+ ///
+ /// 音效路径
+ ///
+ public static string SFXPath = "res://resource/sound/sfx/";
+
+ ///
+ /// 播放声音 用于bgm
+ ///
+ /// bgm名字 在resource/sound/bgm/目录下
+ /// 需要播放声音得节点 将成为音频播放节点的父节点
+ /// 音量
+ public static void PlayeMusic(string soundName, Node node, float volume)
+ {
+ AudioStream sound = ResourceManager.Load(BGMPath + soundName);
+ if (sound != null)
+ {
+ AudioStreamPlayer soundNode = new AudioStreamPlayer();
+ node.AddChild(soundNode);
+ soundNode.Stream = sound;
+ soundNode.Bus = Enum.GetName(typeof(BUS), 0);
+ soundNode.VolumeDb = volume;
+ soundNode.Play();
+ }
+ else
+ {
+ GD.Print("没有这个资源!!!");
+ }
+ }
+ ///
+ /// 添加并播放音效 用于音效
+ ///
+ /// 音效文件名字 在resource/sound/sfx/目录下
+ /// 需要播放声音得节点 将成为音频播放节点的父节点
+ /// 音量
+ public static void PlaySoundEffect(string soundName, Node node, float volume = 0f)
+ {
+ AudioStream sound = ResourceManager.Load(SFXPath + soundName);
+ if (sound != null)
+ {
+ AudioStreamPlayer soundNode = new AudioStreamPlayer();
+ node.AddChild(soundNode);
+ soundNode.Stream = sound;
+ soundNode.Bus = Enum.GetName(typeof(BUS), 1);
+ soundNode.VolumeDb = volume;
+ soundNode.Play();
+ GD.Print("bus:", soundNode.Bus);
+ }
+ else
+ {
+ GD.Print("没有这个资源!!!");
+ }
+ }
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/package/Holster.cs b/DungeonShooting_Godot/src/package/Holster.cs
new file mode 100644
index 0000000..1c77cbf
--- /dev/null
+++ b/DungeonShooting_Godot/src/package/Holster.cs
@@ -0,0 +1,227 @@
+using Godot;
+
+///
+/// 角色身上的枪套, 存储角色携带的武器
+///
+public class Holster
+{
+ ///
+ /// 插槽类
+ ///
+ public class GunSlot
+ {
+ ///
+ /// 是否启用
+ ///
+ public bool Enable = false;
+ ///
+ /// 当前插槽存放的武器类型
+ ///
+ public GunWeightType Type = GunWeightType.MainWeapon;
+ ///
+ /// 插槽存放的武器
+ ///
+ public Gun Gun;
+ }
+
+ ///
+ /// 归属者
+ ///
+ public Role Master { get; }
+
+ ///
+ /// 当前使用的武器对象
+ ///
+ public Gun ActiveGun { get; private set; }
+
+ ///
+ /// 当前使用的武器的索引
+ ///
+ public int ActiveIndex { get; private set; } = 0;
+
+ public GunSlot[] SlotList { get; } = new GunSlot[4];
+
+ public Holster(Role master)
+ {
+ Master = master;
+
+ //创建枪的插槽, 默认前两个都是启用的
+ GunSlot slot1 = new GunSlot();
+ slot1.Enable = true;
+ SlotList[0] = slot1;
+
+ GunSlot slot2 = new GunSlot();
+ slot2.Enable = true;
+ slot2.Type = GunWeightType.DeputyWeapon;
+ SlotList[1] = slot2;
+
+ GunSlot slot3 = new GunSlot();
+ SlotList[2] = slot3;
+
+ GunSlot slot4 = new GunSlot();
+ slot4.Type = GunWeightType.DeputyWeapon;
+ SlotList[3] = slot4;
+ }
+
+ ///
+ /// 拾起武器, 存入枪套中, 返回存放在枪套的位置, 如果容不下这把武器, 则会返回 -1
+ ///
+ /// 武器对象
+ public int PickupGun(Gun gun)
+ {
+ for (int i = 0; i < SlotList.Length; i++)
+ {
+ var item = SlotList[i];
+ if (item.Enable && gun.Attribute.WeightType == item.Type && item.Gun == null)
+ {
+ item.Gun = gun;
+ ExchangeByIndex(i);
+ gun._PickUpGun(Master);
+ return i;
+ }
+ }
+ GD.PrintErr("存入武器失败!");
+ return -1;
+ }
+
+ ///
+ /// 移除指定位置的武器, 并返回这个武器对象, 如果移除正在使用的这把武器, 则会自动切换到上一把武器
+ ///
+ /// 所在枪套的位置索引
+ public Gun RmoveGun(int index)
+ {
+ if (index < 0 || index >= SlotList.Length)
+ {
+ return null;
+ }
+ var slot = SlotList[index];
+ if (slot.Gun == null)
+ {
+ return null;
+ }
+ var gun = slot.Gun;
+ gun.GetParent().RemoveChild(gun);
+ slot.Gun = null;
+
+ //如果是当前手持的武器, 就需要调用切换武器操作
+ if (index == ActiveIndex)
+ {
+ //没有其他武器了
+ if (ExchangePrev() == index)
+ {
+ ActiveIndex = 0;
+ ActiveGun = null;
+ }
+ }
+ gun._ThrowOutGun();
+ return gun;
+ }
+
+ ///
+ /// 切换到上一个武器
+ ///
+ public int ExchangePrev()
+ {
+ var index = ActiveIndex - 1;
+ do
+ {
+ if (index < 0)
+ {
+ index = SlotList.Length - 1;
+ }
+ if (ExchangeByIndex(index))
+ {
+ return index;
+ }
+ } while (index-- != ActiveIndex);
+ return -1;
+ }
+
+ ///
+ /// 切换到下一个武器,
+ ///
+ public int ExchangeNext()
+ {
+ var index = ActiveIndex + 1;
+ do
+ {
+ if (index >= SlotList.Length)
+ {
+ index = 0;
+ }
+ if (ExchangeByIndex(index))
+ {
+ return index;
+ }
+ }
+ while (index++ != ActiveIndex);
+ return -1;
+ }
+
+ ///
+ /// 切换到指定索引的武器
+ ///
+ public bool ExchangeByIndex(int index)
+ {
+ if (index == ActiveIndex && ActiveGun != null) return true;
+ if (index < 0 || index > SlotList.Length) return false;
+ var slot = SlotList[index];
+ if (slot == null || slot.Gun == null) return false;
+
+ //将上一把武器放到背后
+ if (ActiveGun != null)
+ {
+ var tempParent = ActiveGun.GetParentOrNull();
+ if (tempParent != null)
+ {
+ tempParent.RemoveChild(ActiveGun);
+ Master.BackMountPoint.AddChild(ActiveGun);
+ if (ActiveIndex == 0)
+ {
+ ActiveGun.Position = new Vector2(0, 5);
+ ActiveGun.RotationDegrees = 50;
+ ActiveGun.Scale = new Vector2(-1, 1);
+ }
+ else if (ActiveIndex == 1)
+ {
+ ActiveGun.Position = new Vector2(0, 0);
+ ActiveGun.RotationDegrees = 120;
+ ActiveGun.Scale = new Vector2(1, -1);
+ }
+ else if (ActiveIndex == 2)
+ {
+ ActiveGun.Position = new Vector2(0, 5);
+ ActiveGun.RotationDegrees = 310;
+ ActiveGun.Scale = new Vector2(1, 1);
+ }
+ else if (ActiveIndex == 3)
+ {
+ ActiveGun.Position = new Vector2(0, 0);
+ ActiveGun.RotationDegrees = 60;
+ ActiveGun.Scale = new Vector2(1, 1);
+ }
+ ActiveGun._Conceal();
+ }
+ }
+
+ //更改父节点
+ var parent = slot.Gun.GetParentOrNull();
+ if (parent == null)
+ {
+ Master.MountPoint.AddChild(slot.Gun);
+ }
+ else if (parent != Master.MountPoint)
+ {
+ parent.RemoveChild(slot.Gun);
+ Master.MountPoint.AddChild(slot.Gun);
+ }
+
+ slot.Gun.Position = Vector2.Zero;
+ slot.Gun.Scale = Vector2.One;
+ slot.Gun.RotationDegrees = 0;
+ ActiveGun = slot.Gun;
+ ActiveIndex = index;
+ ActiveGun._Active();
+ return true;
+ }
+}
diff --git a/DungeonShooting_Godot/src/props/IProp.cs b/DungeonShooting_Godot/src/props/IProp.cs
new file mode 100644
index 0000000..e7b1932
--- /dev/null
+++ b/DungeonShooting_Godot/src/props/IProp.cs
@@ -0,0 +1,12 @@
+
+///
+/// 道具接口
+///
+public interface IProp
+{
+ ///
+ /// 与角色互动时调用
+ ///
+ /// 触发者
+ void Tnteractive(Role master);
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/role/CampEnum.cs b/DungeonShooting_Godot/src/role/CampEnum.cs
new file mode 100644
index 0000000..afe6f3b
--- /dev/null
+++ b/DungeonShooting_Godot/src/role/CampEnum.cs
@@ -0,0 +1,8 @@
+
+public enum CampEnum
+{
+ // 友军
+ Friend,
+ // 敌人
+ Enemy
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/role/Player.cs b/DungeonShooting_Godot/src/role/Player.cs
new file mode 100644
index 0000000..d6ed468
--- /dev/null
+++ b/DungeonShooting_Godot/src/role/Player.cs
@@ -0,0 +1,120 @@
+using Godot;
+
+public class Player : Role
+{
+ ///
+ /// 移动加速度
+ ///
+ public float Acceleration = 1500f;
+
+ ///
+ /// 移动摩擦力
+ ///
+ public float Friction = 800f;
+ ///
+ /// 移动速度
+ ///
+ public Vector2 Velocity = Vector2.Zero;
+
+ [Export] public PackedScene GunPrefab;
+
+ public override void _EnterTree()
+ {
+ base._EnterTree();
+ RoomManager.Current.Player = this;
+ }
+
+ public override void _Ready()
+ {
+ base._Ready();
+ Holster.SlotList[2].Enable = true;
+ Holster.SlotList[3].Enable = true;
+ PickUpGun(GunManager.GetGun1()); //0
+ PickUpGun(GunManager.GetGun2()); //1
+ PickUpGun(GunManager.GetGun3()); //2
+ PickUpGun(GunManager.GetGun4()); //3
+ }
+
+ public override void _Process(float delta)
+ {
+ base._Process(delta);
+
+ Vector2 mousePos = GetGlobalMousePosition();
+ //枪口跟随鼠标
+ MountPoint.LookAt(mousePos);
+ //脸的朝向
+ if (mousePos.x > GlobalPosition.x && Face == FaceDirection.Left)
+ {
+ Face = FaceDirection.Right;
+ }
+ else if (mousePos.x < GlobalPosition.x && Face == FaceDirection.Right)
+ {
+ Face = FaceDirection.Left;
+ }
+
+ if (Input.IsActionJustPressed("exchange")) //切换武器
+ {
+ TriggerExchangeNext();
+ }
+ else if (Input.IsActionJustPressed("throw")) //扔掉武器
+ {
+ TriggerThrowGun();
+ }
+ else if (Input.IsActionJustPressed("interactive")) //互动物体
+ {
+ TriggerTnteractive();
+ }
+ else if (Input.IsActionJustPressed("reload")) //换弹
+ {
+ TriggerReload();
+ }
+ if (Input.IsActionPressed("fire")) //开火
+ {
+ TriggerAttack();
+ }
+ }
+
+ public override void _PhysicsProcess(float delta)
+ {
+ base._PhysicsProcess(delta);
+ Move(delta);
+ //播放动画
+ PlayAnim();
+ }
+
+ private void Move(float delta)
+ {
+ //角色移动
+ // 得到输入的 vector2 getvector方法返回值已经归一化过了noemalized
+ Vector2 dir = Input.GetVector("move_left", "move_right", "move_up", "move_down");
+ // 移动. 如果移动的数值接近0(是用 摇杆可能出现 方向 可能会出现浮点),就fricition的值 插值 到 0
+ // 如果 有输入 就以当前速度,用acceleration 插值到 对应方向 * 最大速度
+ if (Mathf.IsZeroApprox(dir.x)) Velocity.x = Mathf.MoveToward(Velocity.x, 0, Friction * delta);
+ else Velocity.x = Mathf.MoveToward(Velocity.x, dir.x * MoveSpeed, Acceleration * delta);
+
+ if (Mathf.IsZeroApprox(dir.y)) Velocity.y = Mathf.MoveToward(Velocity.y, 0, Friction * delta);
+ else Velocity.y = Mathf.MoveToward(Velocity.y, dir.y * MoveSpeed, Acceleration * delta);
+
+ Velocity = MoveAndSlide(Velocity);
+ }
+
+ // 播放动画
+ private void PlayAnim()
+ {
+ if (Velocity != Vector2.Zero)
+ {
+ if ((Face == FaceDirection.Right && Velocity.x >= 0) || Face == FaceDirection.Left && Velocity.x <= 0) //向前走
+ {
+ AnimatedSprite.Animation = AnimatorNames.Run;
+ }
+ else if ((Face == FaceDirection.Right && Velocity.x < 0) || Face == FaceDirection.Left && Velocity.x > 0) //向后走
+ {
+ AnimatedSprite.Animation = AnimatorNames.ReverseRun;
+ }
+ }
+ else
+ {
+ AnimatedSprite.Animation = AnimatorNames.Idle;
+ }
+ }
+}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/role/Role.cs b/DungeonShooting_Godot/src/role/Role.cs
new file mode 100644
index 0000000..335ba00
--- /dev/null
+++ b/DungeonShooting_Godot/src/role/Role.cs
@@ -0,0 +1,240 @@
+using System.Collections.Generic;
+using Godot;
+
+///
+/// 脸的朝向
+///
+public enum FaceDirection
+{
+ Left,
+ Right,
+}
+
+///
+/// 角色基类
+///
+public class Role : KinematicBody2D
+{
+ ///
+ /// 重写的纹理
+ ///
+ [Export] public Texture Texture;
+
+ ///
+ /// 移动速度
+ ///
+ [Export] public float MoveSpeed = 150f;
+
+ ///
+ /// 所属阵营
+ ///
+ [Export] public CampEnum Camp;
+
+ ///
+ /// 携带的道具包裹
+ ///
+ public List