mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #889 from duncanspumpkin/refactor
Refactor of paint_ride_entry.
This commit is contained in:
commit
9282a782d3
|
@ -230,7 +230,7 @@ const int OpenRCT2LangIdToObjectLangId[] = {
|
|||
0, 0, 1, 3, 6, 2, 0, 0, 4, 7
|
||||
};
|
||||
|
||||
//0x006A9E24
|
||||
/* rct2: 0x006A9E24*/
|
||||
rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/*ecx*/, int index/*ebx*/, int tableindex/*edx*/)
|
||||
{
|
||||
char* pString;
|
||||
|
|
660
src/object.c
660
src/object.c
|
@ -22,6 +22,7 @@
|
|||
#include "localisation/localisation.h"
|
||||
#include "object.h"
|
||||
#include "platform/platform.h"
|
||||
#include "ride/ride.h"
|
||||
#include "util/sawyercoding.h"
|
||||
#include "drawing/drawing.h"
|
||||
#include "world/footpath.h"
|
||||
|
@ -384,409 +385,397 @@ int object_calculate_checksum(const rct_object_entry *entry, const char *data, i
|
|||
return checksum;
|
||||
}
|
||||
|
||||
/* ebp is made up of 3 pointers: no_elements, unknown, g1_source */
|
||||
//rct2: 0x006A9ED1
|
||||
int sub_6A9ED1(uint8_t** ebp)
|
||||
/* rct2: 0x006A9ED1 */
|
||||
int object_chunk_load_image_directory(uint8_t** chunk)
|
||||
{
|
||||
int result;
|
||||
int eax = result = RCT2_GLOBAL(0x9ADAF0, uint32_t);
|
||||
int no_elements = ((uint32_t*)(*ebp))[0];
|
||||
int image_start_no = RCT2_GLOBAL(0x9ADAF0, uint32_t);
|
||||
|
||||
RCT2_GLOBAL(0x9ADAF0, uint32_t) = no_elements + eax;
|
||||
// First dword of chunk is no_images
|
||||
int no_images = *((uint32_t*)(*chunk));
|
||||
*chunk += 4;
|
||||
// Second dword of chunk is length of image data
|
||||
int length_of_data = *((uint32_t*)(*chunk));
|
||||
*chunk += 4;
|
||||
|
||||
rct_g1_element* g1_dest = &RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[eax];
|
||||
rct_g1_element* g1_source = (rct_g1_element*)((*ebp) + 8);
|
||||
int ebx = no_elements * sizeof(rct_g1_element) + (uint32)g1_source;
|
||||
RCT2_GLOBAL(0x9ADAF0, uint32_t) = no_images + image_start_no;
|
||||
|
||||
for (int i = 0; i < no_elements; ++i){
|
||||
rct_g1_element* g1_dest = &RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[image_start_no];
|
||||
|
||||
// After length of data is the start of all g1 element structs
|
||||
rct_g1_element* g1_source = (rct_g1_element*)(*chunk);
|
||||
|
||||
// After the g1 element structs is the actual images.
|
||||
uint8* image_offset = no_images * sizeof(rct_g1_element) + (uint8*)g1_source;
|
||||
|
||||
for (int i = 0; i < no_images; ++i){
|
||||
*g1_dest = *g1_source++;
|
||||
g1_dest->offset += ebx;
|
||||
g1_dest->offset += (uint32)image_offset;
|
||||
g1_dest++;
|
||||
}
|
||||
|
||||
(*ebp) += 8;
|
||||
(*ebp) += *((uint32_t*)((*ebp) - 4));
|
||||
(*ebp) += no_elements * sizeof(rct_g1_element);
|
||||
return result;
|
||||
*chunk = ((uint8*)g1_source) + length_of_data;
|
||||
return image_start_no;
|
||||
}
|
||||
|
||||
//rct2: 0x006DE83E
|
||||
/* rct2: 0x006DE83E */
|
||||
int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dpi, int esi, int ebp)
|
||||
{
|
||||
if ((flags & 0xFF) != 3)
|
||||
if ((flags & 0xFF) == 0){
|
||||
// esi
|
||||
rct_ride_type* ride_type = (rct_ride_type*)esi;
|
||||
|
||||
// After ride_type is 3 string tables
|
||||
uint8_t* chunk = (uint8*)(ride_type + 1);
|
||||
ride_type->name = object_get_localised_text(&chunk, ecx, ebx, 0);
|
||||
ride_type->description = object_get_localised_text(&chunk, ecx, ebx, 1);
|
||||
object_get_localised_text(&chunk, ecx, ebx, 2);
|
||||
// Offset to Unknown struct
|
||||
ride_type->var_1AE = (uint32_t)chunk;
|
||||
|
||||
// If Unknown struct size is 0xFF then there are 32 3 byte structures
|
||||
uint8 unknown_size = *chunk++;
|
||||
if (unknown_size != 0xFF)
|
||||
{
|
||||
if ((flags & 0xFF) != 1)
|
||||
{
|
||||
if ((flags & 0xFF) <= 1)//0
|
||||
{
|
||||
uint8_t* ebp = (uint8_t*)(esi + 0x1C2);
|
||||
((rct_ride_type*)esi)->name = object_get_localised_text(&ebp, ecx, ebx, 0);
|
||||
((rct_ride_type*)esi)->description = object_get_localised_text(&ebp, ecx, ebx, 1);
|
||||
object_get_localised_text(&ebp, ecx, ebx, 2);
|
||||
((uint32_t*)(esi + 0x1AE))[0] = (uint32_t)ebp;
|
||||
if (ebp[0] != 0xFF)
|
||||
{
|
||||
int a = ebp[0];
|
||||
ebp++;
|
||||
ebp += a * 3;
|
||||
chunk += unknown_size * 3;
|
||||
}
|
||||
else ebp += 0x61;
|
||||
uint8_t* ebp_tmp = ebp;
|
||||
int d = 4;
|
||||
while (true)
|
||||
{
|
||||
int a = *ebp;
|
||||
ebp++;
|
||||
if (a == 0xFF)
|
||||
{
|
||||
a = ((uint16_t*)ebp)[0];
|
||||
ebp += 2;
|
||||
else {
|
||||
chunk += 0x60;
|
||||
}
|
||||
ebp += a;
|
||||
d--;
|
||||
if (d == 0) break;
|
||||
|
||||
uint8* peep_loading_positions = chunk;
|
||||
// Peep loading positions variable size
|
||||
// 4 different vehicle subtypes are available
|
||||
for (int i = 0; i < 4; ++i){
|
||||
uint16 no_peep_positions = *chunk++;
|
||||
// If no_peep_positions is 0xFF then no_peep_positions is a word
|
||||
if (no_peep_positions == 0xFF)
|
||||
{
|
||||
no_peep_positions = *((uint16_t*)chunk);
|
||||
chunk += 2;
|
||||
}
|
||||
int a = sub_6A9ED1(&ebp);
|
||||
((uint32_t*)(esi + 4))[0] = a;
|
||||
a += 3;
|
||||
uint8_t* tmp = ebp;
|
||||
ebp = ebp_tmp;
|
||||
ebp_tmp = tmp;
|
||||
int a_tmp = a;
|
||||
int b_tmp = ebx;
|
||||
int c_tmp = ecx;
|
||||
d = 0;
|
||||
int di = 0;
|
||||
while (true)
|
||||
{
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 1)
|
||||
{
|
||||
chunk += no_peep_positions;
|
||||
}
|
||||
|
||||
int images_offset = object_chunk_load_image_directory(&chunk);
|
||||
ride_type->images_offset = images_offset;
|
||||
|
||||
int cur_vehicle_images_offset = images_offset + 3;
|
||||
|
||||
for (int i = 0; i < 4; ++i){
|
||||
rct_ride_type_vehicle* rideVehicleEntry = &ride_type->vehicles[i];
|
||||
|
||||
if (rideVehicleEntry->var_0C & 1){
|
||||
int al = 1;
|
||||
if (((uint16_t*)(di + esi + 0x2E))[0] & 2)
|
||||
if (rideVehicleEntry->var_14 & 2)
|
||||
{
|
||||
int ax = ((uint16_t*)(di + esi + 0x2E))[0];
|
||||
ax &= 0x820;
|
||||
al = 0xD;
|
||||
if (ax != 0x820)
|
||||
al = 13;
|
||||
if ((rideVehicleEntry->var_14 & 0x820) != 0x820)
|
||||
{
|
||||
al = 7;
|
||||
if (!(((uint16_t*)(di + esi + 0x2E))[0] & 0x20))
|
||||
if (!(rideVehicleEntry->var_14 & 0x20))
|
||||
{
|
||||
if (!(((uint16_t*)(di + esi + 0x2E))[0] & 0x800))
|
||||
if (!(rideVehicleEntry->var_14 & 0x800))
|
||||
{
|
||||
al = 5;
|
||||
if (((uint16_t*)(di + esi + 0x2E))[0] & 0x200) al = 3;
|
||||
if (rideVehicleEntry->var_14 & 0x200) al = 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
((uint8_t*)(di + esi + 0x1D))[0] = al;
|
||||
rideVehicleEntry->var_03 = al;
|
||||
// 0x6DE90B
|
||||
|
||||
al = 0x20;
|
||||
if (!(((uint16_t*)(di + esi + 0x2C))[0] & 0x4000))
|
||||
if (!(rideVehicleEntry->var_12 & 0x4000))
|
||||
{
|
||||
al = 1;
|
||||
if (((uint16_t*)(di + esi + 0x2E))[0] & 0x80)
|
||||
if (rideVehicleEntry->var_14 & 0x80)
|
||||
{
|
||||
if (((uint8_t*)(di + esi + 0x2B))[0] != 6)
|
||||
if (rideVehicleEntry->var_11 != 6)
|
||||
{
|
||||
al = 2;
|
||||
if (!(((uint16_t*)(di + esi + 0x2C))[0] & 0x80)) al = 4;
|
||||
if (!(rideVehicleEntry->var_12 & 0x80)) al = 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x2C))[0] & 0x1000) al = ((uint8_t*)(di + esi + 0x7A))[0];
|
||||
((uint8_t*)(di + esi + 0x1C))[0] = al;
|
||||
int a = ((uint8_t*)(di + esi + 0x1C))[0];
|
||||
int b = ((uint8_t*)(di + esi + 0x1D))[0];
|
||||
b *= a;
|
||||
((uint16_t*)(di + esi + 0x30))[0] = b;
|
||||
a = a_tmp;
|
||||
((uint32_t*)(di + esi + 0x32))[0] = a;
|
||||
if (((uint8_t*)(di + esi + 0x77))[0] != 4)
|
||||
if (rideVehicleEntry->var_12 & 0x1000) al = rideVehicleEntry->var_60;
|
||||
rideVehicleEntry->var_02 = al;
|
||||
// 0x6DE946
|
||||
|
||||
rideVehicleEntry->var_16 = rideVehicleEntry->var_02 * rideVehicleEntry->var_03;
|
||||
rideVehicleEntry->base_image_id = cur_vehicle_images_offset;
|
||||
int image_index = rideVehicleEntry->base_image_id;
|
||||
|
||||
if (rideVehicleEntry->var_5D != 4){
|
||||
int b = rideVehicleEntry->var_16 * 32;
|
||||
|
||||
if (rideVehicleEntry->var_12 & 0x800) b /= 2;
|
||||
if (rideVehicleEntry->var_0C & 0x8000) b /= 8;
|
||||
|
||||
image_index += b;
|
||||
|
||||
// Incline 25
|
||||
if (rideVehicleEntry->var_0C & 0x2){
|
||||
rideVehicleEntry->var_20 = image_index;
|
||||
b = rideVehicleEntry->var_16 * 72;
|
||||
if (rideVehicleEntry->var_12 & 0x4000)
|
||||
b = rideVehicleEntry->var_16 * 16;
|
||||
|
||||
image_index += b;
|
||||
}
|
||||
|
||||
// Incline 60
|
||||
if (rideVehicleEntry->var_0C & 0x4){
|
||||
rideVehicleEntry->var_24 = image_index;
|
||||
b = rideVehicleEntry->var_16 * 80;
|
||||
image_index += b;
|
||||
}
|
||||
// Verticle
|
||||
if (rideVehicleEntry->var_0C & 0x8){
|
||||
rideVehicleEntry->var_28 = image_index;
|
||||
b = rideVehicleEntry->var_16 * 116;
|
||||
image_index += b;
|
||||
}
|
||||
// Unknown
|
||||
if (rideVehicleEntry->var_0C & 0x10){
|
||||
rideVehicleEntry->var_2C = image_index;
|
||||
b = rideVehicleEntry->var_16 * 24;
|
||||
image_index += b;
|
||||
}
|
||||
|
||||
// Bank
|
||||
if (rideVehicleEntry->var_0C & 0x20){
|
||||
rideVehicleEntry->var_30 = image_index;
|
||||
b = rideVehicleEntry->var_16 * 80;
|
||||
image_index += b;
|
||||
}
|
||||
|
||||
if (rideVehicleEntry->var_0C & 0x40){
|
||||
rideVehicleEntry->var_34 = image_index;
|
||||
b = rideVehicleEntry->var_16 * 40;
|
||||
image_index += b;
|
||||
}
|
||||
|
||||
// Track half? Up/Down
|
||||
if (rideVehicleEntry->var_0C & 0x80){
|
||||
rideVehicleEntry->var_38 = image_index;
|
||||
b = rideVehicleEntry->var_16 * 128;
|
||||
image_index += b;
|
||||
}
|
||||
// Unknown
|
||||
if (rideVehicleEntry->var_0C & 0x100){
|
||||
rideVehicleEntry->var_3C = image_index;
|
||||
b = rideVehicleEntry->var_16 * 16;
|
||||
image_index += b;
|
||||
}
|
||||
// Unknown
|
||||
if (rideVehicleEntry->var_0C & 0x200){
|
||||
rideVehicleEntry->var_40 = image_index;
|
||||
b = rideVehicleEntry->var_16 * 16;
|
||||
image_index += b;
|
||||
}
|
||||
|
||||
if (rideVehicleEntry->var_0C & 0x400){
|
||||
rideVehicleEntry->var_44 = image_index;
|
||||
b = rideVehicleEntry->var_16 * 128;
|
||||
image_index += b;
|
||||
}
|
||||
|
||||
if (rideVehicleEntry->var_0C & 0x800){
|
||||
rideVehicleEntry->var_48 = image_index;
|
||||
b = rideVehicleEntry->var_16 * 16;
|
||||
image_index += b;
|
||||
}
|
||||
|
||||
if (rideVehicleEntry->var_0C & 0x1000){
|
||||
rideVehicleEntry->var_4C = image_index;
|
||||
b = rideVehicleEntry->var_16 * 80;
|
||||
image_index += b;
|
||||
}
|
||||
// Unknown
|
||||
if (rideVehicleEntry->var_0C & 0x2000){
|
||||
rideVehicleEntry->var_1C = image_index;
|
||||
b = rideVehicleEntry->var_16 * 12;
|
||||
image_index += b;
|
||||
}
|
||||
|
||||
if (rideVehicleEntry->var_0C & 0x4000){
|
||||
// Same offset as above???
|
||||
rideVehicleEntry->var_4C = image_index;
|
||||
b = rideVehicleEntry->var_16 * 32;
|
||||
image_index += b;
|
||||
}
|
||||
|
||||
}
|
||||
else{
|
||||
image_index += rideVehicleEntry->var_16 * 36;
|
||||
}
|
||||
// No vehicle images
|
||||
rideVehicleEntry->no_vehicle_images = image_index - cur_vehicle_images_offset;
|
||||
|
||||
// Move the offset over this vehicles images. Including peeps
|
||||
cur_vehicle_images_offset = image_index + rideVehicleEntry->no_seating_rows * rideVehicleEntry->no_vehicle_images;
|
||||
// 0x6DEB0D
|
||||
|
||||
if (!(rideVehicleEntry->var_12 & 0x400)){
|
||||
int ecx = cur_vehicle_images_offset - rideVehicleEntry->base_image_id;
|
||||
if (rideVehicleEntry->var_12 & 0x2000){
|
||||
ecx *= 2;
|
||||
}
|
||||
|
||||
int bl, bh, eax = 0;
|
||||
{
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x20;
|
||||
if (((uint16_t*)(di + esi + 0x2C))[0] & 0x800) b >>= 1;
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 0x8000) b >>= 3;
|
||||
a += b;
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 2)
|
||||
int ebx = rideVehicleEntry->base_image_id;
|
||||
int edx = 0, esi = 0, ebp = 0, edi = 0;
|
||||
RCT2_CALLFUNC_X(0x6847BA, &eax, &ebx, &ecx, &edx, &esi, &ebp, &edi);
|
||||
bl = ebx & 0xFF;
|
||||
bh = (ebx >> 8) & 0xFF;
|
||||
}
|
||||
|
||||
if (rideVehicleEntry->var_12 & 0x2000){
|
||||
bl += 16;
|
||||
}
|
||||
|
||||
rideVehicleEntry->var_0E = eax & 0xFF;
|
||||
rideVehicleEntry->var_0F = bl;
|
||||
rideVehicleEntry->var_10 = bh;
|
||||
}
|
||||
|
||||
uint16 no_positions = *peep_loading_positions++;
|
||||
if (no_positions == 0xFF)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x3A))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x48;
|
||||
if (((uint16_t*)(di + esi + 0x2C))[0] & 0x4000)
|
||||
{
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x10;
|
||||
no_positions = *((uint16*)peep_loading_positions);
|
||||
peep_loading_positions += 2;
|
||||
}
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 4)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x3E))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x50;
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 8)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x42))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x74;
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 0x10)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x46))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x18;
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 0x20)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x4A))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x50;
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 0x40)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x4E))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x28;
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 0x80)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x52))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x80;
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 0x100)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x56))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x10;
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 0x200)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x5A))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x10;
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 0x400)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x5E))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x80;
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 0x800)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x62))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x10;
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 0x1000)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x66))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x50;
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 0x2000)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x36))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0xC;
|
||||
a += b;
|
||||
}
|
||||
if (((uint16_t*)(di + esi + 0x26))[0] & 0x4000)
|
||||
{
|
||||
((uint32_t*)(di + esi + 0x66))[0] = a;
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x20;
|
||||
a += b;
|
||||
rideVehicleEntry->var_61 = (uint32)peep_loading_positions;
|
||||
peep_loading_positions += no_positions;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
b = ((uint16_t*)(di + esi + 0x30))[0];
|
||||
b *= 0x24;
|
||||
a += b;
|
||||
}
|
||||
a -= a_tmp;
|
||||
((uint32_t*)(di + esi + 0x6A))[0] = a;
|
||||
a_tmp += a;
|
||||
int c = ((uint8_t*)(di + esi + 0x6E))[0];
|
||||
c *= a;
|
||||
a_tmp += c;
|
||||
if (!(((uint16_t*)(di + esi + 0x2C))[0] & 0x400))
|
||||
{
|
||||
c = a_tmp;
|
||||
b = ((uint32_t*)(di + esi + 0x32))[0];
|
||||
c -= b;
|
||||
if (((uint16_t*)(di + esi + 0x2C))[0] & 0x2000) c <<= 1;
|
||||
int d_tmp = d;
|
||||
RCT2_CALLFUNC_X(0x6847BA, &a, &b, &c, &d, &esi, &di, (int*)&ebp);
|
||||
if (((uint16_t*)(di + esi + 0x2C))[0] & 0x2000) b += 0x10;
|
||||
((uint8_t*)(di + esi + 0x28))[0] = a;
|
||||
((uint8_t*)(di + esi + 0x29))[0] = b & 0xFF;
|
||||
((uint8_t*)(di + esi + 0x2A))[0] = (b >> 8) & 0xFF;
|
||||
d = d_tmp;
|
||||
}
|
||||
a = ((uint8_t*)ebp)[0];
|
||||
ebp++;
|
||||
if (a == 0xFF)
|
||||
{
|
||||
a = ((uint16_t*)ebp)[0];
|
||||
ebp += 2;
|
||||
}
|
||||
((uint32_t*)(di + esi + 0x7B))[0] = (uint32_t)ebp;
|
||||
ebp += a;
|
||||
}
|
||||
d++;
|
||||
di += 0x65;
|
||||
if (d >= 4) break;
|
||||
}
|
||||
|
||||
// 0x6DEB71
|
||||
if (RCT2_GLOBAL(0x9ADAFD, uint8_t) == 0)
|
||||
{
|
||||
a = 0;
|
||||
while (true)
|
||||
{
|
||||
int d = ((uint8_t*)(a + esi + 0xC))[0];
|
||||
if (d != 0xFF)
|
||||
{
|
||||
uint8_t* di = (uint8_t*)0x9E32F8;
|
||||
while (true)
|
||||
{
|
||||
if (di[0] != 0xFF)
|
||||
{
|
||||
di++;
|
||||
continue;
|
||||
for (int i = 0; i < 3; ++i){
|
||||
sint16 dl = (&ride_type->var_00C)[i];
|
||||
|
||||
if (dl == 0xFF)continue;
|
||||
|
||||
uint8 *typeToRideEntryIndexMap = RCT2_ADDRESS(0x009E32F8, uint8);
|
||||
|
||||
while (dl >= 0){
|
||||
if (*typeToRideEntryIndexMap++ == 0xFF)dl--;
|
||||
}
|
||||
d--;
|
||||
if (d < 0) break;
|
||||
di++;
|
||||
}
|
||||
d = b_tmp;
|
||||
while (true)
|
||||
{
|
||||
int tmp = di[0];
|
||||
di[0] = d;
|
||||
d = tmp;
|
||||
di++;
|
||||
if ((uint32_t)di >= 0x9E34E4) break;
|
||||
|
||||
typeToRideEntryIndexMap--;
|
||||
uint8 previous_entry = ebx;
|
||||
while (typeToRideEntryIndexMap < RCT2_ADDRESS(0x9E34E4, uint8)){
|
||||
uint8 backup_entry = *typeToRideEntryIndexMap;
|
||||
*typeToRideEntryIndexMap++ = previous_entry;
|
||||
previous_entry = backup_entry;
|
||||
}
|
||||
}
|
||||
a++;
|
||||
if (a >= 3) break;
|
||||
}
|
||||
}
|
||||
if (RCT2_GLOBAL(0x9ADAF4, uint32_t) != 0xFFFFFFFF) RCT2_GLOBAL(0x9ADAF4, uint16_t*)[0] = 0;
|
||||
di = ((uint32_t*)(esi + 0xC))[0] & 0xFFFFFF;
|
||||
if (((uint32_t*)(esi + 8))[0] & 0x1000) di |= 0x1000000;
|
||||
RCT2_GLOBAL(0xF433DD, uint32_t) = di;
|
||||
|
||||
// 0x6DEBAA
|
||||
if (RCT2_GLOBAL(0x9ADAF4, sint32) != 0xFFFFFFFF) *RCT2_GLOBAL(0x9ADAF4, uint16*) = 0;
|
||||
|
||||
int di = ride_type->var_00C | (ride_type->var_00D << 8) | (ride_type->var_00E << 16);
|
||||
|
||||
if (ride_type->var_008 & 0x1000) di |= 0x1000000;
|
||||
|
||||
RCT2_GLOBAL(0xF433DD, uint32) = di;
|
||||
return 0;// flags;
|
||||
}
|
||||
else
|
||||
{
|
||||
int d = 0;
|
||||
int di = 0;
|
||||
while (true)
|
||||
{
|
||||
/*if (!(((uint16_t*)(di + esi + 0x26))[0] & 1))*/
|
||||
d++;
|
||||
di += 0x65;
|
||||
if (d >= 4) break;
|
||||
else if ((flags & 0xFF) == 1){
|
||||
// Object Unload
|
||||
|
||||
rct_ride_type* ride_type = (rct_ride_type*)esi;
|
||||
ride_type->name = 0;
|
||||
ride_type->description = 0;
|
||||
ride_type->images_offset = 0;
|
||||
|
||||
for (int i = 0; i < 4; ++i){
|
||||
rct_ride_type_vehicle* rideVehicleEntry = &ride_type->vehicles[i];
|
||||
|
||||
rideVehicleEntry->base_image_id = 0;
|
||||
rideVehicleEntry->var_1C = 0;
|
||||
rideVehicleEntry->var_20 = 0;
|
||||
rideVehicleEntry->var_24 = 0;
|
||||
rideVehicleEntry->var_28 = 0;
|
||||
rideVehicleEntry->var_2C = 0;
|
||||
rideVehicleEntry->var_30 = 0;
|
||||
rideVehicleEntry->var_34 = 0;
|
||||
rideVehicleEntry->var_38 = 0;
|
||||
rideVehicleEntry->var_3C = 0;
|
||||
rideVehicleEntry->var_40 = 0;
|
||||
rideVehicleEntry->var_44 = 0;
|
||||
rideVehicleEntry->var_48 = 0;
|
||||
rideVehicleEntry->var_4C = 0;
|
||||
rideVehicleEntry->no_vehicle_images = 0;
|
||||
rideVehicleEntry->var_16 = 0;
|
||||
|
||||
if (rideVehicleEntry->var_12 & 0x400){
|
||||
rideVehicleEntry->var_0E = 0;
|
||||
rideVehicleEntry->var_0F = 0;
|
||||
rideVehicleEntry->var_10 = 0;
|
||||
}
|
||||
if (((uint8_t*)(esi + 0x1B2))[0] > 0x4B) return 1;
|
||||
if (((uint8_t*)(esi + 0x1B3))[0] > 0x4B) return 1;
|
||||
if (((uint8_t*)(esi + 0x1B4))[0] > 0x4B) return 1;
|
||||
rideVehicleEntry->var_02 = 0;
|
||||
rideVehicleEntry->var_03 = 0;
|
||||
rideVehicleEntry->var_61 = 0;
|
||||
}
|
||||
|
||||
ride_type->var_1AE = 0;
|
||||
return flags;
|
||||
}
|
||||
else if ((flags & 0xFF) == 2){
|
||||
|
||||
rct_ride_type* ride_type = (rct_ride_type*)esi;
|
||||
|
||||
if (ride_type->excitement_multipler > 75) return 1;
|
||||
if (ride_type->intensity_multipler > 75) return 1;
|
||||
if (ride_type->nausea_multipler > 75) return 1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
((rct_ride_type*)esi)->name = 0;
|
||||
((rct_ride_type*)esi)->description = 0;
|
||||
((rct_ride_type*)esi)->var_004 = 0;
|
||||
int d = 0;
|
||||
int di = 0;
|
||||
while (true)
|
||||
{
|
||||
((uint32_t*)(esi + di + 0x32))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x36))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x3A))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x3E))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x42))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x46))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x4A))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x4E))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x52))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x56))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x5A))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x5E))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x66))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x62))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x6A))[0] = 0;
|
||||
((uint16_t*)(esi + di + 0x30))[0] = 0;
|
||||
if (((uint16_t*)(esi + di + 0x2C))[0] & 0x400)
|
||||
{
|
||||
((uint8_t*)(esi + di + 0x28))[0] = 0;
|
||||
((uint8_t*)(esi + di + 0x29))[0] = 0;
|
||||
((uint8_t*)(esi + di + 0x2A))[0] = 0;
|
||||
}
|
||||
((uint8_t*)(esi + di + 0x1C))[0] = 0;
|
||||
((uint8_t*)(esi + di + 0x1D))[0] = 0;
|
||||
((uint32_t*)(esi + di + 0x7B))[0] = 0;
|
||||
d++;
|
||||
di += 0x65;
|
||||
if (d >= 4) break;
|
||||
}
|
||||
((uint32_t*)(esi + 0x1AE))[0] = 0;
|
||||
return flags;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
else if ((flags & 0xFF) == 3){
|
||||
// Paint object picture and description
|
||||
|
||||
rct_ride_type* ride_type = (rct_ride_type*)ebp;
|
||||
int x = ecx, y = edx;
|
||||
|
||||
if (!((flags >> 8) & 0xFF))
|
||||
{
|
||||
int image_id = ((rct_ride_type*)ebp)->var_004;
|
||||
if (((rct_ride_type*)ebp)->var_00C == 0xFF)
|
||||
int image_id = ride_type->images_offset;
|
||||
if (ride_type->var_00C == 0xFF)
|
||||
{
|
||||
image_id++;
|
||||
if (((rct_ride_type*)ebp)->var_00D == 0xFF) image_id++;
|
||||
if (ride_type->var_00D == 0xFF) image_id++;
|
||||
}
|
||||
gfx_draw_sprite(dpi, image_id, ecx - 56, edx - 56, ebp);
|
||||
gfx_draw_sprite(dpi, image_id, x - 56, y - 56, ebp);
|
||||
return flags;
|
||||
}
|
||||
else
|
||||
{
|
||||
int width = ((uint16_t*)(esi + 0x30))[0];
|
||||
width += ((uint16_t*)(esi + 0x2C))[0];
|
||||
width -= ecx;
|
||||
width -= 4;
|
||||
int format_args = ((rct_ride_type*)ebp)->description;
|
||||
if (!(((rct_ride_type*)ebp)->var_008 & 0x1000))
|
||||
rct_window* w = (rct_window*)esi;
|
||||
int width = w->x + w->width - x - 4;
|
||||
|
||||
int format_args = ride_type->description;
|
||||
if (!(ride_type->var_008 & 0x1000))
|
||||
{
|
||||
format_args = ((rct_ride_type*)ebp)->var_00C;
|
||||
format_args = ride_type->var_00C;
|
||||
if ((format_args & 0xFF) == 0xFF)
|
||||
{
|
||||
format_args = ((rct_ride_type*)ebp)->var_00D;
|
||||
if ((format_args & 0xFF) == 0xFF) format_args = ((rct_ride_type*)ebp)->var_00E;
|
||||
format_args = ride_type->var_00D;
|
||||
if ((format_args & 0xFF) == 0xFF) format_args = ride_type->var_00E;
|
||||
}
|
||||
format_args += 0x200;
|
||||
}
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, short) = format_args;
|
||||
gfx_draw_string_left_wrapped(dpi, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, ecx, edx + 5, width, 1191, 0);
|
||||
gfx_draw_string_left_wrapped(dpi, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS, x, y + 5, width, 1191, 0);
|
||||
return flags;
|
||||
}
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
//rct2: 0x006A8621
|
||||
|
@ -800,7 +789,8 @@ int paint_path_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp
|
|||
{
|
||||
uint8_t* pStringTable = (uint8_t*)(esi + 0xE);
|
||||
((rct_path_type*)esi)->pad_00 = object_get_localised_text(&pStringTable, ecx, ebx, 0);
|
||||
int image_id = sub_6A9ED1(&pStringTable);
|
||||
|
||||
int image_id = object_chunk_load_image_directory(&pStringTable);
|
||||
((rct_path_type*)esi)->image = image_id;
|
||||
image_id += 0x6D;
|
||||
((rct_path_type*)esi)->pad_06 = image_id;
|
||||
|
@ -859,7 +849,7 @@ int paint_park_entrance_entry(int flags, int ebx, int ecx, int edx, rct_drawpixe
|
|||
{
|
||||
uint8_t* pStringTable = (uint8_t*)(esi + 8);
|
||||
((rct_string_id*)esi)[0] = object_get_localised_text(&pStringTable, ecx, ebx, 0);
|
||||
int image_id = sub_6A9ED1(&pStringTable);
|
||||
int image_id = object_chunk_load_image_directory(&pStringTable);
|
||||
((uint32_t*)(esi + 2))[0] = image_id;
|
||||
if (RCT2_GLOBAL(0x9ADAF4, uint32_t) != 0xFFFFFFFF) RCT2_GLOBAL(0x9ADAF4, uint16_t*)[0] = 0;
|
||||
return flags;
|
||||
|
@ -903,7 +893,7 @@ int paint_water_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* d
|
|||
{
|
||||
uint8_t* pStringTable = (uint8_t*)(esi + 0x10);
|
||||
((rct_string_id*)esi)[0] = object_get_localised_text(&pStringTable, ecx, ebx, 0);
|
||||
int image_id = sub_6A9ED1(&pStringTable);
|
||||
int image_id = object_chunk_load_image_directory(&pStringTable);
|
||||
((uint32_t*)(esi + 2))[0] = image_id;
|
||||
image_id++;
|
||||
((uint32_t*)(esi + 6))[0] = image_id;
|
||||
|
|
|
@ -46,6 +46,50 @@ typedef struct {
|
|||
uint8 entry_index;
|
||||
} ride_list_item;
|
||||
|
||||
/**
|
||||
* Ride type vehicle structure.
|
||||
* size: 0x65
|
||||
*/
|
||||
typedef struct{
|
||||
uint16 var_00; // 0x00 , 0x1A
|
||||
uint8 var_02; // 0x02 , 0x1C
|
||||
uint8 var_03; // 0x03 , 0x1D
|
||||
uint32 var_04; // 0x04 , 0x1E
|
||||
uint16 var_08; // 0x08 , 0x22
|
||||
sint8 var_0A; // 0x0A , 0x24
|
||||
uint8 pad_0B;
|
||||
uint16 var_0C; // 0x0C , 0x26
|
||||
uint8 var_0E; // 0x0E , 0x28
|
||||
uint8 var_0F; // 0x0F , 0x29
|
||||
uint8 var_10; // 0x10 , 0x2A
|
||||
uint8 var_11; // 0x11 , 0x2B
|
||||
uint16 var_12; // 0x12 , 0x2C
|
||||
uint16 var_14; // 0x14 , 0x2E
|
||||
uint16 var_16; // 0x16 , 0x30
|
||||
uint32 base_image_id; // 0x18 , 0x32
|
||||
uint32 var_1C; // 0x1C , 0x36
|
||||
uint32 var_20; // 0x20 , 0x3A
|
||||
uint32 var_24; // 0x24 , 0x3E
|
||||
uint32 var_28; // 0x28 , 0x42
|
||||
uint32 var_2C; // 0x2C , 0x46
|
||||
uint32 var_30; // 0x30 , 0x4A
|
||||
uint32 var_34; // 0x34 , 0x4E
|
||||
uint32 var_38; // 0x38 , 0x52
|
||||
uint32 var_3C; // 0x3C , 0x56
|
||||
uint32 var_40; // 0x40 , 0x5A
|
||||
uint32 var_44; // 0x44 , 0x5E
|
||||
uint32 var_48; // 0x48 , 0x62
|
||||
uint32 var_4C; // 0x4C , 0x66
|
||||
uint32 no_vehicle_images; // 0x50 , 0x6A
|
||||
uint8 no_seating_rows; // 0x54 , 0x6E
|
||||
uint8 pad_55[0x7];
|
||||
uint8 var_5C; // 0x5C , 0x76
|
||||
uint8 var_5D; // 0x5D , 0x77
|
||||
uint8 pad_5E[0x2];
|
||||
uint8 var_60; // 0x60 , 0x7A
|
||||
uint32 var_61; // 0x61 , 0x7B
|
||||
} rct_ride_type_vehicle;
|
||||
|
||||
/**
|
||||
* Ride type structure.
|
||||
* size: unknown
|
||||
|
@ -53,8 +97,9 @@ typedef struct {
|
|||
typedef struct {
|
||||
rct_string_id name; // 0x000
|
||||
rct_string_id description; // 0x002
|
||||
uint32 var_004;
|
||||
uint32 images_offset; // 0x004
|
||||
uint32 var_008;
|
||||
// 0xC, D, E are related
|
||||
uint8 var_00C;
|
||||
uint8 var_00D;
|
||||
uint8 var_00E;
|
||||
|
@ -63,7 +108,9 @@ typedef struct {
|
|||
uint8 var_011;
|
||||
uint8 var_012;
|
||||
uint8 var_013;
|
||||
uint8 pad_014[0x19E];
|
||||
uint8 pad_014[0x6];
|
||||
rct_ride_type_vehicle vehicles[4]; // 0x1A
|
||||
uint32 var_1AE;
|
||||
sint8 excitement_multipler; // 0x1B2
|
||||
sint8 intensity_multipler; // 0x1B3
|
||||
sint8 nausea_multipler; // 0x1B4
|
||||
|
|
|
@ -228,7 +228,6 @@ static void ride_race_init_vehicle_speeds(rct_ride *ride)
|
|||
{
|
||||
rct_ride_type *rideEntry;
|
||||
rct_vehicle *vehicle;
|
||||
uint8 *unk;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ride->num_vehicles; i++) {
|
||||
|
@ -236,9 +235,8 @@ static void ride_race_init_vehicle_speeds(rct_ride *ride)
|
|||
vehicle->var_48 &= ~(1 << 6);
|
||||
|
||||
rideEntry = GET_RIDE_ENTRY(vehicle->var_D6);
|
||||
unk = (uint8*)((int)rideEntry + (vehicle->var_31 * 0x65));
|
||||
|
||||
vehicle->speed = (scenario_rand() & 16) - 8 + RCT2_GLOBAL(unk + 0x76, uint8);
|
||||
vehicle->speed = (scenario_rand() & 16) - 8 + rideEntry->vehicles[vehicle->var_31].var_5C;
|
||||
|
||||
if (vehicle->num_peeps != 0) {
|
||||
rct_peep *peep = &g_sprite_list[vehicle->peep[0]].peep;
|
||||
|
|
|
@ -849,13 +849,13 @@ static void window_new_ride_scrollpaint()
|
|||
|
||||
// Draw ride image
|
||||
rideEntry = rideEntries[listItem->entry_index];
|
||||
int unk = rideEntry->var_004;
|
||||
int image_id = rideEntry->images_offset;
|
||||
if (listItem->type != rideEntry->var_00C) {
|
||||
unk++;
|
||||
image_id++;
|
||||
if (listItem->type != rideEntry->var_00D)
|
||||
unk++;
|
||||
image_id++;
|
||||
}
|
||||
RCT2_CALLPROC_X(0x00681DE2, 0, 29013, x + 2, y + 2, 0xA0, (int)dpi, unk);
|
||||
RCT2_CALLPROC_X(0x00681DE2, 0, 29013, x + 2, y + 2, 0xA0, (int)dpi, image_id);
|
||||
|
||||
// Next position
|
||||
x += 116;
|
||||
|
|
|
@ -996,7 +996,6 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w)
|
|||
rct_ride *ride;
|
||||
rct_widget *widget;
|
||||
int widgetIndex, spriteIndex, x, y, width, height;
|
||||
uint8 *ebp;
|
||||
rct_ride_type *rideEntry;
|
||||
vehicle_colour vehicleColour;
|
||||
|
||||
|
@ -1035,18 +1034,18 @@ static void window_ride_draw_tab_vehicle(rct_drawpixelinfo *dpi, rct_window *w)
|
|||
dpi->y *= 2;
|
||||
}
|
||||
|
||||
ebp = (uint8*)rideEntry + (RCT2_ADDRESS(0x00F64E38, uint8)[rideEntry->var_013] * 101);
|
||||
height += RCT2_GLOBAL(ebp + 0x24, sint8);
|
||||
rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[RCT2_ADDRESS(0x00F64E38, uint8)[rideEntry->var_013]];
|
||||
height += rideVehicleEntry->var_0A;
|
||||
|
||||
vehicleColour = ride_get_vehicle_colour(ride, 0);
|
||||
|
||||
spriteIndex = 32;
|
||||
if (w->page == WINDOW_RIDE_PAGE_VEHICLE)
|
||||
spriteIndex += w->frame_no;
|
||||
spriteIndex /= (RCT2_GLOBAL(ebp + 0x2C, uint16) & 0x800) ? 4 : 2;
|
||||
spriteIndex &= RCT2_GLOBAL(ebp + 0x1A, uint16);
|
||||
spriteIndex *= RCT2_GLOBAL(ebp + 0x30, uint16);
|
||||
spriteIndex += RCT2_GLOBAL(ebp + 0x32, uint32);
|
||||
spriteIndex /= (rideVehicleEntry->var_12 & 0x800) ? 4 : 2;
|
||||
spriteIndex &= rideVehicleEntry->var_00;
|
||||
spriteIndex *= rideVehicleEntry->var_16;
|
||||
spriteIndex += rideVehicleEntry->base_image_id;
|
||||
spriteIndex |= (vehicleColour.additional_1 << 24) | (vehicleColour.main << 19);
|
||||
spriteIndex |= 0x80000000;
|
||||
|
||||
|
@ -2510,7 +2509,7 @@ static void window_ride_vehicle_scrollpaint()
|
|||
rct_ride *ride;
|
||||
rct_ride_type *rideEntry;
|
||||
rct_widget *widget;
|
||||
int x, y, startX, startY, i, j, vehicleColourIndex, spriteIndex, ebp;
|
||||
int x, y, startX, startY, i, j, vehicleColourIndex, spriteIndex;
|
||||
rct_vehichle_paintinfo *nextSpriteToDraw, *current, tmp;
|
||||
vehicle_colour vehicleColour;
|
||||
|
||||
|
@ -2528,8 +2527,8 @@ static void window_ride_vehicle_scrollpaint()
|
|||
startX = max(2, ((widget->right - widget->left) - ((ride->num_vehicles - 1) * 36)) / 2 - 25);
|
||||
startY = widget->bottom - widget->top - 4;
|
||||
|
||||
ebp = (int)rideEntry + (RCT2_ADDRESS(0x00F64E38, uint8)[0] * 101);
|
||||
startY += RCT2_GLOBAL(ebp + 0x24, sint8);
|
||||
rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[RCT2_ADDRESS(0x00F64E38, uint8)[0]];
|
||||
startY += rideVehicleEntry->var_0A;
|
||||
|
||||
// For each train
|
||||
for (i = 0; i < ride->num_vehicles; i++) {
|
||||
|
@ -2539,9 +2538,9 @@ static void window_ride_vehicle_scrollpaint()
|
|||
|
||||
// For each car in train
|
||||
for (j = 0; j < ride->num_cars_per_train; j++) {
|
||||
int ebp = (int)rideEntry + (RCT2_ADDRESS(0x00F64E38, uint8)[j] * 101);
|
||||
x += RCT2_GLOBAL(ebp + 0x1E, uint32) / 17432;
|
||||
y -= (RCT2_GLOBAL(ebp + 0x1E, uint32) / 2) / 17432;
|
||||
rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[RCT2_ADDRESS(0x00F64E38, uint8)[j]];
|
||||
x += rideVehicleEntry->var_04 / 17432;
|
||||
y -= (rideVehicleEntry->var_04 / 2) / 17432;
|
||||
|
||||
// Get colour of vehicle
|
||||
switch (ride->colour_scheme_type & 3) {
|
||||
|
@ -2558,12 +2557,12 @@ static void window_ride_vehicle_scrollpaint()
|
|||
vehicleColour = ride_get_vehicle_colour(ride, vehicleColourIndex);
|
||||
|
||||
spriteIndex = 16;
|
||||
if (RCT2_GLOBAL(ebp + 0x2C, uint16) & 0x800)
|
||||
if (rideVehicleEntry->var_12 & 0x800)
|
||||
spriteIndex /= 2;
|
||||
|
||||
spriteIndex &= RCT2_GLOBAL(ebp + 0x1A, uint16);
|
||||
spriteIndex *= RCT2_GLOBAL(ebp + 0x30, uint16);
|
||||
spriteIndex += RCT2_GLOBAL(ebp + 0x32, uint32);
|
||||
spriteIndex &= rideVehicleEntry->var_00;
|
||||
spriteIndex *= rideVehicleEntry->var_16;
|
||||
spriteIndex += rideVehicleEntry->base_image_id;
|
||||
spriteIndex |= (vehicleColour.additional_1 << 24) | (vehicleColour.main << 19);
|
||||
spriteIndex |= 0x80000000;
|
||||
|
||||
|
@ -2573,8 +2572,8 @@ static void window_ride_vehicle_scrollpaint()
|
|||
nextSpriteToDraw->tertiary_colour = vehicleColour.additional_2;
|
||||
nextSpriteToDraw++;
|
||||
|
||||
x += RCT2_GLOBAL(ebp + 0x1E, uint32) / 17432;
|
||||
y -= (RCT2_GLOBAL(ebp + 0x1E, uint32) / 2) / 17432;
|
||||
x += rideVehicleEntry->var_04 / 17432;
|
||||
y -= (rideVehicleEntry->var_04 / 2) / 17432;
|
||||
}
|
||||
|
||||
if (ride->type == RIDE_TYPE_REVERSER_ROLLER_COASTER) {
|
||||
|
@ -3947,9 +3946,9 @@ static void window_ride_colour_invalidate()
|
|||
uint8 *unk;
|
||||
uint32 unk_eax = 0;
|
||||
for (unk = (uint8*)0x00F64E38; *unk != 0xFF; unk++) {
|
||||
unk_eax |= RCT2_GLOBAL((int)rideEntry + 0x2E + (*unk * 101), uint16);
|
||||
unk_eax |= rideEntry->vehicles[*unk].var_14;
|
||||
unk_eax = ror32(unk_eax, 16);
|
||||
unk_eax |= RCT2_GLOBAL((int)rideEntry + 0x2C + (*unk * 101), uint16);
|
||||
unk_eax |= rideEntry->vehicles[*unk].var_12;
|
||||
unk_eax = ror32(unk_eax, 16);
|
||||
}
|
||||
|
||||
|
@ -4115,7 +4114,6 @@ static void window_ride_colour_scrollpaint()
|
|||
rct_ride *ride;
|
||||
rct_ride_type *rideEntry;
|
||||
rct_widget *vehiclePreviewWidget;
|
||||
uint8 *unk;
|
||||
int colour, x, y, spriteIndex;
|
||||
vehicle_colour vehicleColour;
|
||||
|
||||
|
@ -4137,16 +4135,16 @@ static void window_ride_colour_scrollpaint()
|
|||
// ?
|
||||
colour = (ride->colour_scheme_type & 3) == RIDE_COLOUR_SCHEME_DIFFERENT_PER_CAR ?
|
||||
w->var_48C : rideEntry->var_013;
|
||||
colour = RCT2_ADDRESS(0x00F64E38, uint8)[colour];
|
||||
unk = (uint8*)rideEntry + (colour * 101);
|
||||
|
||||
y += RCT2_GLOBAL(unk + 0x24, sint8);
|
||||
rct_ride_type_vehicle* rideVehicleEntry = &rideEntry->vehicles[RCT2_ADDRESS(0x00F64E38, uint8)[colour]];
|
||||
|
||||
y += rideVehicleEntry->var_0A;
|
||||
|
||||
// Draw the coloured spinning vehicle
|
||||
spriteIndex = RCT2_GLOBAL(unk + 0x2C, uint8) & 0x800 ? w->frame_no / 4 : w->frame_no / 2;
|
||||
spriteIndex &= RCT2_GLOBAL(unk + 0x1A, uint16);
|
||||
spriteIndex *= RCT2_GLOBAL(unk + 0x30, uint16);
|
||||
spriteIndex += RCT2_GLOBAL(unk + 0x32, uint32);
|
||||
spriteIndex = rideVehicleEntry->var_12 & 0x800 ? w->frame_no / 4 : w->frame_no / 2;
|
||||
spriteIndex &= rideVehicleEntry->var_00;
|
||||
spriteIndex *= rideVehicleEntry->var_16;
|
||||
spriteIndex += rideVehicleEntry->base_image_id;
|
||||
spriteIndex |= (vehicleColour.additional_1 << 24) | (vehicleColour.main << 19);
|
||||
spriteIndex |= 0x80000000;
|
||||
gfx_draw_sprite(dpi, spriteIndex, x, y, vehicleColour.additional_2);
|
||||
|
|
Loading…
Reference in New Issue