(svn r17612) -Feature: possibility to choose (randomise or enter custom) town name before its creation (original patch by Terkhen)
This commit is contained in:
@@ -34,6 +34,11 @@
|
||||
#include "landscape.h"
|
||||
#include "cargotype.h"
|
||||
#include "tile_map.h"
|
||||
#include "querystring_gui.h"
|
||||
#include "window_func.h"
|
||||
#include "string_func.h"
|
||||
#include "townname_func.h"
|
||||
#include "townname_type.h"
|
||||
|
||||
#include "table/sprites.h"
|
||||
#include "table/strings.h"
|
||||
@@ -850,11 +855,7 @@ void CcFoundTown(bool success, TileIndex tile, uint32 p1, uint32 p2)
|
||||
|
||||
void CcFoundRandomTown(bool success, TileIndex tile, uint32 p1, uint32 p2)
|
||||
{
|
||||
if (success) {
|
||||
tile = Town::Get(_new_town_id)->xy;
|
||||
SndPlayTileFx(SND_1F_SPLAT, tile);
|
||||
ScrollMainWindowToTile(tile);
|
||||
}
|
||||
if (success) ScrollMainWindowToTile(Town::Get(_new_town_id)->xy);
|
||||
}
|
||||
|
||||
/** Widget numbers of town scenario editor window. */
|
||||
@@ -866,6 +867,9 @@ enum TownScenarioEditorWidgets {
|
||||
TSEW_NEWTOWN,
|
||||
TSEW_RANDOMTOWN,
|
||||
TSEW_MANYRANDOMTOWNS,
|
||||
TSEW_TOWNNAME_TEXT,
|
||||
TSEW_TOWNNAME_EDITBOX,
|
||||
TSEW_TOWNNAME_RANDOM,
|
||||
TSEW_TOWNSIZE,
|
||||
TSEW_SIZE_SMALL,
|
||||
TSEW_SIZE_MEDIUM,
|
||||
@@ -895,6 +899,14 @@ static const NWidgetPart _nested_found_town_widgets[] = {
|
||||
SetDataTip(STR_FOUND_TOWN_RANDOM_TOWN_BUTTON, STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP), SetPadding(0, 2, 1, 2),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, TSEW_MANYRANDOMTOWNS), SetMinimalSize(156, 12), SetFill(true, false),
|
||||
SetDataTip(STR_FOUND_TOWN_MANY_RANDOM_TOWNS, STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP), SetPadding(0, 2, 0, 2),
|
||||
/* Town name selection. */
|
||||
NWidget(NWID_VERTICAL),
|
||||
NWidget(WWT_LABEL, COLOUR_DARK_GREEN, TSEW_TOWNSIZE), SetMinimalSize(156, 14), SetDataTip(STR_FOUND_TOWN_NAME_TITLE, STR_NULL),
|
||||
NWidget(WWT_EDITBOX, COLOUR_WHITE, TSEW_TOWNNAME_EDITBOX), SetMinimalSize(156, 12), SetDataTip(STR_FOUND_TOWN_NAME_EDITOR_TITLE, STR_FOUND_TOWN_NAME_EDITOR_HELP),
|
||||
NWidget(NWID_SPACER), SetMinimalSize(0, 3),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, TSEW_TOWNNAME_RANDOM), SetMinimalSize(78, 12), SetFill(true, false),
|
||||
SetDataTip(STR_FOUND_TOWN_NAME_RANDOM_BUTTON, STR_FOUND_TOWN_NAME_RANDOM_TOOLTIP),
|
||||
EndContainer(),
|
||||
/* Town size selection. */
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(NWID_SPACER), SetFill(true, false),
|
||||
@@ -940,23 +952,41 @@ static const NWidgetPart _nested_found_town_widgets[] = {
|
||||
};
|
||||
|
||||
/** Found a town window class. */
|
||||
struct FoundTownWindow : Window {
|
||||
struct FoundTownWindow : QueryStringBaseWindow {
|
||||
private:
|
||||
TownSize town_size; ///< Selected town size
|
||||
TownLayout town_layout; ///< Selected town layout
|
||||
bool city; ///< Are we building a city?
|
||||
bool townnamevalid; ///< Is generated town name valid?
|
||||
uint32 townnameparts; ///< Generated town name
|
||||
TownNameParams params; ///< Town name parameters
|
||||
|
||||
public:
|
||||
FoundTownWindow(const WindowDesc *desc, WindowNumber window_number) :
|
||||
Window(),
|
||||
QueryStringBaseWindow(MAX_LENGTH_TOWN_NAME_BYTES),
|
||||
town_size(TS_MEDIUM),
|
||||
town_layout(_settings_game.economy.town_layout),
|
||||
city(false)
|
||||
params(_settings_game.game_creation.town_name)
|
||||
{
|
||||
this->InitNested(desc, window_number);
|
||||
this->RandomTownName();
|
||||
this->UpdateButtons();
|
||||
}
|
||||
|
||||
void RandomTownName()
|
||||
{
|
||||
this->townnamevalid = GenerateTownName(&this->townnameparts);
|
||||
|
||||
if (!this->townnamevalid) {
|
||||
this->edit_str_buf[0] = '\0';
|
||||
} else {
|
||||
GetTownName(this->edit_str_buf, &this->params, this->townnameparts, &this->edit_str_buf[this->edit_str_size - 1]);
|
||||
}
|
||||
InitializeTextBuffer(&this->text, this->edit_str_buf, this->edit_str_size, MAX_LENGTH_TOWN_NAME_PIXELS);
|
||||
|
||||
this->SetFocusedWidget(TSEW_TOWNNAME_EDITBOX);
|
||||
}
|
||||
|
||||
void UpdateButtons()
|
||||
{
|
||||
for (int i = TSEW_SIZE_SMALL; i <= TSEW_SIZE_RANDOM; i++) {
|
||||
@@ -974,19 +1004,27 @@ public:
|
||||
|
||||
void ExecuteFoundTownCommand(TileIndex tile, bool random, StringID errstr, CommandCallback cc)
|
||||
{
|
||||
uint32 townnameparts;
|
||||
if (!GenerateTownName(&townnameparts)) {
|
||||
ShowErrorMessage(STR_ERROR_TOO_MANY_TOWNS, errstr, 0, 0);
|
||||
return;
|
||||
const char *name = NULL;
|
||||
|
||||
if (!this->townnamevalid) {
|
||||
name = this->edit_str_buf;
|
||||
} else {
|
||||
/* If user changed the name, send it */
|
||||
char buf[MAX_LENGTH_TOWN_NAME_BYTES];
|
||||
GetTownName(buf, &this->params, this->townnameparts, lastof(buf));
|
||||
if (strcmp(buf, this->edit_str_buf) != 0) name = this->edit_str_buf;
|
||||
}
|
||||
|
||||
DoCommandP(tile, this->town_size | this->city << 2 | this->town_layout << 3 | random << 6,
|
||||
townnameparts, CMD_FOUND_TOWN | CMD_MSG(errstr), cc);
|
||||
bool success = DoCommandP(tile, this->town_size | this->city << 2 | this->town_layout << 3 | random << 6,
|
||||
townnameparts, CMD_FOUND_TOWN | CMD_MSG(errstr), cc, name);
|
||||
|
||||
if (success) this->RandomTownName();
|
||||
}
|
||||
|
||||
virtual void OnPaint()
|
||||
{
|
||||
this->DrawWidgets();
|
||||
this->DrawEditBox(TSEW_TOWNNAME_EDITBOX);
|
||||
}
|
||||
|
||||
virtual void OnClick(Point pt, int widget)
|
||||
@@ -1001,6 +1039,10 @@ public:
|
||||
this->ExecuteFoundTownCommand(0, true, STR_ERROR_CAN_T_GENERATE_TOWN, CcFoundRandomTown);
|
||||
break;
|
||||
|
||||
case TSEW_TOWNNAME_RANDOM:
|
||||
this->RandomTownName();
|
||||
break;
|
||||
|
||||
case TSEW_MANYRANDOMTOWNS:
|
||||
this->HandleButtonClick(TSEW_MANYRANDOMTOWNS);
|
||||
|
||||
@@ -1039,6 +1081,18 @@ public:
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
virtual void OnMouseLoop()
|
||||
{
|
||||
this->HandleEditBox(TSEW_TOWNNAME_EDITBOX);
|
||||
}
|
||||
|
||||
virtual EventState OnKeyPress(uint16 key, uint16 keycode)
|
||||
{
|
||||
EventState state;
|
||||
this->HandleEditBoxKey(TSEW_TOWNNAME_EDITBOX, key, keycode, state);
|
||||
return state;
|
||||
}
|
||||
|
||||
virtual void OnPlaceObject(Point pt, TileIndex tile)
|
||||
{
|
||||
this->ExecuteFoundTownCommand(tile, false, STR_ERROR_CAN_T_FOUND_TOWN_HERE, CcFoundTown);
|
||||
|
Reference in New Issue
Block a user