mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-29 09:44:52 +01:00
120 lines
4.2 KiB
C++
120 lines
4.2 KiB
C++
#pragma region Copyright (c) 2014-2017 OpenRCT2 Developers
|
|
/*****************************************************************************
|
|
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
|
|
*
|
|
* OpenRCT2 is the work of many authors, a full list can be found in contributors.md
|
|
* For more information, visit https://github.com/OpenRCT2/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.
|
|
*
|
|
* A full copy of the GNU General Public License can be found in licence.txt
|
|
*****************************************************************************/
|
|
#pragma endregion
|
|
|
|
#include "../Paint.h"
|
|
#include "../../config/Config.h"
|
|
#include "../../Game.h"
|
|
#include "../../interface/viewport.h"
|
|
#include "../../localisation/localisation.h"
|
|
#include "TileElement.h"
|
|
#include "../../world/Banner.h"
|
|
#include "../../world/scenery.h"
|
|
|
|
/** rct2: 0x0098D884 */
|
|
// BannerBoundBoxes[rotation][0] is for the pole in the back
|
|
// BannerBoundBoxes[rotation][1] is for the pole and the banner in the front
|
|
const LocationXY16 BannerBoundBoxes[][2] = {
|
|
{{ 1, 2}, { 1, 29}},
|
|
{{ 2, 32}, {29, 32}},
|
|
{{32, 2}, {32, 29}},
|
|
{{ 2, 1}, {29, 1}},
|
|
};
|
|
|
|
/**
|
|
*
|
|
* rct2: 0x006B9CC4
|
|
*/
|
|
void banner_paint(paint_session * session, uint8 direction, sint32 height, rct_tile_element* tile_element)
|
|
{
|
|
uint16 boundBoxOffsetX, boundBoxOffsetY, boundBoxOffsetZ;
|
|
rct_drawpixelinfo* dpi = session->Unk140E9A8;
|
|
|
|
session->InteractionType = VIEWPORT_INTERACTION_ITEM_BANNER;
|
|
|
|
if (dpi->zoom_level > 1 || gTrackDesignSaveMode) return;
|
|
|
|
height -= 16;
|
|
|
|
rct_scenery_entry* banner_scenery = get_banner_entry(gBanners[tile_element->properties.banner.index].type);
|
|
|
|
if (banner_scenery == nullptr) {
|
|
return;
|
|
}
|
|
|
|
direction += tile_element->properties.banner.position;
|
|
direction &= 3;
|
|
|
|
boundBoxOffsetX = BannerBoundBoxes[direction][0].x;
|
|
boundBoxOffsetY = BannerBoundBoxes[direction][0].y;
|
|
boundBoxOffsetZ = height + 2;
|
|
|
|
uint32 base_id = (direction << 1) + banner_scenery->image;
|
|
uint32 image_id = base_id;
|
|
|
|
if (tile_element->flags & TILE_ELEMENT_FLAG_GHOST) // if being placed
|
|
{
|
|
session->InteractionType = VIEWPORT_INTERACTION_ITEM_NONE;
|
|
image_id |= CONSTRUCTION_MARKER;
|
|
}
|
|
else{
|
|
image_id |=
|
|
(gBanners[tile_element->properties.banner.index].colour << 19) |
|
|
IMAGE_TYPE_REMAP;
|
|
}
|
|
|
|
sub_98197C(session, image_id, 0, 0, 1, 1, 0x15, height, boundBoxOffsetX, boundBoxOffsetY, boundBoxOffsetZ, get_current_rotation());
|
|
boundBoxOffsetX = BannerBoundBoxes[direction][1].x;
|
|
boundBoxOffsetY = BannerBoundBoxes[direction][1].y;
|
|
|
|
image_id++;
|
|
sub_98197C(session, image_id, 0, 0, 1, 1, 0x15, height, boundBoxOffsetX, boundBoxOffsetY, boundBoxOffsetZ, get_current_rotation());
|
|
|
|
// Opposite direction
|
|
direction ^= 2;
|
|
direction--;
|
|
// If text not showing / ghost
|
|
if (direction >= 2 || (tile_element->flags & TILE_ELEMENT_FLAG_GHOST)) return;
|
|
|
|
uint16 scrollingMode = banner_scenery->banner.scrolling_mode;
|
|
if (scrollingMode >= MAX_SCROLLING_TEXT_MODES) {
|
|
return;
|
|
}
|
|
|
|
scrollingMode += direction;
|
|
|
|
set_format_arg(0, uint32, 0);
|
|
set_format_arg(4, uint32, 0);
|
|
|
|
rct_string_id string_id = STR_NO_ENTRY;
|
|
if (!(gBanners[tile_element->properties.banner.index].flags & BANNER_FLAG_NO_ENTRY))
|
|
{
|
|
set_format_arg(0, rct_string_id, gBanners[tile_element->properties.banner.index].string_idx);
|
|
string_id = STR_BANNER_TEXT_FORMAT;
|
|
}
|
|
if (gConfigGeneral.upper_case_banners) {
|
|
format_string_to_upper(gCommonStringFormatBuffer, 256, string_id, gCommonFormatArgs);
|
|
} else {
|
|
format_string(gCommonStringFormatBuffer, 256, string_id, gCommonFormatArgs);
|
|
}
|
|
|
|
gCurrentFontSpriteBase = FONT_SPRITE_BASE_TINY;
|
|
|
|
uint16 string_width = gfx_get_string_width(gCommonStringFormatBuffer);
|
|
uint16 scroll = (gCurrentTicks / 2) % string_width;
|
|
|
|
sub_98199C(session, scrolling_text_setup(session, string_id, scroll, scrollingMode), 0, 0, 1, 1, 0x15, height + 22, boundBoxOffsetX, boundBoxOffsetY, boundBoxOffsetZ, get_current_rotation());
|
|
}
|