KAZIK/tools/tests/fortune_ai_test.inc
Игорь Федосеев 5dedaf459f fix: restore fortune AI and add model setup
Restore native inference, card-bound readings and paged dialogue.

Provide manual, checksum-verified model setup instead of Git LFS so
source checkouts work without uploading multi-gigabyte weights. The
game stays offline; complete release archives still bundle the model.
2026-10-31 00:37:36 +03:00

135 lines
4.8 KiB
PHP

; Real production transport/parser/pager with controlled pipe frames, no model.
.data
fortuneAiTestFrame dd 31524346h,1,0
fortuneAiTestText db "Situation - Fool: "
db 230 dup('a')
db 10,"Obstacle - Magician: keep learning.",10
db "Direction - Star: choose a steady pace.",10
db "Advice: make a small start.",0
fortuneAiTestTextEnd LABEL BYTE
FORTUNE_AI_TEST_TEXT_SIZE equ fortuneAiTestTextEnd-fortuneAiTestText
fortuneAiTestBad db "only one line",0
fortuneAiTestIo dd 0
fortuneAiTestStage dd 82
.code
FortuneAiNativeTests PROC uses ebx esi edi
; Create the exact receive pipe used by the child process.
call CloseFortuneInference3D
invoke CreatePipe,OFFSET fortuneRead3D,OFFSET fortuneChildWrite3D,0,16384
test eax,eax
jz fortune_ai_test_fail
mov fortuneWorkerState3D,3
mov fortunePhase3D,6
mov fortuneReadingShown3D,0
mov fortuneReadingOffset3D,0
invoke GetTickCount
mov fortuneWorkerTick3D,eax
; A partial header must return immediately without losing framing.
mov fortuneAiTestFrame[8],FORTUNE_AI_TEST_TEXT_SIZE-1
invoke WriteFile,fortuneChildWrite3D,OFFSET fortuneAiTestFrame,8,OFFSET fortuneAiTestIo,0
call PollFortuneWorker3D
cmp fortuneWorkerState3D,3
jne fortune_ai_test_fail
cmp fortuneReceiveLength3D,-1
jne fortune_ai_test_fail
invoke WriteFile,fortuneChildWrite3D,OFFSET fortuneAiTestFrame+8,4,OFFSET fortuneAiTestIo,0
invoke WriteFile,fortuneChildWrite3D,OFFSET fortuneAiTestText,12,OFFSET fortuneAiTestIo,0
call PollFortuneWorker3D
cmp fortuneWorkerState3D,3
jne fortune_ai_test_fail
cmp fortuneReceiveLength3D,FORTUNE_AI_TEST_TEXT_SIZE-1
jne fortune_ai_test_fail
invoke WriteFile,fortuneChildWrite3D,OFFSET fortuneAiTestText+12,FORTUNE_AI_TEST_TEXT_SIZE-13,OFFSET fortuneAiTestIo,0
call PollFortuneWorker3D
cmp fortuneWorkerState3D,5
jne fortune_ai_test_fail
mov fortuneAiTestStage,83
invoke ShowFortuneReading3D,0
cmp fortuneSpeechLength3D,220
ja fortune_ai_test_fail
cmp fortuneReadingNext3D,0
je fortune_ai_test_fail
mov ebx,4
fortune_ai_test_pages:
call AdvanceFortuneReading3D
cmp fortuneReadingOffset3D,0
je fortune_ai_test_fail
cmp fortuneReadingNext3D,0
je fortune_ai_test_last_page
dec ebx
jnz fortune_ai_test_pages
jmp fortune_ai_test_fail
fortune_ai_test_last_page:
call AdvanceFortuneReading3D
cmp fortuneReadingShown3D,2
jne fortune_ai_test_fail
; Explicit advance moves to flip-two, never redisplays the first page.
mov fortuneAiTestStage,84
mov fortuneSubMode3D,FORTUNE_SUBMODE_TAROT
call UpdateFortuneSession3D
cmp fortunePhase3D,7
jne fortune_ai_test_fail
call CloseFortuneInference3D
cmp fortuneRead3D,0
jne fortune_ai_test_fail
cmp fortuneChildWrite3D,0
jne fortune_ai_test_fail
cmp fortuneSections3D,0
jne fortune_ai_test_fail
cmp fortuneAnswerLength3D,0
jne fortune_ai_test_fail
; Reject a complete but malformed answer.
mov fortuneAiTestStage,85
lea esi,fortuneAiTestBad
lea edi,fortuneAnswer3D
mov ecx,SIZEOF fortuneAiTestBad
rep movsb
mov fortuneAnswerLength3D,SIZEOF fortuneAiTestBad-1
call ParseFortuneAnswer3D
test eax,eax
jnz fortune_ai_test_fail
; Reject oversized frame before reading a body.
mov fortuneAiTestStage,86
invoke CreatePipe,OFFSET fortuneRead3D,OFFSET fortuneChildWrite3D,0,16384
mov fortuneWorkerState3D,3
mov fortuneAiTestFrame[8],8193
invoke WriteFile,fortuneChildWrite3D,OFFSET fortuneAiTestFrame,12,OFFSET fortuneAiTestIo,0
call PollFortuneWorker3D
cmp fortuneWorkerState3D,4
jne fortune_ai_test_fail
cmp fortuneRead3D,0
jne fortune_ai_test_fail
mov fortuneAiTestStage,87
; Broken pipes and timeout are visible errors, not endless thinking.
invoke CreatePipe,OFFSET fortuneRead3D,OFFSET fortuneChildWrite3D,0,16384
mov fortuneWorkerState3D,3
invoke CloseHandle,fortuneChildWrite3D
mov fortuneChildWrite3D,0
call PollFortuneWorker3D
cmp fortuneWorkerState3D,4
jne fortune_ai_test_fail
invoke CreatePipe,OFFSET fortuneRead3D,OFFSET fortuneChildWrite3D,0,16384
mov fortuneWorkerState3D,3
invoke GetTickCount
sub eax,180001
mov fortuneWorkerTick3D,eax
call PollFortuneWorker3D
cmp fortuneWorkerState3D,4
jne fortune_ai_test_fail
call CloseFortuneInference3D
; A source-only checkout must report missing weights without a child.
mov fortuneModelPath3D,'!'
call StartFortuneWorker3D
mov fortuneModelPath3D,'a'
cmp fortuneWorkerState3D,4
jne fortune_ai_test_fail
cmp fortuneProcess3D,0
jne fortune_ai_test_fail
cmp fortuneSpeechLength3D,0
je fortune_ai_test_fail
call CloseFortuneInference3D
ret
fortune_ai_test_fail:
invoke ExitProcess,fortuneAiTestStage
ret
FortuneAiNativeTests ENDP