diff --git a/assets/Ships/alien_ship.jpg.import b/assets/Ships/alien_ship.jpg.import new file mode 100644 index 0000000..7d2ff63 --- /dev/null +++ b/assets/Ships/alien_ship.jpg.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bg7ge8vql2xim" +path="res://.godot/imported/alien_ship.jpg-3d86c9c30f167a7cde62cfdb9e618039.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/Ships/alien_ship.jpg" +dest_files=["res://.godot/imported/alien_ship.jpg-3d86c9c30f167a7cde62cfdb9e618039.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/README.md b/assets/alien_ships/README.md new file mode 100644 index 0000000..0cc70f9 --- /dev/null +++ b/assets/alien_ships/README.md @@ -0,0 +1,19 @@ +# Alien ships + +Source: `assets/Ships/alien_ship.jpg` (40 ships, 8 columns × 5 rows). +`atlas.png` was prepared with the built-in ImageGen editor. Designs are adapted +from the original sheet; ImageGen may redraw small details. + +Prompt: Remove the gray checkerboard and replace it with real transparent alpha; +preserve all 40 dark alien ship designs, red/magenta colors, original ordering, +and crisp silhouettes. Arrange exactly 8 columns × 5 rows with isolated craft, +transparent margins, no text, no shadows, no background. Face ships upward. + +`extract_sprites.ps1` slices the returned atlas, trims transparent margins, +corrects remaining sideways/downward orientations, and centers each sprite +on a transparent 256 × 256 canvas with a maximum occupied dimension of 224. +Run this PowerShell script to rebuild `alien_01.png` through `alien_40.png`. + +The catalog in `scripts/items/alien_ship_catalog.gd` is shared by the level +generator and game. Each system selects one design using its level and seed. +All enemy tiers use that design; elites retain their tint and bosses their size. diff --git a/assets/alien_ships/alien_01.png b/assets/alien_ships/alien_01.png new file mode 100644 index 0000000..dd1bf69 Binary files /dev/null and b/assets/alien_ships/alien_01.png differ diff --git a/assets/alien_ships/alien_01.png.import b/assets/alien_ships/alien_01.png.import new file mode 100644 index 0000000..62f1791 --- /dev/null +++ b/assets/alien_ships/alien_01.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cbnbo1tnmgrk" +path="res://.godot/imported/alien_01.png-be6de3b72a7b92055fe983d28a70ec33.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_01.png" +dest_files=["res://.godot/imported/alien_01.png-be6de3b72a7b92055fe983d28a70ec33.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_02.png b/assets/alien_ships/alien_02.png new file mode 100644 index 0000000..25589d0 Binary files /dev/null and b/assets/alien_ships/alien_02.png differ diff --git a/assets/alien_ships/alien_02.png.import b/assets/alien_ships/alien_02.png.import new file mode 100644 index 0000000..269d297 --- /dev/null +++ b/assets/alien_ships/alien_02.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ch1q50ycs3b88" +path="res://.godot/imported/alien_02.png-573fd544da4230a54f566c218aa2f6bb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_02.png" +dest_files=["res://.godot/imported/alien_02.png-573fd544da4230a54f566c218aa2f6bb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_03.png b/assets/alien_ships/alien_03.png new file mode 100644 index 0000000..559d1c6 Binary files /dev/null and b/assets/alien_ships/alien_03.png differ diff --git a/assets/alien_ships/alien_03.png.import b/assets/alien_ships/alien_03.png.import new file mode 100644 index 0000000..5e62146 --- /dev/null +++ b/assets/alien_ships/alien_03.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ceqwpcdg6ytsr" +path="res://.godot/imported/alien_03.png-fc13080e1eb9cbfcf8bdb637ef3ccc5f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_03.png" +dest_files=["res://.godot/imported/alien_03.png-fc13080e1eb9cbfcf8bdb637ef3ccc5f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_04.png b/assets/alien_ships/alien_04.png new file mode 100644 index 0000000..d2c1a45 Binary files /dev/null and b/assets/alien_ships/alien_04.png differ diff --git a/assets/alien_ships/alien_04.png.import b/assets/alien_ships/alien_04.png.import new file mode 100644 index 0000000..14ffa2e --- /dev/null +++ b/assets/alien_ships/alien_04.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvxw45cc234fq" +path="res://.godot/imported/alien_04.png-08422063a1f190a13aaa53c043a0059b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_04.png" +dest_files=["res://.godot/imported/alien_04.png-08422063a1f190a13aaa53c043a0059b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_05.png b/assets/alien_ships/alien_05.png new file mode 100644 index 0000000..477add8 Binary files /dev/null and b/assets/alien_ships/alien_05.png differ diff --git a/assets/alien_ships/alien_05.png.import b/assets/alien_ships/alien_05.png.import new file mode 100644 index 0000000..01fc765 --- /dev/null +++ b/assets/alien_ships/alien_05.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbl47chs6h8y7" +path="res://.godot/imported/alien_05.png-e4f794e8c5d408fe110f2bbf7f8482aa.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_05.png" +dest_files=["res://.godot/imported/alien_05.png-e4f794e8c5d408fe110f2bbf7f8482aa.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_06.png b/assets/alien_ships/alien_06.png new file mode 100644 index 0000000..bad1942 Binary files /dev/null and b/assets/alien_ships/alien_06.png differ diff --git a/assets/alien_ships/alien_06.png.import b/assets/alien_ships/alien_06.png.import new file mode 100644 index 0000000..9705cad --- /dev/null +++ b/assets/alien_ships/alien_06.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://mlgwc2cjmlp7" +path="res://.godot/imported/alien_06.png-568a354080e9555010b6e5baa3710174.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_06.png" +dest_files=["res://.godot/imported/alien_06.png-568a354080e9555010b6e5baa3710174.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_07.png b/assets/alien_ships/alien_07.png new file mode 100644 index 0000000..7bb5a71 Binary files /dev/null and b/assets/alien_ships/alien_07.png differ diff --git a/assets/alien_ships/alien_07.png.import b/assets/alien_ships/alien_07.png.import new file mode 100644 index 0000000..863d3f8 --- /dev/null +++ b/assets/alien_ships/alien_07.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chphk2bvyk5v6" +path="res://.godot/imported/alien_07.png-cc4cc84d3c6686a1b65bb0cb98a0ee07.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_07.png" +dest_files=["res://.godot/imported/alien_07.png-cc4cc84d3c6686a1b65bb0cb98a0ee07.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_08.png b/assets/alien_ships/alien_08.png new file mode 100644 index 0000000..93760a1 Binary files /dev/null and b/assets/alien_ships/alien_08.png differ diff --git a/assets/alien_ships/alien_08.png.import b/assets/alien_ships/alien_08.png.import new file mode 100644 index 0000000..1701dc3 --- /dev/null +++ b/assets/alien_ships/alien_08.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dgeiwljvwg3xo" +path="res://.godot/imported/alien_08.png-79dc74c09683a0653187f9ba3f2ae0ed.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_08.png" +dest_files=["res://.godot/imported/alien_08.png-79dc74c09683a0653187f9ba3f2ae0ed.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_09.png b/assets/alien_ships/alien_09.png new file mode 100644 index 0000000..3a7cd5e Binary files /dev/null and b/assets/alien_ships/alien_09.png differ diff --git a/assets/alien_ships/alien_09.png.import b/assets/alien_ships/alien_09.png.import new file mode 100644 index 0000000..2a3f5b1 --- /dev/null +++ b/assets/alien_ships/alien_09.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://coj8qo2oodabe" +path="res://.godot/imported/alien_09.png-c70ce05aa1370c6b60e62a187f30ecf5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_09.png" +dest_files=["res://.godot/imported/alien_09.png-c70ce05aa1370c6b60e62a187f30ecf5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_10.png b/assets/alien_ships/alien_10.png new file mode 100644 index 0000000..33f5d73 Binary files /dev/null and b/assets/alien_ships/alien_10.png differ diff --git a/assets/alien_ships/alien_10.png.import b/assets/alien_ships/alien_10.png.import new file mode 100644 index 0000000..1f377e5 --- /dev/null +++ b/assets/alien_ships/alien_10.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1au4o6gdqyl5" +path="res://.godot/imported/alien_10.png-be65d4f3f4c99a9d9fec274abf1264f0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_10.png" +dest_files=["res://.godot/imported/alien_10.png-be65d4f3f4c99a9d9fec274abf1264f0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_11.png b/assets/alien_ships/alien_11.png new file mode 100644 index 0000000..277aa7a Binary files /dev/null and b/assets/alien_ships/alien_11.png differ diff --git a/assets/alien_ships/alien_11.png.import b/assets/alien_ships/alien_11.png.import new file mode 100644 index 0000000..d6ce7e8 --- /dev/null +++ b/assets/alien_ships/alien_11.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dtmd6ggiy5ikr" +path="res://.godot/imported/alien_11.png-4fa1eb7ed9ddcc033df1220cdc405221.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_11.png" +dest_files=["res://.godot/imported/alien_11.png-4fa1eb7ed9ddcc033df1220cdc405221.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_12.png b/assets/alien_ships/alien_12.png new file mode 100644 index 0000000..cd60307 Binary files /dev/null and b/assets/alien_ships/alien_12.png differ diff --git a/assets/alien_ships/alien_12.png.import b/assets/alien_ships/alien_12.png.import new file mode 100644 index 0000000..d578791 --- /dev/null +++ b/assets/alien_ships/alien_12.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dutromnln7bso" +path="res://.godot/imported/alien_12.png-9e1d33a5e7fe1fd4b24f7c5c073aee52.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_12.png" +dest_files=["res://.godot/imported/alien_12.png-9e1d33a5e7fe1fd4b24f7c5c073aee52.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_13.png b/assets/alien_ships/alien_13.png new file mode 100644 index 0000000..414916b Binary files /dev/null and b/assets/alien_ships/alien_13.png differ diff --git a/assets/alien_ships/alien_13.png.import b/assets/alien_ships/alien_13.png.import new file mode 100644 index 0000000..a7b85c6 --- /dev/null +++ b/assets/alien_ships/alien_13.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cwddmvbqilp8r" +path="res://.godot/imported/alien_13.png-8c0ba224bf465312b4e9a53eead15c61.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_13.png" +dest_files=["res://.godot/imported/alien_13.png-8c0ba224bf465312b4e9a53eead15c61.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_14.png b/assets/alien_ships/alien_14.png new file mode 100644 index 0000000..07a0e06 Binary files /dev/null and b/assets/alien_ships/alien_14.png differ diff --git a/assets/alien_ships/alien_14.png.import b/assets/alien_ships/alien_14.png.import new file mode 100644 index 0000000..62599cd --- /dev/null +++ b/assets/alien_ships/alien_14.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://p56nvuyl765" +path="res://.godot/imported/alien_14.png-3d8a0e0a2a5e0ba5864727b90f411122.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_14.png" +dest_files=["res://.godot/imported/alien_14.png-3d8a0e0a2a5e0ba5864727b90f411122.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_15.png b/assets/alien_ships/alien_15.png new file mode 100644 index 0000000..7c6d062 Binary files /dev/null and b/assets/alien_ships/alien_15.png differ diff --git a/assets/alien_ships/alien_15.png.import b/assets/alien_ships/alien_15.png.import new file mode 100644 index 0000000..03e8050 --- /dev/null +++ b/assets/alien_ships/alien_15.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ocgps02qc6ry" +path="res://.godot/imported/alien_15.png-5c231ed351dde549b7f3422fd95f99e9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_15.png" +dest_files=["res://.godot/imported/alien_15.png-5c231ed351dde549b7f3422fd95f99e9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_16.png b/assets/alien_ships/alien_16.png new file mode 100644 index 0000000..8e84e20 Binary files /dev/null and b/assets/alien_ships/alien_16.png differ diff --git a/assets/alien_ships/alien_16.png.import b/assets/alien_ships/alien_16.png.import new file mode 100644 index 0000000..8f88789 --- /dev/null +++ b/assets/alien_ships/alien_16.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmrln20ri1mw3" +path="res://.godot/imported/alien_16.png-569cf208bd6bddaed52ccfaf76886539.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_16.png" +dest_files=["res://.godot/imported/alien_16.png-569cf208bd6bddaed52ccfaf76886539.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_17.png b/assets/alien_ships/alien_17.png new file mode 100644 index 0000000..bcbbb73 Binary files /dev/null and b/assets/alien_ships/alien_17.png differ diff --git a/assets/alien_ships/alien_17.png.import b/assets/alien_ships/alien_17.png.import new file mode 100644 index 0000000..6b5f8a8 --- /dev/null +++ b/assets/alien_ships/alien_17.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c6kp4dekxxbm8" +path="res://.godot/imported/alien_17.png-f99a76de912f0c27ae13245fce7c9f65.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_17.png" +dest_files=["res://.godot/imported/alien_17.png-f99a76de912f0c27ae13245fce7c9f65.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_18.png b/assets/alien_ships/alien_18.png new file mode 100644 index 0000000..d149f64 Binary files /dev/null and b/assets/alien_ships/alien_18.png differ diff --git a/assets/alien_ships/alien_18.png.import b/assets/alien_ships/alien_18.png.import new file mode 100644 index 0000000..3546405 --- /dev/null +++ b/assets/alien_ships/alien_18.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://defj3cotohgh6" +path="res://.godot/imported/alien_18.png-6ce97997eebfab9056f7276133257034.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_18.png" +dest_files=["res://.godot/imported/alien_18.png-6ce97997eebfab9056f7276133257034.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_19.png b/assets/alien_ships/alien_19.png new file mode 100644 index 0000000..bba6c9d Binary files /dev/null and b/assets/alien_ships/alien_19.png differ diff --git a/assets/alien_ships/alien_19.png.import b/assets/alien_ships/alien_19.png.import new file mode 100644 index 0000000..39e0a68 --- /dev/null +++ b/assets/alien_ships/alien_19.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://brj8cohnssbjn" +path="res://.godot/imported/alien_19.png-a9e5ae73af6b88a7980ded5b6bc75991.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_19.png" +dest_files=["res://.godot/imported/alien_19.png-a9e5ae73af6b88a7980ded5b6bc75991.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_20.png b/assets/alien_ships/alien_20.png new file mode 100644 index 0000000..860d00a Binary files /dev/null and b/assets/alien_ships/alien_20.png differ diff --git a/assets/alien_ships/alien_20.png.import b/assets/alien_ships/alien_20.png.import new file mode 100644 index 0000000..751dfbd --- /dev/null +++ b/assets/alien_ships/alien_20.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://47evsvg5wylw" +path="res://.godot/imported/alien_20.png-21b1fd0d9b9a41bf705a0e81c818dd1a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_20.png" +dest_files=["res://.godot/imported/alien_20.png-21b1fd0d9b9a41bf705a0e81c818dd1a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_21.png b/assets/alien_ships/alien_21.png new file mode 100644 index 0000000..8b9899a Binary files /dev/null and b/assets/alien_ships/alien_21.png differ diff --git a/assets/alien_ships/alien_21.png.import b/assets/alien_ships/alien_21.png.import new file mode 100644 index 0000000..79d0911 --- /dev/null +++ b/assets/alien_ships/alien_21.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0xc060vi2mdr" +path="res://.godot/imported/alien_21.png-de83032cf6eea42b0c9efb27b2e96dda.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_21.png" +dest_files=["res://.godot/imported/alien_21.png-de83032cf6eea42b0c9efb27b2e96dda.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_22.png b/assets/alien_ships/alien_22.png new file mode 100644 index 0000000..7c9305f Binary files /dev/null and b/assets/alien_ships/alien_22.png differ diff --git a/assets/alien_ships/alien_22.png.import b/assets/alien_ships/alien_22.png.import new file mode 100644 index 0000000..77daebf --- /dev/null +++ b/assets/alien_ships/alien_22.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dr8w8f7ga61qb" +path="res://.godot/imported/alien_22.png-2e59a0089c865f40af07349bfa4a5b37.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_22.png" +dest_files=["res://.godot/imported/alien_22.png-2e59a0089c865f40af07349bfa4a5b37.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_23.png b/assets/alien_ships/alien_23.png new file mode 100644 index 0000000..aa578eb Binary files /dev/null and b/assets/alien_ships/alien_23.png differ diff --git a/assets/alien_ships/alien_23.png.import b/assets/alien_ships/alien_23.png.import new file mode 100644 index 0000000..ed7ff4a --- /dev/null +++ b/assets/alien_ships/alien_23.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://rxdef4xtw37x" +path="res://.godot/imported/alien_23.png-ee1fd9bb1f8b678fa9637b0c4eb5ab82.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_23.png" +dest_files=["res://.godot/imported/alien_23.png-ee1fd9bb1f8b678fa9637b0c4eb5ab82.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_24.png b/assets/alien_ships/alien_24.png new file mode 100644 index 0000000..e2af7dd Binary files /dev/null and b/assets/alien_ships/alien_24.png differ diff --git a/assets/alien_ships/alien_24.png.import b/assets/alien_ships/alien_24.png.import new file mode 100644 index 0000000..393e42b --- /dev/null +++ b/assets/alien_ships/alien_24.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvuo6ksjej22h" +path="res://.godot/imported/alien_24.png-e06c6bddcf3ff35ac95ccc8dc90ae493.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_24.png" +dest_files=["res://.godot/imported/alien_24.png-e06c6bddcf3ff35ac95ccc8dc90ae493.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_25.png b/assets/alien_ships/alien_25.png new file mode 100644 index 0000000..fc124bb Binary files /dev/null and b/assets/alien_ships/alien_25.png differ diff --git a/assets/alien_ships/alien_25.png.import b/assets/alien_ships/alien_25.png.import new file mode 100644 index 0000000..db7400f --- /dev/null +++ b/assets/alien_ships/alien_25.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dlujfaed5b3on" +path="res://.godot/imported/alien_25.png-22ed40b0b2c18d1e9d9dc77e95505eb7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_25.png" +dest_files=["res://.godot/imported/alien_25.png-22ed40b0b2c18d1e9d9dc77e95505eb7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_26.png b/assets/alien_ships/alien_26.png new file mode 100644 index 0000000..68ffa06 Binary files /dev/null and b/assets/alien_ships/alien_26.png differ diff --git a/assets/alien_ships/alien_26.png.import b/assets/alien_ships/alien_26.png.import new file mode 100644 index 0000000..30e077c --- /dev/null +++ b/assets/alien_ships/alien_26.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cpbq4d035150t" +path="res://.godot/imported/alien_26.png-344cce72123e7683cfd257e6490d2772.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_26.png" +dest_files=["res://.godot/imported/alien_26.png-344cce72123e7683cfd257e6490d2772.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_27.png b/assets/alien_ships/alien_27.png new file mode 100644 index 0000000..2a6edd3 Binary files /dev/null and b/assets/alien_ships/alien_27.png differ diff --git a/assets/alien_ships/alien_27.png.import b/assets/alien_ships/alien_27.png.import new file mode 100644 index 0000000..8619617 --- /dev/null +++ b/assets/alien_ships/alien_27.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://blap10m5dja5p" +path="res://.godot/imported/alien_27.png-cf891fc94b8852124b018c9848808a96.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_27.png" +dest_files=["res://.godot/imported/alien_27.png-cf891fc94b8852124b018c9848808a96.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_28.png b/assets/alien_ships/alien_28.png new file mode 100644 index 0000000..b890f7e Binary files /dev/null and b/assets/alien_ships/alien_28.png differ diff --git a/assets/alien_ships/alien_28.png.import b/assets/alien_ships/alien_28.png.import new file mode 100644 index 0000000..edc3ef6 --- /dev/null +++ b/assets/alien_ships/alien_28.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://e60gbegafju" +path="res://.godot/imported/alien_28.png-e349e996887716b9c8e3e1403849d07c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_28.png" +dest_files=["res://.godot/imported/alien_28.png-e349e996887716b9c8e3e1403849d07c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_29.png b/assets/alien_ships/alien_29.png new file mode 100644 index 0000000..bb1e2a9 Binary files /dev/null and b/assets/alien_ships/alien_29.png differ diff --git a/assets/alien_ships/alien_29.png.import b/assets/alien_ships/alien_29.png.import new file mode 100644 index 0000000..a0add67 --- /dev/null +++ b/assets/alien_ships/alien_29.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chfs8mnt4oaqq" +path="res://.godot/imported/alien_29.png-04a6fc0abde9a49257c91f70d5a9ec64.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_29.png" +dest_files=["res://.godot/imported/alien_29.png-04a6fc0abde9a49257c91f70d5a9ec64.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_30.png b/assets/alien_ships/alien_30.png new file mode 100644 index 0000000..2e2dbbf Binary files /dev/null and b/assets/alien_ships/alien_30.png differ diff --git a/assets/alien_ships/alien_30.png.import b/assets/alien_ships/alien_30.png.import new file mode 100644 index 0000000..0334117 --- /dev/null +++ b/assets/alien_ships/alien_30.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2xygj3e50tsl" +path="res://.godot/imported/alien_30.png-4e2e27b681e081bbbf4a4e486273f0c1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_30.png" +dest_files=["res://.godot/imported/alien_30.png-4e2e27b681e081bbbf4a4e486273f0c1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_31.png b/assets/alien_ships/alien_31.png new file mode 100644 index 0000000..bc37e88 Binary files /dev/null and b/assets/alien_ships/alien_31.png differ diff --git a/assets/alien_ships/alien_31.png.import b/assets/alien_ships/alien_31.png.import new file mode 100644 index 0000000..c7494ae --- /dev/null +++ b/assets/alien_ships/alien_31.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cguq05a2fjtur" +path="res://.godot/imported/alien_31.png-a43d2af7832681413a7e9ebec5770f0d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_31.png" +dest_files=["res://.godot/imported/alien_31.png-a43d2af7832681413a7e9ebec5770f0d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_32.png b/assets/alien_ships/alien_32.png new file mode 100644 index 0000000..e71e57a Binary files /dev/null and b/assets/alien_ships/alien_32.png differ diff --git a/assets/alien_ships/alien_32.png.import b/assets/alien_ships/alien_32.png.import new file mode 100644 index 0000000..1394f02 --- /dev/null +++ b/assets/alien_ships/alien_32.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvkc82qchhrnl" +path="res://.godot/imported/alien_32.png-364c255b141fd44ec0ec5f00aa984f5e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_32.png" +dest_files=["res://.godot/imported/alien_32.png-364c255b141fd44ec0ec5f00aa984f5e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_33.png b/assets/alien_ships/alien_33.png new file mode 100644 index 0000000..790e36e Binary files /dev/null and b/assets/alien_ships/alien_33.png differ diff --git a/assets/alien_ships/alien_33.png.import b/assets/alien_ships/alien_33.png.import new file mode 100644 index 0000000..94dba09 --- /dev/null +++ b/assets/alien_ships/alien_33.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ci1bgyq7rbnku" +path="res://.godot/imported/alien_33.png-bd3ba2c88901b9b0b1cbfc14f7e0a33f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_33.png" +dest_files=["res://.godot/imported/alien_33.png-bd3ba2c88901b9b0b1cbfc14f7e0a33f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_34.png b/assets/alien_ships/alien_34.png new file mode 100644 index 0000000..2acba58 Binary files /dev/null and b/assets/alien_ships/alien_34.png differ diff --git a/assets/alien_ships/alien_34.png.import b/assets/alien_ships/alien_34.png.import new file mode 100644 index 0000000..ab639b2 --- /dev/null +++ b/assets/alien_ships/alien_34.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1ofv74aumkn" +path="res://.godot/imported/alien_34.png-49e57687cf3587a42a27ea361b36ab2c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_34.png" +dest_files=["res://.godot/imported/alien_34.png-49e57687cf3587a42a27ea361b36ab2c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_35.png b/assets/alien_ships/alien_35.png new file mode 100644 index 0000000..20f5b90 Binary files /dev/null and b/assets/alien_ships/alien_35.png differ diff --git a/assets/alien_ships/alien_35.png.import b/assets/alien_ships/alien_35.png.import new file mode 100644 index 0000000..579a613 --- /dev/null +++ b/assets/alien_ships/alien_35.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bide2ap7jjfnj" +path="res://.godot/imported/alien_35.png-7fadfb8de2c664d3367029b38c485f6f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_35.png" +dest_files=["res://.godot/imported/alien_35.png-7fadfb8de2c664d3367029b38c485f6f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_36.png b/assets/alien_ships/alien_36.png new file mode 100644 index 0000000..116e25b Binary files /dev/null and b/assets/alien_ships/alien_36.png differ diff --git a/assets/alien_ships/alien_36.png.import b/assets/alien_ships/alien_36.png.import new file mode 100644 index 0000000..4004165 --- /dev/null +++ b/assets/alien_ships/alien_36.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bhkp3fe05xhwh" +path="res://.godot/imported/alien_36.png-fbf69418b061d61539f01d65004c8fcd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_36.png" +dest_files=["res://.godot/imported/alien_36.png-fbf69418b061d61539f01d65004c8fcd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_37.png b/assets/alien_ships/alien_37.png new file mode 100644 index 0000000..8fdb79c Binary files /dev/null and b/assets/alien_ships/alien_37.png differ diff --git a/assets/alien_ships/alien_37.png.import b/assets/alien_ships/alien_37.png.import new file mode 100644 index 0000000..1bf175c --- /dev/null +++ b/assets/alien_ships/alien_37.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3h20xwdllxwc" +path="res://.godot/imported/alien_37.png-a93b529efe7993133e3db4a93bc10283.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_37.png" +dest_files=["res://.godot/imported/alien_37.png-a93b529efe7993133e3db4a93bc10283.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_38.png b/assets/alien_ships/alien_38.png new file mode 100644 index 0000000..6a9f4b2 Binary files /dev/null and b/assets/alien_ships/alien_38.png differ diff --git a/assets/alien_ships/alien_38.png.import b/assets/alien_ships/alien_38.png.import new file mode 100644 index 0000000..ec73c3c --- /dev/null +++ b/assets/alien_ships/alien_38.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bnrbe3anhssd8" +path="res://.godot/imported/alien_38.png-8503a785560f6b3e34f5e08efe1455f1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_38.png" +dest_files=["res://.godot/imported/alien_38.png-8503a785560f6b3e34f5e08efe1455f1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_39.png b/assets/alien_ships/alien_39.png new file mode 100644 index 0000000..08e58fa Binary files /dev/null and b/assets/alien_ships/alien_39.png differ diff --git a/assets/alien_ships/alien_39.png.import b/assets/alien_ships/alien_39.png.import new file mode 100644 index 0000000..5c71603 --- /dev/null +++ b/assets/alien_ships/alien_39.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c8qtvnt36svcs" +path="res://.godot/imported/alien_39.png-ef07c4802a264066394524862d8a9f3e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_39.png" +dest_files=["res://.godot/imported/alien_39.png-ef07c4802a264066394524862d8a9f3e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/alien_40.png b/assets/alien_ships/alien_40.png new file mode 100644 index 0000000..ed6f253 Binary files /dev/null and b/assets/alien_ships/alien_40.png differ diff --git a/assets/alien_ships/alien_40.png.import b/assets/alien_ships/alien_40.png.import new file mode 100644 index 0000000..5c8b49d --- /dev/null +++ b/assets/alien_ships/alien_40.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dn8wgpprx6886" +path="res://.godot/imported/alien_40.png-6f2cadc2a7db4a0681edd0ff5ebe2d6b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/alien_40.png" +dest_files=["res://.godot/imported/alien_40.png-6f2cadc2a7db4a0681edd0ff5ebe2d6b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/atlas.png b/assets/alien_ships/atlas.png new file mode 100644 index 0000000..c459524 Binary files /dev/null and b/assets/alien_ships/atlas.png differ diff --git a/assets/alien_ships/atlas.png.import b/assets/alien_ships/atlas.png.import new file mode 100644 index 0000000..1e8a925 --- /dev/null +++ b/assets/alien_ships/atlas.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://h2hk1uilrc6r" +path="res://.godot/imported/atlas.png-d901c7531d7e83f5c5d8947d195e52d3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/alien_ships/atlas.png" +dest_files=["res://.godot/imported/atlas.png-d901c7531d7e83f5c5d8947d195e52d3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/alien_ships/extract_sprites.ps1 b/assets/alien_ships/extract_sprites.ps1 new file mode 100644 index 0000000..70e1420 --- /dev/null +++ b/assets/alien_ships/extract_sprites.ps1 @@ -0,0 +1,43 @@ +# Rebuild the game sprites from the transparent ImageGen atlas. +Add-Type -AssemblyName System.Drawing +$taskAtlas = [Drawing.Bitmap]::new((Join-Path $PSScriptRoot 'atlas.png')) +$taskRows = @(0, 220, 435, 615, 842, 1084) +try { + for ($taskRow = 0; $taskRow -lt 5; $taskRow++) { + for ($taskColumn = 0; $taskColumn -lt 8; $taskColumn++) { + $taskIndex = $taskRow * 8 + $taskColumn + 1 + $taskLeft = [int][Math]::Round($taskColumn * $taskAtlas.Width / 8.0) + $taskRight = [int][Math]::Round(($taskColumn + 1) * $taskAtlas.Width / 8.0) + $taskRect = [Drawing.Rectangle]::new($taskLeft, $taskRows[$taskRow], $taskRight - $taskLeft, $taskRows[$taskRow + 1] - $taskRows[$taskRow]) + $taskCell = $taskAtlas.Clone($taskRect, [Drawing.Imaging.PixelFormat]::Format32bppArgb) + # Find occupied bounds; ignore almost-transparent extraction fringe. + $taskMinX = $taskCell.Width; $taskMinY = $taskCell.Height + $taskMaxX = -1; $taskMaxY = -1 + for ($taskY = 0; $taskY -lt $taskCell.Height; $taskY++) { + for ($taskX = 0; $taskX -lt $taskCell.Width; $taskX++) { + if ($taskCell.GetPixel($taskX, $taskY).A -gt 32) { + $taskMinX = [Math]::Min($taskMinX, $taskX); $taskMinY = [Math]::Min($taskMinY, $taskY) + $taskMaxX = [Math]::Max($taskMaxX, $taskX); $taskMaxY = [Math]::Max($taskMaxY, $taskY) + } + } + } + if ($taskMaxX -lt 0) { throw "Empty sprite $taskIndex" } + $taskBounds = [Drawing.Rectangle]::new($taskMinX, $taskMinY, $taskMaxX - $taskMinX + 1, $taskMaxY - $taskMinY + 1) + $taskSprite = $taskCell.Clone($taskBounds, [Drawing.Imaging.PixelFormat]::Format32bppArgb) + $taskCell.Dispose() + if ($taskIndex -in @(17, 21, 24)) { $taskSprite.RotateFlip([Drawing.RotateFlipType]::Rotate270FlipNone) } + if ($taskIndex -in @(9, 13, 14)) { $taskSprite.RotateFlip([Drawing.RotateFlipType]::Rotate180FlipNone) } + $taskOutput = [Drawing.Bitmap]::new(256, 256, [Drawing.Imaging.PixelFormat]::Format32bppArgb) + $taskGraphics = [Drawing.Graphics]::FromImage($taskOutput) + $taskGraphics.Clear([Drawing.Color]::Transparent) + $taskGraphics.InterpolationMode = [Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic + $taskScale = 224.0 / [Math]::Max($taskSprite.Width, $taskSprite.Height) + $taskWidth = [int][Math]::Round($taskSprite.Width * $taskScale) + $taskHeight = [int][Math]::Round($taskSprite.Height * $taskScale) + $taskGraphics.DrawImage($taskSprite, [Drawing.Rectangle]::new([int]((256 - $taskWidth) / 2), [int]((256 - $taskHeight) / 2), $taskWidth, $taskHeight)) + $taskOutput.Save((Join-Path $PSScriptRoot ('alien_{0:D2}.png' -f $taskIndex)), [Drawing.Imaging.ImageFormat]::Png) + $taskGraphics.Dispose(); $taskOutput.Dispose(); $taskSprite.Dispose() + } + } +} finally { $taskAtlas.Dispose() } +Write-Output 'Extracted 40 transparent sprites, 256 x 256 pixels.' diff --git a/scenes/game/enemy_ship.tscn b/scenes/game/enemy_ship.tscn index 837acab..38cada1 100644 --- a/scenes/game/enemy_ship.tscn +++ b/scenes/game/enemy_ship.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=3 format=3] +[gd_scene load_steps=4 format=3] [ext_resource type="Script" path="res://scripts/game/enemy_ship.gd" id="1_enemy"] +[ext_resource type="Script" path="res://scripts/game/enemy_health_bar.gd" id="2_health"] [sub_resource type="CircleShape2D" id="EnemyCollision"] radius = 22.0 @@ -15,3 +16,6 @@ texture_filter = 1 [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("EnemyCollision") + +[node name="HealthBar" type="Node2D" parent="."] +script = ExtResource("2_health") diff --git a/scenes/ui/planet_services_menu.tscn b/scenes/ui/planet_services_menu.tscn index 0219ab2..907fdf1 100644 --- a/scenes/ui/planet_services_menu.tscn +++ b/scenes/ui/planet_services_menu.tscn @@ -9,10 +9,10 @@ border_width_top = 1 border_width_right = 1 border_width_bottom = 1 border_color = Color(0.28, 0.63, 0.54, 1) -content_margin_left = 24.0 -content_margin_top = 24.0 -content_margin_right = 24.0 -content_margin_bottom = 24.0 +content_margin_left = 14.0 +content_margin_top = 14.0 +content_margin_right = 14.0 +content_margin_bottom = 14.0 corner_radius_top_left = 8 corner_radius_top_right = 8 corner_radius_bottom_left = 8 @@ -20,22 +20,11 @@ corner_radius_bottom_right = 8 [node name="PlanetServicesMenu" type="Control"] visible = false -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 0 -script = ExtResource("1_services") - -[node name="Dim" type="ColorRect" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 +layout_mode = 0 +offset_right = 350.0 +offset_bottom = 250.0 mouse_filter = 2 -color = Color(0.01, 0.025, 0.045, 0.78) +script = ExtResource("1_services") [node name="Center" type="CenterContainer" parent="."] layout_mode = 1 @@ -45,32 +34,32 @@ anchor_bottom = 1.0 mouse_filter = 2 [node name="Panel" type="PanelContainer" parent="Center"] -custom_minimum_size = Vector2(460, 310) +custom_minimum_size = Vector2(350, 250) layout_mode = 2 theme_override_styles/panel = SubResource("PanelStyle") [node name="Contents" type="VBoxContainer" parent="Center/Panel"] layout_mode = 2 -theme_override_constants/separation = 16 +theme_override_constants/separation = 12 [node name="Title" type="Label" parent="Center/Panel/Contents"] layout_mode = 2 theme_override_colors/font_color = Color(0.47, 0.91, 0.74, 1) -theme_override_font_sizes/font_size = 21 -text = "USŁUGI CHRONIONEJ RASY" +theme_override_font_sizes/font_size = 17 +text = "USŁUGI TUBYLCÓW" horizontal_alignment = 1 [node name="Status" type="Label" parent="Center/Panel/Contents"] layout_mode = 2 -theme_override_font_sizes/font_size = 14 -text = "Układ jest bezpieczny. Mieszkańcy otwierają przejście." +theme_override_font_sizes/font_size = 12 +text = "Układ bezpieczny. Usługi dostępne." horizontal_alignment = 1 [node name="Services" type="Label" parent="Center/Panel/Contents"] layout_mode = 2 size_flags_vertical = 3 theme_override_colors/font_color = Color(0.59, 0.67, 0.75, 1) -theme_override_font_sizes/font_size = 14 +theme_override_font_sizes/font_size = 12 text = "Kup amunicję do działka maszynowego." horizontal_alignment = 1 vertical_alignment = 1 @@ -78,17 +67,13 @@ vertical_alignment = 1 [node name="BuyAmmunitionButton" type="Button" parent="Center/Panel/Contents"] custom_minimum_size = Vector2(0, 44) layout_mode = 2 -theme_override_font_sizes/font_size = 15 +theme_override_font_sizes/font_size = 12 +focus_mode = 0 text = "KUP 100 AMUNICJI — 100 KREDYTÓW" [node name="NextButton" type="Button" parent="Center/Panel/Contents"] custom_minimum_size = Vector2(0, 44) layout_mode = 2 -theme_override_font_sizes/font_size = 15 -text = "PRZEJDŹ DO NASTĘPNEGO UKŁADU" - -[node name="CloseButton" type="Button" parent="Center/Panel/Contents"] -custom_minimum_size = Vector2(0, 32) -layout_mode = 2 -theme_override_font_sizes/font_size = 14 -text = "WRÓĆ DO STATKU" +theme_override_font_sizes/font_size = 12 +focus_mode = 0 +text = "IDŹ DO NASTĘPNEGO POZIOMU" diff --git a/scripts/game/enemy_health_bar.gd b/scripts/game/enemy_health_bar.gd new file mode 100644 index 0000000..e530319 --- /dev/null +++ b/scripts/game/enemy_health_bar.gd @@ -0,0 +1,29 @@ +extends Node2D + +var enemy: CharacterBody2D + +func _ready() -> void: + enemy = get_parent() as CharacterBody2D + top_level = true + z_index = 30 + _update_position() + +func _process(_delta: float) -> void: + _update_position() + queue_redraw() + +func _update_position() -> void: + global_position = enemy.global_position + Vector2(0, -enemy.get_visual_size() * 0.5 - 12.0) + +func get_health_ratio() -> float: + return clampf(enemy.hull / maxf(enemy.max_hull, 0.001), 0.0, 1.0) + +func _draw() -> void: + if not is_instance_valid(enemy) or enemy.hull <= 0.0: + return + var width := 72.0 if enemy.loot_tier == 2 else 44.0 + var background := Rect2(-width * 0.5, -3.0, width, 6.0) + draw_rect(background.grow(1.0), Color("08111dee")) + draw_rect(background, Color("39232bee")) + var color := Color("ffac46") if enemy.loot_tier == 2 else Color("ef5967") + draw_rect(Rect2(background.position, Vector2(width * get_health_ratio(), 6.0)), color) diff --git a/scripts/game/enemy_health_bar.gd.uid b/scripts/game/enemy_health_bar.gd.uid new file mode 100644 index 0000000..849931d --- /dev/null +++ b/scripts/game/enemy_health_bar.gd.uid @@ -0,0 +1 @@ +uid://cuubudnf0qe6k diff --git a/scripts/game/enemy_ship.gd b/scripts/game/enemy_ship.gd index fef7550..17ff308 100644 --- a/scripts/game/enemy_ship.gd +++ b/scripts/game/enemy_ship.gd @@ -34,23 +34,32 @@ func _ready() -> void: func apply_level_settings(level: int, tier: int) -> void: loot_tier = tier var power := LEVEL_BALANCE.power_scale(level) - var hull_multiplier := 1.0 if tier == 0 else (2.0 if tier == 1 else 6.0) - var damage_bonus := 1.0 if tier == 0 else (1.3 if tier == 1 else 1.7) + var boss_multiplier := 2.0 if tier == 2 else 1.0 + var hull_multiplier := 4.0 if tier == 2 else (2.0 if tier == 1 else 1.0) + var damage_bonus := 4.0 if tier == 2 else (1.3 if tier == 1 else 1.0) max_hull = 50.0 * power * hull_multiplier hull = max_hull weapon_damage = 8.0 * power * damage_bonus - approach_speed = 62.0 * (1.0 + 0.0005 * (clampi(level, 1, 1000) - 1)) - weapon_cooldown = maxf(0.55, 1.5 / (1.0 + 0.001 * (clampi(level, 1, 1000) - 1))) + approach_speed = 62.0 * (1.0 + 0.0005 * (clampi(level, 1, 1000) - 1)) * boss_multiplier + approach_acceleration = 85.0 * boss_multiplier + turn_speed = 1.8 * boss_multiplier + activation_range = 760.0 * boss_multiplier + weapon_range = 680.0 * boss_multiplier + weapon_cooldown = maxf(0.55, 1.5 / (1.0 + 0.001 * (clampi(level, 1, 1000) - 1))) / boss_multiplier + $CollisionShape2D.scale = Vector2.ONE * boss_multiplier func configure(player: CharacterBody2D, ship_texture: Texture2D) -> void: _player = player _sprite = $Sprite2D _sprite.texture = ship_texture var largest_dimension := maxf(ship_texture.get_width(), ship_texture.get_height()) - var visual_size := 56.0 if loot_tier == 0 else (68.0 if loot_tier == 1 else 104.0) + var visual_size := get_visual_size() _sprite.scale = Vector2.ONE * (visual_size / largest_dimension) _sprite.modulate = Color("ffc785") if loot_tier == 1 else Color.WHITE +func get_visual_size() -> float: + return 112.0 if loot_tier == 2 else (68.0 if loot_tier == 1 else 56.0) + func _physics_process(delta: float) -> void: if not is_instance_valid(_player): velocity = velocity.move_toward(Vector2.ZERO, approach_acceleration * delta) @@ -83,7 +92,7 @@ func _check_player_collision() -> void: func _fire_plasma(direction: Vector2) -> void: var projectile := PLASMA_PROJECTILE_SCENE.instantiate() as Area2D - projectile.call("configure", global_position + direction * 28.0, direction, weapon_damage) + projectile.call("configure", global_position + direction * (get_visual_size() * 0.5), direction, weapon_damage) get_parent().add_child(projectile) # Relative to the Plasma bus: enemy shots are 4 dB quieter than player shots. WEAPON_AUDIO_SCRIPT.play(get_parent(), global_position, ItemDefinition.WeaponKind.PLASMA, -4.0) diff --git a/scripts/game/game.gd b/scripts/game/game.gd index d8544a9..6bae526 100644 --- a/scripts/game/game.gd +++ b/scripts/game/game.gd @@ -5,23 +5,13 @@ const LEVEL_BALANCE := preload("res://scripts/levels/level_balance.gd") const CELESTIAL_BODY := preload("res://scripts/levels/celestial_body.gd") const SERVICES_MENU := preload("res://scenes/ui/planet_services_menu.tscn") const PLANET_MARKER := preload("res://scripts/ui/protected_planet_marker.gd") +const WORMHOLE_SCRIPT := preload("res://scripts/game/wormhole.gd") const WORLD_SIZE := SYSTEM_GENERATOR.WORLD_SIZE const SERVICE_APPROACH_DISTANCE := 180.0 -const BOSS_TEXTURE := preload("res://assets/alien ship/Mega_boss.png") +const WORMHOLE_PLANET_DISTANCE := 620.0 +const WORMHOLE_ENTRY_RADIUS := 48.0 const ENEMY_SCENE := preload("res://scenes/game/enemy_ship.tscn") -const ENEMY_TEXTURES: Array[Texture2D] = [ - preload("res://assets/alien ship/Ship_1.png"), - preload("res://assets/alien ship/Ship_2.png"), - preload("res://assets/alien ship/Ship_3.png"), - preload("res://assets/alien ship/Ship_4.png"), - preload("res://assets/alien ship/Ship_5.png"), - preload("res://assets/alien ship/Ship_6.png"), - preload("res://assets/alien ship/Ship_7.png"), - preload("res://assets/alien ship/Ship_8.png"), - preload("res://assets/alien ship/Ship_9.png"), - preload("res://assets/alien ship/Ship_10.png"), - preload("res://assets/alien ship/Ship_11.png"), -] +const ENEMY_TEXTURES: Array[Texture2D] = preload("res://scripts/items/alien_ship_catalog.gd").TEXTURES @onready var player: CharacterBody2D = $PlayerShip @@ -29,7 +19,7 @@ var system_data: Dictionary = {} var protected_planet: Node2D var services_menu: Control var system_cleared := false -var _services_dismissed := false +var wormhole: Node2D var _transitioning := false func _ready() -> void: @@ -54,9 +44,9 @@ func _ready() -> void: $HUD/HUDRoot.add_child(marker) marker.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) services_menu = SERVICES_MENU.instantiate() as Control + services_menu.set("planet", protected_planet) $HUD/HUDRoot.add_child(services_menu) - services_menu.connect("next_level_requested", advance_to_next_level) - services_menu.connect("closed", _on_services_closed) + services_menu.connect("next_level_requested", open_wormhole) func _spawn_celestial_bodies() -> void: var bodies := Node2D.new() @@ -97,7 +87,7 @@ func _spawn_enemies() -> void: enemy.position = data["position"] enemy.call("apply_level_settings", GameState.system_level, int(data["tier"])) add_child(enemy) - var texture := BOSS_TEXTURE if int(data["tier"]) == 2 else ENEMY_TEXTURES[int(data["texture_index"])] + var texture: Texture2D = ENEMY_TEXTURES[int(data["texture_index"])] enemy.call("configure", player, texture) func get_remaining_enemies() -> int: @@ -109,34 +99,61 @@ func get_remaining_enemies() -> int: func _physics_process(_delta: float) -> void: if _transitioning or bool(player.get("_is_destroyed")): + services_menu.call("hide_services") return if not system_cleared and get_remaining_enemies() == 0: system_cleared = true protected_planet.call("set_safe", true) - var near_planet := is_near_protected_planet() - if not near_planet: - _services_dismissed = false - if system_cleared and near_planet and not _services_dismissed and not services_menu.visible: - player.velocity = Vector2.ZERO - player.set("angular_velocity", 0.0) - player.set("is_docked", true) - $HUD.call("close_inventory") - services_menu.call("show_services", GameState.system_level >= LEVEL_BALANCE.MAX_LEVEL) + if system_cleared and is_near_protected_planet(): + if not services_menu.visible: + services_menu.call("show_services", GameState.system_level >= LEVEL_BALANCE.MAX_LEVEL, is_instance_valid(wormhole)) + else: + services_menu.call("hide_services") + if is_instance_valid(wormhole) and player.global_position.distance_to(wormhole.global_position) <= WORMHOLE_ENTRY_RADIUS: + advance_to_next_level() func is_near_protected_planet() -> bool: return player.global_position.distance_to(protected_planet.global_position) <= float(protected_planet.get("radius")) + SERVICE_APPROACH_DISTANCE -func _on_services_closed() -> void: - player.set("is_docked", false) - _services_dismissed = true +func open_wormhole() -> bool: + if _transitioning or not system_cleared or not services_menu.visible or not is_near_protected_planet(): + return false + if bool(player.get("_is_destroyed")) or GameState.system_level >= LEVEL_BALANCE.MAX_LEVEL or is_instance_valid(wormhole): + return false + wormhole = Node2D.new() + wormhole.name = "Wormhole" + wormhole.set_script(WORMHOLE_SCRIPT) + wormhole.position = _find_wormhole_position() + add_child(wormhole) + services_menu.call("show_services", false, true) + return true + +func _find_wormhole_position() -> Vector2: + var inward := -protected_planet.global_position.normalized() + for step in 16: + var candidate := protected_planet.global_position + inward.rotated(TAU * step / 16.0) * WORMHOLE_PLANET_DISTANCE + if absf(candidate.x) > WORLD_SIZE.x * 0.5 - 160.0 or absf(candidate.y) > WORLD_SIZE.y * 0.5 - 160.0: + continue + if candidate.length() < 260.0: + continue + var clear := true + for planet_data in system_data["planets"]: + if candidate.distance_to(planet_data["position"]) < float(planet_data["radius"]) + 130.0: + clear = false + break + if clear: + return candidate + return protected_planet.global_position + inward * WORMHOLE_PLANET_DISTANCE func advance_to_next_level() -> bool: - if _transitioning or not system_cleared or not services_menu.visible or not is_near_protected_planet(): + if _transitioning or not system_cleared or not is_instance_valid(wormhole): return false if bool(player.get("_is_destroyed")) or GameState.system_level >= LEVEL_BALANCE.MAX_LEVEL: return false + if player.global_position.distance_to(wormhole.global_position) > WORMHOLE_ENTRY_RADIUS: + return false _transitioning = true - services_menu.get_node("Center/Panel/Contents/NextButton").set("disabled", true) + services_menu.call("hide_services") _load_next_level.call_deferred() return true @@ -152,5 +169,6 @@ func _load_next_level() -> void: GameState.system_seed = previous_seed GameState.restart_inventory.clear() _transitioning = false - services_menu.call("show_services", false) + if is_near_protected_planet(): + services_menu.call("show_services", false, true) push_error("Could not enter next system: %s" % error_string(error)) diff --git a/scripts/game/wormhole.gd b/scripts/game/wormhole.gd new file mode 100644 index 0000000..fcb79a9 --- /dev/null +++ b/scripts/game/wormhole.gd @@ -0,0 +1,33 @@ +extends Node2D + +var _time := 0.0 + +func _ready() -> void: + z_index = -2 + var label := Label.new() + label.text = "WORMHOLE\nWleć, aby przejść do następnego układu" + label.position = Vector2(-180, 72) + label.size = Vector2(360, 44) + label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + label.mouse_filter = Control.MOUSE_FILTER_IGNORE + label.add_theme_font_size_override("font_size", 13) + label.add_theme_color_override("font_color", Color("89e8ff")) + add_child(label) + +func _process(delta: float) -> void: + _time += delta + queue_redraw() + +func _draw() -> void: + var pulse := 1.0 + sin(_time * 2.5) * 0.06 + for ring in range(6, 0, -1): + draw_circle(Vector2.ZERO, (48.0 + ring * 4.0) * pulse, Color(0.28, 0.35, 0.95, 0.025 * (7 - ring))) + draw_circle(Vector2.ZERO, 43.0, Color("040917")) + for arm in 3: + var points := PackedVector2Array() + for segment in 65: + var progress := segment / 64.0 + var angle := progress * TAU * 1.3 + _time * 1.6 + TAU * arm / 3.0 + points.append(Vector2.RIGHT.rotated(angle) * (8.0 + progress * 44.0) * pulse) + draw_polyline(points, Color(0.35 + arm * 0.12, 0.55, 1.0, 0.8), 3.0, true) + draw_arc(Vector2.ZERO, 49.0 * pulse, 0, TAU, 96, Color("8beaff"), 2.0, true) diff --git a/scripts/game/wormhole.gd.uid b/scripts/game/wormhole.gd.uid new file mode 100644 index 0000000..ba88383 --- /dev/null +++ b/scripts/game/wormhole.gd.uid @@ -0,0 +1 @@ +uid://dkii8te7jfiy4 diff --git a/scripts/items/alien_ship_catalog.gd b/scripts/items/alien_ship_catalog.gd new file mode 100644 index 0000000..2d5fd91 --- /dev/null +++ b/scripts/items/alien_ship_catalog.gd @@ -0,0 +1,45 @@ +extends RefCounted + +# One transparent, upward-facing sprite per design in alien_ship.jpg. +const TEXTURES: Array[Texture2D] = [ + preload("res://assets/alien_ships/alien_01.png"), + preload("res://assets/alien_ships/alien_02.png"), + preload("res://assets/alien_ships/alien_03.png"), + preload("res://assets/alien_ships/alien_04.png"), + preload("res://assets/alien_ships/alien_05.png"), + preload("res://assets/alien_ships/alien_06.png"), + preload("res://assets/alien_ships/alien_07.png"), + preload("res://assets/alien_ships/alien_08.png"), + preload("res://assets/alien_ships/alien_09.png"), + preload("res://assets/alien_ships/alien_10.png"), + preload("res://assets/alien_ships/alien_11.png"), + preload("res://assets/alien_ships/alien_12.png"), + preload("res://assets/alien_ships/alien_13.png"), + preload("res://assets/alien_ships/alien_14.png"), + preload("res://assets/alien_ships/alien_15.png"), + preload("res://assets/alien_ships/alien_16.png"), + preload("res://assets/alien_ships/alien_17.png"), + preload("res://assets/alien_ships/alien_18.png"), + preload("res://assets/alien_ships/alien_19.png"), + preload("res://assets/alien_ships/alien_20.png"), + preload("res://assets/alien_ships/alien_21.png"), + preload("res://assets/alien_ships/alien_22.png"), + preload("res://assets/alien_ships/alien_23.png"), + preload("res://assets/alien_ships/alien_24.png"), + preload("res://assets/alien_ships/alien_25.png"), + preload("res://assets/alien_ships/alien_26.png"), + preload("res://assets/alien_ships/alien_27.png"), + preload("res://assets/alien_ships/alien_28.png"), + preload("res://assets/alien_ships/alien_29.png"), + preload("res://assets/alien_ships/alien_30.png"), + preload("res://assets/alien_ships/alien_31.png"), + preload("res://assets/alien_ships/alien_32.png"), + preload("res://assets/alien_ships/alien_33.png"), + preload("res://assets/alien_ships/alien_34.png"), + preload("res://assets/alien_ships/alien_35.png"), + preload("res://assets/alien_ships/alien_36.png"), + preload("res://assets/alien_ships/alien_37.png"), + preload("res://assets/alien_ships/alien_38.png"), + preload("res://assets/alien_ships/alien_39.png"), + preload("res://assets/alien_ships/alien_40.png"), +] diff --git a/scripts/items/alien_ship_catalog.gd.uid b/scripts/items/alien_ship_catalog.gd.uid new file mode 100644 index 0000000..4972611 --- /dev/null +++ b/scripts/items/alien_ship_catalog.gd.uid @@ -0,0 +1 @@ +uid://ciwu8mwco1rhr diff --git a/scripts/levels/level_balance.gd b/scripts/levels/level_balance.gd index 5f5d484..db5e4f6 100644 --- a/scripts/levels/level_balance.gd +++ b/scripts/levels/level_balance.gd @@ -2,8 +2,8 @@ extends RefCounted const MAX_LEVEL := 1000 const COUNT_POINTS := [Vector2(1, 5), Vector2(10, 10), Vector2(50, 18), Vector2(100, 23), Vector2(250, 29), Vector2(500, 34), Vector2(1000, 40)] -# x = level, y = elite fraction, z = boss fraction. -const TIER_POINTS := [Vector3(10, 0, 0), Vector3(50, 0.15, 0), Vector3(100, 0.25, 0.05), Vector3(500, 0.45, 0.10), Vector3(1000, 0.55, 0.15)] +# x = level, y = elite fraction. Each level has exactly one boss. +const TIER_POINTS := [Vector2(10, 0), Vector2(50, 0.15), Vector2(100, 0.25), Vector2(500, 0.45), Vector2(1000, 0.55)] static func enemy_count(level: int) -> int: var clamped_level := clampi(level, 1, MAX_LEVEL) @@ -16,26 +16,21 @@ static func enemy_count(level: int) -> int: static func enemy_tiers(level: int) -> Array[int]: var count := enemy_count(level) - var fractions := Vector2.ZERO + var elite_fraction := 0.0 for index in range(1, TIER_POINTS.size()): - var before: Vector3 = TIER_POINTS[index - 1] - var after: Vector3 = TIER_POINTS[index] + var before: Vector2 = TIER_POINTS[index - 1] + var after: Vector2 = TIER_POINTS[index] if level <= after.x: var progress := clampf(inverse_lerp(before.x, after.x, level), 0.0, 1.0) - fractions = Vector2(lerpf(before.y, after.y, progress), lerpf(before.z, after.z, progress)) + elite_fraction = lerpf(before.y, after.y, progress) break if level >= MAX_LEVEL: - fractions = Vector2(0.55, 0.15) - var bosses := roundi(count * fractions.y) - var elites := roundi(count * fractions.x) - if level >= 100: - bosses = maxi(1, bosses) - # Every boss begins a cluster with at least two elite escorts. - elites = mini(count - bosses, maxi(elites, bosses * 2)) - var tiers: Array[int] = [] - for boss in bosses: - tiers.append_array([2, 1, 1]) - for elite in elites - bosses * 2: + elite_fraction = 0.55 + # One boss on every level, included in the total enemy count. + var bosses := 1 + var elites := mini(count - bosses, roundi(count * elite_fraction)) + var tiers: Array[int] = [2] + for elite in elites: tiers.append(1) for normal in count - bosses - elites: tiers.append(0) diff --git a/scripts/levels/system_generator.gd b/scripts/levels/system_generator.gd index dc16e8a..c0559cb 100644 --- a/scripts/levels/system_generator.gd +++ b/scripts/levels/system_generator.gd @@ -2,6 +2,7 @@ extends RefCounted const BALANCE := preload("res://scripts/levels/level_balance.gd") const NAMES := preload("res://scripts/levels/celestial_names.gd") +const ALIEN_SHIPS := preload("res://scripts/items/alien_ship_catalog.gd") const WORLD_SIZE := Vector2(5200, 3600) const PLAYER_START := Vector2(180, 200) const SAFE_ZONE_RADIUS := 1200.0 @@ -62,6 +63,9 @@ static func generate(level: int, seed_value: int) -> Dictionary: "protected": index == protected_index, }) var enemies: Array[Dictionary] = [] + var ship_rng := RandomNumberGenerator.new() + ship_rng.seed = seed_value ^ (level * 0x53484950) + var enemy_texture_index := ship_rng.randi_range(0, ALIEN_SHIPS.TEXTURES.size() - 1) var tiers := BALANCE.enemy_tiers(level) var cursor := 0 while cursor < tiers.size(): @@ -72,13 +76,16 @@ static func generate(level: int, seed_value: int) -> Dictionary: anchor += anchor.normalized() * rng.randf_range(250.0, 450.0) for member in cluster_size: var position := _find_enemy_position(anchor, planets, enemies, rng) + # Preserve the geometry stream formerly used to choose each ship. + rng.randi_range(0, 10) enemies.append({ "position": position, "tier": tiers[cursor], - "texture_index": rng.randi_range(0, 10), + "texture_index": enemy_texture_index, }) cursor += 1 return { + "enemy_texture_index": enemy_texture_index, "star_name": star_name, "star_texture": star_texture, "star_position": Vector2.ZERO, diff --git a/scripts/ui/planet_services_menu.gd b/scripts/ui/planet_services_menu.gd index 6e4f3fe..1454b41 100644 --- a/scripts/ui/planet_services_menu.gd +++ b/scripts/ui/planet_services_menu.gd @@ -1,18 +1,19 @@ extends Control signal next_level_requested -signal closed @onready var next_button: Button = $Center/Panel/Contents/NextButton -@onready var close_button: Button = $Center/Panel/Contents/CloseButton @onready var buy_ammunition_button: Button = $Center/Panel/Contents/BuyAmmunitionButton @onready var services_label: Label = $Center/Panel/Contents/Services +@onready var status_label: Label = $Center/Panel/Contents/Status +@onready var panel: PanelContainer = $Center/Panel var _inventory: ShipInventory +var planet: Node2D +var _open_tween: Tween func _ready() -> void: next_button.pressed.connect(func() -> void: next_level_requested.emit()) - close_button.pressed.connect(_close) buy_ammunition_button.pressed.connect(_buy_ammunition) _inventory = get_tree().get_first_node_in_group("ship_inventory") as ShipInventory if _inventory: @@ -20,27 +21,49 @@ func _ready() -> void: GameState.captain.changed.connect(_refresh_ammunition_service) _refresh_ammunition_service() -func show_services(at_level_cap: bool) -> void: +func show_services(at_level_cap: bool, portal_open: bool = false) -> void: _refresh_ammunition_service() - next_button.disabled = at_level_cap - next_button.text = "OSIĄGNIĘTO OSTATNI UKŁAD" if at_level_cap else "PRZEJDŹ DO NASTĘPNEGO UKŁADU" + next_button.disabled = at_level_cap or portal_open + next_button.text = "OSIĄGNIĘTO OSTATNI UKŁAD" if at_level_cap else ("WORMHOLE OTWARTY" if portal_open else "IDŹ DO NASTĘPNEGO POZIOMU") + status_label.text = "Wleć w wormhole, aby przejść dalej." if portal_open else "Układ bezpieczny. Usługi dostępne." + if visible: + return show() + _position_at_planet() + scale = Vector2(0.05, 1.0) + _open_tween = create_tween() + _open_tween.tween_property(self, "scale:x", 1.0, 0.2).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT) + +func hide_services() -> void: + if _open_tween != null and _open_tween.is_running(): + _open_tween.kill() + hide() + scale = Vector2.ONE + +func _process(_delta: float) -> void: + if visible: + _position_at_planet() + +func _position_at_planet() -> void: + if not is_instance_valid(planet): + return + var canvas := get_viewport().get_canvas_transform() + var planet_screen := canvas * planet.global_position + var planet_radius := float(planet.get("radius")) * canvas.x.length() + size = panel.get_combined_minimum_size() + var viewport_size := get_viewport_rect().size + var screen_right := viewport_size.x - 320.0 + var target := planet_screen + Vector2(planet_radius + 24.0, -size.y * 0.5) + if target.x + size.x > screen_right: + target.x = planet_screen.x - planet_radius - 24.0 - size.x + position = Vector2(clampf(target.x, 8.0, maxf(8.0, screen_right - size.x)), clampf(target.y, 8.0, maxf(8.0, viewport_size.y - size.y - 80.0))) func _refresh_ammunition_service() -> void: buy_ammunition_button.disabled = _inventory == null or not _inventory.can_buy_ammunition() if _inventory: buy_ammunition_button.text = "KUP %d AMUNICJI — %d KREDYTÓW" % [ShipInventory.AMMUNITION_BUY_AMOUNT, _inventory.get_ammunition_buy_cost()] - services_label.text = "Amunicja: %d • Kredyty: %d\nCena: 100 kredytów × poziom układu (%d)" % [_inventory.ammunition, GameState.captain.credits, GameState.system_level] + services_label.text = "Amunicja: %d • Kredyty: %d\nCena: %d kredytów × poziom układu (%d)" % [_inventory.ammunition, GameState.captain.credits, ShipInventory.AMMUNITION_BUY_BASE_COST, GameState.system_level] func _buy_ammunition() -> void: if visible and _inventory: _inventory.buy_ammunition() - -func _close() -> void: - hide() - closed.emit() - -func _unhandled_key_input(event: InputEvent) -> void: - if visible and event.is_action_pressed("ui_cancel"): - _close() - get_viewport().set_input_as_handled() diff --git a/scripts/ui/protected_planet_marker.gd b/scripts/ui/protected_planet_marker.gd index 4b39252..aa2c2f4 100644 --- a/scripts/ui/protected_planet_marker.gd +++ b/scripts/ui/protected_planet_marker.gd @@ -11,7 +11,14 @@ func _draw() -> void: if not is_instance_valid(game) or not is_instance_valid(game.get("protected_planet")): return var planet: Node2D = game.get("protected_planet") - var screen_position := get_viewport().get_canvas_transform() * planet.global_position + var color := Color("77e8bc") if bool(game.get("system_cleared")) else Color("ffbd83") + _draw_target(planet.global_position, str(planet.get("display_name")) + " — zamieszkana", color) + var portal: Node2D = game.get("wormhole") + if is_instance_valid(portal): + _draw_target(portal.global_position, "WORMHOLE — następny układ", Color("89e8ff")) + +func _draw_target(world_position: Vector2, label_text: String, color: Color) -> void: + var screen_position := get_viewport().get_canvas_transform() * world_position # Leave the bottom strip free for active extension buttons. var bounds := Rect2(Vector2(32, 56), Vector2(maxf(100.0, size.x - 320.0), maxf(100.0, size.y - 160.0))) if bounds.has_point(screen_position): @@ -22,9 +29,7 @@ func _draw() -> void: var distance := minf(half_size.x / maxf(absf(direction.x), 0.001), half_size.y / maxf(absf(direction.y), 0.001)) var point := center + direction * distance var side := Vector2(-direction.y, direction.x) - var color := Color("77e8bc") if bool(game.get("system_cleared")) else Color("ffbd83") draw_colored_polygon(PackedVector2Array([point + direction * 10, point - direction * 7 + side * 7, point - direction * 7 - side * 7]), color) - var label_text := str(planet.get("display_name")) + " — zamieszkana" var text_width := GAME_FONT.get_string_size(label_text, HORIZONTAL_ALIGNMENT_LEFT, -1, 12).x var label_position := Vector2(clampf(point.x - text_width * 0.5, 8, maxf(8, size.x - text_width - 8)), clampf(point.y + 25, 20, size.y - 12)) draw_string(GAME_FONT, label_position, label_text, HORIZONTAL_ALIGNMENT_LEFT, -1, 12, color) diff --git a/tests/captain/captain_system_test.gd b/tests/captain/captain_system_test.gd index 07f4d41..f73b1e5 100644 --- a/tests/captain/captain_system_test.gd +++ b/tests/captain/captain_system_test.gd @@ -48,8 +48,8 @@ func _ready() -> void: for enemy in enemies: enemy.call("take_weapon_hit", 1000000.0, true) enemy.call("take_damage", 1000000.0) - assert(profile.level == 2 and profile.experience == 0 and profile.learning_points == 1) - assert(profile.credits == 75) + assert(profile.level == 2 and profile.experience == 130 and profile.learning_points == 1) + assert(profile.credits == 180) var panel := game.get_node("HUD/HUDRoot/CaptainPanel") panel.get_node("Contents/Skills/gunner/Train_gunner").emit_signal("pressed") assert(profile.get_skill_rank("gunner") == 1 and profile.learning_points == 0) @@ -106,15 +106,18 @@ func _ready() -> void: await get_tree().create_timer(1.3).timeout game = get_tree().current_scene as Node2D _freeze(game) - assert(GameState.captain == profile and profile.level == 2 and profile.credits == 75) + assert(GameState.captain == profile and profile.level == 2 and profile.credits == 180) player = game.get_node("PlayerShip") as CharacterBody2D assert(player.get_node("ShipInventory").call("get_item", "weapon", 0) == weapon) for enemy in get_tree().get_nodes_in_group("enemies"): enemy.call("take_damage", 1000000.0) - assert(profile.experience == 125 and profile.credits == 190) + assert(profile.level == 4 and profile.experience == 68 and profile.credits == 452) var planet: Node2D = game.get("protected_planet") player.position = planet.position game.call("_physics_process", 0.0) + assert(bool(game.call("open_wormhole"))) + var portal: Node2D = game.get("wormhole") + player.position = portal.position assert(bool(game.call("advance_to_next_level"))) await get_tree().process_frame await get_tree().process_frame @@ -125,7 +128,7 @@ func _ready() -> void: assert(profile.get_skill_rank("gunner") == 1 and profile.get_skill_rank("sharp_eye") == 100) var enemy := get_tree().get_nodes_in_group("enemies")[0] as CharacterBody2D enemy.call("take_damage", 1000000.0) - assert(profile.level == 3 and profile.experience == 1 and profile.credits == 214) + assert(profile.level == 5 and profile.experience == 15 and profile.credits == 641) print("CAPTAIN_SYSTEM_TEST: PASS (XP, multiple levels, learning UI, rewards once, dodge, reduction, critical addons, projectile metadata, death and next system)") func _freeze(game: Node2D) -> void: diff --git a/tests/levels/system_generation_test.gd b/tests/levels/system_generation_test.gd index f476698..29ccf36 100644 --- a/tests/levels/system_generation_test.gd +++ b/tests/levels/system_generation_test.gd @@ -4,6 +4,11 @@ const GENERATOR := preload("res://scripts/levels/system_generator.gd") const BALANCE := preload("res://scripts/levels/level_balance.gd") func _ready() -> void: + for texture in GENERATOR.ALIEN_SHIPS.TEXTURES: + var image := texture.get_image() + assert(image.get_size() == Vector2i(256, 256)) + assert(image.get_pixel(0, 0).a == 0.0 and image.get_pixel(255, 255).a == 0.0) + assert(image.get_used_rect().has_area()) for point in BALANCE.COUNT_POINTS: assert(BALANCE.enemy_count(int(point.x)) == int(point.y)) var previous_count := 0 @@ -11,11 +16,16 @@ func _ready() -> void: var count := BALANCE.enemy_count(level) assert(count >= previous_count and count <= 40) assert(BALANCE.enemy_tiers(level).size() == count) + assert(BALANCE.enemy_tiers(level).count(2) == 1) previous_count = count var observed_counts: Dictionary = {} + var observed_ship_types: Dictionary = {} for level in [1, 10, 50, 100, 250, 500, 1000]: for seed_value in range(1, 61): var data := GENERATOR.generate(level, seed_value) + var ship_type: int = data["enemy_texture_index"] + assert(ship_type >= 0 and ship_type < GENERATOR.ALIEN_SHIPS.TEXTURES.size()) + observed_ship_types[ship_type] = true assert(data == GENERATOR.generate(level, seed_value)) assert(data["star_position"] == Vector2.ZERO) assert(data["player_start"].distance_to(Vector2.ZERO) <= 300.0) @@ -34,7 +44,9 @@ func _ready() -> void: assert(planets[data["protected_index"]]["protected"]) var enemies: Array[Dictionary] = data["enemies"] assert(enemies.size() == BALANCE.enemy_count(level)) + assert(enemies.filter(func(enemy: Dictionary) -> bool: return enemy["tier"] == 2).size() == 1) for index in enemies.size(): + assert(enemies[index]["texture_index"] == ship_type) var position: Vector2 = enemies[index]["position"] assert(position.length() >= GENERATOR.SAFE_ZONE_RADIUS) assert(position.distance_to(data["player_start"]) >= 940.0) @@ -42,8 +54,7 @@ func _ready() -> void: for other_index in range(index + 1, enemies.size()): assert(position.distance_to(enemies[other_index]["position"]) >= GENERATOR.ENEMY_MIN_SEPARATION) if level <= 10: - assert(enemies[index]["tier"] == 0) - if enemies[index]["tier"] == 2: - assert(enemies[index + 1]["tier"] == 1 and enemies[index + 2]["tier"] == 1) + assert(enemies[index]["tier"] == (2 if index == 0 else 0)) assert(observed_counts.size() == 5) + assert(observed_ship_types.size() == GENERATOR.ALIEN_SHIPS.TEXTURES.size()) print("SYSTEM_GENERATION_TEST: PASS (420 layouts, deterministic retries, planets, safe spawn and level balance 1–1000)") diff --git a/tests/levels/system_lifecycle_test.gd b/tests/levels/system_lifecycle_test.gd index af18569..3659955 100644 --- a/tests/levels/system_lifecycle_test.gd +++ b/tests/levels/system_lifecycle_test.gd @@ -12,6 +12,7 @@ func _ready() -> void: await get_tree().process_frame get_tree().current_scene = game _freeze(game) + _assert_boss_and_health(game) assert(GameState.system_level == 1 and int(game.call("get_remaining_enemies")) == 5) assert(not game.has_node("WeaponTestTarget")) assert(game.get_node("CelestialBodies").get_child_count() >= 2) @@ -23,7 +24,10 @@ func _ready() -> void: var free_slot := inventory.cargo.find(null) assert(inventory.add_item(weapon)) assert(inventory.move_item("cargo", free_slot, "weapon", 0)) - assert(inventory.move_item("cargo", 2, "module", 0)) + var module := ITEM_GENERATOR.generate_for_definition(preload("res://resources/items/hull_plating.tres"), 1) + free_slot = inventory.cargo.find(null) + assert(inventory.add_item(module)) + assert(inventory.move_item("cargo", free_slot, "module", 0)) var equipped_module := inventory.get_item("module", 0) var tooltip := weapon.get_tooltip_text() var initial_data: Dictionary = game.get("system_data") @@ -33,22 +37,29 @@ func _ready() -> void: game.call("_physics_process", 0.0) var menu: Control = game.get("services_menu") assert(not menu.visible and not bool(game.call("advance_to_next_level"))) + assert(not bool(game.call("open_wormhole"))) _clear_enemies(game) + player.velocity = Vector2(30, 0) game.call("_physics_process", 0.0) - assert(menu.visible and bool(player.get("is_docked"))) + assert(menu.visible and not bool(player.get("is_docked"))) + assert(player.velocity == Vector2(30, 0)) assert(bool(game.get("system_cleared")) and bool(planet.get("is_safe"))) - var previous_hull := float(player.get("hull")) - player.call("take_damage", 100000.0) - assert(float(player.get("hull")) == previous_hull) - menu.call("_close") + Input.action_press("ship_thrust") + player.call("_physics_process", 0.1) + Input.action_release("ship_thrust") + assert(player.velocity.y < 0.0) game.call("_physics_process", 0.0) - assert(not menu.visible and not bool(player.get("is_docked"))) + assert(menu.visible) + GameState.captain.credits = inventory.get_ammunition_buy_cost() + menu.get_node("Center/Panel/Contents/BuyAmmunitionButton").emit_signal("pressed") + assert(inventory.ammunition == 400 and GameState.captain.credits == 0) player.position = initial_data["player_start"] game.call("_physics_process", 0.0) + assert(not menu.visible) + assert(not bool(game.call("open_wormhole"))) player.position = planet.position game.call("_physics_process", 0.0) assert(menu.visible) - menu.call("_close") player.position = initial_data["player_start"] player.call("take_damage", 100000.0) await get_tree().create_timer(1.3).timeout @@ -67,7 +78,23 @@ func _ready() -> void: planet = game.get("protected_planet") player.position = planet.position game.call("_physics_process", 0.0) - assert(bool(game.call("advance_to_next_level"))) + assert(not bool(game.call("advance_to_next_level"))) + menu = game.get("services_menu") + menu.get_node("Center/Panel/Contents/NextButton").emit_signal("pressed") + var portal: Node2D = game.get("wormhole") + assert(is_instance_valid(portal)) + assert(GameState.system_level == 1) + assert(is_equal_approx(portal.global_position.distance_to(planet.global_position), game.WORMHOLE_PLANET_DISTANCE)) + assert(not bool(game.call("open_wormhole"))) + assert(not bool(game.call("advance_to_next_level"))) + player.position = portal.position + Vector2(game.WORMHOLE_ENTRY_RADIUS + 10, 0) + game.call("_physics_process", 0.0) + assert(not menu.visible and GameState.system_level == 1) + player.position = planet.position + game.call("_physics_process", 0.0) + assert(menu.visible and bool(menu.get_node("Center/Panel/Contents/NextButton").get("disabled"))) + player.position = portal.position + game.call("_physics_process", 0.0) assert(not bool(game.call("advance_to_next_level"))) await get_tree().process_frame await get_tree().process_frame @@ -77,13 +104,14 @@ func _ready() -> void: player = game.get_node("PlayerShip") as CharacterBody2D inventory = player.get_node("ShipInventory") as ShipInventory assert(GameState.system_level == 2 and GameState.system_seed != initial_seed) + assert(game.get("wormhole") == null) assert(game.get("system_data") != initial_data) assert(inventory.get_item("weapon", 0) == weapon and inventory.get_item("module", 0) == equipped_module) assert(weapon.get_tooltip_text() == tooltip) _assert_full_resources(player) var enemy := get_tree().get_nodes_in_group("enemies")[0] as CharacterBody2D enemy.call("apply_level_settings", 2, 2) - assert(float(enemy.get("max_hull")) > 300.0) + assert(is_equal_approx(float(enemy.get("max_hull")), 210.0)) enemy.call("take_damage", 100000.0) await get_tree().process_frame await get_tree().process_frame @@ -111,7 +139,8 @@ func _ready() -> void: assert(menu.visible) assert(bool(menu.get_node("Center/Panel/Contents/NextButton").get("disabled"))) assert(not bool(game.call("advance_to_next_level"))) - print("SYSTEM_LIFECYCLE_TEST: PASS (locked services, docking, retry, inventory preservation, next level, scaled loot and level cap)") + assert(not bool(game.call("open_wormhole"))) + print("SYSTEM_LIFECYCLE_TEST: PASS (proximity services, free steering, ammo purchase, wormhole request/entry, retry, inventory preservation, boss stats/HP, next level and level cap)") func _freeze(game: Node2D) -> void: game.set_physics_process(false) @@ -119,8 +148,37 @@ func _freeze(game: Node2D) -> void: game.get_node("PlayerShip/WeaponController").set_physics_process(false) for enemy in get_tree().get_nodes_in_group("enemies"): if game.is_ancestor_of(enemy): + var data: Dictionary = game.get("system_data") + assert(enemy.get_node("Sprite2D").get("texture") == game.ENEMY_TEXTURES[int(data["enemy_texture_index"])]) enemy.set_physics_process(false) +func _assert_boss_and_health(game: Node2D) -> void: + var boss: CharacterBody2D + var normal: CharacterBody2D + for enemy in get_tree().get_nodes_in_group("enemies"): + if game.is_ancestor_of(enemy): + if enemy.loot_tier == 2: + assert(boss == null) + boss = enemy + elif enemy.loot_tier == 0: + normal = enemy + assert(boss != null and normal != null) + for key in ["max_hull", "weapon_damage"]: + assert(is_equal_approx(float(boss.get(key)), float(normal.get(key)) * 4.0)) + for key in ["approach_speed", "approach_acceleration", "turn_speed", "activation_range", "weapon_range"]: + assert(is_equal_approx(float(boss.get(key)), float(normal.get(key)) * 2.0)) + assert(is_equal_approx(boss.weapon_cooldown, normal.weapon_cooldown * 0.5)) + assert(boss.get_node("Sprite2D").scale == normal.get_node("Sprite2D").scale * 2.0) + assert(boss.get_node("CollisionShape2D").scale == Vector2(2, 2)) + var bar: Node2D = boss.get_node("HealthBar") + assert(is_equal_approx(bar.get_health_ratio(), 1.0)) + boss.take_damage(boss.max_hull * 0.5) + assert(is_equal_approx(bar.get_health_ratio(), 0.5)) + boss.rotation = 1.2 + bar._process(0.0) + assert(is_zero_approx(bar.global_rotation)) + assert(bar.global_position == boss.global_position + Vector2(0, -68)) + func _clear_enemies(game: Node2D) -> void: for enemy in get_tree().get_nodes_in_group("enemies"): if game.is_ancestor_of(enemy):