OpenTTD Source 20241224-master-gee860a5c8e
town_gui.cpp File Reference

GUI for towns. More...

#include "stdafx.h"
#include "town.h"
#include "viewport_func.h"
#include "error.h"
#include "gui.h"
#include "house.h"
#include "newgrf_cargo.h"
#include "newgrf_house.h"
#include "newgrf_text.h"
#include "picker_gui.h"
#include "command_func.h"
#include "company_func.h"
#include "company_base.h"
#include "company_gui.h"
#include "network/network.h"
#include "string_func.h"
#include "strings_func.h"
#include "sound_func.h"
#include "tilehighlight_func.h"
#include "sortlist_type.h"
#include "road_cmd.h"
#include "landscape.h"
#include "querystring_gui.h"
#include "window_func.h"
#include "townname_func.h"
#include "core/backup_type.hpp"
#include "core/geometry_func.hpp"
#include "genworld.h"
#include "fios.h"
#include "stringfilter_type.h"
#include "dropdown_func.h"
#include "town_kdtree.h"
#include "town_cmd.h"
#include "timer/timer.h"
#include "timer/timer_game_calendar.h"
#include "timer/timer_window.h"
#include "zoom_func.h"
#include "hotkeys.h"
#include "widgets/town_widget.h"
#include "table/strings.h"
#include <sstream>
#include "safeguards.h"

Go to the source code of this file.

Data Structures

struct  TownAuthorityWindow
 Town authority window. More...
 
struct  TownViewWindow
 
struct  TownDirectoryWindow
 Town directory window class. More...
 
struct  FoundTownWindow
 Found a town window class. More...
 
class  HousePickerCallbacks
 
struct  BuildHouseWindow
 

Typedefs

typedef GUIList< const Town *, const bool & > GUITownList
 

Enumerations

enum  TownDirectoryHotkeys { TDHK_FOCUS_FILTER_BOX }
 Enum referring to the Hotkeys in the town directory window. More...
 

Functions

static void ShowTownAuthorityWindow (uint town)
 
void ShowTownViewWindow (TownID town)
 
void ShowTownDirectory ()
 
void CcFoundTown (Commands, const CommandCost &result, TileIndex tile)
 
void CcFoundRandomTown (Commands, const CommandCost &result, Money, TownID town_id)
 
void ShowFoundTownWindow ()
 
void InitializeTownGui ()
 
void DrawNewHouseTileInGUI (int x, int y, const HouseSpec *spec, HouseID house_id, int view)
 Draw representation of a house tile for GUI purposes.
 
void DrawHouseInGUI (int x, int y, HouseID house_id, int view)
 Draw a house that does not exist.
 
static StringID GetHouseName (const HouseSpec *hs)
 Get name for a prototype house.
 
void ShowBuildHousePicker (Window *parent)
 

Variables

TownKdtree _town_local_authority_kdtree {}
 
static constexpr NWidgetPart _nested_town_authority_widgets []
 
static WindowDesc _town_authority_desc (WDP_AUTO, "view_town_authority", 317, 222, WC_TOWN_AUTHORITY, WC_NONE, 0, _nested_town_authority_widgets)
 
static constexpr NWidgetPart _nested_town_game_view_widgets []
 
static WindowDesc _town_game_view_desc (WDP_AUTO, "view_town", 260, TownViewWindow::WID_TV_HEIGHT_NORMAL, WC_TOWN_VIEW, WC_NONE, 0, _nested_town_game_view_widgets)
 
static constexpr NWidgetPart _nested_town_editor_view_widgets []
 
static WindowDesc _town_editor_view_desc (WDP_AUTO, "view_town_scen", 260, TownViewWindow::WID_TV_HEIGHT_NORMAL, WC_TOWN_VIEW, WC_NONE, 0, _nested_town_editor_view_widgets)
 
static constexpr NWidgetPart _nested_town_directory_widgets []
 
static WindowDesc _town_directory_desc (WDP_AUTO, "list_towns", 208, 202, WC_TOWN_DIRECTORY, WC_NONE, 0, _nested_town_directory_widgets, &TownDirectoryWindow::hotkeys)
 
static constexpr NWidgetPart _nested_found_town_widgets []
 
