Configure Jukebox to exclusively play tracks from assets/music/jackbox

This commit is contained in:
Игорь Федосеев 2026-10-25 18:03:39 +03:00
parent 4c2428c367
commit d4436674b4
10 changed files with 51 additions and 63 deletions

2
.gitignore vendored
View file

@ -48,3 +48,5 @@ __pycache__/
/debug_render.png
/render_view.png
/docs/*.zip
/scratch/

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
poker.exe

Binary file not shown.

View file

@ -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

View file

@ -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

View file

@ -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