KAZIK/src_graphics/native_wheel.inc
Игорь Федосеев 2024aacd31 feat(tower): implement 3D Hell Tower mode and clean legacy console code
- Add 3D Hell Tower mode with 10 boss floors, briefings, and outcome tracking across games
- Refactor poker.asm by removing >10,600 lines of dead legacy console games and menus
- Rebuild poker.exe with clean binary output and update .gitignore
2026-10-15 19:49:50 +03:00

976 lines
22 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 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
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
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