From d36807333aa23abe29e6096230c9fe333f7f101a Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Mon, 2 Mar 2015 18:21:32 +0000 Subject: [PATCH] Implemented paint_large_scenery --- src/object.c | 84 ++++++++++++++++++++++++++++++++++++++++++++- src/world/scenery.h | 7 ++-- 2 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/object.c b/src/object.c index 69b1f465c8..fd4e658a18 100644 --- a/src/object.c +++ b/src/object.c @@ -883,9 +883,91 @@ int paint_small_scenery(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* return flags; } +/* rct2: 0x006B92A7 */ int paint_large_scenery(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dpi, int esi, int ebp) { - return RCT2_CALLPROC_X(0x006B92A7, flags, ebx, ecx, edx, esi, (int)dpi, ebp) & 0x100; + if ((flags & 0xFF) == 0){ + // Object Load + + rct_scenery_entry* scenery_type = (rct_scenery_entry*)esi; + uint8* chunk = (uint8*)(esi + 0x1A); + + scenery_type->name = object_get_localised_text(&chunk, ecx, ebx, 0); + + scenery_type->large_scenery.scenery_tab_id = 0xFF; + + if (*chunk != 0xFF){ + uint8 entry_type, entry_index; + if (find_object_in_entry_group((rct_object_entry*)chunk, &entry_type, &entry_index)){ + scenery_type->large_scenery.scenery_tab_id = entry_index; + } + } + + chunk += sizeof(rct_object_entry); + + if (scenery_type->large_scenery.flags & (1<<2)){ + scenery_type->large_scenery.var_12 = (uint32)chunk; + chunk += 1038; + } + + scenery_type->large_scenery.var_0C = (uint32)chunk; + + while (*((uint16*)chunk) != 0xFFFF){ + chunk += 9; + } + + chunk += 2; + + int image_id = object_chunk_load_image_directory(&chunk); + if (scenery_type->large_scenery.flags & (1 << 2)){ + scenery_type->large_scenery.var_16 = image_id; + + if (!(scenery_type->large_scenery.var_0C & 1)){ + image_id += *((uint8*)(scenery_type->large_scenery.var_12 + 0xD)) * 4; + } + else{ + image_id += *((uint8*)(scenery_type->large_scenery.var_12 + 0xD)) * 2; + } + } + scenery_type->image = image_id; + + if (RCT2_GLOBAL(0x9ADAF4, uint32) != 0xFFFFFFFF) *RCT2_GLOBAL(0x9ADAF4, uint16*) = 0; + } + else if ((flags & 0xFF) == 1){ + // Object Unload + + rct_scenery_entry* scenery_type = (rct_scenery_entry*)esi; + scenery_type->name = 0; + scenery_type->image = 0; + scenery_type->large_scenery.var_0C = 0; + scenery_type->large_scenery.scenery_tab_id = 0; + scenery_type->large_scenery.var_12 = 0; + scenery_type->large_scenery.var_16 = 0; + } + else if ((flags & 0xFF) == 2){ + rct_scenery_entry* scenery_type = (rct_scenery_entry*)esi; + + if (scenery_type->large_scenery.price <= 0)return 1; + + if (scenery_type->large_scenery.removal_price > 0) return 0; + + // Make sure you don't make a profit when placing then removing. + if (-scenery_type->large_scenery.removal_price > scenery_type->large_scenery.price)return 1; + + return 0; + } + else if ((flags & 0xFF) == 3){ + int x = ecx, y = edx; + if (!((flags >> 8) & 0xFF)) + { + rct_scenery_entry* scenery_type = (rct_scenery_entry*)ebp; + + int image_id = scenery_type->image | 0xB2D00000; + + gfx_draw_sprite(dpi, image_id, x, y - 39, 0); + } + } + return flags; } int paint_wall(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dpi, int esi, int ebp) diff --git a/src/world/scenery.h b/src/world/scenery.h index 6c52bed26f..21db53e682 100644 --- a/src/world/scenery.h +++ b/src/world/scenery.h @@ -60,10 +60,13 @@ typedef enum { typedef struct { uint8 tool_id; // 0x06 uint8 flags; // 0x07 - uint16 price; // 0x08 - uint8 pad_0A[6]; + sint16 price; // 0x08 + sint16 removal_price; + uint32 var_0C; uint8 scenery_tab_id; // 0x10 uint8 var_11; + uint32 var_12; + uint32 var_16; } rct_large_scenery_entry;