From 37ca25170ea8c411d5fdb833d273c169bf361dee Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 22 Jun 2014 10:24:19 +0100 Subject: [PATCH 1/3] Fixed graphical drawing bug. Detection of groups still incorrect --- src/window_guest_list.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/window_guest_list.c b/src/window_guest_list.c index 4cefb9ed88..cf69010a32 100644 --- a/src/window_guest_list.c +++ b/src/window_guest_list.c @@ -777,7 +777,7 @@ static void window_guest_list_scrollpaint() // Draw guest faces numGuests = _window_guest_list_groups_num_guests[i]; for (j = 0; j < 56 && j < numGuests; j++) - gfx_draw_sprite(dpi, _window_guest_list_groups_guest_faces[numGuests * 56 + j] + 5486, j * 8, y + 9); + gfx_draw_sprite(dpi, _window_guest_list_groups_guest_faces[i * 56 + j] + 5486, j * 8, y + 9); // Draw action RCT2_GLOBAL(0x013CE952, uint16) = _window_guest_list_groups_argument_1[i] & 0xFFFF; @@ -807,7 +807,7 @@ static int window_guest_list_is_peep_in_filter(rct_peep* peep) temp = _window_guest_list_selected_view; _window_guest_list_selected_view = _window_guest_list_selected_filter; - + esi = (int)peep; RCT2_CALLFUNC_X(0x0069B7EA, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); ebx &= 0xFFFF; @@ -823,6 +823,7 @@ static int window_guest_list_is_peep_in_filter(rct_peep* peep) return 1; } +/* Calculates a hash value for comparing peep actions/thoughts*/ static int sub_69B7EA(rct_peep *peep, int *outEAX) { int eax, ebx, ecx, edx, esi, edi, ebp; @@ -916,7 +917,7 @@ static void window_guest_list_find_groups() // Get and check if in same group // BUG this doesn't work! bx = sub_69B7EA(peep2, &eax); - if (bx != RCT2_GLOBAL(0x00F1EDF6, uint32) || (eax & 0xFFFF) != RCT2_GLOBAL(0x013CE952, uint16) || eax != RCT2_GLOBAL(0x013CE952 + 2, uint32)) + if ((bx != _window_guest_list_groups_argument_1[groupIndex] || (RCT2_GLOBAL(0x00F1EDF8, uint16) != RCT2_GLOBAL(0x013CE952, uint16)) || _window_guest_list_groups_argument_2[groupIndex] != RCT2_GLOBAL(0x013CE952 + 2, uint32))) continue; // Assign guest @@ -963,8 +964,9 @@ static void window_guest_list_find_groups() edx = _window_guest_list_groups_argument_2[edi]; _window_guest_list_groups_argument_2[edi] = temp; + temp = RCT2_ADDRESS(0x00F1AF26, uint8)[edi]; RCT2_ADDRESS(0x00F1AF26, uint8)[edi] = bl; - bl = RCT2_ADDRESS(0x00F1AF26, uint8)[edi]; + bl = temp; } while (++edi <= groupIndex); nextPeep: From b31f1f00b2d7432af76df696af70cbf5a9b67d7d Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 22 Jun 2014 18:14:49 +0100 Subject: [PATCH 2/3] Fixed guest list groups. There is still a graphical glitch --- src/window_guest_list.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/window_guest_list.c b/src/window_guest_list.c index cf69010a32..69be44c2bf 100644 --- a/src/window_guest_list.c +++ b/src/window_guest_list.c @@ -917,7 +917,7 @@ static void window_guest_list_find_groups() // Get and check if in same group // BUG this doesn't work! bx = sub_69B7EA(peep2, &eax); - if ((bx != _window_guest_list_groups_argument_1[groupIndex] || (RCT2_GLOBAL(0x00F1EDF8, uint16) != RCT2_GLOBAL(0x013CE952, uint16)) || _window_guest_list_groups_argument_2[groupIndex] != RCT2_GLOBAL(0x013CE952 + 2, uint32))) + if ((bx != (0xFFFF&_window_guest_list_groups_argument_1[groupIndex]) || (RCT2_GLOBAL(0x00F1EDF8, uint16) != RCT2_GLOBAL(0x013CE952, uint16)) || _window_guest_list_groups_argument_2[groupIndex] != RCT2_GLOBAL(0x013CE952 + 2, uint32))) continue; // Assign guest From d5c865b856b50b70906b41f6420601ce4e3a1eeb Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 22 Jun 2014 19:01:48 +0100 Subject: [PATCH 3/3] Fixed graphical bug in faces. Fixes #102 --- src/window_guest_list.c | 52 ++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/window_guest_list.c b/src/window_guest_list.c index 69be44c2bf..8142acd81e 100644 --- a/src/window_guest_list.c +++ b/src/window_guest_list.c @@ -915,7 +915,6 @@ static void window_guest_list_find_groups() continue; // Get and check if in same group - // BUG this doesn't work! bx = sub_69B7EA(peep2, &eax); if ((bx != (0xFFFF&_window_guest_list_groups_argument_1[groupIndex]) || (RCT2_GLOBAL(0x00F1EDF8, uint16) != RCT2_GLOBAL(0x013CE952, uint16)) || _window_guest_list_groups_argument_2[groupIndex] != RCT2_GLOBAL(0x013CE952 + 2, uint32))) continue; @@ -925,7 +924,7 @@ static void window_guest_list_find_groups() peep2->var_0C &= ~(1 << 8); // Add face sprite, cap at 56 though - if (_window_guest_list_groups_num_guests[groupIndex] < 56) + if (_window_guest_list_groups_num_guests[groupIndex] >= 56) continue; _window_guest_list_groups_guest_faces[faceIndex++] = get_guest_face_sprite_small(peep2) - 5486; } @@ -935,39 +934,44 @@ static void window_guest_list_find_groups() continue; } - ax = _window_guest_list_groups_num_guests[groupIndex]; - int edi = 0; - + int curr_num_guests = _window_guest_list_groups_num_guests[groupIndex]; + int swap_position = 0; + //This section places the groups in size order. while (1) { - if (edi >= groupIndex) + if (swap_position >= groupIndex) goto nextPeep; - if (ax > _window_guest_list_groups_num_guests[edi]) + if (curr_num_guests > _window_guest_list_groups_num_guests[swap_position]) break; - edi++; + swap_position++; } - int ecx = _window_guest_list_groups_argument_1[groupIndex]; - int edx = _window_guest_list_groups_argument_2[groupIndex]; + int argument_1 = _window_guest_list_groups_argument_1[groupIndex]; + int argument_2 = _window_guest_list_groups_argument_2[groupIndex]; int bl = RCT2_ADDRESS(0x00F1AF26, uint8)[groupIndex]; int temp; do { - temp = ax; - ax = _window_guest_list_groups_num_guests[edi]; - _window_guest_list_groups_num_guests[edi] = temp; + temp = curr_num_guests; + curr_num_guests = _window_guest_list_groups_num_guests[swap_position]; + _window_guest_list_groups_num_guests[swap_position] = temp; - temp = ecx; - ecx = _window_guest_list_groups_argument_1[edi]; - _window_guest_list_groups_argument_1[edi] = temp; + temp = argument_1; + argument_1 = _window_guest_list_groups_argument_1[swap_position]; + _window_guest_list_groups_argument_1[swap_position] = temp; - temp = edx; - edx = _window_guest_list_groups_argument_2[edi]; - _window_guest_list_groups_argument_2[edi] = temp; + temp = argument_2; + argument_2 = _window_guest_list_groups_argument_2[swap_position]; + _window_guest_list_groups_argument_2[swap_position] = temp; - temp = RCT2_ADDRESS(0x00F1AF26, uint8)[edi]; - RCT2_ADDRESS(0x00F1AF26, uint8)[edi] = bl; + uint8 temp_faces[56]; + memcpy(temp_faces, &(_window_guest_list_groups_guest_faces[groupIndex*56]), 56); + memcpy(&(_window_guest_list_groups_guest_faces[groupIndex * 56]), &(_window_guest_list_groups_guest_faces[swap_position * 56]), 56); + memcpy(&(_window_guest_list_groups_guest_faces[swap_position * 56]), temp_faces, 56); + + temp = RCT2_ADDRESS(0x00F1AF26, uint8)[swap_position]; + RCT2_ADDRESS(0x00F1AF26, uint8)[swap_position] = bl; bl = temp; - } while (++edi <= groupIndex); + } while (++swap_position <= groupIndex); nextPeep: ; @@ -982,10 +986,10 @@ static int get_guest_face_sprite_small(rct_peep *peep) { int sprite; sprite = SPR_PEEP_SMALL_FACE_ANGRY; - + if (peep->var_F3) return sprite; sprite = SPR_PEEP_SMALL_FACE_VERY_VERY_SICK; - + if (peep->nausea > 200) return sprite; sprite--; //VERY_SICK