diff --git a/README.md b/README.md index 07dc994..f5a0a59 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Godot 4 tactical RPG prototype inspired by classic turn-based Romance of the Thr - Pre-battle shop rows emphasize item artwork, compact price/status badges, and hover details instead of dense inline text. - Pre-battle Talk can list scenario camp conversations by officer or topic with portrait rows, compact topic/supply badges, hover dialogue previews, saved-branch filtering, one-time pre-battle supplies, and merchant flavor lines before a battle. - The opening battle's camp now includes a villager route report that frames the castle, village recovery point, and enemy approach before combat starts. +- The opening battle now uses a dedicated high-resolution Yingchuan battlefield backdrop, lighter terrain overlays, no text class boxes on units, quieter objective progress text, and a pulled-back enemy line so the player can lure and form up before the first clash. - The opening victory dialogue now bridges Xiahou Yuan and Cao Ren's join into the Sishui Gate march against Hua Xiong. - Sishui Gate now opens with camp dialogue that turns the coalition briefing into a spoken march order. - Pre-battle Armory equipment changes, including unequipping gear back into stock, save immediately and sync roster equipment plus inventory stock, with portrait and item-icon rows plus hover change details. @@ -122,7 +123,7 @@ Godot 4 tactical RPG prototype inspired by classic turn-based Romance of the Thr - Campaign completion screen. - New campaign save reset. - Manual campaign checkpoint save/load. -- Cinematic title screen uses the battlefield backdrop and Cao Cao portrait art, offers start/load/settings, leads new campaigns through a four-beat Cao Cao decision and Xiahou Dun opening prologue, exposes the same audio/edge-scroll settings from the top in-game toolbar, and persists BGM/SFX volume, sound toggles, and edge-scroll preference in `user://heros_settings.json`. +- Cinematic title screen uses a dedicated ancient-war-camp dawn backdrop and Cao Cao portrait art, offers start/load/settings, leads new campaigns through a four-beat Cao Cao decision and Xiahou Dun opening prologue, exposes the same audio/edge-scroll settings from the top in-game toolbar, and persists BGM/SFX volume, sound toggles, and edge-scroll preference in `user://heros_settings.json`. - Victory and defeat result overlay. - Dialogue portrait slot stays fixed across speaker and narration lines, with officer default image paths, optional per-line overrides, and speaker-initial or record fallback. - Initial AI-generated photorealistic officer portraits for Cao Cao, Xiahou Dun, Xiahou Yuan, Cao Ren, Dian Wei, Guo Jia, and Zhang He. diff --git a/art/backgrounds/battlefield_frontier.png.import b/art/backgrounds/battlefield_frontier.png.import new file mode 100644 index 0000000..34937f4 --- /dev/null +++ b/art/backgrounds/battlefield_frontier.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cbwp075omm6yf" +path="res://.godot/imported/battlefield_frontier.png-59cc89af7e0af922f57059201b251f0c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/battlefield_frontier.png" +dest_files=["res://.godot/imported/battlefield_frontier.png-59cc89af7e0af922f57059201b251f0c.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/art/backgrounds/cangting_pursuit.png.import b/art/backgrounds/cangting_pursuit.png.import new file mode 100644 index 0000000..8477582 --- /dev/null +++ b/art/backgrounds/cangting_pursuit.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgv2smb34dxfg" +path="res://.godot/imported/cangting_pursuit.png-0bc7fc8c978319e6c377fda4344d22bb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/cangting_pursuit.png" +dest_files=["res://.godot/imported/cangting_pursuit.png-0bc7fc8c978319e6c377fda4344d22bb.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/art/backgrounds/guandu_defensive_camps.png.import b/art/backgrounds/guandu_defensive_camps.png.import new file mode 100644 index 0000000..9248e11 --- /dev/null +++ b/art/backgrounds/guandu_defensive_camps.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://l0ygws04quhy" +path="res://.godot/imported/guandu_defensive_camps.png-6cdfc2b48893992ad8d7b34ec7ef049e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/guandu_defensive_camps.png" +dest_files=["res://.godot/imported/guandu_defensive_camps.png-6cdfc2b48893992ad8d7b34ec7ef049e.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/art/backgrounds/luoyang_escort_road.png.import b/art/backgrounds/luoyang_escort_road.png.import new file mode 100644 index 0000000..18a23fb --- /dev/null +++ b/art/backgrounds/luoyang_escort_road.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cfuji3v85d5hr" +path="res://.godot/imported/luoyang_escort_road.png-918bf48ed72200aab526f1d41e08b8d1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/luoyang_escort_road.png" +dest_files=["res://.godot/imported/luoyang_escort_road.png-918bf48ed72200aab526f1d41e08b8d1.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/art/backgrounds/puyang_raid_camp.png.import b/art/backgrounds/puyang_raid_camp.png.import new file mode 100644 index 0000000..e45c1e2 --- /dev/null +++ b/art/backgrounds/puyang_raid_camp.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://gcge051cjd67" +path="res://.godot/imported/puyang_raid_camp.png-0c4db7d0378db33112f169937c4ffffe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/puyang_raid_camp.png" +dest_files=["res://.godot/imported/puyang_raid_camp.png-0c4db7d0378db33112f169937c4ffffe.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/art/backgrounds/qingzhou_village_road.png.import b/art/backgrounds/qingzhou_village_road.png.import new file mode 100644 index 0000000..18bf70b --- /dev/null +++ b/art/backgrounds/qingzhou_village_road.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://mum1uf034ihs" +path="res://.godot/imported/qingzhou_village_road.png-01d5fb85dcb11e6582d753367685ebe3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/qingzhou_village_road.png" +dest_files=["res://.godot/imported/qingzhou_village_road.png-01d5fb85dcb11e6582d753367685ebe3.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/art/backgrounds/sishui_gate_pass.png.import b/art/backgrounds/sishui_gate_pass.png.import new file mode 100644 index 0000000..aa96dd2 --- /dev/null +++ b/art/backgrounds/sishui_gate_pass.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ciy76875u1hhm" +path="res://.godot/imported/sishui_gate_pass.png-7bb9a25a220984a81ae7bcbdb3bd7b72.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/sishui_gate_pass.png" +dest_files=["res://.godot/imported/sishui_gate_pass.png-7bb9a25a220984a81ae7bcbdb3bd7b72.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/art/backgrounds/title_war_camp_dawn.png b/art/backgrounds/title_war_camp_dawn.png new file mode 100644 index 0000000..81a4105 Binary files /dev/null and b/art/backgrounds/title_war_camp_dawn.png differ diff --git a/art/backgrounds/title_war_camp_dawn.png.import b/art/backgrounds/title_war_camp_dawn.png.import new file mode 100644 index 0000000..652f24f --- /dev/null +++ b/art/backgrounds/title_war_camp_dawn.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cyxi72m2kqblk" +path="res://.godot/imported/title_war_camp_dawn.png-56ed1d6edcdd9f48b984e7566011bf0e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/title_war_camp_dawn.png" +dest_files=["res://.godot/imported/title_war_camp_dawn.png-56ed1d6edcdd9f48b984e7566011bf0e.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/art/backgrounds/wan_castle_escape.png.import b/art/backgrounds/wan_castle_escape.png.import new file mode 100644 index 0000000..0ffe0c0 --- /dev/null +++ b/art/backgrounds/wan_castle_escape.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c85ll735m4g3m" +path="res://.godot/imported/wan_castle_escape.png-4fb77a8b48889348ed8c1c8ad3d2b9ea.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/wan_castle_escape.png" +dest_files=["res://.godot/imported/wan_castle_escape.png-4fb77a8b48889348ed8c1c8ad3d2b9ea.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/art/backgrounds/white_horse_relief.png.import b/art/backgrounds/white_horse_relief.png.import new file mode 100644 index 0000000..9bb770f --- /dev/null +++ b/art/backgrounds/white_horse_relief.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjnav0u7us8r1" +path="res://.godot/imported/white_horse_relief.png-3f16fcb423ab1aed233237e8bed3f758.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/white_horse_relief.png" +dest_files=["res://.godot/imported/white_horse_relief.png-3f16fcb423ab1aed233237e8bed3f758.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/art/backgrounds/wuchao_night_granary.png.import b/art/backgrounds/wuchao_night_granary.png.import new file mode 100644 index 0000000..46fb2f7 --- /dev/null +++ b/art/backgrounds/wuchao_night_granary.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vy1rnnffp2ea" +path="res://.godot/imported/wuchao_night_granary.png-857d9b494a940f575d364af98370a4c3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/wuchao_night_granary.png" +dest_files=["res://.godot/imported/wuchao_night_granary.png-857d9b494a940f575d364af98370a4c3.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/art/backgrounds/xiapi_flooded_siege.png.import b/art/backgrounds/xiapi_flooded_siege.png.import new file mode 100644 index 0000000..6addbdd --- /dev/null +++ b/art/backgrounds/xiapi_flooded_siege.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bxj3y8txoexbv" +path="res://.godot/imported/xiapi_flooded_siege.png-8c4680f9e26239a0e341db412fd02866.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/xiapi_flooded_siege.png" +dest_files=["res://.godot/imported/xiapi_flooded_siege.png-8c4680f9e26239a0e341db412fd02866.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/art/backgrounds/xingyang_forest_ambush.png.import b/art/backgrounds/xingyang_forest_ambush.png.import new file mode 100644 index 0000000..d9af76d --- /dev/null +++ b/art/backgrounds/xingyang_forest_ambush.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bp1ntvab70uic" +path="res://.godot/imported/xingyang_forest_ambush.png-fe502053f8c0bd9c4e90830911faab2d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/xingyang_forest_ambush.png" +dest_files=["res://.godot/imported/xingyang_forest_ambush.png-fe502053f8c0bd9c4e90830911faab2d.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/art/backgrounds/ye_inner_gate.png.import b/art/backgrounds/ye_inner_gate.png.import new file mode 100644 index 0000000..cc5abaf --- /dev/null +++ b/art/backgrounds/ye_inner_gate.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4bxnyfxnucba" +path="res://.godot/imported/ye_inner_gate.png-e4d7d0316ebc9c21ae9d804d83c5fe26.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/ye_inner_gate.png" +dest_files=["res://.godot/imported/ye_inner_gate.png-e4d7d0316ebc9c21ae9d804d83c5fe26.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/art/backgrounds/ye_outer_defense.png.import b/art/backgrounds/ye_outer_defense.png.import new file mode 100644 index 0000000..d82591c --- /dev/null +++ b/art/backgrounds/ye_outer_defense.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dfg8q66gmxods" +path="res://.godot/imported/ye_outer_defense.png-0469e768b22be9f264e9fbf7dada0a8c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/ye_outer_defense.png" +dest_files=["res://.godot/imported/ye_outer_defense.png-0469e768b22be9f264e9fbf7dada0a8c.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/art/backgrounds/ye_palace_road.png.import b/art/backgrounds/ye_palace_road.png.import new file mode 100644 index 0000000..3b8bef0 --- /dev/null +++ b/art/backgrounds/ye_palace_road.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ccqetoa2dxgi2" +path="res://.godot/imported/ye_palace_road.png-46e031ab5db0bc0b8517d2e9b88776a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/ye_palace_road.png" +dest_files=["res://.godot/imported/ye_palace_road.png-46e031ab5db0bc0b8517d2e9b88776a7.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/art/backgrounds/yingchuan_opening_battlefield.png b/art/backgrounds/yingchuan_opening_battlefield.png new file mode 100644 index 0000000..ca0197c Binary files /dev/null and b/art/backgrounds/yingchuan_opening_battlefield.png differ diff --git a/art/backgrounds/yingchuan_opening_battlefield.png.import b/art/backgrounds/yingchuan_opening_battlefield.png.import new file mode 100644 index 0000000..415115e --- /dev/null +++ b/art/backgrounds/yingchuan_opening_battlefield.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvb0o47h4jwjq" +path="res://.godot/imported/yingchuan_opening_battlefield.png-e5c49ce25427756c86a59f0c7601ecb2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/backgrounds/yingchuan_opening_battlefield.png" +dest_files=["res://.godot/imported/yingchuan_opening_battlefield.png-e5c49ce25427756c86a59f0c7601ecb2.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/art/items/armor.png.import b/art/items/armor.png.import new file mode 100644 index 0000000..6aef1fe --- /dev/null +++ b/art/items/armor.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4qg7q534yrf0" +path="res://.godot/imported/armor.png-97e9e8f386c1d6f9b7f1d8698b98796d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/items/armor.png" +dest_files=["res://.godot/imported/armor.png-97e9e8f386c1d6f9b7f1d8698b98796d.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/art/items/axe.png.import b/art/items/axe.png.import new file mode 100644 index 0000000..bf6884c --- /dev/null +++ b/art/items/axe.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvec0c5bvwra4" +path="res://.godot/imported/axe.png-62c6fcd65344b5b77ffc372f28aa0dce.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/items/axe.png" +dest_files=["res://.godot/imported/axe.png-62c6fcd65344b5b77ffc372f28aa0dce.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/art/items/bow.png.import b/art/items/bow.png.import new file mode 100644 index 0000000..1b23645 --- /dev/null +++ b/art/items/bow.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://16btwieyw3ru" +path="res://.godot/imported/bow.png-b155d5f820d85c0b5115a92ce209d460.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/items/bow.png" +dest_files=["res://.godot/imported/bow.png-b155d5f820d85c0b5115a92ce209d460.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/art/items/imperial_seal.png.import b/art/items/imperial_seal.png.import new file mode 100644 index 0000000..a41cf45 --- /dev/null +++ b/art/items/imperial_seal.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ckfiy6j3xexpa" +path="res://.godot/imported/imperial_seal.png-397f1594ed68ca6ded833a1399b297a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/items/imperial_seal.png" +dest_files=["res://.godot/imported/imperial_seal.png-397f1594ed68ca6ded833a1399b297a7.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/art/items/panacea.png.import b/art/items/panacea.png.import new file mode 100644 index 0000000..e896c71 --- /dev/null +++ b/art/items/panacea.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://iivcen8iigxx" +path="res://.godot/imported/panacea.png-7770e37d39caede6554f9269f151192b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/items/panacea.png" +dest_files=["res://.godot/imported/panacea.png-7770e37d39caede6554f9269f151192b.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/art/items/spear.png.import b/art/items/spear.png.import new file mode 100644 index 0000000..077ddf4 --- /dev/null +++ b/art/items/spear.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7avlcbvhwmoq" +path="res://.godot/imported/spear.png-d90e7b46d1a59461d7436a75338f20dd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/items/spear.png" +dest_files=["res://.godot/imported/spear.png-d90e7b46d1a59461d7436a75338f20dd.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/art/items/sword.png.import b/art/items/sword.png.import new file mode 100644 index 0000000..a631cf8 --- /dev/null +++ b/art/items/sword.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://mgvs4t1ioej6" +path="res://.godot/imported/sword.png-5db7091300bc967455db53dad36c6a62.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/items/sword.png" +dest_files=["res://.godot/imported/sword.png-5db7091300bc967455db53dad36c6a62.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/art/items/war_drum.png.import b/art/items/war_drum.png.import new file mode 100644 index 0000000..541c780 --- /dev/null +++ b/art/items/war_drum.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ccv8byemc2b0e" +path="res://.godot/imported/war_drum.png-ee94ab57b8bceeb469426d2c8d635315.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/items/war_drum.png" +dest_files=["res://.godot/imported/war_drum.png-ee94ab57b8bceeb469426d2c8d635315.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/art/portraits/cao_cao.png.import b/art/portraits/cao_cao.png.import new file mode 100644 index 0000000..e25a18d --- /dev/null +++ b/art/portraits/cao_cao.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://0qg1n6v1gcam" +path="res://.godot/imported/cao_cao.png-133cb29057b5830e844470814a263c1b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/portraits/cao_cao.png" +dest_files=["res://.godot/imported/cao_cao.png-133cb29057b5830e844470814a263c1b.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/art/portraits/cao_ren.png.import b/art/portraits/cao_ren.png.import new file mode 100644 index 0000000..1853b77 --- /dev/null +++ b/art/portraits/cao_ren.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4s2kp80l6glh" +path="res://.godot/imported/cao_ren.png-6d0f58dc39a0da1d98ad794e202b0186.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/portraits/cao_ren.png" +dest_files=["res://.godot/imported/cao_ren.png-6d0f58dc39a0da1d98ad794e202b0186.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/art/portraits/dian_wei.png.import b/art/portraits/dian_wei.png.import new file mode 100644 index 0000000..4e0aceb --- /dev/null +++ b/art/portraits/dian_wei.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://drmviamno0qdy" +path="res://.godot/imported/dian_wei.png-f3ac5ddb7f1e3aab75653f495e9a8dec.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/portraits/dian_wei.png" +dest_files=["res://.godot/imported/dian_wei.png-f3ac5ddb7f1e3aab75653f495e9a8dec.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/art/portraits/guo_jia.png.import b/art/portraits/guo_jia.png.import new file mode 100644 index 0000000..248ebe8 --- /dev/null +++ b/art/portraits/guo_jia.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cnjn5mce25yyi" +path="res://.godot/imported/guo_jia.png-3526b7374102a08cc0a145dc22e15a46.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/portraits/guo_jia.png" +dest_files=["res://.godot/imported/guo_jia.png-3526b7374102a08cc0a145dc22e15a46.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/art/portraits/xiahou_dun.png.import b/art/portraits/xiahou_dun.png.import new file mode 100644 index 0000000..76f0e71 --- /dev/null +++ b/art/portraits/xiahou_dun.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ny1p8cvtpe35" +path="res://.godot/imported/xiahou_dun.png-dc4b8011670366f99be8e4f6f2920c54.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/portraits/xiahou_dun.png" +dest_files=["res://.godot/imported/xiahou_dun.png-dc4b8011670366f99be8e4f6f2920c54.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/art/portraits/xiahou_yuan.png.import b/art/portraits/xiahou_yuan.png.import new file mode 100644 index 0000000..d4eb8f3 --- /dev/null +++ b/art/portraits/xiahou_yuan.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dv85x7haitwui" +path="res://.godot/imported/xiahou_yuan.png-e85bcbc44040f0ff6c7af686032bc3e1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/portraits/xiahou_yuan.png" +dest_files=["res://.godot/imported/xiahou_yuan.png-e85bcbc44040f0ff6c7af686032bc3e1.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/art/portraits/zhang_he.png.import b/art/portraits/zhang_he.png.import new file mode 100644 index 0000000..ccd865a --- /dev/null +++ b/art/portraits/zhang_he.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://1avt8s31rhe8" +path="res://.godot/imported/zhang_he.png-91a1a4b7b4b63b0b798a915aaad09c94.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/portraits/zhang_he.png" +dest_files=["res://.godot/imported/zhang_he.png-91a1a4b7b4b63b0b798a915aaad09c94.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/art/ui/fonts/GowunBatang-Bold.ttf.import b/art/ui/fonts/GowunBatang-Bold.ttf.import new file mode 100644 index 0000000..0971ec5 --- /dev/null +++ b/art/ui/fonts/GowunBatang-Bold.ttf.import @@ -0,0 +1,36 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://ds0mlmxa6gnf" +path="res://.godot/imported/GowunBatang-Bold.ttf-2cccc67373736970650f6d270f6144dd.fontdata" + +[deps] + +source_file="res://art/ui/fonts/GowunBatang-Bold.ttf" +dest_files=["res://.godot/imported/GowunBatang-Bold.ttf-2cccc67373736970650f6d270f6144dd.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +disable_embedded_bitmaps=true +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +modulate_color_glyphs=false +hinting=1 +subpixel_positioning=4 +keep_rounding_remainders=true +oversampling=0.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[] +language_support={} +script_support={} +opentype_features={} diff --git a/art/ui/fonts/GowunBatang-Regular.ttf.import b/art/ui/fonts/GowunBatang-Regular.ttf.import new file mode 100644 index 0000000..e9bcaa9 --- /dev/null +++ b/art/ui/fonts/GowunBatang-Regular.ttf.import @@ -0,0 +1,36 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://cqotj1dc0ltl4" +path="res://.godot/imported/GowunBatang-Regular.ttf-bce2a3061d03bc6eb18160f219d64fc6.fontdata" + +[deps] + +source_file="res://art/ui/fonts/GowunBatang-Regular.ttf" +dest_files=["res://.godot/imported/GowunBatang-Regular.ttf-bce2a3061d03bc6eb18160f219d64fc6.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +disable_embedded_bitmaps=true +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +modulate_color_glyphs=false +hinting=1 +subpixel_positioning=4 +keep_rounding_remainders=true +oversampling=0.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[] +language_support={} +script_support={} +opentype_features={} diff --git a/art/units/archer.png.import b/art/units/archer.png.import new file mode 100644 index 0000000..cc7b431 --- /dev/null +++ b/art/units/archer.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://etpgt5m5cxte" +path="res://.godot/imported/archer.png-a6584d8655f3af641ef56a59cbe55a47.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/units/archer.png" +dest_files=["res://.godot/imported/archer.png-a6584d8655f3af641ef56a59cbe55a47.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/art/units/cavalry.png.import b/art/units/cavalry.png.import new file mode 100644 index 0000000..17b4c43 --- /dev/null +++ b/art/units/cavalry.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjh3m3ilu2kyd" +path="res://.godot/imported/cavalry.png-96f060b3a9c5883600c3dad78cc2771c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/units/cavalry.png" +dest_files=["res://.godot/imported/cavalry.png-96f060b3a9c5883600c3dad78cc2771c.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/art/units/enemies/enemy_archer.png.import b/art/units/enemies/enemy_archer.png.import new file mode 100644 index 0000000..6c9b284 --- /dev/null +++ b/art/units/enemies/enemy_archer.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dtv8mm4joeor8" +path="res://.godot/imported/enemy_archer.png-e78ac844e8a29378d3446f6cb3946397.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/units/enemies/enemy_archer.png" +dest_files=["res://.godot/imported/enemy_archer.png-e78ac844e8a29378d3446f6cb3946397.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/art/units/enemies/enemy_cavalry.png.import b/art/units/enemies/enemy_cavalry.png.import new file mode 100644 index 0000000..1954bed --- /dev/null +++ b/art/units/enemies/enemy_cavalry.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://da5225jj61hxs" +path="res://.godot/imported/enemy_cavalry.png-b8d5c8691a48ce3bc3dc5cf858b024af.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/units/enemies/enemy_cavalry.png" +dest_files=["res://.godot/imported/enemy_cavalry.png-b8d5c8691a48ce3bc3dc5cf858b024af.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/art/units/enemies/enemy_infantry.png.import b/art/units/enemies/enemy_infantry.png.import new file mode 100644 index 0000000..4698b0a --- /dev/null +++ b/art/units/enemies/enemy_infantry.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dboici2twgc8b" +path="res://.godot/imported/enemy_infantry.png-befe55552e48de3b7b47e698d742971d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/units/enemies/enemy_infantry.png" +dest_files=["res://.godot/imported/enemy_infantry.png-befe55552e48de3b7b47e698d742971d.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/art/units/enemies/enemy_strategist.png.import b/art/units/enemies/enemy_strategist.png.import new file mode 100644 index 0000000..4fc9dbb --- /dev/null +++ b/art/units/enemies/enemy_strategist.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://8nloc8nuynq5" +path="res://.godot/imported/enemy_strategist.png-ab88438aa0312bb95ed77487c907fa01.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/units/enemies/enemy_strategist.png" +dest_files=["res://.godot/imported/enemy_strategist.png-ab88438aa0312bb95ed77487c907fa01.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/art/units/enemies/enemy_warrior.png.import b/art/units/enemies/enemy_warrior.png.import new file mode 100644 index 0000000..375d510 --- /dev/null +++ b/art/units/enemies/enemy_warrior.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://blm6sn07sjb2" +path="res://.godot/imported/enemy_warrior.png-2e40ed4316b009286271997bca856b1b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/units/enemies/enemy_warrior.png" +dest_files=["res://.godot/imported/enemy_warrior.png-2e40ed4316b009286271997bca856b1b.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/art/units/infantry.png.import b/art/units/infantry.png.import new file mode 100644 index 0000000..186c450 --- /dev/null +++ b/art/units/infantry.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://clq0ke138xyft" +path="res://.godot/imported/infantry.png-554a5b5b9ac4358f3266c68e8ba7f98f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/units/infantry.png" +dest_files=["res://.godot/imported/infantry.png-554a5b5b9ac4358f3266c68e8ba7f98f.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/art/units/strategist.png.import b/art/units/strategist.png.import new file mode 100644 index 0000000..2292669 --- /dev/null +++ b/art/units/strategist.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://do2rwbumie6iu" +path="res://.godot/imported/strategist.png-b2fec509440eb59675915c978c279e88.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/units/strategist.png" +dest_files=["res://.godot/imported/strategist.png-b2fec509440eb59675915c978c279e88.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/art/units/warrior.png.import b/art/units/warrior.png.import new file mode 100644 index 0000000..31e3ee3 --- /dev/null +++ b/art/units/warrior.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0hmtrx8ei76i" +path="res://.godot/imported/warrior.png-9800b3405beeb2aad2f74b5fedb659f0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/units/warrior.png" +dest_files=["res://.godot/imported/warrior.png-9800b3405beeb2aad2f74b5fedb659f0.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/audio/bgm/battle_loop_placeholder.wav.import b/audio/bgm/battle_loop_placeholder.wav.import new file mode 100644 index 0000000..521a0be --- /dev/null +++ b/audio/bgm/battle_loop_placeholder.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://ccsd6e8waqyj6" +path="res://.godot/imported/battle_loop_placeholder.wav-096575d95d26270ae984d133b73a8b87.sample" + +[deps] + +source_file="res://audio/bgm/battle_loop_placeholder.wav" +dest_files=["res://.godot/imported/battle_loop_placeholder.wav-096575d95d26270ae984d133b73a8b87.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/bgm/menu_theme_placeholder.wav.import b/audio/bgm/menu_theme_placeholder.wav.import new file mode 100644 index 0000000..3340591 --- /dev/null +++ b/audio/bgm/menu_theme_placeholder.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://6nqobupqoueo" +path="res://.godot/imported/menu_theme_placeholder.wav-306599ce09760c42181febdc2c826460.sample" + +[deps] + +source_file="res://audio/bgm/menu_theme_placeholder.wav" +dest_files=["res://.godot/imported/menu_theme_placeholder.wav-306599ce09760c42181febdc2c826460.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/bow_release_01.wav.import b/audio/sfx/bow_release_01.wav.import new file mode 100644 index 0000000..a0a9938 --- /dev/null +++ b/audio/sfx/bow_release_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bmki7bk4uanam" +path="res://.godot/imported/bow_release_01.wav-1ae7f2a91b6f75c12df777eeffdc132d.sample" + +[deps] + +source_file="res://audio/sfx/bow_release_01.wav" +dest_files=["res://.godot/imported/bow_release_01.wav-1ae7f2a91b6f75c12df777eeffdc132d.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/defeat_sting_01.wav.import b/audio/sfx/defeat_sting_01.wav.import new file mode 100644 index 0000000..17e2538 --- /dev/null +++ b/audio/sfx/defeat_sting_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://odowhewgyfcn" +path="res://.godot/imported/defeat_sting_01.wav-89adc697e200ae752d87bf7a6cdf6d18.sample" + +[deps] + +source_file="res://audio/sfx/defeat_sting_01.wav" +dest_files=["res://.godot/imported/defeat_sting_01.wav-89adc697e200ae752d87bf7a6cdf6d18.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/fire_skill_01.wav.import b/audio/sfx/fire_skill_01.wav.import new file mode 100644 index 0000000..3c041dd --- /dev/null +++ b/audio/sfx/fire_skill_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://gt32b5ln3758" +path="res://.godot/imported/fire_skill_01.wav-8dfc74d529a6f4be984f361deeaaca2f.sample" + +[deps] + +source_file="res://audio/sfx/fire_skill_01.wav" +dest_files=["res://.godot/imported/fire_skill_01.wav-8dfc74d529a6f4be984f361deeaaca2f.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/footstep_armor_01.wav.import b/audio/sfx/footstep_armor_01.wav.import new file mode 100644 index 0000000..fab66df --- /dev/null +++ b/audio/sfx/footstep_armor_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c1xwc4cq7s4de" +path="res://.godot/imported/footstep_armor_01.wav-5f27654467bebb54816e798aeb3a1d3e.sample" + +[deps] + +source_file="res://audio/sfx/footstep_armor_01.wav" +dest_files=["res://.godot/imported/footstep_armor_01.wav-5f27654467bebb54816e798aeb3a1d3e.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/guard_block_01.wav.import b/audio/sfx/guard_block_01.wav.import new file mode 100644 index 0000000..f26d295 --- /dev/null +++ b/audio/sfx/guard_block_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://br1d6iqd7u8mq" +path="res://.godot/imported/guard_block_01.wav-7825019a8f879b4edb60ff9357dc90a2.sample" + +[deps] + +source_file="res://audio/sfx/guard_block_01.wav" +dest_files=["res://.godot/imported/guard_block_01.wav-7825019a8f879b4edb60ff9357dc90a2.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/hit_heavy_01.wav.import b/audio/sfx/hit_heavy_01.wav.import new file mode 100644 index 0000000..21e0aa2 --- /dev/null +++ b/audio/sfx/hit_heavy_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dg1k5tq6x56nt" +path="res://.godot/imported/hit_heavy_01.wav-b2a3f2ad4b2a12340b907dff27aa4519.sample" + +[deps] + +source_file="res://audio/sfx/hit_heavy_01.wav" +dest_files=["res://.godot/imported/hit_heavy_01.wav-b2a3f2ad4b2a12340b907dff27aa4519.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/item_pickup_01.wav.import b/audio/sfx/item_pickup_01.wav.import new file mode 100644 index 0000000..a193e70 --- /dev/null +++ b/audio/sfx/item_pickup_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dklvuwg0cstuu" +path="res://.godot/imported/item_pickup_01.wav-c33872226ec8df1b27027a53c9d9e8c0.sample" + +[deps] + +source_file="res://audio/sfx/item_pickup_01.wav" +dest_files=["res://.godot/imported/item_pickup_01.wav-c33872226ec8df1b27027a53c9d9e8c0.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/menu_cancel_01.wav.import b/audio/sfx/menu_cancel_01.wav.import new file mode 100644 index 0000000..4a34be2 --- /dev/null +++ b/audio/sfx/menu_cancel_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bm4ws2wmofnyt" +path="res://.godot/imported/menu_cancel_01.wav-f413a00738f3f8ab335f115effa4c506.sample" + +[deps] + +source_file="res://audio/sfx/menu_cancel_01.wav" +dest_files=["res://.godot/imported/menu_cancel_01.wav-f413a00738f3f8ab335f115effa4c506.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/menu_confirm_01.wav.import b/audio/sfx/menu_confirm_01.wav.import new file mode 100644 index 0000000..3daf514 --- /dev/null +++ b/audio/sfx/menu_confirm_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://mllkwtdyscnx" +path="res://.godot/imported/menu_confirm_01.wav-a69206c491c28bac3665bf88ebdc39c0.sample" + +[deps] + +source_file="res://audio/sfx/menu_confirm_01.wav" +dest_files=["res://.godot/imported/menu_confirm_01.wav-a69206c491c28bac3665bf88ebdc39c0.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/skill_cast_01.wav.import b/audio/sfx/skill_cast_01.wav.import new file mode 100644 index 0000000..e42d56c --- /dev/null +++ b/audio/sfx/skill_cast_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://balldllnsw3dp" +path="res://.godot/imported/skill_cast_01.wav-d86022848b11f6b5b1fe6e3db3bef115.sample" + +[deps] + +source_file="res://audio/sfx/skill_cast_01.wav" +dest_files=["res://.godot/imported/skill_cast_01.wav-d86022848b11f6b5b1fe6e3db3bef115.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/slash_01.wav.import b/audio/sfx/slash_01.wav.import new file mode 100644 index 0000000..e114451 --- /dev/null +++ b/audio/sfx/slash_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://djxmdc6klod7i" +path="res://.godot/imported/slash_01.wav-3401471fda21672a3fdd1c1dc4e439bc.sample" + +[deps] + +source_file="res://audio/sfx/slash_01.wav" +dest_files=["res://.godot/imported/slash_01.wav-3401471fda21672a3fdd1c1dc4e439bc.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/ui_click_01.wav.import b/audio/sfx/ui_click_01.wav.import new file mode 100644 index 0000000..e7a7c6a --- /dev/null +++ b/audio/sfx/ui_click_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cu8fyy065x283" +path="res://.godot/imported/ui_click_01.wav-c3cacf791f3d5b2822b4f33626df6b75.sample" + +[deps] + +source_file="res://audio/sfx/ui_click_01.wav" +dest_files=["res://.godot/imported/ui_click_01.wav-c3cacf791f3d5b2822b4f33626df6b75.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/audio/sfx/victory_sting_01.wav.import b/audio/sfx/victory_sting_01.wav.import new file mode 100644 index 0000000..8330a09 --- /dev/null +++ b/audio/sfx/victory_sting_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cq77ms2w10w61" +path="res://.godot/imported/victory_sting_01.wav-9f5d69b5cec5554cb5d2c63680be8d51.sample" + +[deps] + +source_file="res://audio/sfx/victory_sting_01.wav" +dest_files=["res://.godot/imported/victory_sting_01.wav-9f5d69b5cec5554cb5d2c63680be8d51.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/data/scenarios/001_yellow_turbans.json b/data/scenarios/001_yellow_turbans.json index 99bac14..55c9b62 100644 --- a/data/scenarios/001_yellow_turbans.json +++ b/data/scenarios/001_yellow_turbans.json @@ -254,7 +254,7 @@ "map": { "width": 22, "height": 14, - "background": "res://art/backgrounds/battlefield_frontier.png", + "background": "res://art/backgrounds/yingchuan_opening_battlefield.png", "terrain": [ "GGGGFFFFGGGGGGGGHHHCCC", "GGGGFFFFGGGGGGGGHHHCCC", @@ -346,12 +346,12 @@ "team": "enemy", "level": 1, "pos": [ - 6, + 7, 5 ], "ai_behavior": "guard", "ai_guard_anchor": [ - 6, + 7, 5 ], "ai_guard_radius": 2, @@ -368,7 +368,7 @@ "team": "enemy", "level": 1, "pos": [ - 8, + 10, 6 ], "base": { @@ -438,8 +438,8 @@ "team": "enemy", "level": 1, "pos": [ - 5, - 6 + 9, + 7 ], "base": { "hp": 34, @@ -454,7 +454,7 @@ "team": "enemy", "level": 1, "pos": [ - 9, + 11, 4 ], "base": { @@ -470,7 +470,7 @@ "team": "enemy", "level": 1, "pos": [ - 11, + 13, 7 ], "base": { @@ -486,7 +486,7 @@ "team": "enemy", "level": 1, "pos": [ - 5, + 7, 2 ], "base": { @@ -502,12 +502,12 @@ "team": "enemy", "level": 1, "pos": [ - 7, + 8, 6 ], "ai_behavior": "guard", "ai_guard_anchor": [ - 7, + 8, 6 ], "ai_guard_radius": 2, diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index e4bfb3b..8fe3159 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -62,7 +62,7 @@ Joined officers gate whether `requires_joined` player deployments are loaded at Inventory and campaign flags are copied from `CampaignState` into `BattleState` when a scenario starts. The pre-battle Chapters overview reads `CampaignState` chapter progress and can load completed or current battles without mutating the save. Briefings preview first-clear rewards, can expose `briefing.camp_conversations` through a selectable Talk menu with `briefing.camp_dialogue` as a fallback, can filter those conversations by saved campaign flags, can claim saved one-time camp conversation supply effects through `CampaignState` and refresh the loaded battle inventory copy, and show completed replay rewards as already claimed. The pre-battle Save menu can write the current campaign state to `user://campaign_manual_save.json`, and loading that checkpoint restores it into `user://campaign_save.json` before re-entering the same pending-choice, completion, or current-briefing branch as startup. Pre-battle shop stock comes from the loaded scenario's `shop.items` list plus matching `shop.conditional_items` blocks, with optional finite limits from item entries or `stock` maps, and `shop.merchant` lines are presentation-only camp flavor. Shop purchases and 50% sell-back are campaign transactions: they update saved gold, unequipped inventory, and finite-stock purchase counts immediately, write the save file, and refresh the already-loaded battle inventory before the player begins the battle. Camp conversation supply claims are also campaign transactions: they save a per-scenario conversation claim ledger and inventory immediately, then refresh the already-loaded battle inventory. Pre-battle Armory equipment changes use the same equipment rules as battle HUD equipment changes, then immediately save merged roster equipment/stat snapshots and inventory stock. Pre-battle Roster uses scenario `roster.max_units`, `roster.required_officers`, and `roster.required_units` to mark optional player deployments as sortie or reserve; reserve units remain in the candidate list but are excluded from board occupancy, drawing, selection, AI targeting, and living-unit victory checks. Non-controllable player units can act as protected escort targets: enemies can attack them and conditions can reference them, but they are skipped by player selection, Armory, Formation, counterattacks, and campaign roster progression snapshots when `persist_progression` is false. Scenario `ai_target_priority` nudges enemy movement and damage-skill scoring toward important targets such as envoys without overriding defeat bonuses or range checks, and `set_ai_target_priority` events can retune that battle-only pressure after an ambush, gate closure, or escort exposure. Pre-battle Formation uses the loaded scenario's `formation.cells` and only mutates current battle unit positions before battle-begin events fire. Destination victory cells from `unit_reaches_tile` conditions are exposed to the scene for objective overlays and tile info, and can be expressed as one `pos` or a multi-cell `cells` list; gated victory conditions can also expose the `unit_reaches_tile` event that unlocks them as the next visible objective marker. Rewarding movement events that grant items or gold can expose optional battlefield side markers and Korean tile-info labels through `when.label`, without being treated as victory objectives. Movement-triggered `unit_reaches_tile` events receive the unit that just moved, so ambushes and pickup events fire on entry rather than from units already standing on a marker; `unit_defeated` events receive the fallen unit before final victory/defeat checks, allowing named-officer reactions and last-moment reinforcements. Briefing data can append matching `briefing.conditional_lines`, and scenario events can use `when.campaign_flags` to branch dialogue, objective changes, item and gold pickups, AI target-priority shifts, and reinforcements from saved campaign choices or `when.after_event` to wait for earlier scenario beats. Consumable use can restore HP or MP, cure matching poison/seal/snare/disarm statuses, or cleanse negative stat debuffs, and in-battle item use, event pickup grants, event gold pickups, plus equipment swaps mutate only the battle copy until victory; defeats and restarts do not spend saved items, keep picked-up items or gold, or preserve in-battle gear changes. Post-battle choices write campaign `flags` only after the result-panel button is pressed; if the player reloads after rewards are saved but before selecting, the pending scenario id restores the victory choice panel without replaying rewards. The next battle button stays locked until the campaign choice save succeeds. Equipment rewards share the same `item_id -> count` inventory stock, cover weapon, armor, and accessory slots, can be equipped from the side HUD before the selected unit moves or acts, and do not appear in the consumable action menu. Named equipment currently uses the same stock model with a presentation-only rarity tag rather than unique item instances. Already completed scenarios can be replayed without granting duplicate rewards, choices, replay inventory consumption, event gold pickups, save writes, current-scenario advancement, finite-stock purchases, or camp conversation supply claims; pre-battle Shop, Armory, Roster, Formation, and Save are disabled on completed-scenario replays to avoid side effects. -The battle scene owns presentation feedback: briefing and result states use menu BGM, briefing headers combine `CampaignState` chapter ranges, campaign order, and title data with `BattleState` briefing, objective text, condition-progress text, and defeat-risk text, active battles use battle BGM and show an objective/progress/risk panel fed by `BattleState`, objective-update signals show a short HUD notice and refresh the objective panel immediately, dialogue lines can show optional cached portrait textures or speaker-initial fallback panels in an expanded visual-novel-style panel, keep the portrait slot fixed even for narration lines, mark speaking side through text alignment, and expose progress plus previous-line controls while a sequence is open, the side HUD reuses cached officer portrait textures or class sprites for the selected unit or hovered unit and formats focus text with role, movement type, facing, current terrain move cost, defense/avoid bonuses, core stats, status effects, guard-zone AI hints, and gear, board maps can draw a scenario background texture under translucent terrain overlays, connected road segments, terrain detail patterns, shoreline/castle/forest/hill edge blends, compact recovery markers for healing terrain, compact side-event markers for visible item/gold pickups, and move-attack target badges for enemies that can be struck after movement, board units render class sprite tokens or generic-enemy transparent class cutouts, team rings, class badges, facing markers, generic-enemy marks, officer pins, low-HP warning rings, HP bar color states, active support/debuff/poison/seal/snare/disarm status pips, and a scene-clocked idle stance whose intensity reacts to selected, acted, and low-HP unit state, item buttons can show optional cached item icons, hover previews are rendered as target badges from existing `BattleState` forecast APIs and include compact side/rear attack bonuses when facing matters, equipment option menus show stat/range/effect deltas, result and inventory summaries show named equipment with compact rarity tags, selected area tactics highlight their affected cells, the Threat toggle overlays enemy physical and hostile tactic reach while tile info names threat sources, estimates physical damage, and summarizes hostile tactic damage or status effects against occupied cells, log/result hooks trigger placeholder SFX, support, debuff, poison, seal, snare, disarm, objective updates, AI target-focus changes, and item/gold pickup effects use distinct feedback, `BattleState.unit_motion_requested` asks the scene to interpolate a unit's draw position during movement, `BattleState.unit_action_motion_requested` keeps its rules-facing signal shape while the scene maps attacker class ids to infantry, archer, cavalry, command, and heavy attack presentation profiles, and `BattleState.combat_feedback_requested` asks the scene to draw transient floating combat text without changing battle rules. +The battle scene owns presentation feedback: briefing and result states use menu BGM, briefing headers combine `CampaignState` chapter ranges, campaign order, and title data with `BattleState` briefing, objective text, condition-progress text, and defeat-risk text, active battles use battle BGM and show an objective/progress/risk panel fed by `BattleState`, objective-update signals show a short HUD notice and refresh the objective panel immediately, dialogue lines can show optional cached portrait textures or speaker-initial fallback panels in an expanded visual-novel-style panel, keep the portrait slot fixed even for narration lines, mark speaking side through text alignment, and expose progress plus previous-line controls while a sequence is open, the side HUD reuses cached officer portrait textures or class sprites for the selected unit or hovered unit and formats focus text with role, movement type, facing, current terrain move cost, defense/avoid bonuses, core stats, status effects, guard-zone AI hints, and gear, board maps can draw a scenario background texture under translucent terrain overlays, connected road segments, terrain detail patterns, shoreline/castle/forest/hill edge blends, compact recovery markers for healing terrain, compact side-event markers for visible item/gold pickups, and move-attack target badges for enemies that can be struck after movement, board units render class sprite tokens or generic-enemy transparent class cutouts, team rings, facing markers, generic-enemy marks, officer pins, low-HP warning rings, HP bar color states, active support/debuff/poison/seal/snare/disarm status pips, and a scene-clocked idle stance whose intensity reacts to selected, acted, and low-HP unit state, item buttons can show optional cached item icons, hover previews are rendered as target badges from existing `BattleState` forecast APIs and include compact side/rear attack bonuses when facing matters, equipment option menus show stat/range/effect deltas, result and inventory summaries show named equipment with compact rarity tags, selected area tactics highlight their affected cells, the Threat toggle overlays enemy physical and hostile tactic reach while tile info names threat sources, estimates physical damage, and summarizes hostile tactic damage or status effects against occupied cells, log/result hooks trigger placeholder SFX, support, debuff, poison, seal, snare, disarm, objective updates, AI target-focus changes, and item/gold pickup effects use distinct feedback, `BattleState.unit_motion_requested` asks the scene to interpolate a unit's draw position during movement, `BattleState.unit_action_motion_requested` keeps its rules-facing signal shape while the scene maps attacker class ids to infantry, archer, cavalry, command, and heavy attack presentation profiles, and `BattleState.combat_feedback_requested` asks the scene to draw transient floating combat text without changing battle rules. Large tactical maps are presented through a fixed visible map window rather than by shrinking the whole board, including the opening chapter-one battle. `BattleScene` keeps a clamped `board_scroll_offset`, scrolls the board while the mouse is near or slightly outside the visible map edge, brightens the scrollable frame edge under the cursor, ignores board clicks outside the visible map window, and draws a small minimap plate only when the board actually exceeds the visible map view; the minimap shows terrain, unit dots, objective seals, and side-event markers, and clicking or dragging it recenters the tactical viewport, while compact maps keep the lower-right tiles unobstructed. Board-attached command panels are repositioned after map scrolling so post-move choices stay beside the moved unit. Battle start focuses the board on the deployed player group, pre-battle Formation can focus the board on the selected unit even before the battle opens, and action feedback can focus the board on off-screen cells before motion or combat effects play. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 504c762..0bca09f 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -135,7 +135,7 @@ ## Milestone 5: Presentation - Portrait and art pipeline. Officer definitions can provide default portrait paths, classes can provide board `sprite` paths, items can provide transparent `icon` cutout paths, scenarios can provide map `background` paths, and generated officer portraits, unit sprites, item icons, plus scenario battlefield backgrounds are in `art/`. -- Unit sprites and animations. Board movement now has a short slide animation, attacks request class-specific motion profiles for infantry, archers, cavalry, command units, and heavy warrior/bandit units, and board units show class sprite tokens, team rings, class badges, low-HP warning rings, and small status pips for active support, debuff, poison, seal, snare, and disarm effects, with HUD summaries showing remaining phases. +- Unit sprites and animations. Board movement now has a short slide animation, attacks request class-specific motion profiles for infantry, archers, cavalry, command units, and heavy warrior/bandit units, and board units show class sprite tokens, team rings, officer/generic identity marks, low-HP warning rings, and small status pips for active support, debuff, poison, seal, snare, and disarm effects, with HUD summaries showing remaining phases. - Battlefield presentation. Maps can draw a high-resolution background under translucent terrain overlays, with terrain-specific detail patterns, connected road segments, shoreline/castle/forest/hill edge blends, and generic-enemy token marks. - Battle HUD presentation. Selected and hovered units now summarize battlefield role, movement type, current terrain move cost, defense/avoid bonuses, core stats, status effects, and gear so class identity reads alongside the visual tokens. - Battle effects. First floating combat text now covers damage, recovery, misses, support effects, poison ticks, item and gold pickups, AI target-focus changes, level-ups, and promotions. Hover target preview badges summarize attacks, tactics, and items, and the board can overlay enemy threat ranges with physical damage and hostile tactic hints. diff --git a/scripts/core/battle_state.gd b/scripts/core/battle_state.gd index 39f576e..8ae7ef6 100644 --- a/scripts/core/battle_state.gd +++ b/scripts/core/battle_state.gd @@ -3967,7 +3967,7 @@ func _append_destination_progress_line(result: Array[String], condition: Diction return var status := "도달" if _unit_reaches_tile(condition) else "미도달" var label := _condition_destination_label(condition) - _append_progress_line(result, "%s %s · %s" % [label, _format_cells(targets), status], pending) + _append_progress_line(result, "%s · %s" % [label, status], pending) func _append_turn_limit_progress_line(result: Array[String]) -> void: @@ -4000,7 +4000,7 @@ func _append_event_destination_progress_line(result: Array[String], when: Dictio return var status := "도달" if _unit_reaches_tile(when) else "미도달" var label := _condition_destination_label(when) - _append_progress_line(result, "%s %s · %s" % [label, _format_cells(targets), status]) + _append_progress_line(result, "%s · %s" % [label, status]) func _condition_destination_label(condition: Dictionary) -> String: diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index 5593f30..b4a3f1c 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -26,7 +26,7 @@ const THREAT_OVERLAY_COLOR := Color(0.76, 0.060, 0.035, 0.20) const THREAT_BORDER_COLOR := Color(0.86, 0.18, 0.10, 0.48) const BGM_MENU_PATH := "res://audio/bgm/menu_theme_placeholder.wav" const BGM_BATTLE_PATH := "res://audio/bgm/battle_loop_placeholder.wav" -const TITLE_BACKGROUND_PATH := "res://art/backgrounds/battlefield_frontier.png" +const TITLE_BACKGROUND_PATH := "res://art/backgrounds/title_war_camp_dawn.png" const TITLE_PORTRAIT_PATH := "res://art/portraits/cao_cao.png" const SETTINGS_PATH := "user://heros_settings.json" const SETTINGS_SAVE_VERSION := 1 @@ -63,9 +63,9 @@ const SFX_UI_CLICK_PATH := "res://audio/sfx/ui_click_01.wav" const SFX_VICTORY_STING_PATH := "res://audio/sfx/victory_sting_01.wav" const UI_FONT_REGULAR_PATH := "res://art/ui/fonts/GowunBatang-Regular.ttf" const UI_FONT_BOLD_PATH := "res://art/ui/fonts/GowunBatang-Bold.ttf" -const BGM_VOLUME_DB := -14.0 -const SFX_VOLUME_DB := -4.0 -const UI_SFX_VOLUME_DB := -8.0 +const BGM_VOLUME_DB := -8.0 +const SFX_VOLUME_DB := -2.0 +const UI_SFX_VOLUME_DB := -4.0 const AUDIO_MUTED_DB := -80.0 const FLOATING_TEXT_LIFETIME := 1.0 const FLOATING_TEXT_RISE := 42.0 @@ -3824,6 +3824,8 @@ func _play_bgm(key: String) -> void: current_bgm_key = key bgm_player.stop() bgm_player.stream = stream + if not bgm_player.is_inside_tree(): + return bgm_player.play() @@ -3847,6 +3849,9 @@ func _play_sfx(key: String, volume_db := SFX_VOLUME_DB) -> void: player.volume_db = _effective_sfx_volume_db(volume_db) player.finished.connect(player.queue_free) add_child(player) + if not is_inside_tree(): + player.queue_free() + return player.play() @@ -3883,10 +3888,11 @@ func _sfx_stream_for(key: String) -> AudioStream: func _audio_stream_from_path(path: String) -> AudioStream: if path.is_empty(): return null - if not ResourceLoader.exists(path, "AudioStream"): - return null if not audio_stream_cache.has(path): - audio_stream_cache[path] = load(path) + var stream = load(path) + if stream == null or not stream is AudioStream: + return null + audio_stream_cache[path] = stream return audio_stream_cache[path] as AudioStream @@ -4308,8 +4314,8 @@ func _draw_map() -> void: return if background != null: _draw_texture_cover_region(background, visible_rect, board_rect, Color(1.0, 1.0, 1.0, 0.96)) - draw_rect(visible_rect, Color(0.02, 0.025, 0.03, 0.12)) - draw_rect(visible_rect, Color(0.35, 0.22, 0.10, 0.10)) + draw_rect(visible_rect, Color(0.02, 0.025, 0.03, 0.06)) + draw_rect(visible_rect, Color(0.35, 0.22, 0.10, 0.05)) else: draw_rect(visible_rect, Color(0.18, 0.26, 0.18)) @@ -4329,10 +4335,10 @@ func _draw_map() -> void: func _draw_silk_map_patina(board_rect: Rect2, has_background: bool) -> void: var wash := UI_SILK_WASH - wash.a = 0.08 if has_background else 0.14 + wash.a = 0.04 if has_background else 0.14 draw_rect(board_rect, wash) var fiber := UI_SILK_FIBER - fiber.a = 0.12 if has_background else 0.18 + fiber.a = 0.055 if has_background else 0.18 for index in range(7): var y := board_rect.position.y + 18.0 + float(index) * (board_rect.size.y - 36.0) / 6.0 var drift := 4.0 + _cell_noise(Vector2i(index, state.map_size.y), 211) * 10.0 @@ -4351,7 +4357,7 @@ func _draw_silk_map_patina(board_rect: Rect2, has_background: bool) -> void: Color(fiber.r, fiber.g, fiber.b, fiber.a * 0.65), 1.0 ) - var corner_stain := Color(0.12, 0.06, 0.025, 0.12 if has_background else 0.18) + var corner_stain := Color(0.12, 0.06, 0.025, 0.06 if has_background else 0.18) draw_circle(board_rect.position + Vector2(20, 18), 26.0, corner_stain) draw_circle(board_rect.end - Vector2(24, 22), 30.0, corner_stain) @@ -4692,20 +4698,20 @@ func _texture_cover_region_source_rect(texture: Texture2D, visible_rect: Rect2, func _terrain_fill_color(cell: Vector2i, terrain_key: String, has_background: bool) -> Color: var color := state.get_terrain_color(cell) - var alpha := 0.13 if has_background else 0.34 + var alpha := 0.075 if has_background else 0.34 if terrain_key == "W": - alpha += 0.04 + alpha += 0.025 elif terrain_key == "C" or terrain_key == "H" or terrain_key == "T": - alpha += 0.02 - elif terrain_key == "D": alpha += 0.015 + elif terrain_key == "D": + alpha += 0.012 color.a = alpha return color func _map_grid_color(has_background: bool) -> Color: var color := GRID_COLOR - color.a = 0.09 if has_background else 0.34 + color.a = 0.04 if has_background else 0.34 return color @@ -5139,7 +5145,6 @@ func _draw_units() -> void: if not _draw_high_res_unit_sprite(rect, unit, sprite_modulate, _unit_pixel_facing(unit)): _draw_pixel_unit_sprite(rect, unit, team_color, sprite_modulate, _unit_pixel_facing(unit)) _draw_unit_identity_marks(rect, center, unit, team_color) - _draw_unit_class_badge(rect, unit, team_color) _draw_unit_facing_marker(rect, unit, team_color, sprite_modulate) var hp_ratio := float(unit["hp"]) / float(max(1, int(unit["max_hp"]))) @@ -5868,16 +5873,6 @@ func _is_generic_enemy_unit(unit: Dictionary) -> bool: return unit.get("team", "") == BattleState.TEAM_ENEMY and str(unit.get("officer_id", "")).is_empty() -func _draw_unit_class_badge(rect: Rect2, unit: Dictionary, team_color: Color) -> void: - var badge_rect := Rect2(rect.position + Vector2(4, 4), Vector2(20, 20)) - var class_color := _unit_class_badge_color(unit, team_color) - draw_rect(badge_rect, Color(0.035, 0.018, 0.012, 0.88)) - draw_rect(badge_rect.grow(-2.0), Color(class_color.r, class_color.g, class_color.b, 0.78)) - draw_rect(badge_rect, UI_OLD_BRONZE, false, 1.3) - var font := _draw_ui_font(true) - draw_string(font, badge_rect.position + Vector2(0, 15), _unit_class_abbrev(unit), HORIZONTAL_ALIGNMENT_CENTER, badge_rect.size.x, 13, UI_PARCHMENT_TEXT) - - func _draw_unit_facing_marker(rect: Rect2, unit: Dictionary, team_color: Color, modulate: Color = Color.WHITE) -> void: var points := _unit_facing_marker_points(rect, unit) if points.size() < 3: @@ -5971,19 +5966,6 @@ func _draw_unit_class_emblem(rect: Rect2, center: Vector2, unit: Dictionary, tea draw_line(shield.position + Vector2(shield.size.x * 0.5, 3), shield.position + Vector2(shield.size.x * 0.5, shield.size.y - 3), emblem, 1.6) -func _unit_class_abbrev(unit: Dictionary) -> String: - var family := _unit_class_family(unit) - if family == "cavalry": - return "기" - if family == "ranged": - return "궁" - if family == "tactic": - return "책" - if family == "heavy": - return "무" - return "보" - - func _unit_class_family(unit: Dictionary) -> String: var class_id := str(unit.get("class_id", "")) if class_id.contains("cavalry"): diff --git a/tools/smoke_camp_conversation_rewards.gd.uid b/tools/smoke_camp_conversation_rewards.gd.uid new file mode 100644 index 0000000..b9d52fe --- /dev/null +++ b/tools/smoke_camp_conversation_rewards.gd.uid @@ -0,0 +1 @@ +uid://bway07ybjv0av diff --git a/tools/smoke_chapter_one_polish.gd b/tools/smoke_chapter_one_polish.gd index a1573c7..5257a15 100644 --- a/tools/smoke_chapter_one_polish.gd +++ b/tools/smoke_chapter_one_polish.gd @@ -27,6 +27,7 @@ func _init() -> void: _check_dialogue_localization_and_side(failures) _check_event_dialogue_side_passthrough(failures) _check_opening_battle_camp_context(failures) + _check_opening_battle_tactical_spacing(failures) _check_opening_battle_post_battle_bridge(failures) _check_sishui_gate_camp_context(failures) _check_opening_battle_event_dialogue_structure(failures) @@ -663,6 +664,28 @@ func _check_opening_battle_camp_context(failures: Array[String]) -> void: failures.append("villager route report should mention %s: %s" % [expected, report_text]) +func _check_opening_battle_tactical_spacing(failures: Array[String]) -> void: + var scene = BattleSceneScript.new() + if not scene.state.load_battle("res://data/scenarios/001_yellow_turbans.json"): + failures.append("could not load opening battle for tactical spacing") + scene.free() + return + for player_id in ["cao_cao", "xiahou_dun"]: + var player: Dictionary = scene.state.get_unit(player_id) + if player.is_empty(): + failures.append("opening battle missing tactical spacing player: %s" % player_id) + continue + for enemy in scene.state.units: + if typeof(enemy) != TYPE_DICTIONARY: + continue + if not bool(enemy.get("alive", false)) or enemy.get("team", "") != BattleStateScript.TEAM_ENEMY: + continue + var origin: Vector2i = scene._best_auto_attack_origin(player, enemy) + if origin != Vector2i(-1, -1): + failures.append("opening battle should not allow immediate move-attack from %s to %s via %s" % [player_id, str(enemy.get("id", "")), str(origin)]) + scene.free() + + func _check_opening_battle_post_battle_bridge(failures: Array[String]) -> void: var state = BattleStateScript.new() if not state.load_battle("res://data/scenarios/001_yellow_turbans.json"): @@ -1677,14 +1700,11 @@ func _check_pixel_unit_helpers(failures: Array[String]) -> void: "_draw_pixel_strategist", "_draw_pixel_heavy", "_draw_unit_class_emblem", - "_draw_unit_class_badge", - "_draw_unit_identity_marks", - "_unit_class_abbrev" + "_draw_unit_identity_marks" ]: if not scene.has_method(method_name): failures.append("missing pixel-map unit helper: %s" % method_name) _check_pixel_unit_profiles(scene, failures) - _check_pixel_unit_class_labels(scene, failures) _check_pixel_unit_idle_state(scene, failures) scene.free() @@ -1733,20 +1753,6 @@ func _check_pixel_unit_profiles(scene, failures: Array[String]) -> void: failures.append("infantry pixel profile should keep shield and spear silhouette") -func _check_pixel_unit_class_labels(scene, failures: Array[String]) -> void: - var expected_labels := { - "infantry": "보", - "archer": "궁", - "cavalry": "기", - "strategist": "책", - "bandit": "무" - } - for class_id in expected_labels.keys(): - var label := str(scene._unit_class_abbrev({"class_id": class_id})) - if label != str(expected_labels[class_id]): - failures.append("pixel unit class badge should use Hangul label for %s: %s" % [class_id, label]) - - func _check_pixel_unit_idle_state(scene, failures: Array[String]) -> void: if not scene.state.load_battle("res://data/scenarios/001_yellow_turbans.json"): failures.append("could not load opening battle for pixel idle state helpers") diff --git a/tools/smoke_chapter_one_polish.gd.uid b/tools/smoke_chapter_one_polish.gd.uid new file mode 100644 index 0000000..3084dbf --- /dev/null +++ b/tools/smoke_chapter_one_polish.gd.uid @@ -0,0 +1 @@ +uid://cnvts3ifrn5u0 diff --git a/tools/smoke_directional_combat.gd.uid b/tools/smoke_directional_combat.gd.uid new file mode 100644 index 0000000..96d97bb --- /dev/null +++ b/tools/smoke_directional_combat.gd.uid @@ -0,0 +1 @@ +uid://dk84g6owg0xi2 diff --git a/tools/smoke_equipment_campaign_persistence.gd.uid b/tools/smoke_equipment_campaign_persistence.gd.uid new file mode 100644 index 0000000..b9a7148 --- /dev/null +++ b/tools/smoke_equipment_campaign_persistence.gd.uid @@ -0,0 +1 @@ +uid://cgiadqbpksuko diff --git a/tools/smoke_equipment_unequip.gd.uid b/tools/smoke_equipment_unequip.gd.uid new file mode 100644 index 0000000..9ca2ef6 --- /dev/null +++ b/tools/smoke_equipment_unequip.gd.uid @@ -0,0 +1 @@ +uid://ce4v375vgx8h0 diff --git a/tools/smoke_event_after_event.gd.uid b/tools/smoke_event_after_event.gd.uid new file mode 100644 index 0000000..3757b63 --- /dev/null +++ b/tools/smoke_event_after_event.gd.uid @@ -0,0 +1 @@ +uid://dioaxgvyiv4ik diff --git a/tools/smoke_event_ai_priority.gd.uid b/tools/smoke_event_ai_priority.gd.uid new file mode 100644 index 0000000..9e8add3 --- /dev/null +++ b/tools/smoke_event_ai_priority.gd.uid @@ -0,0 +1 @@ +uid://61eyhhce7hgc diff --git a/tools/smoke_event_cells.gd b/tools/smoke_event_cells.gd index 4f701c7..b3171a0 100644 --- a/tools/smoke_event_cells.gd +++ b/tools/smoke_event_cells.gd @@ -32,12 +32,12 @@ func _check_condition_cells(failures: Array[String]) -> void: if not objective_cells.has(Vector2i(2, 3)) or not objective_cells.has(Vector2i(2, 4)): failures.append("objective cells missing multi-cell destination: %s" % str(objective_cells)) var progress: String = state.get_objective_progress_text(false) - if not progress.contains("전장 표식 (3, 4), (3, 5) · 미도달"): + if not progress.contains("전장 표식 · 미도달"): failures.append("multi-cell progress text mismatch before reach: %s" % progress) var cao_cao: Dictionary = state.get_unit("cao_cao") cao_cao["pos"] = Vector2i(2, 4) progress = state.get_objective_progress_text(false) - if not progress.contains("전장 표식 (3, 4), (3, 5) · 도달"): + if not progress.contains("전장 표식 · 도달"): failures.append("multi-cell progress text mismatch after reach: %s" % progress) if not state._is_condition_met(state.battle_conditions["victory"]): failures.append("multi-cell unit_reaches_tile condition should be met") diff --git a/tools/smoke_event_cells.gd.uid b/tools/smoke_event_cells.gd.uid new file mode 100644 index 0000000..adc0567 --- /dev/null +++ b/tools/smoke_event_cells.gd.uid @@ -0,0 +1 @@ +uid://dofgojvgjm2hf diff --git a/tools/smoke_event_gold_pickups.gd.uid b/tools/smoke_event_gold_pickups.gd.uid new file mode 100644 index 0000000..576cbc8 --- /dev/null +++ b/tools/smoke_event_gold_pickups.gd.uid @@ -0,0 +1 @@ +uid://bse7sv7eeuuhu diff --git a/tools/smoke_event_item_pickups.gd.uid b/tools/smoke_event_item_pickups.gd.uid new file mode 100644 index 0000000..afd89e8 --- /dev/null +++ b/tools/smoke_event_item_pickups.gd.uid @@ -0,0 +1 @@ +uid://dnqjrfp23f8a2 diff --git a/tools/smoke_event_unit_defeated.gd.uid b/tools/smoke_event_unit_defeated.gd.uid new file mode 100644 index 0000000..c6fcb03 --- /dev/null +++ b/tools/smoke_event_unit_defeated.gd.uid @@ -0,0 +1 @@ +uid://10sxcmtosdgc diff --git a/tools/smoke_event_withdraw.gd.uid b/tools/smoke_event_withdraw.gd.uid new file mode 100644 index 0000000..981313c --- /dev/null +++ b/tools/smoke_event_withdraw.gd.uid @@ -0,0 +1 @@ +uid://li28lsw1dm5f diff --git a/tools/smoke_item_debuff_cleanse.gd.uid b/tools/smoke_item_debuff_cleanse.gd.uid new file mode 100644 index 0000000..5176255 --- /dev/null +++ b/tools/smoke_item_debuff_cleanse.gd.uid @@ -0,0 +1 @@ +uid://dj8ioxxw4osyl diff --git a/tools/smoke_objective_progress.gd b/tools/smoke_objective_progress.gd index bf82e2f..9598e45 100644 --- a/tools/smoke_objective_progress.gd +++ b/tools/smoke_objective_progress.gd @@ -113,7 +113,7 @@ func _init() -> void: failures, "007 destination progress", _progress_text("res://data/scenarios/007_xian_emperor_escort.json", false), - "동도 호송로 (13, 5), (14, 5) · 미도달" + "동도 호송로 · 미도달" ) _check_contains( failures, @@ -131,7 +131,7 @@ func _init() -> void: failures, "008 destination progress", _progress_text("res://data/scenarios/008_wan_castle_escape.json", false), - "서쪽 탈출로 (2, 5), (1, 5) · 미도달" + "서쪽 탈출로 · 미도달" ) _check_contains( failures, @@ -167,7 +167,7 @@ func _init() -> void: failures, "045 gated destination progress", _progress_text("res://data/scenarios/045_fancheng_relief.json", false), - "전장 표식 (10, 5) · 미도달" + "전장 표식 · 미도달" ) _check_event_gated_objective_markers(failures) _check_event_gated_multi_cell_objective_markers(failures) diff --git a/tools/smoke_post_move_action_flow.gd.uid b/tools/smoke_post_move_action_flow.gd.uid new file mode 100644 index 0000000..ee172a5 --- /dev/null +++ b/tools/smoke_post_move_action_flow.gd.uid @@ -0,0 +1 @@ +uid://bxpr0b1ilcl7h diff --git a/tools/smoke_result_summary.gd.uid b/tools/smoke_result_summary.gd.uid new file mode 100644 index 0000000..2fc3446 --- /dev/null +++ b/tools/smoke_result_summary.gd.uid @@ -0,0 +1 @@ +uid://dawgjudatei8x diff --git a/tools/smoke_roster_choices.gd.uid b/tools/smoke_roster_choices.gd.uid new file mode 100644 index 0000000..d4e60c0 --- /dev/null +++ b/tools/smoke_roster_choices.gd.uid @@ -0,0 +1 @@ +uid://dargmdoqedlq6 diff --git a/tools/smoke_status_effect_summary.gd.uid b/tools/smoke_status_effect_summary.gd.uid new file mode 100644 index 0000000..d22f8f3 --- /dev/null +++ b/tools/smoke_status_effect_summary.gd.uid @@ -0,0 +1 @@ +uid://dodtqpto40rm2 diff --git a/tools/smoke_title_menu.gd b/tools/smoke_title_menu.gd index b30694b..70d800d 100644 --- a/tools/smoke_title_menu.gd +++ b/tools/smoke_title_menu.gd @@ -41,8 +41,16 @@ func _check_title_menu_start_load_and_settings(failures: Array[String]) -> void: if scene.title_screen_root == null or not scene.title_screen_root.visible: failures.append("title screen should be visible on startup") + if scene.bgm_player == null or scene.bgm_player.stream == null or scene.current_bgm_key != "menu": + failures.append("title screen should start with an audible menu BGM stream") + elif scene.bgm_player.volume_db < -12.0: + failures.append("title menu BGM should be loud enough to hear by default: %.1fdb" % scene.bgm_player.volume_db) + if scene._sfx_stream_for("ui_click") == null or scene._sfx_stream_for("slash") == null or scene._sfx_stream_for("victory_sting") == null: + failures.append("core UI, combat, and result SFX streams should load") if scene.title_background_texture_rect == null or scene.title_background_texture_rect.texture == null: failures.append("title screen should show a high-resolution battlefield backdrop") + elif BattleSceneScript.TITLE_BACKGROUND_PATH == BattleSceneScript.DEFAULT_BATTLE_BACKGROUND_PATH: + failures.append("title screen should use a dedicated cinematic background, not the first battle map backdrop") if scene.title_portrait_texture_rect == null or scene.title_portrait_texture_rect.texture == null: failures.append("title screen should show Cao Cao portrait art") if scene.title_panel == null or scene.title_panel.position.x > 100.0: diff --git a/tools/smoke_title_menu.gd.uid b/tools/smoke_title_menu.gd.uid new file mode 100644 index 0000000..bedc804 --- /dev/null +++ b/tools/smoke_title_menu.gd.uid @@ -0,0 +1 @@ +uid://du5upylbs7u3r diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index f9d9746..ae151b8 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -6,9 +6,9 @@ const BattleSceneScript := preload("res://scripts/scenes/battle_scene.gd") const SCENARIO_BACKGROUNDS := [ { "scenario_path": "res://data/scenarios/001_yellow_turbans.json", - "background_path": "res://art/backgrounds/battlefield_frontier.png", + "background_path": "res://art/backgrounds/yingchuan_opening_battlefield.png", "label": "001 opening field background", - "allow_default": true + "allow_default": false }, { "scenario_path": "res://data/scenarios/002_sishui_gate.json", @@ -141,6 +141,8 @@ func _check_battle_visual_data(failures: Array[String]) -> void: failures.append("001 shop should expose merchant lines") _check_image_path(failures, state.get_map_background_path(), "001 map background") + if state.get_map_background_path() != "res://art/backgrounds/yingchuan_opening_battlefield.png": + failures.append("001 should use a dedicated Yingchuan battlefield background") _check_scenario_backgrounds_data(failures) for unit_id in ["cao_cao", "xiahou_dun", "yellow_turban_1", "yellow_turban_2", "yellow_turban_3"]: var unit := state.get_unit(unit_id) @@ -3193,28 +3195,25 @@ func _check_hud_focus_text(failures: Array[String]) -> void: facing_points_inside = false if not facing_points_inside: failures.append("Unit facing marker should stay anchored inside its tile: %s" % str(facing_marker_points)) - _check_unit_class_mark(failures, scene, "cao_cao", "tactic", "책") - _check_unit_class_mark(failures, scene, "xiahou_dun", "cavalry", "기") - _check_unit_class_mark(failures, scene, "yellow_turban_2", "infantry", "보") - _check_unit_class_mark(failures, scene, "yellow_turban_3", "ranged", "궁") - _check_unit_class_mark(failures, scene, "yellow_turban_1", "heavy", "무") + _check_unit_class_family(failures, scene, "cao_cao", "tactic") + _check_unit_class_family(failures, scene, "xiahou_dun", "cavalry") + _check_unit_class_family(failures, scene, "yellow_turban_2", "infantry") + _check_unit_class_family(failures, scene, "yellow_turban_3", "ranged") + _check_unit_class_family(failures, scene, "yellow_turban_1", "heavy") scene.free() -func _check_unit_class_mark(failures: Array[String], scene, unit_id: String, expected_family: String, expected_mark: String) -> void: +func _check_unit_class_family(failures: Array[String], scene, unit_id: String, expected_family: String) -> void: var unit: Dictionary = scene.state.get_unit(unit_id) if unit.is_empty(): - failures.append("missing unit for class mark check: %s" % unit_id) + failures.append("missing unit for class family check: %s" % unit_id) return var family := str(scene._unit_class_family(unit)) - var mark := str(scene._unit_class_abbrev(unit)) if family != expected_family: failures.append("%s class family should be %s, got %s" % [unit_id, expected_family, family]) - if mark != expected_mark: - failures.append("%s class mark should be %s, got %s" % [unit_id, expected_mark, mark]) var color: Color = scene._unit_class_badge_color(unit, Color(0.20, 0.42, 0.82)) if color.a <= 0.0: - failures.append("%s class badge color should be visible" % unit_id) + failures.append("%s class silhouette color should be visible" % unit_id) func _check_ancient_ui_theme(failures: Array[String]) -> void: diff --git a/tools/smoke_visual_assets.gd.uid b/tools/smoke_visual_assets.gd.uid new file mode 100644 index 0000000..c436e8c --- /dev/null +++ b/tools/smoke_visual_assets.gd.uid @@ -0,0 +1 @@ +uid://dt11w1xlnnxni