static WindowDesc _found_town_desc (WDP_AUTO, "build_town", 160, 162, WC_FOUND_TOWN, WC_NONE, WDF_CONSTRUCTION, _nested_found_town_widgets)
 
static constexpr NWidgetPart _nested_build_house_widgets []
 Nested widget definition for the build NewGRF rail waypoint window.
 
static WindowDesc _build_house_desc (WDP_AUTO, "build_house", 0, 0, WC_BUILD_HOUSE, WC_BUILD_TOOLBAR, WDF_CONSTRUCTION, _nested_build_house_widgets, &BuildHouseWindow::hotkeys)
 

Detailed Description

GUI for towns.

Definition in file town_gui.cpp.

Typedef Documentation

◆ GUITownList

typedef GUIList<const Town*, const bool &> GUITownList

Definition at line 59 of file town_gui.cpp.

Enumeration Type Documentation

◆ TownDirectoryHotkeys

Enum referring to the Hotkeys in the town directory window.

Enumerator
TDHK_FOCUS_FILTER_BOX 

Focus the filter box.

Definition at line 727 of file town_gui.cpp.

Function Documentation

◆ CcFoundRandomTown()

void CcFoundRandomTown ( Commands  cmd,
const CommandCost result,
Money  ,
TownID  town_id 
)

Definition at line 1098 of file town_gui.cpp.

◆ CcFoundTown()

void CcFoundTown ( Commands  ,
const CommandCost result,
TileIndex  tile 
)

Definition at line 1090 of file town_gui.cpp.

◆ DrawHouseInGUI()

void DrawHouseInGUI ( int  x,
int  y,
HouseID  house_id,
int  view 
)

Draw a house that does not exist.

Parameters
xPosition x of image.
yPosition y of image.
house_idHouse ID to draw.
viewThe house's 'view'.

Definition at line 1405 of file town_gui.cpp.

References HouseSpec::building_flags, DrawNewHouseTileInGUI(), DrawSprite(), HouseSpec::Get(), HouseSpec::grf_prop, NEW_HOUSE_OFFSET, PalSpriteID::pal, RemapCoords(), ScaleGUITrad(), PalSpriteID::sprite, GRFFilePropsBase< Tcnt >::spritegroup, TILE_PIXELS, TOWN_HOUSE_COMPLETED, and UnScaleGUI().

Referenced by HousePickerCallbacks::DrawType().

◆ DrawNewHouseTileInGUI()

void DrawNewHouseTileInGUI ( int  x,
int  y,
const HouseSpec spec,
HouseID  house_id,
int  view 
)

Draw representation of a house tile for GUI purposes.

Parameters
xPosition x of image.
yPosition y of image.
specHouse spec to draw.
house_idHouse ID to draw.
viewThe house's 'view'.

Definition at line 1367 of file town_gui.cpp.

References CALLBACK_FAILED, HouseSpec::callback_mask, CBID_HOUSE_COLOUR, CBID_NO_CALLBACK, CBM_HOUSE_COLOUR, DrawNewGRFTileSeqInGUI(), DrawSprite(), GB(), DrawTileSprites::ground, GroundSpritePaletteTransform(), HasBit(), INVALID_TILE, PalSpriteID::pal, HouseSpec::random_colour, SpriteGroup::Resolve(), PalSpriteID::sprite, SPRITE_MODIFIER_CUSTOM_SPRITE, SPRITE_WIDTH, and TOWN_HOUSE_COMPLETED.

Referenced by DrawHouseInGUI().

◆ GetHouseName()

static StringID GetHouseName ( const HouseSpec hs)
static

◆ InitializeTownGui()

void InitializeTownGui ( )

Definition at line 1354 of file town_gui.cpp.

◆ ShowBuildHousePicker()

void ShowBuildHousePicker ( Window parent)

Definition at line 1787 of file town_gui.cpp.

◆ ShowFoundTownWindow()

void ShowFoundTownWindow ( )

Definition at line 1348 of file town_gui.cpp.

◆ ShowTownAuthorityWindow()

static void ShowTownAuthorityWindow ( uint  town)
static

Definition at line 357 of file town_gui.cpp.

◆ ShowTownDirectory()

void ShowTownDirectory ( )

Definition at line 1084 of file town_gui.cpp.

