From 2cdbff80f6c8b43f63476cab49771b684d19c9db Mon Sep 17 00:00:00 2001 From: Gericom Date: Tue, 3 Mar 2015 18:01:30 +0100 Subject: [PATCH 01/19] Implemented some viewport drawing functions - sub_68B35F - viewport_banner_paint_setup -- This function is complete, but as long as 0x6C42D9 is not complete it will cause glitches in the rendering of banners, because the wrong (because localized) string length is used for calculating the scroll position --- src/interface/viewport.c | 414 +++++++++++++++++++++++++++++++-------- 1 file changed, 334 insertions(+), 80 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 74617ed1a0..de6fc798e2 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -1,9 +1,9 @@ /***************************************************************************** * Copyright (c) 2014 Ted John * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. - * + * * This file is part of OpenRCT2. - * + * * OpenRCT2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -25,6 +25,8 @@ #include "../sprites.h" #include "../world/map.h" #include "../world/sprite.h" +#include "../world/banner.h" +#include "../world/scenery.h" #include "viewport.h" #include "window.h" @@ -106,7 +108,7 @@ void viewport_init_all() * z : cx * out_x : ax * out_y : bx - * Converts between 3d point of a sprite to 2d coordinates for centering on that sprite + * Converts between 3d point of a sprite to 2d coordinates for centering on that sprite */ void center_2d_coordinates(int x, int y, int z, int* out_x, int* out_y, rct_viewport* viewport){ int start_x = x; @@ -130,8 +132,8 @@ void center_2d_coordinates(int x, int y, int z, int* out_x, int* out_y, rct_view break; } - *out_x = x - viewport->view_width/2; - *out_y = y - viewport->view_height/2; + *out_x = x - viewport->view_width / 2; + *out_y = y - viewport->view_height / 2; } /** @@ -205,7 +207,7 @@ void viewport_create(rct_window *w, int x, int y, int width, int height, int zoo } /** - * + * * rct2: 0x006EE510 */ void viewport_update_pointers() @@ -381,7 +383,7 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ } if (viewport->width <= 0){ - memcpy( viewport, &view_copy,sizeof(rct_viewport)); + memcpy(viewport, &view_copy, sizeof(rct_viewport)); return; } @@ -431,7 +433,7 @@ void viewport_set_underground_flag(int underground, rct_window* window, rct_view } /** - * + * * rct2: 0x006E7A3A */ void viewport_update_position(rct_window *window) @@ -467,7 +469,7 @@ void viewport_update_position(rct_window *window) int curr_rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); sub_689174(&x, &y, &z, curr_rotation); - + viewport_set_underground_flag(0, window, viewport); //RCT2_CALLPROC_X(0x006E7A15, x, y, z, 0, (int)window, (int)viewport, 0); @@ -498,7 +500,7 @@ void viewport_update_position(rct_window *window) int z = map_element_height(x & 0xFFFF, y & 0xFFFF); int _2d_x, _2d_y; center_2d_coordinates(x, y, z, &_2d_x, &_2d_y, viewport); - + if (window->saved_view_x > 0){ _2d_x = min(_2d_x, window->saved_view_x); } @@ -532,8 +534,8 @@ void viewport_update_position(rct_window *window) y = -y; flags |= 2; } - x = (x + 7)/8; - y = (y + 7)/8; + x = (x + 7) / 8; + y = (y + 7) / 8; //If we are at the final zoom position if (!x && !y){ @@ -554,7 +556,7 @@ void viewport_update_position(rct_window *window) } /** - * + * * rct2: 0x00685C02 * ax: left * bx: top @@ -567,8 +569,8 @@ void viewport_render(rct_drawpixelinfo *dpi, rct_viewport *viewport, int left, i { if (right <= viewport->x) return; if (bottom <= viewport->y) return; - if (left >= viewport->x + viewport->width )return; - if (top >= viewport->y + viewport->height )return; + if (left >= viewport->x + viewport->width)return; + if (top >= viewport->y + viewport->height)return; int l = left, t = top, r = right, b = bottom; @@ -594,8 +596,8 @@ void viewport_render(rct_drawpixelinfo *dpi, rct_viewport *viewport, int left, i top += 384; } //Paint - viewport_paint(viewport, dpi, left, top, right, bottom); - + viewport_paint(viewport, dpi, left, top, right, bottom); + #ifdef DEBUG_SHOW_DIRTY_BOX if (viewport != g_viewport_list){ gfx_fill_rect_inset(dpi, l, t, r-1, b-1, 0x2, 0x30); @@ -605,7 +607,7 @@ void viewport_render(rct_drawpixelinfo *dpi, rct_viewport *viewport, int left, i } /** -* +* * rct2: 0x0068615B * ebp: ebp */ @@ -708,7 +710,7 @@ void sub_688485(){ if (!(ps->var_1A & 1)) gfx_draw_sprite(dpi, image_id, x, y, ps->var_04); else - RCT2_CALLPROC_X(0x00681DE2, 0, image_id, x, y, 0, (int)dpi, ps->var_04); + RCT2_CALLPROC_X(0x00681DE2, 0, image_id, x, y, 0, (int)dpi, ps->var_04); if (ps->var_20 != 0){ ps = ps->var_20; @@ -759,7 +761,7 @@ void sub_0x6736FC(rct_litter* litter, int ebx, int edx){ RCT2_GLOBAL(0x9DEA54, uint16) = 0xFFFC; RCT2_GLOBAL(0x9DEA56, uint16) = edx + 2; - switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION,uint32)){ + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32)){ case 0: //0x686806 break; @@ -785,19 +787,19 @@ void sub_0x69E8B0(uint32 eax, uint32 ecx){ rct_drawpixelinfo* dpi; - if (RCT2_GLOBAL(0x9DEA6F,uint8) & 1) return; - - dpi = RCT2_GLOBAL(0x140E9A8,rct_drawpixelinfo*); - + if (RCT2_GLOBAL(0x9DEA6F, uint8) & 1) return; + + dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & 0x4000)return; - + if (dpi->zoom_level > 2) return; - + if (eax > 0x2000)return; if (ecx > 0x2000)return; - + //push eax, ecx - eax = (eax&0x1FE0)<<3 | (ecx>>5); + eax = (eax & 0x1FE0) << 3 | (ecx >> 5); int sprite_idx = RCT2_ADDRESS(0xF1EF60, uint16)[eax]; if (sprite_idx == SPRITE_INDEX_NULL) return; @@ -844,6 +846,258 @@ void sub_0x69E8B0(uint32 eax, uint32 ecx){ //return; } +/* rct2: 0x006B9CC4 */ +//This function is complete, but as long as 0x6C42D9 is not complete +//it will cause glitches in the rendering of banners, +//because the wrong (because localized) string length is used for calculating the scroll position +void viewport_banner_paint_setup(uint32_t ecx, int edx, rct_map_element* map_element) +{ + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + RCT2_GLOBAL(0x9DE570, uint8_t) = 0xC; + if (dpi->zoom_level > 1 || RCT2_GLOBAL(0x9DEA6F, uint8_t) & 1) return; + edx -= 16; + rct_scenery_entry* banner_scenery = g_bannerSceneryEntries[gBanners[map_element->properties.banner.index].type]; + ecx += map_element->properties.banner.position; + ecx &= 3; + RCT2_GLOBAL(0x9DEA56, uint16_t) = edx + 2; + RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D884, uint32_t)[ecx * 2]; + int ebx = (ecx << 1) + banner_scenery->image; + ebx += (gBanners[map_element->properties.banner.index].colour << 19) | 0x20000000; + if (map_element->flags & 0x10) + { + RCT2_GLOBAL(0x9DE570, uint8_t) = 0; + ebx &= 0x7FFFF; + ebx |= RCT2_ADDRESS(0x993CC4, uint32_t)[RCT2_GLOBAL(0x9AACBF, uint8_t)]; + } + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x1500, ebx, 0, edx, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D888, uint32_t)[ecx * 2]; + ebx++; + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x1500, ebx, 0, edx, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + ecx ^= 2; + ecx--; + if (ecx >= 2 || (map_element->flags & 0x10)) return; + int ebp = banner_scenery->banner.var_06; + ebp += ecx; + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32_t) = 0; + RCT2_GLOBAL(0x13CE956, uint32_t) = 0; + int eax = 0xBA5; + if (!(gBanners[map_element->properties.banner.index].flags & BANNER_FLAG_NO_ENTRY)) + { + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16_t) = gBanners[map_element->properties.banner.index].string_idx; + eax = 0x6C3; + } + format_string(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), eax, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16_t) = 0x1C0; + uint16_t string_width = gfx_get_string_width(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char)); + uint16_t ticks = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32_t) >> 1; + uint16_t cx = ticks % string_width; + int a = eax, b = ebx, c = cx, d = 0, si = 0, di = 0, p = ebp; + RCT2_CALLFUNC_X(0x6C42D9, &a, &b, &c, &d, &si, &di, &p); + RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0x1500, b, 0, edx + 22, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); +} + +//rct2: 0x0068B35F +void sub_68B35F(int ax, int cx) +{ + if (ax < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16_t) && + cx < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16_t) && + ax >= 32 && cx >= 32) + { + RCT2_GLOBAL(0x141E9B4, uint32_t) = 0xFFFF; + RCT2_GLOBAL(0x141E9B8, uint32_t) = 0xFFFF; + RCT2_GLOBAL(0x141E9BC, uint32_t) = 0xFFFF; + RCT2_GLOBAL(0x141E9C0, uint32_t) = 0xFFFF; + RCT2_GLOBAL(0x141E9C4, uint32_t) = 0xFFFF; + RCT2_GLOBAL(0x141E9C8, uint32_t) = 0xFFFF; + RCT2_GLOBAL(0x141E9CC, uint32_t) = 0xFFFF; + RCT2_GLOBAL(0x141E9D0, uint32_t) = 0xFFFF; + RCT2_GLOBAL(0x141E9D4, uint32_t) = 0xFFFF; + RCT2_GLOBAL(0x141E9D8, uint32_t) = 0xFFFF; + RCT2_GLOBAL(0x141E9DC, uint32_t) = 0xFFFF; + //loc_68B3FB: Another function jumps to here. We need to split this! + RCT2_GLOBAL(0x141F56A, uint16_t) = 0; + RCT2_GLOBAL(0x9E3138, uint8_t) = 0xFF; + RCT2_GLOBAL(0x9E30B6, uint8_t) = 0xFF; + RCT2_GLOBAL(0x9E323C, uint8_t) = 0xFF; + RCT2_GLOBAL(0x9DE56A, uint16_t) = ax; + RCT2_GLOBAL(0x9DE56E, uint16_t) = cx; + RCT2_GLOBAL(0x9DE574, uint16_t) = ax; + RCT2_GLOBAL(0x9DE576, uint16_t) = cx; + int dx = cx; + int esi = dx; + esi <<= 8; + esi |= ax; + esi >>= 3; + int ax_tmp = ax; + int cx_tmp = cx; + rct_map_element* map_element = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*)[esi / 4];//8]; + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) + { + case 0: + dx = ax + cx; + break; + case 1: + ax += 32; + dx = cx - ax; + break; + case 2: + ax += 32; + cx += 32; + dx = -(ax + cx); + break; + case 3: + cx += 32; + dx = ax - cx; + break; + } + dx /= 2; + if ((RCT2_GLOBAL(RCT2_ADDRESS_MAP_SELECTION_FLAGS, uint16_t) & 4) && + RCT2_GLOBAL(0x9DE56A, uint16_t) == RCT2_GLOBAL(0x9DEA48, uint16_t) && + RCT2_GLOBAL(0x9DE56E, uint16_t) == RCT2_GLOBAL(0x9DEA4A, uint16_t)) + { + + int ebx = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t); + RCT2_GLOBAL(0x9DE568, uint16_t) = ax; + RCT2_GLOBAL(0x9DE56C, uint16_t) = cx; + int dl = RCT2_GLOBAL(0x009DEA4E, uint8_t) & 3; + ebx += dl; + ebx &= 3; + dl = RCT2_GLOBAL(0x009DEA4E, uint8_t) & 0xFC; + ebx += dl; + ebx += 0x20900C27; + int d = RCT2_GLOBAL(0x009DEA4C, uint16_t); + RCT2_GLOBAL(0x9DE570, uint8_t) = 0; + RCT2_GLOBAL(0x9DEA52, uint16_t) = 0; + RCT2_GLOBAL(0x9DEA54, uint16_t) = 0; + RCT2_GLOBAL(0x9DEA56, uint16_t) = d + 18; + RCT2_CALLPROC_X( + (int)RCT2_ADDRESS(0x0098197C, uint32_t*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0xFF00, ebx, cx & 0xFF00, d, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + } + int bx = dx + 52; + if (bx > dpi->y) + { + rct_map_element* element = map_element;//push map_element + bx = element->clearance_height; + if (!(element->flags & MAP_ELEMENT_FLAG_LAST_TILE)) + { + while (true) + { + element++; + if (bx < element->clearance_height) + bx = element->clearance_height; + if (element->flags & MAP_ELEMENT_FLAG_LAST_TILE) break; + } + } + if ((element->type & 0x3C) == MAP_ELEMENT_TYPE_SURFACE && + (element->properties.surface.terrain & 0x1F) != 0) + { + bx = element->properties.surface.terrain & 0x1F;//water height + bx <<= 1; + } + bx <<= 3; + dx -= bx; + dx -= 32; + element = map_element;//pop map_element + dx -= dpi->height; + if (dx < dpi->y) + { + RCT2_GLOBAL(0x9DE568, uint16_t) = ax; + RCT2_GLOBAL(0x9DE56C, uint16_t) = cx; + RCT2_GLOBAL(0x9DE57C, uint16_t) = 0; + while (true) + { + int ecx = map_element->type; + int edi = ecx; + ecx += RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t); + ecx &= 3; + dx = map_element->base_height; + edi &= 0x3C; + dx <<= 3; + uint32_t dword_9DE574 = RCT2_GLOBAL(0x9DE574, uint32_t); + RCT2_GLOBAL(0x9DE578, rct_map_element*) = map_element; + //setup the painting of for example: the underground, signs, rides, scenery, etc. + switch (edi) + { + case MAP_ELEMENT_TYPE_SURFACE: + RCT2_CALLPROC_X(0x66062C, 0, 0, ecx, dx, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_PATH: + RCT2_CALLPROC_X(0x6A3590, 0, 0, ecx, dx, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_TRACK: + RCT2_CALLPROC_X(0x6C4794, 0, 0, ecx, dx, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_SCENERY: + RCT2_CALLPROC_X(0x6DFF47, 0, 0, ecx, dx, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_ENTRANCE: + RCT2_CALLPROC_X(0x664FD4, 0, 0, ecx, dx, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_FENCE: + RCT2_CALLPROC_X(0x6E44B0, 0, 0, ecx, dx, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: + RCT2_CALLPROC_X(0x6B7F0C, 0, 0, ecx, dx, (int)map_element, 0, 0); + break; + case MAP_ELEMENT_TYPE_BANNER: + //Not used yet. See comment above viewport_banner_paint_setup + //viewport_banner_paint_setup(ecx, dx, map_element); + RCT2_CALLPROC_X(0x6B9CC4, 0, 0, ecx, dx, (int)map_element, 0, 0); + break; + default: + break; + } + RCT2_GLOBAL(0x9DE574, uint32_t) = dword_9DE574; + int stop = map_element->flags & MAP_ELEMENT_FLAG_LAST_TILE; + map_element++; + if (stop) break; + } + } + } + } + else + { + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + int dx; + switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) + { + case 0: + dx = ax + cx; + break; + case 1: + ax += 32; + dx = cx - ax; + break; + case 2: + ax += 32; + cx += 32; + dx = -(ax + cx); + break; + case 3: + cx += 32; + dx = ax - cx; + break; + } + dx /= 2; + dx -= 16; + int bx = dx + 32; + if (bx <= dpi->y) return; + dx -= 20; + dx -= dpi->height; + if (dx >= dpi->y) return; + RCT2_GLOBAL(0x9DE568, uint16_t) = ax; + RCT2_GLOBAL(0x9DE56C, uint16_t) = cx; + RCT2_GLOBAL(0x9DE570, uint8_t) = 0; + RCT2_CALLPROC_X((int)RCT2_ADDRESS(0x98196C, uint32_t*)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], + 0xFF00, 3123, cx & 0xFF00, 16, 32, 32, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + } +} + /** * * rct2: 0x0068B6C2 @@ -869,13 +1123,13 @@ void sub_0x68B6C2(){ dx += 2128; dx >>= 5; for (int i = dx; i > 0; --i){ - RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0); + sub_68B35F(ax, cx); sub_0x69E8B0(ax, cx); cx += 0x20; ax -= 0x20; sub_0x69E8B0(ax, cx); ax += 0x20; - RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0); + sub_68B35F(ax, cx); sub_0x69E8B0(ax, cx); ax += 0x20; cx -= 0x20; @@ -890,7 +1144,7 @@ void sub_0x68B6C2(){ bx &= 0xFFE0; ax &= 0xFFE0; bx >>= 1; - cx = ax; + cx = ax; ax = -ax; ax -= bx; cx -= bx; @@ -901,13 +1155,13 @@ void sub_0x68B6C2(){ dx += 0x860; dx >>= 5; for (int i = dx; i > 0; i--){ - RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0); + sub_68B35F(ax, cx); sub_0x69E8B0(ax, cx); ax -= 0x20; cx -= 0x20; sub_0x69E8B0(ax, cx); cx += 0x20; - RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0); + sub_68B35F(ax, cx); sub_0x69E8B0(ax, cx); ax += 0x20; cx += 0x20; @@ -932,13 +1186,13 @@ void sub_0x68B6C2(){ dx += 0x860; dx >>= 5; for (int i = dx; i > 0; i--){ - RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0); + sub_68B35F(ax, cx); sub_0x69E8B0(ax, cx); ax += 0x20; cx -= 0x20; sub_0x69E8B0(ax, cx); ax -= 0x20; - RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0); + sub_68B35F(ax, cx); sub_0x69E8B0(ax, cx); ax -= 0x20; cx += 0x20; @@ -964,13 +1218,13 @@ void sub_0x68B6C2(){ dx += 0x860; dx >>= 5; for (int i = dx; i > 0; i--){ - RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0); + sub_68B35F(ax, cx); sub_0x69E8B0(ax, cx); ax += 0x20; cx += 0x20; sub_0x69E8B0(ax, cx); cx -= 0x20; - RCT2_CALLPROC_X(0x68B35F, ax, 0, cx, 0, 0, 0, 0); + sub_68B35F(ax, cx); sub_0x69E8B0(ax, cx); ax -= 0x20; cx -= 0x20; @@ -1083,13 +1337,13 @@ void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, in gfx_fill_rect(dpi2, dpi2->x, dpi2->y, dpi2->width + dpi2->x - 1, dpi2->height + dpi2->y - 1, weather_colour); } RCT2_CALLPROC_EBPSAFE(0x6860C3); //string related - } + } //RCT2_CALLPROC_X(0x00685CBF, left, top, 0, right, (int)viewport, (int)dpi, bottom); } /** - * + * * rct2: 0x0068958D */ void screen_pos_to_map_pos(short *x, short *y) @@ -1103,7 +1357,7 @@ void screen_pos_to_map_pos(short *x, short *y) } /** - * + * * rct2: 0x00664689 */ void show_gridlines() @@ -1122,7 +1376,7 @@ void show_gridlines() } /** - * + * * rct2: 0x006646B4 */ void hide_gridlines() @@ -1141,7 +1395,7 @@ void hide_gridlines() } /** - * + * * rct2: 0x00664E8E */ void show_land_rights() @@ -1160,7 +1414,7 @@ void show_land_rights() } /** - * + * * rct2: 0x00664EB9 */ void hide_land_rights() @@ -1179,7 +1433,7 @@ void hide_land_rights() } /** - * + * * rct2: 0x00664EDD */ void show_construction_rights() @@ -1198,7 +1452,7 @@ void show_construction_rights() } /** - * + * * rct2: 0x00664F08 */ void hide_construction_rights() @@ -1217,48 +1471,48 @@ void hide_construction_rights() } /** - * + * * rct2: 0x006CB70A */ void viewport_set_visibility(uint8 mode) { - rct_window* window = window_get_main(); + rct_window* window = window_get_main(); - if(window != NULL) { - rct_viewport* edi = window->viewport; - uint32 invalidate = 0; + if (window != NULL) { + rct_viewport* edi = window->viewport; + uint32 invalidate = 0; - switch(mode) { - case 0: { //Set all these flags to 0, and invalidate if any were active - uint16 mask = VIEWPORT_FLAG_UNDERGROUND_INSIDE | VIEWPORT_FLAG_SEETHROUGH_RIDES | - VIEWPORT_FLAG_SEETHROUGH_SCENERY | VIEWPORT_FLAG_INVISIBLE_SUPPORTS | - VIEWPORT_FLAG_LAND_HEIGHTS | VIEWPORT_FLAG_TRACK_HEIGHTS | - VIEWPORT_FLAG_PATH_HEIGHTS | VIEWPORT_FLAG_INVISIBLE_PEEPS | - VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_HIDE_VERTICAL; + switch (mode) { + case 0: { //Set all these flags to 0, and invalidate if any were active + uint16 mask = VIEWPORT_FLAG_UNDERGROUND_INSIDE | VIEWPORT_FLAG_SEETHROUGH_RIDES | + VIEWPORT_FLAG_SEETHROUGH_SCENERY | VIEWPORT_FLAG_INVISIBLE_SUPPORTS | + VIEWPORT_FLAG_LAND_HEIGHTS | VIEWPORT_FLAG_TRACK_HEIGHTS | + VIEWPORT_FLAG_PATH_HEIGHTS | VIEWPORT_FLAG_INVISIBLE_PEEPS | + VIEWPORT_FLAG_HIDE_BASE | VIEWPORT_FLAG_HIDE_VERTICAL; - invalidate += edi->flags & mask; - edi->flags &= ~mask; - break; - } - case 1: //6CB79D - case 4: //6CB7C4 - //Set underground on, invalidate if it was off - invalidate += !(edi->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE); - edi->flags |= VIEWPORT_FLAG_UNDERGROUND_INSIDE; - break; - case 2: //6CB7EB - //Set track heights on, invalidate if off - invalidate += !(edi->flags & VIEWPORT_FLAG_TRACK_HEIGHTS); - edi->flags |= VIEWPORT_FLAG_TRACK_HEIGHTS; - break; - case 3: //6CB7B1 - case 5: //6CB7D8 - //Set underground off, invalidate if it was on - invalidate += edi->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE; - edi->flags &= ~((uint16)VIEWPORT_FLAG_UNDERGROUND_INSIDE); - break; - } - if (invalidate != 0) + invalidate += edi->flags & mask; + edi->flags &= ~mask; + break; + } + case 1: //6CB79D + case 4: //6CB7C4 + //Set underground on, invalidate if it was off + invalidate += !(edi->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE); + edi->flags |= VIEWPORT_FLAG_UNDERGROUND_INSIDE; + break; + case 2: //6CB7EB + //Set track heights on, invalidate if off + invalidate += !(edi->flags & VIEWPORT_FLAG_TRACK_HEIGHTS); + edi->flags |= VIEWPORT_FLAG_TRACK_HEIGHTS; + break; + case 3: //6CB7B1 + case 5: //6CB7D8 + //Set underground off, invalidate if it was on + invalidate += edi->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE; + edi->flags &= ~((uint16)VIEWPORT_FLAG_UNDERGROUND_INSIDE); + break; + } + if (invalidate != 0) window_invalidate(window); } } From 11b064617692b6a024571518166a9f5ed437d4ac Mon Sep 17 00:00:00 2001 From: Gericom Date: Wed, 11 Mar 2015 19:13:14 +0100 Subject: [PATCH 02/19] Added some viewport functions and refactoring --- src/interface/viewport.c | 232 +++++++++++++++++++++++++++++---------- src/windows/ride.c | 9 +- 2 files changed, 179 insertions(+), 62 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index de6fc798e2..a07d03e13e 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -846,22 +846,116 @@ void sub_0x69E8B0(uint32 eax, uint32 ecx){ //return; } +/*rct2: 0x006C42D9*/ +int sub_6C42D9(rct_string_id string_id, int scroll, int ebp) +{ + rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); + if (dpi->zoom_level != 0) return 0x626; + RCT2_GLOBAL(0x9D7A80, uint32_t)++; + int edx = -1; + for (int i = 0; i < 0x20; i++) + { + uint8_t* unknown_pointer = RCT2_ADDRESS(0x9C3840, uint8_t) + 0xA12 * i; + if (edx >= *((int32_t*)(unknown_pointer + 0x0E))) + { + edx = *((int32_t*)(unknown_pointer + 0x0E)); + RCT2_GLOBAL(0x9D7A84, uint32_t) = i; + RCT2_GLOBAL(0x9D7A88, uint32_t) = (uint32_t)unknown_pointer; + } + if (*((rct_string_id*)unknown_pointer) == string_id && + *((uint32_t*)(unknown_pointer + 0x02)) == RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32_t) && + *((uint32_t*)(unknown_pointer + 0x06)) == RCT2_GLOBAL(0x13CE956, uint32_t) && + *((uint16_t*)(unknown_pointer + 0x0A)) == scroll && + *((uint16_t*)(unknown_pointer + 0x0C)) == ebp) + { + *((int32_t*)(unknown_pointer + 0x0E)) = RCT2_GLOBAL(0x9D7A80, uint32_t); + return i + 0x606; + } + } + uint8_t* unknown_pointer = RCT2_GLOBAL(0x9D7A88, uint8_t*); + *((rct_string_id*)unknown_pointer) = string_id; + *((uint32_t*)(unknown_pointer + 0x02)) = RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32_t); + *((uint32_t*)(unknown_pointer + 0x06)) = RCT2_GLOBAL(0x13CE956, uint32_t); + *((uint16_t*)(unknown_pointer + 0x0A)) = scroll; + *((uint16_t*)(unknown_pointer + 0x0C)) = ebp; + *((int32_t*)(unknown_pointer + 0x0E)) = RCT2_GLOBAL(0x9D7A80, uint32_t); + unknown_pointer += 0x12; + memset(unknown_pointer, 0, 0x280 * 4); + format_string(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + int al = RCT2_GLOBAL(0x13CE959, uint8_t); + int edi = al & 0x7F; + int offs = 0; + if (al >= 0x80) offs = 2; + RCT2_GLOBAL(0x9D7A8C, uint8_t) = RCT2_ADDRESS(0x0141FC47, uint8_t)[offs + edi * 8]; + int16_t* unk = RCT2_ADDRESS(0x992FB8, uint16_t*)[ebp]; + uint8_t* format_result = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, uint8_t); + while (true) + { + al = *format_result; + format_result++; + if (al == 0) + { + format_result = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); + continue; + } + if (al < 0x9C && al >= 0x8E) + { + al -= 0x8E; + RCT2_GLOBAL(0x9D7A8C, uint8_t) = RCT2_ADDRESS(RCT2_GLOBAL(0x9FF048, uint32_t), uint8_t)[al * 4]; + continue; + } + if (al < 0x20) continue; + al -= 0x20; + int edx = RCT2_ADDRESS(0x141EBA8, uint8_t)[al]; + uint8_t* unk2 = &(RCT2_ADDRESS(0xF4393C, uint8)[al * 8]); + while (true) + { + if (scroll != 0) + { + scroll--; + unk2++; + edx--; + if (edx == 0) break; + } + else + { + int16_t eax = *unk; + if (eax == -1) return RCT2_GLOBAL(0x9D7A84, uint32_t) + 0x606; + if (eax > -1) + { + uint8_t* dst = &unknown_pointer[eax]; + int ah = *unk2; + int al = RCT2_GLOBAL(0x9D7A8C, uint8_t); + while (true) + { + if (ah & 1) *dst = al; + ah >>= 1; + dst += 0x40; + if (ah == 0) break; + } + } + unk2++; + unk++; + edx--; + if (edx == 0) break; + } + } + } +} + /* rct2: 0x006B9CC4 */ -//This function is complete, but as long as 0x6C42D9 is not complete -//it will cause glitches in the rendering of banners, -//because the wrong (because localized) string length is used for calculating the scroll position -void viewport_banner_paint_setup(uint32_t ecx, int edx, rct_map_element* map_element) +void viewport_banner_paint_setup(uint32_t direction, int edx, rct_map_element* map_element) { rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); RCT2_GLOBAL(0x9DE570, uint8_t) = 0xC; if (dpi->zoom_level > 1 || RCT2_GLOBAL(0x9DEA6F, uint8_t) & 1) return; edx -= 16; rct_scenery_entry* banner_scenery = g_bannerSceneryEntries[gBanners[map_element->properties.banner.index].type]; - ecx += map_element->properties.banner.position; - ecx &= 3; + direction += map_element->properties.banner.position; + direction &= 3; RCT2_GLOBAL(0x9DEA56, uint16_t) = edx + 2; - RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D884, uint32_t)[ecx * 2]; - int ebx = (ecx << 1) + banner_scenery->image; + RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D884, uint32_t)[direction * 2]; + int ebx = (direction << 1) + banner_scenery->image; ebx += (gBanners[map_element->properties.banner.index].colour << 19) | 0x20000000; if (map_element->flags & 0x10) { @@ -871,35 +965,32 @@ void viewport_banner_paint_setup(uint32_t ecx, int edx, rct_map_element* map_ele } RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], 0x1500, ebx, 0, edx, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); - RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D888, uint32_t)[ecx * 2]; + RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D888, uint32_t)[direction * 2]; ebx++; RCT2_CALLPROC_X(RCT2_ADDRESS(0x98197C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], 0x1500, ebx, 0, edx, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); - ecx ^= 2; - ecx--; - if (ecx >= 2 || (map_element->flags & 0x10)) return; + direction ^= 2; + direction--; + if (direction >= 2 || (map_element->flags & 0x10)) return; int ebp = banner_scenery->banner.var_06; - ebp += ecx; + ebp += direction; RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint32_t) = 0; RCT2_GLOBAL(0x13CE956, uint32_t) = 0; - int eax = 0xBA5; + rct_string_id string_id = 0xBA5;//no entry if (!(gBanners[map_element->properties.banner.index].flags & BANNER_FLAG_NO_ENTRY)) { RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16_t) = gBanners[map_element->properties.banner.index].string_idx; - eax = 0x6C3; + string_id = 0x6C3; } - format_string(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), eax, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); + format_string(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16_t) = 0x1C0; uint16_t string_width = gfx_get_string_width(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char)); - uint16_t ticks = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32_t) >> 1; - uint16_t cx = ticks % string_width; - int a = eax, b = ebx, c = cx, d = 0, si = 0, di = 0, p = ebp; - RCT2_CALLFUNC_X(0x6C42D9, &a, &b, &c, &d, &si, &di, &p); + uint16_t scroll = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32_t) >> 1) % string_width; RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x1500, b, 0, edx + 22, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + 0x1500, sub_6C42D9(string_id, scroll, ebp), 0, edx + 22, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); } -//rct2: 0x0068B35F +/*rct2: 0x0068B35F*/ void sub_68B35F(int ax, int cx) { if (ax < RCT2_GLOBAL(RCT2_ADDRESS_MAP_SIZE_UNITS, uint16_t) && @@ -933,7 +1024,7 @@ void sub_68B35F(int ax, int cx) esi >>= 3; int ax_tmp = ax; int cx_tmp = cx; - rct_map_element* map_element = RCT2_ADDRESS(RCT2_ADDRESS_TILE_MAP_ELEMENT_POINTERS, rct_map_element*)[esi / 4];//8]; + rct_map_element* map_element = TILE_MAP_ELEMENT_POINTER(esi / 4); rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); switch (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) { @@ -983,21 +1074,19 @@ void sub_68B35F(int ax, int cx) { rct_map_element* element = map_element;//push map_element bx = element->clearance_height; - if (!(element->flags & MAP_ELEMENT_FLAG_LAST_TILE)) + if (!map_element_is_last_for_tile(element)) { while (true) { element++; - if (bx < element->clearance_height) - bx = element->clearance_height; - if (element->flags & MAP_ELEMENT_FLAG_LAST_TILE) break; + bx = max(bx, element->clearance_height); + if (map_element_is_last_for_tile(element)) break; } } - if ((element->type & 0x3C) == MAP_ELEMENT_TYPE_SURFACE && - (element->properties.surface.terrain & 0x1F) != 0) + if (map_element_get_type(element) == MAP_ELEMENT_TYPE_SURFACE && + (element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) != 0) { - bx = element->properties.surface.terrain & 0x1F;//water height - bx <<= 1; + bx = (element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK) << 1; } bx <<= 3; dx -= bx; @@ -1011,49 +1100,44 @@ void sub_68B35F(int ax, int cx) RCT2_GLOBAL(0x9DE57C, uint16_t) = 0; while (true) { - int ecx = map_element->type; - int edi = ecx; - ecx += RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t); - ecx &= 3; - dx = map_element->base_height; - edi &= 0x3C; - dx <<= 3; + int direction = (map_element->type + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)) & MAP_ELEMENT_DIRECTION_MASK; + dx = map_element->base_height * 8; uint32_t dword_9DE574 = RCT2_GLOBAL(0x9DE574, uint32_t); RCT2_GLOBAL(0x9DE578, rct_map_element*) = map_element; //setup the painting of for example: the underground, signs, rides, scenery, etc. - switch (edi) + switch (map_element_get_type(map_element)) { case MAP_ELEMENT_TYPE_SURFACE: - RCT2_CALLPROC_X(0x66062C, 0, 0, ecx, dx, (int)map_element, 0, 0); + RCT2_CALLPROC_X(0x66062C, 0, 0, direction, dx, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_PATH: - RCT2_CALLPROC_X(0x6A3590, 0, 0, ecx, dx, (int)map_element, 0, 0); + RCT2_CALLPROC_X(0x6A3590, 0, 0, direction, dx, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_TRACK: - RCT2_CALLPROC_X(0x6C4794, 0, 0, ecx, dx, (int)map_element, 0, 0); + RCT2_CALLPROC_X(0x6C4794, 0, 0, direction, dx, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_SCENERY: - RCT2_CALLPROC_X(0x6DFF47, 0, 0, ecx, dx, (int)map_element, 0, 0); + RCT2_CALLPROC_X(0x6DFF47, 0, 0, direction, dx, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_ENTRANCE: - RCT2_CALLPROC_X(0x664FD4, 0, 0, ecx, dx, (int)map_element, 0, 0); + RCT2_CALLPROC_X(0x664FD4, 0, 0, direction, dx, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_FENCE: - RCT2_CALLPROC_X(0x6E44B0, 0, 0, ecx, dx, (int)map_element, 0, 0); + RCT2_CALLPROC_X(0x6E44B0, 0, 0, direction, dx, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: - RCT2_CALLPROC_X(0x6B7F0C, 0, 0, ecx, dx, (int)map_element, 0, 0); + RCT2_CALLPROC_X(0x6B7F0C, 0, 0, direction, dx, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_BANNER: - //Not used yet. See comment above viewport_banner_paint_setup - //viewport_banner_paint_setup(ecx, dx, map_element); - RCT2_CALLPROC_X(0x6B9CC4, 0, 0, ecx, dx, (int)map_element, 0, 0); + //there are still some small localisation glitches, because the old function seems to get called sometimes + viewport_banner_paint_setup(direction, dx, map_element); + //RCT2_CALLPROC_X(0x6B9CC4, 0, 0, direction, dx, (int)map_element, 0, 0); break; default: break; } RCT2_GLOBAL(0x9DE574, uint32_t) = dword_9DE574; - int stop = map_element->flags & MAP_ELEMENT_FLAG_LAST_TILE; + int stop = map_element_is_last_for_tile(map_element); map_element++; if (stop) break; } @@ -1530,13 +1614,43 @@ void viewport_set_visibility(uint8 mode) */ void get_map_coordinates_from_pos(int screenX, int screenY, int flags, int *x, int *y, int *z, rct_map_element **mapElement) { - int eax, ebx, ecx, edx, esi, edi, ebp; - eax = screenX; - ebx = screenY; - edx = flags; - RCT2_CALLFUNC_X(0x00685ADC, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - if (x != NULL) *x = *((uint16*)&eax); - if (y != NULL) *y = *((uint16*)&ecx); - if (z != NULL) *z = *((uint8*)&ebx); - if (mapElement != NULL) *mapElement = (rct_map_element*)edx; + RCT2_GLOBAL(0x9AC154, uint16_t) = flags & 0xFFFF; + RCT2_GLOBAL(0x9AC148, uint8_t) = 0; + rct_window* window = window_find_from_point(screenX, screenY); + if (window != NULL && window->viewport != NULL) + { + rct_viewport* viewport = window->viewport; + RCT2_GLOBAL(0x9AC138 + 4, int16_t) = screenX; + RCT2_GLOBAL(0x9AC138 + 6, int16_t) = screenY; + screenX -= (int)viewport->x; + screenY -= (int)viewport->y; + if (screenX >= 0 && screenX < (int)viewport->width && screenY >= 0 && screenY < (int)viewport->height) + { + screenX <<= viewport->zoom; + screenY <<= viewport->zoom; + screenX += (int)viewport->view_x; + screenY += (int)viewport->view_y; + RCT2_GLOBAL(RCT2_ADDRESS_VIEWPORT_ZOOM, uint16_t) = viewport->zoom; + screenX &= (0xFFFF << viewport->zoom) & 0xFFFF; + screenY &= (0xFFFF << viewport->zoom) & 0xFFFF; + RCT2_GLOBAL(RCT2_ADDRESS_VIEWPORT_PAINT_X, int16_t) = screenX; + RCT2_GLOBAL(RCT2_ADDRESS_VIEWPORT_PAINT_Y, int16_t) = screenY; + rct_drawpixelinfo* dpi = RCT2_ADDRESS(RCT2_ADDRESS_VIEWPORT_DPI, rct_drawpixelinfo); + dpi->y = RCT2_GLOBAL(RCT2_ADDRESS_VIEWPORT_PAINT_Y, int16_t); + dpi->height = 1; + dpi->zoom_level = RCT2_GLOBAL(RCT2_ADDRESS_VIEWPORT_ZOOM, uint16_t); + dpi->x = RCT2_GLOBAL(RCT2_ADDRESS_VIEWPORT_PAINT_X, int16_t); + dpi->width = 1; + RCT2_GLOBAL(0xEE7880, uint32_t) = 0xF1A4CC; + RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*) = dpi; + sub_0x68615B(0xEE788C); + sub_0x68B6C2(); + RCT2_CALLPROC_X(0x688217, 0, 0, 0, 0, 0, 0, 0); + RCT2_CALLPROC_X(0x68862C, 0, 0, 0, 0, 0, 0, 0); + } + } + if (z != NULL) *z = RCT2_GLOBAL(0x9AC148, uint8_t); + if (x != NULL) *x = (int)RCT2_GLOBAL(0x9AC14C, int16_t); + if (y != NULL) *y = (int)RCT2_GLOBAL(0x9AC14E, int16_t); + if (mapElement != NULL) *mapElement = RCT2_GLOBAL(0x9AC150, rct_map_element*); } \ No newline at end of file diff --git a/src/windows/ride.c b/src/windows/ride.c index 8a642075fb..a6e0a02ac5 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3491,17 +3491,20 @@ static void window_ride_set_track_colour_scheme(rct_window *w, int x, int y) newColourScheme = (uint8)(*((uint16*)&w->var_494)); + int z; + + get_map_coordinates_from_pos(x, y, -5, &x, &y, &z, &mapElement); // Get map coordinates from point - int eax, ebx, ecx, edx, esi, edi, ebp; + /*int eax, ebx, ecx, edx, esi, edi, ebp; eax = x; ebx = y; edx = -5; RCT2_CALLFUNC_X(0x00685ADC, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); x = eax & 0xFFFF; y = ecx & 0xFFFF; - mapElement = (rct_map_element*)edx; + mapElement = (rct_map_element*)edx;*/ - if ((ebx & 0xFF) != 3) + if ((/*ebx*/z & 0xFF) != 3) return; if (mapElement->properties.track.ride_index != w->number) return; From 5655a5a5cf7988aeb3c55a208fbc6b3db0fdc3c8 Mon Sep 17 00:00:00 2001 From: Gericom Date: Sat, 14 Mar 2015 15:48:06 +0100 Subject: [PATCH 03/19] Fixed banner text glitch --- src/interface/viewport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index a07d03e13e..c077f15b14 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -852,7 +852,7 @@ int sub_6C42D9(rct_string_id string_id, int scroll, int ebp) rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*); if (dpi->zoom_level != 0) return 0x626; RCT2_GLOBAL(0x9D7A80, uint32_t)++; - int edx = -1; + uint32_t edx = 0xFFFFFFFF; for (int i = 0; i < 0x20; i++) { uint8_t* unknown_pointer = RCT2_ADDRESS(0x9C3840, uint8_t) + 0xA12 * i; From d77d9e9a5806f33afe00d5abc7fb8d52c1a18b06 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Tue, 17 Mar 2015 10:45:33 +0100 Subject: [PATCH 04/19] Fix negative ride ages --- src/windows/ride.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/windows/ride.c b/src/windows/ride.c index ff84a7e466..b5e12c8237 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -5878,6 +5878,9 @@ static void window_ride_customer_paint() // Age age = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16) - ride->build_date) / 8; + if (age < 0) { + age +=8192; + } stringId = age == 0 ? STR_BUILT_THIS_YEAR : age == 1 ? From aacef89973c22b9dca9e88f5938bf58777319e7d Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Tue, 17 Mar 2015 14:41:57 +0100 Subject: [PATCH 05/19] Reset build dates that are in the future --- src/windows/ride.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/windows/ride.c b/src/windows/ride.c index b5e12c8237..ca3cdda487 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -5877,10 +5877,10 @@ static void window_ride_customer_paint() y += 2; // Age + //Reset build date to current if it's in the future + ride->build_date=min(ride->build_date,RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16)); + age = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16) - ride->build_date) / 8; - if (age < 0) { - age +=8192; - } stringId = age == 0 ? STR_BUILT_THIS_YEAR : age == 1 ? From b0562dbb37918fde8462a9bb8f34558a4789fe79 Mon Sep 17 00:00:00 2001 From: Gericom Date: Tue, 17 Mar 2015 17:08:40 +0100 Subject: [PATCH 06/19] Call the original viewport_banner_paint_setup Because as long as the original function gets called sometimes, there are localisation glitches. Also, some small refactoring --- src/interface/viewport.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index c077f15b14..6dede9aa8e 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -856,9 +856,9 @@ int sub_6C42D9(rct_string_id string_id, int scroll, int ebp) for (int i = 0; i < 0x20; i++) { uint8_t* unknown_pointer = RCT2_ADDRESS(0x9C3840, uint8_t) + 0xA12 * i; - if (edx >= *((int32_t*)(unknown_pointer + 0x0E))) + if (edx >= *((uint32_t*)(unknown_pointer + 0x0E))) { - edx = *((int32_t*)(unknown_pointer + 0x0E)); + edx = *((uint32_t*)(unknown_pointer + 0x0E)); RCT2_GLOBAL(0x9D7A84, uint32_t) = i; RCT2_GLOBAL(0x9D7A88, uint32_t) = (uint32_t)unknown_pointer; } @@ -868,7 +868,7 @@ int sub_6C42D9(rct_string_id string_id, int scroll, int ebp) *((uint16_t*)(unknown_pointer + 0x0A)) == scroll && *((uint16_t*)(unknown_pointer + 0x0C)) == ebp) { - *((int32_t*)(unknown_pointer + 0x0E)) = RCT2_GLOBAL(0x9D7A80, uint32_t); + *((uint32_t*)(unknown_pointer + 0x0E)) = RCT2_GLOBAL(0x9D7A80, uint32_t); return i + 0x606; } } @@ -878,7 +878,7 @@ int sub_6C42D9(rct_string_id string_id, int scroll, int ebp) *((uint32_t*)(unknown_pointer + 0x06)) = RCT2_GLOBAL(0x13CE956, uint32_t); *((uint16_t*)(unknown_pointer + 0x0A)) = scroll; *((uint16_t*)(unknown_pointer + 0x0C)) = ebp; - *((int32_t*)(unknown_pointer + 0x0E)) = RCT2_GLOBAL(0x9D7A80, uint32_t); + *((uint32_t*)(unknown_pointer + 0x0E)) = RCT2_GLOBAL(0x9D7A80, uint32_t); unknown_pointer += 0x12; memset(unknown_pointer, 0, 0x280 * 4); format_string(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char), string_id, (void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS); @@ -898,9 +898,9 @@ int sub_6C42D9(rct_string_id string_id, int scroll, int ebp) format_result = RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char); continue; } - if (al < 0x9C && al >= 0x8E) + if (al <= FORMAT_COLOUR_CODE_END && al >= FORMAT_COLOUR_CODE_START) { - al -= 0x8E; + al -= FORMAT_COLOUR_CODE_START; RCT2_GLOBAL(0x9D7A8C, uint8_t) = RCT2_ADDRESS(RCT2_GLOBAL(0x9FF048, uint32_t), uint8_t)[al * 4]; continue; } @@ -957,7 +957,7 @@ void viewport_banner_paint_setup(uint32_t direction, int edx, rct_map_element* m RCT2_GLOBAL(0x9DEA52, uint32_t) = RCT2_ADDRESS(0x98D884, uint32_t)[direction * 2]; int ebx = (direction << 1) + banner_scenery->image; ebx += (gBanners[map_element->properties.banner.index].colour << 19) | 0x20000000; - if (map_element->flags & 0x10) + if (map_element->flags & 0x10)//if being placed (ghost appearance) { RCT2_GLOBAL(0x9DE570, uint8_t) = 0; ebx &= 0x7FFFF; @@ -987,7 +987,7 @@ void viewport_banner_paint_setup(uint32_t direction, int edx, rct_map_element* m uint16_t string_width = gfx_get_string_width(RCT2_ADDRESS(RCT2_ADDRESS_COMMON_STRING_FORMAT_BUFFER, char)); uint16_t scroll = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32_t) >> 1) % string_width; RCT2_CALLPROC_X(RCT2_ADDRESS(0x98199C, uint32_t)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)], - 0x1500, sub_6C42D9(string_id, scroll, ebp), 0, edx + 22, 1, 1, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32_t)); + 0x1500, sub_6C42D9(string_id, scroll, ebp), 0, edx + 22, 1, 1, 0); } /*rct2: 0x0068B35F*/ @@ -1129,9 +1129,11 @@ void sub_68B35F(int ax, int cx) RCT2_CALLPROC_X(0x6B7F0C, 0, 0, direction, dx, (int)map_element, 0, 0); break; case MAP_ELEMENT_TYPE_BANNER: - //there are still some small localisation glitches, because the old function seems to get called sometimes - viewport_banner_paint_setup(direction, dx, map_element); - //RCT2_CALLPROC_X(0x6B9CC4, 0, 0, direction, dx, (int)map_element, 0, 0); + //there are still some small localisation glitches, + //because the old function still gets called sometimes + //viewport_banner_paint_setup(direction, dx, map_element); + //Until that is solved, use the original function instead + RCT2_CALLPROC_X(0x6B9CC4, 0, 0, direction, dx, (int)map_element, 0, 0); break; default: break; From 058f10845f0c160eea619ede25f6a3e0dcfeafcc Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Tue, 17 Mar 2015 23:47:54 +0000 Subject: [PATCH 07/19] implement map_invalidate_animations --- src/world/map.c | 29 ++++++++++++++++++++++++++++- src/world/map.h | 12 ++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/world/map.c b/src/world/map.c index b15d1d8a6d..c2be5a635a 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -42,6 +42,7 @@ const rct_xy16 TileDirectionDelta[] = { }; rct_xy16 *gMapSelectionTiles = (rct_xy16*)0x009DE596; +rct_animated_object *gAnimatedObjects = (rct_animated_object*)0x013886A0; int _sub_6A876D_save_x; int _sub_6A876D_save_y; @@ -458,13 +459,39 @@ int map_coord_is_connected(int x, int y, int z, uint8 faceDirection) return 0; } +/** rct2: 0x009819DC */ +const uint32 *_animatedObjectEventHandlers = (uint32*)0x009819DC; + +/** + * @returns true if the animation should be removed. + */ +bool map_invalidate_animation(rct_animated_object *obj) +{ + uint32 address = _animatedObjectEventHandlers[obj->type]; + int result = RCT2_CALLPROC_X(address, obj->x, 0, obj->y, obj->baseZ, 0, 0, 0); + return (result & 0x100) != 0; +} + /** * * rct2: 0x0068AFAD */ void map_invalidate_animations() { - RCT2_CALLPROC_EBPSAFE(0x0068AFAD); + rct_animated_object *aobj = &gAnimatedObjects[0]; + int numAnimatedObjects = RCT2_GLOBAL(0x0138B580, uint16); + while (numAnimatedObjects > 0) { + if (map_invalidate_animation(aobj)) { + // Remove animated object + RCT2_GLOBAL(0x0138B580, uint16)--; + numAnimatedObjects--; + if (numAnimatedObjects > 0) + memmove(aobj, aobj + 1, numAnimatedObjects); + } else { + numAnimatedObjects--; + aobj++; + } + } } /** diff --git a/src/world/map.h b/src/world/map.h index e9671394a8..13de4499e4 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -229,8 +229,20 @@ typedef struct { uint8 direction; } rct2_peep_spawn; +/** + * Animated object + * size: 0x06 + */ +typedef struct { + uint8 baseZ; + uint8 type; + uint16 x; + uint16 y; +} rct_animated_object; + extern const rct_xy16 TileDirectionDelta[]; extern rct_xy16 *gMapSelectionTiles; +extern rct_animated_object *gAnimatedObjects; void map_init(int size); void map_update_tile_pointers(); From 0822099e8618e4fd880e822cd9f38376649e94a6 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Wed, 18 Mar 2015 12:33:20 +0100 Subject: [PATCH 08/19] Add Italian --- src/localisation/language.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/localisation/language.c b/src/localisation/language.c index 677dfa864b..02bfd5c9a3 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -32,7 +32,8 @@ const char *language_names[LANGUAGE_COUNT] = { "Magyar", // LANGUAGE_HUNGARIAN "Polski", // LANGUAGE_POLISH "Espa\u00F1ol", // LANGUAGE_SPANISH - "Svenska" // LANGUAGE_SWEDISH + "Svenska", // LANGUAGE_SWEDISH + "Italiano" // LANGUAGE_ITALIAN }; const char *language_filenames[LANGUAGE_COUNT] = { @@ -45,7 +46,8 @@ const char *language_filenames[LANGUAGE_COUNT] = { "hungarian", // LANGUAGE_HUNGARIAN "polish", // LANGUAGE_POLISH "spanish_sp", // LANGUAGE_SPANISH - "swedish" // LANGUAGE_SWEDISH + "swedish", // LANGUAGE_SWEDISH + "italian" // LANGUAGE_ITALIAN }; int gCurrentLanguage = LANGUAGE_UNDEFINED; @@ -312,4 +314,4 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/ RCT2_ADDRESS(0x009BF2D4, char*)[stringid] = pString; return stringid; } -} \ No newline at end of file +} From f0ac66f3b106f72744661be4fffc3787d85c8dcd Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Wed, 18 Mar 2015 12:34:16 +0100 Subject: [PATCH 09/19] Add Italian --- src/localisation/language.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/localisation/language.h b/src/localisation/language.h index 860d821dce..5f61838c33 100644 --- a/src/localisation/language.h +++ b/src/localisation/language.h @@ -34,6 +34,7 @@ enum { LANGUAGE_POLISH, LANGUAGE_SPANISH, LANGUAGE_SWEDISH, + LANGUAGE_ITALIAN, LANGUAGE_COUNT }; From 5dde7c364a1f9fa5348afb32255d0eec23ea24bd Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 18 Mar 2015 11:47:10 +0000 Subject: [PATCH 10/19] Merge Localisation/master into OpenRCT2/develop. --- data/language/dutch.txt | 187 ++++++++++++++++++----------------- data/language/english_us.txt | 5 + data/language/french.txt | 168 +++++++++++++++---------------- data/language/polish.txt | 123 ++++++++++++----------- 4 files changed, 247 insertions(+), 236 deletions(-) diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 715704d297..906c83090d 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -51,11 +51,11 @@ STR_0049 :Attractie STR_0050 :Attractie STR_0051 :Attractie STR_0052 :Attractie -STR_0053 :Hyper-Twisterachtbaan +STR_0053 :Hyper-twisterachtbaan STR_0054 :Houten achtbaan -STR_0055 :Zijfrictieachtbaan +STR_0055 :Zijfrictie-achtbaan STR_0056 :Wilde muis -STR_0057 :Multidimensieachtbaan +STR_0057 :Multidimensie-achtbaan STR_0058 :Attractie STR_0059 :Omgekeerde luchtachtbaan STR_0060 :Attractie @@ -512,7 +512,7 @@ STR_0510 : STR_0511 : STR_0512 : STR_0513 : -STR_0514 :Treinen hangen onder de baan en zwaaien naar buiten in bochten +STR_0514 :Treinen hangen onder de baan en zwaaien naar buiten in de bochten STR_0515 : STR_0516 :Een rustige achtbaan voor bezoekers die nog niet in engere attracties durven STR_0517 :Passagiers rijden in miniatuurtreinen over een smalspoorweg @@ -564,10 +564,10 @@ STR_0562 : STR_0563 :Bezoekers zitten in comfortabele treinen met enkel een schootbeugel en gaan soepel door grote afdalingen en kronkelende stukken baan, met veel 'airtime' in de heuvels STR_0564 :Deze over een houten baan lopende achtbaan is snel, ruw, luidruchting en geeft het gevoel van controleverlies met veel 'airtime' STR_0565 :Een simpele houten achtbaan die enkel in staat is rustige hellingen en bochten te bedwingen, de karretjes worden enkel op de baan gehouden door middel van zijfrictiewielen en zwaartekracht -STR_0566 :Losse karretjes rijden over een kronkelende baan scherpe bochten en korte felle afdalingen -STR_0567 :Bezoekers zitten in stoelen aan beide kanten van de baan, en draaien alle kanten op terwijl ze door de diepe afdalingen gaan en door diverse omkeringen. +STR_0566 :Losse karretjes rijden over een kronkelende baan met scherpe bochten en korte felle afdalingen +STR_0567 :Bezoekers zitten in stoelen aan beide kanten van de baan, en draaien alle kanten op terwijl ze door diepe afdalingen en diverse omkeringen gaan STR_0568 : -STR_0569 :Bezoekers zitten in een speciaal tuigje onder de baan en krijgen zo de ervaring dat ze vliegen +STR_0569 :Bezoekers hangen in treinen onder de baan met enkel schouderbeugels en krijgen zo de ervaring dat ze vliegen STR_0570 : STR_0571 : STR_0572 : @@ -576,7 +576,7 @@ STR_0574 : STR_0575 :Aangedreven treinen hangen aan een enkele rail en vervoeren mensen door het park heen STR_0576 : STR_0577 : -STR_0578 :Karretjes lopen in een baan omgeven door hoepels en gaan door steile afdalingen en heartline-twists +STR_0578 :Karretjes rijden in een baan omgeven door hoepels en gaan door steile afdalingen en heartline-twists STR_0579 : STR_0580 : STR_0581 : @@ -584,7 +584,7 @@ STR_0582 : STR_0583 : STR_0584 : STR_0585 : -STR_0586 :Bootvormige karretjes lopen over achtbaanrails, waardoor ze hellende bochten en diepe afdalingen kunnen maken, waarna ze in bakken water neerplonzen en rustig een stukje kunnen varen +STR_0586 :Bootvormige karretjes rijden over achtbaanrails, waardoor ze hellende bochten en diepe afdalingen kunnen maken, waarna ze in bakken water neerplonzen en rustig een stukje kunnen varen STR_0587 : STR_0588 : STR_0589 : @@ -1059,39 +1059,39 @@ STR_1057 :Attractienaam STR_1058 :Voer een nieuwe naam in voor deze attractie: STR_1059 :Kan deze attractie geen andere naam geven... STR_1060 :Ongeldige attractienaam -STR_1061 :Normale stand +STR_1061 :Normale modus STR_1062 :Voortdurend circuit STR_1063 :Lancering via achterwaartse optakeling STR_1064 :Lancering -STR_1065 :Shuttlestand +STR_1065 :Shuttlemodus STR_1066 :Bootverhuurmodus STR_1067 :Opwaartse lancering STR_1068 :Draaiendeliftmodus STR_1069 :Station-naar-station STR_1070 :Enkele rit per entree STR_1071 :Onbeperkt aantal ritten per entree -STR_1072 :Doolhofstand -STR_1073 :Racestand +STR_1072 :Doolhofmodus +STR_1073 :Racemodus STR_1074 :Botsautomodus -STR_1075 :Schommelstand -STR_1076 :Winkelstand -STR_1077 :Draaistand +STR_1075 :Schommelmodus +STR_1076 :Winkelmodus +STR_1077 :Draaimodus STR_1078 :Voorwaartse rotatie STR_1079 :Achterwaartse rotatie -STR_1080 :Film: {ENDQUOTES}Avenging aviators{ENDQUOTES} -STR_1081 :3D-film: {ENDQUOTES}Mouse tails{ENDQUOTES} +STR_1080 :Film: {ENDQUOTES}Avenging Aviators{ENDQUOTES} +STR_1081 :3D-film: {ENDQUOTES}Mouse Tails{ENDQUOTES} STR_1082 :Ruimteringenmodus STR_1083 :Beginnersstand STR_1084 :LIM-lancering -STR_1085 :Film: {ENDQUOTES}Thrill riders{ENDQUOTES} -STR_1086 :3D-film: {ENDQUOTES}Storm chasers{ENDQUOTES} -STR_1087 :3D-film: {ENDQUOTES}Space raiders{ENDQUOTES} +STR_1085 :Film: {ENDQUOTES}Thrill Riders{ENDQUOTES} +STR_1086 :3D-film: {ENDQUOTES}Storm Chasers{ENDQUOTES} +STR_1087 :3D-film: {ENDQUOTES}Space Raiders{ENDQUOTES} STR_1088 :Intense stand -STR_1089 :Gestoorde stand +STR_1089 :Waanzinnige stand STR_1090 :Spookhuismodus STR_1091 :Circusmodus STR_1092 :Neerwaartse lancering -STR_1093 :Crooked housestand +STR_1093 :Crookedhousemodus STR_1094 :Vrijevalmodus STR_1095 :Voortdurend circuit met blokken STR_1096 :Lancering @@ -1171,13 +1171,13 @@ STR_1169 :(Geen) STR_1170 :{STRING} STR_1171 :{RED}Gesloten - - STR_1172 :{YELLLOW}{STRINGID} - - -STR_1173 :{SMALLFONT}{BLACK}Voetpaden en wachtrijen neerzetten +STR_1173 :{SMALLFONT}{BLACK}Voetpaden en wachtrijen aanleggen STR_1174 :Banier in de weg STR_1175 :Kan dit niet op hellend voetpad neerzetten -STR_1176 :Kan hier geen voetpad neerzetten... +STR_1176 :Kan hier geen voetpad aanleggen... STR_1177 :Kan dit voetpad niet verwijderen... STR_1178 :Landhelling is ongeschikt -STR_1179 :Voetpad staat in de weg +STR_1179 :Voetpad ligt in de weg STR_1180 :Dit kan niet onder water worden gebouwd! STR_1181 :Voetpaden STR_1182 :Type @@ -1345,7 +1345,7 @@ STR_1343 :{DURATION} / STR_1344 :{WINDOW_COLOUR_2}Lengte: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1345 :{LENGTH} STR_1346 :{LENGTH} / -STR_1347 :{WINDOW_COLOUR_2}Gem. snlhd: {BLACK}{VELOCITY} +STR_1347 :{WINDOW_COLOUR_2}Gem. snelheid: {BLACK}{VELOCITY} STR_1348 :{WINDOW_COLOUR_2}Max. pos. vert. G-krachten: {BLACK}{COMMA2DP32}g STR_1349 :{WINDOW_COLOUR_2}Max. pos. vert. G-krachten: {OUTLINE}{RED}{COMMA2DP32}g STR_1350 :{WINDOW_COLOUR_2}Max. neg. vert. G-krachten: {BLACK}{COMMA2DP32}g @@ -1500,7 +1500,7 @@ STR_1498 :{SMALLFONT}{OPENQUOTES}Ik sta al eeuwen in de rij voor {STRINGID}{E STR_1499 :{SMALLFONT}{OPENQUOTES}Ik ben moe{ENDQUOTES} STR_1500 :{SMALLFONT}{OPENQUOTES}Ik heb honger{ENDQUOTES} STR_1501 :{SMALLFONT}{OPENQUOTES}Ik heb dorst{ENDQUOTES} -STR_1502 :{SMALLFONT}{OPENQUOTES}Ik moet naar de WC{ENDQUOTES} +STR_1502 :{SMALLFONT}{OPENQUOTES}Ik moet naar de wc{ENDQUOTES} STR_1503 :{SMALLFONT}{OPENQUOTES}Ik kan {STRINGID} niet vinden{ENDQUOTES} STR_1504 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor het gebruik van {STRINGID}{ENDQUOTES} STR_1505 :{SMALLFONT}{OPENQUOTES}Ik ga niet in {STRINGID} als het regent{ENDQUOTES} @@ -1588,7 +1588,7 @@ STR_1586 :{SMALLFONT}{OPENQUOTES}Deze actiefoto van {STRINGID} is erg goedkoo STR_1587 :{SMALLFONT}{OPENQUOTES}Deze krakeling van {STRINGID} is erg goedkoop{ENDQUOTES} STR_1588 :{SMALLFONT}{OPENQUOTES}Deze warme chocolademelk van {STRINGID} is erg goedkoop{ENDQUOTES} STR_1589 :{SMALLFONT}{OPENQUOTES}Deze ijsthee van {STRINGID} is erg goedkoop{ENDQUOTES} -STR_1590 :{SMALLFONT}{OPENQUOTES}Deze funnel cake van {STRINGID} is erg goedkoop{ENDQUOTES} +STR_1590 :{SMALLFONT}{OPENQUOTES}Deze oliebollen van {STRINGID} zijn erg goedkoop{ENDQUOTES} STR_1591 :{SMALLFONT}{OPENQUOTES}Deze zonnebril van {STRINGID} is erg goedkoop{ENDQUOTES} STR_1592 :{SMALLFONT}{OPENQUOTES}Deze rundernoedels van {STRINGID} zijn erg goedkoop{ENDQUOTES} STR_1593 :{SMALLFONT}{OPENQUOTES}Deze rijstnoedels van {STRINGID} zijn erg goedkoop{ENDQUOTES} @@ -1620,7 +1620,7 @@ STR_1618 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een actiefoto van STR_1619 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een krakeling van {STRINGID}{ENDQUOTES} STR_1620 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor warme chocolademelk van {STRINGID}{ENDQUOTES} STR_1621 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor ijsthee van {STRINGID}{ENDQUOTES} -STR_1622 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een funnel cake van {STRINGID}{ENDQUOTES} +STR_1622 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een oliebol van {STRINGID}{ENDQUOTES} STR_1623 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor een zonnebril van {STRINGID}{ENDQUOTES} STR_1624 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor rundernoedels van {STRINGID}{ENDQUOTES} STR_1625 :{SMALLFONT}{OPENQUOTES}Zoveel betaal ik niet voor rijstnoedels van {STRINGID}{ENDQUOTES} @@ -1653,8 +1653,8 @@ STR_1651 :{SMALLFONT}{OPENQUOTES}Leuke attractie! Maar niet zo goed als de Ph STR_1652 :{SMALLFONT}{OPENQUOTES}Ik ben zo enthousiast - het is een attractie van Intamin!{ENDQUOTES} STR_1653 :{SMALLFONT}{OPENQUOTES}...en nu zijn we in {STRINGID}!{ENDQUOTES} STR_1654 :{WINDOW_COLOUR_2}Recente gedachten: -STR_1655 :{SMALLFONT}{BLACK}Voetpaden op land bouwen -STR_1656 :{SMALLFONT}{BLACK}Voetpad over bruggen of door tunnels bouwen +STR_1655 :{SMALLFONT}{BLACK}Voetpaden op land aanleggen +STR_1656 :{SMALLFONT}{BLACK}Voetpad over bruggen of door tunnels aanleggen STR_1657 :{WINDOW_COLOUR_2}Voorkeursintensiteit: STR_1658 :{WINDOW_COLOUR_2}{BLACK}minder dan {COMMA16} STR_1659 :{WINDOW_COLOUR_2}{BLACK}tussen {COMMA16} en {COMMA16} @@ -1665,7 +1665,7 @@ STR_1663 :{WINDOW_COLOUR_2}Misselijkheid: STR_1664 :{WINDOW_COLOUR_2}Energie: STR_1665 :{WINDOW_COLOUR_2}Honger: STR_1666 :{WINDOW_COLOUR_2}Dorst: -STR_1667 :{WINDOW_COLOUR_2}WC-behoefte: +STR_1667 :{WINDOW_COLOUR_2}Wc-behoefte: STR_1668 :{WINDOW_COLOUR_2}Voldoening: {BLACK}onbekend STR_1669 :{WINDOW_COLOUR_2}Voldoening: {BLACK}{COMMA16}% STR_1670 :{WINDOW_COLOUR_2}Totaal aantal bezoekers: {BLACK}{COMMA32} @@ -1694,7 +1694,7 @@ STR_1692 :{WINDOW_COLOUR_2} Kosten: {BLACK}vanaf {CURRENCY} STR_1693 :{SMALLFONT}{BLACK}Bezoekers STR_1694 :{SMALLFONT}{BLACK}Werknemers STR_1695 :{SMALLFONT}{BLACK}Inkomsten en kosten -STR_1696 :{SMALLFONT}{BLACK}Klanteninformatie +STR_1696 :{SMALLFONT}{BLACK}Klantinformatie STR_1697 :Dit kan niet op wachtrijen worden geplaatst STR_1698 :Dit kan alleen op wachtrijen worden geplaatst STR_1699 :Teveel personen in het spel @@ -1775,7 +1775,7 @@ STR_1773 :Een attractie mag maar één actiefotogedeelte hebben STR_1774 :Een attractie mag maar één kabellift hebben STR_1775 :Uit STR_1776 :Aan -STR_1777 :{WINDOW_COLOUR_2}Muziek: +STR_1777 :{WINDOW_COLOUR_2}Muziek STR_1778 :{STRINGID} - - STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Pandapak STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tijgerpak @@ -1787,7 +1787,7 @@ STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Ridderkostuum STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronautenpak STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandietenkostuum STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriffkostuum -STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Piratenpak +STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Piratenkostuum STR_1790 :{SMALLFONT}{BLACK}Selecteer de uniformkleur voor dit type werknemer STR_1791 :{WINDOW_COLOUR_2}Uniformkleur: STR_1792 :Gaat {STRINGID} repareren @@ -1878,9 +1878,9 @@ STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Attracties inspect STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Attracties repareren STR_1878 :{WINDOW_COLOUR_2}Inspectie: STR_1879 :Elke 10 minuten -STR_1880 :Elke 20 minutes -STR_1881 :Elke 30 minutes -STR_1882 :Elke 45 minutes +STR_1880 :Elke 20 minuten +STR_1881 :Elke 30 minuten +STR_1882 :Elke 45 minuten STR_1883 :Elk uur STR_1884 :Elke 2 uur STR_1885 :Nooit @@ -1928,7 +1928,7 @@ STR_1926 :{SMALLFONT} STR_1927 :{YELLOW}{STRINGID} is kapot gegaan STR_1928 :{RED}{STRINGID} is neergestort! STR_1929 :{RED}{STRINGID} is nog steeds niet gerepareerd{NEWLINE}Controleer waar je monteurs zijn en overweeg ze beter te organiseren -STR_1930 :{SMALLFONT}{BLACK}Volgen van bezoeker aan- of uitschakelen - (Als volgen is ingeschakeld, worden de activiteit van deze bezoeker vermeld in het berichtengebied) +STR_1930 :{SMALLFONT}{BLACK}Volgen van bezoeker in- of uitschakelen - (Als volgen is ingeschakeld, worden de activiteiten van deze bezoeker vermeld in het berichtengebied) STR_1931 :{STRINGID} staat nu in de rij voor {STRINGID} STR_1932 :{STRINGID} is nu in {STRINGID} STR_1933 :{STRINGID} is nu in {STRINGID} @@ -2104,7 +2104,7 @@ STR_2102 :{WINDOW_COLOUR_2}Prijs actiefoto: STR_2103 :{WINDOW_COLOUR_2}Prijs krakeling: STR_2104 :{WINDOW_COLOUR_2}Prijs warme chocolademelk: STR_2105 :{WINDOW_COLOUR_2}Prijs ijsthee: -STR_2106 :{WINDOW_COLOUR_2}Prijs funnel cake: +STR_2106 :{WINDOW_COLOUR_2}Prijs oliebollen: STR_2107 :{WINDOW_COLOUR_2}Prijs zonnebril: STR_2108 :{WINDOW_COLOUR_2}Prijs rundernoedels: STR_2109 :{WINDOW_COLOUR_2}Prijs rijstnoedels: @@ -2126,7 +2126,7 @@ STR_2124 :Actiefoto STR_2125 :Krakeling STR_2126 :Warme chocolademelk STR_2127 :IJsthee -STR_2128 :Funnel cake +STR_2128 :Oliebol STR_2129 :Zonnebril STR_2130 :Rundernoedels STR_2131 :Rijstnoedels @@ -2148,7 +2148,7 @@ STR_2146 :Actiefoto's STR_2147 :Krakelingen STR_2148 :Warme chocolademelk STR_2149 :IJsthee -STR_2150 :Funnel cakes +STR_2150 :Oliebollen STR_2151 :Zonnebrillen STR_2152 :Rundernoedels STR_2153 :Rijstnoedels @@ -2170,7 +2170,7 @@ STR_2168 :een actiefoto STR_2169 :een krakeling STR_2170 :warme chocolademelk STR_2171 :ijsthee -STR_2172 :een funnel cake +STR_2172 :een oliebol STR_2173 :een zonnebril STR_2174 :rundernoedels STR_2175 :rijstnoedels @@ -2192,7 +2192,7 @@ STR_2190 :Actiefoto van {STRINGID} STR_2191 :Krakeling STR_2192 :Warme chocolademelk STR_2193 :IJsthee -STR_2194 :Funnel cake +STR_2194 :Oliebollen STR_2195 :Zonnebril STR_2196 :Rundernoedels STR_2197 :Rijstnoedels @@ -2297,13 +2297,13 @@ STR_2295 :{SMALLFONT}{BLACK}Zijkant land aanpassen STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} betaald voor entree STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} attractie STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} attracties -STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} stuk voedsel -STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} stuks voedsel +STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} etenswaar +STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} etenswaren STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} drankje STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} drankjes STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} souvenir STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} uitgegeven aan {BLACK}{COMMA16} souvenirs -STR_2305 :Baantontwerpbestanden +STR_2305 :Baanontwerpbestanden STR_2306 :Baanontwerp opslaan STR_2307 :Ontwerp voor {STRINGID} selecteren STR_2308 :Baanontwerpen voor {STRINGID} @@ -2311,7 +2311,7 @@ STR_2309 :Nieuw baanontwerp installeren STR_2310 :Eigen ontwerp bouwen STR_2311 :{WINDOW_COLOUR_2}Spanningswaarde: {BLACK}{COMMA2DP32} (ongeveer) STR_2312 :{WINDOW_COLOUR_2}Intensiteitswaarde: {BLACK}{COMMA2DP32} (ongeveer) -STR_2313 :{WINDOW_COLOUR_2}Missellijkheidswaarde: {BLACK}{COMMA2DP32} (ongeveer) +STR_2313 :{WINDOW_COLOUR_2}Misselijkheidswaarde: {BLACK}{COMMA2DP32} (ongeveer) STR_2314 :{WINDOW_COLOUR_2}Lengte: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Kosten: {BLACK}ongeveer {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Vereiste ruimte: {BLACK}{COMMA16} x {COMMA16} blokken @@ -2339,7 +2339,7 @@ STR_2337 :Duitse mark (DM) STR_2338 :Yen ({YEN}) STR_2339 :Peseta (Pts) STR_2340 :Lire (L) -STR_2341 :Guldens (fl.) +STR_2341 :Guldens (fl) STR_2342 :Kronen (kr) STR_2343 :Euro's ({EURO}) STR_2344 :Engelse maten @@ -2347,7 +2347,7 @@ STR_2345 :Metriek stelsel STR_2346 :Weergave STR_2347 :{RED}{STRINGID} is verdronken! STR_2348 :{SMALLFONT}{BLACK}Statistieken voor deze werknemer tonen -STR_2349 :{WINDOW_COLOUR_2}Loon: {BLACK}{CURRENCY} per month +STR_2349 :{WINDOW_COLOUR_2}Loon: {BLACK}{CURRENCY} per maand STR_2350 :{WINDOW_COLOUR_2}In dienst genomen: {BLACK}{MONTHYEAR} STR_2351 :{WINDOW_COLOUR_2}Velden gemaaid: {BLACK}{COMMA16} STR_2352 :{WINDOW_COLOUR_2}Bloemen water gegeven: {BLACK}{COMMA16} @@ -2360,7 +2360,7 @@ STR_2358 :Eenheden STR_2359 :Echte waarden STR_2360 :{WINDOW_COLOUR_2}Schermresolutie: STR_2361 :Landschapslijnen verzachten -STR_2362 :{SMALLFONT}{BLACK}Verzachting van lijnen tussen blokken land aan- of uitzetten +STR_2362 :{SMALLFONT}{BLACK}Verzachting van lijnen tussen landschapstegels aan- of uitzetten STR_2363 :Raster weergeven op landschap STR_2364 :{SMALLFONT}{BLACK}Rasterlijnen op land aan- of uitzetten STR_2365 :De bank wil je lening niet verhogen! @@ -2382,19 +2382,19 @@ STR_2380 :{SMALLFONT}{BLACK}Kleiner stuk water aanpassen STR_2381 :{SMALLFONT}{BLACK}Groter stuk water aanpassen STR_2382 :Land STR_2383 :Water -STR_2384 :{WINDOW_COLOUR_2}Je doel: +STR_2384 :{WINDOW_COLOUR_2}Je doelstelling: STR_2385 :{BLACK}Geen -STR_2386 :{BLACK}Om minstens {COMMA16} bezoekers in je park toe hebben aan het einde van {MONTHYEAR}, met een parkwaardering van ten minste 600 -STR_2387 :{BLACK}Om een parkwaarde van minstens {POP16}{POP16}{CURRENCY} te hebben aan het einde van {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} +STR_2386 :{BLACK}Om ten minste {COMMA16} bezoekers in je park te hebben aan het einde van {MONTHYEAR}, met een parkwaardering van ten minste 600 +STR_2387 :{BLACK}Om een parkwaarde van ten minste {POP16}{POP16}{CURRENCY} te hebben aan het einde van {PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} STR_2388 :{BLACK}Om plezier te hebben! STR_2389 :{BLACK}Om de beste {STRINGID} te bouwen! -STR_2390 :{BLACK}Om 10 verschillende typen achtbanen in je park te hebben, elk met een spanningswaarde van minstens 6,00 -STR_2391 :{BLACK}Om minstens {COMMA16} bezoekers in je park te hebben. Je parkwaardering mag geen moment onder de 700 komen! -STR_2392 :{BLACK}Om in één maand minstens {POP16}{POP16}{CURRENCY} aan attractiekaartjes te verdienen -STR_2393 :{BLACK}Om 10 verschillende typen achtbanen in je park te hebben, elk met een lengte van minstens {LENGTH} en een spanningswaarde van minstens 7,00 -STR_2394 :{BLACK}Om alle 5 deels gebouwde achtbanen in je park af te maken, ek met een spanningswaarde van minstens {POP16}{POP16}{COMMA2DP32} -STR_2395 :{BLACK}Om je lening terug te betalen en een parkwaarde van minstens {POP16}{POP16}{CURRENCY} te bereiken -STR_2396 :{BLACK}Om in één maand minstens {POP16}{POP16}{CURRENCY} aan de verkoop van eten, drinken en souvenirs te verdienen +STR_2390 :{BLACK}Om 10 verschillende typen achtbanen in je park te hebben, elk met een spanningswaarde van ten minste 6,00 +STR_2391 :{BLACK}Om ten minste {COMMA16} bezoekers in je park te hebben. Je parkwaardering mag geen moment onder de 700 komen! +STR_2392 :{BLACK}Om in één maand ten minste {POP16}{POP16}{CURRENCY} aan attractiekaartjes te verdienen +STR_2393 :{BLACK}Om 10 verschillende typen achtbanen in je park te hebben, elk met een lengte van ten minste {LENGTH} en een spanningswaarde van ten minste 7,00 +STR_2394 :{BLACK}Om alle 5 deels gebouwde achtbanen in je park af te maken, ek met een spanningswaarde van ten minste {POP16}{POP16}{COMMA2DP32} +STR_2395 :{BLACK}Om je lening terug te betalen en een parkwaarde van ten minste {POP16}{POP16}{CURRENCY} te bereiken +STR_2396 :{BLACK}Om in één maand ten minste {POP16}{POP16}{CURRENCY} aan de verkoop van eten, drinken en souvenirs te verdienen STR_2397 :Geen STR_2398 :Aantal bezoekers op een bepaalde datum STR_2399 :Parkwaarde op een bepaalde datum @@ -2402,11 +2402,11 @@ STR_2400 :Plezier hebben STR_2401 :De beste attractie te bouwen STR_2402 :Tien achtbanen bouwen STR_2403 :Aantal bezoekers in het park -STR_2404 :Maandelijks inkomen van attractiekaartjes +STR_2404 :Maandelijks inkomen uit attractiekaartjes STR_2405 :Tien achtbanen van een bepaalde lengte bouwen STR_2406 :Vijf achtbanen afmaken STR_2407 :Lening terugbetalen en een bepaalde parkwaarde bereiken -STR_2408 :Maandelijks inkomen van voedsel/souvenirs +STR_2408 :Maandelijks inkomen uit etenswaren/souvenirs STR_2409 :{WINDOW_COLOUR_2}Lopende marketingcampagnes STR_2410 :{BLACK}Geen STR_2411 :{WINDOW_COLOUR_2}Beschikbare marketingcampagnes @@ -2512,7 +2512,7 @@ STR_2510 :Toon hoogtemarkeringen op paden STR_2511 :Land aanpassen STR_2512 :Water aanpassen STR_2513 :Decor bouwen -STR_2514 :Voetpaden bouwen +STR_2514 :Voetpaden aanleggen STR_2515 :Nieuwe attractie bouwen STR_2516 :Financiële informatie tonen STR_2517 :Onderzoeksinformatie tonen @@ -2777,7 +2777,7 @@ STR_2775 :Volledig scherm (bureaublad) STR_2776 :Taal STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} -STR_2779 :Kijkvenster #{COMMA16} +STR_2779 :Kijkvenster {COMMA16} STR_2780 :Extra kijkvenster STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} STR_2782 :SHIFT + @@ -2786,8 +2786,8 @@ STR_2784 :Sneltoets wijzigen STR_2785 :{WINDOW_COLOUR_2}Voer een nieuwe sneltoets in voor:{NEWLINE}{OPENQUOTES}{STRINGID}{ENDQUOTES} STR_2786 :{SMALLFONT}{BLACK}Klik op de beschrijving om een nieuwe sneltoets in te stellen STR_2787 :{WINDOW_COLOUR_2}Parkwaarde: {BLACK}{CURRENCY} -STR_2788 :{WINDOW_COLOUR_2}Gefeliciteerd!{NEWLINE}{BLACK}Je hebt je doel bereikt met een bedrijfswaarde van {CURRENCY}! -STR_2789 :{WINDOW_COLOUR_2}Je hebt je doel niet bereikt! +STR_2788 :{WINDOW_COLOUR_2}Gefeliciteerd!{NEWLINE}{BLACK}Je hebt je doelstelling bereikt met een bedrijfswaarde van {CURRENCY}! +STR_2789 :{WINDOW_COLOUR_2}Je hebt je doelstelling niet bereikt! STR_2790 :Naam invoeren voor scenario-overzicht STR_2791 :Naam invoeren STR_2792 :Voer je naam in voor het scenario-overzicht: @@ -2805,9 +2805,9 @@ STR_2803 :{SMALLFONT}{BLACK}Parkkaart tonen waarop deze bezoekers gemarkeerd STR_2804 :{SMALLFONT}{BLACK}Parkkaart tonen waarop deze werknemers gemarkeerd zijn STR_2805 :{SMALLFONT}{BLACK}Parkkaart tonen STR_2806 :{RED}Bezoekers klagen over de smerige voetpaden in je park{NEWLINE}Controleer waar je klusjesmannen zijn en overweeg om ze beter te organiseren -STR_2807 :{RED}Bezoekers klagen over de hoeveelheid rommel{NEWLINE}Controleer waar je klusjesmannen zijn en overweeg om ze beter te organiseren +STR_2807 :{RED}Bezoekers klagen over de hoeveelheid rommel in je park{NEWLINE}Controleer waar je klusjesmannen zijn en overweeg om ze beter te organiseren STR_2808 :{RED}Bezoekers klagen over het vandalisme in je park{NEWLINE}Controleer waar je bewakers zijn en overweeg om ze beter te organiseren -STR_2809 :{RED}Bezoekers hebben honger en kunnen geen plek vinden om voedsel te kopen +STR_2809 :{RED}Bezoekers hebben honger en kunnen geen plek vinden om eten te kopen STR_2810 :{RED}Bezoekers hebben dorst en kunnen geen plek vinden om drinken te kopen STR_2811 :{RED}Bezoekers klagen omdat ze de toiletten in je park niet kunnen vinden STR_2812 :{RED}Bezoekers raken verdwaald of komen vast te zitten{NEWLINE}Controleer of je de indeling van je voetpaden kunt verbeteren @@ -3060,7 +3060,7 @@ STR_3058 :Stenen muren STR_3059 :Heggen STR_3060 :Blokken ijs STR_3061 :Houten schuttingen -STR_3062 :{SMALLFONT}{BLACK}Standard achtbaanspoor +STR_3062 :{SMALLFONT}{BLACK}Standaard achtbaanspoor STR_3063 :{SMALLFONT}{BLACK}Watergedeelte (spoor onder water) STR_3064 :Eenvoudige parken STR_3065 :Uitdagende parken @@ -3181,7 +3181,7 @@ STR_3179 :Er moet minstens één attractie worden geselecteerd STR_3180 :Ongeldige selectie van objecten STR_3181 :Objectselectie - {STRINGID} STR_3182 :Er moet een parkingang worden geselecteerd -STR_3183 :Er moet een watertyoe worden geselecteerd +STR_3183 :Er moet een watertype worden geselecteerd STR_3184 :Attracties/voertuigen STR_3185 :Klein decor STR_3186 :Groot decor @@ -3203,7 +3203,7 @@ STR_3201 :Objectselectie STR_3202 :Landschap bewerken STR_3203 :Uitvindingen instellen STR_3204 :Opties selecteren -STR_3205 :Doel selecteren +STR_3205 :Doelstelling selecteren STR_3206 :Scenario opslaan STR_3207 :Achtbaanontwerper STR_3208 :Baanontwerpbeheer @@ -3239,7 +3239,7 @@ STR_3237 :{SMALLFONT}{BLACK}Toon parkopties STR_3238 :Zonder geld STR_3239 :{SMALLFONT}{BLACK}Schakel geld compleet uit, zodat het park geen financiële beperkingen heeft STR_3240 :{WINDOW_COLOUR_2}Startsaldo: -STR_3241 :{WINDOW_COLOUR_2}Startlening +STR_3241 :{WINDOW_COLOUR_2}Startlening: STR_3242 :{WINDOW_COLOUR_2}Maximale lening: STR_3243 :{WINDOW_COLOUR_2}Jaarlijkse rente: STR_3244 :Marketingcampagnes niet toestaan @@ -3280,12 +3280,12 @@ STR_3278 :{WINDOW_COLOUR_2}Prijs bouwrechten: STR_3279 :Gratis entree / Per rit betalen STR_3280 :Betaalde toegang / Attracties gratis STR_3281 :{WINDOW_COLOUR_2}Entreeprijs: -STR_3282 :{SMALLFONT}{BLACK}Doel en parknaam selecteren +STR_3282 :{SMALLFONT}{BLACK}Doelstelling en parknaam selecteren STR_3283 :{SMALLFONT}{BLACK}Beschermde attracties selecteren STR_3284 :Doelselectie STR_3285 :Beschermde attracties -STR_3286 :{SMALLFONT}{BLACK}Selecteer doel voor dit scenario -STR_3287 :{WINDOW_COLOUR_2}Doel: +STR_3286 :{SMALLFONT}{BLACK}Selecteer doelstelling voor dit scenario +STR_3287 :{WINDOW_COLOUR_2}Doelstelling: STR_3288 :{SMALLFONT}{BLACK}Selecteer klimaat: STR_3289 :{WINDOW_COLOUR_2}Klimaat: STR_3290 :Koel en nat @@ -3299,7 +3299,7 @@ STR_3297 :{SMALLFONT}{BLACK}Details van dit park/scenario aanpassen STR_3298 :{WINDOW_COLOUR_2}Parknaam: {BLACK}{STRINGID} STR_3299 :{WINDOW_COLOUR_2}Parkdetails: STR_3300 :{WINDOW_COLOUR_2}Scenarionaam: {BLACK}{STRINGID} -STR_3301 :{WINDOW_COLOUR_2}Datum doel: +STR_3301 :{WINDOW_COLOUR_2}Datum doelstelling: STR_3302 :{WINDOW_COLOUR_2}{MONTHYEAR} STR_3303 :{WINDOW_COLOUR_2}Aantal bezoekers: STR_3304 :{WINDOW_COLOUR_2}Parkwaarde: @@ -3320,7 +3320,7 @@ STR_3318 :{SMALLFONT}{BLACK}Selecteer in welke groep dit scenario moet versch STR_3319 :{WINDOW_COLOUR_2}Scenariogroep: STR_3320 :Kan scenariobestand niet opslaan... STR_3321 :Nieuwe objecten successvol geïnstalleerd -STR_3322 :{WINDOW_COLOUR_2}Doel: {BLACK}{STRINGID} +STR_3322 :{WINDOW_COLOUR_2}Doelstelling: {BLACK}{STRINGID} STR_3323 :Ontbrekende objectdata, ID: STR_3324 :Vereist uitbreidingspakket: STR_3325 :Vereist een uitbreidingspakket @@ -3329,8 +3329,8 @@ STR_3327 :Startpositie voor bezoekers niet aangegeven STR_3328 :Kan niet verder naar volgende stap... STR_3329 :Parkingang nog niet gebouwd STR_3330 :Park moet land bezitten -STR_3331 :Pad van de parkingang naar de rand van de kaart is incompleet of te complex; het pad mag maar één blok breed zijn en moet zo min mogelijk kruisingen en bochten bevatten -STR_3332 :Parkingang staan achterstevoren of heeft geen pad naar de rand van de kaart +STR_3331 :Pad van de parkingang naar de rand van de kaart is incompleet of te complex; het pad mag maar één tegel breed zijn en moet zo min mogelijk kruisingen en bochten bevatten +STR_3332 :Parkingang staat achterstevoren of heeft geen pad naar de rand van de kaart STR_3333 :Plug-inobjecten meeleveren in opgeslagen spellen STR_3334 :{SMALLFONT}{BLACK}Selecteer of toegevoegde (niet-standaard) objecten in opgeslagen spellen en scenario's moeten worden meegeleverd, zodat ze geopend kunnen worden door iemand die deze objecten nog niet heeft STR_3335 :Achtbaanontwerper - Attractietypes en -voertuigen selecteren @@ -3360,7 +3360,7 @@ STR_3358 :Kan het baanontwerp niet verwijderen... STR_3359 :{BLACK}Geen baanontwerpen van dit type STR_3360 :Waarschuwing! STR_3361 :Te veel baanontwerpen van dit type; sommige staan niet in de lijst -STR_3362 :Mixing via softwarebuffer forceren +STR_3362 :Mixen via softwarebuffer forceren STR_3363 :{SMALLFONT}{BLACK}Selecteer deze optie om de prestaties te verbeteren als het spel vertraagt bij het afspelen van geluiden of als er ruis hoorbaar is STR_3364 :Meer opties STR_3365 :{SMALLFONT}{BLACK}Maakt naast selectie van decorgroepen ook selectie van losse items mogelijk @@ -3368,9 +3368,9 @@ STR_3366 :{BLACK}= Attractie STR_3367 :{BLACK}= Eetkraampje STR_3368 :{BLACK}= Drankkraampje STR_3369 :{BLACK}= Souvenirkraampje -STR_3370 :{BLACK}= Infokiosk +STR_3370 :{BLACK}= Informatiekiosk STR_3371 :{BLACK}= Eerste hulp -STR_3372 :{BLACK}= PIN +STR_3372 :{BLACK}= Geldautomaat STR_3373 :{BLACK}= Toilet STR_3374 :Waarschuwing: teveel objecten geselecteerd! STR_3375 :Niet alle objecten in deze decorgroep kunnen worden geselecteerd @@ -3379,13 +3379,13 @@ STR_3377 :{SMALLFONT}{BLACK}Bestand met nieuw baanontwerp installeren STR_3378 :Installeren STR_3379 :Annuleren STR_3380 :Kan dit baanontwerp niet installeren... -STR_3381 :Bestand is niet compatible of bevat ongeldige gegevens +STR_3381 :Bestand is niet compatibel of bevat ongeldige gegevens STR_3382 :Kopiëren van bestand mislukt STR_3383 :Selecteer nieuwe naam voor dit baanontwerp STR_3384 :Er bestaat al een baanontwerp met deze naam; verzin een andere naam voor dit ontwerp: STR_3385 :Tutorial voor beginners -STR_3386 :Toturial voor eigen ontwerpen -STR_3387 :Toturial voor achtbanen bouwen +STR_3386 :Tutorial voor eigen ontwerpen +STR_3387 :Tutorial voor achtbanen bouwen STR_3388 :Kan niet naar de geselecteerde modus overschakelen STR_3389 :Kan extra decorstukken niet selecteren... STR_3390 :Te veel items geselecteerd @@ -3397,14 +3397,14 @@ STR_3395 :{SMALLFONT}{BLACK}Dingen bouwen vanaf deze hoogte is een beetje las STR_3396 :{SMALLFONT}{BLACK}Laten we een simpele attractie bouwen om met dit park te beginnen... STR_3397 :{SMALLFONT}{BLACK}Het witte 'spookplaatje' laat zien waar de attractie zal worden gebouwd. Beweeg de muis er naar toe en klik om het te bouwen... STR_3398 :{SMALLFONT}{BLACK}Attracties hebben een ingang en een uitgang nodig. Beweeg de muis naar een tegeltje aan de rand van de attractie en klik om de ingang te bouwen. Klik nog een keer ergens om de uitgang te bouwen... -STR_3399 :{SMALLFONT}{BLACK}We moeten een voetpad bouwen zodat bezoekers onze nieuwe attractie kunnen bereiken... +STR_3399 :{SMALLFONT}{BLACK}We moeten een voetpad aanleggen zodat bezoekers onze nieuwe attractie kunnen bereiken... STR_3400 :{SMALLFONT}{BLACK}Voor het pad naar de ingang gebruiken we een speciaal wachtrij-voetpad... STR_3401 :{SMALLFONT}{BLACK}Voor de uitgang maakt het niet uit welk pad je gebruikt. Een normaal pad is goed... STR_3402 :{SMALLFONT}{BLACK}Oké dan, laten we de attractie openen! Om de attractie te openen klikken we op het knopje met de vlag in het attractievenster en selecteren we 'openen'... STR_3403 :{SMALLFONT}{BLACK}Maar waar zijn de bezoekers?! STR_3404 :{SMALLFONT}{BLACK}Oh, juist - het park is nog gesloten! Laten we ons park openen... STR_3405 :{SMALLFONT}{BLACK}Terwijl we op onze eerste bezoekers wachten kunnen we wat decorstukken neerzetten... -STR_3406 :{SMALLFONT}{BLACK}Dit is ons lege park. We gaan een simpele zelfontworpen attractie bouwen... +STR_3406 :{SMALLFONT}{BLACK}Dit is ons lege park. We gaan een simpele, zelfontworpen attractie bouwen... STR_3407 :{SMALLFONT}{BLACK}Ten eerste hebben we een startpositie nodig... STR_3408 :{SMALLFONT}{BLACK}Het stuk baan dat we net gebouwd hebben is een 'station' en zorgt ervoor dat bezoekers in en uit kunnen stappen... STR_3409 :{SMALLFONT}{BLACK}We verlengen het perron een beetje door nog wat stationsgedeeltes aan te leggen... @@ -3414,7 +3414,7 @@ STR_3412 :{SMALLFONT}{BLACK}De bocht is nog niet gebouwd, maar het witte spoo STR_3413 :{SMALLFONT}{BLACK}Nu willen we een recht stuk bouwen, dus klikken we op het knopje voor 'recht stuk'... STR_3414 :{SMALLFONT}{BLACK}De baan is af, we kunnen nu de ingang en uitgang bouwen... STR_3415 :{SMALLFONT}{BLACK}Laten we testen of onze attractie werkt... -STR_3416 :{SMALLFONT}{BLACK}Terwijl de attractie wordt getest kunnen we een wachtrij en uitgangspad bouwen... +STR_3416 :{SMALLFONT}{BLACK}Terwijl de attractie wordt getest kunnen we een wachtrij en uitgangspad aanleggen... STR_3417 :{SMALLFONT}{BLACK}Goed - laten we het park en onze attractie openen... STR_3418 :{SMALLFONT}{BLACK}Onze nieuwe attractie is niet heel erg spannend; misschien moeten we wat decor toevoegen? STR_3419 :{SMALLFONT}{BLACK}Om decor te bouwen boven ander decor (of midden in de lucht) hou je de SHIFT-toets ingedrukt en beweeg je de muis om de hoogte te bepalen... @@ -3425,13 +3425,13 @@ STR_3423 :{SMALLFONT}{BLACK}Er zijn veel kant-en-klare achtbanen, maar wij ga STR_3424 :{SMALLFONT}{BLACK}Zo, het station is af. Nu hebben we een liftheuvel nodig... STR_3425 :{SMALLFONT}{BLACK}Achtbaankarretjes zijn niet aangedreven, dus is een 'kettinglift' nodig om ze eerst een heuvel op te trekken... STR_3426 :{SMALLFONT}{BLACK}Goed, de liftheuvel is klaar - nu de eerste afdaling... -STR_3427 :{SMALLFONT}{BLACK}Die bochten zijn een slecht idee; de passagiers zullen naar de zijkanten geslingerd worden door de G-kracht wanneer de trein er doorheen raast... +STR_3427 :{SMALLFONT}{BLACK}Die bochten zijn een slecht idee; de passagiers zullen naar de zijkanten geslingerd worden door de zijwaartse G-krachten wanneer de trein er doorheen raast... STR_3428 :{SMALLFONT}{BLACK}De bochten een banking geven (schuinleggen) zal de rit prettiger maken, aangezien de passagiers in hun stoelen geduwd zullen worden in plaats van naar de zijkanten... STR_3429 :{SMALLFONT}{BLACK}Dit gaat niet werken! Kijk naar de hoogtemarkeringen: de tweede heuvel is hoger dan de liftheuvel... STR_3430 :{SMALLFONT}{BLACK}Om ervoor te zorgen dat de trein terug naar het station komt, moet elke heuvel iets lager zijn dan de heuvel daarvoor... STR_3431 :{SMALLFONT}{BLACK}Dat ziet er beter uit! Onze trein zou het nu moeten halen! Laten we wat meer bochtige stukjes toevoegen... STR_3432 :{SMALLFONT}{BLACK}We moeten de trein afremmen voordat we de laatste bocht en het station inkomen, dus laten we wat remmen toevoegen... -STR_3433 :{SMALLFONT}{BLACK}En tenslotte voegen we 'blokremmen' toe. Die zorgen ervoor dat twee treinen tegelijk (en veilig) op de baan kunnen zitten... +STR_3433 :{SMALLFONT}{BLACK}En tenslotte voegen we 'blokremmen' toe. Die zorgen ervoor dat twee treinen tegelijk (en veilig) op de baan kunnen rijden... STR_3434 :{SMALLFONT}{BLACK}Laten we kijken of onze achtbaan werkt! STR_3435 :{SMALLFONT}{BLACK}Fantastisch, hij werkt! Laten we wat voetpaden aanleggen, zodat bezoekers bij onze nieuwe achtbaan kunnen komen... STR_3436 :{SMALLFONT}{BLACK}Terwijl we wachten op onze eerste bezoekers, kunnen we onze achtbaan een beetje aanpassen... @@ -3445,3 +3445,6 @@ STR_3443 :Pagina 4 STR_3444 :Pagina 5 STR_3445 :Werkgebied instellen STR_3446 :Werkgebied wissen +STR_5120 :'Financiën'-knop in de werkbalk tonen +STR_5121 :'Onderzoek'-knop in de werkbalk tonen +STR_5122 :Alle voertuigen met hetzelfde baan- of attractietype tonen diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 2c97eeac69..7ea461cfc3 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -3463,3 +3463,8 @@ STR_3443 :Page 4 STR_3444 :Page 5 STR_3445 :Set Patrol Area STR_3446 :Cancel Patrol Area + +# New strings, cleaner +STR_5120 :Show finances button on toolbar +STR_5121 :Show research button on toolbar +STR_5122 :Show all vehicles sharing a track/ride type diff --git a/data/language/french.txt b/data/language/french.txt index d689041161..032d6105b8 100644 --- a/data/language/french.txt +++ b/data/language/french.txt @@ -1,4 +1,4 @@ -# STR_XXXX part is read and XXXX becomes the string id number. +# STR_XXXX part is read and XXXX becomes the string id number. # Everything after the colon and before the new line will be saved as the string. # Use # at the beginning of a line to leave a comment. STR_0000 : @@ -3340,63 +3340,63 @@ STR_3333 :Export plug-in objects with saved games STR_3334 :{SMALLFONT}{BLACK}Select whether to save any additional plug-in object data required (add-in data not supplied with the main product) in saved game or scenario files, allowing them to be loaded by someone who doesn't have the additional object data STR_3335 :Roller Coaster Designer - Select Ride Types & Vehicles STR_3336 :Track Designs Manager - Select Ride Type -STR_3337 :Six Flags Park -STR_3338 :{BLACK}Custom-designed layout -STR_3339 :{BLACK}{COMMA16} design available, or custom-designed layout -STR_3340 :{BLACK}{COMMA16} designs available, or custom-designed layout +STR_3337 :Parc Six Flags +STR_3338 :{BLACK}Dispositions personnalisées +STR_3339 :{BLACK}{COMMA16} design disponible, ou disposition personnalisée +STR_3340 :{BLACK}{COMMA16} designs disponibles, ou dispositions personnalisées STR_3341 :{SMALLFONT}{BLACK}Outils STR_3342 :Editeur de scénario STR_3343 :Convertir partie sauvegardée en scénario STR_3344 :Concepteur de montages russes STR_3345 :Gestionnaire de voies -STR_3346 :Can't save track design... -STR_3347 :Ride is too large, contains too many elements, or scenery is too spread out -STR_3348 :Rename -STR_3349 :Delete -STR_3350 :Track design name -STR_3351 :Enter new name for this track design: -STR_3352 :Can't rename track design... -STR_3353 :New name contains invalid characters -STR_3354 :Another file exists with this name, or file is write-protected -STR_3355 :File is write-protected or locked -STR_3356 :Delete File -STR_3357 :{WINDOW_COLOUR_2}Are you sure you want to permanently delete {STRINGID} ? -STR_3358 :Can't delete track design... -STR_3359 :{BLACK}No track designs of this type -STR_3360 :Warning! -STR_3361 :Too many track designs of this type - Some will not be listed. -STR_3362 :Forced Software Buffer Mixing -STR_3363 :{SMALLFONT}{BLACK}Select this option to improve performance if the game pauses slightly when sounds start or interference is heard -STR_3364 :Advanced -STR_3365 :{SMALLFONT}{BLACK}Allow selection of individual items of scenery in addition to scenery groups -STR_3366 :{BLACK}= Ride -STR_3367 :{BLACK}= Food Stall -STR_3368 :{BLACK}= Drink Stall -STR_3369 :{BLACK}= Souvenir Stall -STR_3370 :{BLACK}= Info. Kiosk -STR_3371 :{BLACK}= First Aid -STR_3372 :{BLACK}= A.T.M. -STR_3373 :{BLACK}= Restroom -STR_3374 :Warning: Too many objects selected! -STR_3375 :Not all objects in this scenery group could be selected -STR_3376 :Install new track design... -STR_3377 :{SMALLFONT}{BLACK}Install a new track design file -STR_3378 :Install -STR_3379 :Cancel -STR_3380 :Unable to install this track design... -STR_3381 :File is not compatible or contains invalid data -STR_3382 :File copy failed -STR_3383 :Select new name for track design -STR_3384 :An existing track design already has this name - Please select a new name for this design: +STR_3346 :Impossible de sauvegarder le modèle du circuit... +STR_3347 :L'attraction est trop large, contient trop d'éléments, ou le décor est trop éloigné +STR_3348 :Renommer +STR_3349 :Supprimer +STR_3350 :Nom du modèle de circuit +STR_3351 :Entrez le nouveau nom du modèle du circuit : +STR_3352 :Impossible de renommer le modèle du circuit... +STR_3353 :Le nouveau nom contient des caractères invalides +STR_3354 :Un autre fichier existe avec ce nom, ou il est en lecture seule +STR_3355 :Le fichier est verrouillé ou est en lecture seule +STR_3356 :Supprimer fichier +STR_3357 :{WINDOW_COLOUR_2}Etes-vous sûr(e) de vouloir supprimer de manière permanente {STRINGID} ? +STR_3358 :Impossible de supprimer le modèle du circuit... +STR_3359 :{BLACK}Pas de modèle de circuit pour ce type +STR_3360 :Attention ! +STR_3361 :Trop de modèles de circuit pour ce type - Certains ne seront pas listés. +STR_3362 :Forcé mixage tampon logiciel +STR_3363 :{SMALLFONT}{BLACK}Selectionnez cette option pour améliorer les performances si le jeu se met légèrement en pause slightly quand les sons démarrent ou de l'interférence est entendue +STR_3364 :Avancé +STR_3365 :{SMALLFONT}{BLACK}Autorise la sélection d'objets individuels du décor en plus des groupes de décor +STR_3366 :{BLACK}= Attraction +STR_3367 :{BLACK}= Stand de nourriture +STR_3368 :{BLACK}= Stand de boissons +STR_3369 :{BLACK}= Stand de souvenirs +STR_3370 :{BLACK}= Kiosque aux informations +STR_3371 :{BLACK}= Infirmerie +STR_3372 :{BLACK}= D.A.B. +STR_3373 :{BLACK}= Toilettes +STR_3374 :Attention : Trop d'objets sélectionnés ! +STR_3375 :Certains objets dans ce groupe de décor n'ont pas pu être sélectionnés +STR_3376 :Installer un nouveau modèle de circuit... +STR_3377 :{SMALLFONT}{BLACK}Installe un fichier qui contient un nouveau modèle de circuit +STR_3378 :Installer +STR_3379 :Annuler +STR_3380 :Impossible d'installer ce modèle de circuit... +STR_3381 :Le fichier n'est pas compatible ou contient des données invalides +STR_3382 :Copie du fichier échouée +STR_3383 :Sélectionnez le nouveau nom pour le modèle de circuit +STR_3384 :Un modèle de circuit possède déjà ce nom - Veuillez en choisir un autre pour celui ci : STR_3385 :Didacticiel pour débutants STR_3386 :Didacticiel attractions personnalisées STR_3387 :Didacticiel construction des montagnes russes -STR_3388 :Unable to switch to selected mode -STR_3389 :Unable to select additional item of scenery... -STR_3390 :Too many items selected +STR_3388 :Impossible de changer au mode sélectionné +STR_3389 :Impossible de choisir plus d'objets du décor... +STR_3390 :Trop d'objets sélectionnés STR_3391 :{SMALLFONT}{BLACK}Voici notre parc. Voyons ça d'un peu plus près... -STR_3392 :{SMALLFONT}{BLACK}Pour déplacer la vue, maintenir le bouton DROIT de la souris enfoncé puis bouger la souris... -STR_3393 :{SMALLFONT}{BLACK}Pour élargir la vue, faites un zomm arrière à l'aide de l'icone placé en haut de l'écran... +STR_3392 :{SMALLFONT}{BLACK}Pour déplacer la vue, maintenez le bouton DROIT de la souris enfoncé puis bouger la souris... +STR_3393 :{SMALLFONT}{BLACK}Pour élargir la vue, faites un zoom arrière à l'aide de l'icone placé en haut de l'écran... STR_3394 :{SMALLFONT}{BLACK}Vous pouvez aussi faire pivoter la vue par tranches de 90 degrés... STR_3395 :{SMALLFONT}{BLACK}Difficile d'entamer une construction avec une vue aussi large. Faites un zoom avant... STR_3396 :{SMALLFONT}{BLACK}Construisons d'abord une simple attraction... @@ -3409,44 +3409,44 @@ STR_3402 :{SMALLFONT}{BLACK}Bien, et si on ouvrait l'attraction maintenant ? STR_3403 :{SMALLFONT}{BLACK}Mais où sont passés les visiteurs ? STR_3404 :{SMALLFONT}{BLACK}Zut. Nous avons oublié d'ouvrir le parc. Bon il est temps d'y remédier... STR_3405 :{SMALLFONT}{BLACK}En attendant vos premiers visiteurs, occupons-nous du décor... -STR_3406 :{SMALLFONT}{BLACK}Here's our empty park. We're going to build a simple custom-designed ride... -STR_3407 :{SMALLFONT}{BLACK}First we need to choose a starting position... -STR_3408 :{SMALLFONT}{BLACK}The section of track we've just built is a 'station platform', to allow guests to get on and off the ride... -STR_3409 :{SMALLFONT}{BLACK}We'll extend the platform a bit by adding a couple more station platform sections... -STR_3410 :{SMALLFONT}{BLACK}The icons at the top of the construction window let you choose different track pieces to add... -STR_3411 :{SMALLFONT}{BLACK}We'll select a left-hand curve... -STR_3412 :{SMALLFONT}{BLACK}The curve hasn't been built yet, but the white ghost image shows where it will be built. Clicking the large 'build this' icon actually builds the track... -STR_3413 :{SMALLFONT}{BLACK}Now we want to build straight track, so we click the straight track icon... -STR_3414 :{SMALLFONT}{BLACK}Now that the circuit is complete, we need to build the ride entrance and exit... -STR_3415 :{SMALLFONT}{BLACK}Let's test our ride to check it works... -STR_3416 :{SMALLFONT}{BLACK}White it's being tested, we'll build the queue line and exit path... -STR_3417 :{SMALLFONT}{BLACK}OK - Let's open the park and the ride... -STR_3418 :{SMALLFONT}{BLACK}Our new ride isn't very exciting - Perhaps we should add some scenery? -STR_3419 :{SMALLFONT}{BLACK}To build scenery above other scenery or in mid-air, hold down the SHIFT key and move the mouse to select the height... -STR_3420 :{SMALLFONT}{BLACK}Some types of scenery can be re-painted after it's built... -STR_3421 :{SMALLFONT}{BLACK}Let's add some music to the ride... -STR_3422 :{SMALLFONT}{BLACK}Let's build a roller coaster ! -STR_3423 :{SMALLFONT}{BLACK}There are loads of pre-designed coasters, but we're going to build our own custom design... -STR_3424 :{SMALLFONT}{BLACK}That's the station platform built. Now we need a lift hill... -STR_3425 :{SMALLFONT}{BLACK}Roller coaster trains aren't powered, so a 'chain lift' is needed to pull the train up the first hill... -STR_3426 :{SMALLFONT}{BLACK}That's the lift hill complete - Now for the first drop... -STR_3427 :{SMALLFONT}{BLACK}Those curves are a bad idea - The riders will be flung to the sides by the lateral G forces as the train hurtles around... -STR_3428 :{SMALLFONT}{BLACK}Banking the curves will improve the ride - Riders will be pushed down into their seats instead of flung to the sides... -STR_3429 :{SMALLFONT}{BLACK}No - That won't work! Look at the height marks - The second hill is taller than the lift hill... -STR_3430 :{SMALLFONT}{BLACK}To ensure the train makes it around, each hill should be slightly smaller than the previous one... -STR_3431 :{SMALLFONT}{BLACK}That's better - Our train should make it up that hill now! Let's try some more twisted track... -STR_3432 :{SMALLFONT}{BLACK}We need to slow the train before the final curve and station, so let's add some brakes... -STR_3433 :{SMALLFONT}{BLACK}And finally we'll add 'block brakes', which allow two trains to operate more safely on the circuit... -STR_3434 :{SMALLFONT}{BLACK}Let's test the ride and see if it works! -STR_3435 :{SMALLFONT}{BLACK}Great - It worked! Let's add the footpaths and let guests onto our new roller coaster... -STR_3436 :{SMALLFONT}{BLACK}While waiting for our first riders, we could customize the ride a bit... -STR_3437 :{SMALLFONT}{BLACK}Clear large areas of scenery from landscape -STR_3438 :Unable to remove all scenery from here... +STR_3406 :{SMALLFONT}{BLACK}Voici notre parc vide. Nous allons construire une attraction simple et personnalisée... +STR_3407 :{SMALLFONT}{BLACK}Tout d'abord on doit choisir le point de départ... +STR_3408 :{SMALLFONT}{BLACK}La section du circuit que nous venons de construire est la 'station', cela permet aux visiteurs de monter et descendre de l'attraction... +STR_3409 :{SMALLFONT}{BLACK}Nous allons étendre cette station en ajoutant quelques blocs... +STR_3410 :{SMALLFONT}{BLACK}Les icônes en haut de la fenêtre de construction vous permet les différentes parties du circuit à ajouter... +STR_3411 :{SMALLFONT}{BLACK}Nous choissions une courbe vers la gauche... +STR_3412 :{SMALLFONT}{BLACK}La courbe n'est pas encore construite, mais l'image fantôme blanche indique où elle le sera. Cliquez sur l'icône 'construire ceci' pour construire le bloc... +STR_3413 :{SMALLFONT}{BLACK}Maintenant nous voulons construire un tracé droit, donc on clique sur l'icône 'tracé droit'... +STR_3414 :{SMALLFONT}{BLACK}Maintenant que le circuit est terminé, nous devons construire l'entrée et la sortie... +STR_3415 :{SMALLFONT}{BLACK}Testons notre attraction pour voir si tout va bien... +STR_3416 :{SMALLFONT}{BLACK}Pendant son test, on va construire la zone d'attente et l'allée de sortie... +STR_3417 :{SMALLFONT}{BLACK}OK - Ouvrons le parc et l'attraction... +STR_3418 :{SMALLFONT}{BLACK}Notre nouvelle attraction n'est pas très attractive - Peut-être que nous devons rajouter du décor ? +STR_3419 :{SMALLFONT}{BLACK}Pour construire du décor l'un au-dessus de l'autre ou en plein vol, maintenez la touche MAJ key et déplacez la souris pour choisir l'hauteur... +STR_3420 :{SMALLFONT}{BLACK}Certains éléments du décor peuvent être repeints après leur construction... +STR_3421 :{SMALLFONT}{BLACK}Ajoutons un peu de musique à notre attraction... +STR_3422 :{SMALLFONT}{BLACK}Construisons un montagne russe ! +STR_3423 :{SMALLFONT}{BLACK}Il y a plein de modèles pré-définis, mais nous allons construire notre propre circuit... +STR_3424 :{SMALLFONT}{BLACK}Voilà la station construite. Maintenant la montée... +STR_3425 :{SMALLFONT}{BLACK}Les trains des montagnes russes ne sont pas propulsés, une 'échelle' est nécessaire pour tirer le train lors de la première montée... +STR_3426 :{SMALLFONT}{BLACK}La montée est terminée - Maintenant la descente... +STR_3427 :{SMALLFONT}{BLACK}Ces courbes sont une mauvaise idée - Les visiteurs vont être projetés sur le côté de leur siège par les forces G latérales pendant que le train tourne... +STR_3428 :{SMALLFONT}{BLACK}Pencher les courbes améliorera l'attraction - Les visiteurs auront leur dos collé aux sièges plutôt que d'être projetés sur les côtés... +STR_3429 :{SMALLFONT}{BLACK}Non - Ca ne fonctionnera pas ! Regardez les marques de hauteur - La deuxième montée est plus grande que la première... +STR_3430 :{SMALLFONT}{BLACK}Pour être sûr que le train réussise le circuit, chaque montée doit être légèrement plus petite que la précédente... +STR_3431 :{SMALLFONT}{BLACK}C'est mieux - Notre train pourra passer cette montée ! Ajoutons des voies plus tordues... +STR_3432 :{SMALLFONT}{BLACK}Nous devons freiner le train avant la courbe finale et la station, ajoutons quelques freins... +STR_3433 :{SMALLFONT}{BLACK}Et finalement nous rajouterons des 'freins de blocs', cela permettra à 2 trains de parcourir le circuit en sécurité... +STR_3434 :{SMALLFONT}{BLACK}Testons l'attraction et regardons si tout fonctionne ! +STR_3435 :{SMALLFONT}{BLACK}Génial - Tout fonctionne ! Ajoutons la zone d'attente et l'allée de sortie pour que les visiteurs puissent y accéder... +STR_3436 :{SMALLFONT}{BLACK}En attendant les premiers passagers, on va personnaliser un peu l'attraction... +STR_3437 :{SMALLFONT}{BLACK}Nettoyer grande zone de décor du paysage +STR_3438 :Impossible d'effacer tout le décor d'içi... STR_3439 :Effacer décor STR_3440 :Page 1 STR_3441 :Page 2 STR_3442 :Page 3 STR_3443 :Page 4 STR_3444 :Page 5 -STR_3445 :Set Patrol Area -STR_3446 :Cancel Patrol Area +STR_3445 :Définir Zone de Patrouille +STR_3446 :Annuler Zone de Patrouille diff --git a/data/language/polish.txt b/data/language/polish.txt index f88b5e5dbb..ee75dc49b5 100644 --- a/data/language/polish.txt +++ b/data/language/polish.txt @@ -2442,49 +2442,52 @@ STR_2405 :Build 10 roller coasters of a given length STR_2406 :Finish building 5 roller coasters STR_2407 :Repay loan and achieve a given park value STR_2408 :Monthly profit from food/merchandise -STR_2409 :{WINDOW_COLOUR_2}Marketing campaigns in operation -STR_2410 :{BLACK}None -STR_2411 :{WINDOW_COLOUR_2}Marketing campaigns available -STR_2412 :{SMALLFONT}{BLACK}Start this marketing campaign -STR_2413 :{BLACK}({CURRENCY2DP} per week) -STR_2414 :(Not Selected) -STR_2415 :{WINDOW_COLOUR_2}Ride: -STR_2416 :{WINDOW_COLOUR_2}Item: -STR_2417 :{WINDOW_COLOUR_2}Length of time: -STR_2418 :Free entry to {STRINGID} -STR_2419 :Free ride on {STRINGID} -STR_2420 :Half-price entry to {STRINGID} -STR_2421 :Free {STRINGID} -STR_2422 :Advertising campaign for {STRINGID} -STR_2423 :Advertising campaign for {STRINGID} -STR_2424 :{WINDOW_COLOUR_2}Vouchers for free entry to the park -STR_2425 :{WINDOW_COLOUR_2}Vouchers for free rides on a particular ride -STR_2426 :{WINDOW_COLOUR_2}Vouchers for half-price entry to the park -STR_2427 :{WINDOW_COLOUR_2}Vouchers for free food or drink -STR_2428 :{WINDOW_COLOUR_2}Advertising campaign for the park -STR_2429 :{WINDOW_COLOUR_2}Advertising campaign for a particular ride -STR_2430 :{BLACK}Vouchers for free entry to {STRINGID} -STR_2431 :{BLACK}Vouchers for free ride on {STRINGID} -STR_2432 :{BLACK}Vouchers for half-price entry to {STRINGID} -STR_2433 :{BLACK}Vouchers for free {STRINGID} -STR_2434 :{BLACK}Advertising campaign for {STRINGID} -STR_2435 :{BLACK}Advertising campaign for {STRINGID} -STR_2436 :1 week -STR_2437 :2 weeks -STR_2438 :3 weeks -STR_2439 :4 weeks -STR_2440 :5 weeks -STR_2441 :6 weeks -STR_2442 :{BLACK}({STRINGID} remaining) -STR_2443 :{WINDOW_COLOUR_2}Cost per week: {BLACK}{CURRENCY2DP} -STR_2444 :{WINDOW_COLOUR_2}Total cost: {BLACK}{CURRENCY2DP} -STR_2445 :Start this marketing campaign -STR_2446 :{YELLOW}Your marketing campaign for free entry to the park has finished -STR_2447 :{YELLOW}Your marketing campaign for free rides on {STRINGID} has finished -STR_2448 :{YELLOW}Your marketing campaign for half-price entry to the park has finished -STR_2449 :{YELLOW}Your marketing campaign for free {STRINGID} has finished -STR_2450 :{YELLOW}Your advertising campaign for the park has finished -STR_2451 :{YELLOW}Your advertising campaign for {STRINGID} has finished +# ------------------------------------------ Polish start +STR_2409 :{WINDOW_COLOUR_2}Trwające kampanie marketingowe +STR_2410 :{BLACK}Brak +STR_2411 :{WINDOW_COLOUR_2}Dostępne kampanie marketingowe +STR_2412 :{SMALLFONT}{BLACK}Rozpocznij tą kampanię +STR_2413 :{BLACK}({CURRENCY2DP} tygodniowo) +STR_2414 :(Nie wybrano) +STR_2415 :{WINDOW_COLOUR_2}Atrakcja: +STR_2416 :{WINDOW_COLOUR_2}Przedmiot: +STR_2417 :{WINDOW_COLOUR_2}Czas trwania: +# I think they are only used in "Voucher for ___" strings, so lower case fits here better +STR_2418 :darmowe wejście do {STRINGID} +STR_2419 :darmową przejażdżkę {STRINGID} +STR_2420 :wejście do {STRINGID} za połowę ceny +STR_2421 :darmowe {STRINGID} +STR_2422 :Kampania reklamowa dla {STRINGID} +STR_2423 :Kampania reklamowa dla {STRINGID} +STR_2424 :{WINDOW_COLOUR_2}Kupony na darmowe wejście do parku +STR_2425 :{WINDOW_COLOUR_2}Kupony na darmową przejażdżkę wybraną atrakcję +STR_2426 :{WINDOW_COLOUR_2}Kupony na wejście do parku za połowę ceny +STR_2427 :{WINDOW_COLOUR_2}Kupony na darmowe jedzenie lub picie +STR_2428 :{WINDOW_COLOUR_2}Kampania reklamująca park +STR_2429 :{WINDOW_COLOUR_2}Kampania reklamująca wybraną przejażdżkę +STR_2430 :{BLACK}Kupony na darmowe wejście do {STRINGID} +STR_2431 :{BLACK}Kupony na darmową przejażdżkę {STRINGID} +STR_2432 :{BLACK}Kupony na wejście do {STRINGID} za połowę ceny +STR_2433 :{BLACK}Kupony na darmowe {STRINGID} +STR_2434 :{BLACK}Kampania reklamowa dla {STRINGID} +STR_2435 :{BLACK}Kampania reklamowa dla {STRINGID} +STR_2436 :1 tydzień +STR_2437 :2 tygodnie +STR_2438 :3 tygodnie +STR_2439 :4 tygodnie +STR_2440 :5 tygodnie +STR_2441 :6 tygodnie +STR_2442 :{BLACK}(został/y {STRINGID}) +STR_2443 :{WINDOW_COLOUR_2}Koszt tygodniowy: {BLACK}{CURRENCY2DP} +STR_2444 :{WINDOW_COLOUR_2}Koszt łączny: {BLACK}{CURRENCY2DP} +STR_2445 :Rozpocznij kampanię +STR_2446 :{YELLOW}Twoja kampania marketingowa na darmowe wejście do parku zakończyła się +STR_2447 :{YELLOW}Twoja kampania marketingowa na darmowe przejażdżki {STRINGID} zakończyła się +STR_2448 :{YELLOW}Twoja kampania marketingowa na wejście do parku za połowę ceny zakończyła się +STR_2449 :{YELLOW}Twoja kampania marketingowa na darmowe {STRINGID} zakończyła się +STR_2450 :{YELLOW}Twoja kmapania reklamująca park zakończyła się +STR_2451 :{YELLOW}Twoja kampania reklamująca {STRINGID} zakończyła się +# ------------------------------------------ Polish end STR_2452 :{WINDOW_COLOUR_2}Cash (less loan): {BLACK}{CURRENCY2DP} STR_2453 :{WINDOW_COLOUR_2}Cash (less loan): {RED}{CURRENCY2DP} STR_2454 :{SMALLFONT}{BLACK}{CURRENCY2DP} - @@ -2753,9 +2756,9 @@ STR_2714 :- STR_2715 :. STR_2716 :/ STR_2717 :' -STR_2718 :??? -STR_2719 :??? # New strings (previously these were ???) +STR_2718 :(..) +STR_2719 :(nowy plik) # sec, secs STR_2720 :{UINT16}sek STR_2721 :{UINT16}sek @@ -2790,25 +2793,25 @@ STR_2745 :\ STR_2746 :] STR_2747 :{ENDQUOTES} STR_2748 :Bar -STR_2749 :??? -STR_2750 :??? -STR_2751 :??? -STR_2752 :??? -STR_2753 :??? -STR_2754 :??? -STR_2755 :??? -STR_2756 :??? -STR_2757 :??? -STR_2758 :??? -STR_2759 :??? -# New strings used in the cheats window previously these were ??? +# New strings (previously these were ???) +STR_2749 :Mój nowy scenariusz +STR_2750 :Przenieś wszystkie do góry +STR_2751 :Przenieś wszystkie na dół +STR_2752 :Czysta trawa +STR_2753 :Skoszona trawa +STR_2754 :Podlej kwiaty +STR_2755 :Usuń wandalizm +STR_2756 :Usuń śmieci +STR_2757 :Wymuś słońce +STR_2758 :Wymuś burzę +STR_2759 :Mniejsze odstępy STR_2760 :+5K Pieniędzy STR_2761 :Płatne Wejście STR_2762 :Płatne Atrakcje STR_2763 :??? STR_2764 :Szczęśliwi Goście STR_2765 :Przypływ Gości -STR_2766 :??? +STR_2766 :Wygraj scenariusz STR_2767 :Zablokuj Klimat STR_2768 :Odblokuj Klimat STR_2769 :Otwórz Park @@ -2821,9 +2824,9 @@ STR_2775 :Pełny ekran w oknie STR_2776 :Język STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} +STR_2779 :Podgląd #{COMMA16} +STR_2780 :Dodatkowe okno podglądu # End of new strings -STR_2779 :??? -STR_2780 :??? STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} STR_2782 :SHIFT + STR_2783 :CTRL + From 84c79d9fc5ec5c587e4abfb9760f3915efcbf0d4 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Wed, 18 Mar 2015 12:50:03 +0100 Subject: [PATCH 11/19] Read Italian descriptions from the .DAT files as well --- src/localisation/language.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/localisation/language.c b/src/localisation/language.c index 02bfd5c9a3..38c2790a28 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -238,11 +238,11 @@ void language_close() } const int OpenRCT2LangIdToObjectLangId[] = { - 0, 0, 1, 3, 6, 2, 0, 0, 4, 7 + 0, 0, 1, 3, 6, 2, 0, 0, 4, 7, 5 }; /* rct2: 0x0098DA16 */ -uint16 ObjectTypeStringTableCount[] = { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }; +uint16 ObjectTypeStringTableCount[] = { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }; /* rct2: 0x006A9E24*/ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/*ecx*/, int index/*ebx*/, int tableindex/*edx*/) From 83765a3c22c405b6c3c48ffc098f8c48ba127561 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Wed, 18 Mar 2015 13:20:19 +0100 Subject: [PATCH 12/19] Revert incorrect adjustment of row 245 --- src/localisation/language.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/localisation/language.c b/src/localisation/language.c index 38c2790a28..dbc51414d4 100644 --- a/src/localisation/language.c +++ b/src/localisation/language.c @@ -242,7 +242,7 @@ const int OpenRCT2LangIdToObjectLangId[] = { }; /* rct2: 0x0098DA16 */ -uint16 ObjectTypeStringTableCount[] = { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }; +uint16 ObjectTypeStringTableCount[] = { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }; /* rct2: 0x006A9E24*/ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/*ecx*/, int index/*ebx*/, int tableindex/*edx*/) From ab5285cf1e4a6ed0bd0ff3df060a0fbbc0c53924 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Wed, 18 Mar 2015 16:20:12 +0100 Subject: [PATCH 13/19] Don't reset built dates that are in the future --- src/windows/ride.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/windows/ride.c b/src/windows/ride.c index ca3cdda487..d3abee3bdb 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -5877,10 +5877,8 @@ static void window_ride_customer_paint() y += 2; // Age - //Reset build date to current if it's in the future - ride->build_date=min(ride->build_date,RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16)); - - age = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16) - ride->build_date) / 8; + //If the ride has a build date that is in the future, show it as built this year. + age = max((RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16) - ride->build_date) / 8, 0); stringId = age == 0 ? STR_BUILT_THIS_YEAR : age == 1 ? From f0b35253957af62dd01ceb939af751f78fe90ea0 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Wed, 18 Mar 2015 16:21:45 +0100 Subject: [PATCH 14/19] Add cheat to renew all rides --- src/windows/cheats.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/windows/cheats.c b/src/windows/cheats.c index ac7261a438..fcac4fca52 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -66,7 +66,8 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_WATER_PLANTS, WIDX_FIX_VANDALISM, WIDX_REMOVE_LITTER, - WIDX_WIN_SCENARIO + WIDX_WIN_SCENARIO, + WIDX_RENEW_RIDES }; #pragma region MEASUREMENTS @@ -137,6 +138,7 @@ static rct_widget window_cheats_misc_widgets[] = { { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(7), HPL(7), 2756, STR_NONE}, // Remove litter { WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(0), HPL(0), 2766, STR_NONE}, // Win scenario + { WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(7), HPL(7), 5123, STR_NONE}, // Renew rides { WIDGETS_END }, }; @@ -259,7 +261,7 @@ static void* window_cheats_page_events[] = { static uint32 window_cheats_page_enabled_widgets[] = { (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_HIGH_MONEY) | (1 << WIDX_PARK_ENTRANCE_FEE), (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_HAPPY_GUESTS) | (1 << WIDX_TRAM_GUESTS), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_DECREASE_GAME_SPEED) | (1 << WIDX_INCREASE_GAME_SPEED) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) + (1 << WIDX_CLOSE) | (1 << WIDX_TAB_1) | (1 << WIDX_TAB_2) | (1 << WIDX_TAB_3) | (1 << WIDX_FREEZE_CLIMATE) | (1 << WIDX_OPEN_CLOSE_PARK) | (1 << WIDX_DECREASE_GAME_SPEED) | (1 << WIDX_INCREASE_GAME_SPEED) | (1 << WIDX_ZERO_CLEARANCE) | (1 << WIDX_WEATHER_SUN) | (1 << WIDX_WEATHER_THUNDER) | (1 << WIDX_CLEAR_GRASS) | (1 << WIDX_MOWED_GRASS) | (1 << WIDX_WATER_PLANTS) | (1 << WIDX_FIX_VANDALISM) | (1 << WIDX_REMOVE_LITTER) | (1 << WIDX_WIN_SCENARIO) | (1 << WIDX_RENEW_RIDES) }; static void window_cheats_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); @@ -347,6 +349,16 @@ static void cheat_fix_rides() } } +static void cheat_renew_rides() +{ + int i; + rct_ride *ride; + + FOR_ALL_RIDES(i, ride) + ride->build_date = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); + window_invalidate_by_class(WC_RIDE); +} + static void cheat_clear_loan() { // TODO, this sets the loan but stops loan borrowing from working, possible due to cheat detection stuff @@ -519,6 +531,9 @@ static void window_cheats_misc_mouseup() case WIDX_WIN_SCENARIO: scenario_success(); break; + case WIDX_RENEW_RIDES: + cheat_renew_rides(); + break; } } @@ -681,4 +696,4 @@ static void window_cheats_misc_tool_down() mapElement->clearance_height = 0; } } while (!map_element_is_last_for_tile(mapElement++)); -} \ No newline at end of file +} From d810694ac96622a64f33685b44eb9a857f4d5178 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Wed, 18 Mar 2015 16:22:43 +0100 Subject: [PATCH 15/19] Add renew rides string --- data/language/english_uk.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index f69061e519..af15baa97d 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3456,3 +3456,4 @@ STR_3446 :Cancel Patrol Area STR_5120 :Show finances button on toolbar STR_5121 :Show research button on toolbar STR_5122 :Show all vehicles sharing a track/ride type +STR_5123 :Renew rides From b5b2ae263ad96e4911b6acd9209bfe87f6986d39 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Wed, 18 Mar 2015 19:23:15 +0000 Subject: [PATCH 16/19] Fix intense rides causing peeps not to use rides at all --- src/world/park.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/world/park.h b/src/world/park.h index 5098c17369..fd4b97ef49 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -35,7 +35,7 @@ enum { PARK_FLAGS_FORBID_HIGH_CONSTRUCTION = (1 << 5), // below tree height PARK_FLAGS_PREF_LESS_INTENSE_RIDES = (1 << 6), PARK_FLAGS_FORBID_MARKETING_CAMPAIGN = (1 << 7), - PARK_FLAGS_PREF_MORE_INTENSE_RIDES = (1 << 8), + PARK_FLAGS_PREF_MORE_INTENSE_RIDES = (1 << 9), PARK_FLAGS_NO_MONEY = (1 << 11), PARK_FLAGS_DIFFICULT_GUEST_GENERATION = (1 << 12), PARK_FLAGS_PARK_FREE_ENTRY = (1 << 13), From cd16af0f60a607b9cef633566d96ce2c5b32b170 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Wed, 18 Mar 2015 19:52:27 +0000 Subject: [PATCH 17/19] add some event handlers for invalidating map objects --- projects/openrct2.vcxproj | 2 + projects/openrct2.vcxproj.filters | 9 +- src/game.c | 3 +- src/ride/ride_data.c | 15 ++ src/ride/ride_data.h | 8 + src/windows/ride.c | 2 +- src/world/map.c | 36 --- src/world/map.h | 17 +- src/world/map_animation.c | 392 ++++++++++++++++++++++++++++++ src/world/map_animation.h | 41 ++++ src/world/sprite.h | 4 + 11 files changed, 476 insertions(+), 53 deletions(-) create mode 100644 src/world/map_animation.c create mode 100644 src/world/map_animation.h diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 3a650aa77d..0f494356a3 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -138,6 +138,7 @@ + @@ -204,6 +205,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index fce4be6300..6bc6dd78b5 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -345,7 +345,6 @@ Source\Windows - Source\Windows @@ -371,7 +370,7 @@ Source\World - + Source @@ -427,6 +426,9 @@ Source\Windows + + Source\World + @@ -627,5 +629,8 @@ Source\World + + Source\World + \ No newline at end of file diff --git a/src/game.c b/src/game.c index dc702c2d7e..74ddbbc797 100644 --- a/src/game.c +++ b/src/game.c @@ -49,6 +49,7 @@ #include "windows/error.h" #include "windows/tooltip.h" #include "world/climate.h" +#include "world/map_animation.h" #include "world/park.h" #include "world/sprite.h" #include "world/water.h" @@ -317,7 +318,7 @@ void game_logic_update() research_update(); ride_ratings_update_all(); ride_measurements_update(); - map_invalidate_animations(); + map_animation_invalidate_all(); vehicle_sounds_update(); peep_update_crowd_noise(); climate_update_sound(); diff --git a/src/ride/ride_data.c b/src/ride/ride_data.c index 5ba1213a73..83e8f50742 100644 --- a/src/ride/ride_data.c +++ b/src/ride/ride_data.c @@ -864,4 +864,19 @@ const uint8 RideAvailableBreakdowns[] = { (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), // 58 Mine Ride (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), // 59 LIM Launched Roller Coaster (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE) // 60 (none) +}; + +const rct_ride_entrance_definition RideEntranceDefinitions[12] = { + { 22664, 32, 2 }, // RIDE_ENTRANCE_STYLE_PLAIN + { 22760, 31, 21 }, // RIDE_ENTRANCE_STYLE_WOODEN + { 22680, 43, 2 }, // RIDE_ENTRANCE_STYLE_CANVAS_TENT + { 22728, 43, 19 }, // RIDE_ENTRANCE_STYLE_CASTLE_GREY + { 22712, 33, 19 }, // RIDE_ENTRANCE_STYLE_CASTLE_BROWN + { 22776, 32, 19 }, // RIDE_ENTRANCE_STYLE_JUNGLE + { 22744, 32, 20 }, // RIDE_ENTRANCE_STYLE_LOG_CABIN + { 22696, 34, 19 }, // RIDE_ENTRANCE_STYLE_CLASSICAL_ROMAN + { 22792, 40, 22 }, // RIDE_ENTRANCE_STYLE_ABSTRACT + { 22824, 35, 23 }, // RIDE_ENTRANCE_STYLE_SNOW_ICE + { 22840, 33, 19 }, // RIDE_ENTRANCE_STYLE_PAGODA + { 22856, 33, 2 } // RIDE_ENTRANCE_STYLE_SPACE }; \ No newline at end of file diff --git a/src/ride/ride_data.h b/src/ride/ride_data.h index c2e81cc9f8..c5cac5fb9c 100644 --- a/src/ride/ride_data.h +++ b/src/ride/ride_data.h @@ -30,6 +30,12 @@ typedef struct { rct_string_id unk_name; } rct_ride_name_convention; +typedef struct { + uint32 spriteIndex; + uint16 height; + uint16 var_06; +} rct_ride_entrance_definition; + extern const bool hasRunningTrack[0x60]; extern const uint8 initialUpkeepCosts[0x60]; extern const uint8 costPerTrackPiece[0x60]; @@ -42,4 +48,6 @@ extern const rct_ride_name_convention RideNameConvention[96]; extern const uint8 RideAvailableModes[]; extern const uint8 RideAvailableBreakdowns[]; +extern const rct_ride_entrance_definition RideEntranceDefinitions[12]; + #endif \ No newline at end of file diff --git a/src/windows/ride.c b/src/windows/ride.c index de63e8bb05..0a949ee097 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -4132,7 +4132,7 @@ static void window_ride_colour_paint() spriteIndex = (trackColour.additional << 24) | (trackColour.main << 19); spriteIndex |= 0xA0000000; - spriteIndex += RCT2_GLOBAL(0x00993E7C + (ride->entrance_style * 8), uint32); + spriteIndex += RideEntranceDefinitions[ride->entrance_style].spriteIndex; // Back gfx_draw_sprite(clippedDpi, spriteIndex, 34, 20, terniaryColour); diff --git a/src/world/map.c b/src/world/map.c index c2be5a635a..c1ee8373d4 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -42,7 +42,6 @@ const rct_xy16 TileDirectionDelta[] = { }; rct_xy16 *gMapSelectionTiles = (rct_xy16*)0x009DE596; -rct_animated_object *gAnimatedObjects = (rct_animated_object*)0x013886A0; int _sub_6A876D_save_x; int _sub_6A876D_save_y; @@ -459,41 +458,6 @@ int map_coord_is_connected(int x, int y, int z, uint8 faceDirection) return 0; } -/** rct2: 0x009819DC */ -const uint32 *_animatedObjectEventHandlers = (uint32*)0x009819DC; - -/** - * @returns true if the animation should be removed. - */ -bool map_invalidate_animation(rct_animated_object *obj) -{ - uint32 address = _animatedObjectEventHandlers[obj->type]; - int result = RCT2_CALLPROC_X(address, obj->x, 0, obj->y, obj->baseZ, 0, 0, 0); - return (result & 0x100) != 0; -} - -/** - * - * rct2: 0x0068AFAD - */ -void map_invalidate_animations() -{ - rct_animated_object *aobj = &gAnimatedObjects[0]; - int numAnimatedObjects = RCT2_GLOBAL(0x0138B580, uint16); - while (numAnimatedObjects > 0) { - if (map_invalidate_animation(aobj)) { - // Remove animated object - RCT2_GLOBAL(0x0138B580, uint16)--; - numAnimatedObjects--; - if (numAnimatedObjects > 0) - memmove(aobj, aobj + 1, numAnimatedObjects); - } else { - numAnimatedObjects--; - aobj++; - } - } -} - /** * * rct2: 0x006A876D diff --git a/src/world/map.h b/src/world/map.h index 13de4499e4..cd9b08bdd3 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -181,6 +181,10 @@ enum { PATH_TILE }; +enum { + PATH_FLAG_QUEUE_BANNER = 1 << 3 +}; + enum { ENTRANCE_TYPE_RIDE_ENTRANCE, ENTRANCE_TYPE_RIDE_EXIT, @@ -229,20 +233,8 @@ typedef struct { uint8 direction; } rct2_peep_spawn; -/** - * Animated object - * size: 0x06 - */ -typedef struct { - uint8 baseZ; - uint8 type; - uint16 x; - uint16 y; -} rct_animated_object; - extern const rct_xy16 TileDirectionDelta[]; extern rct_xy16 *gMapSelectionTiles; -extern rct_animated_object *gAnimatedObjects; void map_init(int size); void map_update_tile_pointers(); @@ -258,7 +250,6 @@ rct_map_element *map_get_surface_element_at(int x, int y); int map_element_height(int x, int y); void sub_68B089(); int map_coord_is_connected(int x, int y, int z, uint8 faceDirection); -void map_invalidate_animations(); void sub_6A876D(); int map_is_location_owned(int x, int y, int z); int map_is_location_in_park(int x, int y); diff --git a/src/world/map_animation.c b/src/world/map_animation.c new file mode 100644 index 0000000000..35dc9ca2fa --- /dev/null +++ b/src/world/map_animation.c @@ -0,0 +1,392 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#include "../addresses.h" +#include "../ride/ride.h" +#include "../ride/ride_data.h" +#include "map_animation.h" +#include "map.h" +#include "scenery.h" +#include "sprite.h" + +rct_animated_object *gAnimatedObjects = (rct_animated_object*)0x013886A0; + +typedef bool (*map_animation_invalidate_event_handler)(int x, int y, int baseZ); + +static bool map_animation_invalidate_ride_entrance(int x, int y, int baseZ); +static bool map_animation_invalidate_queue_banner(int x, int y, int baseZ); +static bool map_animation_invalidate_small_scenery(int x, int y, int baseZ); +static bool map_animation_invalidate_park_entrance(int x, int y, int baseZ); +static bool map_animation_invalidate_remove(int x, int y, int baseZ); +static bool map_animation_invalidate_banner(int x, int y, int baseZ); +static bool map_animation_invalidate_large_scenery(int x, int y, int baseZ); +static bool sub_6E5B50(int x, int y, int baseZ); +static bool map_animation_invalidate_wall(int x, int y, int baseZ); + +/** rct2: 0x009819DC */ +const uint32 _animatedObjectEventHandlers[] = { + (uint32)map_animation_invalidate_ride_entrance, // ride entrance + (uint32)map_animation_invalidate_queue_banner, // queue banner + (uint32)map_animation_invalidate_small_scenery, // small scenery + peep + (uint32)map_animation_invalidate_park_entrance, // park entrance + 0x006CE29E, // track + 0x006CE2F3, // track + 0x006CE39D, // track + 0x006CE348, // track + 0x006CE3FA, // track + (uint32)map_animation_invalidate_remove, // simply return true + (uint32)map_animation_invalidate_banner, // banner + (uint32)map_animation_invalidate_large_scenery, // large scenery + (uint32)sub_6E5B50, // wall + (uint32)map_animation_invalidate_wall // wall +}; + + +static bool map_animation_invalidate(rct_animated_object *obj); + +/** + * + * rct2: 0x0068AFAD + */ +void map_animation_invalidate_all() +{ + rct_animated_object *aobj = &gAnimatedObjects[0]; + int numAnimatedObjects = RCT2_GLOBAL(0x0138B580, uint16); + while (numAnimatedObjects > 0) { + if (map_animation_invalidate(aobj)) { + // Remove animated object + RCT2_GLOBAL(0x0138B580, uint16)--; + numAnimatedObjects--; + if (numAnimatedObjects > 0) + memmove(aobj, aobj + 1, numAnimatedObjects); + } else { + numAnimatedObjects--; + aobj++; + } + } +} + +/** + * @returns true if the animation should be removed. + */ +static bool map_animation_invalidate(rct_animated_object *obj) +{ + uint32 address = _animatedObjectEventHandlers[obj->type]; + if (((address >> 20) & 0xFFF) == 0x006) { + int result = RCT2_CALLPROC_X(address, obj->x, 0, obj->y, obj->baseZ, 0, 0, 0); + return (result & 0x100) != 0; + } else { + map_animation_invalidate_event_handler handler = (map_animation_invalidate_event_handler)address; + return handler(obj->x, obj->y, obj->baseZ); + } +} + +/** + * + * rct2: 0x00666670 + */ +static bool map_animation_invalidate_ride_entrance(int x, int y, int baseZ) +{ + rct_map_element *mapElement; + rct_ride *ride; + const rct_ride_entrance_definition *entranceDefinition; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->base_height != baseZ) + continue; + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE) + continue; + if (mapElement->properties.entrance.type != ENTRANCE_TYPE_RIDE_ENTRANCE) + continue; + + ride = GET_RIDE(mapElement->properties.entrance.ride_index); + entranceDefinition = &RideEntranceDefinitions[ride->entrance_style]; + + int height = (mapElement->base_height * 8) + entranceDefinition->height + 8; + map_invalidate_tile(x, y, height, height + 16); + return false; + } while (!map_element_is_last_for_tile(mapElement++)); + + return true; +} + +/** + * + * rct2: 0x006A7BD4 + */ +static bool map_animation_invalidate_queue_banner(int x, int y, int baseZ) +{ + rct_map_element *mapElement; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->base_height != baseZ) + continue; + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH) + continue; + if (!(mapElement->flags & 1)) + continue; + if (!(mapElement->properties.path.type & PATH_FLAG_QUEUE_BANNER)) + continue; + + int direction = ((mapElement->type >> 6) & 3) + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8); + if (direction == MAP_ELEMENT_DIRECTION_NORTH || direction == MAP_ELEMENT_DIRECTION_EAST) { + baseZ = mapElement->base_height * 8; + map_invalidate_tile(x, y, baseZ + 16, baseZ + 30); + } + return false; + } while (!map_element_is_last_for_tile(mapElement++)); + + return true; +} + +/** + * + * rct2: 0x006E32C9 + */ +static bool map_animation_invalidate_small_scenery(int x, int y, int baseZ) +{ + rct_map_element *mapElement; + rct_scenery_entry *sceneryEntry; + rct_sprite *sprite; + rct_peep *peep; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->base_height != baseZ) + continue; + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY) + continue; + if (mapElement->flags & (1 << 4)) + continue; + + sceneryEntry = g_smallSceneryEntries[mapElement->properties.scenery.type]; + if (sceneryEntry->small_scenery.flags & 0xD800) { + map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + return false; + } + + if (sceneryEntry->small_scenery.flags & 0x2000) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 0x3FF)) { + int direction = mapElement->type & 3; + int x2 = x - TileDirectionDelta[direction].x; + int y2 = y - TileDirectionDelta[direction].y; + + uint16 spriteIdx = RCT2_ADDRESS(0x00F1EF60, uint16)[((x2 & 0x1FE0) << 3) | (y2 >> 5)]; + for (; spriteIdx != 0xFFFF; spriteIdx = sprite->unknown.var_02) { + sprite = &g_sprite_list[spriteIdx]; + if (sprite->unknown.linked_list_type_offset != SPRITE_LINKEDLIST_OFFSET_PEEP) + continue; + + peep = &sprite->peep; + if (peep->state != PEEP_STATE_WALKING) + continue; + if (peep->z != mapElement->base_height * 8) + continue; + if (peep->action < PEEP_ACTION_NONE_1) + continue; + + peep->action = 0; + peep->action_frame = 0; + peep->var_70 = 0; + sub_693B58(peep); + RCT2_CALLPROC_X(0x006EC53F, 0, 0, 0, 0, (int)peep, 0, 0); + break; + } + } + map_invalidate_tile(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); + return false; + } + } while (!map_element_is_last_for_tile(mapElement++)); + return true; +} + +/** + * + * rct2: 0x00666C63 + */ +static bool map_animation_invalidate_park_entrance(int x, int y, int baseZ) +{ + rct_map_element *mapElement; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->base_height != baseZ) + continue; + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE) + continue; + if (mapElement->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE) + continue; + if (mapElement->properties.entrance.index & 0x0F) + continue; + + baseZ = mapElement->base_height * 8; + map_invalidate_tile(x, y, baseZ + 32, baseZ + 64); + return false; + } while (!map_element_is_last_for_tile(mapElement++)); + + return true; +} + +/** + * + * rct2: 0x0068DF8F + */ +static bool map_animation_invalidate_remove(int x, int y, int baseZ) +{ + return true; +} + +/** + * + * rct2: 0x006BA2BB + */ +static bool map_animation_invalidate_banner(int x, int y, int baseZ) +{ + rct_map_element *mapElement; + + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->base_height != baseZ) + continue; + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_BANNER) + continue; + + baseZ = mapElement->base_height * 8; + map_invalidate_tile(x, y, baseZ, baseZ + 16); + return false; + } while (!map_element_is_last_for_tile(mapElement++)); + + return true; +} + +/** + * + * rct2: 0x006B94EB + */ +static bool map_animation_invalidate_large_scenery(int x, int y, int baseZ) +{ + rct_map_element *mapElement; + rct_scenery_entry *sceneryEntry; + + bool wasInvalidated = false; + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->base_height != baseZ) + continue; + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_SCENERY_MULTIPLE) + continue; + + sceneryEntry = g_largeSceneryEntries[mapElement->properties.scenery.type & 0x3FF]; + if (sceneryEntry->large_scenery.flags & (1 << 3)) { + int z = mapElement->base_height * 8; + map_invalidate_tile(x, y, z, z + 16); + wasInvalidated = true; + } + } while (!map_element_is_last_for_tile(mapElement++)); + + return !wasInvalidated; +} + +/** + * + * rct2: 0x006E5B50 + */ +static bool sub_6E5B50(int x, int y, int baseZ) +{ + rct_map_element *mapElement; + rct_scenery_entry *sceneryEntry; + + if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 1) + return false; + + bool wasInvalidated = false; + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->base_height != baseZ) + continue; + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_FENCE) + continue; + + sceneryEntry = g_wallSceneryEntries[mapElement->properties.scenery.type]; + if (!(sceneryEntry->wall.flags & (1 << 4))) + continue; + + uint8 di = 0; + uint8 bl = mapElement->properties.fence.item[2]; + uint8 bh = bl & 0x78; + if (bh != 0) { + if (bh == 0x78) { + bl &= 0x87; + } else { + di |= 2; + if (bh != 40) { + bh += 8; + if (bh == 104 && !(sceneryEntry->wall.flags & (1 << 5))) + bh = 120; + + di |= 1; + bl &= 135; + bl |= bh; + } + } + } + + mapElement->properties.fence.item[2] = bl; + if (di & 1) { + int z = mapElement->base_height * 8; + map_invalidate_tile(x, y, z, z + 32); + } + if (di & 2) + wasInvalidated = true; + } while (!map_element_is_last_for_tile(mapElement++)); + + return !wasInvalidated; +} + +/** + * + * rct2: 0x006E5EE4 + */ +static bool map_animation_invalidate_wall(int x, int y, int baseZ) +{ + rct_map_element *mapElement; + rct_scenery_entry *sceneryEntry; + + bool wasInvalidated = false; + mapElement = map_get_first_element_at(x >> 5, y >> 5); + do { + if (mapElement->base_height != baseZ) + continue; + if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_FENCE) + continue; + + sceneryEntry = g_wallSceneryEntries[mapElement->properties.scenery.type]; + if (!(sceneryEntry->wall.flags2 & (1 << 4)) && sceneryEntry->wall.var_0D == 255) + continue; + + int z = mapElement->base_height * 8; + map_invalidate_tile(x, y, z, z + 16); + wasInvalidated = true; + } while (!map_element_is_last_for_tile(mapElement++)); + + return !wasInvalidated; +} \ No newline at end of file diff --git a/src/world/map_animation.h b/src/world/map_animation.h new file mode 100644 index 0000000000..e766f60b3b --- /dev/null +++ b/src/world/map_animation.h @@ -0,0 +1,41 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#ifndef _MAP_ANIMATION_H_ +#define _MAP_ANIMATION_H_ + +#include "../common.h" + +/** + * Animated object + * size: 0x06 + */ +typedef struct { + uint8 baseZ; + uint8 type; + uint16 x; + uint16 y; +} rct_animated_object; + +extern rct_animated_object *gAnimatedObjects; + +void map_animation_invalidate_all(); + +#endif \ No newline at end of file diff --git a/src/world/sprite.h b/src/world/sprite.h index ea1ec8a105..2eca98ca63 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -66,6 +66,10 @@ typedef struct { uint8 sprite_direction; //direction of sprite? 0x1e uint8 pad_1F[3]; // 0x1f uint16 name_string_idx; // 0x22 + uint8 pad_24[7]; + uint8 var_2B; + uint8 pad_2C[0x45]; + uint8 var_71; } rct_unk_sprite; typedef struct { From 3a6fcf790c4f0599bf0f2d41a852aeced95ea361 Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Thu, 19 Mar 2015 22:35:33 +0100 Subject: [PATCH 18/19] Iterate over windows backwards to close last window; fixes #932 --- src/interface/window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/window.c b/src/interface/window.c index 30ba02612c..7613b0872a 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -594,7 +594,7 @@ void window_close_top() if (RCT2_GLOBAL(0x0141F570, uint8) != 1) return; - for (w = g_window_list; w < RCT2_LAST_WINDOW; w++) { + for (w = RCT2_NEW_WINDOW - 1; w >= g_window_list; w--) { if (!(w->flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT))) { window_close(w); return; From 12deac185966d8175153dc3562852a1374814334 Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Thu, 19 Mar 2015 22:59:54 +0100 Subject: [PATCH 19/19] Add /MP flag to enable multiprocess compilation --- projects/openrct2.vcxproj | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 0f494356a3..1a6e2e0ed6 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -288,6 +288,7 @@ false _CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;_USE_MATH_DEFINES;%(PreprocessorDefinitions) $(IntDir)fake\%(RelativeDir) + true true