fix(skulls): restore 60 FPS 3D shuffle animation with physical cup swapping and ball tracking

This commit is contained in:
Игорь Федосеев 2026-09-30 21:23:38 +03:00
parent b1cd66b322
commit f25597da80
4 changed files with 617 additions and 124 deletions

Binary file not shown.

View file

@ -347,6 +347,9 @@ skulls3d_win dd 0
skulls3d_swapPair0 dd 0 skulls3d_swapPair0 dd 0
skulls3d_swapPair1 dd 1 skulls3d_swapPair1 dd 1
skulls3d_swapPair2 dd 2 skulls3d_swapPair2 dd 2
skulls3d_cup0 dd 0
skulls3d_cup1 dd 1
skulls3d_cup2 dd 2
textSkullsTitle db "* * * Í À Ï ¨ Ð Ñ Ò Ê È * * *",0 textSkullsTitle db "* * * Í À Ï ¨ Ð Ñ Ò Ê È * * *",0
textSkullsPhase0 db "ÄÅËÀÉ ÑÒÀÂÊÓ È ÆÌÈ [ÏÐÎÁÅË]",0 textSkullsPhase0 db "ÄÅËÀÉ ÑÒÀÂÊÓ È ÆÌÈ [ÏÐÎÁÅË]",0
@ -3763,9 +3766,12 @@ InitSkullsGame PROC
mov skulls3d_state, 0 mov skulls3d_state, 0
mov skulls3d_timer, 0 mov skulls3d_timer, 0
mov skulls3d_win, 0 mov skulls3d_win, 0
mov skulls3d_choice, 1
mov skulls3d_cup0, 0
mov skulls3d_cup1, 1
mov skulls3d_cup2, 2
invoke RandomRange3D, 3 invoke RandomRange3D, 3
mov skulls3d_ballPos, eax mov skulls3d_ballPos, eax
mov skulls3d_choice, 1
ret ret
InitSkullsGame ENDP InitSkullsGame ENDP
@ -3774,7 +3780,7 @@ FinalizeSkullsGuess PROC uses ebx
cmp eax, skulls3d_ballPos cmp eax, skulls3d_ballPos
jne skulls_guess_wrong jne skulls_guess_wrong
; Won! 3x payout ; Correct! 3x payout
mov eax, skulls3d_bet mov eax, skulls3d_bet
imul eax, 3 imul eax, 3
add bankroll, eax add bankroll, eax
@ -3854,33 +3860,46 @@ skulls_start_game:
mov eax, bankroll mov eax, bankroll
mov skulls3d_bet, eax mov skulls3d_bet, eax
test eax, eax test eax, eax
jz skulls_done jz skulls_input_done
@@: @@:
mov eax, skulls3d_bet mov eax, skulls3d_bet
sub bankroll, eax sub bankroll, eax
invoke RandomRange3D, 3 invoke RandomRange3D, 3
mov skulls3d_ballPos, eax mov skulls3d_ballPos, eax
mov skulls3d_cup0, 0
mov skulls3d_cup1, 1
mov skulls3d_cup2, 2
; Pre-generate 3 dynamic swap pairs
invoke RandomRange3D, 3
mov skulls3d_swapPair0, eax
invoke RandomRange3D, 3
mov skulls3d_swapPair1, eax
invoke RandomRange3D, 3
mov skulls3d_swapPair2, eax
mov skulls3d_state, 1 mov skulls3d_state, 1
mov skulls3d_timer, 45 mov skulls3d_timer, 0
invoke PlaySoundA, OFFSET soundShuffle, 0, 1 invoke PlaySoundA, OFFSET soundClick, 0, 1
ret ret
skulls_handle_show: skulls_handle_show:
dec skulls3d_timer inc skulls3d_timer
cmp skulls3d_timer, 0 cmp skulls3d_timer, 45
jg skulls_done jl skulls_input_done
; Transition to Phase 2: Active Shuffle Animation
mov skulls3d_state, 2 mov skulls3d_state, 2
mov skulls3d_timer, 60 mov skulls3d_timer, 0
invoke PlaySoundA, OFFSET soundShuffle, 0, 1 invoke PlaySoundA, OFFSET soundShuffle, 0, 1
ret ret
skulls_handle_shuffle: skulls_handle_shuffle:
dec skulls3d_timer inc skulls3d_timer
cmp skulls3d_timer, 0 cmp skulls3d_timer, 60
jg skulls_done jl skulls_input_done
invoke RandomRange3D, 3 ; Transition to Phase 3: Pick cup
mov skulls3d_ballPos, eax
mov skulls3d_state, 3 mov skulls3d_state, 3
mov skulls3d_timer, 0
ret ret
skulls_handle_pick: skulls_handle_pick:
@ -3913,15 +3932,18 @@ skulls_pick_3:
skulls_handle_reveal: skulls_handle_reveal:
invoke Pressed3D, 20h invoke Pressed3D, 20h
test eax, eax test eax, eax
jz skulls_done jz skulls_input_done
mov skulls3d_state, 0 mov skulls3d_state, 0
invoke PlaySoundA, OFFSET soundClick, 0, 1 invoke PlaySoundA, OFFSET soundClick, 0, 1
skulls_done: skulls_input_done:
ret ret
HandleSkullsInput ENDP HandleSkullsInput ENDP
RenderSkullsGame PROC uses ebx esi edi RenderSkullsGame PROC uses ebx esi edi
local kx:DWORD local kx:DWORD
local passTick:DWORD, curPair:DWORD, swapSlotA:DWORD, swapSlotB:DWORD
local xA:DWORD, xB:DWORD, curXA:DWORD, curXB:DWORD, curYA:DWORD, curYB:DWORD
local distX:DWORD, dxVal:DWORD, archY:DWORD
; Mahogany & Gothic Purple table ; Mahogany & Gothic Purple table
invoke DrawBox, 0, 0, 320, 240, 00140906h invoke DrawBox, 0, 0, 320, 240, 00140906h
@ -3929,7 +3951,7 @@ RenderSkullsGame PROC uses ebx esi edi
; Header ; Header
invoke DrawBoxBorder, 20, 12, 280, 26, 001A0812h, 00FFD700h, 2 invoke DrawBoxBorder, 20, 12, 280, 26, 001A0812h, 00FFD700h, 2
invoke DrawString8x8, 40, 21, OFFSET textSkullsTitle, 00FFFF00h invoke DrawString8x8, 44, 21, OFFSET textSkullsTitle, 00FFFF00h
; Status ; Status
invoke DrawBoxBorder, 20, 44, 110, 18, 001A0812h, 00452033h, 1 invoke DrawBoxBorder, 20, 44, 110, 18, 001A0812h, 00452033h, 1
@ -3942,99 +3964,301 @@ RenderSkullsGame PROC uses ebx esi edi
invoke FormatNumber, skulls3d_bet, OFFSET hudNumBuffer invoke FormatNumber, skulls3d_bet, OFFSET hudNumBuffer
invoke DrawString8x8, 254, 49, OFFSET hudNumBuffer, 00FFD700h invoke DrawString8x8, 254, 49, OFFSET hudNumBuffer, 00FFD700h
; Subtitle phase prompts ; Phase Prompts
cmp skulls3d_state, 0 cmp skulls3d_state, 0
jne @F jne @F
invoke DrawString8x8, 56, 62, OFFSET textSkullsPhase0, 00FFD700h invoke DrawString8x8, 56, 62, OFFSET textSkullsPhase0, 00FFD700h
jmp skulls_render_cups jmp skulls_draw_idle_cups
@@: @@:
cmp skulls3d_state, 1 cmp skulls3d_state, 1
jne @F jne @F
invoke DrawString8x8, 56, 62, OFFSET textSkullsPhase1, 00FFFF00h invoke DrawString8x8, 56, 62, OFFSET textSkullsPhase1, 00FFFF00h
jmp skulls_render_cups jmp skulls_draw_phase1_cups
@@: @@:
cmp skulls3d_state, 2 cmp skulls3d_state, 2
jne @F jne @F
invoke DrawString8x8, 56, 62, OFFSET textSkullsPhase2, 00FFFF00h invoke DrawString8x8, 44, 62, OFFSET textSkullsPhase2, 00FFFF00h
jmp skulls_render_cups jmp skulls_draw_animated_cups
@@: @@:
cmp skulls3d_state, 3 cmp skulls3d_state, 3
jne @F jne @F
invoke DrawString8x8, 40, 62, OFFSET textSkullsPhase3, 00FFFF00h invoke DrawString8x8, 28, 62, OFFSET textSkullsPhase3, 00FFFF00h
jmp skulls_render_cups jmp skulls_draw_idle_cups
@@: @@:
; Reveal outcome ; Phase 4: Reveal outcome
mov eax, skulls3d_win mov eax, skulls3d_win
test eax, eax test eax, eax
jz skulls_show_loss_text jz skulls_reveal_loss_text
invoke DrawString8x8, 40, 62, OFFSET textSkullsWin, 003CFF3Ch invoke DrawString8x8, 40, 62, OFFSET textSkullsWin, 003CFF3Ch
invoke FormatNumber, skulls3d_win, OFFSET hudNumBuffer invoke FormatNumber, skulls3d_win, OFFSET hudNumBuffer
invoke DrawString8x8, 136, 62, OFFSET hudNumBuffer, 003CFF3Ch invoke DrawString8x8, 136, 62, OFFSET hudNumBuffer, 003CFF3Ch
invoke DrawString8x8, 168, 62, OFFSET textSkullsWinMult, 003CFF3Ch invoke DrawString8x8, 168, 62, OFFSET textSkullsWinMult, 003CFF3Ch
jmp skulls_render_cups jmp skulls_draw_reveal_cups
skulls_show_loss_text: skulls_reveal_loss_text:
invoke DrawString8x8, 40, 62, OFFSET textSkullsLose, 00FF6464h invoke DrawString8x8, 40, 62, OFFSET textSkullsLose, 00FF6464h
jmp skulls_draw_reveal_cups
skulls_render_cups: skulls_draw_idle_cups:
; Draw Cup 1 (X=36, Y=114) ; Draw resting cups at static slots: Slot 0 (X=36), Slot 1 (X=136), Slot 2 (X=236)
invoke DrawGothicCup, 36, 114, skulls3d_cup0, 0, 0
invoke DrawGothicCup, 136, 114, skulls3d_cup1, 0, 0
invoke DrawGothicCup, 236, 114, skulls3d_cup2, 0, 0
jmp skulls_render_controls
skulls_draw_phase1_cups:
; Draw with golden ball showing under starting cup
mov ebx, 0 mov ebx, 0
mov edx, 0 mov edx, 0
cmp skulls3d_state, 1
jne @F
cmp skulls3d_ballPos, 0 cmp skulls3d_ballPos, 0
jne @F jne @F
mov ebx, 1 mov ebx, 1
mov edx, 1 mov edx, 1
@@: @@:
cmp skulls3d_state, 4 invoke DrawGothicCup, 36, 114, skulls3d_cup0, ebx, edx
mov ebx, 0
mov edx, 0
cmp skulls3d_ballPos, 1
jne @F jne @F
mov ebx, 1
mov edx, 1
@@:
invoke DrawGothicCup, 136, 114, skulls3d_cup1, ebx, edx
mov ebx, 0
mov edx, 0
cmp skulls3d_ballPos, 2
jne @F
mov ebx, 1
mov edx, 1
@@:
invoke DrawGothicCup, 236, 114, skulls3d_cup2, ebx, edx
jmp skulls_render_controls
skulls_draw_animated_cups:
; 60 frames = 3 passes of 20 frames
mov eax, skulls3d_timer
cmp eax, 20
jbe pass_0
cmp eax, 40
jbe pass_1
sub eax, 41
mov passTick, eax
mov eax, skulls3d_swapPair2
mov curPair, eax
jmp setup_pass
pass_0:
dec eax
mov passTick, eax
mov eax, skulls3d_swapPair0
mov curPair, eax
jmp setup_pass
pass_1:
sub eax, 21
mov passTick, eax
mov eax, skulls3d_swapPair1
mov curPair, eax
setup_pass:
; curPair determines swap pair:
; 0: swap slot 0 (X=36) and slot 1 (X=136)
; 1: swap slot 1 (X=136) and slot 2 (X=236)
; 2: swap slot 0 (X=36) and slot 2 (X=236)
cmp curPair, 1
je pair_1
cmp curPair, 2
je pair_2
mov swapSlotA, 0
mov swapSlotB, 1
mov xA, 36
mov xB, 136
jmp calc_coords
pair_1:
mov swapSlotA, 1
mov swapSlotB, 2
mov xA, 136
mov xB, 236
jmp calc_coords
pair_2:
mov swapSlotA, 0
mov swapSlotB, 2
mov xA, 36
mov xB, 236
calc_coords:
; distX = xB - xA
mov eax, xB
sub eax, xA
mov distX, eax
; dxVal = (distX * passTick) / 20
mov eax, distX
imul eax, passTick
xor edx, edx
mov ecx, 20
div ecx
mov dxVal, eax
; curXA = xA + dxVal
mov eax, xA
add eax, dxVal
mov curXA, eax
; curXB = xB - dxVal
mov eax, xB
sub eax, dxVal
mov curXB, eax
; archY = (passTick * (20 - passTick)) / 10
mov eax, passTick
mov ecx, 20
sub ecx, eax
imul eax, ecx
xor edx, edx
mov ecx, 10
div ecx
mov archY, eax
; Cup A hops UP: 114 - archY
mov eax, 114
sub eax, archY
mov curYA, eax
; Cup B hops DOWN: 114 + archY
mov eax, 114
add eax, archY
mov curYB, eax
; Check if pass ended (frame 19): swap ball position and cups
cmp passTick, 19
jne draw_active_shuffle
; Swap ball position if involved
mov eax, skulls3d_ballPos
cmp eax, swapSlotA
jne check_ball_b
mov edx, swapSlotB
mov skulls3d_ballPos, edx
jmp swap_slot_identities
check_ball_b:
cmp eax, swapSlotB
jne swap_slot_identities
mov edx, swapSlotA
mov skulls3d_ballPos, edx
swap_slot_identities:
cmp curPair, 1
je swap_ids_1_2
cmp curPair, 2
je swap_ids_0_2
; swap 0 and 1
mov eax, skulls3d_cup0
xchg eax, skulls3d_cup1
mov skulls3d_cup0, eax
jmp swap_sound_tick
swap_ids_1_2:
mov eax, skulls3d_cup1
xchg eax, skulls3d_cup2
mov skulls3d_cup1, eax
jmp swap_sound_tick
swap_ids_0_2:
mov eax, skulls3d_cup0
xchg eax, skulls3d_cup2
mov skulls3d_cup0, eax
swap_sound_tick:
invoke PlaySoundA, OFFSET soundShuffle, 0, 1
draw_active_shuffle:
; Draw stationary cup
cmp curPair, 1
je draw_stat_cup0
cmp curPair, 2
je draw_stat_cup1
; Stationary cup is slot 2 (X=236)
invoke DrawGothicCup, 236, 114, skulls3d_cup2, 0, 0
jmp draw_moving_cups
draw_stat_cup0:
; Stationary cup is slot 0 (X=36)
invoke DrawGothicCup, 36, 114, skulls3d_cup0, 0, 0
jmp draw_moving_cups
draw_stat_cup1:
; Stationary cup is slot 1 (X=136)
invoke DrawGothicCup, 136, 114, skulls3d_cup1, 0, 0
draw_moving_cups:
; Moving Cup A and Moving Cup B
cmp curPair, 1
je ids_pair_1
cmp curPair, 2
je ids_pair_2
mov eax, skulls3d_cup0
mov ebx, skulls3d_cup1
jmp draw_the_pair
ids_pair_1:
mov eax, skulls3d_cup1
mov ebx, skulls3d_cup2
jmp draw_the_pair
ids_pair_2:
mov eax, skulls3d_cup0
mov ebx, skulls3d_cup2
draw_the_pair:
push ebx
invoke DrawGothicCup, curXA, curYA, eax, 0, 0
pop ebx
invoke DrawGothicCup, curXB, curYB, ebx, 0, 0
jmp skulls_render_controls
skulls_draw_reveal_cups:
; Reveal Phase: lift chosen cup and lift actual ball cup if different
; Slot 0
mov ebx, 0
mov edx, 0
cmp skulls3d_choice, 0 cmp skulls3d_choice, 0
sete bl je slot0_is_lifted
cmp skulls3d_ballPos, 0
jne @F
slot0_is_lifted:
mov ebx, 1
cmp skulls3d_ballPos, 0 cmp skulls3d_ballPos, 0
sete dl sete dl
@@: @@:
invoke DrawGothicCup, 36, 114, 0, ebx, edx invoke DrawGothicCup, 36, 114, skulls3d_cup0, ebx, edx
; Draw Cup 2 (X=136, Y=114) ; Slot 1
mov ebx, 0 mov ebx, 0
mov edx, 0 mov edx, 0
cmp skulls3d_state, 1
jne @F
cmp skulls3d_ballPos, 1
jne @F
mov ebx, 1
mov edx, 1
@@:
cmp skulls3d_state, 4
jne @F
cmp skulls3d_choice, 1 cmp skulls3d_choice, 1
sete bl je slot1_is_lifted
cmp skulls3d_ballPos, 1
jne @F
slot1_is_lifted:
mov ebx, 1
cmp skulls3d_ballPos, 1 cmp skulls3d_ballPos, 1
sete dl sete dl
@@: @@:
invoke DrawGothicCup, 136, 114, 1, ebx, edx invoke DrawGothicCup, 136, 114, skulls3d_cup1, ebx, edx
; Draw Cup 3 (X=236, Y=114) ; Slot 2
mov ebx, 0 mov ebx, 0
mov edx, 0 mov edx, 0
cmp skulls3d_state, 1 cmp skulls3d_choice, 2
jne @F je slot2_is_lifted
cmp skulls3d_ballPos, 2 cmp skulls3d_ballPos, 2
jne @F jne @F
slot2_is_lifted:
mov ebx, 1 mov ebx, 1
mov edx, 1
@@:
cmp skulls3d_state, 4
jne @F
cmp skulls3d_choice, 2
sete bl
cmp skulls3d_ballPos, 2 cmp skulls3d_ballPos, 2
sete dl sete dl
@@: @@:
invoke DrawGothicCup, 236, 114, 2, ebx, edx invoke DrawGothicCup, 236, 114, skulls3d_cup2, ebx, edx
; Cup selection indicators skulls_render_controls:
; Cup selection slot labels [1], [2], [3]
invoke DrawString8x8, 54, 168, OFFSET textSkullsKey1, 00D0D8E0h invoke DrawString8x8, 54, 168, OFFSET textSkullsKey1, 00D0D8E0h
invoke DrawString8x8, 150, 168, OFFSET textSkullsKey2, 00D0D8E0h invoke DrawString8x8, 150, 168, OFFSET textSkullsKey2, 00D0D8E0h
invoke DrawString8x8, 250, 168, OFFSET textSkullsKey3, 00D0D8E0h invoke DrawString8x8, 250, 168, OFFSET textSkullsKey3, 00D0D8E0h
@ -4042,33 +4266,57 @@ skulls_render_cups:
; Keycaps ; Keycaps
mov kx, 16 mov kx, 16
xor eax, eax xor eax, eax
cmp skulls3d_state, 3
je key1_active
cmp skulls3d_choice, 0 cmp skulls3d_choice, 0
sete al sete al
jmp draw_key1
key1_active:
mov eax, 1
draw_key1:
invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKey1, eax invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKey1, eax
add kx, eax add kx, eax
xor eax, eax xor eax, eax
cmp skulls3d_state, 3
je key2_active
cmp skulls3d_choice, 1 cmp skulls3d_choice, 1
sete al sete al
jmp draw_key2
key2_active:
mov eax, 1
draw_key2:
invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKey2, eax invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKey2, eax
add kx, eax add kx, eax
xor eax, eax xor eax, eax
cmp skulls3d_state, 3
je key3_active
cmp skulls3d_choice, 2 cmp skulls3d_choice, 2
sete al sete al
jmp draw_key3
key3_active:
mov eax, 1
draw_key3:
invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKey3, eax invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKey3, eax
add kx, eax add kx, eax
invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKeySpace, 1 xor eax, eax
cmp skulls3d_state, 0
je start_active
cmp skulls3d_state, 4
je start_active
jmp draw_start_key
start_active:
mov eax, 1
draw_start_key:
invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKeySpace, eax
add kx, eax add kx, eax
invoke DrawKeycap3D, kx, 192, OFFSET textKeyEsc, 0 invoke DrawKeycap3D, kx, 192, OFFSET textKeyEsc, 0
ret ret
RenderSkullsGame ENDP RenderSkullsGame ENDP
; ==============================================================================
; IN-ENGINE 2.5D MINI-GAME: SKILL CHECK (DEAD BY DAYLIGHT SURVIVOR CHECK)
; ==============================================================================
InitSkillGame PROC InitSkillGame PROC
mov skill3d_state, 0 mov skill3d_state, 0
mov skill3d_timer, 0 mov skill3d_timer, 0