◆ ShowTownViewWindow()

void ShowTownViewWindow ( TownID  town)

Definition at line 689 of file town_gui.cpp.

Variable Documentation

◆ _nested_build_house_widgets

constexpr NWidgetPart _nested_build_house_widgets[]
staticconstexpr
Initial value:
= {
NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_HOUSE_PICKER_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_SHADEBOX, COLOUR_DARK_GREEN),
NWidget(WWT_DEFSIZEBOX, COLOUR_DARK_GREEN),
NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
NWidget(WWT_PANEL, COLOUR_DARK_GREEN),
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BH_INFO), SetFill(1, 1), SetMinimalTextLines(10, 0),
}
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition window_gui.h:96
constexpr NWidgetPart NWidgetFunction(NWidgetFunctionType *func_ptr)
Obtain a nested widget (sub)tree from an external source.
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
Widget part function for setting additional space around a widget.
constexpr NWidgetPart SetDataTip(uint32_t data, StringID tip)
Widget part function for setting the data and tooltip.
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size=FS_NORMAL)
Widget part function for setting the minimal text lines.
std::unique_ptr< NWidgetBase > MakePickerClassWidgets()
Create nested widgets for the class picker widgets.
std::unique_ptr< NWidgetBase > MakePickerTypeWidgets()
Create nested widgets for the type picker widgets.
@ WID_BH_INFO
Information panel of selected house.
Definition town_widget.h:74
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:75
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:50
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition widget_type.h:66
@ WWT_SHADEBOX
Shade box (at top-right of a window, between WWT_DEBUGBOX and WWT_DEFSIZEBOX)
Definition widget_type.h:64
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:61
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:77
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:69
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:48
@ WWT_DEFSIZEBOX
Default window size box (at top-right of a window, between WWT_SHADEBOX and WWT_STICKYBOX)
Definition widget_type.h:65

Nested widget definition for the build NewGRF rail waypoint window.

Definition at line 1758 of file town_gui.cpp.

◆ _nested_found_town_widgets

constexpr NWidgetPart _nested_found_town_widgets[]
staticconstexpr

Definition at line 1103 of file town_gui.cpp.

◆ _nested_town_authority_widgets

constexpr NWidgetPart _nested_town_authority_widgets[]
staticconstexpr
Initial value:
= {
NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
NWidget(WWT_CAPTION, COLOUR_BROWN, WID_TA_CAPTION), SetDataTip(STR_LOCAL_AUTHORITY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_TA_ZONE_BUTTON), SetMinimalSize(50, 0), SetDataTip(STR_LOCAL_AUTHORITY_ZONE, STR_LOCAL_AUTHORITY_ZONE_TOOLTIP),
NWidget(WWT_SHADEBOX, COLOUR_BROWN),
NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN),
NWidget(WWT_STICKYBOX, COLOUR_BROWN),
NWidget(WWT_PANEL, COLOUR_BROWN, WID_TA_COMMAND_LIST), SetMinimalSize(317, 52), SetResize(1, 0), SetDataTip(0x0, STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP), EndContainer(),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_TA_EXECUTE), SetMinimalSize(317, 12), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_LOCAL_AUTHORITY_DO_IT_BUTTON, STR_LOCAL_AUTHORITY_DO_IT_TOOLTIP),
NWidget(WWT_RESIZEBOX, COLOUR_BROWN),
}
constexpr NWidgetPart SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
constexpr NWidgetPart SetResize(int16_t dx, int16_t dy)
Widget part function for setting the resize step.
@ WID_TA_EXECUTE
Do-it button.
Definition town_widget.h:32
@ WID_TA_ACTION_INFO
Additional information about the action.
Definition town_widget.h:31
@ WID_TA_RATING_INFO
Overview with ratings for each company.
Definition town_widget.h:28
@ WID_TA_CAPTION
Caption of window.
Definition town_widget.h:26
@ WID_TA_ZONE_BUTTON
Turn on/off showing local authority zone.
Definition town_widget.h:27
@ WID_TA_COMMAND_LIST
List of commands for the player.
Definition town_widget.h:29
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:55
@ WWT_RESIZEBOX
Resize box (normally at bottom-right of a window)
Definition widget_type.h:68

Definition at line 61 of file town_gui.cpp.

