From 035fa16fc32bfec6ae2454f90c46a716ece34246 Mon Sep 17 00:00:00 2001 From: Matthias Lanzinger Date: Sun, 27 Apr 2014 23:46:18 +0200 Subject: [PATCH] Crude start of a decompiled update_climate() --- src/addresses.h | 1 + src/climate.c | 64 ++++++++++++++++++++++++++++++++ src/climate.h | 1 + src/game.c | 4 +- src/window_game_bottom_toolbar.c | 2 +- 5 files changed, 70 insertions(+), 2 deletions(-) diff --git a/src/addresses.h b/src/addresses.h index d042c530d9..b62115f3d1 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -168,6 +168,7 @@ #define RCT2_ADDRESS_CURRENT_WEATHER 0x013CA74A #define RCT2_ADDRESS_NEXT_WEATHER 0x013CA74B #define RCT2_ADDRESS_CURRENT_TEMPERATURE 0x013CA74C +#define RCT2_ADDRESS_CLIMATE_UPDATE_TIMER 0x013CA748 #define RCT2_ADDRESS_NEWS_ITEM_LIST 0x013CA754 diff --git a/src/climate.c b/src/climate.c index 71ae908eda..fc3f3af706 100644 --- a/src/climate.c +++ b/src/climate.c @@ -20,6 +20,7 @@ #include "addresses.h" #include "date.h" +#include "gfx.h" #include "rct2.h" int climate_celcius_to_fahrenheit(int celcius) @@ -48,3 +49,66 @@ void climate_reset(int climate) RCT2_GLOBAL(0x013CA752, sint8) = (ecx >> 8) & 0xFF; RCT2_CALLPROC_X(0x6C461C, 0, 0, 0, 0, 0, 0, 0); } + + +/** + * + * rct2: 0x006C46B1 + **/ +void update_climate() +{ + uint8 screen_flags = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8); + if (screen_flags & (~SCREEN_FLAGS_PLAYING)) // only normal play mode gets climate + return; + + if (RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE_UPDATE_TIMER, sint16)) { + + if (RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE_UPDATE_TIMER, sint16) == 960) + RCT2_GLOBAL(0x009A9804, uint32) |= 8; // XXX climate dirty flag? + + RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE_UPDATE_TIMER, sint16)--; + + } else if (!(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, sint32) & 0x7F)) { + sint8 temperature = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TEMPERATURE, sint8); + sint8 target_temperature = RCT2_GLOBAL(0x013CA74D, sint8); + + if (temperature == target_temperature) { + if (RCT2_GLOBAL(0x013CA750, sint8) == RCT2_GLOBAL(0x013CA751, sint8)) { + + RCT2_GLOBAL(0x013CA74E, sint8) = RCT2_GLOBAL(0x013CA74F, sint8); + + if (RCT2_GLOBAL(0x013CA752, sint8) == RCT2_GLOBAL(0x013CA753, sint8)) { + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER, sint8) = RCT2_GLOBAL(RCT2_ADDRESS_NEXT_WEATHER, sint8); + RCT2_CALLPROC(0x006C461C); + RCT2_GLOBAL(0x009A9804, uint32) |= 8; // XXX climate dirty flag? + } + else { + if (RCT2_GLOBAL(0x013CA753, sint8) == 3) + RCT2_GLOBAL(0x013CA752, sint8) = 3; + else { + sint8 next = RCT2_GLOBAL(0x013CA752, sint8) + 1; + + if (RCT2_GLOBAL(0x013CA752, sint8) > RCT2_GLOBAL(0x013CA753, sint8)) + next = RCT2_GLOBAL(0x013CA752, sint8) - 1; + RCT2_GLOBAL(0x013CA752, sint8) = next; + } + } + } else { + sint8 next = RCT2_GLOBAL(0x013CA750, sint8) + 1; + + if (RCT2_GLOBAL(0x013CA750, sint8) > RCT2_GLOBAL(0x013CA751, sint8)) + next = RCT2_GLOBAL(0x013CA750, sint8) - 1; + RCT2_GLOBAL(0x013CA750, sint8) = next; + gfx_invalidate_screen(); + } + + } else { + sint8 newtemp = temperature + 1; + if (temperature > target_temperature) + newtemp = temperature - 1; + + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TEMPERATURE, sint8) = newtemp; + RCT2_GLOBAL(0x009A9804, uint32) |= 8; // XXX climate dirty flag? + } + } +} \ No newline at end of file diff --git a/src/climate.h b/src/climate.h index 7325bfd8b1..183bd0f08c 100644 --- a/src/climate.h +++ b/src/climate.h @@ -30,5 +30,6 @@ enum { int climate_celcius_to_fahrenheit(int celcius); void climate_reset(int climate); +void update_climate(); #endif diff --git a/src/game.c b/src/game.c index 7c94a2fb76..2aa8dcc08e 100644 --- a/src/game.c +++ b/src/game.c @@ -20,6 +20,7 @@ #include "addresses.h" #include "audio.h" +#include "climate.h" #include "config.h" #include "rct2.h" #include "game.h" @@ -136,7 +137,8 @@ void game_logic_update() RCT2_CALLPROC_EBPSAFE(0x0068B089); RCT2_CALLPROC_EBPSAFE(0x006C44B1); // update_objective - RCT2_CALLPROC_EBPSAFE(0x006C46B1); // update_climate + //RCT2_CALLPROC_EBPSAFE(0x006C46B1); // update_climate + update_climate(); RCT2_CALLPROC_EBPSAFE(0x006646E1); RCT2_CALLPROC_EBPSAFE(0x006A876D); peep_update_all(); diff --git a/src/window_game_bottom_toolbar.c b/src/window_game_bottom_toolbar.c index 9723e30a65..4530c8c68e 100644 --- a/src/window_game_bottom_toolbar.c +++ b/src/window_game_bottom_toolbar.c @@ -484,7 +484,7 @@ static void window_game_bottom_toolbar_draw_right_panel(rct_drawpixelinfo *dpi, // Next weather if (((int*)0x00993C98)[RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER, sint8) * 2] != ((int*)0x00993C98)[RCT2_GLOBAL(RCT2_ADDRESS_NEXT_WEATHER, sint8) * 2]) { - if (RCT2_GLOBAL(0x013CA748, sint16) < 960) { + if (RCT2_GLOBAL(RCT2_ADDRESS_CLIMATE_UPDATE_TIMER, sint16) < 960) { gfx_draw_sprite(dpi, SPR_NEXT_WEATHER, x + 27, y + 5); gfx_draw_sprite(dpi, ((int*)0x00993C98)[RCT2_GLOBAL(RCT2_ADDRESS_NEXT_WEATHER, sint8) * 2], x + 40, y); }