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