.data lightFile db 'lit.dat',0 lightBadCount db 'lit_badcount.dat',0 lightBadRadius db 'lit_badradius.dat',0 lightBadRGB db 'lit_badrgb.dat',0 lightBakeDump db 'lighting_bake.bin',0 lightFrameDump db 'lighting_frame.bin',0 lightSavedRed dd 0 lightSavedBlue dd 0 lightSavedPulse dd 0 .code RunLightingChecks PROC uses ebx ecx edx esi edi invoke LoadSublevelBinary,OFFSET lightFile,-1,-1,0 CHECK eax,1 ; v5 authored lighting loads in ASM CHECK authoredLightCount,2 ; all authored lights reach runtime slots CHECK lightingMode,2 ; map lighting mode loads without a startup override CHECK isFlashlightOn,0 ; saved flashlight toggle reaches the game CHECK DWORD PTR [lightSources+40+LightSource.color],00FF0000h ; static light color retained on load call Render3DScene invoke Dump,OFFSET lightFrameDump,OFFSET screenBuffer,FRAME_BUFFER_SIZE call BakeMapLighting invoke Dump,OFFSET lightBakeDump,OFFSET lightGridRGB,4096 CHECK DWORD PTR [lightGridRGB+(5*32+14)*4],000A0A0Ah ; static light cannot leak through a wall mov lightingMode,1 invoke SamplePointLighting,480,352,0,0 mov eax,lightRed mov lightSavedRed,eax mov eax,lightBlue mov lightSavedBlue,eax mov lightingMode,2 call UpdateDynamicLights invoke SamplePointLighting,480,352,0,0 CHECK lightRed,lightSavedRed ; dynamic mode does not count static light twice xor eax,eax mov ebx,lightBlue cmp ebx,lightSavedBlue seta al CHECK eax,1 ; realtime blue light contributes beyond the baked map mov DWORD PTR [lightSources+80+LightSource.x],928 invoke SamplePointLighting,480,352,0,0 CHECK lightBlue,10 ; dynamic source is occluded by a separating wall mov DWORD PTR [lightSources+80+LightSource.flags],LIGHT_FLAG_ACTIVE invoke SamplePointLighting,480,352,0,0 xor eax,eax cmp lightBlue,10 seta al CHECK eax,1 ; disabling dynamic shadows allows unoccluded contribution mov DWORD PTR [lightSources+80+LightSource.lightType],LIGHT_TYPE_PULSE mov lightingTick,0 call UpdateDynamicLights mov eax,DWORD PTR [lightSources+80+LightSource.curIntensity] mov lightSavedPulse,eax mov lightingTick,31 call UpdateDynamicLights mov eax,DWORD PTR [lightSources+80+LightSource.curIntensity] cmp eax,lightSavedPulse setne al movzx eax,al CHECK eax,1 ; pulse light changes intensity with the simulation clock mov DWORD PTR [lightSources+13*40+LightSource.intensity],77 invoke SpawnMuzzleFlashLight,160,160 invoke SpawnExplosionLight,160,160 CHECK DWORD PTR [lightSources+13*40+LightSource.intensity],77 ; combat bursts cannot overwrite authored light slots call UpdateDynamicLights CHECK DWORD PTR [lightSources+14*40+LightSource.curIntensity],180 ; muzzle light decays in its reserved slot call InitLightingSystem mov lightingMode,2 mov edi,OFFSET lightGridRGB mov ecx,1024 mov eax,000A0A0Ah rep stosd mov playerX,160 mov playerY,160 mov playerAngle,0 invoke SamplePointLighting,288,160,0,0 xor eax,eax cmp lightRed,10 seta al CHECK eax,1 ; flashlight illuminates points inside its forward cone invoke SamplePointLighting,160,288,0,0 CHECK lightRed,10 ; flashlight cannot illuminate sprites outside its cone mov BYTE PTR [gameMap+2*32+3],CELL_DOOR invoke SamplePointLighting,288,160,0,0 CHECK lightRed,10 ; a closed door blocks the player flashlight mov BYTE PTR [gameMap+2*32+3],CELL_DOOR_OPEN invoke CastLightRay,160,160,288,160 CHECK eax,1 ; an open door transmits dynamic light mov BYTE PTR [gameMap+5*32+6],CELL_BRICK invoke CastLightRay,352,352,416,416 CHECK eax,0 ; ASM light rays reject diagonal corner leaks invoke LoadSublevelBinary,OFFSET lightFile,-1,-1,0 invoke LoadSublevelBinary,OFFSET lightBadCount,-1,-1,0 CHECK eax,0 ; excessive lighting count rejected before committing a room CHECK authoredLightCount,2 ; malformed lighting preserves current authored lights invoke LoadSublevelBinary,OFFSET lightBadRadius,-1,-1,0 CHECK eax,0 ; zero radius rejected without a divide by zero invoke LoadSublevelBinary,OFFSET lightBadRGB,-1,-1,0 CHECK eax,0 ; malformed baked RGB cannot replace current lighting invoke LoadSublevelBinary,OFFSET mainPath,-1,-1,0 CHECK authoredLightCount,0 ; loading a legacy room clears stale dynamic sources CHECK lightingMode,0 ; legacy room restores classic lighting mode ret RunLightingChecks ENDP