KAZIK/tools/tests/backrooms_extended_test.inc

391 lines
8.6 KiB
PHP

; Additional native invariants. No player files or runtime writes.
RunBackroomsExtendedTest3D PROC uses ebx esi edi
local rounds:DWORD,wins:DWORD,kind:DWORD,party:DWORD,bullets:DWORD,steps:DWORD
mov brOwned3D,1
mov brEnabled3D,0
mov rngSeed3D,87654
call BackroomsLuck3D
cmp eax,-1
jne br_extended_fail
cmp rngSeed3D,87654
jne br_extended_fail
mov brEnabled3D,1
mov obsActive3D,1
call BackroomsLuck3D
cmp eax,-1
jne br_extended_fail
mov obsActive3D,0
mov brTestStage,111
; Actual blackjack party dealing, all guest counts.
mov party,0
br_ext_bj_party:
mov wins,0
mov rounds,1000
br_ext_bj_round:
mov bankroll,1000000
mov eax,party
mov cbBotCount3D,eax
mov cbState3D,CB_IDLE
call StartNativeBlackjack3D
cmp cbPlayerScore3D,21
jne @F
inc wins
cmp cbDealerScore3D,19
jne br_extended_fail
@@:
dec rounds
jnz br_ext_bj_round
cmp wins,860
jb br_extended_fail
cmp wins,940
ja br_extended_fail
inc party
cmp party,4
jb br_ext_bj_party
mov cbBotCount3D,0
; Every scratch design, generated by the actual purchase path.
mov scrReady3D,1
mov brTestStage,112
mov kind,0
br_ext_ticket_type:
mov eax,kind
add eax,120
mov brTestStage,eax
mov wins,0
mov rounds,1000
br_ext_ticket:
mov bankroll,1000000
mov scrState3D,0
mov scrPriceIndex3D,0
mov eax,kind
mov scrType3D,eax
call BuyScratch3D
mov eax,scrGross3D
test eax,eax
jz @F
inc wins
@@:
cmp kind,4
jb @F
call ScratchPortraitPayout3D
cmp eax,scrGross3D
jne br_extended_fail
@@:
dec rounds
jnz br_ext_ticket
cmp wins,860
jb br_extended_fail
cmp wins,940
ja br_extended_fail
inc kind
cmp kind,7
jb br_ext_ticket_type
; Roulette: a real straight-up bet, including actual multiplier matching.
lea edi,wheelBets3D
mov brTestStage,113
xor eax,eax
mov ecx,49
rep stosd
mov wheelBets3D[7*4],100
mov wheelStake3D,100
mov wins,0
mov rounds,1000
br_ext_wheel:
invoke BackroomsWheelLuck3D,0
cmp eax,36
ja br_extended_fail
invoke WheelBetMultiplier3D,7,eax
test eax,eax
jz @F
inc wins
@@:
dec rounds
jnz br_ext_wheel
cmp wins,860
jb br_extended_fail
cmp wins,940
ja br_extended_fail
; Durak: 36 distinct legal cards, correctly exposed trump on favorable deals.
mov rounds,1000
br_ext_durak:
mov brTestStage,114
mov bankroll,1000000
mov dkState3D,DK_IDLE
call StartNativeDurak3D
xor esi,esi
br_ext_durak_card:
mov eax,dkDeck3D[esi*4]
cmp eax,52
jae br_extended_fail
invoke DurakCardRank,eax
cmp eax,4
jb br_extended_fail
lea edi,[esi+1]
br_ext_durak_unique:
cmp edi,36
jae br_ext_durak_next
mov eax,dkDeck3D[edi*4]
cmp eax,dkDeck3D[esi*4]
je br_extended_fail
inc edi
jmp br_ext_durak_unique
br_ext_durak_next:
inc esi
cmp esi,36
jb br_ext_durak_card
cmp dkDeck3D,33
jne @F
cmp durakTrumpSuit,2
jne br_extended_fail
@@:
dec rounds
jnz br_ext_durak
; Russian roulette: real party elimination/reload rules, all 1..3 guests/bullets.
mov party,1
mov brTestStage,115
br_ext_rr_party:
mov bullets,1
br_ext_rr_bullets:
mov rounds,300
mov wins,0
br_ext_rr_round:
mov brTestStage,151
mov eax,party
mov rrPartyCount3D,eax
call RRPartyReset3D
mov eax,bullets
mov rr3d_bullets,eax
mov rrPartySettled3D,0
mov rrPartyStake3D,50
mov rr3d_bet,50
mov rr3d_turn,0
call BackroomsRussianLuck3D
mov rrPartyReloads3D,1
mov steps,0
br_ext_rr_shot:
mov eax,rr3d_mask
mov ecx,rr3d_chamber
bt eax,ecx
jnc br_ext_rr_advance
call RRPartyHit3D
cmp rrPartySettled3D,0
jne br_ext_rr_outcome
br_ext_rr_advance:
call RRPartyNext3D
inc steps
cmp steps,100
jae br_extended_fail
jmp br_ext_rr_shot
br_ext_rr_outcome:
mov brTestStage,152
cmp rr3d_state,RR_WIN
jne @F
inc wins
cmp brRussianLuck3D,1
jne br_extended_fail
@@:
cmp brRussianLuck3D,1
jne @F
mov eax,party
imul eax,10
add eax,bullets
add eax,200
mov brTestStage,eax
cmp rr3d_state,RR_WIN
jne br_extended_fail
@@:
dec rounds
jnz br_ext_rr_round
mov brTestStage,154
cmp wins,240
jb br_extended_fail
cmp wins,295
ja br_extended_fail
inc bullets
cmp bullets,4
jb br_ext_rr_bullets
inc party
cmp party,4
jb br_ext_rr_party
; Buckshot permutations retain cartridge counts and valid binary identities.
mov rounds,1000
br_ext_bs:
mov brTestStage,116
call BuckshotReload3D
xor edi,edi
xor esi,esi
br_ext_bs_shell:
mov eax,bs3d_shells[esi*4]
cmp eax,1
ja br_extended_fail
add edi,eax
inc esi
cmp esi,bs3d_shellCount
jb br_ext_bs_shell
cmp edi,bs3d_liveCount
jne br_extended_fail
add edi,bs3d_blankCount
cmp edi,bs3d_shellCount
jne br_extended_fail
dec rounds
jnz br_ext_bs
xor eax,eax
ret
br_extended_fail:
mov eax,brTestStage
ret
RunBackroomsExtendedTest3D ENDP
RunBackroomsSaveTest3D PROC uses ebx esi edi
; Signed but impossible enabled-without-owned flag must be rejected.
mov DWORD PTR saveBuffer[304],20002h
invoke ArtifactSaveSignature3D,OFFSET saveBuffer
mov DWORD PTR saveBuffer[308],eax
invoke ValidateArtifactSave3D,OFFSET saveBuffer
test eax,eax
jnz br_save_fail
; Native preview keeps its 40-byte, signed backward-compatible layout.
invoke CopyCString,OFFSET savePath3D,OFFSET brTestPreviewPath
mov nativeProfileActive3D,0
mov arrivalConfirmed3D,1
mov brOwned3D,1
mov brEnabled3D,1
call SaveProgress3D
mov brOwned3D,0
mov brEnabled3D,0
call LoadProgress3D
cmp brOwned3D,1
jne br_save_fail
cmp brEnabled3D,1
jne br_save_fail
mov brActive3D,1
mov brEnabled3D,0
invoke LeaveBackrooms3D,1
cmp brOwned3D,1
jne br_save_fail
cmp brEnabled3D,0
jne br_save_fail
call LoadProgress3D
cmp brEnabled3D,0
jne br_save_fail
xor eax,eax
ret
br_save_fail:
mov eax,102
ret
RunBackroomsSaveTest3D ENDP
.data
brContextModes dd MODE_COIN,MODE_DICE,MODE_SLOTS,MODE_BLACKJACK,MODE_ROULETTE,MODE_CLOVER
brContextMap db 1024 dup(0)
.code
RunBackroomsContextTest3D PROC uses ebx esi edi
local index:DWORD,x:DWORD,y:DWORD
call GenerateBackrooms3D
mov brActive3D,1
mov brCutscene3D,0
mov hallLevel3D,HALL_BACKROOMS
mov worldMap3D,OFFSET brMap3D
lea esi,brMap3D
lea edi,brContextMap
mov ecx,256
rep movsd
mov index,0
br_context_game:
mov esi,index
mov ebx,brGameCells3D[esi*4]
mov eax,ebx
and eax,31
shl eax,16
add eax,FP_HALF
mov x,eax
mov playerX,eax
mov eax,ebx
shr eax,5
shl eax,16
add eax,FP_HALF
mov y,eax
mov playerY,eax
mov playerAngle,77
mov engineMode,MODE_WALK
mov mouseLocked3D,0
mov deltaTime3D,16
call ClearKeys3D
mov pressedKeys3D[45h],1
call HandleBackrooms3D
mov esi,index
mov eax,brContextModes[esi*4]
cmp eax,engineMode
jne br_context_fail
cmp eax,MODE_DICE
jne @F
call DiceEscape3D
jmp br_context_returned
@@:
call CardTableEscape3D
br_context_returned:
cmp engineMode,MODE_WALK
jne br_context_fail
mov eax,x
cmp playerX,eax
jne br_context_fail
mov eax,y
cmp playerY,eax
jne br_context_fail
cmp playerAngle,77
jne br_context_fail
cmp worldMap3D,OFFSET brMap3D
jne br_context_fail
cmp hallLevel3D,HALL_BACKROOMS
jne br_context_fail
lea esi,brMap3D
lea edi,brContextMap
mov ecx,1024
repe cmpsb
jne br_context_fail
inc index
cmp index,6
jb br_context_game
mov brActive3D,0
mov hallLevel3D,0
mov worldMap3D,OFFSET casinoMap
xor eax,eax
ret
br_context_fail:
mov eax,103
ret
RunBackroomsContextTest3D ENDP
RunBackroomsWallTest3D PROC uses esi
mov brActive3D,0
mov engineMode,MODE_WALK
mov mouseLocked3D,0
mov playerX,16*FP_1+FP_HALF
mov playerY,27*FP_1+FP_HALF
mov playerAngle,128
mov deltaTime3D,16
mov brEntryHold3D,0
call ClearKeys3D
mov keys3D[57h],1
mov esi,500
br_wall_walk:
call HandlePlayerInput
call BackroomsEntry3D
cmp brActive3D,1
je br_wall_entered
dec esi
jnz br_wall_walk
mov eax,104
ret
br_wall_entered:
cmp playerY,30*FP_1
jae br_wall_fail
cmp playerY,30*FP_1-15000
jb br_wall_fail
call ClearKeys3D
xor eax,eax
ret
br_wall_fail:
mov eax,105
ret
RunBackroomsWallTest3D ENDP