◆ _nested_town_directory_widgets

constexpr NWidgetPart _nested_town_directory_widgets[]
staticconstexpr
Initial value:
= {
NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
NWidget(WWT_CAPTION, COLOUR_BROWN, WID_TD_CAPTION), SetDataTip(STR_TOWN_DIRECTORY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_SHADEBOX, COLOUR_BROWN),
NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN),
NWidget(WWT_STICKYBOX, COLOUR_BROWN),
NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_TD_SORT_ORDER), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER),
NWidget(WWT_DROPDOWN, COLOUR_BROWN, WID_TD_SORT_CRITERIA), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
NWidget(WWT_EDITBOX, COLOUR_BROWN, WID_TD_FILTER), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP),
NWidget(WWT_PANEL, COLOUR_BROWN, WID_TD_LIST), SetDataTip(0x0, STR_TOWN_DIRECTORY_LIST_TOOLTIP),
NWidget(WWT_PANEL, COLOUR_BROWN),
NWidget(WWT_TEXT, COLOUR_BROWN, WID_TD_WORLD_POPULATION), SetPadding(2, 0, 2, 2), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TOWN_POPULATION, STR_NULL),
NWidget(WWT_RESIZEBOX, COLOUR_BROWN),
}
constexpr NWidgetPart SetScrollbar(WidgetID index)
Attach a scrollbar to a widget.
@ WID_TD_LIST
List of towns.
Definition town_widget.h:19
@ WID_TD_CAPTION
Caption of the window.
Definition town_widget.h:15
@ WID_TD_FILTER
Filter of name.
Definition town_widget.h:18
@ WID_TD_SORT_ORDER
Direction of sort dropdown.
Definition town_widget.h:16
@ WID_TD_WORLD_POPULATION
The world's population.
Definition town_widget.h:21
@ WID_TD_SCROLLBAR
Scrollbar for the town list.
Definition town_widget.h:20
@ WID_TD_SORT_CRITERIA
Criteria of sort dropdown.
Definition town_widget.h:17
@ WWT_EDITBOX
a textbox for typing
Definition widget_type.h:71
@ NWID_VSCROLLBAR
Vertical scrollbar.
Definition widget_type.h:85
@ WWT_DROPDOWN
Drop down list.
Definition widget_type.h:70
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:58

Definition at line 698 of file town_gui.cpp.

◆ _nested_town_editor_view_widgets

constexpr NWidgetPart _nested_town_editor_view_widgets[]
staticconstexpr
Initial value:
= {
NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
NWidget(WWT_PUSHIMGBTN, COLOUR_BROWN, WID_TV_CHANGE_NAME), SetAspect(WidgetDimensions::ASPECT_RENAME), SetDataTip(SPR_RENAME, STR_TOWN_VIEW_RENAME_TOOLTIP),
NWidget(WWT_CAPTION, COLOUR_BROWN, WID_TV_CAPTION), SetDataTip(STR_TOWN_VIEW_TOWN_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_PUSHIMGBTN, COLOUR_BROWN, WID_TV_CENTER_VIEW), SetAspect(WidgetDimensions::ASPECT_LOCATION), SetDataTip(SPR_GOTO_LOCATION, STR_TOWN_VIEW_CENTER_TOOLTIP),
NWidget(WWT_SHADEBOX, COLOUR_BROWN),
NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN),
NWidget(WWT_STICKYBOX, COLOUR_BROWN),
NWidget(WWT_PANEL, COLOUR_BROWN),
NWidget(WWT_INSET, COLOUR_BROWN), SetPadding(2, 2, 2, 2),
NWidget(NWID_VIEWPORT, INVALID_COLOUR, WID_TV_VIEWPORT), SetMinimalSize(254, 86), SetFill(1, 1), SetResize(1, 1),
NWidget(WWT_PANEL, COLOUR_BROWN, WID_TV_INFO), SetMinimalSize(260, 32), SetResize(1, 0), SetFill(1, 0), EndContainer(),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_TV_EXPAND), SetMinimalSize(80, 12), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TOWN_VIEW_EXPAND_BUTTON, STR_TOWN_VIEW_EXPAND_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_TV_DELETE), SetMinimalSize(80, 12), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TOWN_VIEW_DELETE_BUTTON, STR_TOWN_VIEW_DELETE_TOOLTIP),
NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_TV_CATCHMENT), SetMinimalSize(40, 12), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_BUTTON_CATCHMENT, STR_TOOLTIP_CATCHMENT),
NWidget(WWT_RESIZEBOX, COLOUR_BROWN),
}
constexpr NWidgetPart SetAspect(float ratio, AspectFlags flags=AspectFlags::ResizeX)
Widget part function for setting the aspect ratio.
@ WID_TV_VIEWPORT
View of the center of the town.
Definition town_widget.h:38
@ WID_TV_INFO
General information about the town.
Definition town_widget.h:39
@ WID_TV_EXPAND
Expand this town (scenario editor only).
Definition town_widget.h:44
@ WID_TV_CATCHMENT
Toggle catchment area highlight.
Definition town_widget.h:43
@ WID_TV_CHANGE_NAME
Change the name of this town.
Definition town_widget.h:42
@ WID_TV_CENTER_VIEW
Center the main view on this town.
Definition town_widget.h:40
@ WID_TV_DELETE
Delete this town (scenario editor only).
Definition town_widget.h:45
@ WID_TV_CAPTION
Caption of window.
Definition town_widget.h:37
@ NC_EQUALSIZE
Value of the NCB_EQUALSIZE flag.
@ WWT_INSET
Pressed (inset) panel, most commonly used as combo box text area.
Definition widget_type.h:51
@ WWT_PUSHIMGBTN
Normal push-button (no toggle button) with image caption.
@ NWID_VIEWPORT
Nested widget containing a viewport.
Definition widget_type.h:82

