- Billiards: add native Russian Pyramid & American Eight-Ball pool with physics prediction, controls, and regression tests - Scratch Tickets: add dedicated counter, mat presentation, elliptical coin scraping, 4 ticket types, and payout effects - First-Person Dice: add native dice scene, hand anchor frames, throwing animation, and table perspective - City Wake & Weather: add arrival cutscene, alley geometry, weather/rain effects, and lighter/rocker animation - World Dressing: add hall paintings, furniture packs, hall lighting, and scene regression tests - Build & Tooling: update build.bat for modern MSVC toolchain, update launcher hash, and refresh shipping binaries
219 lines
6.2 KiB
NASM
219 lines
6.2 KiB
NASM
.386
|
|
.model flat
|
|
option casemap:none
|
|
FP_1 equ 65536
|
|
FP_HALF equ 32768
|
|
SCREEN_W equ 640
|
|
SCREEN_H equ 480
|
|
SCREEN_SIZE equ 640*480
|
|
CITY_PROP_COUNT equ 47
|
|
HALL_LIGHT_COUNT equ 6
|
|
HALL_DECOR_COUNT equ 12
|
|
AnimPack3D STRUCT
|
|
magic dd ?
|
|
imageWidth dd ?
|
|
height dd ?
|
|
frames dd ?
|
|
bytes dd ?
|
|
pixels dd ?
|
|
AnimPack3D ENDS
|
|
CityProp3D STRUCT
|
|
posX dd ?
|
|
posY dd ?
|
|
worldW dd ?
|
|
worldH dd ?
|
|
frame dd ?
|
|
asset dd ?
|
|
groundZ dd ?
|
|
CityProp3D ENDS
|
|
EXTERN casinoMap:BYTE,hallLevel3D:DWORD,outdoorRender3D:DWORD
|
|
EXTERN hallLights3D:BYTE,hallLoungeDecor3D:BYTE,hallRopeFurniture3D:BYTE,hallLampFurniture3D:BYTE
|
|
EXTERN cityObjects3D:BYTE,hallStreetLife3D:BYTE,cityDecorPack3D:AnimPack3D
|
|
EXTERN playerX:DWORD,playerY:DWORD,playerAngle:DWORD,viewEye3D:DWORD,viewCeiling3D:DWORD,viewHorizon3D:DWORD
|
|
EXTERN worldMap3D:DWORD,floorTexture3D:DWORD,cityMap3D:BYTE
|
|
EXTERN cityPhase3D:DWORD,cityTime3D:DWORD,cityClock3D:DWORD,arrivalState3D:DWORD
|
|
EXTERN screenBuffer:DWORD,cityDepthBuffer3D:DWORD,cityRayX3D:DWORD,cityRayY3D:DWORD,zBuffer:DWORD,cityBackdrop3D:DWORD
|
|
EXTERN playerPlaneX:DWORD,playerPlaneY:DWORD
|
|
option language:stdcall
|
|
ExitProcess PROTO :DWORD
|
|
GetTickCount PROTO
|
|
InitPaths3D PROTO
|
|
LoadTextures3D PROTO
|
|
LoadArrivalAssets3D PROTO
|
|
InitializeCasinoSprites3D PROTO
|
|
InitHall3D PROTO
|
|
LoadHallAssets3D PROTO
|
|
LoadCityArrival3D PROTO
|
|
UpdateCamera3D PROTO
|
|
RenderCeilingAndFloor PROTO
|
|
RenderWalls PROTO
|
|
PrepareCityDepth3D PROTO
|
|
RenderSprites PROTO
|
|
RenderHall3D PROTO
|
|
PositionCityCamera3D PROTO
|
|
DrawCitySky3D PROTO
|
|
DrawCitySkyline3D PROTO
|
|
RenderCityObjects3D PROTO
|
|
AnimateCityPedestrians3D PROTO
|
|
RenderCityFurniture3D PROTO
|
|
RenderCityBins3D PROTO
|
|
RenderCityAlley3D PROTO
|
|
RenderCityFacade3D PROTO
|
|
RenderCityGuards3D PROTO
|
|
DrawCityRain3D PROTO
|
|
WriteActionSnapshot3D PROTO :DWORD
|
|
LoadAnimPack3D PROTO :DWORD,:DWORD
|
|
FreeAnimPack3D PROTO :DWORD
|
|
ValidateCityPack3D PROTO :DWORD,:DWORD,:DWORD,:DWORD
|
|
DrawCityVertical3D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
|
|
DrawCityBoxSides3D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
|
|
DrawCityHorizontal3D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
|
|
ResolveWorldSurface3D PROTO :DWORD
|
|
CityRayPlane3D PROTO :DWORD,:DWORD,:DWORD
|
|
ProjectCityPoint3D PROTO :DWORD,:DWORD
|
|
IsCityEmissive3D PROTO :DWORD,:DWORD
|
|
ShadeCityGround3D PROTO :DWORD,:DWORD,:DWORD,:DWORD
|
|
.code
|
|
include src_graphics/world_dressing_data.inc
|
|
include src_graphics/world_dressing.inc
|
|
include src_graphics/hall_lighting.inc
|
|
include build/world/surfaces.inc
|
|
.data
|
|
worldHallBefore3D db "build\world\hall-before.bmp",0
|
|
worldHallAfter3D db "build\world\hall-after.bmp",0
|
|
worldWallAfter3D db "build\world\wall-after.bmp",0
|
|
worldStreetBefore3D db "build\world\street-before.bmp",0
|
|
worldStreetAfter3D db "build\world\street-after.bmp",0
|
|
.code
|
|
WorldProbeHall PROC
|
|
call UpdateCamera3D
|
|
call RenderCeilingAndFloor
|
|
call RenderWalls
|
|
call PrepareCityDepth3D
|
|
call RenderSprites
|
|
call RenderHall3D
|
|
ret
|
|
WorldProbeHall ENDP
|
|
WorldProbeStreet PROC
|
|
call UpdateCamera3D
|
|
call DrawCitySky3D
|
|
call RenderCeilingAndFloor
|
|
call DrawCitySkyline3D
|
|
call RenderWalls
|
|
call PrepareCityDepth3D
|
|
cmp worldStreetSized3D,0
|
|
je @F
|
|
call RenderStreetDressing3D
|
|
@@:
|
|
call RenderCityObjects3D
|
|
call RenderCityFurniture3D
|
|
call RenderCityBins3D
|
|
call RenderCityAlley3D
|
|
call RenderCityFacade3D
|
|
call RenderCityGuards3D
|
|
call DrawCityRain3D
|
|
ret
|
|
WorldProbeStreet ENDP
|
|
WorldDressingProbeStart PROC
|
|
call InitPaths3D
|
|
call LoadTextures3D
|
|
call LoadArrivalAssets3D
|
|
call InitializeCasinoSprites3D
|
|
call InitHall3D
|
|
call LoadHallAssets3D
|
|
call LoadCityArrival3D
|
|
mov playerX,14*FP_1
|
|
mov playerY,22*FP_1
|
|
mov playerAngle,384
|
|
call WorldProbeHall
|
|
invoke WriteActionSnapshot3D,OFFSET worldHallBefore3D
|
|
mov arrivalState3D,0
|
|
mov cityPhase3D,10
|
|
mov cityTime3D,3000
|
|
mov cityClock3D,18200
|
|
call PositionCityCamera3D
|
|
mov outdoorRender3D,1
|
|
mov worldMap3D,OFFSET cityMap3D
|
|
mov floorTexture3D,60
|
|
call WorldProbeStreet
|
|
invoke WriteActionSnapshot3D,OFFSET worldStreetBefore3D
|
|
call LoadWorldDressing3D
|
|
mov viewEye3D,FP_1*121/100
|
|
call WorldProbeStreet
|
|
invoke WriteActionSnapshot3D,OFFSET worldStreetAfter3D
|
|
call InitHall3D
|
|
call BuildHallLighting3D
|
|
cmp hallLightMap3D[19*256*8+14*8],80
|
|
jb world_probe_bake_failed
|
|
cmp hallContactMap3D[19*256*8+13*8],40
|
|
jne world_probe_bake_failed
|
|
invoke HallLightVisible3D,132,148,132,164
|
|
cmp eax,1
|
|
jne world_probe_bake_failed
|
|
mov casinoMap[19*32+16],1
|
|
invoke HallLightVisible3D,132,148,132,164
|
|
mov casinoMap[19*32+16],0
|
|
test eax,eax
|
|
jnz world_probe_bake_failed
|
|
invoke StreetGroundHeight3D,14*FP_1,FP_1*1265/100
|
|
cmp eax,FP_1*3/50
|
|
jne world_probe_bake_failed
|
|
invoke StreetGroundHeight3D,35*FP_1,FP_1*1265/100
|
|
test eax,eax
|
|
jnz world_probe_bake_failed
|
|
mov outdoorRender3D,0
|
|
mov worldMap3D,OFFSET casinoMap
|
|
mov floorTexture3D,100
|
|
mov viewEye3D,FP_1*21/20
|
|
mov viewHorizon3D,240
|
|
mov playerX,14*FP_1
|
|
mov playerY,22*FP_1
|
|
mov playerAngle,384
|
|
call WorldProbeHall
|
|
call RenderHallDressing3D
|
|
call ApplyHallLighting3D
|
|
invoke WriteActionSnapshot3D,OFFSET worldHallAfter3D
|
|
mov playerX,27*FP_1
|
|
mov playerY,18*FP_1
|
|
mov playerAngle,0
|
|
call WorldProbeHall
|
|
call RenderHallDressing3D
|
|
call ApplyHallLighting3D
|
|
invoke WriteActionSnapshot3D,OFFSET worldWallAfter3D
|
|
invoke ExitProcess,0
|
|
world_probe_bake_failed:
|
|
invoke ExitProcess,1
|
|
WorldDressingProbeStart ENDP
|
|
WorldDressingBenchmarkStart PROC uses ebx esi
|
|
call InitPaths3D
|
|
call LoadTextures3D
|
|
call LoadArrivalAssets3D
|
|
call InitializeCasinoSprites3D
|
|
call InitHall3D
|
|
call LoadHallAssets3D
|
|
call LoadCityArrival3D
|
|
call LoadWorldDressing3D
|
|
mov arrivalState3D,0
|
|
mov cityPhase3D,10
|
|
mov cityTime3D,3000
|
|
mov cityClock3D,18200
|
|
call PositionCityCamera3D
|
|
mov outdoorRender3D,1
|
|
mov worldMap3D,OFFSET cityMap3D
|
|
mov floorTexture3D,60
|
|
mov viewEye3D,FP_1*121/100
|
|
call GetTickCount
|
|
mov esi,eax
|
|
mov ebx,40
|
|
world_probe_benchmark:
|
|
call WorldProbeStreet
|
|
dec ebx
|
|
jnz world_probe_benchmark
|
|
call GetTickCount
|
|
sub eax,esi
|
|
xor edx,edx
|
|
mov ecx,40
|
|
div ecx
|
|
invoke ExitProcess,eax
|
|
WorldDressingBenchmarkStart ENDP
|
|
end
|