summaryrefslogtreecommitdiff
path: root/src/town_gui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/town_gui.cpp')
-rw-r--r--src/town_gui.cpp110
1 files changed, 91 insertions, 19 deletions
diff --git a/src/town_gui.cpp b/src/town_gui.cpp
index 69cc1240e..af0c334a0 100644
--- a/src/town_gui.cpp
+++ b/src/town_gui.cpp
@@ -22,6 +22,10 @@
#include "tilehighlight_func.h"
#include "sortlist_type.h"
#include "road_cmd.h"
+#include "landscape_type.h"
+#include "landscape.h"
+#include "cargotype.h"
+#include "tile_map.h"
#include "table/sprites.h"
#include "table/strings.h"
@@ -230,6 +234,10 @@ private:
};
public:
+ enum {
+ TVW_HEIGHT_NORMAL = 150,
+ };
+
TownViewWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
{
this->town = GetTown(this->window_number);
@@ -252,10 +260,7 @@ public:
this->widget[TVW_CHANGENAME].right = this->widget[TVW_STICKY].right;
}
- /* Space required for showing noise level information */
- if (_settings_game.economy.station_noise_level) {
- ResizeWindowForWidget(this, TVW_INFOPANEL, 0, 10);
- }
+ this->ResizeWindowAsNeeded();
this->FindWindowPlacementAndResize(desc);
}
@@ -268,17 +273,72 @@ public:
SetDParam(0, this->town->index);
this->DrawWidgets();
+ uint y = 107;
+
SetDParam(0, this->town->population);
SetDParam(1, this->town->num_houses);
- DrawString(2, 107, STR_2006_POPULATION, TC_FROMSTRING);
+ DrawString(2, y, STR_2006_POPULATION, TC_FROMSTRING);
SetDParam(0, this->town->act_pass);
SetDParam(1, this->town->max_pass);
- DrawString(2, 117, STR_200D_PASSENGERS_LAST_MONTH_MAX, TC_FROMSTRING);
+ DrawString(2, y += 10, STR_200D_PASSENGERS_LAST_MONTH_MAX, TC_FROMSTRING);
SetDParam(0, this->town->act_mail);
SetDParam(1, this->town->max_mail);
- DrawString(2, 127, STR_200E_MAIL_LAST_MONTH_MAX, TC_FROMSTRING);
+ DrawString(2, y += 10, STR_200E_MAIL_LAST_MONTH_MAX, TC_FROMSTRING);
+
+ uint cargo_needed_for_growth = 0;
+ switch (_settings_game.game_creation.landscape) {
+ case LT_ARCTIC:
+ if (TilePixelHeight(this->town->xy) >= LowestSnowLine()) cargo_needed_for_growth = 1;
+ break;
+
+ case LT_TROPIC:
+ if (GetTropicZone(this->town->xy) == TROPICZONE_DESERT) cargo_needed_for_growth = 2;
+ break;
+
+ default: break;
+ }
+
+ if (cargo_needed_for_growth > 0) {
+ DrawString(2, y += 10, STR_CARGO_FOR_TOWNGROWTH, TC_FROMSTRING);
+
+ CargoID first_food_cargo = CT_INVALID;
+ StringID food_name = STR_001E_FOOD;
+ CargoID first_water_cargo = CT_INVALID;
+ StringID water_name = STR_0021_WATER;
+ for (CargoID cid = 0; cid < NUM_CARGO; cid++) {
+ const CargoSpec *cs = GetCargo(cid);
+ if (first_food_cargo == CT_INVALID && cs->town_effect == TE_FOOD) {
+ first_food_cargo = cid;
+ food_name = cs->name;
+ }
+ if (first_water_cargo == CT_INVALID && cs->town_effect == TE_WATER) {
+ first_water_cargo = cid;
+ water_name = cs->name;
+ }
+ }
+
+ if (first_food_cargo != CT_INVALID && this->town->act_food > 0) {
+ SetDParam(0, first_food_cargo);
+ SetDParam(1, this->town->act_food);
+ DrawString(2, y += 10, STR_CARGO_FOR_TOWNGROWTH_LAST_MONTH, TC_FROMSTRING);
+ } else {
+ SetDParam(0, food_name);
+ DrawString(2, y += 10, STR_CARGO_FOR_TOWNGROWTH_REQUIRED, TC_FROMSTRING);
+ }
+
+ if (cargo_needed_for_growth > 1) {
+ if (first_water_cargo != CT_INVALID && this->town->act_water > 0) {
+ SetDParam(0, first_water_cargo);
+ SetDParam(1, this->town->act_water);
+ DrawString(2, y += 10, STR_CARGO_FOR_TOWNGROWTH_LAST_MONTH, TC_FROMSTRING);
+ } else {
+ SetDParam(0, water_name);
+ DrawString(2, y += 10, STR_CARGO_FOR_TOWNGROWTH_REQUIRED, TC_FROMSTRING);
+ }
+ }
+ }
this->DrawViewport();
@@ -286,7 +346,7 @@ public:
if (_settings_game.economy.station_noise_level) {
SetDParam(0, this->town->noise_reached);
SetDParam(1, this->town->MaxTownNoise());
- DrawString(2, 137, STR_NOISE_IN_TOWN, TC_FROMSTRING);
+ DrawString(2, y += 10, STR_NOISE_IN_TOWN, TC_FROMSTRING);
}
}
@@ -320,20 +380,32 @@ public:
}
}
+ void ResizeWindowAsNeeded()
+ {
+ int aimed_height = TVW_HEIGHT_NORMAL;
+
+ switch (_settings_game.game_creation.landscape) {
+ case LT_ARCTIC:
+ if (TilePixelHeight(this->town->xy) >= LowestSnowLine()) aimed_height += 20;
+ break;
+
+ case LT_TROPIC:
+ if (GetTropicZone(this->town->xy) == TROPICZONE_DESERT) aimed_height += 30;
+ break;
+
+ default: break;
+ }
+
+ if (_settings_game.economy.station_noise_level) aimed_height += 10;
+
+ if (this->height != aimed_height) ResizeWindowForWidget(this, TVW_INFOPANEL, 0, aimed_height - this->height);
+ }
+
virtual void OnInvalidateData(int data = 0)
{
/* Called when setting station noise have changed, in order to resize the window */
this->SetDirty(); // refresh display for current size. This will allow to avoid glitches when downgrading
-
- if (_settings_game.economy.station_noise_level) { // adjust depending
- if (this->height == 150) { // window is smaller, needs to be bigger
- ResizeWindowForWidget(this, TVW_INFOPANEL, 0, 10);
- }
- } else {
- if (this->height != 150) { // window is bigger, needs to be smaller
- ResizeWindowForWidget(this, TVW_INFOPANEL, 0, -10);
- }
- }
+ this->ResizeWindowAsNeeded();
}
virtual void OnQueryTextFinished(char *str)
@@ -361,7 +433,7 @@ static const Widget _town_view_widgets[] = {
};
static const WindowDesc _town_view_desc = {
- WDP_AUTO, WDP_AUTO, 260, 150, 260, 150,
+ WDP_AUTO, WDP_AUTO, 260, TownViewWindow::TVW_HEIGHT_NORMAL, 260, TownViewWindow::TVW_HEIGHT_NORMAL,
WC_TOWN_VIEW, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON,
_town_view_widgets,