Facebook
From Speedy Wigeon, 4 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 161
  1. From d6fd03070268a21547f18bec8a0c87abcf30eef2 Mon Sep 17 00:00:00 2001
  2. From: Timmy Weerwag <[email protected]>
  3. Date: Tue, 31 Mar 2015 21:53:02 +0200
  4. Subject: [PATCH] Decompiled sub_688217
  5.  
  6. ---
  7.  src/interface/viewport.c | 140 ++++++++++++++++++++++++++++++++++++---
  8.  1 file changed, 132 insertions(+), 8 deletions(-)
  9.  
  10. diff --git a/src/interface/viewport.c b/src/interface/viewport.c
  11. index ef09d18d8c4..78a40f2f0a6 100644
  12. --- a/src/interface/viewport.c
  13. +++ b/src/interface/viewport.c
  14. @@ -45,15 +45,25 @@ struct paint_struct{
  15.         uint32 var_04;
  16.         uint16 attached_x;              // 0x08
  17.         uint16 attached_y;              // 0x0A
  18. -       uint8 var_0C;
  19. -       uint8 pad_0D;
  20. -       paint_struct* next_attached_ps; //0x0E
  21. -       uint8 pad_12[2];
  22. +       union {
  23. +               struct {
  24. +                       uint8 var_0C;
  25. +                       uint8 pad_0D;
  26. +                       paint_struct* next_attached_ps; //0x0E
  27. +                       uint16 pad_12;
  28. +               };
  29. +               struct {
  30. +                       uint16 some_x; // 0x0C
  31. +                       uint16 some_y; // 0x0E
  32. +                       uint16 other_x; // 0x10
  33. +                       uint16 other_y; // 0x12
  34. +               };
  35. +       };
  36.         uint16 x;                               // 0x14
  37.         uint16 y;                               // 0x16
  38. -       uint8 pad_18[2];
  39. +       uint16 var_18;
  40.         uint8 var_1A;
  41. -       uint8 pad_1B;
  42. +       uint8 var_1B;
  43.         paint_struct* attached_ps;      //0x1C
  44.         paint_struct* var_20;
  45.         paint_struct* var_24;
  46. @@ -1346,6 +1356,118 @@ void sub_0x68B6C2(){
  47.         }
  48.  }
  49.  
  50. +void sub_688217_helper(uint16 ax, uint8 flag)
  51. +{
  52. +       paint_struct *ps;
  53. +       uint32 edi;
  54. +
  55. +       paint_struct *ps_next = RCT2_GLOBAL(0x00EE7884, paint_struct*);
  56. +
  57. +       do {
  58. +               ps = ps_next;
  59. +               ps_next = ps_next->var_24;
  60. +               if (ps_next == NULL) return;
  61. +       } while (ax > ps_next->var_18);
  62. +
  63. +       RCT2_GLOBAL(0x00F1AD14, paint_struct*) = ps;
  64. +
  65. +       do {
  66. +               ps = ps->var_24;
  67. +               if (ps == NULL) break;
  68. +
  69. +               if (ps->var_18 > ax + 1) {
  70. +                       ps->var_1B = 1 << 7;
  71. +               } else if (ps->var_18 == ax + 1) {
  72. +                       ps->var_1B = (1 << 1) | (1 << 0);
  73. +               } else if (ps->var_18 == ax) {
  74. +                       ps->var_1B = flag | (1 << 0);
  75. +               }
  76. +       } while (ps->var_18 <= ax + 1);
  77. +
  78. +       ps = RCT2_GLOBAL(0x00F1AD14, paint_struct*);
  79. +
  80. +       while (true) {
  81. +               while (true) {
  82. +                       ps_next = ps->var_24;
  83. +                       if (ps_next == NULL) return;
  84. +                       if (ps_next->var_1B & (1 << 7)) return;
  85. +                       if (ps_next->var_1B & (1 << 0)) break;
  86. +                       ps = ps_next;
  87. +               }
  88. +
  89. +               ps_next->var_1B &= ~(1 << 0);
  90. +               RCT2_GLOBAL(0x00F1AD18, paint_struct*) = ps;
  91. +
  92. +               uint16 my_attached_x = ps_next->attached_x;
  93. +               uint16 my_attached_y = ps_next->attached_y;
  94. +               uint16 my_some_x = ps_next->some_x;
  95. +               uint16 my_some_y = ps_next->some_y;
  96. +               uint16 my_other_x = ps_next->other_x;
  97. +               uint16 my_other_y = ps_next->other_y;
  98. +
  99. +               while (true) {
  100. +                       ps = ps_next;
  101. +                       ps_next = ps_next->var_24;
  102. +                       if (ps_next == NULL) break;
  103. +                       if (ps_next->var_1B & (1 << 7)) break;
  104. +                       if (!(ps_next->var_1B & (1 << 1))) continue;
  105. +                       edi = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) << 6;
  106. +                       if (my_attached_x < ps_next->other_x)   edi |= (1 << 5);
  107. +                       if (my_attached_y < ps_next->other_y)   edi |= (1 << 4);
  108. +                       if (my_some_x < ps_next->some_y)                edi |= (1 << 3);
  109. +                       if (my_other_x < ps_next->attached_x)   edi |= (1 << 2);
  110. +                       if (my_other_y < ps_next->attached_y)   edi |= (1 << 1);
  111. +                       if (my_some_y < ps_next->some_x)                edi |= (1 << 0);
  112. +
  113. +                       if (RCT2_GLOBAL(0x0098185C + edi, uint8) == 0) continue;
  114. +
  115. +                       ps->var_24 = ps_next->var_24;
  116. +                       paint_struct *ps_temp = RCT2_GLOBAL(0x00F1AD18, paint_struct*)->var_24;
  117. +                       RCT2_GLOBAL(0x00F1AD18, paint_struct*)->var_24 = ps_next;
  118. +                       ps_next->var_24 = ps_temp;
  119. +                       ps_next = ps;
  120. +               }
  121. +
  122. +               ps = RCT2_GLOBAL(0x00F1AD18, paint_struct*);
  123. +       }
  124. +}
  125. +
  126. +/**
  127. +*
  128. +*  rct2: 0x00688217
  129. +*/
  130. +void sub_688217()
  131. +{
  132. +       paint_struct *ps = RCT2_GLOBAL(0x00EE7888, paint_struct*);
  133. +       paint_struct *ps_next;
  134. +       RCT2_GLOBAL(0x00EE7888, uint32) += 0x34; // 0x34 is size of paint_struct?
  135. +       RCT2_GLOBAL(0x00EE7884, paint_struct*) = ps;
  136. +       ps->var_24 = NULL;
  137. +       uint32 edi = RCT2_GLOBAL(0x00F1AD0C, uint32);
  138. +       if (edi == -1)
  139. +               return;
  140. +
  141. +       do {
  142. +               ps_next = RCT2_GLOBAL(0x00F1A50C + 4 * edi, paint_struct*);
  143. +               if (ps_next != NULL) {
  144. +                       ps->var_24 = ps_next;
  145. +                       do {
  146. +                               ps = ps_next;
  147. +                               ps_next = ps_next->var_24;
  148. +                       } while (ps_next != NULL);
  149. +               }
  150. +       } while (++edi <= RCT2_GLOBAL(0x00F1AD10, uint32));
  151. +
  152. +       uint32 eax = RCT2_GLOBAL(0x00F1AD0C, uint32);
  153. +
  154. +       sub_688217_helper(eax & 0xFFFF, 1 << 1);
  155. +
  156. +       eax = RCT2_GLOBAL(0x00F1AD0C, uint32);
  157. +
  158. +       while (++eax < RCT2_GLOBAL(0x00F1AD10, uint32))
  159. +               sub_688217_helper(eax & 0xFFFF, 0);
  160. +}
  161. +
  162.  /**
  163.   *
  164.   *  rct2:0x00685CBF
  165. @@ -1439,7 +1561,8 @@ void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, in
  166.                 sub_0x68615B(0xEE788C); //Memory copy
  167.                 sub_0x68B6C2();
  168.                 //RCT2_CALLPROC_X(0x68B6C2, 0, 0, 0, 0, 0, 0, 0); //Big function call 4 rotation versions
  169. -               RCT2_CALLPROC_X(0x688217, start_x, ebx, ecx, (int)bits_pointer, esi, (int)dpi2, ebp); //Move memory
  170. +               sub_688217();
  171. +               //RCT2_CALLPROC_X(0x688217, start_x, ebx, ecx, (int)bits_pointer, esi, (int)dpi2, ebp); //Move memory
  172.                 sub_688485();
  173.                 //RCT2_CALLPROC_EBPSAFE(0x688485); //Big function call
  174.  
  175. @@ -1772,7 +1895,8 @@ void get_map_coordinates_from_pos(int screenX, int screenY, int flags, int *x, i
  176.                         RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*) = dpi;
  177.                         sub_0x68615B(0xEE788C);
  178.                         sub_0x68B6C2();
  179. -                       RCT2_CALLPROC_X(0x688217, 0, 0, 0, 0, 0, 0, 0);
  180. +                       sub_688217();
  181. +                       //RCT2_CALLPROC_X(0x688217, 0, 0, 0, 0, 0, 0, 0);
  182.                         RCT2_CALLPROC_X(0x68862C, 0, 0, 0, 0, 0, 0, 0);
  183.                 }
  184.                 if (viewport != NULL) *viewport = myviewport;