KAZIK/tools/tests/darts_test.inc
Artvasil09 23dc40ee5c feat: implement native darts mini-game, AI observer mode, and fortune session assets
- Darts: native 500-point match against Max with sway/fatigue mouse aim, parabolic throw camera, raster arm animations, and 16 camera-relative flying dart views

- AI Observer: autonomous spectator mode for Hold'em, Blackjack, Durak, and Billiards with profile isolation and playback controls

- Fortune Session: raster sprite packs, mist/orb animations, tarot divination spreads, and pack tools

- Hall Integration: wall dartboard in lounge, observer terminal dispatch, and bot turn hooks

- Packaging & Verification: updated installer streaming hash, synchronized launcher, passing check suites and release smoke checks
2026-10-24 22:10:25 +03:00

374 lines
8.3 KiB
PHP

.data
dtVectors3D LABEL DWORD
dd 0,53,20,1
dd 0,103,60,3
dd 0,166,40,2
dd 16,50,1,1
dd 32,98,3,3
dd 51,158,2,2
dd 31,43,18,1
dd 61,83,54,3
dd 98,134,36,2
dd 43,31,4,1
dd 83,61,12,3
dd 134,98,8,2
dd 50,16,13,1
dd 98,32,39,3
dd 158,51,26,2
dd 53,0,6,1
dd 103,0,18,3
dd 166,0,12,2
dd 50,-16,10,1
dd 98,-32,30,3
dd 158,-51,20,2
dd 43,-31,15,1
dd 83,-61,45,3
dd 134,-98,30,2
dd 31,-43,2,1
dd 61,-83,6,3
dd 98,-134,4,2
dd 16,-50,17,1
dd 32,-98,51,3
dd 51,-158,34,2
dd 0,-53,3,1
dd 0,-103,9,3
dd 0,-166,6,2
dd -16,-50,19,1
dd -32,-98,57,3
dd -51,-158,38,2
dd -31,-43,7,1
dd -61,-83,21,3
dd -98,-134,14,2
dd -43,-31,16,1
dd -83,-61,48,3
dd -134,-98,32,2
dd -50,-16,8,1
dd -98,-32,24,3
dd -158,-51,16,2
dd -53,0,11,1
dd -103,0,33,3
dd -166,0,22,2
dd -50,16,14,1
dd -98,32,42,3
dd -158,51,28,2
dd -43,31,9,1
dd -83,61,27,3
dd -134,98,18,2
dd -31,43,12,1
dd -61,83,36,3
dd -98,134,24,2
dd -16,50,5,1
dd -32,98,15,3
dd -51,158,10,2
dd 0,0,50,2
dd 0,6,50,2
dd 0,10,25,1
dd 0,16,20,1
dd 0,190,0,0
dd 2147483647,0,0,0
dd -2147483648,0,0,0
dtVectorCount3D equ 67
dtTestTriples3D dd 0
dtTestMetricPath db "build\darts\aim-metrics.bin",0
.code
DartsTestWriteMetrics PROC uses ebx
local written:DWORD
invoke CreateFileA,OFFSET dtTestMetricPath,40000000h,0,0,2,80h,0
cmp eax,-1
je dt_test_metric_fail
mov ebx,eax
invoke WriteFile,ebx,OFFSET dtTestTriples3D,4,ADDR written,0
invoke CloseHandle,ebx
ret
dt_test_metric_fail:
invoke ExitProcess,8505
ret
DartsTestWriteMetrics ENDP
DartsTestStart PROC uses ebx esi edi
local legs:DWORD
call InitPaths3D
lea esi,dtVectors3D
mov ebx,dtVectorCount3D
dt_test_vector:
invoke DartsScore3D,[esi],[esi+4]
cmp eax,[esi+8]
jne dt_test_fail
cmp edx,[esi+12]
jne dt_test_fail
add esi,16
dec ebx
jnz dt_test_vector
mov playerX,123456
mov playerY,789012
mov bankroll,12345
call ResetDarts3D
mov dtCursorX3D,320*256
mov dtCursorY3D,214*256
mov dtClock3D,384
mov dtHolding3D,1
mov dtHoldTime3D,0
call DartsAim3D
cmp dtAimX3D,10
jl dt_test_fail
cmp dtAimX3D,13
jg dt_test_fail
mov ebx,dtAimX3D
mov dtHoldTime3D,4000
call DartsAim3D
mov eax,dtAimX3D
sub eax,ebx
cmp eax,8
jne dt_test_fail
; Fine mouse motion must survive the hall's coarser 320px UI coordinates.
mov engineMode,MODE_DARTS
mov viewWidth3D,2560
mov viewHeight3D,1440
mov viewLeft3D,0
mov viewTop3D,0
invoke WindowEvents3D,0,200h,0,02820500h
call DartsAim3D
mov ebx,dtAimX3D
invoke WindowEvents3D,0,200h,0,02820502h
call DartsAim3D
cmp dtAimX3D,ebx
jle dt_test_fail
cmp mouseX3D,160
jne dt_test_fail
mov ebx,dtAimY3D
invoke WindowEvents3D,0,200h,0,02840502h
call DartsAim3D
cmp dtAimY3D,ebx
jge dt_test_fail
cmp mouseY3D,107
jne dt_test_fail
call ResetDarts3D
call DartsCamera3D
invoke DartsProject3D,-248,0,DT_WALL
mov ebx,eax
invoke DartsProject3D,248,0,DT_WALL
sub eax,ebx
cmp eax,170
jl dt_test_fail
cmp eax,180
jg dt_test_fail
; Camping at the centre of T20 no longer guarantees a triple every time.
mov dtCursorX3D,320*256
mov dtCursorY3D,214*256-103*DT_FOCAL*256/DT_WALL
mov dtClock3D,0
mov dtTestTriples3D,0
mov edi,100
dt_test_sway_samples:
call DartsAim3D
invoke DartsScore3D,dtAimX3D,dtAimY3D
cmp eax,60
jne @F
inc dtTestTriples3D
@@:
add dtClock3D,16
dec edi
jnz dt_test_sway_samples
cmp dtTestTriples3D,10
jb dt_test_fail
cmp dtTestTriples3D,60
ja dt_test_fail
call DartsTestWriteMetrics
mov dtState3D,DT_FLIGHT
mov dtTimer3D,400
mov deltaTime3D,16
mov pressedKeys3D[9],1
call HandleDarts3D
cmp dtScoreOpen3D,1
jne dt_test_fail
cmp dtTimer3D,400
jne dt_test_fail
mov pressedKeys3D[9],1
call HandleDarts3D
cmp dtScoreOpen3D,0
jne dt_test_fail
cmp dtTimer3D,416
jne dt_test_fail
call ResetDarts3D
mov dtHitX3D,0
mov dtHitY3D,103
mov dtRemaining3D,59
mov dtVisitStart3D,100
mov dtState3D,DT_FLIGHT
call SettleDarts3D
cmp dtRemaining3D,100
jne dt_test_fail
cmp dtBust3D,1
jne dt_test_fail
cmp dtCount3D,1
jne dt_test_fail
call SettleDarts3D
cmp dtCount3D,1
jne dt_test_fail
call ResetDarts3D
mov dtHitX3D,0
mov dtHitY3D,166
mov dtRemaining3D,40
mov dtVisitStart3D,40
mov dtState3D,DT_FLIGHT
call SettleDarts3D
cmp dtRemaining3D,0
jne dt_test_fail
mov dtTimer3D,1300
mov deltaTime3D,16
call HandleDarts3D
cmp dtState3D,DT_WIN
jne dt_test_fail
call ResetDarts3D
mov dtHitY3D,166
mov dtRemaining3D,41
mov dtVisitStart3D,41
mov dtState3D,DT_FLIGHT
call SettleDarts3D
cmp dtRemaining3D,1
jne dt_test_fail
cmp dtBust3D,0
jne dt_test_fail
mov dtCount3D,3
mov dtState3D,DT_RETURN
mov dtTimer3D,750
call HandleDarts3D
cmp dtCount3D,0
jne dt_test_fail
cmp dtVisit3D,2
jne dt_test_fail
cmp dtActor3D,1
jne dt_test_fail
cmp dtRemaining3D,500
jne dt_test_fail
cmp dtScores3D,1
jne dt_test_fail
cmp dtScores3D[4],500
jne dt_test_fail
call ResetDarts3D
mov engineMode,MODE_DARTS
mov viewWidth3D,640
mov viewHeight3D,480
mov viewLeft3D,0
mov viewTop3D,0
mov mouseClick3D,0
invoke WindowEvents3D,0,200h,0,00D60140h
cmp mouseClick3D,0
jne dt_test_fail
invoke WindowEvents3D,0,201h,1,00D60140h
call HandleDarts3D
cmp dtState3D,DT_AIM
jne dt_test_fail
cmp dtHolding3D,1
jne dt_test_fail
invoke WindowEvents3D,0,202h,0,00D60140h
call HandleDarts3D
cmp dtState3D,DT_RELEASE
jne dt_test_fail
cmp dtThrows3D,1
jne dt_test_fail
mov ebx,dtHitX3D
mov esi,dtHitY3D
invoke WindowEvents3D,0,200h,0,00640064h
call HandleDarts3D
cmp dtHitX3D,ebx
jne dt_test_fail
cmp dtHitY3D,esi
jne dt_test_fail
call ResetDarts3D
mov dtHitX3D,80
mov dtHitY3D,103
mov dtState3D,DT_FLIGHT
mov dtTimer3D,0
call DartsCamera3D
cmp dtCamZ3D,0
jne dt_test_fail
mov dtTimer3D,600
call DartsCamera3D
cmp dtCamZ3D,DT_WALL/2-160
jne dt_test_fail
cmp dtYawSin3D,50000
jl dt_test_fail
mov dtTimer3D,1200
call DartsCamera3D
cmp dtCamZ3D,DT_WALL-420
jne dt_test_fail
invoke DartsProject3D,80,103,DT_WALL
cmp eax,320
jl dt_test_fail
cmp eax,420
jg dt_test_fail
cmp edx,120
jl dt_test_fail
cmp edx,214
jg dt_test_fail
cmp dtYawSin3D,12000
jg dt_test_fail
; Actual bot input ignores the cursor and automatically releases a dart.
call ResetDarts3D
mov dtActor3D,1
mov mouseX3D,0
mov mouseY3D,0
mov deltaTime3D,1600
call HandleDarts3D
cmp dtState3D,DT_RELEASE
jne dt_test_fail
cmp dtThrows3D,1
jne dt_test_fail
cmp dtScores3D,500
jne dt_test_fail
; Complete a real match through normal phase/visit transitions.
mov legs,20
dt_test_another_match:
call ResetDarts3D
mov edi,5000
dt_test_match:
cmp dtState3D,DT_WIN
je dt_test_match_done
cmp dtState3D,DT_AIM
jne dt_test_match_tick
cmp dtActor3D,0
jne dt_test_match_tick
call DartsBotAim3D
mov eax,dtBotAimX3D
mov dtAimX3D,eax
mov eax,dtBotAimY3D
mov dtAimY3D,eax
call ThrowDarts3D
dt_test_match_tick:
mov deltaTime3D,1400
call HandleDarts3D
cmp dtScores3D,500
ja dt_test_fail
cmp dtScores3D[4],500
ja dt_test_fail
dec edi
jnz dt_test_match
jmp dt_test_fail
dt_test_match_done:
mov eax,dtWinner3D
cmp dtScores3D[eax*4],0
jne dt_test_fail
dec legs
jnz dt_test_another_match
cmp playerX,123456
jne dt_test_fail
cmp playerY,789012
jne dt_test_fail
cmp bankroll,12345
jne dt_test_fail
call LoadDarts3D
test eax,eax
jz dt_test_assets
call DartsTestFrames
call FreeDarts3D
xor eax,eax
jmp dt_test_exit
dt_test_assets:
mov eax,8502
jmp dt_test_exit
dt_test_fail:
mov eax,8501
dt_test_exit:
invoke ExitProcess,eax
DartsTestStart ENDP