diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp
index 2affb67c59..0b7d9e897a 100644
--- a/src/gfxinit.cpp
+++ b/src/gfxinit.cpp
@@ -193,7 +193,7 @@ static void LoadSpriteTables()
);
}
- LoadGrfFile("innerhighlight.grf", SPR_INNER_HIGHLIGHT_BASE, i++);
+ LoadGrfFile("innerhighlight.grf", SPR_ZONING_INNER_HIGHLIGHT_BASE, i++);
/* Initialize the unicode to sprite mapping table */
InitializeUnicodeGlyphMap();
diff --git a/src/lang/english.txt b/src/lang/english.txt
index 58f66c03af..f0f4d5823f 100644
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -4982,7 +4982,5 @@ STR_ZONING_NO_ZONING :Nothing
STR_ZONING_AUTHORITY :Authority
STR_ZONING_CAN_BUILD :Where I can't build
STR_ZONING_STA_CATCH :Station catchment
-STR_ZONING_IND_CATCH :Industry catchment
-STR_ZONING_BUL_CATCH :City catchment
STR_ZONING_BUL_UNSER :Unserved buildings
STR_ZONING_IND_UNSER :Unserved industries
diff --git a/src/table/sprites.h b/src/table/sprites.h
index 0c6e4e71f1..c2b14e33ec 100644
--- a/src/table/sprites.h
+++ b/src/table/sprites.h
@@ -296,8 +296,18 @@ static const uint16 EMPTY_BOUNDING_BOX_SPRITE_COUNT = 1;
static const SpriteID SPR_PALETTE_BASE = SPR_EMPTY_BOUNDING_BOX + EMPTY_BOUNDING_BOX_SPRITE_COUNT;
static const uint16 PALETTE_SPRITE_COUNT = 1;
+/* Zoning sprites */
+static const SpriteID SPR_ZONING_INNER_HIGHLIGHT_BASE = SPR_PALETTE_BASE + PALETTE_SPRITE_COUNT;
+static const uint16 ZONING_INNER_HIGHLIGHT_SPRITE_COUNT = 32;
+static const SpriteID SPR_ZONING_INNER_HIGHLIGHT_RED = SPR_ZONING_INNER_HIGHLIGHT_BASE + 19;
+static const SpriteID SPR_ZONING_INNER_HIGHLIGHT_GREEN = SPR_ZONING_INNER_HIGHLIGHT_BASE + 20;
+static const SpriteID SPR_ZONING_INNER_HIGHLIGHT_BLACK = SPR_ZONING_INNER_HIGHLIGHT_BASE + 21;
+static const SpriteID SPR_ZONING_INNER_HIGHLIGHT_LIGHT_BLUE = SPR_ZONING_INNER_HIGHLIGHT_BASE + 22;
+static const SpriteID SPR_ZONING_INNER_HIGHLIGHT_ORANGE = SPR_ZONING_INNER_HIGHLIGHT_BASE + 23;
+static const SpriteID SPR_ZONING_INNER_HIGHLIGHT_WHITE = SPR_ZONING_INNER_HIGHLIGHT_BASE + 24;
+
/* From where can we start putting NewGRFs? */
-static const SpriteID SPR_NEWGRFS_BASE = SPR_PALETTE_BASE + PALETTE_SPRITE_COUNT;
+static const SpriteID SPR_NEWGRFS_BASE = SPR_ZONING_INNER_HIGHLIGHT_BASE + ZONING_INNER_HIGHLIGHT_SPRITE_COUNT;
/* Manager face sprites */
static const SpriteID SPR_GRADIENT = 874; // background gradient behind manager face
@@ -1342,16 +1352,6 @@ static const SpriteID SPR_SELECT_SUB_TROPICAL_PUSHED = 4887;
static const SpriteID SPR_SELECT_TOYLAND = 4888;
static const SpriteID SPR_SELECT_TOYLAND_PUSHED = 4889;
-/* zoning stuff; dunno where else to put it */
-
-static const SpriteID SPR_INNER_HIGHLIGHT_BASE = 11000;
-static const SpriteID SPR_PALETTE_ZONING_RED = SPR_INNER_HIGHLIGHT_BASE + 19;
-static const SpriteID SPR_PALETTE_ZONING_GREEN = SPR_INNER_HIGHLIGHT_BASE + 20;
-static const SpriteID SPR_PALETTE_ZONING_BLACK = SPR_INNER_HIGHLIGHT_BASE + 21;
-static const SpriteID SPR_PALETTE_ZONING_LIGHT_BLUE = SPR_INNER_HIGHLIGHT_BASE + 22;
-static const SpriteID SPR_PALETTE_ZONING_ORANGE = SPR_INNER_HIGHLIGHT_BASE + 23;
-static const SpriteID SPR_PALETTE_ZONING_WHITE = SPR_INNER_HIGHLIGHT_BASE + 24;
-
/** Cursor sprite numbers */
/* Terraform
@@ -1584,6 +1584,4 @@ static const PaletteID PALETTE_CHURCH_CREAM = 1439; ///< Recolour sprite
static const PaletteID PALETTE_ALL_BLACK = SPR_PALETTE_BASE; ///< Exchange any color by black, needed for painting fictive tiles outside map
-static const SpriteID INVALID_SPRITE_ID = UINT_MAX;
-
#endif /* SPRITES_H */
diff --git a/src/zoning.h b/src/zoning.h
index 01842a91e2..bfea293342 100644
--- a/src/zoning.h
+++ b/src/zoning.h
@@ -1,39 +1,48 @@
+/* $Id$ */
+
+/*
+ * This file is part of OpenTTD.
+ * 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.
+ * 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.
+ * 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 .
+ */
+
/** @file zoning.h */
-#ifndef ZONING_H_
-#define ZONING_H_
+#ifndef ZONING_H
+#define ZONING_H
-#include "openttd.h"
#include "tile_cmd.h"
+#include "company_type.h"
-enum EvaluationMode {
- CHECKNOTHING = 0,
- CHECKOPINION = 1, ///< Check the local authority's opinion.
- CHECKBUILD = 2, ///< Check wither or not the player can build.
- CHECKSTACATCH = 3, ///< Check catchment area for stations
- CHECKINDCATCH = 4, ///< Check catchment area for industries
- CHECKBULCATCH = 5, ///< Check catchment area for buildings
- CHECKBULUNSER = 6, ///< Check for unserved buildings
- CHECKINDUNSER = 7, ///< Check for unserved industries
+/**
+ * Zoning evaluation modes
+ */
+enum ZoningEvaluationMode {
+ ZEM_NOTHING = 0, ///< No zoning action selected
+ ZEM_AUTHORITY, ///< Check the local authority's opinion.
+ ZEM_CAN_BUILD, ///< Check wither or not the player can build.
+ ZEM_STA_CATCH, ///< Check catchment area for stations
+ ZEM_BUL_UNSER, ///< Check for unserved buildings
+ ZEM_IND_UNSER, ///< Check for unserved industries
};
+/**
+ * Global Zoning state structure
+ */
struct Zoning {
- EvaluationMode inner;
- EvaluationMode outer;
- int inner_val;
- int outer_val;
+ ZoningEvaluationMode inner;
+ ZoningEvaluationMode outer;
};
-VARDEF Zoning _zoning;
+extern Zoning _zoning;
-SpriteID TileZoningSpriteEvaluation(TileIndex tile, Owner owner, EvaluationMode ev_mode);
+SpriteID TileZoningSpriteEvaluation(TileIndex tile, Owner owner, ZoningEvaluationMode ev_mode);
-int TileZoningEvaluation(TileIndex tile, Owner owner, EvaluationMode ev_mode);
+int TileZoningEvaluation(TileIndex tile, Owner owner, ZoningEvaluationMode ev_mode);
void DrawTileZoning(const TileInfo *ti);
void ShowZoningToolbar();
-EvaluationMode GetEvaluationModeFromInt(int ev_mode);
-
-#endif /*ZONING_H_*/
+#endif /* ZONING_H */
diff --git a/src/zoning_cmd.cpp b/src/zoning_cmd.cpp
index 671d8c6dc6..9edcba8dd8 100644
--- a/src/zoning_cmd.cpp
+++ b/src/zoning_cmd.cpp
@@ -1,3 +1,11 @@
+/* $Id$ */
+
+/*
+ * This file is part of OpenTTD.
+ * 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.
+ * 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.
+ * 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 .
+ */
/** @file zoning_cmd.cpp */
@@ -8,7 +16,6 @@
#include "industry.h"
#include "gfx_func.h"
#include "viewport_func.h"
-#include "variables.h"
#include "map_func.h"
#include "company_func.h"
#include "town_map.h"
@@ -19,6 +26,7 @@
#include "zoning.h"
Zoning _zoning;
+static const SpriteID ZONING_INVALID_SPRITE_ID = UINT_MAX;
/**
* Draw the zoning sprites.
@@ -30,9 +38,11 @@ Zoning _zoning;
* @param TileInfo ti
* the tile
*/
-void DrawZoningSprites(SpriteID image, SpriteID colour, const TileInfo *ti) {
- if ( colour!=INVALID_SPRITE_ID )
- AddSortableSpriteToDraw(image + _tileh_to_sprite[ti->tileh], colour, ti->x, ti->y, 0x10, 0x10, 1, ti->z + 7);
+void DrawZoningSprites(SpriteID image, SpriteID colour, const TileInfo *ti)
+{
+ if (colour != ZONING_INVALID_SPRITE_ID) {
+ AddSortableSpriteToDraw(image + ti->tileh, colour, ti->x, ti->y, 0x10, 0x10, 1, ti->z + 7);
+ }
}
/**
@@ -44,22 +54,22 @@ void DrawZoningSprites(SpriteID image, SpriteID colour, const TileInfo *ti) {
* the owner of the stations which we need to match again
* @return true if a station is found
*/
-bool IsAreaWithinAcceptanceZoneOfStation(TileArea area, Owner owner) {
-
+bool IsAreaWithinAcceptanceZoneOfStation(TileArea area, Owner owner)
+{
// TODO: Actually do owner check.
-
+
int catchment = _settings_game.station.station_spread + (_settings_game.station.modified_catchment ? MAX_CATCHMENT : CA_UNMODIFIED);
-
- StationFinder morestations(TileArea(TileXY(TileX(area.tile)-catchment/2, TileY(area.tile)-catchment/2),
- TileX(area.tile) + area.w + catchment, TileY(area.tile) + area.h + catchment));
-
- for ( Station * const *st_iter = morestations.GetStations()->Begin(); st_iter != morestations.GetStations()->End(); ++st_iter ) {
+
+ StationFinder morestations(TileArea(TileXY(TileX(area.tile) - (catchment / 2), TileY(area.tile) - (catchment / 2)),
+ TileX(area.tile) + area.w + catchment, TileY(area.tile) + area.h + catchment));
+
+ for (Station * const *st_iter = morestations.GetStations()->Begin(); st_iter != morestations.GetStations()->End(); ++st_iter) {
Station *st = *st_iter;
Rect rect = st->GetCatchmentRect();
return TileArea(TileXY(rect.left, rect.top), TileXY(rect.right, rect.bottom)).Intersects(area);
}
-
- return false;
+
+ return false;
}
/**
@@ -71,24 +81,25 @@ bool IsAreaWithinAcceptanceZoneOfStation(TileArea area, Owner owner) {
* the owner of the stations
* @return true if a station is found
*/
-bool IsTileWithinAcceptanceZoneOfStation(TileIndex tile, Owner owner) {
-
+bool IsTileWithinAcceptanceZoneOfStation(TileIndex tile, Owner owner)
+{
// TODO: Actually do owner check.
-
+
int catchment = _settings_game.station.station_spread + (_settings_game.station.modified_catchment ? MAX_CATCHMENT : CA_UNMODIFIED);
-
- StationFinder morestations(TileArea(TileXY(TileX(tile)-catchment/2, TileY(tile)-catchment/2),
- catchment, catchment));
-
- for ( Station * const *st_iter = morestations.GetStations()->Begin(); st_iter != morestations.GetStations()->End(); ++st_iter ) {
+
+ StationFinder morestations(TileArea(TileXY(TileX(tile) - (catchment / 2), TileY(tile) - (catchment / 2)),
+ catchment, catchment));
+
+ for (Station * const *st_iter = morestations.GetStations()->Begin(); st_iter != morestations.GetStations()->End(); ++st_iter) {
Station *st = *st_iter;
Rect rect = st->GetCatchmentRect();
- if ( (uint)rect.left <= TileX(tile) && TileX(tile) <= (uint)rect.right
- && (uint)rect.top <= TileY(tile) && TileY(tile) <= (uint)rect.bottom )
+ if ((uint)rect.left <= TileX(tile) && TileX(tile) <= (uint)rect.right
+ && (uint)rect.top <= TileY(tile) && TileY(tile) <= (uint)rect.bottom) {
return true;
+ }
}
-
- return false;
+
+ return false;
}
/**
@@ -98,14 +109,17 @@ bool IsTileWithinAcceptanceZoneOfStation(TileIndex tile, Owner owner) {
* @param Owner owner
* @return red if they cannot
*/
-SpriteID TileZoneCheckBuildEvaluation(TileIndex tile, Owner owner) {
+SpriteID TileZoneCheckBuildEvaluation(TileIndex tile, Owner owner)
+{
/* Let's first check for the obvious things you cannot build on */
- switch ( GetTileType(tile) ) {
+ switch (GetTileType(tile)) {
case MP_INDUSTRY:
- case MP_UNMOVABLE:
+ case MP_OBJECT:
case MP_STATION:
case MP_HOUSE:
- case MP_TUNNELBRIDGE: return SPR_PALETTE_ZONING_RED;
+ case MP_TUNNELBRIDGE:
+ return SPR_ZONING_INNER_HIGHLIGHT_RED;
+
/* There are only two things you can own (or some else
* can own) that you can still build on. i.e. roads and
* railways.
@@ -117,15 +131,18 @@ SpriteID TileZoneCheckBuildEvaluation(TileIndex tile, Owner owner) {
* While that being said, it should also check if it
* is not possible to build railway/road on someone
* else's/your own road/railway (e.g. the railway track
- * is curved or a cross).*/
+ * is curved or a cross).
+ */
case MP_ROAD:
- case MP_RAILWAY: {
- if ( GetTileOwner(tile) != owner )
- return SPR_PALETTE_ZONING_RED;
- else
- return INVALID_SPRITE_ID;
- }
- default: return INVALID_SPRITE_ID;
+ case MP_RAILWAY:
+ if (GetTileOwner(tile) != owner) {
+ return SPR_ZONING_INNER_HIGHLIGHT_RED;
+ } else {
+ return ZONING_INVALID_SPRITE_ID;
+ }
+
+ default:
+ return ZONING_INVALID_SPRITE_ID;
}
}
@@ -134,96 +151,60 @@ SpriteID TileZoneCheckBuildEvaluation(TileIndex tile, Owner owner) {
*
* @param TileIndex tile
* @param Owner owner
- * @return black if no opinion, orange if bad,
+ * @return black if no opinion, orange if bad,
* light blue if good or invalid if no town
*/
-SpriteID TileZoneCheckOpinionEvaluation(TileIndex tile, Owner owner) {
+SpriteID TileZoneCheckOpinionEvaluation(TileIndex tile, Owner owner)
+{
int opinion = 0; // 0: no town, 1: no opinion, 2: bad, 3: good
Town *town = ClosestTownFromTile(tile, _settings_game.economy.dist_local_authority);
- if ( town !=NULL ) {
- if ( HasBit(town->have_ratings, owner) ) {
- opinion = ( town->ratings[owner] > 0 ) ? 3 : 2;
+ if (town != NULL) {
+ if (HasBit(town->have_ratings, owner)) {
+ opinion = (town->ratings[owner] > 0) ? 3 : 2;
} else {
opinion = 1;
}
}
- switch ( opinion ) {
- case 1: return SPR_PALETTE_ZONING_BLACK; // no opinion
- case 2: return SPR_PALETTE_ZONING_ORANGE; // bad
- case 3: return SPR_PALETTE_ZONING_LIGHT_BLUE; // good
- default: return INVALID_SPRITE_ID; // no town
+ switch (opinion) {
+ case 1: return SPR_ZONING_INNER_HIGHLIGHT_BLACK; // no opinion
+ case 2: return SPR_ZONING_INNER_HIGHLIGHT_ORANGE; // bad
+ case 3: return SPR_ZONING_INNER_HIGHLIGHT_LIGHT_BLUE; // good
+ default: return ZONING_INVALID_SPRITE_ID; // no town
}
}
-/**
- * Detect whether the tile is within the 'catchment' zone of an industry.
- *
- * @param TileIndex tile
- * @param Owner owner
- * @return The colour depends on the distance to the industry:
- * 1-3 White (lorry/bus)
- * 4 Blue (train station/some airports)
- * 5 Green (docks/some airports)
- * 6 Yellow (some airports)
- * 7-9 Light blue (international airport)
- */
-SpriteID TileZoneCheckIndustryCatchmentEvaluation(TileIndex tile, Owner owner) {
-
- // TODO: Implement this!
-
- return INVALID_SPRITE_ID;
-}
-
/**
* Detect whether the tile is within the catchment zone of a station.
*
* @param TileIndex tile
* @param Owner owner
- * @return black if within, light blue if only in acceptance zone
+ * @return black if within, light blue if only in acceptance zone
* and nothing if no nearby station.
*/
-SpriteID TileZoneCheckStationCatchmentEvaluation(TileIndex tile, Owner owner) {
-
- //TODO: Actually check owner.
+SpriteID TileZoneCheckStationCatchmentEvaluation(TileIndex tile, Owner owner)
+{
+ // TODO: Actually check owner.
// Never on a station.
- if ( IsTileType(tile, MP_STATION) )
- return INVALID_SPRITE_ID;
-
- // For provided goods
-
- StationFinder stations(TileArea(tile, 1, 1));
-
- if ( stations.GetStations()->Length() > 0 ) {
- return SPR_PALETTE_ZONING_BLACK;
+ if (IsTileType(tile, MP_STATION)) {
+ return ZONING_INVALID_SPRITE_ID;
}
-
- // For accepted goods
-
- if ( IsTileWithinAcceptanceZoneOfStation(tile, owner) )
- return SPR_PALETTE_ZONING_LIGHT_BLUE;
-
- return INVALID_SPRITE_ID;
-}
-/**
- * Detect whether a tile is within the 'catchment' zone of a building.
- *
- * @param TileIndex tile
- * @param Owner owner
- * @return The colour depends on the distance to the building:
- * 1-3 White (lorry/bus)
- * 4 Blue (train station/some airports)
- * 5 Green (docks/some airports)
- * 6 Yellow (some airports)
- * 7-9 Light blue (international airport)
- */
-SpriteID TileZoneCheckBuildingCatchmentEvaluation(TileIndex tile, Owner owner) {
- // TODO: Implement this!
-
- return INVALID_SPRITE_ID;
+ // For provided goods
+ StationFinder stations(TileArea(tile, 1, 1));
+
+ if (stations.GetStations()->Length() > 0) {
+ return SPR_ZONING_INNER_HIGHLIGHT_BLACK;
+ }
+
+ // For accepted goods
+ if (IsTileWithinAcceptanceZoneOfStation(tile, owner)) {
+ return SPR_ZONING_INNER_HIGHLIGHT_LIGHT_BLUE;
+ }
+
+ return ZONING_INVALID_SPRITE_ID;
}
/**
@@ -234,33 +215,42 @@ SpriteID TileZoneCheckBuildingCatchmentEvaluation(TileIndex tile, Owner owner) {
* @return red if unserved, orange if only accepting, nothing if served or not
* a building
*/
-SpriteID TileZoneCheckUnservedBuildingsEvaluation(TileIndex tile, Owner owner) {
+SpriteID TileZoneCheckUnservedBuildingsEvaluation(TileIndex tile, Owner owner)
+{
+ // TODO: Actually use owner.
- //TODO: Actually use owner.
-
- CargoArray dat;
-
- if ( IsTileType (tile, MP_HOUSE)
- && ( ( memset(&dat, 0, sizeof(dat)), AddAcceptedCargo(tile, dat, NULL), (dat[CT_MAIL] + dat[CT_PASSENGERS] > 0) )
- || ( memset(&dat, 0, sizeof(dat)), AddProducedCargo(tile, dat), (dat[CT_MAIL] + dat[CT_PASSENGERS] > 0) ) ) ) {
- StationFinder stations(TileArea(tile, 1, 1));
-
- if ( stations.GetStations()->Length() > 0 ) {
- return INVALID_SPRITE_ID;
- }
-
- // For accepted goods
-
- if ( IsTileWithinAcceptanceZoneOfStation(tile, owner) )
- return SPR_PALETTE_ZONING_ORANGE;
-
- //TODO: Check for stations that does not accept mail/passengers,
- //which is currently only truck stops.
-
- return SPR_PALETTE_ZONING_RED;
+ if (!IsTileType(tile, MP_HOUSE)) {
+ return ZONING_INVALID_SPRITE_ID;
}
-
- return INVALID_SPRITE_ID;
+
+ CargoArray dat;
+
+ memset(&dat, 0, sizeof(dat));
+ AddAcceptedCargo(tile, dat, NULL);
+ if (dat[CT_MAIL] + dat[CT_PASSENGERS] == 0) {
+ // nothing is accepted, so now test if cargo is produced
+ AddProducedCargo(tile, dat);
+ if (dat[CT_MAIL] + dat[CT_PASSENGERS] == 0) {
+ // total is still 0, so give up
+ return ZONING_INVALID_SPRITE_ID;
+ }
+ }
+
+ StationFinder stations(TileArea(tile, 1, 1));
+
+ if (stations.GetStations()->Length() > 0) {
+ return ZONING_INVALID_SPRITE_ID;
+ }
+
+ // For accepted goods
+ if (IsTileWithinAcceptanceZoneOfStation(tile, owner)) {
+ return SPR_ZONING_INNER_HIGHLIGHT_ORANGE;
+ }
+
+ // TODO: Check for stations that does not accept mail/passengers,
+ // which is currently only truck stops.
+
+ return SPR_ZONING_INNER_HIGHLIGHT_RED;
}
/**
@@ -271,30 +261,30 @@ SpriteID TileZoneCheckUnservedBuildingsEvaluation(TileIndex tile, Owner owner) {
* @return red if unserved, orange if only accepting, nothing if served or not
* a building
*/
-SpriteID TileZoneCheckUnservedIndustriesEvaluation(TileIndex tile, Owner owner) {
+SpriteID TileZoneCheckUnservedIndustriesEvaluation(TileIndex tile, Owner owner)
+{
+ // TODO: Actually use owner.
- //TODO: Actually use owner.
-
- if ( IsTileType(tile, MP_INDUSTRY) ) {
+ if (IsTileType(tile, MP_INDUSTRY)) {
Industry *ind = Industry::GetByTile(tile);
StationFinder stations(ind->location);
-
- if ( stations.GetStations()->Length() > 0 ) {
- return INVALID_SPRITE_ID;
+
+ if (stations.GetStations()->Length() > 0) {
+ return ZONING_INVALID_SPRITE_ID;
}
-
+
// For accepted goods
-
- if ( IsAreaWithinAcceptanceZoneOfStation(ind->location, owner) )
- return SPR_PALETTE_ZONING_ORANGE;
-
- //TODO: Check for stations that only accepts mail/passengers,
- //which is currently only bus stops.
-
- return SPR_PALETTE_ZONING_RED;
+ if (IsAreaWithinAcceptanceZoneOfStation(ind->location, owner)) {
+ return SPR_ZONING_INNER_HIGHLIGHT_ORANGE;
+ }
+
+ // TODO: Check for stations that only accepts mail/passengers,
+ // which is currently only bus stops.
+
+ return SPR_ZONING_INNER_HIGHLIGHT_RED;
}
-
- return INVALID_SPRITE_ID;
+
+ return ZONING_INVALID_SPRITE_ID;
}
/**
@@ -305,74 +295,39 @@ SpriteID TileZoneCheckUnservedIndustriesEvaluation(TileIndex tile, Owner owner)
* Tile to be evaluated.
* @param Owner owner
* The current player
- * @param EvaluationMode ev_mode
+ * @param ZoningEvaluationMode ev_mode
* The current evaluation mode.
* @return The colour returned by the evaluation functions (none if no ev_mode).
*/
-SpriteID TileZoningSpriteEvaluation(TileIndex tile, Owner owner, EvaluationMode ev_mode) {
- switch ( ev_mode ) {
- case CHECKBUILD: return TileZoneCheckBuildEvaluation(tile, owner);
- case CHECKOPINION: return TileZoneCheckOpinionEvaluation(tile, owner);
- case CHECKINDCATCH: return TileZoneCheckIndustryCatchmentEvaluation(tile, owner);
- case CHECKSTACATCH: return TileZoneCheckStationCatchmentEvaluation(tile, owner);
- case CHECKBULCATCH: return TileZoneCheckBuildingCatchmentEvaluation(tile, owner);
- case CHECKBULUNSER: return TileZoneCheckUnservedBuildingsEvaluation(tile, owner);
- case CHECKINDUNSER: return TileZoneCheckUnservedIndustriesEvaluation(tile, owner);
- default: return INVALID_SPRITE_ID;
+SpriteID TileZoningSpriteEvaluation(TileIndex tile, Owner owner, ZoningEvaluationMode ev_mode)
+{
+ switch (ev_mode) {
+ case ZEM_CAN_BUILD: return TileZoneCheckBuildEvaluation(tile, owner);
+ case ZEM_AUTHORITY: return TileZoneCheckOpinionEvaluation(tile, owner);
+ case ZEM_STA_CATCH: return TileZoneCheckStationCatchmentEvaluation(tile, owner);
+ case ZEM_BUL_UNSER: return TileZoneCheckUnservedBuildingsEvaluation(tile, owner);
+ case ZEM_IND_UNSER: return TileZoneCheckUnservedIndustriesEvaluation(tile, owner);
+ default: return ZONING_INVALID_SPRITE_ID;
}
}
-/**
- * Same as above, but not return an integer instead of sprite. However, it
- * has so far not yet seem a real purpose, so therefore has not been implemented.
- *
- * @param TileIndex tile
- * Tile to be evaluated.
- * @param Owner owner
- * The current player
- * @param EvaluationMode ev_mode
- * The current evaluation mode.
- * @return Probably an integer based on the evaluation mode.
- */
-int TileZoningEvaluation(TileIndex tile, Owner owner, EvaluationMode ev_mode) {
- return 0;
-}
-
/**
* Draw the the zoning on the tile.
*
* @param TileInfo ti
* the tile to draw on.
*/
-void DrawTileZoning(const TileInfo *ti) {
- if ( IsTileType(ti->tile, MP_VOID)
- || _game_mode != GM_NORMAL )
+void DrawTileZoning(const TileInfo *ti)
+{
+ if (IsTileType(ti->tile, MP_VOID) || _game_mode != GM_NORMAL) {
return;
-
- if ( _zoning.outer != CHECKNOTHING )
- DrawZoningSprites(SPR_SELECT_TILE, TileZoningSpriteEvaluation(ti->tile, _local_company, _zoning.outer), ti);
-
- if ( _zoning.inner != CHECKNOTHING )
- DrawZoningSprites(SPR_INNER_HIGHLIGHT_BASE, TileZoningSpriteEvaluation(ti->tile, _local_company, _zoning.inner), ti);
-}
+ }
-/**
- * Get the evaluation mode depending on an integer. Though, this may be better
- * implemented so the code does not need to be updated several places everything
- * a new type of evaluation is added.
- *
- * @param int ev_mode
- * @return EvaluationMode
- */
-EvaluationMode GetEvaluationModeFromInt(int ev_mode) {
- switch ( ev_mode ) {
- case 1: return CHECKOPINION;
- case 2: return CHECKBUILD;
- case 3: return CHECKSTACATCH;
- case 4: return CHECKINDCATCH;
- case 5: return CHECKBULCATCH;
- case 6: return CHECKBULUNSER;
- case 7: return CHECKINDUNSER;
- default: return CHECKNOTHING;
+ if (_zoning.outer != ZEM_NOTHING) {
+ DrawZoningSprites(SPR_SELECT_TILE, TileZoningSpriteEvaluation(ti->tile, _local_company, _zoning.outer), ti);
+ }
+
+ if (_zoning.inner != ZEM_NOTHING) {
+ DrawZoningSprites(SPR_ZONING_INNER_HIGHLIGHT_BASE, TileZoningSpriteEvaluation(ti->tile, _local_company, _zoning.inner), ti);
}
}
diff --git a/src/zoning_gui.cpp b/src/zoning_gui.cpp
index 42161d1036..74be21b8f6 100644
--- a/src/zoning_gui.cpp
+++ b/src/zoning_gui.cpp
@@ -1,3 +1,11 @@
+/* $Id$ */
+
+/*
+ * This file is part of OpenTTD.
+ * 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.
+ * 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.
+ * 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 .
+ */
/** @file zoning_gui.cpp */
@@ -5,12 +13,10 @@
#include "openttd.h"
#include "widgets/dropdown_func.h"
#include "widget_type.h"
-#include "functions.h"
#include "window_func.h"
#include "gui.h"
#include "viewport_func.h"
#include "sound_func.h"
-#include "variables.h"
#include "table/sprites.h"
#include "table/strings.h"
#include "strings_func.h"
@@ -21,66 +27,113 @@
enum ZoningToolbarWidgets {
ZTW_OUTER = 4,
- ZTW_OUTER_DROPDOWN,
+ ZTW_OUTER_DROPDOWN,
ZTW_INNER,
ZTW_INNER_DROPDOWN,
ZTW_CAPTION
};
-const StringID _zone_types[] = { STR_ZONING_NO_ZONING, STR_ZONING_AUTHORITY, STR_ZONING_CAN_BUILD, STR_ZONING_STA_CATCH, STR_ZONING_IND_CATCH, STR_ZONING_BUL_CATCH, STR_ZONING_BUL_UNSER, STR_ZONING_IND_UNSER, INVALID_STRING_ID };
+static const StringID _zone_type_strings[] = {
+ STR_ZONING_NO_ZONING,
+ STR_ZONING_AUTHORITY,
+ STR_ZONING_CAN_BUILD,
+ STR_ZONING_STA_CATCH,
+ STR_ZONING_BUL_UNSER,
+ STR_ZONING_IND_UNSER,
+ INVALID_STRING_ID
+};
+
+static const ZoningEvaluationMode _zone_type_modes[] = {
+ ZEM_NOTHING,
+ ZEM_AUTHORITY,
+ ZEM_CAN_BUILD,
+ ZEM_STA_CATCH,
+ ZEM_BUL_UNSER,
+ ZEM_IND_UNSER,
+};
+
+static ZoningEvaluationMode DropDownIndexToZoningEvaluationMode(int index)
+{
+ if (index < 0 || index >= (int) lengthof(_zone_type_modes)) {
+ return ZEM_NOTHING;
+ }
+ return _zone_type_modes[index];
+}
+
+static int ZoningEvaluationModeToDropDownIndex(ZoningEvaluationMode ev_mode)
+{
+ for (int i = 0; i < (int) lengthof(_zone_type_modes); i++) {
+ if (_zone_type_modes[i] == ev_mode) return i;
+ }
+ NOT_REACHED();
+}
struct ZoningWindow : public Window {
-
- ZoningWindow(const WindowDesc *desc, int window_number) : Window() {
- this->InitNested(desc, window_number);
- this->InvalidateData();
+
+ ZoningWindow(WindowDesc *desc, int window_number)
+ : Window(desc)
+ {
+ this->InitNested(window_number);
+ this->InvalidateData();
}
-
- virtual void OnPaint() {
+
+ virtual void OnPaint()
+ {
this->DrawWidgets();
}
-
- virtual void OnClick(Point pt, int widget, int click_count) {
- switch ( widget ) {
+
+ virtual void OnClick(Point pt, int widget, int click_count)
+ {
+ switch (widget) {
case ZTW_OUTER_DROPDOWN:
- ShowDropDownMenu(this, _zone_types, _zoning.outer_val, ZTW_OUTER_DROPDOWN, 0, 0);
+ ShowDropDownMenu(this, _zone_type_strings, ZoningEvaluationModeToDropDownIndex(_zoning.outer), ZTW_OUTER_DROPDOWN, 0, 0);
break;
+
case ZTW_INNER_DROPDOWN:
- ShowDropDownMenu(this, _zone_types, _zoning.inner_val, ZTW_INNER_DROPDOWN, 0, 0);
+ ShowDropDownMenu(this, _zone_type_strings, ZoningEvaluationModeToDropDownIndex(_zoning.inner), ZTW_INNER_DROPDOWN, 0, 0);
break;
- }
+ }
}
-
- virtual void OnDropdownSelect(int widget, int index) {
+
+ virtual void OnDropdownSelect(int widget, int index)
+ {
switch(widget) {
case ZTW_OUTER_DROPDOWN:
- _zoning.outer_val = index;
- _zoning.outer = GetEvaluationModeFromInt(_zoning.outer_val);
+ _zoning.outer = DropDownIndexToZoningEvaluationMode(index);
break;
+
case ZTW_INNER_DROPDOWN:
- _zoning.inner_val = index;
- _zoning.inner = GetEvaluationModeFromInt(_zoning.inner_val);
+ _zoning.inner = DropDownIndexToZoningEvaluationMode(index);
break;
}
this->InvalidateData();
MarkWholeScreenDirty();
}
-
- virtual void SetStringParameters(int widget) const {
- switch ( widget ) {
- case ZTW_OUTER_DROPDOWN: SetDParam(0, _zone_types[_zoning.outer]); break;
- case ZTW_INNER_DROPDOWN: SetDParam(0, _zone_types[_zoning.inner]); break;
+
+ virtual void SetStringParameters(int widget) const
+ {
+ switch (widget) {
+ case ZTW_OUTER_DROPDOWN:
+ SetDParam(0, _zone_type_strings[ZoningEvaluationModeToDropDownIndex(_zoning.outer)]);
+ break;
+
+ case ZTW_INNER_DROPDOWN:
+ SetDParam(0, _zone_type_strings[ZoningEvaluationModeToDropDownIndex(_zoning.inner)]);
+ break;
}
}
-
- virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) {
+
+ virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
+ {
const StringID *strs = NULL;
- switch ( widget ) {
- case ZTW_OUTER_DROPDOWN: strs = _zone_types; break;
- case ZTW_INNER_DROPDOWN: strs = _zone_types; break;
+ switch (widget) {
+ case ZTW_OUTER_DROPDOWN:
+ case ZTW_INNER_DROPDOWN:
+ strs = _zone_type_strings;
+ break;
}
- if ( strs != NULL ) {
- while ( *strs != INVALID_STRING_ID ) {
+ if (strs != NULL) {
+ while (*strs != INVALID_STRING_ID) {
*size = maxdim(*size, GetStringBoundingBox(*strs++));
}
}
@@ -96,9 +149,9 @@ static const NWidgetPart _nested_zoning_widgets[] = {
NWidget(WWT_SHADEBOX, COLOUR_GREY),
NWidget(WWT_STICKYBOX, COLOUR_GREY),
EndContainer(),
-
+
NWidget(WWT_PANEL, COLOUR_GREY),
- NWidget(NWID_HORIZONTAL, COLOUR_GREY), SetPIP(10, 3, 10),
+ NWidget(NWID_HORIZONTAL, COLOUR_GREY), SetPIP(10, 3, 10),
NWidget(NWID_VERTICAL, COLOUR_GREY), SetPadding(5, 0, 5, 0),
NWidget(WWT_TEXT, COLOUR_GREY), SetDataTip(STR_ZONING_OUTER, STR_NULL), SetResize(1, 0), SetPadding(1, 6, 1, 6),
NWidget(WWT_TEXT, COLOUR_GREY, ZTW_OUTER),
@@ -115,13 +168,14 @@ static const NWidgetPart _nested_zoning_widgets[] = {
EndContainer()
};
-static const WindowDesc _zoning_desc (
- WDP_CENTER, 0, 0,
+static WindowDesc _zoning_desc (
+ WDP_CENTER, "zoning_gui", 0, 0,
WC_ZONING_TOOLBAR, WC_NONE,
0,
_nested_zoning_widgets, lengthof(_nested_zoning_widgets)
);
-void ShowZoningToolbar() {
+void ShowZoningToolbar()
+{
AllocateWindowDescFront(&_zoning_desc, 0);
}