diff --git a/artifacts/captain_equipment_layout.png b/artifacts/captain_equipment_layout.png new file mode 100644 index 0000000..ed540c1 Binary files /dev/null and b/artifacts/captain_equipment_layout.png differ diff --git a/artifacts/captain_equipment_layout.png.import b/artifacts/captain_equipment_layout.png.import new file mode 100644 index 0000000..db6b0ae --- /dev/null +++ b/artifacts/captain_equipment_layout.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://73mim34buvli" +path="res://.godot/imported/captain_equipment_layout.png-1382eba5970f106e0ad48b2c3fe051ac.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/captain_equipment_layout.png" +dest_files=["res://.godot/imported/captain_equipment_layout.png-1382eba5970f106e0ad48b2c3fe051ac.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/artifacts/captain_equipment_preview.log b/artifacts/captain_equipment_preview.log new file mode 100644 index 0000000..a69ab22 --- /dev/null +++ b/artifacts/captain_equipment_preview.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6570 +[MCPRegistry] runtime port 6570 registered for c:/users/tomek/documents/godot/randoloot +CAPTAIN EQUIPMENT PASS: 244px width, below captain, no backpack, slots, preserved gear, protection, panel click and ESC diff --git a/artifacts/captain_equipment_preview_errors.log b/artifacts/captain_equipment_preview_errors.log new file mode 100644 index 0000000..09bb338 --- /dev/null +++ b/artifacts/captain_equipment_preview_errors.log @@ -0,0 +1,4 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/previews/captain_equipment_preview.gd:19) diff --git a/artifacts/captain_equipment_redesign.png b/artifacts/captain_equipment_redesign.png new file mode 100644 index 0000000..08c800f Binary files /dev/null and b/artifacts/captain_equipment_redesign.png differ diff --git a/artifacts/captain_equipment_redesign.png.import b/artifacts/captain_equipment_redesign.png.import new file mode 100644 index 0000000..3234b0b --- /dev/null +++ b/artifacts/captain_equipment_redesign.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bf1bu1bv4o0ia" +path="res://.godot/imported/captain_equipment_redesign.png-6bbe6cd6f6353d824e85eb4b77137e61.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/captain_equipment_redesign.png" +dest_files=["res://.godot/imported/captain_equipment_redesign.png-6bbe6cd6f6353d824e85eb4b77137e61.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/artifacts/captain_reductions_errors.log b/artifacts/captain_reductions_errors.log new file mode 100644 index 0000000..09bb338 --- /dev/null +++ b/artifacts/captain_reductions_errors.log @@ -0,0 +1,4 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/previews/captain_equipment_preview.gd:19) diff --git a/artifacts/captain_reductions_test.log b/artifacts/captain_reductions_test.log new file mode 100644 index 0000000..a69ab22 --- /dev/null +++ b/artifacts/captain_reductions_test.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6570 +[MCPRegistry] runtime port 6570 registered for c:/users/tomek/documents/godot/randoloot +CAPTAIN EQUIPMENT PASS: 244px width, below captain, no backpack, slots, preserved gear, protection, panel click and ESC diff --git a/artifacts/captain_unified_skills.png b/artifacts/captain_unified_skills.png new file mode 100644 index 0000000..fd06ba9 Binary files /dev/null and b/artifacts/captain_unified_skills.png differ diff --git a/artifacts/captain_unified_skills.png.import b/artifacts/captain_unified_skills.png.import new file mode 100644 index 0000000..ea6282a --- /dev/null +++ b/artifacts/captain_unified_skills.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://leinrqaektpa" +path="res://.godot/imported/captain_unified_skills.png-cb5a298db693df63a672fb808d5caf00.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/captain_unified_skills.png" +dest_files=["res://.godot/imported/captain_unified_skills.png-cb5a298db693df63a672fb808d5caf00.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/artifacts/cave_mountain_preview.png b/artifacts/cave_mountain_preview.png index cc10813..4c0f357 100644 Binary files a/artifacts/cave_mountain_preview.png and b/artifacts/cave_mountain_preview.png differ diff --git a/artifacts/cave_poi_window.png b/artifacts/cave_poi_window.png index 80b5410..488563d 100644 Binary files a/artifacts/cave_poi_window.png and b/artifacts/cave_poi_window.png differ diff --git a/artifacts/event_barter.png b/artifacts/event_barter.png index ee85e68..28a20e5 100644 Binary files a/artifacts/event_barter.png and b/artifacts/event_barter.png differ diff --git a/artifacts/event_blind_cache.png b/artifacts/event_blind_cache.png index b439809..a2e75f6 100644 Binary files a/artifacts/event_blind_cache.png and b/artifacts/event_blind_cache.png differ diff --git a/artifacts/event_collector.png b/artifacts/event_collector.png index 2141950..f288e9e 100644 Binary files a/artifacts/event_collector.png and b/artifacts/event_collector.png differ diff --git a/artifacts/event_evacuation.png b/artifacts/event_evacuation.png index cdf6873..40d12ab 100644 Binary files a/artifacts/event_evacuation.png and b/artifacts/event_evacuation.png differ diff --git a/artifacts/event_evacuation_stage2.png b/artifacts/event_evacuation_stage2.png index 83704f0..f426be8 100644 Binary files a/artifacts/event_evacuation_stage2.png and b/artifacts/event_evacuation_stage2.png differ diff --git a/artifacts/event_prototype.png b/artifacts/event_prototype.png index 3c49aaf..b0d88d2 100644 Binary files a/artifacts/event_prototype.png and b/artifacts/event_prototype.png differ diff --git a/artifacts/event_rescue.png b/artifacts/event_rescue.png index be9d4ac..0930866 100644 Binary files a/artifacts/event_rescue.png and b/artifacts/event_rescue.png differ diff --git a/artifacts/event_safe_bet.png b/artifacts/event_safe_bet.png index 6f055c5..2a3b0d9 100644 Binary files a/artifacts/event_safe_bet.png and b/artifacts/event_safe_bet.png differ diff --git a/artifacts/event_scan_cache.png b/artifacts/event_scan_cache.png index 0b1da65..e773878 100644 Binary files a/artifacts/event_scan_cache.png and b/artifacts/event_scan_cache.png differ diff --git a/artifacts/event_scan_result.png b/artifacts/event_scan_result.png index 4882b48..410cb5d 100644 Binary files a/artifacts/event_scan_result.png and b/artifacts/event_scan_result.png differ diff --git a/artifacts/event_service.png b/artifacts/event_service.png index 07bad9f..6d95666 100644 Binary files a/artifacts/event_service.png and b/artifacts/event_service.png differ diff --git a/artifacts/event_trader.png b/artifacts/event_trader.png index a42445f..df5a1c8 100644 Binary files a/artifacts/event_trader.png and b/artifacts/event_trader.png differ diff --git a/artifacts/events_overview.png b/artifacts/events_overview.png index 3503d88..142d3a1 100644 Binary files a/artifacts/events_overview.png and b/artifacts/events_overview.png differ diff --git a/artifacts/freighter_interior_built.png b/artifacts/freighter_interior_built.png index 88e616c..934411a 100644 Binary files a/artifacts/freighter_interior_built.png and b/artifacts/freighter_interior_built.png differ diff --git a/artifacts/freighter_interior_hangar.png b/artifacts/freighter_interior_hangar.png index c17b27a..100f6e4 100644 Binary files a/artifacts/freighter_interior_hangar.png and b/artifacts/freighter_interior_hangar.png differ diff --git a/artifacts/freighter_interior_hangar_upgrades.png b/artifacts/freighter_interior_hangar_upgrades.png new file mode 100644 index 0000000..d6ff35a Binary files /dev/null and b/artifacts/freighter_interior_hangar_upgrades.png differ diff --git a/artifacts/freighter_interior_hangar_upgrades.png.import b/artifacts/freighter_interior_hangar_upgrades.png.import new file mode 100644 index 0000000..61f8dc0 --- /dev/null +++ b/artifacts/freighter_interior_hangar_upgrades.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cja8sdvgkx18s" +path="res://.godot/imported/freighter_interior_hangar_upgrades.png-36030be59c6a237f60bfaaea97d4b9d4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/freighter_interior_hangar_upgrades.png" +dest_files=["res://.godot/imported/freighter_interior_hangar_upgrades.png-36030be59c6a237f60bfaaea97d4b9d4.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/artifacts/freighter_interior_overview.png b/artifacts/freighter_interior_overview.png index 7ec89d3..99607d2 100644 Binary files a/artifacts/freighter_interior_overview.png and b/artifacts/freighter_interior_overview.png differ diff --git a/artifacts/freighter_interior_renovation.png b/artifacts/freighter_interior_renovation.png index 62e89fc..b24a808 100644 Binary files a/artifacts/freighter_interior_renovation.png and b/artifacts/freighter_interior_renovation.png differ diff --git a/artifacts/freighter_interior_second_ship.png b/artifacts/freighter_interior_second_ship.png index ccd8949..451a2d8 100644 Binary files a/artifacts/freighter_interior_second_ship.png and b/artifacts/freighter_interior_second_ship.png differ diff --git a/artifacts/freighter_interior_storage_menu.png b/artifacts/freighter_interior_storage_menu.png new file mode 100644 index 0000000..e035697 Binary files /dev/null and b/artifacts/freighter_interior_storage_menu.png differ diff --git a/artifacts/freighter_interior_storage_menu.png.import b/artifacts/freighter_interior_storage_menu.png.import new file mode 100644 index 0000000..fb05f91 --- /dev/null +++ b/artifacts/freighter_interior_storage_menu.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbpo4t1glq2q1" +path="res://.godot/imported/freighter_interior_storage_menu.png-2408f2e8e56d1ab4d46fc27d347f6e13.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/freighter_interior_storage_menu.png" +dest_files=["res://.godot/imported/freighter_interior_storage_menu.png-2408f2e8e56d1ab4d46fc27d347f6e13.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/artifacts/freighter_interior_workshop.png b/artifacts/freighter_interior_workshop.png index 297f343..539812a 100644 Binary files a/artifacts/freighter_interior_workshop.png and b/artifacts/freighter_interior_workshop.png differ diff --git a/artifacts/freighter_menu_preview.log b/artifacts/freighter_menu_preview.log new file mode 100644 index 0000000..b68bc14 --- /dev/null +++ b/artifacts/freighter_menu_preview.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6570 +[MCPRegistry] runtime port 6570 registered for c:/users/tomek/documents/godot/randoloot +FREIGHTER INTERIOR PASS: 8 free replaceable rooms, duplicate construction, resource serialization, redocking persistence, real ship, workshop, repair, cargo and ESC/L diff --git a/artifacts/freighter_menu_preview_errors.log b/artifacts/freighter_menu_preview_errors.log new file mode 100644 index 0000000..aaf083f --- /dev/null +++ b/artifacts/freighter_menu_preview_errors.log @@ -0,0 +1,4 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/previews/freighter_interior_preview.gd:41) diff --git a/artifacts/freighter_operations_built.png b/artifacts/freighter_operations_built.png new file mode 100644 index 0000000..d455b80 Binary files /dev/null and b/artifacts/freighter_operations_built.png differ diff --git a/artifacts/freighter_operations_built.png.import b/artifacts/freighter_operations_built.png.import new file mode 100644 index 0000000..e09f968 --- /dev/null +++ b/artifacts/freighter_operations_built.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://jmfhutyn805d" +path="res://.godot/imported/freighter_operations_built.png-27b8554107b134ab4785f14778f84f0e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/freighter_operations_built.png" +dest_files=["res://.godot/imported/freighter_operations_built.png-27b8554107b134ab4785f14778f84f0e.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/artifacts/freighter_operations_errors.log b/artifacts/freighter_operations_errors.log new file mode 100644 index 0000000..aaf083f --- /dev/null +++ b/artifacts/freighter_operations_errors.log @@ -0,0 +1,4 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/previews/freighter_interior_preview.gd:41) diff --git a/artifacts/freighter_operations_hangar.png b/artifacts/freighter_operations_hangar.png new file mode 100644 index 0000000..4da0670 Binary files /dev/null and b/artifacts/freighter_operations_hangar.png differ diff --git a/artifacts/freighter_operations_hangar.png.import b/artifacts/freighter_operations_hangar.png.import new file mode 100644 index 0000000..3174d32 --- /dev/null +++ b/artifacts/freighter_operations_hangar.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chd0oupnukajr" +path="res://.godot/imported/freighter_operations_hangar.png-aa0f4b3cc7eaf58d5b3da4ce937e4a99.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/freighter_operations_hangar.png" +dest_files=["res://.godot/imported/freighter_operations_hangar.png-aa0f4b3cc7eaf58d5b3da4ce937e4a99.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/artifacts/freighter_operations_hangar_upgrades.png b/artifacts/freighter_operations_hangar_upgrades.png new file mode 100644 index 0000000..9490535 Binary files /dev/null and b/artifacts/freighter_operations_hangar_upgrades.png differ diff --git a/artifacts/freighter_operations_hangar_upgrades.png.import b/artifacts/freighter_operations_hangar_upgrades.png.import new file mode 100644 index 0000000..c564bb6 --- /dev/null +++ b/artifacts/freighter_operations_hangar_upgrades.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1n6gou8tawiq" +path="res://.godot/imported/freighter_operations_hangar_upgrades.png-6e52f07e5d519a36a07ab2b7b0fe5487.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/freighter_operations_hangar_upgrades.png" +dest_files=["res://.godot/imported/freighter_operations_hangar_upgrades.png-6e52f07e5d519a36a07ab2b7b0fe5487.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/artifacts/freighter_operations_overview.png b/artifacts/freighter_operations_overview.png new file mode 100644 index 0000000..99607d2 Binary files /dev/null and b/artifacts/freighter_operations_overview.png differ diff --git a/artifacts/freighter_operations_overview.png.import b/artifacts/freighter_operations_overview.png.import new file mode 100644 index 0000000..1a533f0 --- /dev/null +++ b/artifacts/freighter_operations_overview.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://usl8285d5le6" +path="res://.godot/imported/freighter_operations_overview.png-bfa84ddb16ea30a28e93e23c95cbe4c7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/freighter_operations_overview.png" +dest_files=["res://.godot/imported/freighter_operations_overview.png-bfa84ddb16ea30a28e93e23c95cbe4c7.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/artifacts/freighter_operations_renovation.png b/artifacts/freighter_operations_renovation.png new file mode 100644 index 0000000..09964cd Binary files /dev/null and b/artifacts/freighter_operations_renovation.png differ diff --git a/artifacts/freighter_operations_renovation.png.import b/artifacts/freighter_operations_renovation.png.import new file mode 100644 index 0000000..62e6e98 --- /dev/null +++ b/artifacts/freighter_operations_renovation.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btd1or6v03nyv" +path="res://.godot/imported/freighter_operations_renovation.png-3a85782614cb11f49cf385d27dfd492f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/freighter_operations_renovation.png" +dest_files=["res://.godot/imported/freighter_operations_renovation.png-3a85782614cb11f49cf385d27dfd492f.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/artifacts/freighter_operations_second_ship.png b/artifacts/freighter_operations_second_ship.png new file mode 100644 index 0000000..a7db876 Binary files /dev/null and b/artifacts/freighter_operations_second_ship.png differ diff --git a/artifacts/freighter_operations_second_ship.png.import b/artifacts/freighter_operations_second_ship.png.import new file mode 100644 index 0000000..1249819 --- /dev/null +++ b/artifacts/freighter_operations_second_ship.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ci5b4r3tfcblr" +path="res://.godot/imported/freighter_operations_second_ship.png-3ecb190a99250aa8c66c04890f7b5756.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/freighter_operations_second_ship.png" +dest_files=["res://.godot/imported/freighter_operations_second_ship.png-3ecb190a99250aa8c66c04890f7b5756.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/artifacts/freighter_operations_storage_menu.png b/artifacts/freighter_operations_storage_menu.png new file mode 100644 index 0000000..0f4aa90 Binary files /dev/null and b/artifacts/freighter_operations_storage_menu.png differ diff --git a/artifacts/freighter_operations_storage_menu.png.import b/artifacts/freighter_operations_storage_menu.png.import new file mode 100644 index 0000000..cd4cfe5 --- /dev/null +++ b/artifacts/freighter_operations_storage_menu.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4kfgsspnnfyo" +path="res://.godot/imported/freighter_operations_storage_menu.png-29fd96577097edce17f677614cdc8af2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/freighter_operations_storage_menu.png" +dest_files=["res://.godot/imported/freighter_operations_storage_menu.png-29fd96577097edce17f677614cdc8af2.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/artifacts/freighter_operations_test.log b/artifacts/freighter_operations_test.log new file mode 100644 index 0000000..e8b2c64 --- /dev/null +++ b/artifacts/freighter_operations_test.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6571 +[MCPRegistry] runtime port 6571 registered for c:/users/tomek/documents/godot/randoloot +FREIGHTER INTERIOR PASS: 8 free replaceable rooms, duplicate construction, resource serialization, redocking persistence, real ship, workshop, repair, cargo and ESC/L diff --git a/artifacts/freighter_operations_workshop.png b/artifacts/freighter_operations_workshop.png new file mode 100644 index 0000000..d705940 Binary files /dev/null and b/artifacts/freighter_operations_workshop.png differ diff --git a/artifacts/freighter_operations_workshop.png.import b/artifacts/freighter_operations_workshop.png.import new file mode 100644 index 0000000..cfb878e --- /dev/null +++ b/artifacts/freighter_operations_workshop.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dhmbpnspsw30j" +path="res://.godot/imported/freighter_operations_workshop.png-4170314eddeeae6f62989d4874ea0dd4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/freighter_operations_workshop.png" +dest_files=["res://.godot/imported/freighter_operations_workshop.png-4170314eddeeae6f62989d4874ea0dd4.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/artifacts/freighter_rework.log b/artifacts/freighter_rework.log new file mode 100644 index 0000000..b68bc14 --- /dev/null +++ b/artifacts/freighter_rework.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6570 +[MCPRegistry] runtime port 6570 registered for c:/users/tomek/documents/godot/randoloot +FREIGHTER INTERIOR PASS: 8 free replaceable rooms, duplicate construction, resource serialization, redocking persistence, real ship, workshop, repair, cargo and ESC/L diff --git a/artifacts/freighter_rework_errors.log b/artifacts/freighter_rework_errors.log new file mode 100644 index 0000000..2a08702 --- /dev/null +++ b/artifacts/freighter_rework_errors.log @@ -0,0 +1,14 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/previews/freighter_interior_preview.gd:41) +ERROR: Can't save PNG at path: 'res://artifacts/freighter_interior_renovation.png'. + at: save_image (drivers/png/resource_saver_png.cpp:56) + GDScript backtrace (most recent call first): + [0] capture (res://tests/previews/freighter_interior_preview.gd:12) + [1] settle (res://tests/previews/freighter_interior_preview.gd:8) +ERROR: Can't save PNG at path: 'res://artifacts/freighter_interior_built.png'. + at: save_image (drivers/png/resource_saver_png.cpp:56) + GDScript backtrace (most recent call first): + [0] capture (res://tests/previews/freighter_interior_preview.gd:12) + [1] settle (res://tests/previews/freighter_interior_preview.gd:8) diff --git a/artifacts/freighter_storage.png b/artifacts/freighter_storage.png index e09d3e5..dff032e 100644 Binary files a/artifacts/freighter_storage.png and b/artifacts/freighter_storage.png differ diff --git a/artifacts/freighter_storage_menu_errors.log b/artifacts/freighter_storage_menu_errors.log new file mode 100644 index 0000000..199319d --- /dev/null +++ b/artifacts/freighter_storage_menu_errors.log @@ -0,0 +1,4 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/ships/freighter_storage_test.gd:16) diff --git a/artifacts/freighter_storage_menu_test.log b/artifacts/freighter_storage_menu_test.log new file mode 100644 index 0000000..7752df9 --- /dev/null +++ b/artifacts/freighter_storage_menu_test.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6570 +[MCPRegistry] runtime port 6570 registered for c:/users/tomek/documents/godot/randoloot +FREIGHTER STORAGE PASS: 5 starting cargo cells, locked loot/drop, row costs/limits, construction, bidirectional transfers, full cargo, stale buttons, resource serialization, system persistence, new run reset diff --git a/artifacts/frigate_all_windows_review.png b/artifacts/frigate_all_windows_review.png new file mode 100644 index 0000000..d0fdf03 Binary files /dev/null and b/artifacts/frigate_all_windows_review.png differ diff --git a/artifacts/frigate_review_cabin_1_built.png b/artifacts/frigate_review_cabin_1_built.png new file mode 100644 index 0000000..5fdcc5e Binary files /dev/null and b/artifacts/frigate_review_cabin_1_built.png differ diff --git a/artifacts/frigate_review_cabin_1_initial.png b/artifacts/frigate_review_cabin_1_initial.png new file mode 100644 index 0000000..f4d4812 Binary files /dev/null and b/artifacts/frigate_review_cabin_1_initial.png differ diff --git a/artifacts/frigate_review_cabin_2_built.png b/artifacts/frigate_review_cabin_2_built.png new file mode 100644 index 0000000..dbc433b Binary files /dev/null and b/artifacts/frigate_review_cabin_2_built.png differ diff --git a/artifacts/frigate_review_cabin_2_initial.png b/artifacts/frigate_review_cabin_2_initial.png new file mode 100644 index 0000000..ddbf3c0 Binary files /dev/null and b/artifacts/frigate_review_cabin_2_initial.png differ diff --git a/artifacts/frigate_review_cabin_3_built.png b/artifacts/frigate_review_cabin_3_built.png new file mode 100644 index 0000000..13bf6a4 Binary files /dev/null and b/artifacts/frigate_review_cabin_3_built.png differ diff --git a/artifacts/frigate_review_cabin_3_initial.png b/artifacts/frigate_review_cabin_3_initial.png new file mode 100644 index 0000000..a3f4289 Binary files /dev/null and b/artifacts/frigate_review_cabin_3_initial.png differ diff --git a/artifacts/frigate_review_cabin_4_built.png b/artifacts/frigate_review_cabin_4_built.png new file mode 100644 index 0000000..35d78fe Binary files /dev/null and b/artifacts/frigate_review_cabin_4_built.png differ diff --git a/artifacts/frigate_review_cabin_4_initial.png b/artifacts/frigate_review_cabin_4_initial.png new file mode 100644 index 0000000..1305df0 Binary files /dev/null and b/artifacts/frigate_review_cabin_4_initial.png differ diff --git a/artifacts/frigate_review_cabin_5_built.png b/artifacts/frigate_review_cabin_5_built.png new file mode 100644 index 0000000..7957c5b Binary files /dev/null and b/artifacts/frigate_review_cabin_5_built.png differ diff --git a/artifacts/frigate_review_cabin_5_initial.png b/artifacts/frigate_review_cabin_5_initial.png new file mode 100644 index 0000000..55c4c58 Binary files /dev/null and b/artifacts/frigate_review_cabin_5_initial.png differ diff --git a/artifacts/frigate_review_command_initial.png b/artifacts/frigate_review_command_initial.png new file mode 100644 index 0000000..676c79b Binary files /dev/null and b/artifacts/frigate_review_command_initial.png differ diff --git a/artifacts/frigate_review_expansion_1_built.png b/artifacts/frigate_review_expansion_1_built.png new file mode 100644 index 0000000..e730d9d Binary files /dev/null and b/artifacts/frigate_review_expansion_1_built.png differ diff --git a/artifacts/frigate_review_expansion_1_initial.png b/artifacts/frigate_review_expansion_1_initial.png new file mode 100644 index 0000000..dd670a8 Binary files /dev/null and b/artifacts/frigate_review_expansion_1_initial.png differ diff --git a/artifacts/frigate_review_expansion_2_built.png b/artifacts/frigate_review_expansion_2_built.png new file mode 100644 index 0000000..cfca563 Binary files /dev/null and b/artifacts/frigate_review_expansion_2_built.png differ diff --git a/artifacts/frigate_review_expansion_2_initial.png b/artifacts/frigate_review_expansion_2_initial.png new file mode 100644 index 0000000..3baa94a Binary files /dev/null and b/artifacts/frigate_review_expansion_2_initial.png differ diff --git a/artifacts/frigate_review_expansion_3_built.png b/artifacts/frigate_review_expansion_3_built.png new file mode 100644 index 0000000..d457547 Binary files /dev/null and b/artifacts/frigate_review_expansion_3_built.png differ diff --git a/artifacts/frigate_review_expansion_3_initial.png b/artifacts/frigate_review_expansion_3_initial.png new file mode 100644 index 0000000..074b6a7 Binary files /dev/null and b/artifacts/frigate_review_expansion_3_initial.png differ diff --git a/artifacts/frigate_review_hangar_initial.png b/artifacts/frigate_review_hangar_initial.png new file mode 100644 index 0000000..b35bd2e Binary files /dev/null and b/artifacts/frigate_review_hangar_initial.png differ diff --git a/artifacts/frigate_review_hangar_single.png b/artifacts/frigate_review_hangar_single.png new file mode 100644 index 0000000..af84fed Binary files /dev/null and b/artifacts/frigate_review_hangar_single.png differ diff --git a/artifacts/frigate_review_storage_built.png b/artifacts/frigate_review_storage_built.png new file mode 100644 index 0000000..ca17231 Binary files /dev/null and b/artifacts/frigate_review_storage_built.png differ diff --git a/artifacts/frigate_review_workshop_initial.png b/artifacts/frigate_review_workshop_initial.png new file mode 100644 index 0000000..7be1df1 Binary files /dev/null and b/artifacts/frigate_review_workshop_initial.png differ diff --git a/artifacts/frigate_windows_final.log b/artifacts/frigate_windows_final.log new file mode 100644 index 0000000..427871f --- /dev/null +++ b/artifacts/frigate_windows_final.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6570 +[MCPRegistry] runtime port 6570 registered for c:/users/tomek/documents/godot/randoloot +FRIGATE WINDOWS PASS: 21 screenshots, all 11 sections plus built rooms, bounds, translucent windows/cards, hangar without tabs, visible controls, repair and three upgrades diff --git a/artifacts/frigate_windows_final_errors.log b/artifacts/frigate_windows_final_errors.log new file mode 100644 index 0000000..ba1bd30 --- /dev/null +++ b/artifacts/frigate_windows_final_errors.log @@ -0,0 +1,4 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/previews/freighter_windows_review.gd:44) diff --git a/artifacts/frigate_windows_review.log b/artifacts/frigate_windows_review.log new file mode 100644 index 0000000..427871f --- /dev/null +++ b/artifacts/frigate_windows_review.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6570 +[MCPRegistry] runtime port 6570 registered for c:/users/tomek/documents/godot/randoloot +FRIGATE WINDOWS PASS: 21 screenshots, all 11 sections plus built rooms, bounds, translucent windows/cards, hangar without tabs, visible controls, repair and three upgrades diff --git a/artifacts/frigate_windows_review_errors.log b/artifacts/frigate_windows_review_errors.log new file mode 100644 index 0000000..ba1bd30 --- /dev/null +++ b/artifacts/frigate_windows_review_errors.log @@ -0,0 +1,4 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/previews/freighter_windows_review.gd:44) diff --git a/artifacts/hangar_single_cargo.log b/artifacts/hangar_single_cargo.log new file mode 100644 index 0000000..a8c8660 --- /dev/null +++ b/artifacts/hangar_single_cargo.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6572 +[MCPRegistry] runtime port 6572 registered for c:/users/tomek/documents/godot/randoloot +FREIGHTER STORAGE PASS: 5 starting cargo cells, locked loot/drop, row costs/limits, construction, bidirectional transfers, full cargo, stale buttons, resource serialization, system persistence, new run reset diff --git a/artifacts/hangar_single_cargo_errors.log b/artifacts/hangar_single_cargo_errors.log new file mode 100644 index 0000000..199319d --- /dev/null +++ b/artifacts/hangar_single_cargo_errors.log @@ -0,0 +1,4 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/ships/freighter_storage_test.gd:16) diff --git a/artifacts/hangar_single_upgrade.log b/artifacts/hangar_single_upgrade.log new file mode 100644 index 0000000..1d45a80 --- /dev/null +++ b/artifacts/hangar_single_upgrade.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6571 +[MCPRegistry] runtime port 6571 registered for c:/users/tomek/documents/godot/randoloot +SLOT UNLOCK PASS: starter 1/1, locked mounting, dock requirement, affordability, hangar button, 10 iron per slot, limits 3/5, restart persistence, new run reset diff --git a/artifacts/hangar_single_upgrade_errors.log b/artifacts/hangar_single_upgrade_errors.log new file mode 100644 index 0000000..0af6cad --- /dev/null +++ b/artifacts/hangar_single_upgrade_errors.log @@ -0,0 +1,4 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/ships/slot_unlock_test.gd:10) diff --git a/artifacts/hangar_slot_unlock.png b/artifacts/hangar_slot_unlock.png index 738087d..3b9ca48 100644 Binary files a/artifacts/hangar_slot_unlock.png and b/artifacts/hangar_slot_unlock.png differ diff --git a/artifacts/poi_stage_cards.png b/artifacts/poi_stage_cards.png index 2bbf89e..ccf8f65 100644 Binary files a/artifacts/poi_stage_cards.png and b/artifacts/poi_stage_cards.png differ diff --git a/artifacts/poi_stage_cards_compact.png b/artifacts/poi_stage_cards_compact.png new file mode 100644 index 0000000..ccf8f65 Binary files /dev/null and b/artifacts/poi_stage_cards_compact.png differ diff --git a/artifacts/poi_stage_cards_compact.png.import b/artifacts/poi_stage_cards_compact.png.import new file mode 100644 index 0000000..a1c691c --- /dev/null +++ b/artifacts/poi_stage_cards_compact.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bi7fdo7a1f0wy" +path="res://.godot/imported/poi_stage_cards_compact.png-dff9448a96c6be697724427b4edf5e23.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://artifacts/poi_stage_cards_compact.png" +dest_files=["res://.godot/imported/poi_stage_cards_compact.png-dff9448a96c6be697724427b4edf5e23.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/artifacts/slot_unlock_menu_errors.log b/artifacts/slot_unlock_menu_errors.log new file mode 100644 index 0000000..0af6cad --- /dev/null +++ b/artifacts/slot_unlock_menu_errors.log @@ -0,0 +1,4 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/ships/slot_unlock_test.gd:10) diff --git a/artifacts/slot_unlock_menu_test.log b/artifacts/slot_unlock_menu_test.log new file mode 100644 index 0000000..1d45a80 --- /dev/null +++ b/artifacts/slot_unlock_menu_test.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6571 +[MCPRegistry] runtime port 6571 registered for c:/users/tomek/documents/godot/randoloot +SLOT UNLOCK PASS: starter 1/1, locked mounting, dock requirement, affordability, hangar button, 10 iron per slot, limits 3/5, restart persistence, new run reset diff --git a/artifacts/storage_slots_errors.log b/artifacts/storage_slots_errors.log new file mode 100644 index 0000000..199319d --- /dev/null +++ b/artifacts/storage_slots_errors.log @@ -0,0 +1,4 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/ships/freighter_storage_test.gd:16) diff --git a/artifacts/storage_slots_test.log b/artifacts/storage_slots_test.log new file mode 100644 index 0000000..a8c8660 --- /dev/null +++ b/artifacts/storage_slots_test.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6572 +[MCPRegistry] runtime port 6572 registered for c:/users/tomek/documents/godot/randoloot +FREIGHTER STORAGE PASS: 5 starting cargo cells, locked loot/drop, row costs/limits, construction, bidirectional transfers, full cargo, stale buttons, resource serialization, system persistence, new run reset diff --git a/artifacts/surface_event_fonts.log b/artifacts/surface_event_fonts.log new file mode 100644 index 0000000..274af55 --- /dev/null +++ b/artifacts/surface_event_fonts.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6570 +[MCPRegistry] runtime port 6570 registered for c:/users/tomek/documents/godot/randoloot +EVENT UI PASS: ten dialogs, auto-open, fixed reopened offers, purchase button, scan, evacuation, bounds, lethal damage diff --git a/artifacts/surface_event_fonts_errors.log b/artifacts/surface_event_fonts_errors.log new file mode 100644 index 0000000..e69de29 diff --git a/artifacts/surface_hud_preview.log b/artifacts/surface_hud_preview.log new file mode 100644 index 0000000..aaf6f7b --- /dev/null +++ b/artifacts/surface_hud_preview.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6570 +[MCPRegistry] runtime port 6570 registered for c:/users/tomek/documents/godot/randoloot +POI PRESENTATION PASS: 15 illustrated cards, compact layout, small-window scroll, mountain cave diff --git a/artifacts/surface_hud_preview_errors.log b/artifacts/surface_hud_preview_errors.log new file mode 100644 index 0000000..49b1ff9 --- /dev/null +++ b/artifacts/surface_hud_preview_errors.log @@ -0,0 +1,2 @@ +WARNING: 2 ObjectDB instances were leaked at exit (run with `--verbose` for details). + at: cleanup (core/object/object.cpp:2536) diff --git a/artifacts/workshop_compact.log b/artifacts/workshop_compact.log new file mode 100644 index 0000000..e8b2c64 --- /dev/null +++ b/artifacts/workshop_compact.log @@ -0,0 +1,7 @@ +Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org +OpenGL API 3.3.0 NVIDIA 610.88 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce RTX 4070 SUPER + +[MCPRuntimeServer] port: scanning 6570-6585 (default) +[MCPRuntimeServer] listening on 127.0.0.1:6571 +[MCPRegistry] runtime port 6571 registered for c:/users/tomek/documents/godot/randoloot +FREIGHTER INTERIOR PASS: 8 free replaceable rooms, duplicate construction, resource serialization, redocking persistence, real ship, workshop, repair, cargo and ESC/L diff --git a/artifacts/workshop_compact_errors.log b/artifacts/workshop_compact_errors.log new file mode 100644 index 0000000..aaf083f --- /dev/null +++ b/artifacts/workshop_compact_errors.log @@ -0,0 +1,4 @@ +WARNING: Camera2D overridden to physics process mode due to use of physics interpolation. + at: _update_process_callback (scene/2d/camera_2d.cpp:88) + GDScript backtrace (most recent call first): + [0] _ready (res://tests/previews/freighter_interior_preview.gd:41) diff --git a/assets/avatars/captain_equipment_PROMPTS.md b/assets/avatars/captain_equipment_PROMPTS.md new file mode 100644 index 0000000..5a8871c --- /dev/null +++ b/assets/avatars/captain_equipment_PROMPTS.md @@ -0,0 +1,14 @@ +# Captain equipment and unified skill artwork + +Created with built-in image_gen, 2026-10-18. + +Assets: `assets/icons/captain/unified_skills.png` (3×3 skill atlas), `assets/avatars/captain_full_body.png` (RGBA full body). +The skills share one visual style and cached 384px mipmapped runtime textures. Atlas source row boundaries are specified in CaptainSkills.icon so neighboring artwork never enters a skill tile. + +## Final skill icon prompt + +Create ONE square game skill icon atlas 1536x1536, EXACT 3x3 equal-cell grid, no gutters, no separators, no labels or text. All NINE icons have identical restrained dark charcoal navy background, SAME sculptural painted metallic emblem style, SAME close-up scale and lighting, a single bold centered object with 15 percent safe margins readable at 36px, realistic polished game icon quality. ABSOLUTELY no landscapes, scenes, people, portraits or environment. Each icon is an isolated inventory emblem. Row1 left BUSINESS: brass credit coin stack with a small shark-shaped embossed badge; center REACTOR OVERLOAD: compact titanium reactor core with bright cyan coil and restrained energy arcs; right TACTICAL MANEUVER: small silver spacecraft with one elegant curved violet evasion trail. Row2 left AMMO CONSERVATION: three brass cartridges and gunmetal magazine wrapped by one green recycling arrow; center MINER: industrial mining pick crossed over a copper ore nugget; right POWER REDIRECT: two compact metal emitters linked by a curved amber energy transfer arrow, cyan core. Row3 left LUCK: emerald and gold sculptural four-leaf clover; center EXPLORER: brass and titanium navigation compass with turquoise miniature planet; right ELECTRICIAN: heavy compact power battery with gold lightning bolt and cyan connectors. Cohesive detailed premium sci-fi RPG icons, visual clarity, same dark background in all cells, no frames, text, letters, numbers, UI or watermarks. + +## Final full-body prompt + +One full-body front-facing human space expedition captain character equipment-screen illustration, isolated on genuinely transparent background, vertical 2:3 composition. Entire head to boots visible with generous margin. Grounded realistic painterly science fiction RPG paper-doll character art, premium Diablo-style equipment screen pose, neutral strong stance arms slightly away from torso, hands relaxed, no held weapon. Mature male explorer with short dark hair, rugged face, wearing a fitted graphite and olive expedition undersuit, restrained worn titanium shoulder chest knee armor, practical harness, small amber details, belt pouches, heavy boots. Uncovered human face, no helmet, no mask, no cape. Character is a subdued tasteful dark silhouette with enough beautiful detail to read equipment locations; NOT a dramatic action pose, NOT comic style. Light from upper left, realistic fabric and metal materials, warm brass accents, muted teal fill, dark quiet palette, natural anatomy. Absolutely no background, scenery, interface, frames, text, labels or weapons, no extra characters. This full body image will stand between equipment slots in an inventory window. diff --git a/assets/avatars/captain_full_body.png b/assets/avatars/captain_full_body.png new file mode 100644 index 0000000..3712f3c Binary files /dev/null and b/assets/avatars/captain_full_body.png differ diff --git a/assets/avatars/captain_full_body.png.import b/assets/avatars/captain_full_body.png.import new file mode 100644 index 0000000..41b2ad8 --- /dev/null +++ b/assets/avatars/captain_full_body.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://boob3vhhf4sgb" +path="res://.godot/imported/captain_full_body.png-9a21b366c4690d619978f7b285dacc29.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/avatars/captain_full_body.png" +dest_files=["res://.godot/imported/captain_full_body.png-9a21b366c4690d619978f7b285dacc29.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=true +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/freighter/section_headers.png b/assets/freighter/section_headers.png new file mode 100644 index 0000000..fe8237e Binary files /dev/null and b/assets/freighter/section_headers.png differ diff --git a/assets/freighter/section_headers.png.import b/assets/freighter/section_headers.png.import new file mode 100644 index 0000000..bbf3d41 --- /dev/null +++ b/assets/freighter/section_headers.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dhorg0m7rl48q" +path="res://.godot/imported/section_headers.png-aa81577d87f0c2ba7a22e672de9ad282.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/freighter/section_headers.png" +dest_files=["res://.godot/imported/section_headers.png-aa81577d87f0c2ba7a22e672de9ad282.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=true +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/freighter/section_headers_PROMPT.md b/assets/freighter/section_headers_PROMPT.md new file mode 100644 index 0000000..a3752ce --- /dev/null +++ b/assets/freighter/section_headers_PROMPT.md @@ -0,0 +1,11 @@ +# Frigate section menu artwork + +Created with the built-in image_gen tool on 2026-10-18. +Saved asset: `assets/freighter/section_headers.png`. +Three illustrated headers, top to bottom: workshop, module storage, hangar. +Runtime atlas crops are in `scripts/planets/freighter_menu.gd`; mipmaps enabled. +The hangar menu additionally shows the actual player's ship texture separately. + +## Final prompt + +Create ONE game environment illustration atlas 1536x1024 landscape. Exactly THREE horizontal full-width panels stacked vertically, equal height, clean straight boundaries, no gutters no text no UI. Industrial believable frigate interior, cinematic painterly photorealism, graphite steel, worn olive cabinets, warm amber practical lamps, restrained teal indicator lights, subtle red hull accents, beautiful detailed realistic surfaces, no people. TOP THIRD: spacecraft workshop with a maintenance workbench, neatly arranged mechanical tools, protective breathing mask and armored suit components, cables, precision repair station, warm task lighting. MIDDLE THIRD: secure module storage room with organized metal shelving, crates holding compact shield generators and engine modules, cargo cases with colored small status lamps, orderly logistics bay. BOTTOM THIRD: spacious frigate hangar with one sleek small white-and-orange player shuttle parked on a landing pad, floor markings, mechanic trolley, hanging cables, large overhead beams, docking service atmosphere. No writing or readable labels, no logos, no holographic interfaces. Three distinct panoramic header illustrations for a premium game menu. Full bleed, strong lighting and meaningful focal point near center of each panel. diff --git a/assets/icons/captain/unified_skills.png b/assets/icons/captain/unified_skills.png new file mode 100644 index 0000000..9b6aa5a Binary files /dev/null and b/assets/icons/captain/unified_skills.png differ diff --git a/assets/icons/captain/unified_skills.png.import b/assets/icons/captain/unified_skills.png.import new file mode 100644 index 0000000..a192050 --- /dev/null +++ b/assets/icons/captain/unified_skills.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://blje18y8a4wl0" +path="res://.godot/imported/unified_skills.png-9510ba745dbb7b94aae6d945a98f0a22.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/icons/captain/unified_skills.png" +dest_files=["res://.godot/imported/unified_skills.png-9510ba745dbb7b94aae6d945a98f0a22.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/icons/cargo_crate.svg b/assets/icons/cargo_crate.svg new file mode 100644 index 0000000..f186085 --- /dev/null +++ b/assets/icons/cargo_crate.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/cargo_crate.svg.import b/assets/icons/cargo_crate.svg.import new file mode 100644 index 0000000..89bd3a5 --- /dev/null +++ b/assets/icons/cargo_crate.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bfca5tvsdq24" +path="res://.godot/imported/cargo_crate.svg-3a5a1d5d51e7d560c8867c66d68c31b2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/icons/cargo_crate.svg" +dest_files=["res://.godot/imported/cargo_crate.svg-3a5a1d5d51e7d560c8867c66d68c31b2.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/assets/planets/ui/PROMPT.md b/assets/planets/ui/PROMPT.md new file mode 100644 index 0000000..dd5d119 --- /dev/null +++ b/assets/planets/ui/PROMPT.md @@ -0,0 +1,10 @@ +# Planet telemetry artwork + +Generated using the built-in image_gen tool, 2026-10-18. +Saved project asset: `assets/planets/ui/planet_bezel.png` (RGBA with mipmaps). +The portrait inside the bezel is the actual planet texture passed by the landing +controller, not a newly generated replacement for the visited world. + +## Final prompt + +One premium game UI decorative circular planetary portrait frame on genuinely transparent background, square 1024x1024. A beautifully crafted expedition instrument bezel, thin layered weathered dark olive metal and aged brass ring, subtle engraved radial tick marks, four tiny restrained amber cardinal accents, precision mechanical screws and fine bevel highlights, earthy exploration journal aesthetic, realistic material, elegant understated detail, light from upper left. Center is a completely empty transparent circular hole covering 74 percent of full image width, absolutely no picture or planet inside. Outside ring fully transparent. Outer ring spans 92 percent image width, centered perfectly. No text, letters, numbers, words, labels, logos, symbols beyond short radial tick marks. No neon holograms. Clean smooth edges, designed to frame a small 90px planet portrait in an exploration game HUD. diff --git a/assets/planets/ui/planet_bezel.png b/assets/planets/ui/planet_bezel.png new file mode 100644 index 0000000..8c2c35c Binary files /dev/null and b/assets/planets/ui/planet_bezel.png differ diff --git a/assets/planets/ui/planet_bezel.png.import b/assets/planets/ui/planet_bezel.png.import new file mode 100644 index 0000000..8283404 --- /dev/null +++ b/assets/planets/ui/planet_bezel.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://caoebe0uhgsec" +path="res://.godot/imported/planet_bezel.png-fde88f91b380e7b480f42378e9c51571.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/planets/ui/planet_bezel.png" +dest_files=["res://.godot/imported/planet_bezel.png-fde88f91b380e7b480f42378e9c51571.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=true +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/planet_mechanic.txt b/planet_mechanic.txt index 7646903..b180c44 100644 --- a/planet_mechanic.txt +++ b/planet_mechanic.txt @@ -1017,3 +1017,124 @@ OPRAWA POI I JASKINIE — 2026-10-18 - Weryfikacja: poi_presentation_preview (15 kart, male okno), surface_poi_counts_test (64 mapy, zachowane kotwice gor), planet_expeditions_test. - Podglady: artifacts/cave_poi_window.png, cave_mountain_preview.png, poi_stage_cards.png. + +MENU SEKCJI FREGATY — 2026-10-18 +- Wspolna industrialna oprawa FreighterMenu: grafitowe panele, cieple akcenty, + prosta typografia, zwarte przyciski z hover/focus i stanami braku zasobow. +- Nowe ilustracje sekcji z mipmapami: assets/freighter/section_headers.png. + Pelny prompt i sposob utworzenia: assets/freighter/section_headers_PROMPT.md. +- Zakladki Warsztat / Magazyn / Hangar dostepne bez zamykania panelu. +- Warsztat: trzy zwarte karty z ikonami, zalozonym/docelowym poziomem, + receptura i przyciskiem wytworzenia. Rozwijana lista posiadanych przedmiotow. +- Hangar: grafika serwisu oraz dodatkowo prawdziwy sprite statku gracza. + Zakladka Serwis i odbior: HP, naprawa i modulowy lup. Zakladka Rozbudowa: + rzad ladowni, bron i rozszerzenia, wszystkie opcje widoczne na jednym ekranie. +- Magazyn: dwie listy Statek/Fregata, ikony i poziomy przedmiotow, bezposrednie + przyciski transferu, tooltipy. Przy szerokosci panelu <640 listy ukladaja sie pionowo. +- Panel Warsztatu/Hangaru ma do 490 px, magazyn do 700 px. Wysokosc do 600 px. + Lista przewijana wewnatrz panelu, naglowek i zakladki stale dostepne. +- Mechanika kosztow, slotow, napraw, craftingu, budowy i magazynu pozostaje ta sama. +- Testy graficzne: freighter_interior_preview (takze 640x600 i nawigacja), + freighter_storage_test (transfery, pelna ladownia, zapis) i slot_unlock_test przeszly. + +PANEL PLANETY I MNIEJSZE CZCIONKI — 2026-10-18 +- Okna POI: tytuly 20 px, tresc 12 px, etykiety 11 px, przyciski 12 px. + Spotkania ze znakiem zapytania tez korzystaja z mniejszych czcionek i przyciskow. +- Nowy panel PlanetTelemetry w lewym gornym rogu, szerokosc 350 px: + portret planety, mosiężna ramka, tytul, krajobraz/biom, osobne pola tlenu, + temperatury i biosfery, ryzyko i srednia szansa POI, pasek HP, energia, lup. +- Kontroler ladowania przekazuje dokladnie body_texture odwiedzanej planety. + Samodzielne podglady bez planety na orbicie maja deterministyczny fallback. +- Nowa grafika RGBA z mipmapami: assets/planets/ui/planet_bezel.png. + Pelny prompt narzedzia image_gen: assets/planets/ui/PROMPT.md. +- Tekst lupu ograniczony do trzech linii; pelny wykaz w tooltipie. +- Testy: planet_expeditions_test (zgodnosc portretu), poi_presentation_preview + (15 okien, rozmiary HUD/czcionek) oraz surface_events_preview (10 okien spotkan). + +EKWIPUNEK KAPITANA I UJEDNOLICONE IKONY — 2026-10-18 +- Klikniecie lewego panelu kapitana otwiera/zamyka osobne okno ekwipunku. + Przycisk Nowy poziom nadal otwiera wybor umiejetnosci. Okno nie pauzuje lotu. +- Usunieto stale widoczny pasek trzech slotow pod kapitanem. Cele leza teraz + bezposrednio pod jego glownym panelem. Kontroler CaptainEquipment pozostaje ukryty. +- Okno 650x510: pelna sylwetka postaci, slot oddychania/skafandra/broni, + plecak z nie zalozonym sprzetem, pole odkladania i podsumowanie ochrony. + Obsluga dwukliku, poprawnego/niepoprawnego dropu, zdejmowania, Escape i przesuwania. +- Rozmiar i skala okna dopasowuja sie do ekranu; FloatingWindows zachowuje focus + i pozycje przesunietego okna. Sygnatura odswiezania obejmuje tez gear_slots. +- Wszystkie 9 ikon CaptainSkills ma jeden styl i tlo, atlas unified_skills.png. + Katalog tworzy lokalne tekstury 384x384 z mipmapami tylko raz (cache); shadery + cooldownow zachowuja lokalne UV. Mechanika i wartosci umiejetnosci bez zmian. +- Nowa sylwetka RGBA: assets/avatars/captain_full_body.png. + Grafiki i pelne prompty image_gen: assets/avatars/captain_equipment_PROMPTS.md. +- Testy przeszly: captain_equipment_preview (rzeczywiste klikniecie, Escape, + sloty, plecak, dwuklik, drop, ochrona, zgodnosc i cache ikon) i planet_expeditions_test. +- Stary captain_skills_test ma nieaktualne oczekiwania niezalezne od grafiki: + 250 XP -> poziom 3 (obecnie potrzeba 120+180) oraz stare premie power_redirect + 0.5/0.9/1.5 zamiast obecnych 1.0/1.8/3.0. Nie zmieniano balansu ani tego testu. +- Podglady: artifacts/captain_equipment_redesign.png i captain_unified_skills.png. + +KOREKTA EKWIPUNKU KAPITANA — 2026-10-18 +- Szerokosc zmniejszona z 650 do 325 px; domyslne otwarcie bezposrednio pod + lewym panelem kapitana. Sylwetka i trzy sloty zostaja. +- Brak widocznego plecaka, listy zapasowego sprzetu i pola odkladania. + Istniejace przedmioty pozostaja w danych; zmiana sprzetu dostepna w Warsztacie. +- Test captain_equipment_preview: 325 px, polozenie pod panelem, brak plecaka, + zachowanie sprzetu, sloty i podsumowanie ochrony, klikniecie oraz Escape — PASS. + +UPROSZCZENIE PANELU KAPITANA — 2026-10-18 +- Okno 244x324 px, tej samej szerokosci co glowny panel kapitana. + Sylwetka 144x248, sloty 48x48, krotsze odstepy i podsumowanie ochrony. +- Usuniete zdania Zalozone wyposazenie oraz stopka Warsztatu. +- Brak napisow POZ. na ikonach. Poziom i ochrona pozostaja w tooltipie. +- Podglad/test przeszedl: szerokosc <=244, wysokosc <=330, polozenie pod panelem, + brak etykiety poziomu na ikonie i obecny poziom w podpowiedzi, sloty i Escape. + +WARSZTAT, ZASOBY I SLOTOWY MAGAZYN — 2026-10-18 +- Nad trzema slotami kapitana widoczne −N% redukcji zagrozenia (2 za poziom, + maksymalnie 100). Etykiety odswiezaja sie po zmianie przedmiotu. +- Usuniete nawigacyjne zakladki Warsztat/Magazyn/Hangar z okien sekcji. + Sekcje otwiera sie przez pomieszczenia pokladu. Mniejsze czcionki i ilustracje. +- Glowny HUD nie tworzy CraftingWindow i przycisku TWORZ. Pozostaje przycisk + umiejetnosci kapitana. Cala produkcja w Warsztacie fregaty: + amunicja/rakiety/radiacyjna, czesci/powerbanki oraz ekwipunek kapitana. + Receptury, koszty i wielkosci produkcji zachowane. Tooltip pokazuje koszt. +- Magazyn: dwa banki slotow 48x48, po 5 w rzedzie. Strzalka wskazuje transfer, + jeden klik przenosi konkretny przedmiot. Dostepne Odloz wszystko/Odbierz wszystko. + Zablokowane rzedy statku pozostaja oznaczone; pelna ladownia blokuje odbior. + Transfer korzysta z istniejacych kontroli indeksu, oczekiwanego przedmiotu, + zadokowania i zbudowanego skladu. Fregata nie otrzymuje sztucznego limitu miejsc. +- W magazynie takze zamontowane wyposazenie, sprzet kapitana, odzyskane moduly + oraz pelny przeglad: kredyty, czesci, 5 surowcow kosmicznych, 5 planetarnych, + amunicja, rakiety, radiacyjna, powerbanki i probki. Zapasy sa wspolne; brak + dodatkowego transferowania/wielokrotnego naliczania zasobow. +- Testy PASS: freighter_production_test (5 receptur, koszty, zapasy, bulk transfer), + freighter_storage_test (klikniecie slotow, pelna ladownia, stare przyciski, zapis), + captain_equipment_preview (wartosc nad slotem) i freighter_interior_preview. + +MINIMALNE KARTY PRODUKCJI — 2026-10-18 +- Produkty pokazywane jako ikona i licznik zapasu, bez nazw i napisu TWORZ. +- Przyciski +1 oraz +10 wytwarzaja 1 lub 10 partii dotychczasowej receptury. + Nazwa, liczba sztuk i laczny koszt w podpowiedzi. +10 wymaga pelnego kosztu; + brak wystarczajacych surowcow nie powoduje czesciowej produkcji ani oplaty. +- Ekwipunek kapitana: male kafle z ikona, obecnym/docelowym poziomem i +1. + Nazwa, koszt i informacja o zalozeniu przedmiotu w tooltipie. +- Usuniete ogolne opisy, dlugi wykaz surowcow i podpis ilustracji warsztatu. +- Testy +1/+10 dla wszystkich 5 receptur, dokladnych kosztow i braku czesciowej + produkcji oraz graficzny test warsztatu/wyposazenia przeszly. + +HANGAR BEZ ZAKLADEK I PRZEGLAD OKIEN — 2026-10-18 +- Jeden Hangar: naprawa lądownika, rozbudowa ładowni/broni/rozszerzen i odbior + odzyskanych modulow. Brak zakladek Serwis/Rozbudowa i zmiennej hangar_page. +- Zwarte kafle: ikony 26-34 px, krotkie nazwy, liczniki, koszt z ikona surowca, + male Napraw/Odbierz/+1. Koszty i zasady napraw/rozbudowy pozostaja bez zmian. +- Hangar do 440x420 px; Warsztat do 490x520; mniejsze sekcje do 490x260, + centrum dowodzenia do 490x300. Magazyn nadal przewijany z wieksza powierzchnia. +- Wszystkie ramki sekcji: tlo alpha 0.86. Karty alpha 0.70; przyciski 0.92, + sloty magazynu 0.85. Ilustracje pozostaja czytelne i nie rozmywaja sie. +- Przyciski nie zawijaja krotkich napisow. Koszt naprawy wyswietlany w jednej linii. +- Przeglad graficzny freighter_windows_review: 21 zrzutow, wszystkie 11 sekcji, + pokoje przed i po budowie, granice okien, przezroczystosc kart/paneli, widocznosc + wszystkich akcji Hangaru, naprawa i trzy rozbudowy — PASS. +- Regresja slot_unlock_test i freighter_storage_test — PASS. +- Podglad: artifacts/frigate_review_hangar_single.png. + Pelny przeglad: artifacts/frigate_all_windows_review.png. diff --git a/scripts/captain/captain_skills.gd b/scripts/captain/captain_skills.gd index 9ad3604..245457b 100644 --- a/scripts/captain/captain_skills.gd +++ b/scripts/captain/captain_skills.gd @@ -1,6 +1,7 @@ extends RefCounted const MAX_RANK := 3 +static var _icon_cache: Dictionary = {} const COOLDOWN := 30.0 const DURATION := 5.0 const IDS := ["business_shark", "reactor_overload", "tactical_maneuver", "efficient_magazine", "miner", "power_redirect", "lucky", "explorer", "electrician"] @@ -25,7 +26,20 @@ static func duration(skill: String) -> float: return 15.0 if skill == "reactor_overload" else (7.0 if skill == "power_redirect" else DURATION) static func icon(skill: String) -> Texture2D: - return load("res://assets/icons/captain/%s.png" % skill) as Texture2D + if skill not in IDS: return null + if not _icon_cache.has(skill): + var atlas: Texture2D = load("res://assets/icons/captain/unified_skills.png") + var cell := atlas.get_size()/3.0 + var index := IDS.find(skill) + var row := index/3 + var rows := [0.0,0.313,0.635,1.0] + var region := Rect2i(Vector2(index%3*cell.x+4,rows[row]*atlas.get_height()+4),Vector2(cell.x-8,(rows[row+1]-rows[row])*atlas.get_height()-8)) + var image := atlas.get_image().get_region(region) + image.resize(384,384,Image.INTERPOLATE_LANCZOS) + image.generate_mipmaps() + # Separate cached textures keep UV-based cooldown/rounded-corner shaders local. + _icon_cache[skill] = ImageTexture.create_from_image(image) + return _icon_cache[skill] static func description(skill: String, rank: int) -> String: var amount := roundi(value(skill, rank) * 100.0) diff --git a/scripts/game/flight_hud.gd b/scripts/game/flight_hud.gd index 8459874..035dbe8 100644 --- a/scripts/game/flight_hud.gd +++ b/scripts/game/flight_hud.gd @@ -32,7 +32,6 @@ var _debug_item_button: Button var _debug_item_status: Label var _captain_panel: PanelContainer var _cockpit: Control -var _crafting_window: PanelContainer var _captain_skills_ui: CanvasLayer func _create_navigation() -> void: @@ -40,80 +39,22 @@ func _create_navigation() -> void: navigation.name = "TopNavigation" $HUDRoot.add_child(navigation) navigation.set_anchors_and_offsets_preset(Control.PRESET_CENTER_TOP) - navigation.offset_left = -70 - navigation.offset_right = 70 + navigation.offset_left = -32 + navigation.offset_right = 32 navigation.offset_top = 12 navigation.offset_bottom = 92 navigation.add_theme_constant_override("separation", 10) - _crafting_window = _create_window("CraftingWindow", "WARSZTAT", Vector2(704, 420)) - var crafting := PanelContainer.new() - crafting.name = "CraftingPanel" - crafting.set_script(preload("res://scripts/ui/ship_crafting_panel.gd")) - crafting.set("standalone", true) - _crafting_window.get_node("Contents").add_child(crafting) _captain_skills_ui = CanvasLayer.new() _captain_skills_ui.set_script(preload("res://scripts/ui/captain_skills_ui.gd")) _captain_skills_ui.set("player", player) add_child(_captain_skills_ui) - for entry in [["Twórz", _crafting_window, "res://assets/icons/ui/crafting_art.png", Color("efb568")], ["Umiejętności kapitana", null, "res://assets/icons/ui/captain_skills_art.png", Color("b9a0ef")]]: - var button := Button.new() - button.tooltip_text = entry[0] - button.set_script(preload("res://scripts/ui/navigation_button.gd")) - button.call("configure_navigation", load(entry[2]) as Texture2D, entry[3], "TWÓRZ" if entry[1] != null else "KAPITAN") - navigation.add_child(button) - if entry[1] == null: - button.name = "OpenCaptainSkills" - button.pressed.connect(func() -> void: - _crafting_window.hide() - _captain_skills_ui.call("open_management") - ) - else: - button.pressed.connect(_toggle_window.bind(entry[1])) - -func _create_window(node_name: String, title: String, dimensions: Vector2) -> PanelContainer: - var window := PanelContainer.new() - window.name = node_name - window.z_index = RENDER_LAYERS.WINDOW_Z - var style := StyleBoxFlat.new() - style.bg_color = Color("0b1520") - style.border_color = Color("376779") - style.set_border_width_all(1) - style.set_corner_radius_all(8) - style.set_content_margin_all(16) - window.add_theme_stylebox_override("panel", style) - $HUDRoot.add_child(window) - window.set_anchors_and_offsets_preset(Control.PRESET_CENTER) - window.offset_left = -dimensions.x * 0.5 - window.offset_right = dimensions.x * 0.5 - window.offset_top = -dimensions.y * 0.5 - window.offset_bottom = dimensions.y * 0.5 - var contents := VBoxContainer.new() - contents.name = "Contents" - contents.add_theme_constant_override("separation", 12) - window.add_child(contents) - var header := HBoxContainer.new() - header.name = "Header" - contents.add_child(header) - var label := Label.new() - label.text = title - label.add_theme_font_size_override("font_size", 14) - label.add_theme_color_override("font_color", Color("91dbea")) - label.size_flags_horizontal = Control.SIZE_EXPAND_FILL - header.add_child(label) - var close := Button.new() - close.text = "×" - close.tooltip_text = "Zamknij" - close.custom_minimum_size = Vector2(32, 28) - close.pressed.connect(window.hide) - header.add_child(close) - window.hide() - _window_manager.call("register_window", window, window, header) - return window - -func _toggle_window(window: PanelContainer) -> void: - var opening := not window.visible - _crafting_window.hide() - window.visible = opening + var button := Button.new() + button.name = "OpenCaptainSkills" + button.tooltip_text = "Umiejętności kapitana" + button.set_script(preload("res://scripts/ui/navigation_button.gd")) + button.configure_navigation(load("res://assets/icons/ui/captain_skills_art.png"),Color("b9a0ef"),"KAPITAN") + navigation.add_child(button) + button.pressed.connect(func(): _captain_skills_ui.open_management()) func _ready() -> void: layer = RENDER_LAYERS.HUD @@ -180,6 +121,7 @@ func _create_sidebar() -> void: captain_gear.name = "CaptainEquipment" captain_gear.set_script(preload("res://scripts/ui/captain_equipment_panel.gd")) $HUDRoot.add_child(captain_gear) + _captain_panel.equipment_requested.connect(captain_gear._toggle_wardrobe) _passive_captain_panel = _create_passive_panel("PassiveCaptainPanel", "KAPITAN · PASYWNE") _passive_skills = _passive_captain_panel.get_node("Contents/Icons") as GridContainer _passive_skills.name = "PassiveCaptainSkills" diff --git a/scripts/planets/expedition_controller.gd b/scripts/planets/expedition_controller.gd index 5a6e62d..a62afe7 100644 --- a/scripts/planets/expedition_controller.gd +++ b/scripts/planets/expedition_controller.gd @@ -210,6 +210,7 @@ func land_nearby() -> void: screen.captain = GameState.captain screen.progress = progress screen.flight_ship = player + screen.planet_texture = _near_planet.body_texture screen.finished.connect(finish_surface) _layer.add_child(screen) diff --git a/scripts/planets/freighter_menu.gd b/scripts/planets/freighter_menu.gd new file mode 100644 index 0000000..e44e95f --- /dev/null +++ b/scripts/planets/freighter_menu.gd @@ -0,0 +1,101 @@ +extends RefCounted +## Compact industrial service UI shared by the three operational rooms. +const TEXT := Color("dce1dc") +const MUTED := Color("8faaa7") +const GOLD := Color("dfb775") +const ORDER := ["workshop","storage","hangar"] + +static func style(panel: PanelContainer, inset := 12, opacity := 0.86) -> void: + var box := StyleBoxFlat.new() + box.bg_color = Color(Color("131e23"),opacity) + box.border_color = Color("536463") + box.set_border_width_all(1) + box.set_corner_radius_all(7) + box.set_content_margin_all(inset) + box.shadow_color = Color(0,0,0,0.4) + box.shadow_size = 10 + panel.add_theme_stylebox_override("panel",box) + +static func label(parent: Node, value: String, font_size := 13, color := TEXT) -> Label: + var node := Label.new() + node.text = value + node.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + node.add_theme_font_override("font",ThemeDB.fallback_font) + node.add_theme_font_size_override("font_size",maxi(10,font_size-2)) + node.add_theme_color_override("font_color",color) + parent.add_child(node) + return node + +static func button(parent: Node, value: String, action: Callable, primary := false) -> Button: + var node := Button.new() + node.text = value + node.autowrap_mode = TextServer.AUTOWRAP_OFF + node.custom_minimum_size.y = 32 + node.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND + node.add_theme_font_override("font",ThemeDB.fallback_font) + node.add_theme_font_size_override("font_size",11) + node.add_theme_color_override("font_color",TEXT) + node.add_theme_color_override("font_disabled_color",Color("6c7b7a")) + for state in ["normal","hover","pressed","disabled","focus"]: + var box := StyleBoxFlat.new() + box.bg_color = Color("425a57") if primary else Color("25343b") + if state == "hover": box.bg_color = Color("526b64") + if state == "pressed": box.bg_color = Color("354b46") + if state == "disabled": box.bg_color = Color("1b272c") + box.bg_color.a = 0.92 + box.border_color = GOLD if primary else Color("4b6569") + if state == "focus": box.border_color = GOLD + box.set_border_width_all(1) + box.set_corner_radius_all(4) + box.content_margin_left = 10 + box.content_margin_right = 10 + box.content_margin_top = 5 + box.content_margin_bottom = 5 + node.add_theme_stylebox_override(state,box) + node.pressed.connect(action) + parent.add_child(node) + return node + +static func row(parent: Node) -> HBoxContainer: + var node := HBoxContainer.new() + node.add_theme_constant_override("separation",10) + parent.add_child(node) + return node + +static func card(parent: Node) -> VBoxContainer: + var panel := PanelContainer.new() + panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL + style(panel,10,0.70) + parent.add_child(panel) + var stack := VBoxContainer.new() + stack.add_theme_constant_override("separation",6) + panel.add_child(stack) + return stack + +static func icon(parent: Node, texture: Texture2D, edge := 40) -> TextureRect: + var node := TextureRect.new() + node.texture = texture + node.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + node.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + node.custom_minimum_size = Vector2(edge,edge) + node.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS + parent.add_child(node) + return node + +static func hero(parent: Node, section: String, subtitle: String) -> void: + var texture: Texture2D = load("res://assets/freighter/section_headers.png") + var image := AtlasTexture.new() + image.atlas = texture + var extent := Vector2(texture.get_size()) + var rows := [0.0,0.318,0.637,1.0] + var index := ORDER.find(section) + image.region = Rect2(Vector2(3,rows[index]*extent.y+3),Vector2(extent.x-6,(rows[index+1]-rows[index])*extent.y-6)) + image.filter_clip = true + var art := TextureRect.new() + art.texture = image + art.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + art.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_COVERED + art.custom_minimum_size.y = 76 if section != "storage" else 64 + art.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS + parent.add_child(art) + if not subtitle.is_empty(): label(parent,subtitle,12,MUTED) diff --git a/scripts/planets/freighter_menu.gd.uid b/scripts/planets/freighter_menu.gd.uid new file mode 100644 index 0000000..65b15d0 --- /dev/null +++ b/scripts/planets/freighter_menu.gd.uid @@ -0,0 +1 @@ +uid://b8o3ofeihs0s diff --git a/scripts/planets/freighter_screen.gd b/scripts/planets/freighter_screen.gd index 87bdf7a..065ff16 100644 --- a/scripts/planets/freighter_screen.gd +++ b/scripts/planets/freighter_screen.gd @@ -1,7 +1,9 @@ extends Control signal closed const UI := preload("res://scripts/planets/expedition_ui.gd") +const MENU := preload("res://scripts/planets/freighter_menu.gd") const GEAR := preload("res://scripts/planets/captain_equipment.gd") +const RECIPES := preload("res://scripts/items/crafting_recipes.gd") const CATALOG := preload("res://scripts/game/ship_catalog.gd") var captain: Resource var inventory: Node @@ -12,6 +14,8 @@ var _drawer_title: Label var _wallet: Label var _hint: Label var _owned_open := false +var _storage_columns: GridContainer +var _storage_notice := "" @onready var deck: Control = $Deck @onready var _audio: Node = $FreighterAudio @@ -51,12 +55,17 @@ func _build_header() -> void: var heading := VBoxContainer.new() heading.size_flags_horizontal = Control.SIZE_EXPAND_FILL header.add_child(heading) - UI.label(heading,"FREGATA / POKŁAD OPERACYJNY",24,Color("e3e9e8")) - UI.label(heading,"01 / POKŁAD GŁÓWNY · POŁĄCZENIE ZABEZPIECZONE",11,Color("77969f")) - _wallet = UI.label(header,"",13,Color("c9aa7c")) + MENU.label(heading,"FREGATA / POKŁAD OPERACYJNY",24,Color("e3e9e8")) + MENU.label(heading,"01 / POKŁAD GŁÓWNY · POŁĄCZENIE ZABEZPIECZONE",11,Color("77969f")) + _wallet = MENU.label(header,"",13,Color("c9aa7c")) + _wallet.custom_minimum_size.x = 150 _wallet.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - UI.button(header,"MAGAZYN",func(): _select_section("storage")) - UI.button(header,"ODLOT [L]",func(): closed.emit()) + var storage_button := MENU.button(header,"MAGAZYN",func(): _select_section("storage")) + storage_button.custom_minimum_size.x = 100 + storage_button.size_flags_vertical = Control.SIZE_SHRINK_CENTER + var leave := MENU.button(header,"ODLOT [L]",func(): closed.emit()) + leave.custom_minimum_size.x = 110 + leave.size_flags_vertical = Control.SIZE_SHRINK_CENTER func _build_footer() -> void: var footer := HBoxContainer.new() @@ -67,23 +76,24 @@ func _build_footer() -> void: footer.offset_top = -43 footer.offset_bottom = -12 add_child(footer) - _hint = UI.label(footer,"Wybierz pomieszczenie na pokładzie. · Warsztat i hangar są dostępne.",12,Color("91a9ae")) + _hint = MENU.label(footer,"Wybierz pomieszczenie na pokładzie. · Warsztat i hangar są dostępne.",12,Color("91a9ae")) _hint.size_flags_horizontal = Control.SIZE_EXPAND_FILL footer.add_theme_constant_override("separation",18) - UI.label(footer,"● OPERACYJNE",11,Color("79d9d8")) - UI.label(footer,"● W REMONCIE",11,Color("bca078")) + MENU.label(footer,"● OPERACYJNE",11,Color("79d9d8")).custom_minimum_size.x = 110 + MENU.label(footer,"● W REMONCIE",11,Color("bca078")).custom_minimum_size.x = 110 func _build_drawer() -> void: _drawer = UI.panel(self) _drawer.name = "SectionPanel" + MENU.style(_drawer) var stack := VBoxContainer.new() - stack.add_theme_constant_override("separation",14) + stack.add_theme_constant_override("separation",8) _drawer.add_child(stack) var row := HBoxContainer.new() stack.add_child(row) - _drawer_title = UI.label(row,"",20,UI.CYAN) + _drawer_title = MENU.label(row,"",18,MENU.GOLD) _drawer_title.size_flags_horizontal = Control.SIZE_EXPAND_FILL - UI.button(row,"×",_close_section) + MENU.button(row,"×",_close_section).custom_minimum_size.x = 32 var scroll := ScrollContainer.new() scroll.name = "SectionScroll" scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED @@ -91,15 +101,19 @@ func _build_drawer() -> void: stack.add_child(scroll) _content = VBoxContainer.new() _content.size_flags_horizontal = Control.SIZE_EXPAND_FILL - _content.add_theme_constant_override("separation",14) + _content.add_theme_constant_override("separation",8) scroll.add_child(_content) func _layout() -> void: if not is_instance_valid(_drawer): return var viewport_size := size - var width := minf(760 if _tab == "storage" or (_tab == "expansion_3" and deck.is_built(_tab)) else 460,viewport_size.x-40) - _drawer.position = Vector2(20 if _tab == "hangar" else viewport_size.x-width-20,94) - _drawer.size = Vector2(width,maxf(240,viewport_size.y-154)) + var storage: bool = _tab == "storage" or (_tab == "expansion_3" and deck.is_built(_tab)) + var width := minf(700 if storage else (440 if _tab == "hangar" else 490),viewport_size.x-32) + var target_height := 420 if _tab == "hangar" else (520 if _tab == "workshop" else (600 if storage else (300 if _tab == "command" else 260))) + var height := minf(target_height,maxf(240,viewport_size.y-140)) + _drawer.position = Vector2(16 if _tab == "hangar" else viewport_size.x-width-16,maxf(90,(viewport_size.y-height)*0.5)) + _drawer.size = Vector2(width,height) + if is_instance_valid(_storage_columns): _storage_columns.columns = 2 if width >= 640 else 1 func _sync_header() -> void: if is_instance_valid(_wallet): @@ -113,6 +127,7 @@ func _select_section(section: String) -> void: var room: Dictionary = deck.room("expansion_3" if section == "storage" else section) var pan: float = 0.0 if room.is_empty() else ((room.rect as Rect2).get_center().x / deck.DESIGN_SIZE.x - 0.5)*1.4 _audio.enter_section(section,pan) + _storage_notice = "" _tab = section deck.selected = section _refresh() @@ -139,11 +154,12 @@ func _input(event: InputEvent) -> void: closed.emit() func _label(text: String, size_value := 14, color := Color("c5d3d7")) -> Label: - var node := UI.label(_content,text,size_value,color) + var node := MENU.label(_content,text,size_value,color) node.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART return node func _refresh() -> void: + _storage_columns = null _audio.set_maintenance_needed(captain.expedition.lander_hp < 30) for child in _content.get_children(): _content.remove_child(child) @@ -186,8 +202,8 @@ func _build_room() -> void: _label("Pomieszczenie jest wyposażone. Jego mechanika zostanie dodana w kolejnym etapie.",14,Color("849da5")) else: _label("Budowa jest teraz bezpłatna. Wyposażenie pojawi się od razu na pokładzie.",14,Color("849da5")) - UI.button(_content,"ZBUDUJ · BEZ KOSZTÓW",_construct_room.bind(_tab)) - UI.button(_content,"Wróć na pokład",_close_section) + MENU.button(_content,"ZBUDUJ · BEZ KOSZTÓW",_construct_room.bind(_tab)) + MENU.button(_content,"Wróć na pokład",_close_section) func _construct_room(id: String) -> void: if not deck.is_buildable(id) or deck.is_built(id): return @@ -200,113 +216,209 @@ func _construct_room(id: String) -> void: func _build_hangar() -> void: var progress: Resource = captain.expedition - _build_slot_upgrades() - _label("ZADOKOWANO / "+deck.ship_name.to_upper(),15,Color("8bd9d0")) - _label("Twój statek stoi na stanowisku serwisowym. Obsługa lądownika i odbiór odzyskanych modułów są dostępne poniżej.") - _label("Lądownik: %d / 100 HP" % ceili(progress.lander_hp),18) + MENU.hero(_content,"hangar","") + var ship_row := MENU.row(_content) + MENU.icon(ship_row,deck.ship_texture,32) + var ship_text := VBoxContainer.new() + ship_text.size_flags_horizontal = Control.SIZE_EXPAND_FILL + ship_row.add_child(ship_text) + MENU.label(ship_text,deck.ship_name,15,MENU.GOLD) + MENU.label(ship_text,"Żelazo %d · Części %d" % [int(captain.minerals.get("iron",0)),int(captain.parts)],12,MENU.MUTED) + var service := MENU.card(_content) + MENU.style(service.get_parent(),8,0.70) + var row := MENU.row(service) + MENU.icon(row,preload("res://assets/planets/lander.png"),34) + var info := VBoxContainer.new() + info.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row.add_child(info) + MENU.label(info,"Lądownik · %d%%" % ceili(progress.lander_hp),13,MENU.GOLD) var bar := ProgressBar.new() bar.value = progress.lander_hp - bar.custom_minimum_size.y = 17 - _content.add_child(bar) + bar.show_percentage = false + bar.custom_minimum_size.y = 5 + var fill := StyleBoxFlat.new() + fill.bg_color = Color("85b7a0") + fill.set_corner_radius_all(3) + bar.add_theme_stylebox_override("fill",fill) + info.add_child(bar) var cost: int = progress.repair_cost() - _label("Części: %d · potrzebne do naprawy: %d" % [captain.parts,cost],13) - var repair := UI.button(_content,"NAPRAW DO 100%% · %d części" % cost,func(): + var cost_row := MENU.row(info) + MENU.icon(cost_row,RECIPES.icon("parts"),14) + var repair_cost := MENU.label(cost_row,str(cost),11,MENU.MUTED) + repair_cost.name = "RepairCost" + repair_cost.autowrap_mode = TextServer.AUTOWRAP_OFF + var repair := MENU.button(row,"Napraw",func(): if progress.repair(captain): _audio.service_completed(0.65) - _refresh()) + _refresh(),true) + repair.name = "RepairLander" + repair.custom_minimum_size = Vector2(58,26) + repair.size_flags_vertical = Control.SIZE_SHRINK_CENTER + repair.tooltip_text = "Napraw do 100%% · koszt %d części. Pełny kadłub wymagany do lądowania." % cost repair.disabled = cost == 0 or captain.parts < cost - _label("1 część przywraca 1 punkt procentowy HP lądownika. Do następnego lądowania wymagany jest pełny kadłub.",13,Color("819ca5")) - _label("MODUŁY DO ODEBRANIA: %d" % progress.delivered_modules.size(),16,UI.CYAN) - var delivery := UI.button(_content,"ODBIERZ DO ŁADOWNI STATKU",func(): + _build_slot_upgrades() + var delivery := MENU.card(_content) + MENU.style(delivery.get_parent(),8,0.70) + var delivery_row := MENU.row(delivery) + MENU.icon(delivery_row,preload("res://assets/icons/shield.png"),24) + var label := MENU.label(delivery_row,"Odzyskane moduły · %d" % progress.delivered_modules.size(),12,MENU.MUTED) + label.size_flags_horizontal = Control.SIZE_EXPAND_FILL + var take := MENU.button(delivery_row,"Odbierz",func(): if is_instance_valid(inventory): progress.deliver_modules(inventory) _refresh()) - delivery.disabled = progress.delivered_modules.is_empty() or not is_instance_valid(inventory) - _label("Moduły bez miejsca w ładowni pozostają bezpiecznie na pokładzie.",13,Color("819ca5")) + take.name = "CollectRecovered" + take.custom_minimum_size = Vector2(58,26) + take.tooltip_text = "Odbierz do ładowni statku. Przedmioty bez miejsca pozostają na fregacie." + take.disabled = progress.delivered_modules.is_empty() or not is_instance_valid(inventory) func _build_slot_upgrades() -> void: - _label("ROZBUDOWA SLOTÓW STATKU",17,UI.CYAN) if not is_instance_valid(inventory): - _label("Zadokuj swoim statkiem, aby rozbudować sloty.") + _label("Zadokuj statkiem, aby rozbudować sloty.",12,MENU.MUTED) return - _label("Żelazo: %d · koszt kolejnego slotu: 10" % int(captain.minerals.get("iron",0)),14) - _label("Ładownia: %d / %d miejsc · rzędy %d / %d" % [inventory.get_cargo_capacity(),inventory.CARGO_SIZE,inventory.unlocked_cargo_rows,inventory.CARGO_ROW_COUNT],14) - if inventory.unlocked_cargo_rows < inventory.CARGO_ROW_COUNT: - var cargo_unlock := UI.button(_content,"ODBLOKUJ RZĄD ŁADOWNI · 10 żelaza",func(): - inventory.unlock_cargo_row(captain) - _refresh()) - cargo_unlock.disabled = not inventory.can_unlock_cargo_row(captain) - else: - _label("Wszystkie rzędy ładowni odblokowane.",13,Color("849da5")) - for kind in ["weapon","extension"]: - var count: int = inventory.unlocked_weapon_slots if kind == "weapon" else inventory.unlocked_extension_slots - var limit: int = inventory.WEAPON_SLOT_COUNT if kind == "weapon" else inventory.EXTENSION_SLOT_COUNT - var title := "BRONI" if kind == "weapon" else "ROZSZERZENIA" - _label("Sloty %s: %d / %d" % [title.to_lower(),count,limit],14) - if count < limit: - var unlock := UI.button(_content,"ODBLOKUJ SLOT %s · 10 żelaza" % title,_unlock_ship_slot.bind(kind)) - unlock.disabled = not inventory.can_unlock_slot(kind,captain) - else: - _label("Wszystkie sloty odblokowane.",13,Color("849da5")) + _label("ROZBUDOWA STATKU",13,MENU.GOLD) + var grid := GridContainer.new() + grid.columns = 3 + grid.add_theme_constant_override("h_separation",6) + _content.add_child(grid) + for kind in ["cargo","weapon","extension"]: + var count: int = inventory.unlocked_cargo_rows if kind == "cargo" else (inventory.unlocked_weapon_slots if kind == "weapon" else inventory.unlocked_extension_slots) + var limit: int = inventory.CARGO_ROW_COUNT if kind == "cargo" else (inventory.WEAPON_SLOT_COUNT if kind == "weapon" else inventory.EXTENSION_SLOT_COUNT) + var card := MENU.card(grid) + MENU.style(card.get_parent(),6,0.70) + card.add_theme_constant_override("separation",4) + var row := MENU.row(card) + row.add_theme_constant_override("separation",5) + var icons := {"cargo":"res://assets/icons/cargo_crate.svg","weapon":"res://assets/icons/machine_gun.png","extension":"res://assets/icons/computer.png"} + MENU.icon(row,load(icons[kind]),26) + var title := VBoxContainer.new() + title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row.add_child(title) + MENU.label(title,{"cargo":"Ładownia","weapon":"Broń","extension":"Rozszerzenia"}[kind],11,MENU.TEXT) + MENU.label(title,"%d / %d" % [count,limit],11,MENU.MUTED) + var action := MENU.row(card) + action.add_theme_constant_override("separation",4) + MENU.icon(action,RECIPES.icon("iron"),14) + var price := MENU.label(action,"10",11,MENU.MUTED) + price.size_flags_horizontal = Control.SIZE_EXPAND_FILL + var unlock := MENU.button(action,"+1" if count < limit else "✓",_unlock_ship_slot.bind(kind),true) + unlock.name = "Unlock"+kind.capitalize() + unlock.custom_minimum_size = Vector2(30,24) + unlock.tooltip_text = "Osiągnięto limit." if count >= limit else "Odblokuj %s · koszt 10 żelaza." % ("rząd ładowni (+5 miejsc)" if kind == "cargo" else "kolejny slot") + unlock.disabled = not (inventory.can_unlock_cargo_row(captain) if kind == "cargo" else inventory.can_unlock_slot(kind,captain)) func _unlock_ship_slot(kind: String) -> void: - if is_instance_valid(inventory): inventory.unlock_slot(kind,captain) + if is_instance_valid(inventory): + if kind == "cargo": inventory.unlock_cargo_row(captain) + else: inventory.unlock_slot(kind,captain) _refresh() func _build_storage() -> void: + MENU.hero(_content,"storage","MAGAZYN / ZASOBY I WYPOSAŻENIE") if not deck.is_built("expansion_3"): - _label("SKŁAD MODUŁÓW W REMONCIE",19,Color("e0b16a")) - _label("Zbuduj skład modułów, aby przechowywać wyposażenie na frachtowcu. Budowa jest teraz bezpłatna.") - UI.button(_content,"ZBUDUJ SKŁAD · BEZ KOSZTÓW",_construct_room.bind("expansion_3")) + _build_resource_overview() + var construction := MENU.card(_content) + MENU.label(construction,"SKŁAD MODUŁÓW W REMONCIE",15,MENU.GOLD) + MENU.button(construction,"ZBUDUJ SKŁAD · BEZ KOSZTÓW",_construct_room.bind("expansion_3"),true) return - if not is_instance_valid(inventory): - _label("Zadokuj swoim statkiem, aby przenosić wyposażenie.") - return - _label("Przechowuj moduły, broń i rozszerzenia. Wybierz przedmiot, aby przenieść go między ładownią a magazynem. Zamontowane wyposażenie najpierw zdejmij do ładowni.",13) - var columns := HBoxContainer.new() - columns.add_theme_constant_override("separation",18) - _content.add_child(columns) - var cargo_column := VBoxContainer.new() - cargo_column.size_flags_horizontal = Control.SIZE_EXPAND_FILL - cargo_column.size_flags_stretch_ratio = 1 - columns.add_child(cargo_column) - var storage_column := VBoxContainer.new() - storage_column.size_flags_horizontal = Control.SIZE_EXPAND_FILL - storage_column.size_flags_stretch_ratio = 1 - columns.add_child(storage_column) - UI.label(cargo_column,"STATEK · %d / %d" % [inventory.get_cargo_used(),inventory.get_cargo_capacity()],16,UI.CYAN) - var storage: Array = captain.expedition.freighter_storage - UI.label(storage_column,"FRACHTOWIEC · %d" % storage.size(),16,UI.CYAN) - var used := 0 - for index in inventory.get_cargo_capacity(): - var item: ItemInstance = inventory.get_item("cargo",index) - if item == null: continue - used += 1 - _storage_card(cargo_column,item,"ODŁÓŻ →",_transfer_storage.bind(false,index,item)) - if used == 0: UI.label(cargo_column,"Ładownia jest pusta.",13,Color("849da5")) - for index in storage.size(): - var item: ItemInstance = storage[index] - var button := _storage_card(storage_column,item,"← ODBIERZ",_transfer_storage.bind(true,index,item)) - button.disabled = inventory.get_cargo_used() >= inventory.get_cargo_capacity() - if storage.is_empty(): UI.label(storage_column,"Magazyn jest pusty.",13,Color("849da5")) - if inventory.get_cargo_used() >= inventory.get_cargo_capacity(): - _label("Ładownia statku jest pełna. Odłóż przedmiot lub odblokuj kolejny rząd w hangarze.",13,Color("e0b16a")) + if not is_instance_valid(inventory): return + _label("MODUŁY / Kliknij ikonę, aby przenieść przedmiot",14,MENU.GOLD) + if not _storage_notice.is_empty(): _label(_storage_notice,12,MENU.GOLD) + _storage_columns = GridContainer.new() + _storage_columns.columns = 2 if _drawer.size.x >= 640 else 1 + _storage_columns.add_theme_constant_override("h_separation",12) + _storage_columns.add_theme_constant_override("v_separation",12) + _content.add_child(_storage_columns) + for retrieve in [false,true]: + var column := VBoxContainer.new() + column.size_flags_horizontal = Control.SIZE_EXPAND_FILL + column.add_theme_constant_override("separation",6) + _storage_columns.add_child(column) + var storage: Array = captain.expedition.freighter_storage + MENU.label(column,"FREGATA · %d" % storage.size() if retrieve else "STATEK · %d / %d" % [inventory.get_cargo_used(),inventory.get_cargo_capacity()],14,MENU.GOLD) + var bulk := MENU.button(column,"← Odbierz wszystko" if retrieve else "Odłóż wszystko →",_transfer_all.bind(retrieve)) + bulk.disabled = storage.is_empty() or inventory.get_cargo_used() >= inventory.get_cargo_capacity() if retrieve else inventory.get_cargo_used() == 0 + var grid := GridContainer.new() + grid.name = "FreighterSlots" if retrieve else "ShipSlots" + grid.columns = 5 + grid.add_theme_constant_override("h_separation",4) + grid.add_theme_constant_override("v_separation",4) + column.add_child(grid) + var count: int = maxi(20,ceili(storage.size()/5.0)*5) if retrieve else inventory.CARGO_SIZE + for index in count: + var item: ItemInstance = storage[index] if retrieve and index < storage.size() else (inventory.get_item("cargo",index) if not retrieve else null) + var slot := Button.new() + slot.set_script(preload("res://scripts/planets/freighter_storage_slot.gd")) + slot.item = item + slot.retrieve = retrieve + slot.locked = not retrieve and index >= inventory.get_cargo_capacity() + if item != null: slot.transfer = _transfer_storage.bind(retrieve,index,item) + grid.add_child(slot) + if retrieve and item != null: slot.disabled = inventory.get_cargo_used() >= inventory.get_cargo_capacity() + _label("ZAMONTOWANE NA STATKU",12,MENU.MUTED) + var mounted := HFlowContainer.new() + _content.add_child(mounted) + for group in [inventory.weapon_slots,inventory.module_slots,inventory.extension_slots]: + for item in group: + if item == null: continue + var picture := MENU.icon(mounted,item.definition.icon,32) + picture.mouse_filter = Control.MOUSE_FILTER_STOP + picture.tooltip_text = item.get_tooltip_text()+"\nZamontowane — najpierw zdejmij do ładowni." + _label("SPRZĘT KAPITANA · %d szt. ODZYSKANE MODUŁY · %d" % [captain.gear_items.size(),captain.expedition.delivered_modules.size()],12,MENU.MUTED) + var owned := HFlowContainer.new() + _content.add_child(owned) + for gear in captain.gear_items: + var picture := MENU.icon(owned,GEAR.icon(str(gear.kind)),28) + picture.mouse_filter = Control.MOUSE_FILTER_STOP + picture.tooltip_text = "%s · poziom %d" % [GEAR.NAMES[gear.kind],gear.level] + for item in captain.expedition.delivered_modules: + var picture := MENU.icon(owned,item.definition.icon,28) + picture.mouse_filter = Control.MOUSE_FILTER_STOP + picture.tooltip_text = item.get_tooltip_text()+"\nOdbierz w Hangarze." + _content.add_child(HSeparator.new()) + _build_resource_overview() -func _storage_card(parent: Control, item: ItemInstance, action: String, callback: Callable) -> Button: - var card := UI.panel(parent) - var stack := VBoxContainer.new() - card.add_child(stack) - var row := HBoxContainer.new() - stack.add_child(row) - var icon := TextureRect.new() - icon.custom_minimum_size = Vector2(38,38) - icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE - icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED - icon.texture = item.definition.icon - row.add_child(icon) - var title := UI.label(row,"%s · +%d" % [item.definition.display_name,item.item_level],13,item.get_type_color()) - title.size_flags_horizontal = Control.SIZE_EXPAND_FILL - title.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART - card.tooltip_text = item.get_tooltip_text() - return UI.button(stack,action,callback) +func _build_resource_overview() -> void: + _label("ZAPASY GRACZA",14,MENU.GOLD) + var grid := GridContainer.new() + grid.name = "ResourceOverview" + grid.columns = 4 if _drawer.size.x >= 600 else 3 + grid.add_theme_constant_override("h_separation",6) + grid.add_theme_constant_override("v_separation",5) + _content.add_child(grid) + var values: Dictionary = {"credits":captain.credits,"parts":int(captain.parts)} + for key in RECIPES.MINERALS+preload("res://scripts/planets/planet_profiles.gd").MATERIALS: + values[key] = int(captain.minerals.get(key,0)) + for key in captain.minerals: values[key] = int(captain.minerals[key]) + if is_instance_valid(inventory): + for key in ["ammunition","missile","irradiated_ammunition","energy_bank"]: values[key] = inventory.get_crafted_stock(key) + values.samples = captain.expedition.analysis_samples + var names: Dictionary = RECIPES.NAMES.duplicate() + names.merge(GEAR.MATERIAL_NAMES) + names.merge({"credits":"Kredyty","parts":"Części","ammunition":"Amunicja","missile":"Rakiety","irradiated_ammunition":"Radiacyjna","energy_bank":"Powerbanki","samples":"Próbki"}) + for key in values: + var tile := MENU.card(grid) + tile.get_parent().name = "Stock_"+key + var row := MENU.row(tile) + var path := "res://assets/icons/resources/%s.%s" % [key,"svg" if key in ["credits","energy_bank"] else "png"] + if ResourceLoader.exists(path): MENU.icon(row,load(path),22) + var labels := VBoxContainer.new() + labels.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row.add_child(labels) + MENU.label(labels,str(names.get(key,key)),11,MENU.MUTED) + MENU.label(labels,str(values[key]),13,MENU.GOLD) + tile.get_parent().tooltip_text = "%s: %d" % [names.get(key,key),values[key]] + +func _transfer_all(retrieve: bool) -> void: + if not is_instance_valid(inventory): return + var count := 0 + if retrieve: + for index in range(captain.expedition.freighter_storage.size()-1,-1,-1): + if inventory.retrieve_from_freighter(index,captain.expedition.freighter_storage[index],captain): count += 1 + else: + for index in range(inventory.get_cargo_capacity()-1,-1,-1): + var item: ItemInstance = inventory.get_item("cargo",index) + if item != null and inventory.store_on_freighter(index,item,captain): count += 1 + _storage_notice = "Przeniesiono %d przedmiotów." % count + _refresh() func _transfer_storage(retrieve: bool, index: int, expected: ItemInstance) -> void: if not is_instance_valid(inventory): return @@ -314,41 +426,79 @@ func _transfer_storage(retrieve: bool, index: int, expected: ItemInstance) -> vo else: inventory.store_on_freighter(index,expected,captain) _refresh() +func _build_supply_production() -> void: + for group in [["AMUNICJA I RAKIETY",["ammunition","missile","irradiated_ammunition"]],["ZAOPATRZENIE",["parts","energy_bank"]]]: + _label(group[0],13,MENU.GOLD) + var grid := GridContainer.new() + grid.columns = 3 + grid.add_theme_constant_override("h_separation",6) + _content.add_child(grid) + for id in group[1]: + var recipe: Dictionary = RECIPES.DATA[id] + var card := MENU.card(grid) + MENU.style(card.get_parent(),6) + card.add_theme_constant_override("separation",4) + card.get_parent().tooltip_text = recipe.name+" · partia: %d szt." % recipe.amount + var row := MENU.row(card) + MENU.icon(row,RECIPES.icon(id),28) + var stock := MENU.label(row,str(inventory.get_crafted_stock(id) if is_instance_valid(inventory) else 0),13,MENU.GOLD) + stock.size_flags_horizontal = Control.SIZE_EXPAND_FILL + var actions := MENU.row(card) + actions.add_theme_constant_override("separation",4) + for batches in [1,10]: + var button := MENU.button(actions,"+%d" % batches,_craft_supply.bind(id,batches),true) + button.name = ("Craft_" if batches == 1 else "Craft10_")+id + button.custom_minimum_size = Vector2(36,24) + button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + var cost: Dictionary = recipe.cost.duplicate() + for key in cost: cost[key] = int(cost[key])*batches + button.tooltip_text = "%s: %d partii = %d szt.\nKoszt: %s" % [recipe.name,batches,int(recipe.amount)*batches,UI.material_text(cost)] + button.disabled = not _can_craft_supply(id,batches) + +func _can_craft_supply(id: String, batches: int) -> bool: + if not is_instance_valid(inventory) or not RECIPES.DATA.has(id) or batches not in [1,10]: return false + for key in RECIPES.DATA[id].cost: + if int(captain.minerals.get(key,0)) < int(RECIPES.DATA[id].cost[key])*batches: return false + return true + +func _craft_supply(id: String, batches := 1) -> void: + if _tab != "workshop" or not _can_craft_supply(id,batches): return + for index in batches: inventory.craft(id) + _audio.service_completed(-0.48) + _refresh() + func _build_workshop() -> void: - _label("FABRYKATOR / WYPOSAŻENIE KAPITANA",13,Color("8bd9d0")) - _label("Każdy poziom wyposażenia usuwa 2 pp odpowiadającego mu zagrożenia. L50 zapewnia pełną ochronę tej składowej.",13) + MENU.hero(_content,"workshop","") + _build_supply_production() + _label("EKWIPUNEK KAPITANA",13,MENU.GOLD) + var grid := GridContainer.new() + grid.columns = 3 + grid.add_theme_constant_override("h_separation",6) + _content.add_child(grid) for kind in GEAR.KINDS: - var card := UI.panel(_content) - var row := HBoxContainer.new() - row.add_theme_constant_override("separation",12) - card.add_child(row) - var icon := TextureRect.new() - icon.texture = GEAR.icon(kind) - icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE - icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED - icon.custom_minimum_size = Vector2(46,46) - row.add_child(icon) - var column := VBoxContainer.new() - column.size_flags_horizontal = Control.SIZE_EXPAND_FILL - row.add_child(column) - var title := UI.label(column,"%s · L%d" % [GEAR.NAMES[kind],GEAR.next_level(captain,kind)],15,Color("e4e8e5")) - title.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART - var recipe := UI.label(column,GEAR.recipe_text(captain,kind),12,Color("a1b3b8")) - recipe.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART - var build := UI.button(column,"WYTWÓRZ I ZAŁÓŻ",_craft.bind(kind)) - build.add_theme_font_size_override("font_size",13) + var card := MENU.card(grid) + MENU.style(card.get_parent(),6) + card.add_theme_constant_override("separation",4) + var row := MENU.row(card) + MENU.icon(row,GEAR.icon(kind),32) + var levels := MENU.label(row,"L%d → L%d" % [GEAR.level(captain,kind),GEAR.next_level(captain,kind)],12,GEAR.COLORS[kind]) + levels.size_flags_horizontal = Control.SIZE_EXPAND_FILL + var build := MENU.button(row,"+1",_craft.bind(kind),true) + build.name = "CraftGear_"+kind + build.custom_minimum_size = Vector2(36,24) + build.size_flags_vertical = Control.SIZE_SHRINK_CENTER + build.tooltip_text = "%s · poziom %d\nKoszt: %s\nWytwarza i zakłada nowy przedmiot." % [GEAR.NAMES[kind],GEAR.next_level(captain,kind),GEAR.recipe_text(captain,kind)] + card.get_parent().tooltip_text = build.tooltip_text build.disabled = not GEAR.can_craft(captain,kind) - UI.button(_content,"POSIADANE WYPOSAŻENIE "+("−" if _owned_open else "+"),func(): + MENU.button(_content,"Posiadane "+("−" if _owned_open else "+"),func(): _owned_open = not _owned_open _refresh()) if _owned_open: for gear in captain.gear_items: var equipped: bool = captain.gear_slots.get(gear.kind,-1) == gear.uid var label_text := "%s · L%d%s" % [GEAR.NAMES[gear.kind],gear.level," [ZAŁOŻONE]" if equipped else ""] - var button := UI.button(_content,label_text,_equip.bind(gear.kind,gear.uid)) - button.add_theme_font_size_override("font_size",13) + var button := MENU.button(_content,label_text,_equip.bind(gear.kind,gear.uid)) button.disabled = equipped - _label("ZASOBY: "+UI.material_text(captain.minerals),12,Color("819ca5")) func _build_command() -> void: var progress: Resource = captain.expedition @@ -364,6 +514,7 @@ func _build_command() -> void: _label("Rozbudowa centrum dowodzenia oraz pozostałych sekcji będzie dostępna później.",13,Color("bc9e72")) func _craft(kind: String) -> void: + if _tab != "workshop": return var gear: Dictionary = GEAR.craft(captain,kind) if not gear.is_empty(): GEAR.equip(captain,kind,int(gear.uid)) diff --git a/scripts/planets/freighter_storage_slot.gd b/scripts/planets/freighter_storage_slot.gd new file mode 100644 index 0000000..2e200d7 --- /dev/null +++ b/scripts/planets/freighter_storage_slot.gd @@ -0,0 +1,49 @@ +extends Button +## One click transfers the exact expected item; normal inventory guards stay authoritative. +var item: ItemInstance +var retrieve := false +var transfer: Callable +var locked := false + +func _ready() -> void: + custom_minimum_size = Vector2(48,48) + mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND if item != null else Control.CURSOR_ARROW + var accent: Color = item.get_type_color() if item != null else Color("425554") + for state in ["normal","hover","pressed","disabled","focus"]: + var box := StyleBoxFlat.new() + box.bg_color = Color("13222a") if not locked else Color("11191d") + box.bg_color.a = 0.85 + box.border_color = accent if state != "hover" else Color("e7c38a") + box.set_border_width_all(1) + box.set_corner_radius_all(4) + add_theme_stylebox_override(state,box) + if item != null: + var art := TextureRect.new() + art.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + art.texture = item.definition.icon + art.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + art.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS + art.mouse_filter = Control.MOUSE_FILTER_IGNORE + add_child(art) + art.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + art.offset_left = 4 + art.offset_top = 4 + art.offset_right = -4 + art.offset_bottom = -7 + var arrow := Label.new() + arrow.text = "←" if retrieve else "→" + arrow.position = Vector2(31,29) + arrow.add_theme_font_override("font",ThemeDB.fallback_font) + arrow.add_theme_font_size_override("font_size",15) + arrow.add_theme_color_override("font_color",Color("f1cc8a")) + arrow.add_theme_color_override("font_shadow_color",Color.BLACK) + arrow.add_theme_constant_override("shadow_outline_size",3) + arrow.mouse_filter = Control.MOUSE_FILTER_IGNORE + add_child(arrow) + set_meta("transfer_action","← ODBIERZ" if retrieve else "ODŁÓŻ →") + tooltip_text = item.get_tooltip_text()+"\nKliknij: "+("odbierz do statku" if retrieve else "przenieś na fregatę") + pressed.connect(transfer) + else: + disabled = true + text = "×" if locked else "·" + tooltip_text = "Odblokuj kolejne rzędy ładowni w Hangarze." if locked else "Wolny slot" diff --git a/scripts/planets/freighter_storage_slot.gd.uid b/scripts/planets/freighter_storage_slot.gd.uid new file mode 100644 index 0000000..f3cfa8c --- /dev/null +++ b/scripts/planets/freighter_storage_slot.gd.uid @@ -0,0 +1 @@ +uid://cj38nd1ypn81q diff --git a/scripts/planets/poi_presentation.gd b/scripts/planets/poi_presentation.gd index 1c4f27f..a71a636 100644 --- a/scripts/planets/poi_presentation.gd +++ b/scripts/planets/poi_presentation.gd @@ -27,7 +27,7 @@ static func text(parent: Node, content: String, font_size := 14, color := INK) - var label := Label.new() label.text = content label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART - label.add_theme_font_size_override("font_size",font_size) + label.add_theme_font_size_override("font_size",maxi(11,font_size-(3 if font_size >= 20 else 2))) label.add_theme_font_override("font",ThemeDB.fallback_font) label.add_theme_color_override("font_color",color) parent.add_child(label) @@ -39,7 +39,7 @@ static func button(parent: Node, content: String, action: Callable, primary := f node.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART node.custom_minimum_size.y = 36 node.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND - node.add_theme_font_size_override("font_size",14) + node.add_theme_font_size_override("font_size",12) node.add_theme_font_override("font",ThemeDB.fallback_font) node.add_theme_color_override("font_color",INK) for state in ["normal","hover","pressed","disabled","focus"]: diff --git a/scripts/planets/surface_screen.gd b/scripts/planets/surface_screen.gd index 8463d08..182a15b 100644 --- a/scripts/planets/surface_screen.gd +++ b/scripts/planets/surface_screen.gd @@ -20,6 +20,8 @@ var _poi: Dictionary = {} var _rng := RandomNumberGenerator.new() var _motion := preload("res://scripts/planets/lander_motion.gd").new() var flight_ship: Node +var planet_texture: Texture2D +var _telemetry: PanelContainer var _ending := false var _hud_refresh_time := 0.0 var _previous_position := Vector2.ZERO @@ -33,6 +35,9 @@ func _ready() -> void: set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) mouse_filter = Control.MOUSE_FILTER_STOP _rng.seed = progress.visit_seed ^ 90317 + if planet_texture == null: + var planets: Array[Texture2D] = PROFILES.earthlike_textures() + planet_texture = planets[posmod(int(progress.active_profile.seed),planets.size())] if is_instance_valid(flight_ship): _motion.configure(flight_ship) var container := TextureRect.new() @@ -98,37 +103,25 @@ func _ready() -> void: nature_audio.source = self add_child(nature_audio) resized.connect(_resize_surface_viewport) - var info := UI.panel(self, Vector2(440, 0)) - info.position = Vector2(24, 24) - info.mouse_filter = Control.MOUSE_FILTER_IGNORE - var column := VBoxContainer.new() - info.add_child(column) - UI.label(column, str(progress.active_profile.name).to_upper(), 25, UI.CYAN) - UI.label(column,str(world.data.landscape.name),14,Color("e4cc9d")) - UI.label(column, "%s / TLEN %d%% / %d°C / FLORA %d" % [ - preload("res://scripts/planets/planet_profiles.gd").biome_name(progress.active_profile), - progress.active_profile.oxygen, progress.active_profile.temperature, progress.active_profile.flora], 13) - _threat = UI.label(column,"",13,Color("efca8a")) - _hp = ProgressBar.new() - _hp.custom_minimum_size = Vector2(0, 14) - _hp.show_percentage = false - var hp_style := StyleBoxFlat.new() - hp_style.bg_color = Color("5bc9b5") - hp_style.set_corner_radius_all(5) - _hp.add_theme_stylebox_override("fill",hp_style) - column.add_child(_hp) - _status = UI.label(column, "", 13) - _cargo = UI.label(column, "", 13) - _cargo.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART - _cargo.custom_minimum_size.x = 410 - var back := UI.button(self, "POWRÓT NA STATEK [L]", func(): _return(true)) + _telemetry = PanelContainer.new() + _telemetry.set_script(preload("res://scripts/planets/surface_telemetry.gd")) + _telemetry.source = self + add_child(_telemetry) + _hp = _telemetry.health + _status = _telemetry.status + _cargo = _telemetry.cargo + _threat = _telemetry.threat + var back := POI_CARD.button(self, "POWRÓT NA STATEK [L]", func(): _return(true)) back.set_anchors_and_offsets_preset(Control.PRESET_TOP_LEFT) back.position = Vector2(get_viewport_rect().size.x-285, 24) back.size.x = 260 var help := UI.panel(self) + help.name = "SurfaceControls" + help.custom_minimum_size.x = 350 help.set_anchors_and_offsets_preset(Control.PRESET_TOP_LEFT) help.position = Vector2(24, get_viewport_rect().size.y-84) - UI.label(help, "W — ciąg · S — hamuj / wstecz · A/D — obrót\nQ/E — ruch boczny · TAB — dopalanie · F — zbadaj", 14) + POI_CARD.panel_style(help) + POI_CARD.text(help, "W — ciąg · S — hamuj / wstecz · A/D — obrót\nQ/E — ruch boczny · TAB — dopalanie · F — zbadaj", 13) var map_frame := UI.panel(self, Vector2(195,195)) map_frame.set_anchors_and_offsets_preset(Control.PRESET_TOP_LEFT) map_frame.position = get_viewport_rect().size-Vector2(220,220) @@ -281,15 +274,16 @@ func _destroy_lander() -> void: func _update_hud() -> void: _hp.value = progress.lander_hp if not _ending: - _status.text = "LĄDOWNIK %d / 100 HP · ENERGIA %d%%" % [ceili(progress.lander_hp),roundi(_motion.energy)] - _threat.text = "ZAGROŻENIE %.1f%% / 300%% · ŚREDNIA POI %.1f%%" % [PROFILES.global_threat(progress.active_profile,captain),PROFILES.average_success_chance(progress.active_profile,captain)*100.0] + _status.text = "Lądownik %d / 100 HP · Energia %d%%" % [ceili(progress.lander_hp),roundi(_motion.energy)] + _threat.text = "Ryzyko %.1f%% / 300%% · Śr. POI %.1f%%" % [PROFILES.global_threat(progress.active_profile,captain),PROFILES.average_success_chance(progress.active_profile,captain)*100.0] var loot_data: Dictionary = progress.cargo.duplicate() if progress.cargo_parts > 0: loot_data.parts = progress.cargo_parts if progress.cargo_missiles > 0: loot_data.missile = progress.cargo_missiles var loot := UI.material_text(loot_data) if progress.cargo_credits > 0: loot += (" · " if not loot.is_empty() else "") + "%d kr." % progress.cargo_credits - _cargo.text = "ŁUP WYPRAWY: " + (loot if not loot.is_empty() else "brak") + "\nModuły: %d" % progress.cargo_modules.size() + _cargo.text = "Łup: " + (loot if not loot.is_empty() else "brak") + " · Moduły: %d" % progress.cargo_modules.size() + _cargo.tooltip_text = _cargo.text func _return(success: bool) -> void: if _ending: @@ -313,7 +307,7 @@ func _check_events() -> void: return func _event_text(text: String, color := Color("d5e4e8"), font_size := 15) -> Label: - var label := UI.label(_choices,text,font_size,color) + var label := POI_CARD.text(_choices,text,font_size,color) label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART label.size_flags_horizontal = Control.SIZE_EXPAND_FILL return label @@ -326,6 +320,7 @@ func _show_event(event: Dictionary, result: Dictionary = {}) -> void: child.queue_free() _choices.get_parent().set("scroll_vertical",0) _dialog.show() + POI_CARD.panel_style(_dialog) _layout_dialog() _event_text(str(EVENTS.TITLES.get(event.kind,"Spotkanie")).to_upper(),UI.CYAN,22) _event_text(str(EVENTS.STORIES.get(event.kind,""))) @@ -356,8 +351,8 @@ func _show_event(event: Dictionary, result: Dictionary = {}) -> void: text += "\nKoszt: "+EVENTS.reward_text(option.cost) if not option.reward.is_empty(): text += "\n"+("Nagroda za sukces: " if event.kind in ["prototype","rescue","evacuation"] else "Otrzymasz: ")+EVENTS.reward_text(option.reward) - var button := UI.button(_choices,text,func(): _event_action(action)) - button.add_theme_font_size_override("font_size",14) + var button := POI_CARD.button(_choices,text,func(): _event_action(action)) + button.add_theme_font_size_override("font_size",12) button.clip_text = true button.tooltip_text = str(option.get("tooltip",text)) button.disabled = not EVENTS.can_pay(captain,progress,option.cost) @@ -366,10 +361,10 @@ func _show_event(event: Dictionary, result: Dictionary = {}) -> void: button.tooltip_text += "\nTen etap ma 0% szans przy obecnym zagrożeniu." if button.disabled: button.tooltip_text += "\nSprawdź wymagane zasoby i aktualne zagrożenie." - UI.button(_choices,"Może później",func(): _dialog.hide()) + POI_CARD.button(_choices,"Może później",func(): _dialog.hide()) else: _event_text("Spotkanie zakończone. Nagrody w ładowni wyprawy przepadną po zniszczeniu lądownika.",Color("9bc4c7"),13) - UI.button(_choices,"Kontynuuj wyprawę",func(): _dialog.hide()) + POI_CARD.button(_choices,"Kontynuuj wyprawę",func(): _dialog.hide()) func _event_action(action: String) -> void: if _ending: diff --git a/scripts/planets/surface_telemetry.gd b/scripts/planets/surface_telemetry.gd new file mode 100644 index 0000000..980e016 --- /dev/null +++ b/scripts/planets/surface_telemetry.gd @@ -0,0 +1,116 @@ +extends PanelContainer +## Compact field instrument with the actual orbital planet portrait. +var source: Control +var health: ProgressBar +var status: Label +var cargo: Label +var threat: Label +var portrait: TextureRect +const INK := Color("dedcc9") +const MUTED := Color("a2ab94") +const GOLD := Color("d6b477") + +func text(parent: Node, value: String, font_size := 11, color := INK) -> Label: + var label := Label.new() + label.text = value + label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + label.add_theme_font_override("font",ThemeDB.fallback_font) + label.add_theme_font_size_override("font_size",font_size) + label.add_theme_color_override("font_color",color) + parent.add_child(label) + return label + +func _ready() -> void: + name = "PlanetTelemetry" + position = Vector2(18,18) + custom_minimum_size.x = 350 + size.x = 350 + mouse_filter = Control.MOUSE_FILTER_IGNORE + var frame := StyleBoxFlat.new() + frame.bg_color = Color(0.10,0.13,0.10,0.95) + frame.border_color = Color("8b805b") + frame.border_width_top = 2 + frame.border_width_bottom = 1 + frame.border_width_left = 1 + frame.border_width_right = 1 + frame.set_corner_radius_all(8) + frame.set_content_margin_all(12) + frame.shadow_color = Color(0,0,0,0.4) + frame.shadow_size = 10 + add_theme_stylebox_override("panel",frame) + var stack := VBoxContainer.new() + stack.add_theme_constant_override("separation",5) + add_child(stack) + text(stack,"DZIENNIK PLANETARNY / WYPRAWA",10,GOLD) + var heading := HBoxContainer.new() + heading.add_theme_constant_override("separation",10) + stack.add_child(heading) + var medallion := Control.new() + medallion.custom_minimum_size = Vector2(88,88) + medallion.mouse_filter = Control.MOUSE_FILTER_IGNORE + heading.add_child(medallion) + var sky := Panel.new() + sky.position = Vector2(10,10) + sky.size = Vector2(68,68) + var circle := StyleBoxFlat.new() + circle.bg_color = Color("08100d") + circle.set_corner_radius_all(34) + sky.add_theme_stylebox_override("panel",circle) + medallion.add_child(sky) + portrait = TextureRect.new() + portrait.name = "PlanetPortrait" + portrait.position = Vector2(11,11) + portrait.size = Vector2(66,66) + portrait.texture = source.planet_texture + portrait.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + portrait.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + portrait.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR + medallion.add_child(portrait) + var bezel := TextureRect.new() + bezel.texture = load("res://assets/planets/ui/planet_bezel.png") + bezel.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + bezel.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + bezel.size = Vector2(88,88) + bezel.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS + medallion.add_child(bezel) + var title := VBoxContainer.new() + title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + title.size_flags_vertical = Control.SIZE_SHRINK_CENTER + title.add_theme_constant_override("separation",3) + heading.add_child(title) + text(title,str(source.progress.active_profile.name),19,GOLD) + text(title,str(source.world.data.landscape.name),12) + text(title,preload("res://scripts/planets/planet_profiles.gd").biome_name(source.progress.active_profile),10,MUTED) + var conditions := HBoxContainer.new() + conditions.add_theme_constant_override("separation",6) + stack.add_child(conditions) + var profile: Dictionary = source.progress.active_profile + for entry in [["TLEN","%d%%" % profile.oxygen],["TEMPERATURA","%d°C" % profile.temperature],["GROŹNA FAUNA","%d" % profile.flora]]: + var cell := PanelContainer.new() + cell.size_flags_horizontal = Control.SIZE_EXPAND_FILL + var style := StyleBoxFlat.new() + style.bg_color = Color("30382a") + style.set_corner_radius_all(4) + style.set_content_margin_all(6) + cell.add_theme_stylebox_override("panel",style) + conditions.add_child(cell) + var column := VBoxContainer.new() + column.add_theme_constant_override("separation",1) + cell.add_child(column) + text(column,entry[0],9,MUTED) + text(column,entry[1],13,INK) + threat = text(stack,"",11,GOLD) + health = ProgressBar.new() + health.custom_minimum_size.y = 6 + health.show_percentage = false + for state in ["background","fill"]: + var bar := StyleBoxFlat.new() + bar.bg_color = Color("86ae82") if state == "fill" else Color("30392b") + bar.set_corner_radius_all(3) + health.add_theme_stylebox_override(state,bar) + stack.add_child(health) + status = text(stack,"",10,MUTED) + cargo = text(stack,"",10,INK) + cargo.max_lines_visible = 3 + cargo.mouse_filter = Control.MOUSE_FILTER_PASS + cargo.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS diff --git a/scripts/planets/surface_telemetry.gd.uid b/scripts/planets/surface_telemetry.gd.uid new file mode 100644 index 0000000..12ffa7f --- /dev/null +++ b/scripts/planets/surface_telemetry.gd.uid @@ -0,0 +1 @@ +uid://o5jmvrpm8h4i diff --git a/scripts/ui/captain_equipment_panel.gd b/scripts/ui/captain_equipment_panel.gd index 7a24e1e..148efb5 100644 --- a/scripts/ui/captain_equipment_panel.gd +++ b/scripts/ui/captain_equipment_panel.gd @@ -1,121 +1,76 @@ extends PanelContainer const GEAR := preload("res://scripts/planets/captain_equipment.gd") +const MENU := preload("res://scripts/planets/freighter_menu.gd") var _wardrobe: PanelContainer -var _grid: GridContainer var _gear_signature := "" +var _protection: Label func _ready() -> void: - var frame := StyleBoxFlat.new() - frame.bg_color = Color(0.025, 0.045, 0.065, 0.65) - frame.border_color = Color("35515d") - frame.set_border_width_all(1) - frame.set_corner_radius_all(6) - frame.set_content_margin_all(7) - add_theme_stylebox_override("panel", frame) - custom_minimum_size.x = 244 - var contents := VBoxContainer.new() - contents.add_theme_constant_override("separation", 4) - add_child(contents) - var title := Label.new() - title.text = "EKWIPUNEK KAPITANA" - title.add_theme_font_size_override("font_size", 10) - title.add_theme_color_override("font_color", Color("8fbfc6")) - contents.add_child(title) - var row := HBoxContainer.new() - row.alignment = BoxContainer.ALIGNMENT_CENTER - row.add_theme_constant_override("separation", 12) - contents.add_child(row) - for kind in GEAR.KINDS: - var slot := PanelContainer.new() - slot.name = kind.capitalize() + "Slot" - slot.set_script(preload("res://scripts/ui/captain_gear_slot.gd")) - slot.set("kind", kind) - row.add_child(slot) - var button := Button.new() - button.name = "OpenEquipment" - button.text = "WYPOSAŻENIE" - preload("res://scripts/ui/hud_button_style.gd").apply(button, Color("82cddd")) - button.add_theme_font_size_override("font_size", 9) - button.custom_minimum_size.y = 22 - contents.add_child(button) - button.pressed.connect(_toggle_wardrobe) + # Retain this controller node for HUD integrations, without a persistent gear strip. + hide() _create_wardrobe() GameState.captain.changed.connect(_refresh_wardrobe) + get_viewport().size_changed.connect(_fit_window) _refresh_wardrobe() -func _process(_delta: float) -> void: - var captain := get_parent().get_node_or_null("CaptainPanel") as Control - if captain: - position = captain.position + Vector2(0, captain.size.y + 7) - size = Vector2(captain.size.x, get_combined_minimum_size().y) - func _create_wardrobe() -> void: _wardrobe = PanelContainer.new() _wardrobe.name = "CaptainGearInventory" - var frame := StyleBoxFlat.new() - frame.bg_color = Color("0b1823") - frame.border_color = Color("537e91") - frame.set_border_width_all(1) - frame.set_corner_radius_all(8) - frame.set_content_margin_all(12) - _wardrobe.add_theme_stylebox_override("panel", frame) - _wardrobe.custom_minimum_size = Vector2(350, 180) + MENU.style(_wardrobe,6) + _wardrobe.size = Vector2(244,324) get_parent().add_child(_wardrobe) var contents := VBoxContainer.new() - contents.add_theme_constant_override("separation", 9) + contents.add_theme_constant_override("separation",4) _wardrobe.add_child(contents) - var header := HBoxContainer.new() - contents.add_child(header) - var title := Label.new() - title.text = "WYPOSAŻENIE KAPITANA" + var header := MENU.row(contents) + var title := MENU.label(header,"EKWIPUNEK KAPITANA",13,MENU.GOLD) title.size_flags_horizontal = Control.SIZE_EXPAND_FILL - title.add_theme_font_size_override("font_size", 12) - header.add_child(title) - var close := Button.new() - close.text = "×" - close.pressed.connect(func() -> void: _wardrobe.hide()) - header.add_child(close) - var hint := Label.new() - hint.text = "Przeciągnij na slot kapitana lub kliknij dwukrotnie." - hint.add_theme_font_size_override("font_size", 10) - contents.add_child(hint) - var scroll := ScrollContainer.new() - scroll.custom_minimum_size.y = 160 - scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED - contents.add_child(scroll) - _grid = GridContainer.new() - _grid.columns = 4 - _grid.add_theme_constant_override("h_separation", 10) - _grid.add_theme_constant_override("v_separation", 10) - scroll.add_child(_grid) - var return_area := PanelContainer.new() - return_area.set_script(preload("res://scripts/ui/captain_gear_slot.gd")) - return_area.set("return_slot", true) - return_area.custom_minimum_size = Vector2(0, 36) - contents.add_child(return_area) - get_parent().get_node("FloatingWindows").register_window(_wardrobe, _wardrobe, header) + MENU.button(header,"×",close).custom_minimum_size.x = 32 + var body := MENU.row(contents) + var doll := Control.new() + doll.name = "PaperDoll" + doll.set_script(preload("res://scripts/ui/captain_paper_doll.gd")) + doll.custom_minimum_size = Vector2(228,252) + body.add_child(doll) + _protection = MENU.label(contents,"",10,MENU.MUTED) + get_parent().get_node("FloatingWindows").register_window(_wardrobe,_wardrobe,header) + _wardrobe.minimum_size_changed.connect(_fit_window.call_deferred) _wardrobe.hide() func _toggle_wardrobe() -> void: - _wardrobe.visible = not _wardrobe.visible - _wardrobe.position = position + Vector2(size.x + 12, 0) if _wardrobe.visible: - get_parent().get_node("FloatingWindows").focus_window(_wardrobe) + close() + return + _wardrobe.show() + if not _wardrobe.has_meta("floating_window_dragged"): + _fit_window() + _fit_window.call_deferred() + get_parent().get_node("FloatingWindows").focus_window(_wardrobe) + +func close() -> void: + _wardrobe.hide() + +func _fit_window() -> void: + if not is_instance_valid(_wardrobe): return + var view := get_viewport_rect().size + _wardrobe.size = Vector2(244,324) + var captain_panel := get_parent().get_node("CaptainPanel") as Control + var anchor := captain_panel.position+Vector2(0,captain_panel.size.y+8) + var factor := minf(1.0,minf((view.x-16)/_wardrobe.size.x,(view.y-anchor.y-12)/_wardrobe.size.y)) + _wardrobe.scale = Vector2.ONE*maxf(0.35,factor) + if not _wardrobe.has_meta("floating_window_dragged"): + _wardrobe.position = anchor + else: + get_parent().get_node("FloatingWindows").clamp_window(_wardrobe) + +func _unhandled_key_input(event: InputEvent) -> void: + if _wardrobe.visible and event is InputEventKey and event.pressed and event.keycode == KEY_ESCAPE: + close() + get_viewport().set_input_as_handled() func _refresh_wardrobe() -> void: - var signature := str(GameState.captain.gear_items) - if signature == _gear_signature: - return + var captain := GameState.captain + var signature := str(captain.gear_items)+str(captain.gear_slots) + if signature == _gear_signature: return _gear_signature = signature - if not is_instance_valid(_grid): - return - for child in _grid.get_children(): - _grid.remove_child(child) - child.queue_free() - for gear in GameState.captain.gear_items: - var slot := PanelContainer.new() - slot.set_script(preload("res://scripts/ui/captain_gear_slot.gd")) - slot.set("equipped_slot", false) - slot.set("uid", int(gear.uid)) - slot.set("kind", str(gear.kind)) - _grid.add_child(slot) + _protection.text = "Tlen %d · Temp. %d · Fauna %d pp" % [mini(100,2*GEAR.level(captain,"breathing")),mini(100,2*GEAR.level(captain,"suit")),mini(100,2*GEAR.level(captain,"sidearm"))] diff --git a/scripts/ui/captain_gear_slot.gd b/scripts/ui/captain_gear_slot.gd index 662dbed..57cda90 100644 --- a/scripts/ui/captain_gear_slot.gd +++ b/scripts/ui/captain_gear_slot.gd @@ -10,7 +10,7 @@ var _valid_drop := false func _ready() -> void: mouse_filter = Control.MOUSE_FILTER_STOP - custom_minimum_size = Vector2(58, 58) + custom_minimum_size = Vector2(48, 48) _picture = TextureRect.new() _picture.expand_mode = TextureRect.EXPAND_IGNORE_SIZE _picture.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED @@ -22,6 +22,7 @@ func _ready() -> void: _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT _label.vertical_alignment = VERTICAL_ALIGNMENT_BOTTOM _label.add_theme_font_size_override("font_size", 9) + _label.add_theme_font_override("font",ThemeDB.fallback_font) _label.add_theme_color_override("font_shadow_color", Color.BLACK) _label.add_theme_constant_override("shadow_outline_size", 3) add_child(_label) @@ -39,7 +40,11 @@ func refresh() -> void: var gear := gear_item() _picture.texture = GEAR.icon(kind) if not return_slot else null _picture.modulate.a = 1.0 if not gear.is_empty() else 0.22 - _label.text = "POZ. %d" % int(gear.level) if not gear.is_empty() else ("ODŁÓŻ" if return_slot else "—") + _label.text = "ODŁÓŻ DO PLECAKA" if return_slot else "" + if return_slot: + _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + _label.add_theme_font_size_override("font_size",11) tooltip_text = "Odłóż wyposażenie kapitana" if return_slot else "%s\n%s\nPrzeciągnij przedmiot do pasującego slotu. Dwuklik zakłada lub zdejmuje." % [GEAR.NAMES.get(kind, kind), "Poziom %d" % int(gear.level) if not gear.is_empty() else "Pusty slot"] if not return_slot and not gear.is_empty(): tooltip_text += "\nRedukcja zagrożenia: %d pp (2 pp/poziom, maks. 100 pp).\nPoziom 50 całkowicie neutralizuje odpowiadające zagrożenie." % mini(100,2*int(gear.level)) diff --git a/scripts/ui/captain_panel.gd b/scripts/ui/captain_panel.gd index 073eeda..778a3db 100644 --- a/scripts/ui/captain_panel.gd +++ b/scripts/ui/captain_panel.gd @@ -1,4 +1,5 @@ extends PanelContainer +signal equipment_requested @onready var player: CharacterBody2D = get_node("../../../PlayerShip") @onready var level_label: Label = $Contents/Header/Level @@ -30,6 +31,21 @@ func _ready() -> void: label.add_theme_constant_override("shadow_offset_x", 1) label.add_theme_constant_override("shadow_offset_y", 1) _refresh() + mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND + tooltip_text = "Kliknij, aby otworzyć ekwipunek kapitana" + _pass_clicks($Contents) + +func _pass_clicks(node: Node) -> void: + for child in node.get_children(): + if child is BaseButton: continue + if child is Control: child.mouse_filter = Control.MOUSE_FILTER_IGNORE + _pass_clicks(child) + if node == $Contents: node.mouse_filter = Control.MOUSE_FILTER_IGNORE + +func _gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: + equipment_requested.emit() + accept_event() func _refresh() -> void: level_label.text = "POZ. %d" % _captain.level @@ -46,8 +62,8 @@ func _refresh() -> void: func _build_portrait() -> void: custom_minimum_size = Vector2(244, 0) var style := StyleBoxFlat.new() - style.bg_color = Color(0.025, 0.042, 0.064, 0.0) - style.border_color = Color("37677900") + style.bg_color = Color(0.025, 0.042, 0.064, 0.8) + style.border_color = Color("56726e") style.set_border_width_all(1) style.set_corner_radius_all(8) style.set_content_margin_all(6) @@ -79,7 +95,7 @@ func _build_portrait() -> void: info.alignment = BoxContainer.ALIGNMENT_CENTER row.add_child(info) var designation := Label.new() - designation.text = "DOWÓDCA STATKU" + designation.text = "KLIKNIJ · WYPOSAŻENIE" designation.add_theme_font_size_override("font_size", 9) designation.add_theme_color_override("font_color", Color("91dbea")) info.add_child(designation) diff --git a/scripts/ui/captain_paper_doll.gd b/scripts/ui/captain_paper_doll.gd new file mode 100644 index 0000000..fc5f5b4 --- /dev/null +++ b/scripts/ui/captain_paper_doll.gd @@ -0,0 +1,66 @@ +extends Control +const GEAR := preload("res://scripts/planets/captain_equipment.gd") +var _reductions: Dictionary = {} +func _ready() -> void: + mouse_filter = Control.MOUSE_FILTER_IGNORE + var figure := TextureRect.new() + figure.name = "CaptainSilhouette" + figure.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + figure.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + figure.texture = load("res://assets/avatars/captain_full_body.png") + figure.position = Vector2(43,0) + figure.size = Vector2(144,248) + figure.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS + figure.mouse_filter = Control.MOUSE_FILTER_IGNORE + add_child(figure) + var positions := [Vector2(5,26),Vector2(175,88),Vector2(175,174)] + for index in GEAR.KINDS.size(): + var kind: String = GEAR.KINDS[index] + var slot := PanelContainer.new() + slot.name = kind.capitalize()+"Slot" + slot.set_script(preload("res://scripts/ui/captain_gear_slot.gd")) + slot.set("kind",kind) + slot.position = positions[index] + add_child(slot) + var reduction := Label.new() + reduction.position = positions[index]+Vector2(0,-18) + reduction.size.x = 48 + reduction.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + reduction.add_theme_font_override("font",ThemeDB.fallback_font) + reduction.add_theme_font_size_override("font_size",11) + reduction.add_theme_color_override("font_color",Color("a5d6ac")) + reduction.mouse_filter = Control.MOUSE_FILTER_IGNORE + add_child(reduction) + _reductions[kind] = reduction + var label := Label.new() + label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + label.text = {"breathing":"Oddychanie","suit":"Skafander","sidearm":"Broń ręczna"}[kind] + label.position = positions[index]+Vector2(-5,51) + label.size.x = 58 + label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + label.add_theme_font_override("font",ThemeDB.fallback_font) + label.add_theme_font_size_override("font_size",9) + label.add_theme_color_override("font_color",Color("c3b894")) + label.mouse_filter = Control.MOUSE_FILTER_IGNORE + add_child(label) + GameState.captain.changed.connect(_refresh_reductions) + _refresh_reductions() + +func _refresh_reductions() -> void: + for kind in _reductions: + _reductions[kind].text = "−%d%%" % mini(100,2*GEAR.level(GameState.captain,kind)) + +func _draw() -> void: + draw_style_box(_background(),Rect2(Vector2.ZERO,size)) + draw_arc(Vector2(114,126),84,0,TAU,80,Color(0.7,0.6,0.4,0.10),1,true) + for pair in [[Vector2(53,50),Vector2(110,39)],[Vector2(175,112),Vector2(126,92)],[Vector2(175,198),Vector2(133,157)]]: + draw_line(pair[0],pair[1],Color(0.75,0.65,0.43,0.45),1,true) + draw_circle(pair[1],2,Color("aa9665")) + +func _background() -> StyleBoxFlat: + var style := StyleBoxFlat.new() + style.bg_color = Color("0c1419") + style.border_color = Color("3f514e") + style.set_border_width_all(1) + style.set_corner_radius_all(6) + return style diff --git a/scripts/ui/captain_paper_doll.gd.uid b/scripts/ui/captain_paper_doll.gd.uid new file mode 100644 index 0000000..0bbae96 --- /dev/null +++ b/scripts/ui/captain_paper_doll.gd.uid @@ -0,0 +1 @@ +uid://co656fxbx7su3 diff --git a/scripts/ui/mission_objectives.gd b/scripts/ui/mission_objectives.gd index 4b678cf..f1a5884 100644 --- a/scripts/ui/mission_objectives.gd +++ b/scripts/ui/mission_objectives.gd @@ -40,7 +40,7 @@ func _process(_delta: float) -> void: else: _objective.text = "Pokonaj wszystkich wrogów" var captain := get_parent().get_node_or_null("CaptainEquipment") as Control - if captain == null: + if captain == null or not captain.is_visible_in_tree(): captain = get_parent().get_node_or_null("CaptainPanel") as Control if is_instance_valid(captain): size.x = captain.size.x diff --git a/scripts/ui/orbital_contact_style.gd b/scripts/ui/orbital_contact_style.gd index f309b46..9d93fa9 100644 --- a/scripts/ui/orbital_contact_style.gd +++ b/scripts/ui/orbital_contact_style.gd @@ -34,7 +34,7 @@ static func compact_button(button: Button, accent: Color) -> void: static func hud_obstacles(hud: Node) -> Array[Rect2]: var boxes: Array[Rect2] = [] if hud == null: return boxes - for name in ["CaptainPanel","CaptainEquipment","MissionObjectives","ShipDrawer","PassiveCaptainPanel","PassiveShipPanel"]: + for name in ["CaptainPanel","CaptainEquipment","CaptainGearInventory","MissionObjectives","ShipDrawer","PassiveCaptainPanel","PassiveShipPanel"]: var control := hud.get_node_or_null(NodePath(name)) as Control if control != null and control.is_visible_in_tree(): boxes.append(control.get_global_rect().grow(6)) return boxes diff --git a/scripts/ui/player_guide.gd b/scripts/ui/player_guide.gd index dc907cb..47d2931 100644 --- a/scripts/ui/player_guide.gd +++ b/scripts/ui/player_guide.gd @@ -6,9 +6,9 @@ const PAGES := [ ["Pierwsza wyprawa", "01", "[font_size=26][color=#f1bd79]Twój pierwszy układ[/color][/font_size]\n\nWybierz statek przyciskiem [b]Nowa wyprawa[/b]. Każdy kadłub ma inne parametry — na początek wybierz ten, który pasuje do Twojego stylu.\n\n[color=#91dbea][b]1. Pokonaj zwykłych wrogów[/b][/color]\nOdszukuj przeciwników, rozwijaj wyposażenie i pilnuj zasobów. Aktualny cel znajdziesz w lewym dolnym rogu ekranu.\n\n[color=#91dbea][b]2. Pokonaj bossa[/b][/color]\nGdy zniszczysz pozostałych wrogów, w układzie pojawi się boss. Przygotuj zapas amunicji i sprawdź kadłub przed walką.\n\n[color=#91dbea][b]3. Znajdź zamieszkaną planetę[/b][/color]\nPo zwycięstwie podleć do zamieszkanej planety. Skorzystaj z usług i otwórz wormhole. Wleć w jego środek, żeby przejść do następnego, trudniejszego układu."], ["Sterowanie", "02", "[font_size=26][color=#f1bd79]Opanuj statek[/color][/font_size]\n\n[color=#91dbea][b]W[/b][/color] — ciąg do przodu.\n[color=#91dbea][b]S[/b][/color] — hamowanie; po zatrzymaniu lot wstecz.\n[color=#91dbea][b]A / D[/b][/color] — obracanie statku.\n[color=#91dbea][b]Q / E[/b][/color] — ruch boczny w lewo / prawo.\n[color=#91dbea][b]TAB[/b][/color] — dopalanie: większa prędkość kosztem energii.\n\n[color=#91dbea][b]Kursor myszy[/b][/color] — celowanie.\n[color=#91dbea][b]LPM / PPM / ŚPM[/b][/color] — strzelanie z trzech slotów broni.\n[color=#91dbea][b]1–5[/b][/color] — użycie zamontowanych rozszerzeń.\n[color=#91dbea][b]F1–F5[/b][/color] — aktywne umiejętności kapitana.\n[color=#91dbea][b]R[/b][/color] — użycie powerbanku, jeśli masz go w zapasach.\n\nStatek ma bezwładność. Obrót nie zatrzymuje ruchu — hamuj wcześniej i wykorzystuj ruch boczny, żeby unikać ostrzału."], ["Walka i przetrwanie", "03", "[font_size=26][color=#f1bd79]Wróć z wyprawy[/color][/font_size]\n\n[color=#91dbea][b]Tarcze, kadłub i energia[/b][/color]\nTarcze pochłaniają obrażenia przed kadłubem. Utrata całego kadłuba oznacza zniszczenie statku. Energia zasila część broni oraz dopalanie; odnawia się z czasem, szybciej przy gwieździe.\n\n[color=#91dbea][b]Dobieraj broń do zapasów[/b][/color]\nBroń energetyczna zużywa energię. Działko maszynowe potrzebuje zwykłej amunicji, gamma — napromieniowanej, a wyrzutnie — rakiet. Puste zapasy oznaczają brak strzału. Absorpcja ogranicza obrażenia danego typu.\n\n[color=#91dbea][b]Korzystaj z rozszerzeń[/b][/color]\nMiny atakują obszarowo, flary odciągają uwagę, kamuflaż pomaga zerwać kontakt, teleport przenosi w bezpieczne miejsce, a drony wspierają ostrzał. Doładowanie tarcz działa przy gwieździe. Sprawdzaj koszt i cooldown w opisie.\n\n[color=#f1bd79][b]Uważaj na uciekających przeciwników[/b][/color]\nWróg z kadłubem poniżej 10% ucieka wolniej, ale może zostawić minę. Nie leć bezmyślnie prosto za nim."], - ["Łup i wytwarzanie", "04", "[font_size=26][color=#f1bd79]Zbieraj. Porównuj. Twórz.[/color][/font_size]\n\n[color=#91dbea][b]Łup zbierasz przez podlecenie[/b][/color]\nPrzedmioty w pobliżu są przyciągane do statku. Magazyn mieści 20 przedmiotów; przy pełnym magazynie zwolnij miejsce, żeby zebrać kolejny.\n\n[color=#91dbea][b]Asteroidy zostawiają fizyczne odłamki[/b][/color]\nStrzelaj do asteroid. Po zniszczeniu rozpadają się bazowo na 5–7 poszarpanych fragmentów. Każdy to jedna jednostka surowca — musisz go zebrać. Umiejętność górnika zwiększa uzysk.\n\n[color=#91dbea][b]Przeszukuj wraki[/b][/color]\nPodleć do wraku i przytrzymaj E, aby go przeszukać. Wraki dają surowce (65%), amunicję lub rakiety (łącznie 20%) albo moduł (15%).\n\n[color=#91dbea][b]Warsztat — przycisk TWÓRZ[/b][/color]\nZ minerałów wytworzysz części, amunicję, rakiety i powerbanki. Receptura pokazuje wymagane składniki oraz ilość produktu.\n\n[color=#91dbea][b]Odzyskuj części[/b][/color]\nNajedź na zbędny przedmiot w magazynie i użyj przycisku rozłożenia. Części przydadzą się do napraw."], + ["Łup i wytwarzanie", "04", "[font_size=26][color=#f1bd79]Zbieraj. Porównuj. Twórz.[/color][/font_size]\n\n[color=#91dbea][b]Łup zbierasz przez podlecenie[/b][/color]\nPrzedmioty w pobliżu są przyciągane do statku. Magazyn mieści 20 przedmiotów; przy pełnym magazynie zwolnij miejsce, żeby zebrać kolejny.\n\n[color=#91dbea][b]Asteroidy zostawiają fizyczne odłamki[/b][/color]\nStrzelaj do asteroid. Po zniszczeniu rozpadają się bazowo na 5–7 poszarpanych fragmentów. Każdy to jedna jednostka surowca — musisz go zebrać. Umiejętność górnika zwiększa uzysk.\n\n[color=#91dbea][b]Przeszukuj wraki[/b][/color]\nPodleć do wraku i przytrzymaj E, aby go przeszukać. Wraki dają surowce (65%), amunicję lub rakiety (łącznie 20%) albo moduł (15%).\n\n[color=#91dbea][b]Warsztat fregaty — produkcja[/b][/color]\nZadokuj na fregacie i wybierz Warsztat. Tam wytworzysz amunicję, rakiety, części, powerbanki i wyposażenie kapitana. Koszt sprawdzisz w podpowiedzi przycisku produkcji.\n\n[color=#91dbea][b]Odzyskuj części[/b][/color]\nNajedź na zbędny przedmiot w magazynie i użyj przycisku rozłożenia. Części przydadzą się do napraw."], ["Statek i kapitan", "05", "[font_size=26][color=#f1bd79]Buduj własny styl gry[/color][/font_size]\n\n[color=#91dbea][b]Wyposażenie[/b][/color]\nKliknij panel statku w prawym górnym rogu i otwórz magazyn. Przeciągaj przedmioty do pasujących slotów: maksymalnie 3 bronie, 5 modułów i 5 rozszerzeń. Na początku dostępny jest 1 slot broni i 1 rozszerzenia. Kolejne odblokowujesz w hangarze fregaty za 10 żelaza każdy. Ładownia zaczyna z jednym rzędem (5 miejsc); kolejne rzędy kupujesz w hangarze po 10 żelaza. Po zbudowaniu składu modułów zakładka Magazyn na frachtowcu pozwala odkładać i odbierać wyposażenie. Aktywne rozszerzenia uruchamiasz klawiszami 1–5; pasywne (oznaczone P) działają automatycznie w tych samych slotach. Najedź kursorem, żeby sprawdzić parametry i porównanie wyposażenia.\n\n[color=#91dbea][b]Nie każdy duplikat jest taki sam[/b][/color]\nBroń i moduły mogą mieć różne parametry oraz addony. Aktywne rozszerzenia losują cooldown od 30 do 5 pełnych sekund. Pasywne mają losowaną siłę efektu: Recykler odnawia tarcze i energię po zebraniu odłamka, Wirus przejmuje uciekających wrogów, a Pancerz z tytanu ogranicza obrażenia przy niskim kadłubie. Krótsze odnowienia są rzadkie — przed rozłożeniem porównaj egzemplarze. Rozszerzenia tego samego typu dzielą aktywne odnowienie.\n\n[color=#91dbea][b]Umiejętności kapitana[/b][/color]\nZa pokonanych wrogów zdobywasz doświadczenie i kredyty. Trudniejsze układy dają więcej bazowego XP. Jeśli kapitan przewyższa poziom układu o ponad 2 poziomy, XP za przeciwników i ruiny maleje; przy przewadze 8 poziomów spada do zera. Kredyty i surowce nadal zbierasz. Po awansie wybierasz umiejętność. Pasywne działają stale, aktywne przypisujesz do F1–F5.\n\n[color=#f1bd79][b]Okno umiejętności nie pauzuje gry.[/b][/color]\nOtwieraj je w bezpiecznym miejscu. Przed kolejnym układem uzupełnij zapasy i sprawdź wyposażenie."] - ,["Planety i frachtowiec", "06", "[font_size=26][color=#f1bd79]Wyprawa na powierzchnię[/color][/font_size]\n\nPodleć do planety oznaczonej EARTHLIKE. [b]F[/b] skanuje tlen, temperaturę i zagrożenie biologiczne. [b]L[/b] rozpoczyna lądowanie. Możesz eksplorować przed pokonaniem wrogów, ale lądowanie jest zablokowane podczas walki.\n\nLądownik wymaga 100 HP przed startem i traci 5–20 HP przy wejściu w atmosferę. Na powierzchni sterujesz jak statkiem: [b]W[/b] — ciąg, [b]S[/b] — hamowanie i wstecz, [b]A/D[/b] — obrót, [b]Q/E[/b] — ruch boczny, [b]TAB[/b] — dopalanie. Odkrywaj miejsca i używaj [b]F[/b], aby je zbadać. Lądownik ma osobną energię dopalania. Każdy etap badania pokazuje szansę sukcesu; dalsze etapy dają więcej łupu i większe ryzyko.\n\n[b]L[/b] lub przycisk powrotu kończy wyprawę i przenosi łup do Twoich zasobów. Zniszczenie lądownika oznacza utratę tylko zdobyczy tej wyprawy. Kolejne lądowanie tworzy nową mapę.\n\n[color=#91dbea][b]Frachtowiec[/b][/color]\nZnajdziesz go przy gwieździe centralnej. Podleć i naciśnij [b]L[/b]. Hangar naprawia lądownik (1 część za 1% HP), warsztat wytwarza sprzęt kapitana, a laboratorium przechowuje skany i archiwa.\n\nKapitan zaczyna z podstawowym systemem oddychania, skafandrem i bronią ręczną. Kolejne poziomy tworzysz w warsztacie; sprzęt zmienisz także w panelu pod kapitanem. Wyższy poziom poprawia szanse eksploracji.\n\n[color=#91dbea][b]Losowe spotkania[/b][/color]\nPytajnik na mapie oznacza wydarzenie. Podleć, aby otworzyć okno. Miejscowy inżynier może zaoferować nieznany moduł za 100 kredytów. Wyższe poziomy przedmiotów są coraz rzadsze. Kupiony moduł pozostaje w ładowni wyprawy do bezpiecznego powrotu.\n\n[color=#f1bd79]Podczas wyprawy i wizyty we frachtowcu kosmos jest zamrożony. Zapisywanie między uruchomieniami gry nie jest jeszcze dostępne.[/color]"] + ,["Planety i frachtowiec", "06", "[font_size=26][color=#f1bd79]Wyprawa na powierzchnię[/color][/font_size]\n\nPodleć do planety oznaczonej EARTHLIKE. [b]F[/b] skanuje tlen, temperaturę i zagrożenie biologiczne. [b]L[/b] rozpoczyna lądowanie. Możesz eksplorować przed pokonaniem wrogów, ale lądowanie jest zablokowane podczas walki.\n\nLądownik wymaga 100 HP przed startem i traci 5–20 HP przy wejściu w atmosferę. Na powierzchni sterujesz jak statkiem: [b]W[/b] — ciąg, [b]S[/b] — hamowanie i wstecz, [b]A/D[/b] — obrót, [b]Q/E[/b] — ruch boczny, [b]TAB[/b] — dopalanie. Odkrywaj miejsca i używaj [b]F[/b], aby je zbadać. Lądownik ma osobną energię dopalania. Każdy etap badania pokazuje szansę sukcesu; dalsze etapy dają więcej łupu i większe ryzyko.\n\n[b]L[/b] lub przycisk powrotu kończy wyprawę i przenosi łup do Twoich zasobów. Zniszczenie lądownika oznacza utratę tylko zdobyczy tej wyprawy. Kolejne lądowanie tworzy nową mapę.\n\n[color=#91dbea][b]Frachtowiec[/b][/color]\nZnajdziesz go przy gwieździe centralnej. Podleć i naciśnij [b]L[/b]. Hangar naprawia lądownik (1 część za 1% HP), warsztat prowadzi całą produkcję amunicji, rakiet, zaopatrzenia i sprzętu kapitana, a laboratorium przechowuje skany i archiwa.\n\nKapitan zaczyna z podstawowym systemem oddychania, skafandrem i bronią ręczną. Kolejne poziomy tworzysz w warsztacie; posiadany sprzęt zmienisz w Warsztacie. Kliknięcie panelu kapitana pokazuje sylwetkę, założone przedmioty i redukcję zagrożeń nad slotami. Wyższy poziom poprawia szanse eksploracji.\n\n[color=#91dbea][b]Losowe spotkania[/b][/color]\nPytajnik na mapie oznacza wydarzenie. Podleć, aby otworzyć okno. Miejscowy inżynier może zaoferować nieznany moduł za 100 kredytów. Wyższe poziomy przedmiotów są coraz rzadsze. Kupiony moduł pozostaje w ładowni wyprawy do bezpiecznego powrotu.\n\n[color=#f1bd79]Podczas wyprawy i wizyty we frachtowcu kosmos jest zamrożony. Zapisywanie między uruchomieniami gry nie jest jeszcze dostępne.[/color]"] , ["Autorzy dźwięków", "07", "[font_size=26][color=#f1bd79]Dźwięki otoczenia[/color][/font_size]\n\n[b]Blender Foundation — Ambient Bird, Cricket and Frog (Yo Frankie!)[/b]\nOdgłosy świerszcza i żaby, udostępnione przez Lamoot:\nhttps://opengameart.org/content/ambient-bird-cricket-and-frog\nLicencja Creative Commons Attribution 3.0:\nhttps://creativecommons.org/licenses/by/3.0/\nZmiany: filtrowanie, płynne początki i zakończenia, zmiana wysokości żaby oraz konwersja do stereo 48 kHz. Autorzy nie są powiązani z tą grą.\n\n[b]Nagrania na licencji CC0[/b]\nThimras — Park ambiences (wiatr).\nIwan „qubodup” Gabovitch — 20 Rustles of dry leaves.\nisaiah658 — Ambient Bird Sounds.\nRudmer_Rotteveel — Wood Creak Single V7.\n\n[b]Wnętrze fregaty — CC0[/b]\nLEGIT Audio — The Shop (bezpłatne próbki OpenGameArt).\nbart — 68 Workshop Sounds i Steam release sounds.\nKenney — Sci-Fi Sounds.\n\nSzczegółowe źródła i zakres obróbki znajdują się w plikach CREDITS.md i manifest.json przy zasobach audio."] ] var _panel: PanelContainer diff --git a/tests/abilities/hud_cooldown_reset_test.gd b/tests/abilities/hud_cooldown_reset_test.gd index e046e47..a5ec642 100644 --- a/tests/abilities/hud_cooldown_reset_test.gd +++ b/tests/abilities/hud_cooldown_reset_test.gd @@ -22,9 +22,9 @@ func _ready() -> void: var hud := game.get_node("HUD") var captain := hud.get_node("HUDRoot/CaptainPanel") as PanelContainer assert(captain.size.x <= 250) - assert(captain.get_theme_stylebox("panel").bg_color.a == 0.0) + assert(captain.get_theme_stylebox("panel").bg_color.a > 0.0) assert(captain.get_node("Contents/PortraitRow/AvatarFrame/CaptainAvatar").custom_minimum_size == Vector2(54, 54)) - assert(hud.get_node("HUDRoot/TopNavigation").get_child_count() == 2) + assert(hud.get_node("HUDRoot/TopNavigation").get_child_count() == 1) assert(hud.get_node("HUDRoot/TopNavigation").get_child(0).get_node("RoundedArtwork").texture != null) var inventory := ship.get_node("ShipInventory") as ShipInventory var item := ItemInstance.new() diff --git a/tests/levels/freighter_production_test.gd b/tests/levels/freighter_production_test.gd new file mode 100644 index 0000000..4844577 --- /dev/null +++ b/tests/levels/freighter_production_test.gd @@ -0,0 +1,72 @@ +extends Node +const RECIPES := preload("res://scripts/items/crafting_recipes.gd") +func _ready() -> void: + GameState.start_new_run() + var captain := GameState.captain + for key in RECIPES.MINERALS: captain.minerals[key] = 1000 + var game := preload("res://scenes/game/game.tscn").instantiate() + add_child(game) + await get_tree().process_frame + var hud := game.get_node("HUD/HUDRoot") + assert(hud.get_node_or_null("CraftingWindow") == null) + assert(hud.get_node("TopNavigation").get_child_count() == 1) + var manager := game.get_node("PlanetExpeditions") + manager.open_freighter() + var screen: Control = manager.screen + var inventory: ShipInventory = game.player.get_node("ShipInventory") + screen._select_section("workshop") + assert(screen._drawer.find_child("workshopTab",true,false) == null) + for id in RECIPES.IDS: + var stock := inventory.get_crafted_stock(id) + var before: Dictionary = captain.minerals.duplicate() + var button: Button = screen._content.find_child("Craft_"+id,true,false) + assert(button != null and not button.disabled) + assert(button.text == "+1") + button.pressed.emit() + assert(inventory.get_crafted_stock(id) == stock+int(RECIPES.DATA[id].amount)) + for key in RECIPES.DATA[id].cost: + assert(captain.minerals[key] == before[key]-int(RECIPES.DATA[id].cost[key])) + var ten: Button = screen._content.find_child("Craft10_"+id,true,false) + assert(ten.text == "+10" and not ten.disabled) + stock = inventory.get_crafted_stock(id) + before = captain.minerals.duplicate() + ten.pressed.emit() + assert(inventory.get_crafted_stock(id) == stock+10*int(RECIPES.DATA[id].amount)) + for key in RECIPES.DATA[id].cost: + assert(captain.minerals[key] == before[key]-10*int(RECIPES.DATA[id].cost[key])) + captain.minerals.sulfur = 3 + screen._refresh() + assert(not screen._content.find_child("Craft_missile",true,false).disabled) + assert(screen._content.find_child("Craft10_missile",true,false).disabled) + var missiles_before := inventory.missile_ammunition + screen._craft_supply("missile",10) + assert(inventory.missile_ammunition == missiles_before and captain.minerals.sulfur == 3) + captain.minerals.sulfur = 0 + screen._refresh() + assert(screen._content.find_child("Craft_missile",true,false).disabled) + screen._select_section("storage") + var before_ammo := inventory.ammunition + screen._craft_supply("ammunition") + assert(inventory.ammunition == before_ammo) + screen._construct_room("expansion_3") + assert(screen._content.find_child("Stock_ammunition",true,false) != null) + assert(screen._content.find_child("Stock_credits",true,false) != null) + assert(screen._content.find_child("Stock_silicon",true,false) != null) + assert(screen._content.find_child("Stock_samples",true,false) != null) + for index in inventory.cargo.size(): inventory.cargo[index] = null + for index in 3: + var item := preload("res://scripts/items/item_generator.gd").generate_for_definition(preload("res://resources/items/reinforced_shield.tres"),index+1) + assert(inventory.add_item(item)) + screen._refresh() + assert(screen._content.find_child("ShipSlots",true,false).get_child_count() == 20) + assert(screen._content.find_child("FreighterSlots",true,false).get_child_count() == 20) + screen._transfer_all(false) + assert(inventory.get_cargo_used() == 0 and captain.expedition.freighter_storage.size() == 3) + screen._transfer_all(true) + assert(inventory.get_cargo_used() == 3 and captain.expedition.freighter_storage.is_empty()) + screen.closed.emit() + game.queue_free() + await get_tree().process_frame + await get_tree().process_frame + print("FREIGHTER PRODUCTION PASS: HUD crafting removed, no section tabs, all 5 recipes, exact costs, stock, unavailable craft, resource overview, slot grids, bulk transfers") + get_tree().quit() diff --git a/tests/levels/freighter_production_test.gd.uid b/tests/levels/freighter_production_test.gd.uid new file mode 100644 index 0000000..cb3c053 --- /dev/null +++ b/tests/levels/freighter_production_test.gd.uid @@ -0,0 +1 @@ +uid://dv8ri6b1cp2w8 diff --git a/tests/levels/freighter_production_test.tscn b/tests/levels/freighter_production_test.tscn new file mode 100644 index 0000000..5520262 --- /dev/null +++ b/tests/levels/freighter_production_test.tscn @@ -0,0 +1,4 @@ +[gd_scene load_steps=2 format=3] +[ext_resource type="Script" path="res://tests/levels/freighter_production_test.gd" id="1"] +[node name="FreighterProductionTest" type="Node"] +script = ExtResource("1") diff --git a/tests/levels/planet_expeditions_test.gd b/tests/levels/planet_expeditions_test.gd index 0dbc0ae..8b25ea7 100644 --- a/tests/levels/planet_expeditions_test.gd +++ b/tests/levels/planet_expeditions_test.gd @@ -94,8 +94,8 @@ func _ready() -> void: assert(GameState.captain.expedition.deliver_modules(inventory) == 1) assert(GameState.captain.expedition.delivered_modules.is_empty()) var gear_panel := game.get_node("HUD/HUDRoot/CaptainEquipment") - var breathing_slot := gear_panel.find_child("BreathingSlot",true,false) - var suit_slot := gear_panel.find_child("SuitSlot",true,false) + var breathing_slot: Control = gear_panel._wardrobe.find_child("BreathingSlot",true,false) + var suit_slot: Control = gear_panel._wardrobe.find_child("SuitSlot",true,false) GameState.captain.parts = 500 GameState.captain.minerals.silicon = 500 GameState.captain.minerals.copper = 500 @@ -120,6 +120,8 @@ func _ready() -> void: manager.land_nearby() assert(get_tree().paused and GameState.captain.expedition.active) assert(manager.screen.world.data.pois.size() >= 6 and manager.screen.world.data.pois.size() <= 7) + assert(manager.screen.planet_texture == manager._near_planet.body_texture) + assert(manager.screen._telemetry.portrait.texture == manager._near_planet.body_texture) for poi in manager.screen.world.data.pois: manager.screen._poi = poi manager.screen._show_poi() diff --git a/tests/previews/captain_equipment_preview.gd b/tests/previews/captain_equipment_preview.gd new file mode 100644 index 0000000..f1e4724 --- /dev/null +++ b/tests/previews/captain_equipment_preview.gd @@ -0,0 +1,72 @@ +extends Node +const GEAR := preload("res://scripts/planets/captain_equipment.gd") +const SKILLS := preload("res://scripts/captain/captain_skills.gd") +func settle() -> void: + for frame in 5: await get_tree().process_frame + await RenderingServer.frame_post_draw + +func _ready() -> void: + GameState.start_new_run() + var captain := GameState.captain + captain.parts = 500 + for key in ["silicon","copper","nickel","iron","tungsten","titanium"]: captain.minerals[key] = 500 + for id in SKILLS.IDS: + captain.skills[id] = 1 + var icon := SKILLS.icon(id) + assert(icon == SKILLS.icon(id)) + assert(icon.get_size() == Vector2(384,384) and icon.get_image().has_mipmaps()) + var game := preload("res://scenes/game/game.tscn").instantiate() + add_child(game) + await settle() + game.player.set_physics_process(false) + var hud := game.get_node("HUD/HUDRoot") + var panel := hud.get_node("CaptainPanel") + var gear := hud.get_node("CaptainEquipment") + assert(not gear.visible and not gear._wardrobe.visible) + assert(hud.get_node("MissionObjectives").position.y >= panel.position.y+panel.size.y) + for kind in GEAR.KINDS: assert(not GEAR.craft(captain,kind).is_empty()) + var click := InputEventMouseButton.new() + click.button_index = MOUSE_BUTTON_LEFT + click.position = panel.get_global_rect().get_center() + click.pressed = true + Input.parse_input_event(click) + await settle() + click.pressed = false + Input.parse_input_event(click) + assert(gear._wardrobe.visible,"Clicking the captain must open equipment") + assert(not get_tree().paused) + assert(gear._wardrobe.size.x <= 244) + assert(gear._wardrobe.size.y <= 330) + assert(gear._wardrobe.position.x == panel.position.x) + assert(gear._wardrobe.position.y >= panel.position.y+panel.size.y) + assert(gear._wardrobe.find_child("ReturnEquipment",true,false) == null) + assert(gear._wardrobe.find_children("*","GridContainer",true,false).is_empty()) + var breathing: Control = gear._wardrobe.find_child("BreathingSlot",true,false) + var suit: Control = gear._wardrobe.find_child("SuitSlot",true,false) + var uid := -1 + for item in captain.gear_items: + if item.kind == "breathing" and item.level == 2: uid = item.uid + assert(breathing._can_drop_data(Vector2.ZERO,{"captain_gear":uid})) + assert(not suit._can_drop_data(Vector2.ZERO,{"captain_gear":uid})) + breathing._drop_data(Vector2.ZERO,{"captain_gear":uid}) + assert(GEAR.level(captain,"breathing") == 2) + assert(breathing._label.text.is_empty()) + assert(breathing.tooltip_text.contains("Poziom 2")) + assert(captain.gear_items.size() == 6) + assert(gear._protection.text.contains("Tlen 4")) + assert(gear._wardrobe.find_child("PaperDoll",true,false)._reductions.breathing.text == "−4%") + await settle() + assert(gear._wardrobe.get_global_rect().end.x <= get_viewport().get_visible_rect().size.x) + assert(gear._wardrobe.get_global_rect().end.y <= get_viewport().get_visible_rect().size.y) + assert(get_viewport().get_texture().get_image().save_png("res://artifacts/captain_equipment_redesign.png") == OK) + var escape := InputEventKey.new() + escape.pressed = true + escape.keycode = KEY_ESCAPE + Input.parse_input_event(escape) + await settle() + assert(not gear._wardrobe.visible) + game.get_node("HUD/CaptainSkills").open_management() + await settle() + assert(get_viewport().get_texture().get_image().save_png("res://artifacts/captain_unified_skills.png") == OK) + print("CAPTAIN EQUIPMENT PASS: 244px width, below captain, no backpack, slots, preserved gear, protection, panel click and ESC") + get_tree().quit() diff --git a/tests/previews/captain_equipment_preview.gd.uid b/tests/previews/captain_equipment_preview.gd.uid new file mode 100644 index 0000000..6a8d8da --- /dev/null +++ b/tests/previews/captain_equipment_preview.gd.uid @@ -0,0 +1 @@ +uid://ceu6lns2h2ef0 diff --git a/tests/previews/captain_equipment_preview.tscn b/tests/previews/captain_equipment_preview.tscn new file mode 100644 index 0000000..c1a130b --- /dev/null +++ b/tests/previews/captain_equipment_preview.tscn @@ -0,0 +1,4 @@ +[gd_scene load_steps=2 format=3] +[ext_resource type="Script" path="res://tests/previews/captain_equipment_preview.gd" id="1"] +[node name="CaptainEquipmentPreview" type="Node"] +script = ExtResource("1") diff --git a/tests/previews/freighter_interior_preview.gd b/tests/previews/freighter_interior_preview.gd index a0f49e8..84d4f9a 100644 --- a/tests/previews/freighter_interior_preview.gd +++ b/tests/previews/freighter_interior_preview.gd @@ -9,7 +9,7 @@ func settle() -> void: func capture(name: String) -> void: await settle() - get_viewport().get_texture().get_image().save_png("res://artifacts/freighter_interior_%s.png" % name) + assert(get_viewport().get_texture().get_image().save_png("res://artifacts/freighter_operations_%s.png" % name) == OK) func click_room(id: String) -> void: var section: Dictionary = screen.deck.room(id) @@ -74,7 +74,7 @@ func _ready() -> void: await capture("workshop") assert(screen._drawer.get_global_rect().end.x <= get_viewport().get_visible_rect().size.x) assert(screen._drawer.get_global_rect().end.y <= get_viewport().get_visible_rect().size.y) - var build := button_starting("WYTWÓRZ I ZAŁÓŻ") + var build := screen._content.find_child("CraftGear_breathing",true,false) as Button assert(build != null and not build.disabled) build.pressed.emit() assert(GEAR.level(GameState.captain,"breathing") == 2) @@ -92,7 +92,7 @@ func _ready() -> void: assert(not screen._drawer.visible and get_tree().paused) click_room("hangar") await capture("hangar") - var repair := button_starting("NAPRAW DO 100") + var repair := screen._content.find_child("RepairLander",true,false) as Button assert(repair != null and not repair.disabled) repair.pressed.emit() assert(GameState.captain.expedition.lander_hp == 100) @@ -100,13 +100,13 @@ func _ready() -> void: # Full cargo must not lose the expedition's recovered module. var inventory: ShipInventory = game.player.get_node("ShipInventory") var module := preload("res://scripts/items/item_generator.gd").generate_for_definition(preload("res://resources/items/reinforced_shield.tres"),3) - for index in inventory.cargo.size(): inventory.cargo[index] = module + for index in inventory.get_cargo_capacity(): inventory.cargo[index] = module GameState.captain.expedition.delivered_modules.append(module) screen._refresh() - button_starting("ODBIERZ").pressed.emit() + screen._content.find_child("CollectRecovered",true,false).pressed.emit() assert(GameState.captain.expedition.delivered_modules.size() == 1) inventory.cargo[0] = null - button_starting("ODBIERZ").pressed.emit() + screen._content.find_child("CollectRecovered",true,false).pressed.emit() assert(GameState.captain.expedition.delivered_modules.is_empty()) var credits_before: int = GameState.captain.credits var parts_before: float = GameState.captain.parts @@ -127,6 +127,24 @@ func _ready() -> void: assert(GameState.captain.credits == credits_before) assert(GameState.captain.parts == parts_before) assert(GameState.captain.minerals == minerals_before) + screen._select_section("storage") + await capture("storage_menu") + screen._select_section("hangar") + screen._refresh() + await capture("hangar_upgrades") + assert(screen._content.find_child("UnlockWeapon",true,false) != null) + # Compact drawer layout still fits when the usable area becomes narrower. + screen.size = Vector2(640,600) + screen._select_section("storage") + await settle() + assert(screen._storage_columns.columns == 1) + assert(screen._drawer.get_global_rect().end.x <= 640) + assert(screen._drawer.get_global_rect().end.y <= 600) + assert(screen._drawer.find_child("workshopTab",true,false) == null) + screen._select_section("workshop") + assert(screen._tab == "workshop") + screen.size = get_viewport().get_visible_rect().size + screen._layout() # Room state is an exported resource field, ready for game save serialization. assert(ResourceSaver.save(GameState.captain.expedition,"user://freighter_rooms_test.tres") == OK) var restored: Resource = ResourceLoader.load("user://freighter_rooms_test.tres","",ResourceLoader.CACHE_MODE_IGNORE) diff --git a/tests/previews/freighter_windows_review.gd b/tests/previews/freighter_windows_review.gd new file mode 100644 index 0000000..5c5b324 --- /dev/null +++ b/tests/previews/freighter_windows_review.gd @@ -0,0 +1,72 @@ +extends Node +var screen: Control +var snapshots := 0 +var gallery: Image + +func settle() -> void: + for frame in 5: await get_tree().process_frame + await RenderingServer.frame_post_draw + +func review(id: String, phase: String) -> void: + screen._select_section(id) + await settle() + var rect: Rect2 = screen._drawer.get_global_rect() + assert(rect.position.x >= 0 and rect.position.y >= 0) + assert(rect.end.x <= get_viewport().get_visible_rect().size.x and rect.end.y <= get_viewport().get_visible_rect().size.y) + var frame: StyleBoxFlat = screen._drawer.get_theme_stylebox("panel") + assert(frame.bg_color.a > 0.5 and frame.bg_color.a < 1) + for panel in screen._content.find_children("*","PanelContainer",true,false): + var style = panel.get_theme_stylebox("panel") + if style is StyleBoxFlat: assert(style.bg_color.a < 1) + if id == "hangar": + for name in ["RepairLander","UnlockCargo","UnlockWeapon","UnlockExtension","CollectRecovered"]: + var button: Button = screen._content.find_child(name,true,false) + assert(button != null and button.is_visible_in_tree()) + assert(button.get_global_rect().end.y < rect.end.y) + assert(button.autowrap_mode == TextServer.AUTOWRAP_OFF) + assert(screen._content.find_child("RepairCost",true,false).text == str(GameState.captain.expedition.repair_cost())) + for button in screen._content.find_children("*","Button",true,false): + assert(button.text not in ["Serwis i odbiór","Rozbudowa statku"]) + var shot := get_viewport().get_texture().get_image() + assert(shot.save_png("res://artifacts/frigate_review_%s_%s.png" % [id,phase]) == OK) + shot.convert(Image.FORMAT_RGBA8) + shot.resize(480,270,Image.INTERPOLATE_LANCZOS) + gallery.blit_rect(shot,Rect2i(0,0,480,270),Vector2i(snapshots%3*480,snapshots/3*270)) + snapshots += 1 + +func _ready() -> void: + GameState.start_new_run() + var captain := GameState.captain + captain.parts = 100 + for key in ["iron","titanium","aluminium","uranium","sulfur"]: captain.minerals[key] = 1000 + captain.expedition.lander_hp = 62 + var game := preload("res://scenes/game/game.tscn").instantiate() + add_child(game) + await settle() + game.get_node("PlanetExpeditions").open_freighter() + screen = game.get_node("PlanetExpeditions").screen + gallery = Image.create(1440,1890,false,Image.FORMAT_RGBA8) + for room in screen.deck.ROOMS: await review(str(room.id),"initial") + for id in ["expansion_1","expansion_2","expansion_3","cabin_1","cabin_2","cabin_3","cabin_4","cabin_5"]: + screen._select_section(id) + screen._construct_room(id) + await review(id,"built") + await review("storage","built") + await review("hangar","single") + var repair: Button = screen._content.find_child("RepairLander",true,false) + assert(not repair.disabled) + repair.pressed.emit() + assert(captain.expedition.lander_hp == 100 and captain.parts == 62) + var inventory: ShipInventory = game.player.get_node("ShipInventory") + for name in ["UnlockCargo","UnlockWeapon","UnlockExtension"]: + var button: Button = screen._content.find_child(name,true,false) + assert(not button.disabled) + button.pressed.emit() + assert(captain.minerals.iron == 970) + assert(inventory.unlocked_cargo_rows == 2 and inventory.unlocked_weapon_slots == 2 and inventory.unlocked_extension_slots == 2) + assert(gallery.save_png("res://artifacts/frigate_all_windows_review.png") == OK) + screen.closed.emit() + game.queue_free() + await get_tree().process_frame + print("FRIGATE WINDOWS PASS: 21 screenshots, all 11 sections plus built rooms, bounds, translucent windows/cards, hangar without tabs, visible controls, repair and three upgrades") + get_tree().quit() diff --git a/tests/previews/freighter_windows_review.tscn b/tests/previews/freighter_windows_review.tscn new file mode 100644 index 0000000..1181743 --- /dev/null +++ b/tests/previews/freighter_windows_review.tscn @@ -0,0 +1,4 @@ +[gd_scene load_steps=2 format=3] +[ext_resource type="Script" path="res://tests/previews/freighter_windows_review.gd" id="1"] +[node name="FreighterWindowsReview" type="Node"] +script = ExtResource("1") diff --git a/tests/previews/poi_presentation_preview.gd b/tests/previews/poi_presentation_preview.gd index 1c5269b..5259bac 100644 --- a/tests/previews/poi_presentation_preview.gd +++ b/tests/previews/poi_presentation_preview.gd @@ -17,6 +17,7 @@ func _ready() -> void: surface.captain = GameState.captain surface.progress = progress add_child(surface) + assert(surface._telemetry.portrait.texture == surface.planet_texture) surface.set_process(false) surface.set_physics_process(false) var cave: Dictionary @@ -31,6 +32,9 @@ func _ready() -> void: surface.world.refresh_pois(cave.position) surface._surface_viewport.get_node("SurfaceAtmosphere").hide() await settle() + assert(surface._telemetry.size.x <= 360) + assert(surface._telemetry.size.y <= 300) + assert(surface.get_node("SurfaceControls").size.x >= 350) get_viewport().get_texture().get_image().save_png("res://artifacts/cave_mountain_preview.png") var sheet := Image.create(1350,3250,false,Image.FORMAT_RGBA8) for row in 5: @@ -42,13 +46,15 @@ func _ready() -> void: assert(rect.end.y <= get_viewport().get_visible_rect().size.y and rect.size.x <= 450) var art: TextureRect = surface._choices.get_child(0).get_child(0) assert(art.texture is AtlasTexture) + for label in surface._choices.find_children("*","Label",true,false): + assert(label.get_theme_font_size("font_size") <= 20) var screenshot := get_viewport().get_texture().get_image() if row == 4 and stage == 0: screenshot.save_png("res://artifacts/cave_poi_window.png") var card := screenshot.get_region(Rect2i(rect)) card.convert(Image.FORMAT_RGBA8) card.resize(450,650,Image.INTERPOLATE_LANCZOS) sheet.blit_rect(card,Rect2i(0,0,450,650),Vector2i(stage*450,row*650)) - sheet.save_png("res://artifacts/poi_stage_cards.png") + assert(sheet.save_png("res://artifacts/poi_stage_cards_compact.png") == OK) get_window().size = Vector2i(800,600) await settle() surface._resize_surface_viewport() diff --git a/tests/ships/freighter_storage_test.gd b/tests/ships/freighter_storage_test.gd index 359e574..a2dc19e 100644 --- a/tests/ships/freighter_storage_test.gd +++ b/tests/ships/freighter_storage_test.gd @@ -6,7 +6,7 @@ func settle() -> void: func find_button(prefix: String) -> Button: for node in screen._content.find_children("*","Button",true,false): - if node.text.begins_with(prefix): return node + if str(node.get_meta("transfer_action",node.text)).begins_with(prefix): return node return null func _ready() -> void: @@ -49,7 +49,7 @@ func _ready() -> void: assert(not inv.unlock_cargo_row(captain) and captain.minerals.iron == 9) captain.minerals["iron"] = 30 screen._refresh() - find_button("ODBLOKUJ RZĄD").pressed.emit() + screen._content.find_child("UnlockCargo",true,false).pressed.emit() assert(inv.get_cargo_capacity() == 10 and captain.minerals.iron == 20) screen._select_section("storage") find_button("← ODBIERZ").pressed.emit() diff --git a/tests/ships/slot_unlock_test.gd b/tests/ships/slot_unlock_test.gd index d8dcb83..0b85162 100644 --- a/tests/ships/slot_unlock_test.gd +++ b/tests/ships/slot_unlock_test.gd @@ -38,7 +38,7 @@ func _ready() -> void: get_viewport().get_texture().get_image().save_png("res://artifacts/hangar_slot_unlock.png") var button: Button for node in screen._content.find_children("*","Button",true,false): - if node.text.begins_with("ODBLOKUJ SLOT BRONI"): button = node + if node.name == "UnlockWeapon": button = node assert(button != null and not button.disabled) button.pressed.emit() assert(inv.unlocked_weapon_slots == 2 and captain.minerals.iron == 50)