1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-16 19:43:06 +01:00

Found cause of viewport issue. Added invalidate_sprite function.

This commit is contained in:
Duncan Frost
2014-11-06 21:42:18 +00:00
parent f3da25622a
commit 2ddbc8f190
3 changed files with 100 additions and 65 deletions

View File

@@ -286,13 +286,6 @@ void game_logic_update()
if (RCT2_GLOBAL(0x009DEA66, sint16) == 0)
RCT2_GLOBAL(0x009DEA66, sint16)--;
// This is a hack for now to force a complete rerender of the screen to
// stop viewports from failing. Remove this when real bug cause has been
// found.
// ***********
//gfx_invalidate_screen();
// ***********
sub_68B089();
scenario_update();
climate_update();

View File

@@ -33,7 +33,7 @@
#define RCT2_LAST_VIEWPORT (RCT2_GLOBAL(RCT2_ADDRESS_NEW_VIEWPORT_PTR, rct_viewport*) - 1)
#define RCT2_NEW_VIEWPORT (RCT2_GLOBAL(RCT2_ADDRESS_NEW_VIEWPORT_PTR, rct_viewport*))
#define DEBUG_SHOW_DIRTY_BOX
//#define DEBUG_SHOW_DIRTY_BOX
rct_viewport* g_viewport_list = RCT2_ADDRESS(RCT2_ADDRESS_VIEWPORT_LIST, rct_viewport);
@@ -214,8 +214,9 @@ void viewport_update_pointers()
rct_viewport *viewport;
rct_viewport **vp = RCT2_ADDRESS(RCT2_ADDRESS_NEW_VIEWPORT_PTR, rct_viewport*);
if (*vp == NULL) *vp = g_viewport_list;
for (viewport = g_viewport_list; viewport <= RCT2_NEW_VIEWPORT; viewport++)
// The last possible viewport entry is 1 before what is the new_viewport_ptr
// This is why it is rct_viewport and not rct_viewport*.
for (viewport = g_viewport_list; viewport < RCT2_ADDRESS(RCT2_ADDRESS_NEW_VIEWPORT_PTR, rct_viewport); viewport++)
if (viewport->width != 0)
*vp++ = viewport;
@@ -266,39 +267,38 @@ void sub_689174(sint16* x, sint16* y, sint16 *z, uint8 curr_rotation){
*z = height;
}
// This function also needs edx, ebp
void sub_6E7FF3(rct_window* w, rct_viewport* viewport, int x, int y){
int zoom = 1 << viewport->zoom;
if (w >= RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*)){
if (viewport != w->viewport){
if ((viewport->x + viewport->width > w->x) &&
(w->x + w->width > viewport->x) &&
(viewport->y + viewport->height > w->y) &&
(w->y + w->height > viewport->y)){
if (viewport->x < w->x){
rct_viewport viewport_bkup;
memcpy(&viewport_bkup, viewport, sizeof(rct_viewport));
viewport->width = w->x - viewport->x;
viewport->view_width = (w->x - viewport->x) * zoom;
sub_6E7FF3(w, viewport, x, y);
viewport->x += viewport->width;
viewport->view_x += viewport->width*zoom;
viewport->view_width = (viewport_bkup.width - viewport->width) * zoom;
viewport->width = viewport_bkup.width - viewport->width;
sub_6E7FF3(w, viewport, x, y);
memcpy(viewport, &viewport_bkup, sizeof(rct_viewport));
return;
}//x6E80C4
}//0x6E824a
} // 0x6e824a
}//x6e8255
}
//void sub_6E7FF3(rct_window* w, rct_viewport* viewport, int x, int y){
// int zoom = 1 << viewport->zoom;
// if (w >= RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*)){
// if (viewport != w->viewport){
// if ((viewport->x + viewport->width > w->x) &&
// (w->x + w->width > viewport->x) &&
// (viewport->y + viewport->height > w->y) &&
// (w->y + w->height > viewport->y)){
// if (viewport->x < w->x){
// rct_viewport viewport_bkup;
// memcpy(&viewport_bkup, viewport, sizeof(rct_viewport));
//
// viewport->width = w->x - viewport->x;
// viewport->view_width = (w->x - viewport->x) * zoom;
//
// sub_6E7FF3(w, viewport, x, y);
//
// viewport->x += viewport->width;
// viewport->view_x += viewport->width*zoom;
// viewport->view_width = (viewport_bkup.width - viewport->width) * zoom;
// viewport->width = viewport_bkup.width - viewport->width;
//
// sub_6E7FF3(w, viewport, x, y);
//
// memcpy(viewport, &viewport_bkup, sizeof(rct_viewport));
// return;
// }//x6E80C4
// }//0x6E824a
// } // 0x6e824a
// }//x6e8255
//
//}
void sub_6E7F34(rct_window* w, rct_viewport* viewport){
//RCT2_CALLPROC_X(0x6E7F34, 0, 0, 0, 0, (int)viewport, (int)w, 0);
@@ -333,7 +333,7 @@ void sub_6E7F34(rct_window* w, rct_viewport* viewport){
}
w = orignal_w;
RCT2_CALLPROC_X(0x6E7FF3, 0, 0, 0, right, viewport, w, bottom);
RCT2_CALLPROC_X(0x6E7FF3, 0, 0, 0, right, (int)viewport, (int)w, bottom);
}
void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){

View File

@@ -107,6 +107,48 @@ void peep_update_all()
}
}
/* rct2: 0x006EC473 */
void invalidate_sprite(rct_peep* peep){
if (peep->var_16 == (sint16)0x8000) return;
// Note this function is different to original perhaps change back (part of viewport testing)
for (rct_viewport* viewport = RCT2_ADDRESS(RCT2_ADDRESS_VIEWPORT_LIST, rct_viewport); viewport < RCT2_ADDRESS(RCT2_ADDRESS_NEW_VIEWPORT_PTR, rct_viewport) && viewport->width; viewport++){
int left, right, top, bottom;
left = peep->var_16;
right = peep->var_1A;
top = peep->var_18;
bottom = peep->var_1C;
if (viewport->zoom >= 3)continue;
if (right <= viewport->view_x)continue;
if (bottom <= viewport->view_y) continue;
int viewport_right = viewport->view_x + viewport->view_width;
int viewport_bottom = viewport->view_y + viewport->view_height;
if (left >= viewport_right)continue;
if (top >= viewport_bottom)continue;
left = max(left, viewport->view_x);
right = min(right, viewport_right);
top = max(top, viewport->view_y);
bottom = min(bottom, viewport_bottom);
left -= viewport->view_x;
top -= viewport->view_y;
right -= viewport->view_x;
bottom -= viewport->view_y;
int zoom = 1 << viewport->zoom;
left /= zoom;
top /= zoom;
right /= zoom;
bottom /= zoom;
gfx_set_dirty_blocks(left + viewport->x, top + viewport->y, right + viewport->x, bottom + viewport->y);
}
}
/* rct2: 0x6939EB */
int sub_6939EB(sint16* x, sint16* y, rct_peep* peep){
RCT2_GLOBAL(0xF1AEF0, uint8) = peep->var_70;
@@ -163,14 +205,14 @@ int sub_6939EB(sint16* x, sint16* y, rct_peep* peep){
peep->var_70 = 0;
peep->var_71 = 0xFF;
RCT2_CALLPROC_X(0x693B58, 0, 0, 0, 0, (int)peep, 0, 0);
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);
*x = peep->x;
*y = peep->y;
return 1;
}
peep->var_70 = ebx;
if (peep->var_71 != 8 || peep->var_71 != 15){
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);
*x = peep->x;
*y = peep->y;
return 1;
@@ -192,7 +234,7 @@ int sub_6939EB(sint16* x, sint16* y, rct_peep* peep){
sound_play_panned(sound_id, 0x8001, peep->x, peep->y, peep->z);
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
*x = peep->x;
*y = peep->y;
return 1;
@@ -310,7 +352,7 @@ void peep_update_falling(rct_peep* peep){
if (height - 4 >= peep->z && height < peep->z + 20){
// Looks like we are drowning!
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
sub_69E9D3(peep->x, peep->y, height, (rct_sprite*)peep);
// Drop balloon if held
if (peep->item_standard_flags & PEEP_ITEM_BALLOON){
@@ -330,7 +372,7 @@ void peep_update_falling(rct_peep* peep){
peep->var_70 = 0;
RCT2_CALLPROC_X(0x693B58, 0, 0, 0, 0, (int)peep, 0, 0);
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
peep_window_state_update(peep);
return;
}
@@ -345,20 +387,20 @@ void peep_update_falling(rct_peep* peep){
// This will be null if peep is falling
if (saved_map == NULL){
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
if (peep->z <= 1){
// Remove peep if it has gone to the void
peep_remove(peep);
return;
}
sub_69E9D3(peep->x, peep->y, peep->z - 2, (rct_sprite*)peep);
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
return;
}
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
sub_69E9D3(peep->x, peep->y, saved_height, (rct_sprite*)peep);
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
peep->next_x = peep->x & 0xFFE0;
peep->next_y = peep->y & 0xFFE0;
@@ -412,11 +454,11 @@ void peep_update_sitting(rct_peep* peep){
int y = peep->y & 0xFFE0 + RCT2_ADDRESS(0x981F2E, uint16)[ebx * 2];
int z = peep->z;
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
sub_69E9D3(x, y, z, (rct_sprite*)peep);
peep->sprite_direction = ((peep->var_37 + 2) & 3) * 8;
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
peep->var_71 = 254;
peep->var_6F = 7;
RCT2_CALLPROC_X(0x693BAB, 0, 0, 0, 0, (int)peep, 0, 0);
@@ -466,7 +508,7 @@ void peep_update_sitting(rct_peep* peep){
peep->var_72 = 0;
peep->var_70 = 0;
RCT2_CALLPROC_X(0x693B58, 0, 0, 0, 0, (int)peep, 0, 0);
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
return;
}
@@ -491,7 +533,7 @@ void peep_update_sitting(rct_peep* peep){
peep->var_72 = 0;
peep->var_70 = 0;
RCT2_CALLPROC_X(0x693B58, 0, 0, 0, 0, (int)peep, 0, 0);
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
return;
}
}
@@ -525,7 +567,7 @@ void peep_update_queuing(rct_peep* peep){
}
//Give up queueing for the ride
peep->sprite_direction ^= (1 << 4);
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
RCT2_CALLPROC_X(0x6966A9, 0, 0, 0, 0, (int)peep, 0, 0);
peep_decrement_num_riders(peep);
peep->state = PEEP_STATE_1;
@@ -541,7 +583,7 @@ void peep_update_queuing(rct_peep* peep){
peep->var_72 = 0;
peep->var_70 = 0;
RCT2_CALLPROC_X(0x693B58, 0, 0, 0, 0, (int)peep, 0, 0);
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
}
if (peep->var_7A >= 3500 && (0xFFFF & scenario_rand()) <= 93)
{
@@ -579,7 +621,7 @@ void peep_update_queuing(rct_peep* peep){
peep->var_72 = 0;
peep->var_70 = 0;
RCT2_CALLPROC_X(0x693B58, 0, 0, 0, 0, (int)peep, 0, 0);
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
break;
}
}
@@ -589,7 +631,7 @@ void peep_update_queuing(rct_peep* peep){
if (peep->happiness <= 65 && (0xFFFF & scenario_rand()) < 2184){
//Give up queueing for the ride
peep->sprite_direction ^= (1 << 4);
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
RCT2_CALLPROC_X(0x6966A9, 0, 0, 0, 0, (int)peep, 0, 0);
peep_decrement_num_riders(peep);
peep->state = PEEP_STATE_1;
@@ -622,9 +664,9 @@ static void peep_update_entering_park(rct_peep* peep){
}
sint16 x = 0, y = 0;
if (sub_6939EB(&x, &y, peep)){
RCT2_CALLPROC_X(0x006EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);
sub_69E9D3(x, y, peep->z, (rct_sprite*)peep);
RCT2_CALLPROC_X(0x006EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);
return;
}
peep_decrement_num_riders(peep);
@@ -1048,7 +1090,7 @@ void peep_applause()
peep->var_72 = 0;
peep->var_70 = 0;
RCT2_CALLPROC_X(0x00693B58, 0, 0, 0, 0, (int)peep, 0, 0);
RCT2_CALLPROC_X(0x006EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);
}
}
@@ -1432,7 +1474,7 @@ void peep_insert_new_thought(rct_peep *peep, uint8 thought_type, uint8 thought_a
peep->var_72 = 0;
peep->var_70 = 0;
RCT2_CALLPROC_X(0x693B58, 0, 0, 0, 0, (int)peep, 0, 0);
RCT2_CALLPROC_X(0x6EC473, 0, 0, 0, 0, (int)peep, 0, 0);
invalidate_sprite(peep);;
}
for (int i = 0; i < PEEP_MAX_THOUGHTS; ++i){