#include "../pinball.h" //----- (0101304D) -------------------------------------------------------- void __stdcall render_repaint(struct render_sprite_type_struct *a1) { int *v1; // edi bool v2; // zf bool v3; // sf int v4; // esi int v5; // [esp+8h] [ebp-10h] int v6; // [esp+Ch] [ebp-Ch] int v7; // [esp+10h] [ebp-8h] int v8; // [esp+14h] [ebp-4h] struct render_sprite_type_struct *v9; // [esp+20h] [ebp+8h] v1 = (int *)a1; if ( *((_DWORD *)a1 + 17) ) { v2 = *((_DWORD *)a1 + 18) == 0; v3 = *((_DWORD *)a1 + 18) < 0; v9 = 0; if ( !v3 && !v2 ) { do { v4 = *(_DWORD *)(v1[17] + 4 * (_DWORD)v9); if ( !*(_BYTE *)(v4 + 24) && *(_DWORD *)(v4 + 16) ) { if ( rectangle_clip((int *)v4, v1 + 13, &v5) ) zdrv_paint( v7, v8, &vscreen, v5, v6, (int)&zscreen, v5, v6, *(_DWORD **)(v4 + 16), v5 - *(_DWORD *)v4, v6 - *(_DWORD *)(v4 + 4), *(_DWORD *)(v4 + 20), v5 + *(_DWORD *)(v4 + 44) - *(_DWORD *)v4, v6 + *(_DWORD *)(v4 + 48) - *(_DWORD *)(v4 + 4)); } v9 = (struct render_sprite_type_struct *)((char *)v9 + 1); } while ( (signed int)v9 < v1[18] ); } } } //----- (010130F3) -------------------------------------------------------- void __stdcall render_paint_balls() { int v0; // ecx int v1; // edi int i; // esi struct render_sprite_type_struct *v3; // edx struct render_sprite_type_struct **v4; // eax struct render_sprite_type_struct *v5; // ecx struct render_sprite_type_struct *v6; // edi int *v7; // esi int v8; // ebx int v9; // ST48_4 int v10; // [esp+Ch] [ebp-10h] struct render_sprite_type_struct **v11; // [esp+10h] [ebp-Ch] _DWORD *v12; // [esp+14h] [ebp-8h] v0 = render_many_balls; if ( render_many_balls > 1 ) { v1 = 0; if ( render_many_balls > 0 ) { do { for ( i = v1; i < v0 / 2; ++i ) { v3 = render_ball_list[i]; v4 = &render_ball_list[v1]; if ( *((_WORD *)*v4 + 13) > *((_WORD *)v3 + 13) ) { v5 = *v4; *v4 = v3; render_ball_list[i] = v5; v0 = render_many_balls; } } ++v1; } while ( v1 < v0 ); } } v10 = 0; v11 = render_ball_list; if ( v0 > 0 ) { v12 = &ball_bitmap; do { v6 = *v11; v7 = (int *)((char *)*v11 + 52); if ( *((_DWORD *)*v11 + 4) && rectangle_clip((int *)v6, (int *)&vscreen_rect, (_DWORD *)*v11 + 13) ) { v8 = *v7; v9 = v7[1]; gdrv_copy_bitmap(v12, v7[2], v7[3], 0, 0, &vscreen, *v7, v9); zdrv_paint_flat( v7[2], v7[3], &vscreen, v8, v9, (int)&zscreen, v8, v9, *((_DWORD **)v6 + 4), v8 - *(_DWORD *)v6, v9 - *((_DWORD *)v6 + 1), *((_WORD *)v6 + 13)); } else { v7[2] = -1; } ++v10; v12 = (_DWORD *)((char *)v12 + 37); ++v11; } while ( v10 < render_many_balls ); } } // 102506C: using guessed type struct render_sprite_type_struct **render_ball_list; // 1025070: using guessed type int render_many_balls; //----- (0101320D) -------------------------------------------------------- void __stdcall render_unpaint_balls() { _DWORD *v0; // ebx struct render_sprite_type_struct *v1; // edi _DWORD *v2; // esi int v3; // eax _DWORD *v4; // edi _DWORD *v5; // esi bool v6; // zf int v7; // [esp+0h] [ebp-8h] struct render_sprite_type_struct **v8; // [esp+4h] [ebp-4h] v8 = &render_ball_list[render_many_balls - 1]; if ( render_many_balls - 1 >= 0 ) { v0 = (_DWORD *)((char *)&ball_bitmap + 37 * (render_many_balls - 1)); v7 = render_many_balls; do { v1 = *v8; v2 = (_DWORD *)((char *)*v8 + 52); v3 = *((_DWORD *)*v8 + 15); if ( v3 > 0 ) gdrv_copy_bitmap(&vscreen, v3, *((_DWORD *)*v8 + 16), *((_DWORD *)*v8 + 13), *((_DWORD *)*v8 + 14), v0, 0, 0); --v8; v4 = (_DWORD *)((char *)v1 + 28); *v4 = *v2; v5 = v2 + 1; ++v4; *v4 = *v5; ++v5; ++v4; *v4 = *v5; v0 = (_DWORD *)((char *)v0 - 37); v6 = v7-- == 1; v4[1] = v5[1]; } while ( !v6 ); } } // 102506C: using guessed type struct render_sprite_type_struct **render_ball_list; // 1025070: using guessed type int render_many_balls; //----- (01013283) -------------------------------------------------------- int __stdcall render_remove_sprite(struct render_sprite_type_struct *a1) { int v1; // eax int v2; // ecx v1 = render_many_sprites; v2 = 0; if ( render_many_sprites <= 0 ) return 0; while ( render_sprite_list[v2] != a1 ) { if ( ++v2 >= render_many_sprites ) return 0; } while ( v2 < v1 ) { render_sprite_list[v2] = render_sprite_list[v2 + 1]; v1 = render_many_sprites; ++v2; } render_many_sprites = v1 - 1; if ( *((_DWORD *)a1 + 17) ) memoryfree(*((_DWORD *)a1 + 17)); memoryfree((int)a1); return 1; } // 1025084: using guessed type struct render_sprite_type_struct **render_sprite_list; // 10250B4: using guessed type int render_many_sprites; //----- (010132E8) -------------------------------------------------------- int __stdcall render_remove_ball(struct render_sprite_type_struct *a1) { int v1; // eax int v2; // ecx v1 = render_many_balls; v2 = 0; if ( render_many_balls <= 0 ) return 0; while ( render_ball_list[v2] != a1 ) { if ( ++v2 >= render_many_balls ) return 0; } while ( v2 < v1 ) { render_ball_list[v2] = render_ball_list[v2 + 1]; v1 = render_many_balls; ++v2; } render_many_balls = v1 - 1; memoryfree((int)a1); return 1; } // 102506C: using guessed type struct render_sprite_type_struct **render_ball_list; // 1025070: using guessed type int render_many_balls; //----- (010133C7) -------------------------------------------------------- void __stdcall render_update() { int i; // eax int *v1; // esi int *v2; // edi struct render_sprite_type_struct **v3; // esi int v4; // edi struct render_sprite_type_struct *v5; // eax struct render_sprite_type_struct *v6; // edi int *v7; // esi int v8; // edx struct render_sprite_type_struct *v9; // eax int *v10; // edi bool v11; // zf int *v12; // esi int *v13; // edi int *v14; // esi int v15; // eax unsigned int v16; // ecx int v17; // edi int v18; // esi int v19; // edx int v20; // edx int xSrc; // [esp+Ch] [ebp-24h] int v22; // [esp+10h] [ebp-20h] int v23; // [esp+14h] [ebp-1Ch] int v24; // [esp+18h] [ebp-18h] struct render_sprite_type_struct *v25; // [esp+1Ch] [ebp-14h] int v26; // [esp+20h] [ebp-10h] int v27; // [esp+24h] [ebp-Ch] int v28; // [esp+28h] [ebp-8h] struct render_sprite_type_struct **j; // [esp+2Ch] [ebp-4h] v28 = 0; j = render_dirty_list; for ( i = render_many_dirty; v28 < render_many_dirty; ++j ) { v1 = (int *)*j; if ( *((_BYTE *)*j + 25) ) { if ( *((_BYTE *)*j + 25) == 1 ) { if ( v1[9] > 0 ) enclosing_box(v1 + 7, v1, v1 + 13); v2 = v1 + 13; if ( rectangle_clip(v1 + 13, (int *)&vscreen_rect, v1 + 13) ) { LABEL_29: v15 = v1[14]; v16 = v1[15]; v17 = *v2; v18 = v1[16]; v27 = v15; v26 = v16; zdrv_fill((int)&vscreen, (int)&zscreen, v16, v18, v17, v15, 0xFFFF); if ( render_background_bitmap ) gdrv_copy_bitmap(&vscreen, v26, v18, v17, v27, (_DWORD *)render_background_bitmap, v17, v27); else gdrv_fill_bitmap((int)&vscreen, &vscreen, v26, v18, v17, v27, 0); goto LABEL_8; } LABEL_7: v1[15] = -1; goto LABEL_8; } } else { v2 = v1 + 13; if ( !rectangle_clip(v1, (int *)&vscreen_rect, v1 + 13) ) goto LABEL_7; if ( !v1[4] ) goto LABEL_29; } LABEL_8: ++v28; i = render_many_dirty; } v3 = render_dirty_list; v4 = 0; if ( i > 0 ) { do { v5 = *v3; if ( *((_DWORD *)*v3 + 15) > 0 && (!*((_BYTE *)v5 + 25) || *((_BYTE *)v5 + 25) == 1) ) render_repaint(*v3); ++v4; ++v3; } while ( v4 < render_many_dirty ); } render_paint_balls(); if ( render_blit ) { gdrv_start_blit_sequence(); v27 = xDest + render_offset_x; v26 = yDest + render_offset_y; v28 = 0; for ( j = render_dirty_list; v28 < render_many_dirty; ++j ) { v6 = *j; v7 = (int *)((char *)*j + 52); v8 = *((_DWORD *)*j + 15); v25 = *j; if ( v8 > 0 ) gdrv_blit_sequence((int)&vscreen, *v7, v7[1], *v7 + v27, v7[1] + v26, v8, v7[3]); v9 = v25; v10 = (int *)((char *)v6 + 28); v11 = *((_BYTE *)v25 + 24) == 0; *v10 = *v7; v12 = v7 + 1; ++v10; *v10 = *v12; ++v12; ++v10; *v10 = *v12; v10[1] = v12[1]; if ( !v11 ) render_remove_sprite(v9); ++v28; } v28 = 0; for ( j = render_ball_list; v28 < render_many_balls; ++j ) { v13 = (int *)((char *)*j + 28); v14 = (int *)((char *)*j + 52); if ( overlapping_box((struct rectangle_type *)v14, (struct rectangle_type *)v13, (struct rectangle_type *)&xSrc) && *((_DWORD *)*j + 15) > 0 ) { if ( v23 > 0 ) gdrv_blit_sequence((int)&vscreen, xSrc, v22, xSrc + v27, v22 + v26, v23, v24); } else { v19 = v14[2]; if ( v19 > 0 ) gdrv_blit_sequence((int)&vscreen, *v14, v14[1], *v14 + v27, v14[1] + v26, v19, v14[3]); v20 = v13[2]; if ( v20 > 0 ) gdrv_blit_sequence((int)&vscreen, *v13, v13[1], *v13 + v27, v13[1] + v26, v20, v13[3]); } ++v28; } gdrv_end_blit_sequence(); } render_many_dirty = 0; render_unpaint_balls(); } // 1024754: using guessed type int render_blit; // 1025068: using guessed type struct render_sprite_type_struct **render_dirty_list; // 102506C: using guessed type struct render_sprite_type_struct **render_ball_list; // 1025070: using guessed type int render_many_balls; // 10250C0: using guessed type int render_many_dirty; // 10253AC: using guessed type int render_offset_x; // 10253B0: using guessed type int render_offset_y; //----- (01013670) -------------------------------------------------------- void __stdcall render_uninit() { int i; // esi int j; // esi gdrv_destroy_bitmap((int)&vscreen); zdrv_destroy_zmap(&zscreen); for ( i = 0; i < render_many_sprites; ++i ) render_remove_sprite(render_sprite_list[i]); for ( j = 0; j < render_many_balls; ++j ) render_remove_ball(render_ball_list[j]); memoryfree((int)render_ball_list); memoryfree((int)render_dirty_list); memoryfree((int)render_sprite_list); render_many_sprites = 0; render_many_dirty = 0; render_many_balls = 0; } // 1025068: using guessed type struct render_sprite_type_struct **render_dirty_list; // 102506C: using guessed type struct render_sprite_type_struct **render_ball_list; // 1025070: using guessed type int render_many_balls; // 1025084: using guessed type struct render_sprite_type_struct **render_sprite_list; // 10250B4: using guessed type int render_many_sprites; // 10250C0: using guessed type int render_many_dirty; //----- (01013705) -------------------------------------------------------- char *__stdcall render_init(_DWORD *a1, float a2, float a3, int a4, int a5) { int v5; // edi char *result; // eax char *v7; // [esp+18h] [ebp+18h] ++memory_critical_allocation; render_zscaler = a3; render_zmin = a2; render_zmax = 4294967300.0 / a3 + a2; render_sprite_list = (struct render_sprite_type_struct **)memoryallocate(0xFA0u); render_dirty_list = (struct render_sprite_type_struct **)memoryallocate(0xFA0u); render_ball_list = (struct render_sprite_type_struct **)memoryallocate(0x50u); gdrv_create_bitmap((int)&vscreen, a4, a5); zdrv_create_zmap((int)&zscreen, a4, a5); zdrv_fill((int)&vscreen, (int)&zscreen, zscreen, word_102505A, 0, 0, 0xFFFF); v5 = a5; dword_1025078 = 0; vscreen_rect = 0; dword_102507C = a4; dword_1025080 = a5; yDest = 0; xDest = 0; v7 = (char *)&ball_bitmap; do { gdrv_create_raw_bitmap((int)v7, 64, 64, 1); v7 += 37; } while ( (signed int)v7 < (signed int)&render_offset_x ); render_background_bitmap = (int)a1; if ( a1 ) result = gdrv_copy_bitmap(&vscreen, a4, v5, 0, 0, a1, 0, 0); else result = (char *)gdrv_fill_bitmap((int)&vscreen, &vscreen, dword_1025094, dword_1025098, 0, 0, 0); --memory_critical_allocation; return result; } // 1024F04: using guessed type int memory_critical_allocation; // 102505A: using guessed type __int16 word_102505A; // 1025068: using guessed type struct render_sprite_type_struct **render_dirty_list; // 102506C: using guessed type struct render_sprite_type_struct **render_ball_list; // 1025078: using guessed type int dword_1025078; // 102507C: using guessed type int dword_102507C; // 1025080: using guessed type int dword_1025080; // 1025084: using guessed type struct render_sprite_type_struct **render_sprite_list; // 1025094: using guessed type int dword_1025094; // 1025098: using guessed type int dword_1025098; // 10250B0: using guessed type float render_zscaler; // 10250B8: using guessed type float render_zmax; // 10250BC: using guessed type float render_zmin; // 10253AC: using guessed type int render_offset_x; //----- (0101382A) -------------------------------------------------------- int __stdcall render_sprite_modified(int a1) { int result; // eax if ( *(_BYTE *)(a1 + 25) != 2 ) { result = render_many_dirty; if ( render_many_dirty < 999 ) render_dirty_list[render_many_dirty++] = (struct render_sprite_type_struct *)a1; } return result; } // 1025068: using guessed type struct render_sprite_type_struct **render_dirty_list; // 10250C0: using guessed type int render_many_dirty; //----- (0101385C) -------------------------------------------------------- int __stdcall render_create_sprite(int a1, int a2, int a3, int a4, int a5, _DWORD *a6) { int v6; // ebx int result; // eax v6 = memoryallocate(0x5Cu); result = 0; if ( v6 ) { *(_DWORD *)(v6 + 4) = a5; *(_DWORD *)(v6 + 16) = a2; *(_DWORD *)v6 = a4; *(_BYTE *)(v6 + 25) = a1; *(_BYTE *)(v6 + 24) = 0; *(_DWORD *)(v6 + 68) = 0; *(_DWORD *)(v6 + 72) = 0; if ( a6 ) { *(_DWORD *)(v6 + 76) = *a6; *(_DWORD *)(v6 + 80) = a6[1]; *(_DWORD *)(v6 + 84) = a6[2]; *(_DWORD *)(v6 + 88) = a6[3]; } else { *(_DWORD *)(v6 + 84) = -1; *(_DWORD *)(v6 + 88) = -1; *(_DWORD *)(v6 + 76) = 0; *(_DWORD *)(v6 + 80) = 0; } if ( a2 ) { *(_DWORD *)(v6 + 8) = *(_DWORD *)(a2 + 12); *(_DWORD *)(v6 + 12) = *(_DWORD *)(a2 + 16); } else { *(_DWORD *)(v6 + 8) = 0; *(_DWORD *)(v6 + 12) = 0; } *(_DWORD *)(v6 + 20) = a3; *(_DWORD *)(v6 + 48) = 0; *(_DWORD *)(v6 + 44) = 0; if ( !a3 && a1 != 2 ) { *(_DWORD *)(v6 + 20) = render_background_zmap; *(_DWORD *)(v6 + 44) = a4 - render_zmap_offset; *(_DWORD *)(v6 + 48) = a5 - dword_10253C0; } *(_DWORD *)(v6 + 28) = *(_DWORD *)v6; *(_DWORD *)(v6 + 32) = *(_DWORD *)(v6 + 4); *(_DWORD *)(v6 + 36) = *(_DWORD *)(v6 + 8); *(_DWORD *)(v6 + 40) = *(_DWORD *)(v6 + 12); if ( a1 == 2 ) { render_ball_list[render_many_balls++] = (struct render_sprite_type_struct *)v6; } else { render_sprite_list[render_many_sprites++] = (struct render_sprite_type_struct *)v6; render_sprite_modified(v6); } result = v6; } return result; } // 102506C: using guessed type struct render_sprite_type_struct **render_ball_list; // 1025070: using guessed type int render_many_balls; // 1025084: using guessed type struct render_sprite_type_struct **render_sprite_list; // 10250B4: using guessed type int render_many_sprites; // 10253B8: using guessed type struct zmap_header_type *render_background_zmap; // 10253C0: using guessed type int dword_10253C0; //----- (0101394E) -------------------------------------------------------- int __stdcall render_set_background_zmap(struct zmap_header_type *a1, int a2, int a3) { int result; // eax render_background_zmap = a1; render_zmap_offset = a2; result = a3; dword_10253C0 = a3; return result; } // 10253B8: using guessed type struct zmap_header_type *render_background_zmap; // 10253C0: using guessed type int dword_10253C0; //----- (01013974) -------------------------------------------------------- int __stdcall render_sprite_set(_DWORD *a1, int a2, int a3, int a4, int a5) { int result; // eax result = (int)a1; if ( a1 ) { *a1 = a4; a1[1] = a5; a1[4] = a2; if ( a2 ) { a1[2] = *(_DWORD *)(a2 + 12); a1[3] = *(_DWORD *)(a2 + 16); } a1[5] = a3; result = render_sprite_modified((int)a1); } return result; } //----- (010139B6) -------------------------------------------------------- void __stdcall render_sprite_set_bitmap(_DWORD *a1, int a2) { if ( a1 && a1[4] != a2 ) { a1[4] = a2; if ( a2 ) { a1[2] = *(_DWORD *)(a2 + 12); a1[3] = *(_DWORD *)(a2 + 16); } render_sprite_modified((int)a1); } } //----- (010139EC) -------------------------------------------------------- void __stdcall render_ball_set(int a1, int a2, float a3, int a4, int a5) { double v5; // st7 if ( a1 ) { *(_DWORD *)(a1 + 16) = a2; if ( a2 ) { *(_DWORD *)a1 = a4; *(_DWORD *)(a1 + 4) = a5; *(_DWORD *)(a1 + 8) = *(_DWORD *)(a2 + 12); *(_DWORD *)(a1 + 12) = *(_DWORD *)(a2 + 16); } if ( a3 >= (double)render_zmin ) { v5 = (a3 - render_zmin) * render_zscaler; if ( v5 <= render_zmax ) *(_WORD *)(a1 + 26) = (signed __int64)v5; else *(_WORD *)(a1 + 26) = -1; } else { *(_WORD *)(a1 + 26) = 0; } } } // 10250B0: using guessed type float render_zscaler; // 10250B8: using guessed type float render_zmax; // 10250BC: using guessed type float render_zmin; //----- (01013A6A) -------------------------------------------------------- void __stdcall render_paint() { render_paint_balls(); gdrv_blat((int)&vscreen, xDest, yDest); render_unpaint_balls(); } //----- (01013A8F) -------------------------------------------------------- void __stdcall render_shift(int a1, int a2, int xSrc, int a4, int DestWidth, int DestHeight) { render_offset_x += a1; render_offset_y += a2; render_paint_balls(); gdrv_blit( (int)&vscreen, xSrc, a4, xSrc + render_offset_x + xDest, a4 + render_offset_y + yDest, DestWidth, DestHeight); render_unpaint_balls(); } // 10253AC: using guessed type int render_offset_x; // 10253B0: using guessed type int render_offset_y;