BIN
poker.exe

Binary file not shown.

View file

@ -1260,9 +1260,12 @@ InitSkullsGame PROC
mov skulls3d_state, 0 mov skulls3d_state, 0
mov skulls3d_timer, 0 mov skulls3d_timer, 0
mov skulls3d_win, 0 mov skulls3d_win, 0
mov skulls3d_choice, 1
mov skulls3d_cup0, 0
mov skulls3d_cup1, 1
mov skulls3d_cup2, 2
invoke RandomRange3D, 3 invoke RandomRange3D, 3
mov skulls3d_ballPos, eax mov skulls3d_ballPos, eax
mov skulls3d_choice, 1
ret ret
InitSkullsGame ENDP InitSkullsGame ENDP
@ -1271,7 +1274,7 @@ FinalizeSkullsGuess PROC uses ebx
cmp eax, skulls3d_ballPos cmp eax, skulls3d_ballPos
jne skulls_guess_wrong jne skulls_guess_wrong
; Won! 3x payout ; Correct! 3x payout
mov eax, skulls3d_bet mov eax, skulls3d_bet
imul eax, 3 imul eax, 3
add bankroll, eax add bankroll, eax
@ -1351,33 +1354,46 @@ skulls_start_game:
mov eax, bankroll mov eax, bankroll
mov skulls3d_bet, eax mov skulls3d_bet, eax
test eax, eax test eax, eax
jz skulls_done jz skulls_input_done
@@: @@:
mov eax, skulls3d_bet mov eax, skulls3d_bet
sub bankroll, eax sub bankroll, eax
invoke RandomRange3D, 3 invoke RandomRange3D, 3
mov skulls3d_ballPos, eax mov skulls3d_ballPos, eax
mov skulls3d_cup0, 0
mov skulls3d_cup1, 1
mov skulls3d_cup2, 2
; Pre-generate 3 dynamic swap pairs
invoke RandomRange3D, 3
mov skulls3d_swapPair0, eax
invoke RandomRange3D, 3
mov skulls3d_swapPair1, eax
invoke RandomRange3D, 3
mov skulls3d_swapPair2, eax
mov skulls3d_state, 1 mov skulls3d_state, 1
mov skulls3d_timer, 45 mov skulls3d_timer, 0
invoke PlaySoundA, OFFSET soundShuffle, 0, 1 invoke PlaySoundA, OFFSET soundClick, 0, 1
ret ret
skulls_handle_show: skulls_handle_show:
dec skulls3d_timer inc skulls3d_timer
cmp skulls3d_timer, 0 cmp skulls3d_timer, 45
jg skulls_done jl skulls_input_done
; Transition to Phase 2: Active Shuffle Animation
mov skulls3d_state, 2 mov skulls3d_state, 2
mov skulls3d_timer, 60 mov skulls3d_timer, 0
invoke PlaySoundA, OFFSET soundShuffle, 0, 1 invoke PlaySoundA, OFFSET soundShuffle, 0, 1
ret ret
skulls_handle_shuffle: skulls_handle_shuffle:
dec skulls3d_timer inc skulls3d_timer
cmp skulls3d_timer, 0 cmp skulls3d_timer, 60
jg skulls_done jl skulls_input_done
invoke RandomRange3D, 3 ; Transition to Phase 3: Pick cup
mov skulls3d_ballPos, eax
mov skulls3d_state, 3 mov skulls3d_state, 3
mov skulls3d_timer, 0
ret ret
skulls_handle_pick: skulls_handle_pick:
@ -1410,15 +1426,18 @@ skulls_pick_3:
skulls_handle_reveal: skulls_handle_reveal:
invoke Pressed3D, 20h invoke Pressed3D, 20h
test eax, eax test eax, eax
jz skulls_done jz skulls_input_done
mov skulls3d_state, 0 mov skulls3d_state, 0
invoke PlaySoundA, OFFSET soundClick, 0, 1 invoke PlaySoundA, OFFSET soundClick, 0, 1
skulls_done: skulls_input_done:
ret ret
HandleSkullsInput ENDP HandleSkullsInput ENDP
RenderSkullsGame PROC uses ebx esi edi RenderSkullsGame PROC uses ebx esi edi
local kx:DWORD local kx:DWORD
local passTick:DWORD, curPair:DWORD, swapSlotA:DWORD, swapSlotB:DWORD
local xA:DWORD, xB:DWORD, curXA:DWORD, curXB:DWORD, curYA:DWORD, curYB:DWORD
local distX:DWORD, dxVal:DWORD, archY:DWORD
; Mahogany & Gothic Purple table ; Mahogany & Gothic Purple table
invoke DrawBox, 0, 0, 320, 240, 00140906h invoke DrawBox, 0, 0, 320, 240, 00140906h
@ -1426,7 +1445,7 @@ RenderSkullsGame PROC uses ebx esi edi
; Header ; Header
invoke DrawBoxBorder, 20, 12, 280, 26, 001A0812h, 00FFD700h, 2 invoke DrawBoxBorder, 20, 12, 280, 26, 001A0812h, 00FFD700h, 2
invoke DrawString8x8, 40, 21, OFFSET textSkullsTitle, 00FFFF00h invoke DrawString8x8, 44, 21, OFFSET textSkullsTitle, 00FFFF00h
; Status ; Status
invoke DrawBoxBorder, 20, 44, 110, 18, 001A0812h, 00452033h, 1 invoke DrawBoxBorder, 20, 44, 110, 18, 001A0812h, 00452033h, 1
@ -1439,99 +1458,301 @@ RenderSkullsGame PROC uses ebx esi edi
invoke FormatNumber, skulls3d_bet, OFFSET hudNumBuffer invoke FormatNumber, skulls3d_bet, OFFSET hudNumBuffer
invoke DrawString8x8, 254, 49, OFFSET hudNumBuffer, 00FFD700h invoke DrawString8x8, 254, 49, OFFSET hudNumBuffer, 00FFD700h
; Subtitle phase prompts ; Phase Prompts
cmp skulls3d_state, 0 cmp skulls3d_state, 0
jne @F jne @F
invoke DrawString8x8, 56, 62, OFFSET textSkullsPhase0, 00FFD700h invoke DrawString8x8, 56, 62, OFFSET textSkullsPhase0, 00FFD700h
jmp skulls_render_cups jmp skulls_draw_idle_cups
@@: @@:
cmp skulls3d_state, 1 cmp skulls3d_state, 1
jne @F jne @F
invoke DrawString8x8, 56, 62, OFFSET textSkullsPhase1, 00FFFF00h invoke DrawString8x8, 56, 62, OFFSET textSkullsPhase1, 00FFFF00h
jmp skulls_render_cups jmp skulls_draw_phase1_cups
@@: @@:
cmp skulls3d_state, 2 cmp skulls3d_state, 2
jne @F jne @F
invoke DrawString8x8, 56, 62, OFFSET textSkullsPhase2, 00FFFF00h invoke DrawString8x8, 44, 62, OFFSET textSkullsPhase2, 00FFFF00h
jmp skulls_render_cups jmp skulls_draw_animated_cups
@@: @@:
cmp skulls3d_state, 3 cmp skulls3d_state, 3
jne @F jne @F
invoke DrawString8x8, 40, 62, OFFSET textSkullsPhase3, 00FFFF00h invoke DrawString8x8, 28, 62, OFFSET textSkullsPhase3, 00FFFF00h
jmp skulls_render_cups jmp skulls_draw_idle_cups
@@: @@:
; Reveal outcome ; Phase 4: Reveal outcome
mov eax, skulls3d_win mov eax, skulls3d_win
test eax, eax test eax, eax
jz skulls_show_loss_text jz skulls_reveal_loss_text
invoke DrawString8x8, 40, 62, OFFSET textSkullsWin, 003CFF3Ch invoke DrawString8x8, 40, 62, OFFSET textSkullsWin, 003CFF3Ch
invoke FormatNumber, skulls3d_win, OFFSET hudNumBuffer invoke FormatNumber, skulls3d_win, OFFSET hudNumBuffer
invoke DrawString8x8, 136, 62, OFFSET hudNumBuffer, 003CFF3Ch invoke DrawString8x8, 136, 62, OFFSET hudNumBuffer, 003CFF3Ch
invoke DrawString8x8, 168, 62, OFFSET textSkullsWinMult, 003CFF3Ch invoke DrawString8x8, 168, 62, OFFSET textSkullsWinMult, 003CFF3Ch
jmp skulls_render_cups jmp skulls_draw_reveal_cups
skulls_show_loss_text: skulls_reveal_loss_text:
invoke DrawString8x8, 40, 62, OFFSET textSkullsLose, 00FF6464h invoke DrawString8x8, 40, 62, OFFSET textSkullsLose, 00FF6464h
jmp skulls_draw_reveal_cups
skulls_render_cups: skulls_draw_idle_cups:
; Draw Cup 1 (X=36, Y=114) ; Draw resting cups at static slots: Slot 0 (X=36), Slot 1 (X=136), Slot 2 (X=236)
invoke DrawGothicCup, 36, 114, skulls3d_cup0, 0, 0
invoke DrawGothicCup, 136, 114, skulls3d_cup1, 0, 0
invoke DrawGothicCup, 236, 114, skulls3d_cup2, 0, 0
jmp skulls_render_controls
skulls_draw_phase1_cups:
; Draw with golden ball showing under starting cup
mov ebx, 0 mov ebx, 0
mov edx, 0 mov edx, 0
cmp skulls3d_state, 1
jne @F
cmp skulls3d_ballPos, 0 cmp skulls3d_ballPos, 0
jne @F jne @F
mov ebx, 1 mov ebx, 1
mov edx, 1 mov edx, 1
@@: @@:
cmp skulls3d_state, 4 invoke DrawGothicCup, 36, 114, skulls3d_cup0, ebx, edx
mov ebx, 0
mov edx, 0
cmp skulls3d_ballPos, 1
jne @F jne @F
mov ebx, 1
mov edx, 1
@@:
invoke DrawGothicCup, 136, 114, skulls3d_cup1, ebx, edx
mov ebx, 0
mov edx, 0
cmp skulls3d_ballPos, 2
jne @F
mov ebx, 1
mov edx, 1
@@:
invoke DrawGothicCup, 236, 114, skulls3d_cup2, ebx, edx
jmp skulls_render_controls
skulls_draw_animated_cups:
; 60 frames = 3 passes of 20 frames
mov eax, skulls3d_timer
cmp eax, 20
jbe pass_0
cmp eax, 40
jbe pass_1
sub eax, 41
mov passTick, eax
mov eax, skulls3d_swapPair2
mov curPair, eax
jmp setup_pass
pass_0:
dec eax
mov passTick, eax
mov eax, skulls3d_swapPair0
mov curPair, eax
jmp setup_pass
pass_1:
sub eax, 21
mov passTick, eax
mov eax, skulls3d_swapPair1
mov curPair, eax
setup_pass:
; curPair determines swap pair:
; 0: swap slot 0 (X=36) and slot 1 (X=136)
; 1: swap slot 1 (X=136) and slot 2 (X=236)
; 2: swap slot 0 (X=36) and slot 2 (X=236)
cmp curPair, 1
je pair_1
cmp curPair, 2
je pair_2
mov swapSlotA, 0
mov swapSlotB, 1
mov xA, 36
mov xB, 136
jmp calc_coords
pair_1:
mov swapSlotA, 1
mov swapSlotB, 2
mov xA, 136
mov xB, 236
jmp calc_coords
pair_2:
mov swapSlotA, 0
mov swapSlotB, 2
mov xA, 36
mov xB, 236
calc_coords:
; distX = xB - xA
mov eax, xB
sub eax, xA
mov distX, eax
; dxVal = (distX * passTick) / 20
mov eax, distX
imul eax, passTick
xor edx, edx
mov ecx, 20
div ecx
mov dxVal, eax
; curXA = xA + dxVal
mov eax, xA
add eax, dxVal
mov curXA, eax
; curXB = xB - dxVal
mov eax, xB
sub eax, dxVal
mov curXB, eax
; archY = (passTick * (20 - passTick)) / 10
mov eax, passTick
mov ecx, 20
sub ecx, eax
imul eax, ecx
xor edx, edx
mov ecx, 10
div ecx
mov archY, eax
; Cup A hops UP: 114 - archY
mov eax, 114
sub eax, archY
mov curYA, eax
; Cup B hops DOWN: 114 + archY
mov eax, 114
add eax, archY
mov curYB, eax
; Check if pass ended (frame 19): swap ball position and cups
cmp passTick, 19
jne draw_active_shuffle
; Swap ball position if involved
mov eax, skulls3d_ballPos
cmp eax, swapSlotA
jne check_ball_b
mov edx, swapSlotB
mov skulls3d_ballPos, edx
jmp swap_slot_identities
check_ball_b:
cmp eax, swapSlotB
jne swap_slot_identities
mov edx, swapSlotA
mov skulls3d_ballPos, edx
swap_slot_identities:
cmp curPair, 1
je swap_ids_1_2
cmp curPair, 2
je swap_ids_0_2
; swap 0 and 1
mov eax, skulls3d_cup0
xchg eax, skulls3d_cup1
mov skulls3d_cup0, eax
jmp swap_sound_tick
swap_ids_1_2:
mov eax, skulls3d_cup1
xchg eax, skulls3d_cup2
mov skulls3d_cup1, eax
jmp swap_sound_tick
swap_ids_0_2:
mov eax, skulls3d_cup0
xchg eax, skulls3d_cup2
mov skulls3d_cup0, eax
swap_sound_tick:
invoke PlaySoundA, OFFSET soundShuffle, 0, 1
draw_active_shuffle:
; Draw stationary cup
cmp curPair, 1
je draw_stat_cup0
cmp curPair, 2
je draw_stat_cup1
; Stationary cup is slot 2 (X=236)
invoke DrawGothicCup, 236, 114, skulls3d_cup2, 0, 0
jmp draw_moving_cups
draw_stat_cup0:
; Stationary cup is slot 0 (X=36)
invoke DrawGothicCup, 36, 114, skulls3d_cup0, 0, 0
jmp draw_moving_cups
draw_stat_cup1:
; Stationary cup is slot 1 (X=136)
invoke DrawGothicCup, 136, 114, skulls3d_cup1, 0, 0
draw_moving_cups:
; Moving Cup A and Moving Cup B
cmp curPair, 1
je ids_pair_1
cmp curPair, 2
je ids_pair_2
mov eax, skulls3d_cup0
mov ebx, skulls3d_cup1
jmp draw_the_pair
ids_pair_1:
mov eax, skulls3d_cup1
mov ebx, skulls3d_cup2
jmp draw_the_pair
ids_pair_2:
mov eax, skulls3d_cup0
mov ebx, skulls3d_cup2
draw_the_pair:
push ebx
invoke DrawGothicCup, curXA, curYA, eax, 0, 0
pop ebx
invoke DrawGothicCup, curXB, curYB, ebx, 0, 0
jmp skulls_render_controls
skulls_draw_reveal_cups:
; Reveal Phase: lift chosen cup and lift actual ball cup if different
; Slot 0
mov ebx, 0
mov edx, 0
cmp skulls3d_choice, 0 cmp skulls3d_choice, 0
sete bl je slot0_is_lifted
cmp skulls3d_ballPos, 0
jne @F
slot0_is_lifted:
mov ebx, 1
cmp skulls3d_ballPos, 0 cmp skulls3d_ballPos, 0
sete dl sete dl
@@: @@:
invoke DrawGothicCup, 36, 114, 0, ebx, edx invoke DrawGothicCup, 36, 114, skulls3d_cup0, ebx, edx
; Draw Cup 2 (X=136, Y=114) ; Slot 1
mov ebx, 0 mov ebx, 0
mov edx, 0 mov edx, 0
cmp skulls3d_state, 1
jne @F
cmp skulls3d_ballPos, 1
jne @F
mov ebx, 1
mov edx, 1
@@:
cmp skulls3d_state, 4
jne @F
cmp skulls3d_choice, 1 cmp skulls3d_choice, 1
sete bl je slot1_is_lifted
cmp skulls3d_ballPos, 1
jne @F
slot1_is_lifted:
mov ebx, 1
cmp skulls3d_ballPos, 1 cmp skulls3d_ballPos, 1
sete dl sete dl
@@: @@:
invoke DrawGothicCup, 136, 114, 1, ebx, edx invoke DrawGothicCup, 136, 114, skulls3d_cup1, ebx, edx
; Draw Cup 3 (X=236, Y=114) ; Slot 2
mov ebx, 0 mov ebx, 0
mov edx, 0 mov edx, 0
cmp skulls3d_state, 1 cmp skulls3d_choice, 2
jne @F je slot2_is_lifted
cmp skulls3d_ballPos, 2 cmp skulls3d_ballPos, 2
jne @F jne @F
slot2_is_lifted:
mov ebx, 1 mov ebx, 1
mov edx, 1
@@:
cmp skulls3d_state, 4
jne @F
cmp skulls3d_choice, 2
sete bl
cmp skulls3d_ballPos, 2 cmp skulls3d_ballPos, 2
sete dl sete dl
@@: @@:
invoke DrawGothicCup, 236, 114, 2, ebx, edx invoke DrawGothicCup, 236, 114, skulls3d_cup2, ebx, edx
; Cup selection indicators skulls_render_controls:
; Cup selection slot labels [1], [2], [3]
invoke DrawString8x8, 54, 168, OFFSET textSkullsKey1, 00D0D8E0h invoke DrawString8x8, 54, 168, OFFSET textSkullsKey1, 00D0D8E0h
invoke DrawString8x8, 150, 168, OFFSET textSkullsKey2, 00D0D8E0h invoke DrawString8x8, 150, 168, OFFSET textSkullsKey2, 00D0D8E0h
invoke DrawString8x8, 250, 168, OFFSET textSkullsKey3, 00D0D8E0h invoke DrawString8x8, 250, 168, OFFSET textSkullsKey3, 00D0D8E0h
@ -1539,33 +1760,57 @@ skulls_render_cups:
; Keycaps ; Keycaps
mov kx, 16 mov kx, 16
xor eax, eax xor eax, eax
cmp skulls3d_state, 3
je key1_active
cmp skulls3d_choice, 0 cmp skulls3d_choice, 0
sete al sete al
jmp draw_key1
key1_active:
mov eax, 1
draw_key1:
invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKey1, eax invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKey1, eax
add kx, eax add kx, eax
xor eax, eax xor eax, eax
cmp skulls3d_state, 3
je key2_active
cmp skulls3d_choice, 1 cmp skulls3d_choice, 1
sete al sete al
jmp draw_key2
key2_active:
mov eax, 1
draw_key2:
invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKey2, eax invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKey2, eax
add kx, eax add kx, eax
xor eax, eax xor eax, eax
cmp skulls3d_state, 3
je key3_active
cmp skulls3d_choice, 2 cmp skulls3d_choice, 2
sete al sete al
jmp draw_key3
key3_active:
mov eax, 1
draw_key3:
invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKey3, eax invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKey3, eax
add kx, eax add kx, eax
invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKeySpace, 1 xor eax, eax
cmp skulls3d_state, 0
je start_active
cmp skulls3d_state, 4
je start_active
jmp draw_start_key
start_active:
mov eax, 1
draw_start_key:
invoke DrawKeycap3D, kx, 192, OFFSET textSkullsKeySpace, eax
add kx, eax add kx, eax
invoke DrawKeycap3D, kx, 192, OFFSET textKeyEsc, 0 invoke DrawKeycap3D, kx, 192, OFFSET textKeyEsc, 0
ret ret
RenderSkullsGame ENDP RenderSkullsGame ENDP
; ==============================================================================
; IN-ENGINE 2.5D MINI-GAME: SKILL CHECK (DEAD BY DAYLIGHT SURVIVOR CHECK)
; ==============================================================================
InitSkillGame PROC InitSkillGame PROC
mov skill3d_state, 0 mov skill3d_state, 0
mov skill3d_timer, 0 mov skill3d_timer, 0