1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-24 15:24:30 +01:00
Files
OpenRCT2/src/openrct2/world/MoneyEffect.cpp

145 lines
4.1 KiB
C++

/*****************************************************************************
* Copyright (c) 2014-2018 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#include "../OpenRCT2.h"
#include "../drawing/Drawing.h"
#include "../interface/Viewport.h"
#include "../interface/Window.h"
#include "../localisation/Localisation.h"
#include "Map.h"
#include "Sprite.h"
static constexpr const LocationXY16 _moneyEffectMoveOffset[] = { { 1, -1 }, { 1, 1 }, { -1, 1 }, { -1, -1 } };
/**
*
* rct2: 0x0067351F
*/
void money_effect_create_at(money32 value, int32_t x, int32_t y, int32_t z, bool vertical)
{
if (value == MONEY(0, 00))
return;
rct_money_effect* moneyEffect = (rct_money_effect*)create_sprite(2);
if (moneyEffect == nullptr)
return;
moneyEffect->value = value;
moneyEffect->vertical = (vertical ? 1 : 0);
moneyEffect->sprite_width = 64;
moneyEffect->sprite_height_negative = 20;
moneyEffect->sprite_height_positive = 30;
moneyEffect->sprite_identifier = SPRITE_IDENTIFIER_MISC;
sprite_move(x, y, z, (rct_sprite*)moneyEffect);
moneyEffect->type = SPRITE_MISC_MONEY_EFFECT;
moneyEffect->num_movements = 0;
moneyEffect->move_delay = 0;
int16_t offsetX = 0;
if (!gOpenRCT2NoGraphics)
{
// Construct string to display
rct_string_id stringId = money_effect_get_string_id(moneyEffect, &value);
char buffer[128];
format_string(buffer, 128, stringId, &value);
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
offsetX = -(gfx_get_string_width(buffer) / 2);
}
moneyEffect->offset_x = offsetX;
moneyEffect->wiggle = 0;
}
/**
*
* rct2: 0x0069C5D0
*/
void money_effect_create(money32 value)
{
LocationXYZ16 mapPosition = { gCommandPosition.x, gCommandPosition.y, gCommandPosition.z };
if (mapPosition.x == LOCATION_NULL)
{
rct_window* mainWindow = window_get_main();
if (mainWindow == nullptr)
return;
rct_viewport* mainViewport = window_get_viewport(mainWindow);
screen_get_map_xy(
mainViewport->x + (mainViewport->width / 2), mainViewport->y + (mainViewport->height / 2), &mapPosition.x,
&mapPosition.y, nullptr);
if (mapPosition.x == LOCATION_NULL)
return;
mapPosition.z = tile_element_height(mapPosition.x, mapPosition.y) & 0xFFFF;
}
mapPosition.z += 10;
money_effect_create_at(-value, mapPosition.x, mapPosition.y, mapPosition.z, false);
}
/**
*
* rct2: 0x00673232
*/
void money_effect_update(rct_money_effect* moneyEffect)
{
invalidate_sprite_2((rct_sprite*)moneyEffect);
moneyEffect->wiggle++;
if (moneyEffect->wiggle >= 22)
{
moneyEffect->wiggle = 0;
}
moneyEffect->move_delay++;
if (moneyEffect->move_delay < 2)
{
return;
}
int32_t x = moneyEffect->x;
int32_t y = moneyEffect->y;
int32_t z = moneyEffect->z;
moneyEffect->move_delay = 0;
if (moneyEffect->vertical)
{
z += 1;
}
y += _moneyEffectMoveOffset[get_current_rotation()].y;
x += _moneyEffectMoveOffset[get_current_rotation()].x;
sprite_move(x, y, z, (rct_sprite*)moneyEffect);
moneyEffect->num_movements++;
if (moneyEffect->num_movements < 55)
{
return;
}
sprite_remove((rct_sprite*)moneyEffect);
}
rct_string_id money_effect_get_string_id(const rct_money_effect* sprite, money32* outValue)
{
bool vertical = (sprite->vertical != 0);
rct_string_id spentStringId = vertical ? STR_MONEY_EFFECT_SPEND_HIGHP : STR_MONEY_EFFECT_SPEND;
rct_string_id receiveStringId = vertical ? STR_MONEY_EFFECT_RECEIVE_HIGHP : STR_MONEY_EFFECT_RECEIVE;
rct_string_id stringId = receiveStringId;
money32 value = sprite->value;
if (value < 0)
{
value *= -1;
stringId = spentStringId;
}
if (outValue != nullptr)
{
*outValue = value;
}
return stringId;
}