mirror of https://github.com/OpenRCT2/OpenRCT2.git
commit
6f4a02dd53
|
@ -21,6 +21,7 @@
|
||||||
#include "localisation/date.h"
|
#include "localisation/date.h"
|
||||||
#include "management/finance.h"
|
#include "management/finance.h"
|
||||||
#include "network/network.h"
|
#include "network/network.h"
|
||||||
|
#include "util/util.h"
|
||||||
#include "world/climate.h"
|
#include "world/climate.h"
|
||||||
#include "world/footpath.h"
|
#include "world/footpath.h"
|
||||||
#include "world/scenery.h"
|
#include "world/scenery.h"
|
||||||
|
@ -235,8 +236,7 @@ static void cheat_no_money(bool enabled)
|
||||||
|
|
||||||
static void cheat_set_money(money32 amount)
|
static void cheat_set_money(money32 amount)
|
||||||
{
|
{
|
||||||
money32 money = clamp(INT_MIN, amount, INT_MAX);
|
gCashEncrypted = ENCRYPT_MONEY(amount);
|
||||||
gCashEncrypted = ENCRYPT_MONEY(money);
|
|
||||||
|
|
||||||
window_invalidate_by_class(WC_FINANCES);
|
window_invalidate_by_class(WC_FINANCES);
|
||||||
window_invalidate_by_class(WC_BOTTOM_TOOLBAR);
|
window_invalidate_by_class(WC_BOTTOM_TOOLBAR);
|
||||||
|
@ -245,19 +245,7 @@ static void cheat_set_money(money32 amount)
|
||||||
static void cheat_add_money(money32 amount)
|
static void cheat_add_money(money32 amount)
|
||||||
{
|
{
|
||||||
money32 currentMoney = DECRYPT_MONEY(gCashEncrypted);
|
money32 currentMoney = DECRYPT_MONEY(gCashEncrypted);
|
||||||
if (amount >= 0) {
|
currentMoney = add_clamp_money32(currentMoney, amount);
|
||||||
if (currentMoney < INT_MAX - amount)
|
|
||||||
currentMoney += amount;
|
|
||||||
else
|
|
||||||
currentMoney = INT_MAX;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
money32 absAmount = amount * -1;
|
|
||||||
if (currentMoney > INT_MIN + absAmount)
|
|
||||||
currentMoney -= absAmount;
|
|
||||||
else
|
|
||||||
currentMoney = INT_MIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
gCashEncrypted = ENCRYPT_MONEY(currentMoney);
|
gCashEncrypted = ENCRYPT_MONEY(currentMoney);
|
||||||
|
|
||||||
|
|
|
@ -220,16 +220,7 @@ typedef uint16 rct_string_id;
|
||||||
#define RESTRICT
|
#define RESTRICT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#define assert_struct_size(x, y) static_assert(sizeof(x) == (y), "Improper struct size")
|
#define assert_struct_size(x, y) static_assert(sizeof(x) == (y), "Improper struct size")
|
||||||
#else
|
|
||||||
// Visual Studio does not know _Static_assert
|
|
||||||
#if !defined(_MSC_VER)
|
|
||||||
#define assert_struct_size(x, y) _Static_assert(sizeof(x) == (y), "Improper struct size")
|
|
||||||
#else
|
|
||||||
#define assert_struct_size(x, y)
|
|
||||||
#endif // !defined(_MSC_VER)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PLATFORM_X86
|
#ifdef PLATFORM_X86
|
||||||
#ifndef FASTCALL
|
#ifndef FASTCALL
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
#include "../audio/audio.h"
|
#include "../audio/audio.h"
|
||||||
|
#include "../core/Guard.hpp"
|
||||||
#include "../drawing/drawing.h"
|
#include "../drawing/drawing.h"
|
||||||
#include "../editor.h"
|
#include "../editor.h"
|
||||||
#include "../game.h"
|
#include "../game.h"
|
||||||
|
@ -1274,12 +1275,13 @@ void window_push_others_below(rct_window *w1)
|
||||||
*/
|
*/
|
||||||
rct_window *window_get_main()
|
rct_window *window_get_main()
|
||||||
{
|
{
|
||||||
rct_window* w;
|
rct_window* w = NULL;
|
||||||
|
|
||||||
for (w = g_window_list; w < RCT2_NEW_WINDOW; w++)
|
for (w = g_window_list; w < RCT2_NEW_WINDOW; w++)
|
||||||
if (w->classification == WC_MAIN_WINDOW)
|
if (w->classification == WC_MAIN_WINDOW)
|
||||||
return w;
|
return w;
|
||||||
|
|
||||||
|
openrct2_assert(w != NULL, "Failed to get main window");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,8 +75,6 @@ void intro_update()
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case INTRO_STATE_DEVELOPER_BEGIN:
|
case INTRO_STATE_DEVELOPER_BEGIN:
|
||||||
_introStateCounter += 5;
|
|
||||||
|
|
||||||
// Set the Y for the Chris Sawyer logo
|
// Set the Y for the Chris Sawyer logo
|
||||||
_introStateCounter = -116;
|
_introStateCounter = -116;
|
||||||
|
|
||||||
|
|
|
@ -76,12 +76,7 @@ void finance_payment(money32 amount, rct_expenditure_type type)
|
||||||
money32 new_money;
|
money32 new_money;
|
||||||
|
|
||||||
//overflow check
|
//overflow check
|
||||||
if (amount < 0 && cur_money >= INT_MAX + amount)
|
new_money = add_clamp_money32(cur_money, -amount);
|
||||||
new_money = INT_MAX;
|
|
||||||
else if (amount >= 0 && cur_money < INT_MIN + amount)
|
|
||||||
new_money = INT_MIN;
|
|
||||||
else
|
|
||||||
new_money = cur_money - amount;
|
|
||||||
|
|
||||||
gCashEncrypted = ENCRYPT_MONEY(new_money);
|
gCashEncrypted = ENCRYPT_MONEY(new_money);
|
||||||
gExpenditureTable[type] -= amount;
|
gExpenditureTable[type] -= amount;
|
||||||
|
|
|
@ -55,7 +55,7 @@ extern "C" {
|
||||||
// This define specifies which version of network stream current build uses.
|
// This define specifies which version of network stream current build uses.
|
||||||
// It is used for making sure only compatible builds get connected, even within
|
// It is used for making sure only compatible builds get connected, even within
|
||||||
// single OpenRCT2 version.
|
// single OpenRCT2 version.
|
||||||
#define NETWORK_STREAM_VERSION "3"
|
#define NETWORK_STREAM_VERSION "4"
|
||||||
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
|
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -199,7 +199,7 @@ namespace Twitch
|
||||||
_twitchState = TWITCH_STATE_JOINING;
|
_twitchState = TWITCH_STATE_JOINING;
|
||||||
_twitchIdle = false;
|
_twitchIdle = false;
|
||||||
|
|
||||||
http_request_t request;
|
http_request_t request = { 0 };
|
||||||
request.url = url;
|
request.url = url;
|
||||||
request.method = HTTP_METHOD_GET;
|
request.method = HTTP_METHOD_GET;
|
||||||
request.body = nullptr;
|
request.body = nullptr;
|
||||||
|
@ -276,7 +276,7 @@ namespace Twitch
|
||||||
_twitchState = TWITCH_STATE_WAITING;
|
_twitchState = TWITCH_STATE_WAITING;
|
||||||
_twitchIdle = false;
|
_twitchIdle = false;
|
||||||
|
|
||||||
http_request_t request;
|
http_request_t request = { 0 };
|
||||||
request.url = url;
|
request.url = url;
|
||||||
request.method = HTTP_METHOD_GET;
|
request.method = HTTP_METHOD_GET;
|
||||||
request.body = NULL;
|
request.body = NULL;
|
||||||
|
@ -307,7 +307,7 @@ namespace Twitch
|
||||||
_twitchState = TWITCH_STATE_WAITING;
|
_twitchState = TWITCH_STATE_WAITING;
|
||||||
_twitchIdle = false;
|
_twitchIdle = false;
|
||||||
|
|
||||||
http_request_t request;
|
http_request_t request = { 0 };
|
||||||
request.url = url;
|
request.url = url;
|
||||||
request.method = HTTP_METHOD_GET;
|
request.method = HTTP_METHOD_GET;
|
||||||
request.body = nullptr;
|
request.body = nullptr;
|
||||||
|
|
|
@ -1375,16 +1375,24 @@ static sint32 checkForPath(rct_peep *peep){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8 peep_get_action_sprite_type(rct_peep* peep)
|
||||||
|
{
|
||||||
|
if (peep->action >= PEEP_ACTION_NONE_1){ // PEEP_ACTION_NONE_1 or PEEP_ACTION_NONE_2
|
||||||
|
return PeepSpecialSpriteToSpriteTypeMap[peep->special_sprite];
|
||||||
|
} else if (peep->action < countof(PeepActionToSpriteTypeMap)) {
|
||||||
|
return PeepActionToSpriteTypeMap[peep->action];
|
||||||
|
} else {
|
||||||
|
openrct2_assert(peep->action >= countof(PeepActionToSpriteTypeMap) && peep->action < PEEP_ACTION_NONE_1,
|
||||||
|
"Invalid peep action %u", peep->action);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void sub_693B58(rct_peep* peep){
|
void sub_693B58(rct_peep* peep){
|
||||||
uint8 action_sprite_type;
|
|
||||||
if (peep->sprite_type >= countof(g_peep_animation_entries)) {
|
if (peep->sprite_type >= countof(g_peep_animation_entries)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (peep->action >= PEEP_ACTION_NONE_1){ // PEEP_ACTION_NONE_1 or PEEP_ACTION_NONE_2
|
uint8 action_sprite_type = peep_get_action_sprite_type(peep);
|
||||||
action_sprite_type = PeepSpecialSpriteToSpriteTypeMap[peep->special_sprite];
|
|
||||||
} else {
|
|
||||||
action_sprite_type = PeepActionToSpriteTypeMap[peep->action];
|
|
||||||
}
|
|
||||||
if (action_sprite_type == peep->action_sprite_type)return;
|
if (action_sprite_type == peep->action_sprite_type)return;
|
||||||
|
|
||||||
invalidate_sprite_2((rct_sprite*)peep);
|
invalidate_sprite_2((rct_sprite*)peep);
|
||||||
|
@ -9913,11 +9921,18 @@ static sint32 guest_path_find_park_entrance(rct_peep* peep, rct_map_element *map
|
||||||
*
|
*
|
||||||
* rct2: 0x006A72C5
|
* rct2: 0x006A72C5
|
||||||
* param dist is not used.
|
* param dist is not used.
|
||||||
|
*
|
||||||
|
* In case where the map element at (x, y) is invalid or there is no entrance
|
||||||
|
* or queue leading to it the function will not update its arguments.
|
||||||
*/
|
*/
|
||||||
static void get_ride_queue_end(sint16 *x, sint16 *y, sint16 *z){
|
static void get_ride_queue_end(sint16 *x, sint16 *y, sint16 *z){
|
||||||
rct_xy16 result = { 0, 0 };
|
rct_xy16 result = { 0, 0 };
|
||||||
rct_map_element *mapElement = map_get_first_element_at(*x / 32, *y / 32);
|
rct_map_element *mapElement = map_get_first_element_at(*x / 32, *y / 32);
|
||||||
|
|
||||||
|
if (mapElement == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
do{
|
do{
|
||||||
if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE)
|
if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_ENTRANCE)
|
||||||
|
|
|
@ -406,7 +406,7 @@ void game_command_set_staff_order(sint32 *eax, sint32 *ebx, sint32 *ecx, sint32
|
||||||
if(order_id & 0x80){ // change costume
|
if(order_id & 0x80){ // change costume
|
||||||
uint8 sprite_type = order_id & ~0x80;
|
uint8 sprite_type = order_id & ~0x80;
|
||||||
sprite_type += 4;
|
sprite_type += 4;
|
||||||
if (sprite_type > countof(peep_slow_walking_types)) {
|
if (sprite_type >= countof(peep_slow_walking_types)) {
|
||||||
log_error("Invalid change costume order for sprite_type %u", sprite_type);
|
log_error("Invalid change costume order for sprite_type %u", sprite_type);
|
||||||
*ebx = MONEY32_UNDEFINED;
|
*ebx = MONEY32_UNDEFINED;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -765,7 +765,7 @@ sint32 ride_find_track_gap(rct_xy_element *input, rct_xy_element *output)
|
||||||
{
|
{
|
||||||
rct_window *w;
|
rct_window *w;
|
||||||
rct_ride *ride;
|
rct_ride *ride;
|
||||||
track_circuit_iterator it, slowIt;
|
track_circuit_iterator it = { 0 }, slowIt;
|
||||||
sint32 rideIndex;
|
sint32 rideIndex;
|
||||||
|
|
||||||
assert(map_element_get_type(input->element) == MAP_ELEMENT_TYPE_TRACK);
|
assert(map_element_get_type(input->element) == MAP_ELEMENT_TYPE_TRACK);
|
||||||
|
@ -5194,7 +5194,7 @@ static sint32 ride_is_valid_for_test(sint32 rideIndex, sint32 goingToBeOpen, sin
|
||||||
{
|
{
|
||||||
sint32 stationIndex;
|
sint32 stationIndex;
|
||||||
rct_ride *ride;
|
rct_ride *ride;
|
||||||
rct_xy_element trackElement, problematicTrackElement;
|
rct_xy_element trackElement, problematicTrackElement = { 0 };
|
||||||
|
|
||||||
ride = get_ride(rideIndex);
|
ride = get_ride(rideIndex);
|
||||||
if (ride->type == RIDE_TYPE_NULL)
|
if (ride->type == RIDE_TYPE_NULL)
|
||||||
|
@ -5323,7 +5323,7 @@ static sint32 ride_is_valid_for_open(sint32 rideIndex, sint32 goingToBeOpen, sin
|
||||||
{
|
{
|
||||||
sint32 stationIndex;
|
sint32 stationIndex;
|
||||||
rct_ride *ride;
|
rct_ride *ride;
|
||||||
rct_xy_element trackElement, problematicTrackElement;
|
rct_xy_element trackElement, problematicTrackElement = { 0 };
|
||||||
|
|
||||||
ride = get_ride(rideIndex);
|
ride = get_ride(rideIndex);
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "../world/map_animation.h"
|
#include "../world/map_animation.h"
|
||||||
#include "../world/scenery.h"
|
#include "../world/scenery.h"
|
||||||
#include "../world/sprite.h"
|
#include "../world/sprite.h"
|
||||||
|
#include "../util/util.h"
|
||||||
#include "cable_lift.h"
|
#include "cable_lift.h"
|
||||||
#include "ride.h"
|
#include "ride.h"
|
||||||
#include "ride_data.h"
|
#include "ride_data.h"
|
||||||
|
@ -1244,7 +1245,7 @@ static void vehicle_update_measurements(rct_vehicle *vehicle)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ride->average_speed_test_timeout == 0 && velocity > 0x8000){
|
if (ride->average_speed_test_timeout == 0 && velocity > 0x8000){
|
||||||
ride->average_speed += velocity;
|
ride->average_speed = add_clamp_sint32(ride->average_speed, velocity);
|
||||||
ride->time[test_segment]++;
|
ride->time[test_segment]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -494,3 +494,43 @@ uint8 *util_zlib_deflate(const uint8 *data, size_t data_in_size, size_t *data_ou
|
||||||
buffer = realloc(buffer, *data_out_size);
|
buffer = realloc(buffer, *data_out_size);
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Type-independant code left as macro to reduce duplicate code.
|
||||||
|
#define add_clamp_body(value, value_to_add, min_cap, max_cap) \
|
||||||
|
if ((value_to_add > 0) && (value > (max_cap - value_to_add))) { \
|
||||||
|
value = max_cap; \
|
||||||
|
} \
|
||||||
|
else if ((value_to_add < 0) && (value < (min_cap - value_to_add))) { \
|
||||||
|
value = min_cap; \
|
||||||
|
} \
|
||||||
|
else { \
|
||||||
|
value += value_to_add; \
|
||||||
|
}
|
||||||
|
|
||||||
|
sint8 add_clamp_sint8(sint8 value, sint8 value_to_add)
|
||||||
|
{
|
||||||
|
add_clamp_body(value, value_to_add, INT8_MIN, INT8_MAX);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
sint16 add_clamp_sint16(sint16 value, sint16 value_to_add)
|
||||||
|
{
|
||||||
|
add_clamp_body(value, value_to_add, INT16_MIN, INT16_MAX);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
sint32 add_clamp_sint32(sint32 value, sint32 value_to_add)
|
||||||
|
{
|
||||||
|
add_clamp_body(value, value_to_add, INT32_MIN, INT32_MAX);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
money32 add_clamp_money32(money32 value, money32 value_to_add)
|
||||||
|
{
|
||||||
|
// This function is intended only for clarity, as money32
|
||||||
|
// is technically the same as sint32
|
||||||
|
assert_struct_size(money32, sizeof(sint32));
|
||||||
|
return add_clamp_sint32(value, value_to_add);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef add_clamp_body
|
||||||
|
|
|
@ -57,4 +57,9 @@ uint32 util_rand();
|
||||||
uint8 *util_zlib_deflate(const uint8 *data, size_t data_in_size, size_t *data_out_size);
|
uint8 *util_zlib_deflate(const uint8 *data, size_t data_in_size, size_t *data_out_size);
|
||||||
uint8 *util_zlib_inflate(uint8 *data, size_t data_in_size, size_t *data_out_size);
|
uint8 *util_zlib_inflate(uint8 *data, size_t data_in_size, size_t *data_out_size);
|
||||||
|
|
||||||
|
sint8 add_clamp_sint8(sint8 value, sint8 value_to_add);
|
||||||
|
sint16 add_clamp_sint16(sint16 value, sint16 value_to_add);
|
||||||
|
sint32 add_clamp_sint32(sint32 value, sint32 value_to_add);
|
||||||
|
money32 add_clamp_money32(money32 value, money32 value_to_add);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -495,11 +495,11 @@ static void window_cheats_money_mousedown(sint32 widgetIndex, rct_window *w, rct
|
||||||
{
|
{
|
||||||
switch (widgetIndex) {
|
switch (widgetIndex) {
|
||||||
case WIDX_MONEY_SPINNER_INCREMENT:
|
case WIDX_MONEY_SPINNER_INCREMENT:
|
||||||
_moneySpinnerValue = min(INT_MAX, MONEY_INCREMENT_DIV * (_moneySpinnerValue / MONEY_INCREMENT_DIV + 1));
|
_moneySpinnerValue = add_clamp_money32(MONEY_INCREMENT_DIV * (_moneySpinnerValue / MONEY_INCREMENT_DIV), MONEY_INCREMENT_DIV);
|
||||||
widget_invalidate_by_class(WC_CHEATS, WIDX_MONEY_SPINNER);
|
widget_invalidate_by_class(WC_CHEATS, WIDX_MONEY_SPINNER);
|
||||||
break;
|
break;
|
||||||
case WIDX_MONEY_SPINNER_DECREMENT:
|
case WIDX_MONEY_SPINNER_DECREMENT:
|
||||||
_moneySpinnerValue = max(INT_MIN, MONEY_INCREMENT_DIV * (_moneySpinnerValue / MONEY_INCREMENT_DIV - 1));
|
_moneySpinnerValue = add_clamp_money32(MONEY_INCREMENT_DIV * (_moneySpinnerValue / MONEY_INCREMENT_DIV), -MONEY_INCREMENT_DIV);
|
||||||
widget_invalidate_by_class(WC_CHEATS, WIDX_MONEY_SPINNER);
|
widget_invalidate_by_class(WC_CHEATS, WIDX_MONEY_SPINNER);
|
||||||
break;
|
break;
|
||||||
case WIDX_ADD_MONEY:
|
case WIDX_ADD_MONEY:
|
||||||
|
|
|
@ -702,7 +702,7 @@ static void fetch_servers()
|
||||||
sort_servers();
|
sort_servers();
|
||||||
SDL_UnlockMutex(_mutex);
|
SDL_UnlockMutex(_mutex);
|
||||||
|
|
||||||
http_request_t request;
|
http_request_t request = { 0 };
|
||||||
request.url = masterServerUrl;
|
request.url = masterServerUrl;
|
||||||
request.method = HTTP_METHOD_GET;
|
request.method = HTTP_METHOD_GET;
|
||||||
request.body = NULL;
|
request.body = NULL;
|
||||||
|
|
|
@ -1126,7 +1126,7 @@ void game_command_remove_banner(sint32* eax, sint32* ebx, sint32* ecx, sint32* e
|
||||||
rct_banner *banner = &gBanners[map_element->properties.banner.index];
|
rct_banner *banner = &gBanners[map_element->properties.banner.index];
|
||||||
rct_scenery_entry *scenery_entry = get_banner_entry(banner->type);
|
rct_scenery_entry *scenery_entry = get_banner_entry(banner->type);
|
||||||
money32 refund = 0;
|
money32 refund = 0;
|
||||||
if (scenery_entry != NULL || scenery_entry != (rct_scenery_entry *)-1) {
|
if (scenery_entry != NULL && scenery_entry != (rct_scenery_entry *)-1) {
|
||||||
refund = -((scenery_entry->banner.price * 3) / 4);
|
refund = -((scenery_entry->banner.price * 3) / 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue