995 lines
23 KiB
PHP
995 lines
23 KiB
PHP
InitNativeWheel3D PROC uses edi
|
|
lea edi, wheelBets3D
|
|
xor eax, eax
|
|
mov ecx, 49
|
|
rep stosd
|
|
mov roulState, 0
|
|
mov wheelStake3D, 0
|
|
mov wheelReturn3D, 0
|
|
mov wheelTime3D, 0
|
|
mov wheelExitQueued3D, 0
|
|
call LoadNativeWheelArt3D
|
|
ret
|
|
InitNativeWheel3D ENDP
|
|
|
|
WheelAddBet3D PROC index:DWORD
|
|
cmp roulState, 0
|
|
jne wheel_add_done
|
|
mov ecx, index
|
|
cmp ecx, 48
|
|
ja wheel_add_done
|
|
mov eax, wheelStake3D
|
|
add eax, wheelChip3D
|
|
jc wheel_add_done
|
|
cmp eax, bankroll
|
|
ja wheel_add_done
|
|
mov wheelStake3D, eax
|
|
mov eax, wheelChip3D
|
|
add wheelBets3D[ecx*4], eax
|
|
wheel_add_done:
|
|
ret
|
|
WheelAddBet3D ENDP
|
|
|
|
; Gross returns include the stake, so zero is a loss for every outside bet.
|
|
WheelBetMultiplier3D PROC uses ebx index:DWORD,result:DWORD
|
|
mov ecx, index
|
|
mov ebx, result
|
|
xor eax, eax
|
|
cmp ecx, 37
|
|
jae wheel_outside
|
|
cmp ecx, ebx
|
|
jne wheel_multiplier_done
|
|
mov eax, 36
|
|
ret
|
|
wheel_outside:
|
|
test ebx, ebx
|
|
jz wheel_multiplier_done
|
|
cmp ecx, 39
|
|
jae wheel_parity
|
|
bt wheelRedMask3D, ebx
|
|
setc al
|
|
cmp ecx, 37
|
|
je @F
|
|
xor eax, 1
|
|
@@:
|
|
shl eax, 1
|
|
ret
|
|
wheel_parity:
|
|
cmp ecx, 41
|
|
jae wheel_halves
|
|
mov eax, ebx
|
|
and eax, 1
|
|
cmp ecx, 40
|
|
je @F
|
|
xor eax, 1
|
|
@@:
|
|
shl eax, 1
|
|
ret
|
|
wheel_halves:
|
|
cmp ecx, 43
|
|
jae wheel_dozen_column
|
|
cmp ebx, 18
|
|
seta al
|
|
cmp ecx, 42
|
|
je @F
|
|
xor eax, 1
|
|
@@:
|
|
shl eax, 1
|
|
ret
|
|
wheel_dozen_column:
|
|
mov eax, ebx
|
|
dec eax
|
|
xor edx, edx
|
|
cmp ecx, 46
|
|
jae wheel_column
|
|
mov ebx, 12
|
|
div ebx
|
|
sub ecx, 43
|
|
cmp eax, ecx
|
|
jne wheel_multiplier_zero
|
|
mov eax, 3
|
|
ret
|
|
wheel_column:
|
|
mov ebx, 3
|
|
div ebx
|
|
sub ecx, 46
|
|
cmp edx, ecx
|
|
jne wheel_multiplier_zero
|
|
mov eax, 3
|
|
ret
|
|
wheel_multiplier_zero:
|
|
xor eax, eax
|
|
wheel_multiplier_done:
|
|
ret
|
|
WheelBetMultiplier3D ENDP
|
|
|
|
WheelSettle3D PROC uses ebx esi
|
|
cmp roulState, 1
|
|
jne wheel_settle_done
|
|
mov wheelReturn3D, 0
|
|
xor esi, esi
|
|
wheel_settle_loop:
|
|
invoke WheelBetMultiplier3D, esi,wheelResult3D
|
|
mul wheelBets3D[esi*4]
|
|
test edx, edx
|
|
jnz wheel_settle_cap
|
|
add wheelReturn3D, eax
|
|
jc wheel_settle_cap
|
|
cmp wheelReturn3D, 1000000000
|
|
jbe wheel_settle_next
|
|
wheel_settle_cap:
|
|
mov wheelReturn3D, 1000000000
|
|
wheel_settle_next:
|
|
inc esi
|
|
cmp esi, 49
|
|
jb wheel_settle_loop
|
|
mov eax, wheelReturn3D
|
|
add bankroll, eax
|
|
jc wheel_bank_cap
|
|
cmp bankroll, 1000000000
|
|
jbe @F
|
|
wheel_bank_cap:
|
|
mov bankroll, 1000000000
|
|
@@:
|
|
mov ecx, wheelReturn3D
|
|
cmp ecx, wheelStake3D
|
|
ja wheel_win_charm
|
|
je wheel_charm_done
|
|
mov eax,wheelStake3D
|
|
sub eax,wheelReturn3D
|
|
invoke TriggerCharmLossProtection,eax
|
|
jmp wheel_charm_done
|
|
wheel_win_charm:
|
|
mov eax,wheelReturn3D
|
|
sub eax,wheelStake3D
|
|
invoke TriggerCharmWinBonus,eax
|
|
wheel_charm_done:
|
|
mov roulState, 2
|
|
xor eax,eax
|
|
mov ecx,wheelReturn3D
|
|
cmp ecx,wheelStake3D
|
|
seta al
|
|
invoke NpcRecordRound3D,3,eax
|
|
call SaveProgress3D
|
|
wheel_settle_done:
|
|
ret
|
|
WheelSettle3D ENDP
|
|
|
|
HandleNativeWheel3D PROC uses ebx esi edi
|
|
cmp mouseClick3D,0
|
|
je wheel_header_done
|
|
cmp mouseY3D,3
|
|
jb wheel_header_done
|
|
cmp mouseY3D,17
|
|
jae wheel_header_done
|
|
cmp mouseX3D,252
|
|
jb wheel_header_done
|
|
cmp mouseX3D,312
|
|
jae wheel_header_done
|
|
mov mouseClick3D,0
|
|
call WheelEscape3D
|
|
cmp engineMode,MODE_WALK
|
|
je wheel_handle_done
|
|
wheel_header_done:
|
|
cmp roulState, 1
|
|
jne wheel_draft_input
|
|
mov eax, deltaTime3D
|
|
add wheelTime3D, eax
|
|
cmp wheelTime3D, 4200
|
|
jb wheel_handle_done
|
|
call WheelSettle3D
|
|
cmp wheelExitQueued3D,0
|
|
je wheel_handle_done
|
|
call WheelEscape3D
|
|
ret
|
|
wheel_draft_input:
|
|
cmp roulState, 2
|
|
jne @F
|
|
; Keep the landed ball and payout visible until an explicit next-round command.
|
|
invoke Pressed3D,20h
|
|
test eax,eax
|
|
jnz wheel_next_layout
|
|
invoke Pressed3D,0Dh
|
|
test eax,eax
|
|
jnz wheel_next_layout
|
|
cmp mouseClick3D,0
|
|
je wheel_handle_done
|
|
cmp mouseY3D,219
|
|
jb wheel_handle_done
|
|
cmp mouseY3D,237
|
|
jae wheel_handle_done
|
|
cmp mouseX3D,120
|
|
jb wheel_handle_done
|
|
cmp mouseX3D,200
|
|
jae wheel_handle_done
|
|
wheel_next_layout:
|
|
mov mouseClick3D,0
|
|
call InitNativeWheel3D
|
|
ret
|
|
@@:
|
|
invoke Pressed3D, 57h
|
|
test eax, eax
|
|
jz @F
|
|
cmp wheelChip3D, 1000000
|
|
jae @F
|
|
add wheelChip3D, 50
|
|
@@:
|
|
invoke Pressed3D, 53h
|
|
test eax, eax
|
|
jz @F
|
|
cmp wheelChip3D, 50
|
|
jbe @F
|
|
sub wheelChip3D, 50
|
|
@@:
|
|
invoke Pressed3D, 08h
|
|
test eax, eax
|
|
jz wheel_mouse
|
|
call InitNativeWheel3D
|
|
wheel_mouse:
|
|
cmp mouseClick3D, 0
|
|
je wheel_spin_input
|
|
cmp mouseY3D, 123
|
|
jb wheel_button
|
|
cmp mouseY3D, 183
|
|
jae wheel_mouse_outside
|
|
cmp mouseX3D, 60
|
|
jae wheel_mouse_number
|
|
cmp mouseX3D, 24
|
|
jb wheel_spin_input
|
|
invoke WheelAddBet3D, 0
|
|
jmp wheel_spin_input
|
|
wheel_mouse_number:
|
|
cmp mouseX3D, 300
|
|
jae wheel_spin_input
|
|
mov eax, mouseX3D
|
|
sub eax, 60
|
|
xor edx, edx
|
|
mov ecx, 20
|
|
div ecx
|
|
imul ebx, eax, 3
|
|
mov eax, mouseY3D
|
|
sub eax, 123
|
|
xor edx, edx
|
|
div ecx
|
|
neg eax
|
|
add eax,2
|
|
add eax, ebx
|
|
inc eax
|
|
invoke WheelAddBet3D, eax
|
|
jmp wheel_spin_input
|
|
wheel_mouse_outside:
|
|
cmp mouseY3D, 223
|
|
jae wheel_button
|
|
cmp mouseX3D, 24
|
|
jb wheel_spin_input
|
|
cmp mouseX3D, 300
|
|
jae wheel_spin_input
|
|
mov eax, mouseX3D
|
|
sub eax, 24
|
|
xor edx, edx
|
|
mov ecx, 46
|
|
div ecx
|
|
mov ebx, eax
|
|
mov eax, mouseY3D
|
|
sub eax, 183
|
|
xor edx, edx
|
|
mov ecx, 20
|
|
div ecx
|
|
imul eax, 6
|
|
add eax, ebx
|
|
add eax, 37
|
|
invoke WheelAddBet3D, eax
|
|
jmp wheel_spin_input
|
|
wheel_button:
|
|
cmp mouseY3D, 105
|
|
jb wheel_spin_input
|
|
cmp mouseY3D, 121
|
|
jae wheel_spin_input
|
|
cmp mouseX3D,145
|
|
jb wheel_spin_input
|
|
cmp mouseX3D,159
|
|
jb wheel_mouse_more
|
|
cmp mouseX3D,162
|
|
jb wheel_spin_input
|
|
cmp mouseX3D,176
|
|
jb wheel_mouse_less
|
|
cmp mouseX3D,180
|
|
jb wheel_spin_input
|
|
cmp mouseX3D,226
|
|
jb wheel_mouse_clear
|
|
cmp mouseX3D, 230
|
|
jb wheel_spin_input
|
|
cmp mouseX3D,300
|
|
jae wheel_spin_input
|
|
mov pressedKeys3D[20h], 1
|
|
jmp wheel_spin_input
|
|
wheel_mouse_more:
|
|
cmp wheelChip3D,1000000
|
|
jae wheel_handle_done
|
|
add wheelChip3D,50
|
|
ret
|
|
wheel_mouse_less:
|
|
cmp wheelChip3D,50
|
|
jbe wheel_handle_done
|
|
sub wheelChip3D,50
|
|
ret
|
|
wheel_mouse_clear:
|
|
call InitNativeWheel3D
|
|
ret
|
|
wheel_spin_input:
|
|
cmp roulState, 2
|
|
jne wheel_regular_spin
|
|
cmp tournamentMode, 1
|
|
jne wheel_regular_spin
|
|
invoke Pressed3D, 20h
|
|
test eax, eax
|
|
jnz wheel_tourney_report
|
|
invoke Pressed3D, 0Dh
|
|
test eax, eax
|
|
jnz wheel_tourney_report
|
|
ret
|
|
wheel_tourney_report:
|
|
mov ecx, wheelReturn3D
|
|
cmp ecx, wheelStake3D
|
|
ja wheel_tourney_win
|
|
invoke TowerReportRoundOutcome, 2
|
|
ret
|
|
wheel_tourney_win:
|
|
invoke TowerReportRoundOutcome, 1
|
|
ret
|
|
wheel_regular_spin:
|
|
invoke Pressed3D, 20h
|
|
test eax, eax
|
|
jz wheel_handle_done
|
|
cmp wheelArtReady3D,1
|
|
jne wheel_handle_done
|
|
mov eax, wheelStake3D
|
|
test eax, eax
|
|
jz wheel_handle_done
|
|
cmp eax, bankroll
|
|
ja wheel_handle_done
|
|
sub bankroll, eax
|
|
mov roulState, 1
|
|
mov wheelTime3D, 0
|
|
invoke RandomRange3D, 37
|
|
invoke BackroomsWheelLuck3D,eax
|
|
mov wheelResult3D, eax
|
|
call SaveProgress3D
|
|
invoke PlayCasinoSound3D, OFFSET soundRoulette,0,1
|
|
wheel_handle_done:
|
|
ret
|
|
HandleNativeWheel3D ENDP
|
|
|
|
RenderNativeWheel3D PROC uses ebx esi edi
|
|
local x:DWORD,y:DWORD,ink:DWORD,angle:DWORD
|
|
call RenderWheelScene3D
|
|
cmp wheelArtReady3D,1
|
|
jne wheel_render_missing
|
|
invoke DrawBox,0,0,320,20,0014191Dh
|
|
invoke DrawString8x8,16,12,OFFSET wheelTitle3D,00E5D29Eh
|
|
invoke DrawBoxBorder,252,3,60,14,00252D2Ah,0086754Eh,1
|
|
invoke DrawString8x8,266,6,OFFSET wheelExitText3D,00E5D29Eh
|
|
cmp roulState,1
|
|
je wheel_render_spin_hud
|
|
cmp roulState,2
|
|
je wheel_render_result_hud
|
|
invoke DrawBox,8,101,304,123,00142D22h
|
|
invoke DrawString8x8,18,104,OFFSET wheelAmountText3D,00DEDACAh
|
|
invoke DrawNumber,78,104,wheelChip3D,00FFFFFFh
|
|
invoke DrawBoxBorder,145,104,14,16,003B3024h,00C6AA66h,1
|
|
invoke DrawString8x8,148,108,OFFSET wheelPlusText3D,00FFFFFFh
|
|
invoke DrawBoxBorder,162,104,14,16,003B3024h,00C6AA66h,1
|
|
invoke DrawString8x8,165,108,OFFSET wheelMinusText3D,00FFFFFFh
|
|
invoke DrawBoxBorder,180,104,46,16,003B3024h,00C6AA66h,1
|
|
invoke DrawString8x8,183,108,OFFSET wheelClear3D,00FFFFFFh
|
|
invoke DrawBoxBorder,230,104,70,16,00423929h,00C6AA66h,1
|
|
invoke DrawString8x8,237,108,OFFSET wheelSpin3D,00FFFFFFh
|
|
invoke DrawBoxBorder,24,123,34,60,00174A33h,009C9A76h,1
|
|
invoke DrawNumber,36,147,0,00FFFFFFh
|
|
cmp wheelBets3D, 0
|
|
je @F
|
|
invoke DrawCircle,49,174,3,00DCC671h
|
|
@@:
|
|
mov esi, 1
|
|
wheel_render_numbers:
|
|
mov eax, esi
|
|
dec eax
|
|
xor edx, edx
|
|
mov ecx, 3
|
|
div ecx
|
|
imul eax, 20
|
|
add eax, 60
|
|
mov x, eax
|
|
neg edx
|
|
add edx,2
|
|
imul edx, 20
|
|
add edx, 123
|
|
mov y, edx
|
|
mov ink, 001E2523h
|
|
bt wheelRedMask3D, esi
|
|
jnc @F
|
|
mov ink, 00822C32h
|
|
@@:
|
|
invoke DrawBoxBorder,x,y,20,20,ink,009C9A76h,1
|
|
mov ebx, x
|
|
add ebx, 2
|
|
mov edi, y
|
|
add edi, 4
|
|
invoke DrawNumber,ebx,edi,esi,00FFFFFFh
|
|
cmp wheelBets3D[esi*4], 0
|
|
je @F
|
|
add ebx, 12
|
|
add edi, 11
|
|
invoke DrawCircle,ebx,edi,2,00EAD47Eh
|
|
@@:
|
|
inc esi
|
|
cmp esi, 37
|
|
jb wheel_render_numbers
|
|
xor esi, esi
|
|
wheel_render_outside:
|
|
mov eax, esi
|
|
xor edx, edx
|
|
mov ecx, 6
|
|
div ecx
|
|
imul eax, 20
|
|
add eax, 183
|
|
mov y, eax
|
|
imul edx, 46
|
|
add edx, 24
|
|
mov x, edx
|
|
invoke DrawBoxBorder,x,y,46,20,0022392Ah,009C9A76h,1
|
|
mov ebx, x
|
|
add ebx, 3
|
|
mov edi, y
|
|
add edi, 5
|
|
invoke DrawString8x8,ebx,edi,wheelLabels3D[esi*4],00E4D7B4h
|
|
lea eax, [esi+37]
|
|
cmp wheelBets3D[eax*4], 0
|
|
je @F
|
|
add ebx, 35
|
|
add edi, 10
|
|
invoke DrawCircle,ebx,edi,2,00EAD47Eh
|
|
@@:
|
|
inc esi
|
|
cmp esi, 12
|
|
jb wheel_render_outside
|
|
invoke DrawString8x8,24,228,OFFSET wheelStakedText3D,00D3C08Fh
|
|
invoke DrawNumber,88,228,wheelStake3D,00FFFFFFh
|
|
invoke DrawNumber,206,26,bankroll,00F4E7C8h
|
|
ret
|
|
wheel_render_spin_hud:
|
|
invoke DrawBox,0,220,320,20,0014191Dh
|
|
mov eax,OFFSET wheelSpinningText3D
|
|
cmp wheelExitQueued3D,0
|
|
je @F
|
|
mov eax,OFFSET wheelLeavingText3D
|
|
@@:
|
|
invoke DrawString8x8,76,226,eax,00E5D29Eh
|
|
ret
|
|
wheel_render_result_hud:
|
|
invoke DrawBox,0,219,320,21,0014191Dh
|
|
invoke DrawString8x8,8,225,OFFSET wheelResultText3D,00E5D29Eh
|
|
invoke DrawNumber,61,225,wheelResult3D,00FFFFFFh
|
|
invoke DrawBoxBorder,120,220,80,17,003B3024h,00BA9955h,1
|
|
invoke DrawString8x8,144,225,OFFSET wheelBetView3D,00FFFFFFh
|
|
invoke DrawString8x8,208,223,OFFSET wheelPaidText3D,00E5D29Eh
|
|
invoke DrawNumber,208,232,wheelReturn3D,00FFFFFFh
|
|
ret
|
|
wheel_render_missing:
|
|
invoke DrawBox,0,0,320,240,0014191Dh
|
|
invoke DrawString8x8,64,108,OFFSET wheelMissingArt3D,00E5D29Eh
|
|
ret
|
|
RenderNativeWheel3D ENDP
|
|
|
|
LoadNativeWheelArt3D PROC
|
|
cmp wheelArtReady3D,1
|
|
je wheel_art_loaded
|
|
invoke LoadAnimPack3D,OFFSET wheelTableArt3D,OFFSET wheelTablePath3D
|
|
invoke LoadAnimPack3D,OFFSET wheelCloseArt3D,OFFSET wheelClosePath3D
|
|
invoke LoadAnimPack3D,OFFSET wheelRotorArt3D,OFFSET wheelRotorPath3D
|
|
invoke ValidateCityPack3D,OFFSET wheelTableArt3D,640,480,1
|
|
invoke ValidateCityPack3D,OFFSET wheelCloseArt3D,640,480,1
|
|
invoke ValidateCityPack3D,OFFSET wheelRotorArt3D,480,480,1
|
|
cmp wheelTableArt3D.pixels,0
|
|
je wheel_art_failed
|
|
cmp wheelCloseArt3D.pixels,0
|
|
je wheel_art_failed
|
|
cmp wheelRotorArt3D.pixels,0
|
|
je wheel_art_failed
|
|
mov wheelArtReady3D,1
|
|
wheel_art_loaded:
|
|
mov eax,1
|
|
ret
|
|
wheel_art_failed:
|
|
call FreeNativeWheelArt3D
|
|
xor eax,eax
|
|
ret
|
|
LoadNativeWheelArt3D ENDP
|
|
|
|
FreeNativeWheelArt3D PROC
|
|
invoke FreeAnimPack3D,OFFSET wheelTableArt3D
|
|
invoke FreeAnimPack3D,OFFSET wheelCloseArt3D
|
|
invoke FreeAnimPack3D,OFFSET wheelRotorArt3D
|
|
mov wheelArtReady3D,0
|
|
ret
|
|
FreeNativeWheelArt3D ENDP
|
|
|
|
WheelEscape3D PROC
|
|
mov paused3D,0
|
|
cmp roulState,1
|
|
jne wheel_leave_hall
|
|
mov wheelExitQueued3D,1
|
|
call ClearKeys3D
|
|
ret
|
|
wheel_leave_hall:
|
|
mov wheelExitQueued3D,0
|
|
cmp tournamentMode,1
|
|
jne @F
|
|
call TowerExitToHall
|
|
ret
|
|
@@:
|
|
mov engineMode,MODE_WALK
|
|
call ClearKeys3D
|
|
invoke PlayCasinoSound3D,0,0,0
|
|
ret
|
|
WheelEscape3D ENDP
|
|
|
|
; Integer quadratic easing, preserving the 64-bit product until division.
|
|
WheelTravel3D PROC uses ebx timeMs:DWORD,durationMs:DWORD,total:DWORD
|
|
mov eax,timeMs
|
|
cmp eax,durationMs
|
|
jae wheel_travel_end
|
|
mov eax,durationMs
|
|
sub eax,timeMs
|
|
mul eax
|
|
mul total
|
|
mov ebx,durationMs
|
|
imul ebx,ebx
|
|
div ebx
|
|
neg eax
|
|
add eax,total
|
|
ret
|
|
wheel_travel_end:
|
|
mov eax,total
|
|
ret
|
|
WheelTravel3D ENDP
|
|
|
|
; Rotate the exact numbered rotor by inverse sampling, then project onto the bowl ellipse.
|
|
; Physical framebuffer coordinates; rendering cannot change the selected outcome or bank.
|
|
DrawNativeWheelDisc3D PROC uses ebx esi edi centerX:DWORD,centerY:DWORD,radiusX:DWORD,radiusY:DWORD,rotorAngle:DWORD
|
|
local row:DWORD,column:DWORD,minX:DWORD,maxX:DWORD,maxY:DWORD
|
|
local circleX:DWORD,circleY:DWORD,cosine:DWORD,sine:DWORD,sourceX:DWORD
|
|
mov eax,rotorAngle
|
|
and eax,511
|
|
mov ecx,tableCos[eax*4]
|
|
mov cosine,ecx
|
|
mov ecx,tableSin[eax*4]
|
|
mov sine,ecx
|
|
mov eax,centerX
|
|
sub eax,radiusX
|
|
jns @F
|
|
xor eax,eax
|
|
@@:
|
|
mov minX,eax
|
|
mov eax,centerX
|
|
add eax,radiusX
|
|
cmp eax,SCREEN_W
|
|
jl @F
|
|
mov eax,SCREEN_W-1
|
|
@@:
|
|
mov maxX,eax
|
|
mov eax,centerY
|
|
add eax,radiusY
|
|
cmp eax,SCREEN_H
|
|
jl @F
|
|
mov eax,SCREEN_H-1
|
|
@@:
|
|
mov maxY,eax
|
|
mov eax,centerY
|
|
sub eax,radiusY
|
|
jns @F
|
|
xor eax,eax
|
|
@@:
|
|
mov row,eax
|
|
wheel_disc_row:
|
|
mov eax,row
|
|
sub eax,centerY
|
|
imul eax,224
|
|
cdq
|
|
idiv radiusY
|
|
mov circleY,eax
|
|
mov eax,row
|
|
imul eax,SCREEN_W*4
|
|
add eax,OFFSET screenBuffer
|
|
mov ecx,minX
|
|
lea edi,[eax+ecx*4]
|
|
mov column,ecx
|
|
wheel_disc_pixel:
|
|
mov eax,column
|
|
sub eax,centerX
|
|
imul eax,224
|
|
cdq
|
|
idiv radiusX
|
|
mov circleX,eax
|
|
imul eax,eax
|
|
mov ecx,circleY
|
|
imul ecx,ecx
|
|
add eax,ecx
|
|
cmp eax,224*224
|
|
ja wheel_disc_next
|
|
mov eax,circleX
|
|
imul eax,cosine
|
|
mov ecx,circleY
|
|
imul ecx,sine
|
|
add eax,ecx
|
|
sar eax,16
|
|
add eax,240
|
|
mov sourceX,eax
|
|
mov eax,circleY
|
|
imul eax,cosine
|
|
mov ecx,circleX
|
|
imul ecx,sine
|
|
sub eax,ecx
|
|
sar eax,16
|
|
add eax,240
|
|
imul eax,480
|
|
add eax,sourceX
|
|
mov esi,wheelRotorArt3D.pixels
|
|
mov eax,[esi+eax*4]
|
|
cmp eax,80000000h
|
|
jb wheel_disc_next
|
|
and eax,00FFFFFFh
|
|
mov [edi],eax
|
|
wheel_disc_next:
|
|
add edi,4
|
|
inc column
|
|
mov eax,column
|
|
cmp eax,maxX
|
|
jle wheel_disc_pixel
|
|
inc row
|
|
mov eax,row
|
|
cmp eax,maxY
|
|
jle wheel_disc_row
|
|
ret
|
|
DrawNativeWheelDisc3D ENDP
|
|
|
|
RenderWheelScene3D PROC uses ebx esi edi
|
|
local centerX:DWORD,centerY:DWORD,radiusX:DWORD,radiusY:DWORD
|
|
local cameraPhase:DWORD,ballRadius:DWORD,ballAngle:DWORD,oldOpacity:DWORD
|
|
cmp wheelArtReady3D,1
|
|
jne wheel_scene_done
|
|
mov esi,wheelTableArt3D.pixels
|
|
lea edi,screenBuffer
|
|
mov ecx,SCREEN_SIZE
|
|
rep movsd
|
|
mov centerX,206
|
|
mov centerY,170
|
|
mov radiusX,142
|
|
mov radiusY,46
|
|
mov cameraPhase,0
|
|
cmp roulState,0
|
|
je wheel_scene_geometry
|
|
mov cameraPhase,FP_1
|
|
cmp roulState,1
|
|
jne wheel_scene_close
|
|
invoke CityEase3D,wheelTime3D,600
|
|
mov cameraPhase,eax
|
|
wheel_scene_close:
|
|
mov eax,animOpacity3D
|
|
mov oldOpacity,eax
|
|
mov eax,cameraPhase
|
|
imul eax,255
|
|
shr eax,16
|
|
mov animOpacity3D,eax
|
|
invoke DrawAnimSprite3D,OFFSET wheelCloseArt3D,0,0,0,640,480
|
|
mov eax,oldOpacity
|
|
mov animOpacity3D,eax
|
|
mov eax,cameraPhase
|
|
imul eax,114
|
|
shr eax,16
|
|
add centerX,eax
|
|
mov eax,cameraPhase
|
|
imul eax,108
|
|
shr eax,16
|
|
add centerY,eax
|
|
mov eax,cameraPhase
|
|
imul eax,63
|
|
shr eax,16
|
|
add radiusX,eax
|
|
mov eax,cameraPhase
|
|
imul eax,42
|
|
shr eax,16
|
|
add radiusY,eax
|
|
wheel_scene_geometry:
|
|
mov wheelRotorAngle3D,0
|
|
cmp roulState,1
|
|
jne @F
|
|
invoke WheelTravel3D,wheelTime3D,4200,4096
|
|
and eax,511
|
|
mov wheelRotorAngle3D,eax
|
|
@@:
|
|
invoke DrawNativeWheelDisc3D,centerX,centerY,radiusX,radiusY,wheelRotorAngle3D
|
|
cmp roulState,2
|
|
je @F
|
|
invoke DrawWheelLabels3D,centerX,centerY,radiusX,radiusY,wheelRotorAngle3D
|
|
@@:
|
|
cmp roulState,0
|
|
je wheel_scene_done
|
|
xor esi,esi
|
|
wheel_find_pocket:
|
|
mov eax,wheelOrder3D[esi*4]
|
|
cmp eax,wheelResult3D
|
|
je wheel_found_pocket
|
|
inc esi
|
|
cmp esi,37
|
|
jb wheel_find_pocket
|
|
jmp wheel_scene_done
|
|
wheel_found_pocket:
|
|
mov wheelResultSlot3D,esi
|
|
imul eax,esi,512
|
|
xor edx,edx
|
|
mov ecx,37
|
|
div ecx
|
|
add eax,wheelRotorAngle3D
|
|
mov ballAngle,eax
|
|
mov ballRadius,170
|
|
cmp roulState,1
|
|
jne wheel_ball_place
|
|
invoke WheelTravel3D,wheelTime3D,4200,6144
|
|
sub eax,6144
|
|
add ballAngle,eax
|
|
mov ballRadius,216
|
|
cmp wheelTime3D,2600
|
|
jb wheel_ball_place
|
|
mov eax,wheelTime3D
|
|
sub eax,2600
|
|
cmp eax,1600
|
|
jbe @F
|
|
mov eax,1600
|
|
@@:
|
|
imul eax,46
|
|
xor edx,edx
|
|
mov ecx,1600
|
|
div ecx
|
|
sub ballRadius,eax
|
|
wheel_ball_place:
|
|
mov eax,ballAngle
|
|
and eax,511
|
|
mov wheelBallAngle3D,eax
|
|
mov ebx,tableCos[eax*4]
|
|
imul ebx,ballRadius
|
|
sar ebx,16
|
|
imul ebx,radiusX
|
|
mov eax,ebx
|
|
cdq
|
|
mov ecx,224
|
|
idiv ecx
|
|
add eax,centerX
|
|
mov wheelBallX3D,eax
|
|
mov eax,wheelBallAngle3D
|
|
mov ebx,tableSin[eax*4]
|
|
imul ebx,ballRadius
|
|
sar ebx,16
|
|
imul ebx,radiusY
|
|
mov eax,ebx
|
|
cdq
|
|
idiv ecx
|
|
add eax,centerY
|
|
mov wheelBallY3D,eax
|
|
sar eax,1
|
|
mov edi,eax
|
|
mov ebx,wheelBallX3D
|
|
sar ebx,1
|
|
invoke DrawCircle,ebx,edi,3,003C3026h
|
|
invoke DrawCircle,ebx,edi,2,00F6EFE0h
|
|
cmp roulState,2
|
|
jne wheel_scene_done
|
|
invoke DrawWheelLabels3D,centerX,centerY,radiusX,radiusY,wheelRotorAngle3D
|
|
invoke DrawWheelBox3D,278,245,84,61,002D211Bh
|
|
invoke DrawBuckshotText3D,296,253,OFFSET wheelLandedText3D,00E5D29Eh
|
|
mov ecx,00F4E7C8h
|
|
cmp wheelResult3D,0
|
|
je @F
|
|
mov eax,wheelResult3D
|
|
bt wheelRedMask3D,eax
|
|
jnc @F
|
|
mov ecx,00FFB4ADh
|
|
@@:
|
|
invoke DrawWheelValue3D,320,268,wheelResult3D,6,ecx
|
|
wheel_scene_done:
|
|
ret
|
|
RenderWheelScene3D ENDP
|
|
|
|
; Exact framebuffer rectangles avoid the two-pixel rounding of the logical UI grid.
|
|
DrawWheelBox3D PROC uses ebx esi edi x:DWORD,y:DWORD,w:DWORD,h:DWORD,ink:DWORD
|
|
local bottom:DWORD
|
|
mov esi,x
|
|
test esi,esi
|
|
jns @F
|
|
xor esi,esi
|
|
@@:
|
|
mov eax,x
|
|
add eax,w
|
|
cmp eax,SCREEN_W
|
|
jle @F
|
|
mov eax,SCREEN_W
|
|
@@:
|
|
sub eax,esi
|
|
jle wheel_box_done
|
|
mov ebx,eax
|
|
mov edx,y
|
|
test edx,edx
|
|
jns @F
|
|
xor edx,edx
|
|
@@:
|
|
mov eax,y
|
|
add eax,h
|
|
cmp eax,SCREEN_H
|
|
jle @F
|
|
mov eax,SCREEN_H
|
|
@@:
|
|
cmp eax,edx
|
|
jle wheel_box_done
|
|
mov bottom,eax
|
|
wheel_box_row:
|
|
imul edi,edx,SCREEN_W
|
|
add edi,esi
|
|
lea edi,screenBuffer[edi*4]
|
|
mov eax,ink
|
|
mov ecx,ebx
|
|
rep stosd
|
|
inc edx
|
|
cmp edx,bottom
|
|
jl wheel_box_row
|
|
wheel_box_done:
|
|
ret
|
|
DrawWheelBox3D ENDP
|
|
|
|
; Upright screen-space digits retain their shape when the wheel is projected.
|
|
DrawWheelDigit3D PROC uses ebx esi edi x:DWORD,y:DWORD,digit:DWORD,scale:DWORD,ink:DWORD
|
|
local row:DWORD,column:DWORD,bits:DWORD,px:DWORD,py:DWORD
|
|
cmp scale,0
|
|
je wheel_digit_done
|
|
cmp digit,9
|
|
ja wheel_digit_done
|
|
mov eax,digit
|
|
imul eax,5
|
|
lea esi,wheelDigitMasks3D[eax]
|
|
mov row,0
|
|
wheel_digit_row:
|
|
mov eax,row
|
|
movzx eax,BYTE PTR [esi+eax]
|
|
mov bits,eax
|
|
mov column,0
|
|
wheel_digit_column:
|
|
test bits,4
|
|
jz wheel_digit_next
|
|
mov eax,column
|
|
imul eax,scale
|
|
add eax,x
|
|
mov px,eax
|
|
mov eax,row
|
|
imul eax,scale
|
|
add eax,y
|
|
mov py,eax
|
|
invoke DrawWheelBox3D,px,py,scale,scale,ink
|
|
wheel_digit_next:
|
|
shl bits,1
|
|
inc column
|
|
cmp column,3
|
|
jb wheel_digit_column
|
|
inc row
|
|
cmp row,5
|
|
jb wheel_digit_row
|
|
wheel_digit_done:
|
|
ret
|
|
DrawWheelDigit3D ENDP
|
|
|
|
DrawWheelValue3D PROC uses ebx centerX:DWORD,y:DWORD,value:DWORD,scale:DWORD,ink:DWORD
|
|
local x:DWORD,ones:DWORD
|
|
mov eax,scale
|
|
imul eax,3
|
|
cmp value,10
|
|
jb @F
|
|
mov eax,scale
|
|
imul eax,7
|
|
@@:
|
|
shr eax,1
|
|
neg eax
|
|
add eax,centerX
|
|
mov x,eax
|
|
mov eax,value
|
|
cmp eax,10
|
|
jb wheel_value_single
|
|
xor edx,edx
|
|
mov ecx,10
|
|
div ecx
|
|
mov ones,edx
|
|
invoke DrawWheelDigit3D,x,y,eax,scale,ink
|
|
mov eax,scale
|
|
shl eax,2
|
|
add x,eax
|
|
mov eax,ones
|
|
wheel_value_single:
|
|
invoke DrawWheelDigit3D,x,y,eax,scale,ink
|
|
ret
|
|
DrawWheelValue3D ENDP
|
|
|
|
DrawWheelLabels3D PROC uses ebx esi edi centerX:DWORD,centerY:DWORD,radiusX:DWORD,radiusY:DWORD,angle:DWORD
|
|
local phase:DWORD,x:DWORD,y:DWORD
|
|
mov wheelNumberScale3D,1
|
|
cmp radiusY,80
|
|
jb @F
|
|
mov wheelNumberScale3D,2
|
|
@@:
|
|
xor esi,esi
|
|
wheel_label_pocket:
|
|
mov eax,esi
|
|
imul eax,512
|
|
xor edx,edx
|
|
mov ecx,37
|
|
div ecx
|
|
add eax,angle
|
|
and eax,511
|
|
mov phase,eax
|
|
mov eax,tableCos[eax*4]
|
|
imul eax,195
|
|
sar eax,16
|
|
imul eax,radiusX
|
|
cdq
|
|
mov ecx,224
|
|
idiv ecx
|
|
add eax,centerX
|
|
mov x,eax
|
|
mov wheelNumberX3D[esi*4],eax
|
|
mov eax,phase
|
|
mov eax,tableSin[eax*4]
|
|
imul eax,195
|
|
sar eax,16
|
|
imul eax,radiusY
|
|
cdq
|
|
idiv ecx
|
|
add eax,centerY
|
|
mov wheelNumberY3D[esi*4],eax
|
|
mov ebx,wheelNumberScale3D
|
|
imul ebx,5
|
|
shr ebx,1
|
|
sub eax,ebx
|
|
mov y,eax
|
|
invoke DrawWheelValue3D,x,y,wheelOrder3D[esi*4],wheelNumberScale3D,00FFF8DEh
|
|
inc esi
|
|
cmp esi,37
|
|
jb wheel_label_pocket
|
|
cmp roulState,2
|
|
jne wheel_labels_done
|
|
; Highlight the actual winning label after drawing the ball, preserving every digit.
|
|
xor esi,esi
|
|
wheel_label_find_result:
|
|
mov eax,wheelOrder3D[esi*4]
|
|
cmp eax,wheelResult3D
|
|
je wheel_label_highlight
|
|
inc esi
|
|
cmp esi,37
|
|
jb wheel_label_find_result
|
|
jmp wheel_labels_done
|
|
wheel_label_highlight:
|
|
mov ebx,wheelNumberX3D[esi*4]
|
|
mov edi,wheelNumberY3D[esi*4]
|
|
sub ebx,9
|
|
sub edi,6
|
|
invoke DrawWheelBox3D,ebx,edi,18,12,00E5C978h
|
|
inc ebx
|
|
inc edi
|
|
invoke DrawWheelBox3D,ebx,edi,16,10,00121916h
|
|
mov eax,wheelNumberY3D[esi*4]
|
|
sub eax,5
|
|
invoke DrawWheelValue3D,wheelNumberX3D[esi*4],eax,wheelResult3D,2,00FFF8DEh
|
|
wheel_labels_done:
|
|
ret
|
|
DrawWheelLabels3D ENDP
|
|
|
|
DrawNumber PROC x:DWORD,y:DWORD,value:DWORD,ink:DWORD
|
|
invoke FormatNumber,value,OFFSET hudNumBuffer
|
|
invoke DrawString8x8,x,y,OFFSET hudNumBuffer,ink
|
|
ret
|
|
DrawNumber ENDP
|