Split up attached ps's. Change field names.

This commit is contained in:
duncanspumpkin 2016-04-27 19:44:56 +01:00
parent 68bad6505c
commit d6a4ae9aff
2 changed files with 66 additions and 101 deletions

View File

@ -714,10 +714,10 @@ void painter_setup(){
* rct2: 0x00688596 * rct2: 0x00688596
* Part of 0x688485 * Part of 0x688485
*/ */
void paint_attached_ps(paint_struct* ps, paint_struct* attached_ps, rct_drawpixelinfo* dpi){ void paint_attached_ps(paint_struct* ps, attached_paint_struct* attached_ps, rct_drawpixelinfo* dpi){
for (; attached_ps; attached_ps = attached_ps->next_attached_ps){ for (; attached_ps; attached_ps = attached_ps->next){
sint16 x = attached_ps->attached_x + ps->x; sint16 x = attached_ps->x + ps->x;
sint16 y = attached_ps->attached_y + ps->y; sint16 y = attached_ps->y + ps->y;
int image_id = attached_ps->image_id; int image_id = attached_ps->image_id;
if (gCurrentViewportFlags & VIEWPORT_FLAG_SEETHROUGH_RIDES) { if (gCurrentViewportFlags & VIEWPORT_FLAG_SEETHROUGH_RIDES) {
@ -905,8 +905,7 @@ bool sub_98197C(
sint16 bound_box_offset_x, sint16 bound_box_offset_y, sint16 bound_box_offset_z, sint16 bound_box_offset_x, sint16 bound_box_offset_y, sint16 bound_box_offset_z,
uint32 rotation uint32 rotation
) { ) {
int ebp = bound_box_length_z + bound_box_offset_z;
RCT2_GLOBAL(0xF1AD28, paint_struct*) = 0; RCT2_GLOBAL(0xF1AD28, paint_struct*) = 0;
RCT2_GLOBAL(0xF1AD2C, uint32) = 0; RCT2_GLOBAL(0xF1AD2C, uint32) = 0;
@ -998,13 +997,14 @@ bool sub_98197C(
break; break;
} }
ps->attached_x_end = boundBox.x + boundBoxOffset.x + RCT2_GLOBAL(0x9DE568, sint16); ps->bound_box_x_end = boundBox.x + boundBoxOffset.x + RCT2_GLOBAL(0x9DE568, sint16);
ps->attached_z = bound_box_offset_z; ps->bound_box_z = bound_box_offset_z;
ps->attached_z_end = ebp; int boundBoxZEnd = bound_box_length_z + bound_box_offset_z;
ps->attached_y_end = boundBox.y + boundBoxOffset.y + RCT2_GLOBAL(0x009DE56C, sint16); ps->bound_box_z_end = boundBoxZEnd;
ps->bound_box_y_end = boundBox.y + boundBoxOffset.y + RCT2_GLOBAL(0x009DE56C, sint16);
ps->var_1A = 0; ps->var_1A = 0;
ps->attached_x = boundBoxOffset.x + RCT2_GLOBAL(0x9DE568, sint16); ps->bound_box_x = boundBoxOffset.x + RCT2_GLOBAL(0x9DE568, sint16);
ps->attached_y = boundBoxOffset.y + RCT2_GLOBAL(0x009DE56C, sint16); ps->bound_box_y = boundBoxOffset.y + RCT2_GLOBAL(0x009DE56C, sint16);
ps->attached_ps = NULL; ps->attached_ps = NULL;
ps->var_20 = NULL; ps->var_20 = NULL;
ps->sprite_type = RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8); ps->sprite_type = RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8);
@ -1016,8 +1016,8 @@ bool sub_98197C(
RCT2_GLOBAL(0xF1AD28, paint_struct*) = ps; RCT2_GLOBAL(0xF1AD28, paint_struct*) = ps;
rct_xy16 attach = { rct_xy16 attach = {
.x = ps->attached_x, .x = ps->bound_box_x,
.y = ps->attached_y .y = ps->bound_box_y
}; };
rotate_map_coordinates(&attach.x, &attach.y, rotation); rotate_map_coordinates(&attach.x, &attach.y, rotation);
@ -1055,7 +1055,7 @@ bool sub_98197C(
RCT2_GLOBAL(0x00F1AD10, uint32) = di; RCT2_GLOBAL(0x00F1AD10, uint32) = di;
} }
RCT2_GLOBAL(0xEE7888, paint_struct*) += 1; RCT2_GLOBAL(0xEE7888, paint_struct*)++;
return true; return true;
} }
@ -1295,51 +1295,6 @@ bool sub_98198C(
return !(flags & (1 << 8)); return !(flags & (1 << 8));
} }
/**
* rct2: 68818E
*
* @param image_id (ebx)
* @param x (ax)
* @param y (cx)
* @param[out] paint (ebp)
* @return (!CF) success
*/
bool sub_68818E(uint32 image_id, uint16 x, uint16 y, paint_struct ** paint)
{
//Not a paint struct but something similar
paint_struct * ps = RCT2_GLOBAL(0xEE7888, paint_struct *);
if ((uint32) ps >= RCT2_GLOBAL(0xEE7880, uint32)) {
return false;
}
ps->image_id = image_id;
ps->attached_x = x;
ps->attached_y = y;
ps->var_0C = 0;
paint_struct * ebx2 = RCT2_GLOBAL(0xF1AD28, paint_struct *);
if (ebx2 == NULL) {
return false;
}
RCT2_GLOBAL(0x00EE7888, uint32) += 0x12;
paint_struct * edi = ebx2->attached_ps;
ebx2->attached_ps = ps;
ps->next_attached_ps = edi;
RCT2_GLOBAL(0xF1AD2C, paint_struct *) = ps;
if (paint != NULL) {
*paint = ps;
}
return true;
}
/** /**
* *
* rct2: 0x006D4244 * rct2: 0x006D4244
@ -2405,12 +2360,24 @@ void sub_688217_helper(uint16 ax, uint8 flag)
ps_next->var_1B &= ~(1 << 0); ps_next->var_1B &= ~(1 << 0);
ps_temp = ps; ps_temp = ps;
uint16 my_attached_x = ps_next->attached_x; typedef struct bound_box {
uint16 my_attached_y = ps_next->attached_y; uint16 x;
uint16 my_some_x = ps_next->attached_z; uint16 y;
uint16 my_some_y = ps_next->attached_z_end; uint16 z;
uint16 my_other_x = ps_next->attached_x_end; uint16 x_end;
uint16 my_other_y = ps_next->attached_y_end; uint16 y_end;
uint16 z_end;
} bound_box;
bound_box initialBBox = {
.x = ps_next->bound_box_x,
.y = ps_next->bound_box_y,
.z = ps_next->bound_box_z,
.x_end = ps_next->bound_box_x_end,
.y_end = ps_next->bound_box_y_end,
.z_end = ps_next->bound_box_z_end
};
while (true) { while (true) {
ps = ps_next; ps = ps_next;
@ -2422,23 +2389,23 @@ void sub_688217_helper(uint16 ax, uint8 flag)
int yes = 0; int yes = 0;
switch (rotation) { switch (rotation) {
case 0: case 0:
if (my_some_y >= ps_next->attached_z && my_other_y >= ps_next->attached_y && my_other_x >= ps_next->attached_x if (initialBBox.z_end >= ps_next->bound_box_z && initialBBox.y_end >= ps_next->bound_box_y && initialBBox.x_end >= ps_next->bound_box_x
&& !(my_some_x < ps_next->attached_z_end && my_attached_y < ps_next->attached_y_end && my_attached_x < ps_next->attached_x_end)) && !(initialBBox.z < ps_next->bound_box_z_end && initialBBox.y < ps_next->bound_box_y_end && initialBBox.x < ps_next->bound_box_x_end))
yes = 1; yes = 1;
break; break;
case 1: case 1:
if (my_some_y >= ps_next->attached_z && my_other_y >= ps_next->attached_y && my_other_x < ps_next->attached_x if (initialBBox.z_end >= ps_next->bound_box_z && initialBBox.y_end >= ps_next->bound_box_y && initialBBox.x_end < ps_next->bound_box_x
&& !(my_some_x < ps_next->attached_z_end && my_attached_y < ps_next->attached_y_end && my_attached_x >= ps_next->attached_x_end)) && !(initialBBox.z < ps_next->bound_box_z_end && initialBBox.y < ps_next->bound_box_y_end && initialBBox.x >= ps_next->bound_box_x_end))
yes = 1; yes = 1;
break; break;
case 2: case 2:
if (my_some_y >= ps_next->attached_z && my_other_y < ps_next->attached_y && my_other_x < ps_next->attached_x if (initialBBox.z_end >= ps_next->bound_box_z && initialBBox.y_end < ps_next->bound_box_y && initialBBox.x_end < ps_next->bound_box_x
&& !(my_some_x < ps_next->attached_z_end && my_attached_y >= ps_next->attached_y_end && my_attached_x >= ps_next->attached_x_end)) && !(initialBBox.z < ps_next->bound_box_z_end && initialBBox.y >= ps_next->bound_box_y_end && initialBBox.x >= ps_next->bound_box_x_end))
yes = 1; yes = 1;
break; break;
case 3: case 3:
if (my_some_y >= ps_next->attached_z && my_other_y < ps_next->attached_y && my_other_x >= ps_next->attached_x if (initialBBox.z_end >= ps_next->bound_box_z && initialBBox.y_end < ps_next->bound_box_y && initialBBox.x_end >= ps_next->bound_box_x
&& !(my_some_x < ps_next->attached_z_end && my_attached_y >= ps_next->attached_y_end && my_attached_x < ps_next->attached_x_end)) && !(initialBBox.z < ps_next->bound_box_z_end && initialBBox.y >= ps_next->bound_box_y_end && initialBBox.x < ps_next->bound_box_x_end))
yes = 1; yes = 1;
break; break;
} }
@ -2464,7 +2431,7 @@ void sub_688217()
{ {
paint_struct *ps = RCT2_GLOBAL(0x00EE7888, paint_struct*); paint_struct *ps = RCT2_GLOBAL(0x00EE7888, paint_struct*);
paint_struct *ps_next; paint_struct *ps_next;
RCT2_GLOBAL(0x00EE7888, uint32) += 0x34; // 0x34 is size of paint_struct? RCT2_GLOBAL(0x00EE7888, paint_struct*)++;
RCT2_GLOBAL(0x00EE7884, paint_struct*) = ps; RCT2_GLOBAL(0x00EE7884, paint_struct*) = ps;
ps->next_quadrant_ps = NULL; ps->next_quadrant_ps = NULL;
uint32 edi = RCT2_GLOBAL(0x00F1AD0C, uint32); uint32 edi = RCT2_GLOBAL(0x00F1AD0C, uint32);
@ -3214,7 +3181,8 @@ void sub_679023(rct_drawpixelinfo *dpi, int imageId, int x, int y)
void sub_68862C() void sub_68862C()
{ {
rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*); rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*);
paint_struct *ps = RCT2_GLOBAL(0x00EE7884, paint_struct*), *old_ps, *next_ps, *attached_ps; paint_struct *ps = RCT2_GLOBAL(0x00EE7884, paint_struct*), *old_ps, *next_ps;
attached_paint_struct* attached_ps;
while ((ps = ps->next_quadrant_ps) != NULL) { while ((ps = ps->next_quadrant_ps) != NULL) {
old_ps = ps; old_ps = ps;
@ -3228,17 +3196,14 @@ void sub_68862C()
next_ps = ps->var_20; next_ps = ps->var_20;
} }
attached_ps = ps->attached_ps; for (attached_ps = ps->attached_ps; attached_ps != NULL; attached_ps = attached_ps->next) {
while (attached_ps != NULL) {
sub_679023( sub_679023(
dpi, dpi,
attached_ps->image_id, attached_ps->image_id,
(attached_ps->attached_x + ps->x) & 0xFFFF, (attached_ps->x + ps->x) & 0xFFFF,
(attached_ps->attached_y + ps->y) & 0xFFFF (attached_ps->y + ps->y) & 0xFFFF
); );
store_interaction_info(ps); store_interaction_info(ps);
attached_ps = attached_ps->next_attached_ps;
} }
ps = old_ps; ps = old_ps;

View File

@ -73,32 +73,33 @@ enum {
}; };
typedef struct paint_struct paint_struct; typedef struct paint_struct paint_struct;
typedef struct attached_paint_struct attached_paint_struct;
struct paint_struct{ struct attached_paint_struct {
uint32 image_id; // 0x00 uint32 image_id; // 0x00
uint32 var_04; uint32 var_04;
uint16 attached_x; // 0x08 uint16 x; // 0x08
uint16 attached_y; // 0x0A uint16 y; // 0x0A
union { uint8 var_0C;
struct { uint8 pad_0D;
uint8 var_0C; attached_paint_struct* next; //0x0E
uint8 pad_0D; };
paint_struct* next_attached_ps; //0x0E
uint16 pad_12; struct paint_struct {
}; uint32 image_id; // 0x00
struct { uint32 var_04;
uint16 attached_z; // 0x0C uint16 bound_box_x; // 0x08
uint16 attached_z_end; // 0x0E uint16 bound_box_y; // 0x0A
uint16 attached_x_end; // 0x10 uint16 bound_box_z; // 0x0C
uint16 attached_y_end; // 0x12 uint16 bound_box_z_end; // 0x0E
}; uint16 bound_box_x_end; // 0x10
}; uint16 bound_box_y_end; // 0x12
uint16 x; // 0x14 uint16 x; // 0x14
uint16 y; // 0x16 uint16 y; // 0x16
uint16 var_18; uint16 var_18;
uint8 var_1A; uint8 var_1A;
uint8 var_1B; uint8 var_1B;
paint_struct* attached_ps; //0x1C attached_paint_struct* attached_ps; //0x1C
paint_struct* var_20; paint_struct* var_20;
paint_struct* next_quadrant_ps; // 0x24 paint_struct* next_quadrant_ps; // 0x24
uint8 sprite_type; //0x28 uint8 sprite_type; //0x28
@ -177,7 +178,6 @@ bool sub_98196C(uint32 image_id, sint8 x_offset, sint8 y_offset, sint16 bound_bo
bool sub_98197C(uint32 image_id, sint8 x_offset, sint8 y_offset, sint16 bound_box_length_x, sint16 bound_box_length_y, sint8 bound_box_length_z, uint16 z_offset, sint16 bound_box_offset_x, sint16 bound_box_offset_y, sint16 bound_box_offset_z, uint32 rotation); bool sub_98197C(uint32 image_id, sint8 x_offset, sint8 y_offset, sint16 bound_box_length_x, sint16 bound_box_length_y, sint8 bound_box_length_z, uint16 z_offset, sint16 bound_box_offset_x, sint16 bound_box_offset_y, sint16 bound_box_offset_z, uint32 rotation);
bool sub_98198C(uint32 image_id, sint8 x_offset, sint8 y_offset, sint16 bound_box_length_x, sint16 bound_box_length_y, sint8 bound_box_length_z, uint16 z_offset, sint16 bound_box_offset_x, uint16 bound_box_offset_y, sint16 bound_box_offset_z, uint32 rotation); bool sub_98198C(uint32 image_id, sint8 x_offset, sint8 y_offset, sint16 bound_box_length_x, sint16 bound_box_length_y, sint8 bound_box_length_z, uint16 z_offset, sint16 bound_box_offset_x, uint16 bound_box_offset_y, sint16 bound_box_offset_z, uint32 rotation);
bool sub_98199C(uint32 image_id, sint8 x_offset, sint8 y_offset, sint16 bound_box_length_x, sint16 bound_box_length_y, sint8 bound_box_length_z, uint16 z_offset, sint16 bound_box_offset_x, uint16 bound_box_offset_y, sint16 bound_box_offset_z, uint32 rotation); bool sub_98199C(uint32 image_id, sint8 x_offset, sint8 y_offset, sint16 bound_box_length_x, sint16 bound_box_length_y, sint8 bound_box_length_z, uint16 z_offset, sint16 bound_box_offset_x, uint16 bound_box_offset_y, sint16 bound_box_offset_z, uint32 rotation);
bool sub_68818E(uint32 image_id, uint16 x_offset, uint16 y_offset, paint_struct ** paint);
void viewport_invalidate(rct_viewport *viewport, int left, int top, int right, int bottom); void viewport_invalidate(rct_viewport *viewport, int left, int top, int right, int bottom);