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.
135 lines
4.8 KiB
PHP
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
|