.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 DartsTestReticle PROC uses ebx esi edi mov edi,OFFSET screenBuffer mov ecx,640*480 mov eax,00E0E0E0h rep stosd invoke DrawDartsReticle3D,320,214 mov esi,OFFSET screenBuffer mov ecx,640*480 xor ebx,ebx dt_test_reticle_light: lodsd cmp eax,00E0E0E0h je @F cmp eax,00152021h jne dt_test_reticle_fail inc ebx @@: loop dt_test_reticle_light cmp ebx,9 jne dt_test_reticle_fail mov edi,OFFSET screenBuffer mov ecx,640*480 mov eax,00101010h rep stosd invoke DrawDartsReticle3D,0,32 mov esi,OFFSET screenBuffer mov ecx,640*480 xor ebx,ebx dt_test_reticle_dark: lodsd cmp eax,00101010h je @F cmp eax,00F6E6ADh jne dt_test_reticle_fail inc ebx @@: loop dt_test_reticle_dark cmp ebx,5 jne dt_test_reticle_fail ret dt_test_reticle_fail: invoke ExitProcess,8506 ret DartsTestReticle ENDP 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 call DartsTestReticle 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