From 5f69e6f37ace9372fa840b5caa7e8bed37277f69 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Fri, 24 Jul 2015 22:58:41 +0100 Subject: [PATCH] add cycle day / night --- data/language/english_uk.txt | 1 + src/config.h | 1 + src/game.c | 1 + src/game.h | 1 + src/localisation/string_ids.h | 2 ++ src/platform/shared.c | 32 ++++++++++++++++++++++++++++++++ src/scenario.c | 23 +++++++++++++++++++++++ src/windows/options.c | 14 ++++++++++++-- 8 files changed, 73 insertions(+), 2 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index bb4ad88248..c2f7958242 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3806,3 +3806,4 @@ STR_5469 :Scroll map up STR_5470 :Scroll map left STR_5471 :Scroll map down STR_5472 :Scroll map right +STR_5473 :Cycle day / night diff --git a/src/config.h b/src/config.h index 32b2ca06df..0bc0b35d06 100644 --- a/src/config.h +++ b/src/config.h @@ -160,6 +160,7 @@ typedef struct { uint8 invert_viewport_drag; uint8 load_save_sort; uint8 minimize_fullscreen_focus_loss; + uint8 day_night_cycle; } general_configuration; typedef struct { diff --git a/src/game.c b/src/game.c index af5efbd4a1..3c0c753dae 100644 --- a/src/game.c +++ b/src/game.c @@ -58,6 +58,7 @@ #include "world/water.h" int gGameSpeed = 1; +float gDayNightCycle = 0; void game_increase_game_speed() { diff --git a/src/game.h b/src/game.h index 5247ccd70e..55e48051e9 100644 --- a/src/game.h +++ b/src/game.h @@ -91,6 +91,7 @@ enum GAME_COMMAND { typedef void (GAME_COMMAND_POINTER)(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); extern int gGameSpeed; +extern float gDayNightCycle; void game_increase_game_speed(); void game_reduce_game_speed(); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 80244ad75a..88aac31936 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -1803,6 +1803,8 @@ enum { STR_SHORTCUT_SCROLL_MAP_DOWN = 5471, STR_SHORTCUT_SCROLL_MAP_RIGHT = 5472, + STR_CYCLE_DAY_NIGHT = 5473, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/platform/shared.c b/src/platform/shared.c index d0e33ae639..0cf5d96885 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -24,6 +24,7 @@ #include "../config.h" #include "../cursors.h" #include "../drawing/drawing.h" +#include "../game.h" #include "../interface/console.h" #include "../interface/keyboard_shortcut.h" #include "../interface/window.h" @@ -266,6 +267,29 @@ static void platform_resize(int width, int height) } } +static uint8 soft_light(uint8 a, uint8 b) +{ + float fa = a / 255.0f; + float fb = b / 255.0f; + float fr; + if (fb < 0.5f) { + fr = (2 * fa * fb) + ((fa * fa) * (1 - (2 * fb))); + } else { + fr = (2 * fa * (1 - fb)) + (sqrtf(fa) * ((2 * fb) - 1)); + } + return (uint8)(clamp(0.0f, fr, 1.0f) * 255.0f); +} + +static uint8 lerp(uint8 a, uint8 b, float t) +{ + if (t <= 0) return a; + if (t >= 1) return b; + + int range = b - a; + int amount = (int)(range * t); + return (uint8)(a + amount); +} + void platform_update_palette(char* colours, int start_index, int num_colours) { SDL_Surface *surface; @@ -276,6 +300,14 @@ void platform_update_palette(char* colours, int start_index, int num_colours) gPalette[i].g = colours[1]; gPalette[i].b = colours[0]; gPalette[i].a = 0; + + float night = gDayNightCycle; + if (night >= 0 && RCT2_GLOBAL(RCT2_ADDRESS_LIGHTNING_ACTIVE, uint8) == 0) { + gPalette[i].r = lerp(gPalette[i].r, soft_light(gPalette[i].r, 8), night); + gPalette[i].g = lerp(gPalette[i].g, soft_light(gPalette[i].g, 8), night); + gPalette[i].b = lerp(gPalette[i].b, soft_light(gPalette[i].b, 128), night); + } + colours += 4; if (gBufferTextureFormat != NULL) { gPaletteHWMapped[i] = SDL_MapRGB(gBufferTextureFormat, gPalette[i].r, gPalette[i].g, gPalette[i].b); diff --git a/src/scenario.c b/src/scenario.c index 220a7d867c..7ae17eeb67 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -544,6 +544,27 @@ static void scenario_month_update() award_update_all(); } +static void scenario_update_daynight_cycle() +{ + gDayNightCycle = 0; + + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) != SCREEN_FLAGS_PLAYING) return; + if (!gConfigGeneral.day_night_cycle) return; + + float monthFraction = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) / (float)0x10000; + if (monthFraction < (1 / 8.0f)) { + gDayNightCycle = 0.0f; + } else if (monthFraction < (3 / 8.0f)) { + gDayNightCycle = (monthFraction - (1 / 8.0f)) / (2 / 8.0f); + } else if (monthFraction < (5 / 8.0f)) { + gDayNightCycle = 1.0f; + } else if (monthFraction < (7 / 8.0f)) { + gDayNightCycle = 1.0f - ((monthFraction - (5 / 8.0f)) / (2 / 8.0f)); + } else { + gDayNightCycle = 0.0f; + } +} + /* * Scenario and finance related update iteration. * rct2: 0x006C44B1 @@ -574,6 +595,8 @@ void scenario_update() RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, sint16)++; scenario_month_update(); } + + scenario_update_daynight_cycle(); } /** diff --git a/src/windows/options.c b/src/windows/options.c index eb7a968a48..883a41dcda 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -85,6 +85,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_THEMES, WIDX_THEMES_DROPDOWN, WIDX_THEMES_BUTTON, + WIDX_DAY_NIGHT_CHECKBOX, // Culture / Units WIDX_LANGUAGE = WIDX_PAGE_START, @@ -142,7 +143,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { }; #define WW 310 -#define WH 194 +#define WH 208 #define MAIN_OPTIONS_WIDGETS \ { WWT_FRAME, 0, 0, WW-1, 0, WH-1, STR_NONE, STR_NONE }, \ @@ -172,6 +173,7 @@ static rct_widget window_options_display_widgets[] = { { WWT_DROPDOWN, 1, 155, 299, 158, 169, STR_NONE, STR_NONE }, // colour schemes { WWT_DROPDOWN_BUTTON, 1, 288, 298, 159, 168, 876, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 26, 185, 174, 185, 5153, STR_NONE }, // colour schemes button + { WWT_CHECKBOX, 1, 10, 290, 190, 201, STR_CYCLE_DAY_NIGHT,STR_NONE }, // cycle day-night { WIDGETS_END }, }; @@ -335,7 +337,8 @@ static uint32 window_options_page_enabled_widgets[] = { (1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) | (1 << WIDX_THEMES) | (1 << WIDX_THEMES_DROPDOWN) | - (1 << WIDX_THEMES_BUTTON), + (1 << WIDX_THEMES_BUTTON) | + (1 << WIDX_DAY_NIGHT_CHECKBOX), MAIN_OPTIONS_ENABLED_WIDGETS | (1 << WIDX_LANGUAGE) | @@ -477,6 +480,11 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) window_themes_open(); window_invalidate(w); break; + case WIDX_DAY_NIGHT_CHECKBOX: + gConfigGeneral.day_night_cycle ^= 1; + config_save_default(); + window_invalidate(w); + break; } break; @@ -1075,6 +1083,7 @@ static void window_options_invalidate(rct_window *w) widget_set_checkbox_value(w, WIDX_HARDWARE_DISPLAY_CHECKBOX, gConfigGeneral.hardware_display); widget_set_checkbox_value(w, WIDX_UNCAP_FPS_CHECKBOX, gConfigGeneral.uncap_fps); widget_set_checkbox_value(w, WIDX_MINIMIZE_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss); + widget_set_checkbox_value(w, WIDX_DAY_NIGHT_CHECKBOX, gConfigGeneral.day_night_cycle); // construction marker: celsius/fahrenheit window_options_display_widgets[WIDX_CONSTRUCTION_MARKER].image = STR_WHITE + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CONSTRUCTION_MARKER, uint8); @@ -1093,6 +1102,7 @@ static void window_options_invalidate(rct_window *w) window_options_display_widgets[WIDX_THEMES].type = WWT_DROPDOWN; window_options_display_widgets[WIDX_THEMES_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_display_widgets[WIDX_THEMES_BUTTON].type = WWT_DROPDOWN_BUTTON; + window_options_display_widgets[WIDX_DAY_NIGHT_CHECKBOX].type = WWT_CHECKBOX; break; case WINDOW_OPTIONS_PAGE_CULTURE: