diff --git a/.gitignore b/.gitignore index 886ec52..dedc00d 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,5 @@ __pycache__/ /debug_render.png /render_view.png /docs/*.zip + +/scratch/ diff --git a/assets/music/jackbox/BYBOLDEN. - Art Deco.mp3 b/assets/music/jackbox/BYBOLDEN. - Art Deco.mp3 new file mode 100644 index 0000000..a176ad3 Binary files /dev/null and b/assets/music/jackbox/BYBOLDEN. - Art Deco.mp3 differ diff --git a/assets/music/jackbox/BYBOLDEN. - Art Deco.opus b/assets/music/jackbox/BYBOLDEN. - Art Deco.opus new file mode 100644 index 0000000..e46c99a Binary files /dev/null and b/assets/music/jackbox/BYBOLDEN. - Art Deco.opus differ diff --git a/assets/music/jackbox/BYBOLDEN. - Soft Hours.mp3 b/assets/music/jackbox/BYBOLDEN. - Soft Hours.mp3 new file mode 100644 index 0000000..68b0825 Binary files /dev/null and b/assets/music/jackbox/BYBOLDEN. - Soft Hours.mp3 differ diff --git a/assets/music/jackbox/BYBOLDEN. - Soft Hours.opus b/assets/music/jackbox/BYBOLDEN. - Soft Hours.opus new file mode 100644 index 0000000..a0bb968 Binary files /dev/null and b/assets/music/jackbox/BYBOLDEN. - Soft Hours.opus differ diff --git a/build/graphics/poker.exe b/build/graphics/poker.exe index f91d180..8cf5231 100644 Binary files a/build/graphics/poker.exe and b/build/graphics/poker.exe differ diff --git a/poker.exe b/poker.exe index f91d180..8cf5231 100644 Binary files a/poker.exe and b/poker.exe differ diff --git a/src_graphics/jackbox.inc b/src_graphics/jackbox.inc index 6e23c26..9e0fcca 100644 --- a/src_graphics/jackbox.inc +++ b/src_graphics/jackbox.inc @@ -109,19 +109,21 @@ PlayJukeboxTrack3D PROC uses ebx trackIndex:DWORD mov jboxIsPlaying, 0 mov ebx, trackIndex - cmp ebx, 9 - jae jbox_play_done + cmp ebx, 2 + jae jbox_play_stop_selected cmp ebx, JACKBOX_TRACK_COUNT - jae jbox_play_done + jae jbox_play_stop_selected mov eax, jboxOpenCommands[ebx*4] test eax, eax - jz jbox_play_done + jz jbox_play_stop_selected invoke mciSendStringA, eax, 0, 0, 0 invoke mciSendStringA, OFFSET jboxPlayCmd, 0, 0, 0 mov jboxCurrentTrack, ebx mov jboxIsPlaying, 1 -jbox_play_done: + ret +jbox_play_stop_selected: + mov jboxCurrentTrack, -1 ret PlayJukeboxTrack3D ENDP @@ -219,19 +221,19 @@ HandleJackbox3D PROC uses ebx esi mov jboxSelectedTrack, 0 jmp jbox_play_selected @@: - ; Check track row click inside CRT screen: x in [46..274], y in [65..165] - cmp mouseY3D, 65 + ; Track list click: x in [46..274], y in [66..108], step = 14 + cmp mouseY3D, 66 jb jbox_keys - cmp mouseY3D, 165 + cmp mouseY3D, 108 ja jbox_keys cmp mouseX3D, 46 jb jbox_keys cmp mouseX3D, 274 ja jbox_keys mov eax, mouseY3D - sub eax, 65 + sub eax, 66 xor edx, edx - mov ebx, 10 + mov ebx, 14 div ebx cmp eax, JACKBOX_TRACK_COUNT jae jbox_keys @@ -285,12 +287,12 @@ jbox_keys: invoke Pressed3D, 52h test eax, eax jz @F - invoke RandomRange3D, 9 + invoke RandomRange3D, 2 mov jboxSelectedTrack, eax invoke PlayJukeboxTrack3D, eax jmp jbox_handled @@: - ; Direct digit keys '1'..'9' + ; Direct digit keys '1'..'2' mov ebx, 31h ; '1' jbox_digit_loop: invoke Pressed3D, ebx @@ -303,15 +305,15 @@ jbox_digit_loop: jmp jbox_handled jbox_digit_next: inc ebx - cmp ebx, 39h ; '9' + cmp ebx, 32h ; '2' jbe jbox_digit_loop ; '0' key for mute/stop invoke Pressed3D, 30h test eax, eax jz jbox_handled - mov jboxSelectedTrack, 9 - invoke PlayJukeboxTrack3D, 9 + mov jboxSelectedTrack, 2 + invoke PlayJukeboxTrack3D, 2 jmp jbox_handled jbox_play_selected: @@ -344,38 +346,38 @@ RenderJackbox3D PROC uses ebx esi edi jne jbox_top_lcd_stopped cmp jboxCurrentTrack, -1 je jbox_top_lcd_stopped - cmp jboxCurrentTrack, 9 + cmp jboxCurrentTrack, 2 jae jbox_top_lcd_stopped - invoke DrawString8x8, 42, 17, OFFSET jboxLcdPlay, 0050FF90h ; Green "ÈÃÐÀÅÒ" + invoke DrawString8x8, 42, 17, OFFSET jboxLcdPlay, 0050FF90h jmp jbox_top_lcd_exit jbox_top_lcd_stopped: - invoke DrawString8x8, 45, 17, OFFSET jboxLcdStop, 008CB8A5h ; Dim green "ÑÒÎÏ" + invoke DrawString8x8, 45, 17, OFFSET jboxLcdStop, 008CB8A5h jbox_top_lcd_exit: ; Right slot: exit button text - invoke DrawString8x8, 241, 17, OFFSET jboxLcdExit, 00F2A648h ; Amber "ÂÛÕÎÄ" + invoke DrawString8x8, 241, 17, OFFSET jboxLcdExit, 00F2A648h ; 4. CRT Monitor Header: Now Playing Status cmp jboxIsPlaying, 1 jne jbox_render_stopped cmp jboxCurrentTrack, -1 je jbox_render_stopped - cmp jboxCurrentTrack, 9 + cmp jboxCurrentTrack, 2 jae jbox_render_stopped - invoke DrawString8x8, 48, 52, OFFSET jboxHdrNow, 0050FF90h ; Green "ÑÅÉ×ÀÑ:" + invoke DrawString8x8, 48, 52, OFFSET jboxHdrNow, 0050FF90h mov eax, jboxCurrentTrack mov edx, jboxTrackNames[eax*4] invoke DrawString8x8, 108, 52, edx, 00F0E6C3h jmp jbox_render_divider jbox_render_stopped: - invoke DrawString8x8, 48, 52, OFFSET jboxHdrStop, 008CB8A5h ; Dim green "ÑÒÀÒÓÑ: ÎÑÒÀÍÎÂËÅÍ" + invoke DrawString8x8, 48, 52, OFFSET jboxHdrStop, 008CB8A5h jbox_render_divider: invoke DrawBox, 46, 62, 228, 1, 001C3828h - ; 5. Track Selection List (10 rows, step Y = 10, from Y = 66) - mov rowY, 66 + ; 5. Track Selection List (3 rows, step Y = 14, from Y = 70) + mov rowY, 70 xor esi, esi jbox_render_row: mov color, 008CB8A5h ; Default CRT phosphor pale cyan @@ -383,7 +385,7 @@ jbox_render_row: cmp esi, jboxSelectedTrack jne @F ; Selected row: highlight box, golden cursor, bright white text - invoke DrawBox, 46, rowY, 228, 9, 00143526h + invoke DrawBox, 46, rowY, 228, 10, 00143526h invoke DrawString8x8, 48, rowY, OFFSET jboxCursor, 00FFD700h mov color, 00FFFFFFh @@: @@ -398,7 +400,7 @@ jbox_render_row: invoke DrawString8x8, 238, rowY, OFFSET jboxTagPlay, 0050FF90h jbox_row_next: - add rowY, 10 + add rowY, 14 inc esi cmp esi, JACKBOX_TRACK_COUNT jb jbox_render_row @@ -408,4 +410,4 @@ jbox_row_next: invoke DrawString8x8, 56, 170, OFFSET jboxFooterHelp, 0070AA90h ret -RenderJackbox3D ENDP +RenderJackbox3D ENDP diff --git a/src_graphics/jackbox_data.inc b/src_graphics/jackbox_data.inc index 3aef868..410bfdb 100644 --- a/src_graphics/jackbox_data.inc +++ b/src_graphics/jackbox_data.inc @@ -7,7 +7,7 @@ INTERACT_JACKBOX equ 48 JACKBOX_X equ FP_1*306/10 JACKBOX_Y equ FP_1*235/10 -JACKBOX_TRACK_COUNT equ 10 +JACKBOX_TRACK_COUNT equ 3 MATERIAL_JACKBOX_FRONT equ 161 MATERIAL_JACKBOX_SIDE equ 121 @@ -30,7 +30,7 @@ jackboxScreenArt3D AnimPack3D <> jackboxWorldPath3D db "assets\animations\hall\jackbox-v1.bin",0 jackboxScreenPath3D db "assets\animations\hall\jackbox-ui-v1.bin",0 -; Prompt: "E: Âêëþ÷èòü àâòîìàò" +; Prompt: "E: Vkljuchit avtomat" jackboxPrompt3D db 69,58,32,194,234,235,254,247,232,242,252,32,224,226,242,238,236,224,242,0 jboxCurrentTrack dd -1 @@ -41,45 +41,27 @@ jboxCloseCmd db "close jboxmusic",0 jboxStopCmd db "stop jboxmusic",0 jboxPlayCmd db "play jboxmusic repeat",0 -jboxOpen0 db 'open "assets\music\tower\Keygen_Church_-_Tenebre_Rosso_Sangue_ULTRAKILL_Original_Game_Soundtrack_79610890.mp3" type mpegvideo alias jboxmusic',0 -jboxOpen1 db 'open "assets\music\tower\KEYGEN_CHURCH_-_Hareklavit_75543927.mp3" type mpegvideo alias jboxmusic',0 -jboxOpen2 db 'open "assets\music\tower\KEYGEN_CHURCH_-_Ladikerfos_75543991.mp3" type mpegvideo alias jboxmusic',0 -jboxOpen3 db 'open "assets\music\tower\KEYGEN_CHURCH_-_Tilaskarot_75546826.mp3" type mpegvideo alias jboxmusic',0 -jboxOpen4 db 'open "assets\music\tower\Mick_Gordon_-_BFG_Division_48126042.mp3" type mpegvideo alias jboxmusic',0 -jboxOpen5 db 'open "assets\music\tower\Mick_Gordon_-_Rip_Tear_48126019.mp3" type mpegvideo alias jboxmusic',0 -jboxOpen6 db 'open "assets\music\tower\Mick_Gordon_-_The_Only_Thing_They_Fear_Is_You_OST_DOOM_Eternal_72020713.mp3" type mpegvideo alias jboxmusic',0 -jboxOpen7 db 'open "assets\audio\hakari_dance.wav" type waveaudio alias jboxmusic',0 -jboxOpen8 db 'open "assets\audio\victory-tf2.wav" type waveaudio alias jboxmusic',0 +jboxOpen0 db 'open "assets\music\jackbox\BYBOLDEN. - Art Deco.mp3" type mpegvideo alias jboxmusic',0 +jboxOpen1 db 'open "assets\music\jackbox\BYBOLDEN. - Soft Hours.mp3" type mpegvideo alias jboxmusic',0 -jboxOpenCommands dd OFFSET jboxOpen0, OFFSET jboxOpen1, OFFSET jboxOpen2, OFFSET jboxOpen3 - dd OFFSET jboxOpen4, OFFSET jboxOpen5, OFFSET jboxOpen6, OFFSET jboxOpen7 - dd OFFSET jboxOpen8, 0 +jboxOpenCommands dd OFFSET jboxOpen0, OFFSET jboxOpen1, 0 -jboxName0 db "1. Keygen - Tenebre",0 -jboxName1 db "2. Keygen - Hareklavit",0 -jboxName2 db "3. Keygen - Ladikerfos",0 -jboxName3 db "4. Keygen - Tilaskarot",0 -jboxName4 db "5. Mick Gordon - BFG",0 -jboxName5 db "6. Mick Gordon - Rip",0 -jboxName6 db "7. Mick Gordon - Doom",0 -jboxName7 db "8. Hakari Dance (Ost)",0 -jboxName8 db "9. TF2 - Victory",0 -; "0. [Âûêëþ÷èòü çâóê]" -jboxName9 db 48,46,32,91,194,251,234,235,254,247,232,242,252,32,231,226,243,234,93,0 +jboxName0 db "1. Bolden - Art Deco",0 +jboxName1 db "2. Bolden - Soft Hours",0 +; "0. [Vykljuchit zvuk]" +jboxName2 db 48,46,32,91,194,251,234,235,254,247,232,242,252,32,231,226,243,234,93,0 -jboxTrackNames dd OFFSET jboxName0, OFFSET jboxName1, OFFSET jboxName2, OFFSET jboxName3 - dd OFFSET jboxName4, OFFSET jboxName5, OFFSET jboxName6, OFFSET jboxName7 - dd OFFSET jboxName8, OFFSET jboxName9 +jboxTrackNames dd OFFSET jboxName0, OFFSET jboxName1, OFFSET jboxName2 ; Top Digital LCD Display Slots -jboxLcdPlay db 200,195,208,192,197,210,0 ; "ÈÃÐÀÅÒ" -jboxLcdStop db 209,210,206,207,0 ; "ÑÒÎÏ" -jboxLcdExit db 194,219,213,206,196,0 ; "ÂÛÕÎÄ" +jboxLcdPlay db 200,195,208,192,197,210,0 ; "IGRAET" +jboxLcdStop db 209,210,206,207,0 ; "STOP" +jboxLcdExit db 194,219,213,206,196,0 ; "VYHOD" ; CRT Monitor Screen Text -jboxHdrNow db 209,197,201,215,192,209,58,0 ; "ÑÅÉ×ÀÑ:" -jboxHdrStop db 209,210,192,210,211,209,58,32,206,209,210,192,205,206,194,203,197,205,0 ; "ÑÒÀÒÓÑ: ÎÑÒÀÍÎÂËÅÍ" +jboxHdrNow db 209,197,201,215,192,209,58,0 ; "SEJCHAS:" +jboxHdrStop db 209,210,192,210,211,209,58,32,206,209,210,192,205,206,194,203,197,205,0 ; "STATUS: OSTANOVLEN" jboxCursor db ">",0 jboxTagPlay db "[>]",0 -; "ENTER:Ïóñê S:Ñòîï R:Ìèêñ" -jboxFooterHelp db 69,78,84,69,82,58,207,243,241,234,32,32,83,58,209,242,238,239,32,32,82,58,204,232,234,241,0 +; "ENTER:Pusk S:Stop R:Miks" +jboxFooterHelp db 69,78,84,69,82,58,207,243,241,234,32,32,83,58,209,242,238,239,32,32,82,58,204,232,234,241,0 diff --git a/tools/tests/check_jackbox.py b/tools/tests/check_jackbox.py index 90eb59b..9334f22 100644 --- a/tools/tests/check_jackbox.py +++ b/tools/tests/check_jackbox.py @@ -34,7 +34,9 @@ def test_packed_assets(): def test_audio_tracks(): data_inc = (ROOT / "src_graphics/jackbox_data.inc").read_bytes().decode("cp1251") open_cmds = re.findall(r'open\s+"([^"]+)"\s+type\s+(\w+)\s+alias\s+jboxmusic', data_inc) - assert len(open_cmds) == 9, f"Expected 9 audio tracks, got {len(open_cmds)}" + assert len(open_cmds) == 2, f"Expected 2 audio tracks, got {len(open_cmds)}" + for rel_path, media_type in open_cmds: + assert "assets\\music\\jackbox" in rel_path or "assets/music/jackbox" in rel_path, f"Track must be from jackbox directory: {rel_path}" for rel_path, media_type in open_cmds: full_path = ROOT / rel_path