; Quality changes only roof rendering. Simulation, collisions and other games stay native. UpdateRoofQuality3D PROC uses ebx esi edi cmp hallLevel3D,HALL_ROOF jne roof_quality_apply cmp engineMode,MODE_WALK jne roof_quality_apply mov eax,animationClock3D cmp eax,roofQualityClock3D je roof_quality_apply mov roofQualityClock3D,eax invoke Pressed3D,77h test eax,eax jz roof_quality_auto inc roofQualityMode3D cmp roofQualityMode3D,3 jb @F mov roofQualityMode3D,0 mov roofAutoWidth3D,960 @@: mov roofQualityToast3D,1800 mov roofQualitySlow3D,0 roof_quality_auto: mov eax,deltaTime3D cmp eax,100 jbe @F mov eax,100 @@: sub roofQualityToast3D,eax jns @F mov roofQualityToast3D,0 @@: cmp roofQualityMode3D,0 jne roof_quality_apply cmp roofAutoWidth3D,640 je roof_quality_apply cmp deltaTime3D,34 jbe roof_quality_cool add roofQualitySlow3D,eax cmp roofQualitySlow3D,1000 jb roof_quality_apply mov roofAutoWidth3D,640 mov roofQualitySlow3D,0 mov roofQualityToast3D,1800 jmp roof_quality_apply roof_quality_cool: sub roofQualitySlow3D,8 jns roof_quality_apply mov roofQualitySlow3D,0 roof_quality_apply: mov eax,roofAutoWidth3D cmp roofQualityMode3D,0 je roof_quality_size mov eax,640 cmp roofQualityMode3D,1 je roof_quality_size mov eax,1280 roof_quality_size: mov roofRenderW3D,eax imul eax,3 shr eax,2 mov roofRenderH3D,eax mov eax,roofRenderW3D cmp eax,roofQualityMapW3D je roof_quality_done mov roofQualityMapW3D,eax mov roofHDRenderClock3D,-1 xor esi,esi roof_quality_x: mov eax,esi imul eax,roofRenderW3D xor edx,edx mov ecx,SCREEN_W div ecx mov ebx,eax shl eax,2 mov roofQualityX3D[esi*4],eax mov eax,esi inc eax imul eax,roofRenderW3D xor edx,edx div ecx sub eax,ebx mov roofQualityXCount3D[esi*4],eax inc esi cmp esi,SCREEN_W jb roof_quality_x xor esi,esi roof_quality_y: mov eax,esi imul eax,roofRenderH3D xor edx,edx mov ecx,SCREEN_H div ecx mov ebx,eax mov edi,ROOF_HD_H-1 sub edi,eax imul edi,ROOF_HD_W*4 mov roofQualityY3D[esi*4],edi mov eax,esi inc eax imul eax,roofRenderH3D xor edx,edx div ecx sub eax,ebx mov roofQualityYCount3D[esi*4],eax inc esi cmp esi,SCREEN_H jb roof_quality_y cmp roofHDReady3D,1 jne roof_quality_done call WriteRoofRendererInfo3D roof_quality_done: ret UpdateRoofQuality3D ENDP ComposeRoofFrame3D PROC uses ebx esi edi local rows:DWORD,y:DWORD,x:DWORD,targetRow:DWORD,repeatRow:DWORD invoke GdiFlush mov esi,roofHDBuffer3D mov eax,ROOF_HD_H sub eax,roofRenderH3D imul eax,ROOF_HD_W*4 add eax,roofHDFinalPixels3D mov edi,eax mov eax,roofRenderH3D mov rows,eax roof_compose_background: mov ecx,roofRenderW3D rep movsd mov eax,ROOF_HD_W sub eax,roofRenderW3D lea edi,[edi+eax*4] dec rows jnz roof_compose_background xor esi,esi mov y,0 roof_compose_row: mov ebx,y mov eax,roofQualityY3D[ebx*4] add eax,roofHDFinalPixels3D mov targetRow,eax mov eax,roofQualityYCount3D[ebx*4] mov repeatRow,eax mov x,0 roof_compose_pixel: mov eax,screenBuffer[esi*4] cmp roofCityMask3D[esi],0 je roof_compose_opaque cmp eax,roofHDBackdrop3D[esi*4] je roof_compose_next roof_compose_opaque: mov ebx,x mov edi,roofQualityX3D[ebx*4] add edi,targetRow mov [edi],eax cmp roofQualityXCount3D[ebx*4],2 jne @F mov [edi+4],eax @@: cmp repeatRow,2 jne roof_compose_next mov [edi-ROOF_HD_W*4],eax cmp roofQualityXCount3D[ebx*4],2 jne roof_compose_next mov [edi-ROOF_HD_W*4+4],eax roof_compose_next: inc esi inc x cmp x,SCREEN_W jb roof_compose_pixel inc y cmp y,SCREEN_H jb roof_compose_row ret ComposeRoofFrame3D ENDP RenderRoofQualityToast3D PROC cmp roofQualityToast3D,0 je roof_quality_toast_done mov eax,OFFSET roofQualityAutoText3D cmp roofRenderW3D,640 jne @F mov eax,OFFSET roofQualityEcoText3D @@: cmp roofQualityMode3D,2 jne @F mov eax,OFFSET roofQualityHighText3D @@: push eax invoke DrawBox,12,40,160,18,00151B1Eh pop eax invoke DrawString8x8,20,45,eax,00E8D7ADh roof_quality_toast_done: ret RenderRoofQualityToast3D ENDP WriteRoofLogString3D PROC uses ebx esi handle:DWORD,value:DWORD local written:DWORD mov ebx,handle mov esi,value test esi,esi jnz @F mov esi,OFFSET roofLogUnknown3D @@: xor ecx,ecx roof_log_length: cmp BYTE PTR [esi+ecx],0 je roof_log_write inc ecx jmp roof_log_length roof_log_write: invoke WriteFile,ebx,esi,ecx,ADDR written,0 ret WriteRoofLogString3D ENDP WriteRoofRendererInfo3D PROC uses ebx esi invoke CreateDirectoryA,OFFSET runtime3D,0 invoke CreateFileA,OFFSET roofLogPath3D,40000000h,1,0,2,80h,0 cmp eax,-1 je roof_log_done mov ebx,eax invoke WriteRoofLogString3D,ebx,OFFSET roofLogHeader3D mov esi,0 roof_log_gl_string: mov eax,OFFSET roofLogVendor3D cmp esi,0 je @F mov eax,OFFSET roofLogRenderer3D cmp esi,1 je @F mov eax,OFFSET roofLogVersion3D @@: invoke WriteRoofLogString3D,ebx,eax xor eax,eax cmp roofHDRC3D,0 je @F mov eax,esi add eax,1F00h invoke glGetString,eax @@: invoke WriteRoofLogString3D,ebx,eax invoke WriteRoofLogString3D,ebx,OFFSET roofLogNL3D inc esi cmp esi,3 jb roof_log_gl_string invoke WriteRoofLogString3D,ebx,OFFSET roofLogStage3D mov eax,roofHDStage3D add al,'0' mov roofLogDigit3D,al invoke WriteRoofLogString3D,ebx,OFFSET roofLogDigit3D invoke WriteRoofLogString3D,ebx,OFFSET roofLogNL3D invoke WriteRoofLogString3D,ebx,OFFSET roofLogAssets3D mov roofLogDigit3D,'0' cmp roofCityArt3D.pixels,0 je @F mov roofLogDigit3D,'1' @@: invoke WriteRoofLogString3D,ebx,OFFSET roofLogDigit3D invoke WriteRoofLogString3D,ebx,OFFSET roofLogNL3D invoke WriteRoofLogString3D,ebx,OFFSET roofLogWidth3D mov eax,OFFSET roofLogMedium3D cmp roofRenderW3D,960 je @F mov eax,OFFSET roofLogSmall3D cmp roofRenderW3D,640 je @F mov eax,OFFSET roofLogLarge3D @@: invoke WriteRoofLogString3D,ebx,eax invoke WriteRoofLogString3D,ebx,OFFSET roofLogNL3D invoke CloseHandle,ebx roof_log_done: ret WriteRoofRendererInfo3D ENDP