- Bowling feel: impulse contact solver, string pinsetter cycle, in-world lengthwise return rack and visible ball return lift - Ball weights: 4/5/6/7 kg selection with equal launch work physics, momentum balance, and projected picking - Audio: dedicated MCI channels with 7 synthesized waveaudio cues (release, rolling, impacts, applause, pinsetter, return) - First-person animations: 33-frame player underarm throw/follow-through sequence (player-underarm-v2) - Visitors: 10 persistent shared cast identities with exclusive reservations, activity transitions, and chair sit/rise animations - Tests & verification: comprehensive native regression test suites and updated documentation - Synchronize binaries and update launcher hash to 536E23BED4055562BC63871826FF44FFED037923A9BE8E0F591131DB4FBD104B
228 lines
5.9 KiB
PHP
228 lines
5.9 KiB
PHP
.data
|
|
npcTestBase1 db "build\arrival\fixtures\npc-one.dat",0
|
|
npcTestBase2 db "build\arrival\fixtures\npc-two.dat",0
|
|
npcTestJournal1 db "build\arrival\fixtures\npc-one.dat.npc",0
|
|
npcTestJournal2 db "build\arrival\fixtures\npc-two.dat.npc",0
|
|
npcTestOpenShot db "build\actions\npc-dialog-open.bmp",0
|
|
npcTestReadyShot db "build\actions\npc-dialog-ready.bmp",0
|
|
npcTestDoneShot db "build\actions\npc-dialog-done.bmp",0
|
|
.code
|
|
RunNpcLifeTest3D PROC uses ebx esi edi
|
|
local oldBank:DWORD,steps:DWORD,identity:DWORD,firstX:DWORD,firstY:DWORD,claimBank:DWORD
|
|
mov eax,bankroll
|
|
mov oldBank,eax
|
|
mov hallTestStage3D,7901
|
|
call InitHall3D
|
|
xor esi,esi
|
|
npc_test_destinations:
|
|
invoke NpcPlanPath3D,0,esi
|
|
cmp eax,1
|
|
jne npc_test_fail
|
|
inc esi
|
|
cmp esi,NPC_DEST_COUNT
|
|
jb npc_test_destinations
|
|
mov esi,20
|
|
npc_test_rate:
|
|
call InitNpcLife3D
|
|
mov playerX,30*FP_1+FP_HALF
|
|
mov playerY,30*FP_1+FP_HALF
|
|
mov edi,1
|
|
npc_test_rate_clear_crowd:
|
|
imul ebx,edi,SIZEOF NpcLife3D
|
|
mov npcLife3D[ebx].state,NPC_AWAY
|
|
inc edi
|
|
cmp edi,NPC_LIFE_COUNT
|
|
jb npc_test_rate_clear_crowd
|
|
invoke NpcPlanPath3D,0,5
|
|
cmp eax,1
|
|
jne npc_test_fail
|
|
mov eax,2000
|
|
xor edx,edx
|
|
div esi
|
|
mov steps,eax
|
|
npc_test_rate_step:
|
|
invoke NpcMove3D,0,esi
|
|
dec steps
|
|
jnz npc_test_rate_step
|
|
mov eax,casinoNpcs3D.posX
|
|
mov edx,casinoNpcs3D.posY
|
|
cmp esi,20
|
|
jne npc_test_rate_compare
|
|
mov firstX,eax
|
|
mov firstY,edx
|
|
mov esi,50
|
|
jmp npc_test_rate
|
|
npc_test_rate_compare:
|
|
cmp eax,firstX
|
|
jne npc_test_fail
|
|
cmp edx,firstY
|
|
jne npc_test_fail
|
|
cmp esi,100
|
|
je npc_test_routes
|
|
mov esi,100
|
|
jmp npc_test_rate
|
|
npc_test_routes:
|
|
mov hallTestStage3D,7902
|
|
call InitNpcLife3D
|
|
mov deltaTime3D,50
|
|
mov steps,2400
|
|
npc_test_simulate:
|
|
call UpdateNpcLife3D
|
|
xor esi,esi
|
|
npc_test_person_bounds:
|
|
invoke NpcEntity3D,esi
|
|
mov ebx,eax
|
|
invoke CanWalk3D,[ebx].NpcMindEntity.posX,[ebx].NpcMindEntity.posY
|
|
cmp eax,1
|
|
jne npc_test_fail
|
|
imul edi,esi,SIZEOF NpcLife3D
|
|
cmp npcLife3D[edi].state,NPC_AWAY
|
|
ja npc_test_fail
|
|
cmp npcLife3D[edi].identity,NPC_IDENTITY_COUNT
|
|
jae npc_test_fail
|
|
cmp npcLife3D[edi].pathCount,NPC_PATH_CAP
|
|
ja npc_test_fail
|
|
inc esi
|
|
cmp esi,NPC_LIFE_COUNT
|
|
jb npc_test_person_bounds
|
|
dec steps
|
|
jnz npc_test_simulate
|
|
cmp npcLifeClock3D,120000
|
|
jne npc_test_fail
|
|
mov hallTestStage3D,7903
|
|
invoke DeleteFileA,OFFSET npcTestJournal1
|
|
invoke DeleteFileA,OFFSET npcTestJournal2
|
|
mov npcJournalBasePtr3D,OFFSET npcTestBase1
|
|
mov npcDateOverride3D,20261012
|
|
mov npcJournalLoaded3D,0
|
|
call NpcEnsureJournal3D
|
|
cmp eax,1
|
|
jne npc_test_fail
|
|
xor esi,esi
|
|
npc_test_find_any:
|
|
invoke NpcContractType3D,esi
|
|
test eax,eax
|
|
jz npc_test_accept
|
|
inc esi
|
|
cmp esi,NPC_IDENTITY_COUNT
|
|
jb npc_test_find_any
|
|
jmp npc_test_fail
|
|
npc_test_accept:
|
|
mov identity,esi
|
|
invoke NpcRecordRound3D,0,1
|
|
cmp npcProgress3D[esi*4],0
|
|
jne npc_test_fail
|
|
invoke NpcAcceptContract3D,esi
|
|
cmp eax,1
|
|
jne npc_test_fail
|
|
invoke NpcClaimContract3D,esi
|
|
test eax,eax
|
|
jnz npc_test_fail
|
|
; A real legacy graphical settlement contributes once, including repeat protection.
|
|
mov skulls3d_state,3
|
|
mov skulls3d_choice,0
|
|
mov skulls3d_ballPos,0
|
|
mov skulls3d_bet,50
|
|
call FinalizeSkullsGuess
|
|
cmp npcProgress3D[esi*4],1
|
|
jne npc_test_fail
|
|
mov eax,bankroll
|
|
mov claimBank,eax
|
|
call FinalizeSkullsGuess
|
|
mov eax,claimBank
|
|
cmp bankroll,eax
|
|
jne npc_test_fail
|
|
cmp npcProgress3D[esi*4],1
|
|
jne npc_test_fail
|
|
invoke NpcRecordRound3D,1,1
|
|
invoke NpcRecordRound3D,2,0
|
|
invoke NpcRecordRound3D,3,1
|
|
cmp npcProgress3D[esi*4],3
|
|
jne npc_test_fail
|
|
invoke NpcClaimContract3D,esi
|
|
cmp eax,1
|
|
jne npc_test_fail
|
|
mov eax,claimBank
|
|
add eax,150
|
|
cmp bankroll,eax
|
|
jne npc_test_fail
|
|
mov npcJournalLoaded3D,0
|
|
call NpcEnsureJournal3D
|
|
invoke NpcClaimContract3D,identity
|
|
test eax,eax
|
|
jnz npc_test_fail
|
|
mov hallTestStage3D,7904
|
|
mov npcJournalBasePtr3D,OFFSET npcTestBase2
|
|
call NpcEnsureJournal3D
|
|
cmp npcAccepted3D,0
|
|
jne npc_test_fail
|
|
cmp npcClaimed3D,0
|
|
jne npc_test_fail
|
|
call InitNpcLife3D
|
|
mov playerX,16*FP_1+FP_HALF
|
|
mov playerY,18*FP_1+FP_HALF
|
|
mov playerAngle,384
|
|
call UpdateCamera3D
|
|
mov interactTargetId,0
|
|
call CheckNpcInteractions3D
|
|
cmp interactTargetId,INTERACT_NPC
|
|
jne npc_test_fail
|
|
cmp npcSelected3D,0
|
|
jne npc_test_fail
|
|
call TriggerHallInteraction3D
|
|
cmp engineMode,MODE_NPC_DIALOG
|
|
jne npc_test_fail
|
|
call RenderNpcDialog3D
|
|
invoke WriteActionSnapshot3D,OFFSET npcTestOpenShot
|
|
mov mouseClick3D,1
|
|
mov mouseX3D,60
|
|
mov mouseY3D,175
|
|
call HandleNpcDialog3D
|
|
bt npcAccepted3D,0
|
|
jnc npc_test_fail
|
|
mov ebx,3
|
|
npc_test_finish_dialog:
|
|
xor esi,esi
|
|
npc_test_finish_games:
|
|
invoke NpcRecordRound3D,esi,1
|
|
inc esi
|
|
cmp esi,6
|
|
jb npc_test_finish_games
|
|
dec ebx
|
|
jnz npc_test_finish_dialog
|
|
call RenderNpcDialog3D
|
|
invoke WriteActionSnapshot3D,OFFSET npcTestReadyShot
|
|
mov mouseClick3D,1
|
|
mov mouseX3D,145
|
|
mov mouseY3D,175
|
|
call HandleNpcDialog3D
|
|
bt npcClaimed3D,0
|
|
jnc npc_test_fail
|
|
call RenderNpcDialog3D
|
|
invoke WriteActionSnapshot3D,OFFSET npcTestDoneShot
|
|
call CardTableEscape3D
|
|
cmp eax,1
|
|
jne npc_test_fail
|
|
cmp engineMode,MODE_WALK
|
|
jne npc_test_fail
|
|
mov npcDateOverride3D,20261013
|
|
call NpcEnsureJournal3D
|
|
cmp npcAccepted3D,0
|
|
jne npc_test_fail
|
|
cmp npcClaimed3D,0
|
|
jne npc_test_fail
|
|
mov npcAccepted3D,0
|
|
mov npcClaimed3D,0
|
|
mov npcJournalLoaded3D,0
|
|
mov npcDateOverride3D,0
|
|
mov npcJournalBasePtr3D,OFFSET npcJournalTestBase3D
|
|
mov deltaTime3D,16
|
|
mov eax,oldBank
|
|
mov bankroll,eax
|
|
call ClearKeys3D
|
|
xor eax,eax
|
|
ret
|
|
npc_test_fail:
|
|
mov eax,hallTestStage3D
|
|
ret
|
|
RunNpcLifeTest3D ENDP
|