Definition at line 658 of file town_gui.cpp.

◆ _nested_town_game_view_widgets

constexpr NWidgetPart _nested_town_game_view_widgets[]
staticconstexpr
Initial value:
= {
NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
NWidget(WWT_PUSHIMGBTN, COLOUR_BROWN, WID_TV_CHANGE_NAME), SetAspect(WidgetDimensions::ASPECT_RENAME), SetDataTip(SPR_RENAME, STR_TOWN_VIEW_RENAME_TOOLTIP),
NWidget(WWT_CAPTION, COLOUR_BROWN, WID_TV_CAPTION), SetDataTip(STR_TOWN_VIEW_TOWN_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_PUSHIMGBTN, COLOUR_BROWN, WID_TV_CENTER_VIEW), SetAspect(WidgetDimensions::ASPECT_LOCATION), SetDataTip(SPR_GOTO_LOCATION, STR_TOWN_VIEW_CENTER_TOOLTIP),
NWidget(WWT_SHADEBOX, COLOUR_BROWN),
NWidget(WWT_DEFSIZEBOX, COLOUR_BROWN),
NWidget(WWT_STICKYBOX, COLOUR_BROWN),
NWidget(WWT_PANEL, COLOUR_BROWN),
NWidget(WWT_INSET, COLOUR_BROWN), SetPadding(2, 2, 2, 2),
NWidget(NWID_VIEWPORT, INVALID_COLOUR, WID_TV_VIEWPORT), SetMinimalSize(254, 86), SetFill(1, 0), SetResize(1, 1),
NWidget(WWT_PANEL, COLOUR_BROWN, WID_TV_INFO), SetMinimalSize(260, 32), SetResize(1, 0), SetFill(1, 0), EndContainer(),
NWidget(WWT_PUSHTXTBTN, COLOUR_BROWN, WID_TV_SHOW_AUTHORITY), SetMinimalSize(80, 12), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON, STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP),
NWidget(WWT_TEXTBTN, COLOUR_BROWN, WID_TV_CATCHMENT), SetMinimalSize(40, 12), SetFill(1, 1), SetResize(1, 0), SetDataTip(STR_BUTTON_CATCHMENT, STR_TOOLTIP_CATCHMENT),
NWidget(WWT_RESIZEBOX, COLOUR_BROWN),
}
@ WID_TV_SHOW_AUTHORITY
Show the town authority window.
Definition town_widget.h:41

Definition at line 628 of file town_gui.cpp.

◆ _town_local_authority_kdtree

TownKdtree _town_local_authority_kdtree {}

Definition at line 57 of file town_gui.cpp.