OpenTTD Source 20250312-master-gcdcc6b491d
signs_cmd.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD 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, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10#include "stdafx.h"
11#include "landscape.h"
12#include "company_func.h"
13#include "signs_base.h"
14#include "signs_func.h"
15#include "command_func.h"
16#include "tilehighlight_func.h"
17#include "viewport_kdtree.h"
18#include "window_func.h"
19#include "string_func.h"
20#include "signs_cmd.h"
21
22#include "table/strings.h"
23
24#include "safeguards.h"
25
35std::tuple<CommandCost, SignID> CmdPlaceSign(DoCommandFlags flags, TileIndex tile, const std::string &text)
36{
37 /* Try to locate a new sign */
38 if (!Sign::CanAllocateItem()) return { CommandCost(STR_ERROR_TOO_MANY_SIGNS), SignID::Invalid() };
39
40 /* Check sign text length if any */
41 if (Utf8StringLength(text) >= MAX_LENGTH_SIGN_NAME_CHARS) return { CMD_ERROR, SignID::Invalid() };
42
43 /* When we execute, really make the sign */
44 if (flags.Test(DoCommandFlag::Execute)) {
45 int x = TileX(tile) * TILE_SIZE;
46 int y = TileY(tile) * TILE_SIZE;
47
48 Sign *si = new Sign(_game_mode == GM_EDITOR ? OWNER_DEITY : _current_company, x, y, GetSlopePixelZ(x, y), text);
49
50 si->UpdateVirtCoord();
52 return { CommandCost(), si->index };
53 }
54
55 return { CommandCost(), SignID::Invalid() };
56}
57
67CommandCost CmdRenameSign(DoCommandFlags flags, SignID sign_id, const std::string &text)
68{
69 Sign *si = Sign::GetIfValid(sign_id);
70 if (si == nullptr) return CMD_ERROR;
71 if (!CompanyCanRenameSign(si)) return CMD_ERROR;
72
73 /* Rename the signs when empty, otherwise remove it */
74 if (!text.empty()) {
76
77 if (flags.Test(DoCommandFlag::Execute)) {
78 /* Assign the new one */
79 si->name = text;
80 if (_game_mode != GM_EDITOR) si->owner = _current_company;
81
82 si->UpdateVirtCoord();
84 }
85 } else { // Delete sign
86 if (flags.Test(DoCommandFlag::Execute)) {
87 si->sign.MarkDirty();
88 if (si->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeSign(si->index));
89 delete si;
90
92 }
93 }
94
95 return CommandCost();
96}
97
103void CcPlaceSign(Commands, const CommandCost &result, SignID new_sign)
104{
105 if (result.Failed()) return;
106
109}
110
118{
119 Command<CMD_PLACE_SIGN>::Post(STR_ERROR_CAN_T_PLACE_SIGN_HERE, CcPlaceSign, tile, {});
120}
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
Common return value for all commands.
bool Failed() const
Did this command fail?
Enum-as-bit-set wrapper.
void Remove(const T &element)
Remove a single element from the tree, if it exists.
Definition kdtree.hpp:417
Functions related to commands.
static const CommandCost CMD_ERROR
Define a default return value for a failed command.
@ Execute
execute the given command
Commands
List of commands.
CompanyID _current_company
Company currently doing an action.
Functions related to companies.
static constexpr Owner OWNER_DEITY
The object is owned by a superuser / goal script.
void MarkDirty(ZoomLevel maxzoom=ZOOM_LVL_MAX) const
Mark the sign dirty in all viewports.
int GetSlopePixelZ(int x, int y, bool ground_vehicle)
Return world Z coordinate of a given point of a tile.
Functions related to OTTD's landscape.
static debug_inline uint TileY(TileIndex tile)
Get the Y component of a tile.
Definition map_func.h:424
static debug_inline uint TileX(TileIndex tile)
Get the X component of a tile.
Definition map_func.h:414
A number of safeguards to prevent using unsafe methods.
bool CompanyCanRenameSign(const Sign *si)
Check if the current company can rename a given sign.
Definition signs.cpp:62
Base class for signs.
void PlaceProc_Sign(TileIndex tile)
PlaceProc function, called when someone pressed the button if the sign-tool is selected.
std::tuple< CommandCost, SignID > CmdPlaceSign(DoCommandFlags flags, TileIndex tile, const std::string &text)
Place a sign at the given coordinates.
Definition signs_cmd.cpp:35
void CcPlaceSign(Commands, const CommandCost &result, SignID new_sign)
Callback function that is called after a sign is placed.
CommandCost CmdRenameSign(DoCommandFlags flags, SignID sign_id, const std::string &text)
Rename a sign.
Definition signs_cmd.cpp:67
Command definitions related to signs.
Functions related to signs.
void ShowRenameSignWindow(const Sign *si)
Show the window to change the text of a sign.
static const uint MAX_LENGTH_SIGN_NAME_CHARS
The maximum length of a sign name in characters including '\0'.
Definition signs_type.h:18
Definition of base types and functions in a cross-platform compatible way.
size_t Utf8StringLength(const char *s)
Get the length of an UTF-8 encoded string in number of characters and thus not the number of bytes th...
Definition string.cpp:377
Functions related to low-level strings.
static Titem * Get(auto index)
Returns Titem with given index.
Tindex index
Index of this pool item.
static bool CanAllocateItem(size_t n=1)
Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function()
static Titem * GetIfValid(auto index)
Returns Titem with given index.
void UpdateVirtCoord()
Update the coordinate of one sign.
Definition signs.cpp:38
bool kdtree_valid
Are the sign data valid for use with the _viewport_sign_kdtree?
static const uint TILE_SIZE
Tile size in world coordinates.
Definition tile_type.h:15
Functions related to tile highlights.
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows).
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
Definition window.cpp:3224
Window functions not directly related to making/drawing windows.
@ WC_SIGN_LIST
Sign list; Window numbers: