(svn r17612) -Feature: possibility to choose (randomise or enter custom) town name before its creation (original patch by Terkhen)

This commit is contained in:
smatz
2009-09-22 13:54:54 +00:00
parent 665864e5b0
commit 1da745c9ad
12 changed files with 281 additions and 132 deletions

View File

@@ -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);