391 lines
8.6 KiB
PHP
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
|