00001
00002
00005 #include "stdafx.h"
00006 #include "openttd.h"
00007 #include "gui.h"
00008 #include "window_gui.h"
00009 #include "window_func.h"
00010 #include "viewport_func.h"
00011 #include "command_func.h"
00012 #include "variables.h"
00013 #include "vehicle_gui.h"
00014 #include "rail_gui.h"
00015 #include "road_gui.h"
00016 #include "date_func.h"
00017 #include "vehicle_func.h"
00018 #include "sound_func.h"
00019 #include "terraform_gui.h"
00020 #include "transparency.h"
00021 #include "strings_func.h"
00022 #include "company_func.h"
00023 #include "company_gui.h"
00024 #include "vehicle_base.h"
00025 #include "cheat_func.h"
00026 #include "transparency_gui.h"
00027 #include "screenshot.h"
00028 #include "signs_func.h"
00029 #include "fios.h"
00030 #include "functions.h"
00031 #include "console_gui.h"
00032 #include "news_gui.h"
00033 #include "ai/ai_gui.hpp"
00034 #include "tilehighlight_func.h"
00035 #include "rail.h"
00036 #include "widgets/dropdown_type.h"
00037 #include "settings_type.h"
00038 #include "newgrf_config.h"
00039
00040 #include "network/network.h"
00041 #include "network/network_gui.h"
00042 #include "network/network_func.h"
00043
00044 #include "table/strings.h"
00045 #include "table/sprites.h"
00046
00047 static void SplitToolbar(Window *w);
00048
00049 RailType _last_built_railtype;
00050 RoadType _last_built_roadtype;
00051
00053 enum ToolBarProperties {
00054 TBP_BUTTONWIDTH = 22,
00055 TBP_BUTTONHEIGHT = 22,
00056 TBP_DATEPANELWIDTH = 130,
00057
00058 TBP_TOOLBAR_MINBUTTON = 14,
00059 TBP_NORMAL_MAXBUTTON = 19,
00060 TBP_SCENARIO_MAXBUTTON = 16,
00061 };
00062
00063 enum ToolbarMode {
00064 TB_NORMAL,
00065 TB_UPPER,
00066 TB_LOWER
00067 };
00068
00069 enum ToolbarNormalWidgets {
00070 TBN_PAUSE = 0,
00071 TBN_FASTFORWARD,
00072 TBN_SETTINGS,
00073 TBN_SAVEGAME,
00074 TBN_SMALLMAP,
00075 TBN_TOWNDIRECTORY,
00076 TBN_SUBSIDIES,
00077 TBN_STATIONS,
00078 TBN_FINANCES,
00079 TBN_COMPANIES,
00080 TBN_GRAPHICS,
00081 TBN_LEAGUE,
00082 TBN_INDUSTRIES,
00083 TBN_VEHICLESTART,
00084 TBN_TRAINS = TBN_VEHICLESTART,
00085 TBN_ROADVEHS,
00086 TBN_SHIPS,
00087 TBN_AIRCRAFTS,
00088 TBN_ZOOMIN,
00089 TBN_ZOOMOUT,
00090 TBN_RAILS,
00091 TBN_ROADS,
00092 TBN_WATER,
00093 TBN_AIR,
00094 TBN_LANDSCAPE,
00095 TBN_MUSICSOUND,
00096 TBN_NEWSREPORT,
00097 TBN_HELP,
00098 TBN_SWITCHBAR,
00099 };
00100
00101 enum ToolbarScenEditorWidgets {
00102 TBSE_PAUSE = 0,
00103 TBSE_FASTFORWARD,
00104 TBSE_SAVESCENARIO = 3,
00105 TBSE_SPACERPANEL,
00106 TBSE_DATEPANEL,
00107 TBSE_DATEBACKWARD,
00108 TBSE_DATEFORWARD,
00109 TBSE_SMALLMAP,
00110 TBSE_ZOOMIN,
00111 TBSE_ZOOMOUT,
00112 TBSE_LANDGENERATE,
00113 TBSE_TOWNGENERATE,
00114 TBSE_INDUSTRYGENERATE,
00115 TBSE_BUILDROAD,
00116 TBSE_BUILDDOCKS,
00117 TBSE_PLANTTREES,
00118 TBSE_PLACESIGNS,
00119 };
00120
00124 class DropDownListCheckedItem : public DropDownListStringItem {
00125 public:
00126 bool checked;
00127
00128 DropDownListCheckedItem(StringID string, int result, bool masked, bool checked) : DropDownListStringItem(string, result, masked), checked(checked) {}
00129
00130 virtual ~DropDownListCheckedItem() {}
00131
00132 void Draw(int x, int y, uint width, uint height, bool sel, int bg_colour) const
00133 {
00134 if (checked) {
00135 DrawString(x + 2, y, STR_CHECKMARK, sel ? TC_WHITE : TC_BLACK);
00136 }
00137 DrawStringTruncated(x + 2, y, this->String(), sel ? TC_WHITE : TC_BLACK, width);
00138 }
00139 };
00140
00144 class DropDownListCompanyItem : public DropDownListItem {
00145 public:
00146 bool greyed;
00147
00148 DropDownListCompanyItem(int result, bool masked, bool greyed) : DropDownListItem(result, masked), greyed(greyed) {}
00149
00150 virtual ~DropDownListCompanyItem() {}
00151
00152 bool Selectable() const
00153 {
00154 return true;
00155 }
00156
00157 uint Width() const
00158 {
00159 char buffer[512];
00160 CompanyID company = (CompanyID)result;
00161 SetDParam(0, company);
00162 SetDParam(1, company);
00163 GetString(buffer, STR_7021, lastof(buffer));
00164 return GetStringBoundingBox(buffer).width + 19;
00165 }
00166
00167 void Draw(int x, int y, uint width, uint height, bool sel, int bg_colour) const
00168 {
00169 CompanyID company = (CompanyID)result;
00170 DrawCompanyIcon(company, x + 2, y + 1);
00171
00172 SetDParam(0, company);
00173 SetDParam(1, company);
00174 TextColour col;
00175 if (this->greyed) {
00176 col = TC_GREY;
00177 } else {
00178 col = sel ? TC_WHITE : TC_BLACK;
00179 }
00180 DrawStringTruncated(x + 19, y, STR_7021, col, width - 17);
00181 }
00182 };
00183
00187 static void PopupMainToolbMenu(Window *w, int widget, StringID string, int count)
00188 {
00189 DropDownList *list = new DropDownList();
00190 for (int i = 0; i < count; i++) {
00191 list->push_back(new DropDownListStringItem(string + i, i, false));
00192 }
00193 ShowDropDownList(w, list, 0, widget, 140, true, true);
00194 SndPlayFx(SND_15_BEEP);
00195 }
00196
00198 enum {
00199 CTMN_CLIENT_LIST = -1,
00200 CTMN_NEW_COMPANY = -2,
00201 CTMN_SPECTATE = -3,
00202 };
00203
00207 static void PopupMainCompanyToolbMenu(Window *w, int widget, int grey = 0)
00208 {
00209 DropDownList *list = new DropDownList();
00210
00211 #ifdef ENABLE_NETWORK
00212 if (widget == TBN_COMPANIES && _networking) {
00213
00214 list->push_back(new DropDownListStringItem(STR_NETWORK_CLIENT_LIST, CTMN_CLIENT_LIST, false));
00215
00216 if (_local_company == COMPANY_SPECTATOR) {
00217 list->push_back(new DropDownListStringItem(STR_NETWORK_COMPANY_LIST_NEW_COMPANY, CTMN_NEW_COMPANY, NetworkMaxCompaniesReached()));
00218 } else {
00219 list->push_back(new DropDownListStringItem(STR_NETWORK_COMPANY_LIST_SPECTATE, CTMN_SPECTATE, NetworkMaxSpectatorsReached()));
00220 }
00221 }
00222 #endif
00223
00224 for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
00225 if (!IsValidCompanyID(c)) continue;
00226 list->push_back(new DropDownListCompanyItem(c, false, HasBit(grey, c)));
00227 }
00228
00229 ShowDropDownList(w, list, _local_company == COMPANY_SPECTATOR ? CTMN_CLIENT_LIST : (int)_local_company, widget, 240, true, true);
00230 SndPlayFx(SND_15_BEEP);
00231 }
00232
00233
00234 static ToolbarMode _toolbar_mode;
00235
00236 static void SelectSignTool()
00237 {
00238 if (_cursor.sprite == SPR_CURSOR_SIGN) {
00239 ResetObjectToPlace();
00240 } else {
00241 SetObjectToPlace(SPR_CURSOR_SIGN, PAL_NONE, VHM_RECT, WC_MAIN_TOOLBAR, 0);
00242 _place_proc = PlaceProc_Sign;
00243 }
00244 }
00245
00246
00247
00248 static void ToolbarPauseClick(Window *w)
00249 {
00250 if (_networking && !_network_server) return;
00251
00252 if (DoCommandP(0, _pause_game ? 0 : 1, 0, CMD_PAUSE)) SndPlayFx(SND_15_BEEP);
00253 }
00254
00255
00256
00257 static void ToolbarFastForwardClick(Window *w)
00258 {
00259 _fast_forward ^= true;
00260 SndPlayFx(SND_15_BEEP);
00261 }
00262
00263
00264
00265 enum OptionMenuEntries {
00266 OME_GAMEOPTIONS,
00267 OME_DIFFICULTIES,
00268 OME_SETTINGS,
00269 OME_NEWGRFSETTINGS,
00270 OME_TRANSPARENCIES,
00271 OME_SHOW_TOWNNAMES,
00272 OME_SHOW_STATIONNAMES,
00273 OME_SHOW_SIGNS,
00274 OME_SHOW_WAYPOINTNAMES,
00275 OME_FULL_ANIMATION,
00276 OME_FULL_DETAILS,
00277 OME_TRANSPARENTBUILDINGS,
00278 OME_SHOW_STATIONSIGNS,
00279 };
00280
00281 static void ToolbarOptionsClick(Window *w)
00282 {
00283 DropDownList *list = new DropDownList();
00284 list->push_back(new DropDownListStringItem(STR_02C4_GAME_OPTIONS, OME_GAMEOPTIONS, false));
00285 list->push_back(new DropDownListStringItem(STR_02C6_DIFFICULTY_SETTINGS, OME_DIFFICULTIES, false));
00286 list->push_back(new DropDownListStringItem(STR_MENU_CONFIG_SETTINGS, OME_SETTINGS, false));
00287 list->push_back(new DropDownListStringItem(STR_NEWGRF_SETTINGS, OME_NEWGRFSETTINGS, false));
00288 list->push_back(new DropDownListStringItem(STR_TRANSPARENCY_OPTIONS, OME_TRANSPARENCIES, false));
00289 list->push_back(new DropDownListItem(-1, false));
00290 list->push_back(new DropDownListCheckedItem(STR_02CA_TOWN_NAMES_DISPLAYED, OME_SHOW_TOWNNAMES, false, HasBit(_display_opt, DO_SHOW_TOWN_NAMES)));
00291 list->push_back(new DropDownListCheckedItem(STR_02CC_STATION_NAMES_DISPLAYED, OME_SHOW_STATIONNAMES, false, HasBit(_display_opt, DO_SHOW_STATION_NAMES)));
00292 list->push_back(new DropDownListCheckedItem(STR_02CE_SIGNS_DISPLAYED, OME_SHOW_SIGNS, false, HasBit(_display_opt, DO_SHOW_SIGNS)));
00293 list->push_back(new DropDownListCheckedItem(STR_WAYPOINTS_DISPLAYED2, OME_SHOW_WAYPOINTNAMES, false, HasBit(_display_opt, DO_WAYPOINTS)));
00294 list->push_back(new DropDownListCheckedItem(STR_02D0_FULL_ANIMATION, OME_FULL_ANIMATION, false, HasBit(_display_opt, DO_FULL_ANIMATION)));
00295 list->push_back(new DropDownListCheckedItem(STR_02D2_FULL_DETAIL, OME_FULL_DETAILS, false, HasBit(_display_opt, DO_FULL_DETAIL)));
00296 list->push_back(new DropDownListCheckedItem(STR_02D4_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS, false, IsTransparencySet(TO_HOUSES)));
00297 list->push_back(new DropDownListCheckedItem(STR_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS, false, IsTransparencySet(TO_SIGNS)));
00298
00299 ShowDropDownList(w, list, 0, TBN_SETTINGS, 140, true, true);
00300 SndPlayFx(SND_15_BEEP);
00301 }
00302
00303 static void MenuClickSettings(int index)
00304 {
00305 switch (index) {
00306 case OME_GAMEOPTIONS: ShowGameOptions(); return;
00307 case OME_DIFFICULTIES: ShowGameDifficulty(); return;
00308 case OME_SETTINGS: ShowGameSettings(); return;
00309 case OME_NEWGRFSETTINGS: ShowNewGRFSettings(!_networking, true, true, &_grfconfig); return;
00310 case OME_TRANSPARENCIES: ShowTransparencyToolbar(); break;
00311
00312 case OME_SHOW_TOWNNAMES: ToggleBit(_display_opt, DO_SHOW_TOWN_NAMES); break;
00313 case OME_SHOW_STATIONNAMES: ToggleBit(_display_opt, DO_SHOW_STATION_NAMES); break;
00314 case OME_SHOW_SIGNS: ToggleBit(_display_opt, DO_SHOW_SIGNS); break;
00315 case OME_SHOW_WAYPOINTNAMES: ToggleBit(_display_opt, DO_WAYPOINTS); break;
00316 case OME_FULL_ANIMATION: ToggleBit(_display_opt, DO_FULL_ANIMATION); break;
00317 case OME_FULL_DETAILS: ToggleBit(_display_opt, DO_FULL_DETAIL); break;
00318 case OME_TRANSPARENTBUILDINGS: ToggleTransparency(TO_HOUSES); break;
00319 case OME_SHOW_STATIONSIGNS: ToggleTransparency(TO_SIGNS); break;
00320 }
00321 MarkWholeScreenDirty();
00322 }
00323
00324
00325
00326 enum SaveLoadEditorMenuEntries {
00327 SLEME_SAVE_SCENARIO = 0,
00328 SLEME_LOAD_SCENARIO,
00329 SLEME_LOAD_HEIGHTMAP,
00330 SLEME_EXIT_TOINTRO,
00331 SLEME_EXIT_GAME = 5,
00332 SLEME_MENUCOUNT,
00333 };
00334
00335 enum SaveLoadNormalMenuEntries {
00336 SLNME_SAVE_GAME = 0,
00337 SLNME_LOAD_GAME,
00338 SLNME_EXIT_TOINTRO,
00339 SLNME_EXIT_GAME,
00340 SLNME_MENUCOUNT,
00341 };
00342
00343 static void ToolbarSaveClick(Window *w)
00344 {
00345 PopupMainToolbMenu(w, TBN_SAVEGAME, STR_015C_SAVE_GAME, SLNME_MENUCOUNT);
00346 }
00347
00348 static void ToolbarScenSaveOrLoad(Window *w)
00349 {
00350 PopupMainToolbMenu(w, TBSE_SAVESCENARIO, STR_0292_SAVE_SCENARIO, SLEME_MENUCOUNT);
00351 }
00352
00353 static void MenuClickSaveLoad(int index = 0)
00354 {
00355 if (_game_mode == GM_EDITOR) {
00356 switch (index) {
00357 case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(SLD_SAVE_SCENARIO); break;
00358 case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(SLD_LOAD_SCENARIO); break;
00359 case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(SLD_LOAD_HEIGHTMAP); break;
00360 case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break;
00361 case SLEME_EXIT_GAME: HandleExitGameRequest(); break;
00362 }
00363 } else {
00364 switch (index) {
00365 case SLNME_SAVE_GAME: ShowSaveLoadDialog(SLD_SAVE_GAME); break;
00366 case SLNME_LOAD_GAME: ShowSaveLoadDialog(SLD_LOAD_GAME); break;
00367 case SLNME_EXIT_TOINTRO: AskExitToGameMenu(); break;
00368 case SLNME_EXIT_GAME: HandleExitGameRequest(); break;
00369 }
00370 }
00371 }
00372
00373
00374
00375 enum MapMenuEntries {
00376 MME_SHOW_SMALLMAP = 0,
00377 MME_SHOW_EXTRAVIEWPORTS,
00378 MME_SHOW_SIGNLISTS,
00379 MME_SHOW_TOWNDIRECTORY,
00380 MME_MENUCOUNT_NORMAL = 3,
00381 MME_MENUCOUNT_EDITOR = 4,
00382 };
00383
00384 static void ToolbarMapClick(Window *w)
00385 {
00386 PopupMainToolbMenu(w, TBN_SMALLMAP, STR_02DE_MAP_OF_WORLD, MME_MENUCOUNT_NORMAL);
00387 }
00388
00389 static void ToolbarScenMapTownDir(Window *w)
00390 {
00391 PopupMainToolbMenu(w, TBSE_SMALLMAP, STR_02DE_MAP_OF_WORLD, MME_MENUCOUNT_EDITOR);
00392 }
00393
00394 static void MenuClickMap(int index)
00395 {
00396 switch (index) {
00397 case MME_SHOW_SMALLMAP: ShowSmallMap(); break;
00398 case MME_SHOW_EXTRAVIEWPORTS: ShowExtraViewPortWindow(); break;
00399 case MME_SHOW_SIGNLISTS: ShowSignList(); break;
00400 case MME_SHOW_TOWNDIRECTORY: if (_game_mode == GM_EDITOR) ShowTownDirectory(); break;
00401 }
00402 }
00403
00404
00405
00406 static void ToolbarTownClick(Window *w)
00407 {
00408 PopupMainToolbMenu(w, TBN_TOWNDIRECTORY, STR_02BB_TOWN_DIRECTORY, 1);
00409 }
00410
00411 static void MenuClickTown(int index)
00412 {
00413 ShowTownDirectory();
00414 }
00415
00416
00417
00418 static void ToolbarSubsidiesClick(Window *w)
00419 {
00420 PopupMainToolbMenu(w, TBN_SUBSIDIES, STR_02DD_SUBSIDIES, 1);
00421 }
00422
00423 static void MenuClickSubsidies(int index)
00424 {
00425 ShowSubsidiesList();
00426 }
00427
00428
00429
00430 static void ToolbarStationsClick(Window *w)
00431 {
00432 PopupMainCompanyToolbMenu(w, TBN_STATIONS);
00433 }
00434
00435 static void MenuClickStations(int index)
00436 {
00437 ShowCompanyStations((CompanyID)index);
00438 }
00439
00440
00441
00442 static void ToolbarFinancesClick(Window *w)
00443 {
00444 PopupMainCompanyToolbMenu(w, TBN_FINANCES);
00445 }
00446
00447 static void MenuClickFinances(int index)
00448 {
00449 ShowCompanyFinances((CompanyID)index);
00450 }
00451
00452
00453
00454 static void ToolbarCompaniesClick(Window *w)
00455 {
00456 PopupMainCompanyToolbMenu(w, TBN_COMPANIES);
00457 }
00458
00459 static void MenuClickCompany(int index)
00460 {
00461 #ifdef ENABLE_NETWORK
00462 if (_networking) {
00463 switch (index) {
00464 case CTMN_CLIENT_LIST:
00465 ShowClientList();
00466 return;
00467
00468 case CTMN_NEW_COMPANY:
00469 if (_network_server) {
00470 DoCommandP(0, 0, _network_own_client_id, CMD_COMPANY_CTRL);
00471 } else {
00472 NetworkSend_Command(0, 0, 0, CMD_COMPANY_CTRL, NULL, NULL);
00473 }
00474 return;
00475
00476 case CTMN_SPECTATE:
00477 if (_network_server) {
00478 NetworkServerDoMove(CLIENT_ID_SERVER, COMPANY_SPECTATOR);
00479 MarkWholeScreenDirty();
00480 } else {
00481 NetworkClientRequestMove(COMPANY_SPECTATOR);
00482 }
00483 return;
00484 }
00485 }
00486 #endif
00487 ShowCompany((CompanyID)index);
00488 }
00489
00490
00491
00492 static void ToolbarGraphsClick(Window *w)
00493 {
00494 PopupMainToolbMenu(w, TBN_GRAPHICS, STR_0154_OPERATING_PROFIT_GRAPH, (_toolbar_mode == TB_NORMAL) ? 6 : 8);
00495 }
00496
00497 static void MenuClickGraphs(int index)
00498 {
00499 switch (index) {
00500 case 0: ShowOperatingProfitGraph(); break;
00501 case 1: ShowIncomeGraph(); break;
00502 case 2: ShowDeliveredCargoGraph(); break;
00503 case 3: ShowPerformanceHistoryGraph(); break;
00504 case 4: ShowCompanyValueGraph(); break;
00505 case 5: ShowCargoPaymentRates(); break;
00506
00507 case 6: ShowCompanyLeagueTable(); break;
00508 case 7: ShowPerformanceRatingDetail(); break;
00509 }
00510 }
00511
00512
00513
00514 static void ToolbarLeagueClick(Window *w)
00515 {
00516 PopupMainToolbMenu(w, TBN_LEAGUE, STR_015A_COMPANY_LEAGUE_TABLE, 2);
00517 }
00518
00519 static void MenuClickLeague(int index)
00520 {
00521 switch (index) {
00522 case 0: ShowCompanyLeagueTable(); break;
00523 case 1: ShowPerformanceRatingDetail(); break;
00524 }
00525 }
00526
00527
00528
00529 static void ToolbarIndustryClick(Window *w)
00530 {
00531
00532 PopupMainToolbMenu(w, TBN_INDUSTRIES, STR_INDUSTRY_DIR, (_local_company == COMPANY_SPECTATOR) ? 1 : 2);
00533 }
00534
00535 static void MenuClickIndustry(int index)
00536 {
00537 switch (index) {
00538 case 0: ShowIndustryDirectory(); break;
00539 case 1: ShowBuildIndustryWindow(); break;
00540 }
00541 }
00542
00543
00544
00545 static void ToolbarVehicleClick(Window *w, VehicleType veh)
00546 {
00547 const Vehicle *v;
00548 int dis = ~0;
00549
00550 FOR_ALL_VEHICLES(v) {
00551 if (v->type == veh && v->IsPrimaryVehicle()) ClrBit(dis, v->owner);
00552 }
00553 PopupMainCompanyToolbMenu(w, TBN_VEHICLESTART + veh, dis);
00554 }
00555
00556
00557 static void ToolbarTrainClick(Window *w)
00558 {
00559 ToolbarVehicleClick(w, VEH_TRAIN);
00560 }
00561
00562 static void MenuClickShowTrains(int index)
00563 {
00564 ShowVehicleListWindow((CompanyID)index, VEH_TRAIN);
00565 }
00566
00567
00568
00569 static void ToolbarRoadClick(Window *w)
00570 {
00571 ToolbarVehicleClick(w, VEH_ROAD);
00572 }
00573
00574 static void MenuClickShowRoad(int index)
00575 {
00576 ShowVehicleListWindow((CompanyID)index, VEH_ROAD);
00577 }
00578
00579
00580
00581 static void ToolbarShipClick(Window *w)
00582 {
00583 ToolbarVehicleClick(w, VEH_SHIP);
00584 }
00585
00586 static void MenuClickShowShips(int index)
00587 {
00588 ShowVehicleListWindow((CompanyID)index, VEH_SHIP);
00589 }
00590
00591
00592
00593 static void ToolbarAirClick(Window *w)
00594 {
00595 ToolbarVehicleClick(w, VEH_AIRCRAFT);
00596 }
00597
00598 static void MenuClickShowAir(int index)
00599 {
00600 ShowVehicleListWindow((CompanyID)index, VEH_AIRCRAFT);
00601 }
00602
00603
00604
00605 static void ToolbarZoomInClick(Window *w)
00606 {
00607 if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
00608 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)TBSE_ZOOMIN : (byte)TBN_ZOOMIN);
00609 SndPlayFx(SND_15_BEEP);
00610 }
00611 }
00612
00613
00614
00615 static void ToolbarZoomOutClick(Window *w)
00616 {
00617 if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) {
00618 w->HandleButtonClick((_game_mode == GM_EDITOR) ? (byte)TBSE_ZOOMOUT : (byte)TBN_ZOOMOUT);
00619 SndPlayFx(SND_15_BEEP);
00620 }
00621 }
00622
00623
00624
00625 static void ToolbarBuildRailClick(Window *w)
00626 {
00627 const Company *c = GetCompany(_local_company);
00628 DropDownList *list = new DropDownList();
00629 for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
00630 const RailtypeInfo *rti = GetRailTypeInfo(rt);
00631
00632 if (rti->label == 0) continue;
00633 list->push_back(new DropDownListStringItem(rti->strings.menu_text, rt, !HasBit(c->avail_railtypes, rt)));
00634 }
00635 ShowDropDownList(w, list, _last_built_railtype, TBN_RAILS, 140, true, true);
00636 SndPlayFx(SND_15_BEEP);
00637 }
00638
00639 static void MenuClickBuildRail(int index)
00640 {
00641 _last_built_railtype = (RailType)index;
00642 ShowBuildRailToolbar(_last_built_railtype, -1);
00643 }
00644
00645
00646
00647 static void ToolbarBuildRoadClick(Window *w)
00648 {
00649 const Company *c = GetCompany(_local_company);
00650 DropDownList *list = new DropDownList();
00651 for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) {
00652
00653 list->push_back(new DropDownListStringItem(STR_180A_ROAD_CONSTRUCTION + rt, rt, !(HasBit(c->avail_roadtypes, rt) || rt == ROADTYPE_ROAD)));
00654 }
00655 ShowDropDownList(w, list, _last_built_roadtype, TBN_ROADS, 140, true, true);
00656 SndPlayFx(SND_15_BEEP);
00657 }
00658
00659 static void MenuClickBuildRoad(int index)
00660 {
00661 _last_built_roadtype = (RoadType)index;
00662 ShowBuildRoadToolbar(_last_built_roadtype);
00663 }
00664
00665
00666
00667 static void ToolbarBuildWaterClick(Window *w)
00668 {
00669 PopupMainToolbMenu(w, TBN_WATER, STR_9800_WATERWAYS_CONSTRUCTION, 1);
00670 }
00671
00672 static void MenuClickBuildWater(int index)
00673 {
00674 ShowBuildDocksToolbar();
00675 }
00676
00677
00678
00679 static void ToolbarBuildAirClick(Window *w)
00680 {
00681 PopupMainToolbMenu(w, TBN_AIR, STR_A01D_AIRPORT_CONSTRUCTION, 1);
00682 }
00683
00684 static void MenuClickBuildAir(int index)
00685 {
00686 ShowBuildAirToolbar();
00687 }
00688
00689
00690
00691 static void ToolbarForestClick(Window *w)
00692 {
00693 PopupMainToolbMenu(w, TBN_LANDSCAPE, STR_LANDSCAPING, 3);
00694 }
00695
00696 static void MenuClickForest(int index)
00697 {
00698 switch (index) {
00699 case 0: ShowTerraformToolbar(); break;
00700 case 1: ShowBuildTreesToolbar(); break;
00701 case 2: SelectSignTool(); break;
00702 }
00703 }
00704
00705
00706
00707 static void ToolbarMusicClick(Window *w)
00708 {
00709 PopupMainToolbMenu(w, TBN_MUSICSOUND, STR_01D3_SOUND_MUSIC, 1);
00710 }
00711
00712 static void MenuClickMusicWindow(int index)
00713 {
00714 ShowMusicWindow();
00715 }
00716
00717
00718
00719 static void ToolbarNewspaperClick(Window *w)
00720 {
00721 PopupMainToolbMenu(w, TBN_NEWSREPORT, STR_0200_LAST_MESSAGE_NEWS_REPORT, 3);
00722 }
00723
00724 static void MenuClickNewspaper(int index)
00725 {
00726 switch (index) {
00727 case 0: ShowLastNewsMessage(); break;
00728 case 1: ShowMessageOptions(); break;
00729 case 2: ShowMessageHistory(); break;
00730 }
00731 }
00732
00733
00734
00735 static void ToolbarHelpClick(Window *w)
00736 {
00737 PopupMainToolbMenu(w, TBN_HELP, STR_02D5_LAND_BLOCK_INFO, 7);
00738 }
00739
00740 static void MenuClickSmallScreenshot()
00741 {
00742 SetScreenshotType(SC_VIEWPORT);
00743 }
00744
00745 static void MenuClickWorldScreenshot()
00746 {
00747 SetScreenshotType(SC_WORLD);
00748 }
00749
00750 static void MenuClickHelp(int index)
00751 {
00752 switch (index) {
00753 case 0: PlaceLandBlockInfo(); break;
00754 case 2: IConsoleSwitch(); break;
00755 case 3: ShowAIDebugWindow(); break;
00756 case 4: MenuClickSmallScreenshot(); break;
00757 case 5: MenuClickWorldScreenshot(); break;
00758 case 6: ShowAboutWindow(); break;
00759 }
00760 }
00761
00762
00763
00764 static void ToolbarSwitchClick(Window *w)
00765 {
00766 if (_toolbar_mode != TB_LOWER) {
00767 _toolbar_mode = TB_LOWER;
00768 } else {
00769 _toolbar_mode = TB_UPPER;
00770 }
00771
00772 SplitToolbar(w);
00773 w->HandleButtonClick(TBN_SWITCHBAR);
00774 SetWindowDirty(w);
00775 SndPlayFx(SND_15_BEEP);
00776 }
00777
00778
00779
00780 static void ToolbarScenDateBackward(Window *w)
00781 {
00782
00783 if ((w->flags4 & WF_TIMEOUT_MASK) <= WF_TIMEOUT_TRIGGER) {
00784 w->HandleButtonClick(TBSE_DATEBACKWARD);
00785 w->SetDirty();
00786
00787 _settings_newgame.game_creation.starting_year = Clamp(_settings_newgame.game_creation.starting_year - 1, MIN_YEAR, MAX_YEAR);
00788 SetDate(ConvertYMDToDate(_settings_newgame.game_creation.starting_year, 0, 1));
00789 }
00790 _left_button_clicked = false;
00791 }
00792
00793 static void ToolbarScenDateForward(Window *w)
00794 {
00795
00796 if ((w->flags4 & WF_TIMEOUT_MASK) <= WF_TIMEOUT_TRIGGER) {
00797 w->HandleButtonClick(TBSE_DATEFORWARD);
00798 w->SetDirty();
00799
00800 _settings_newgame.game_creation.starting_year = Clamp(_settings_newgame.game_creation.starting_year + 1, MIN_YEAR, MAX_YEAR);
00801 SetDate(ConvertYMDToDate(_settings_newgame.game_creation.starting_year, 0, 1));
00802 }
00803 _left_button_clicked = false;
00804 }
00805
00806 static void ToolbarScenGenLand(Window *w)
00807 {
00808 w->HandleButtonClick(TBSE_LANDGENERATE);
00809 SndPlayFx(SND_15_BEEP);
00810
00811 ShowEditorTerraformToolbar();
00812 }
00813
00814
00815 static void ToolbarScenGenTown(Window *w)
00816 {
00817 w->HandleButtonClick(TBSE_TOWNGENERATE);
00818 SndPlayFx(SND_15_BEEP);
00819 ShowBuildTownWindow();
00820 }
00821
00822 static void ToolbarScenGenIndustry(Window *w)
00823 {
00824 w->HandleButtonClick(TBSE_INDUSTRYGENERATE);
00825 SndPlayFx(SND_15_BEEP);
00826 ShowBuildIndustryWindow();
00827 }
00828
00829 static void ToolbarScenBuildRoad(Window *w)
00830 {
00831 w->HandleButtonClick(TBSE_BUILDROAD);
00832 SndPlayFx(SND_15_BEEP);
00833 ShowBuildRoadScenToolbar();
00834 }
00835
00836 static void ToolbarScenBuildDocks(Window *w)
00837 {
00838 w->HandleButtonClick(TBSE_BUILDDOCKS);
00839 SndPlayFx(SND_15_BEEP);
00840 ShowBuildDocksScenToolbar();
00841 }
00842
00843 static void ToolbarScenPlantTrees(Window *w)
00844 {
00845 w->HandleButtonClick(TBSE_PLANTTREES);
00846 SndPlayFx(SND_15_BEEP);
00847 ShowBuildTreesToolbar();
00848 }
00849
00850 static void ToolbarScenPlaceSign(Window *w)
00851 {
00852 w->HandleButtonClick(TBSE_PLACESIGNS);
00853 SndPlayFx(SND_15_BEEP);
00854 SelectSignTool();
00855 }
00856
00857 static void ToolbarBtn_NULL(Window *w)
00858 {
00859 }
00860
00861
00862
00863 static void ResizeToolbar(Window *w)
00864 {
00865
00866 uint button_width;
00867 uint spacing;
00868 uint widgetcount = w->widget_count - 1;
00869
00870 if (w->width >= (int)widgetcount * TBP_BUTTONWIDTH) {
00871 button_width = TBP_BUTTONWIDTH;
00872 spacing = w->width - (widgetcount * button_width);
00873 } else {
00874 button_width = w->width / widgetcount;
00875 spacing = 0;
00876 }
00877
00878 static const uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 };
00879 uint i = 0;
00880 for (uint x = 0, j = 0; i < widgetcount; i++) {
00881 if (extra_spacing_at[j] == i) {
00882 j++;
00883 uint add = spacing / (lengthof(extra_spacing_at) - j);
00884 spacing -= add;
00885 x += add;
00886 }
00887
00888 w->widget[i].type = WWT_IMGBTN;
00889 w->widget[i].left = x;
00890 x += (spacing != 0) ? button_width : (w->width - x) / (widgetcount - i);
00891 w->widget[i].right = x - 1;
00892 }
00893
00894 w->widget[i].type = WWT_EMPTY;
00895 _toolbar_mode = TB_NORMAL;
00896 }
00897
00898
00899
00900 static void SplitToolbar(Window *w)
00901 {
00902 static const byte arrange14[] = {
00903 0, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 27,
00904 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 27,
00905 };
00906 static const byte arrange15[] = {
00907 0, 1, 4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
00908 0, 2, 4, 3, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 27,
00909 };
00910 static const byte arrange16[] = {
00911 0, 1, 2, 4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
00912 0, 1, 3, 5, 6, 7, 8, 9, 10, 12, 24, 25, 26, 17, 18, 27,
00913 };
00914 static const byte arrange17[] = {
00915 0, 1, 2, 4, 6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
00916 0, 1, 3, 4, 6, 5, 7, 8, 9, 10, 12, 24, 25, 26, 17, 18, 27,
00917 };
00918 static const byte arrange18[] = {
00919 0, 1, 2, 4, 5, 6, 7, 8, 9, 12, 19, 20, 21, 22, 23, 17, 18, 27,
00920 0, 1, 3, 4, 5, 6, 7, 10, 13, 14, 15, 16, 24, 25, 26, 17, 18, 27,
00921 };
00922 static const byte arrange19[] = {
00923 0, 1, 2, 4, 5, 6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 17, 18, 27,
00924 0, 1, 3, 4, 7, 8, 9, 10, 12, 25, 19, 20, 21, 22, 23, 26, 17, 18, 27,
00925 };
00926
00927 static const byte *arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19 };
00928
00929 uint max_icons = max(TBP_TOOLBAR_MINBUTTON, (ToolBarProperties)((w->width + TBP_BUTTONWIDTH / 2) / TBP_BUTTONWIDTH));
00930
00931 assert(max_icons >= TBP_TOOLBAR_MINBUTTON && max_icons <= TBP_NORMAL_MAXBUTTON);
00932
00933
00934 for (uint i = 0; i < w->widget_count - 1; i++) {
00935 w->widget[i].type = WWT_EMPTY;
00936 }
00937
00938
00939 for (uint i = 0, x = 0, n = max_icons - TBP_TOOLBAR_MINBUTTON; i < max_icons; i++) {
00940 uint icon = arrangements[n][i + ((_toolbar_mode == TB_LOWER) ? max_icons : 0)];
00941 w->widget[icon].type = WWT_IMGBTN;
00942 w->widget[icon].left = x;
00943 x += (w->width - x) / (max_icons - i);
00944 w->widget[icon].right = x - 1;
00945 }
00946 }
00947
00948 typedef void MenuClickedProc(int index);
00949
00950 static MenuClickedProc * const _menu_clicked_procs[] = {
00951 NULL,
00952 NULL,
00953 MenuClickSettings,
00954 MenuClickSaveLoad,
00955 MenuClickMap,
00956 MenuClickTown,
00957 MenuClickSubsidies,
00958 MenuClickStations,
00959 MenuClickFinances,
00960 MenuClickCompany,
00961 MenuClickGraphs,
00962 MenuClickLeague,
00963 MenuClickIndustry,
00964 MenuClickShowTrains,
00965 MenuClickShowRoad,
00966 MenuClickShowShips,
00967 MenuClickShowAir,
00968 MenuClickMap,
00969 NULL,
00970 MenuClickBuildRail,
00971 MenuClickBuildRoad,
00972 MenuClickBuildWater,
00973 MenuClickBuildAir,
00974 MenuClickForest,
00975 MenuClickMusicWindow,
00976 MenuClickNewspaper,
00977 MenuClickHelp,
00978 };
00979
00980
00981
00982 typedef void ToolbarButtonProc(Window *w);
00983
00984 static ToolbarButtonProc * const _toolbar_button_procs[] = {
00985 ToolbarPauseClick,
00986 ToolbarFastForwardClick,
00987 ToolbarOptionsClick,
00988 ToolbarSaveClick,
00989 ToolbarMapClick,
00990 ToolbarTownClick,
00991 ToolbarSubsidiesClick,
00992 ToolbarStationsClick,
00993 ToolbarFinancesClick,
00994 ToolbarCompaniesClick,
00995 ToolbarGraphsClick,
00996 ToolbarLeagueClick,
00997 ToolbarIndustryClick,
00998 ToolbarTrainClick,
00999 ToolbarRoadClick,
01000 ToolbarShipClick,
01001 ToolbarAirClick,
01002 ToolbarZoomInClick,
01003 ToolbarZoomOutClick,
01004 ToolbarBuildRailClick,
01005 ToolbarBuildRoadClick,
01006 ToolbarBuildWaterClick,
01007 ToolbarBuildAirClick,
01008 ToolbarForestClick,
01009 ToolbarMusicClick,
01010 ToolbarNewspaperClick,
01011 ToolbarHelpClick,
01012 ToolbarSwitchClick,
01013 };
01014
01015 struct MainToolbarWindow : Window {
01016 MainToolbarWindow(const WindowDesc *desc) : Window(desc)
01017 {
01018 this->SetWidgetDisabledState(TBN_PAUSE, _networking && !_network_server);
01019 this->SetWidgetDisabledState(TBN_FASTFORWARD, _networking);
01020
01021 CLRBITS(this->flags4, WF_WHITE_BORDER_MASK);
01022
01023 this->FindWindowPlacementAndResize(desc);
01024 PositionMainToolbar(this);
01025 DoZoomInOutWindow(ZOOM_NONE, this);
01026 }
01027
01028 virtual void OnPaint()
01029 {
01030
01031 GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB2);
01032 GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4, FILLRECT_CHECKER);
01033
01034
01035
01036
01037 this->SetWidgetsDisabledState(_local_company == COMPANY_SPECTATOR, TBN_RAILS, TBN_ROADS, TBN_WATER, TBN_AIR, TBN_LANDSCAPE, WIDGET_LIST_END);
01038
01039 this->SetWidgetsDisabledState(ActiveCompanyCount() == TBN_PAUSE, TBN_STATIONS, TBN_FINANCES, TBN_TRAINS, TBN_ROADVEHS, TBN_SHIPS, TBN_AIRCRAFTS, WIDGET_LIST_END);
01040
01041 this->SetWidgetDisabledState(TBN_RAILS, !CanBuildVehicleInfrastructure(VEH_TRAIN));
01042 this->SetWidgetDisabledState(TBN_AIR, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
01043
01044 this->DrawWidgets();
01045 }
01046
01047 virtual void OnClick(Point pt, int widget)
01048 {
01049 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this);
01050 }
01051
01052 virtual void OnDropdownSelect(int widget, int index)
01053 {
01054 _menu_clicked_procs[widget](index);
01055 }
01056
01057 virtual EventState OnKeyPress(uint16 key, uint16 keycode)
01058 {
01059 switch (keycode) {
01060 case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(this); break;
01061 case WKC_F2: ShowGameOptions(); break;
01062 case WKC_F3: MenuClickSaveLoad(); break;
01063 case WKC_F4: ShowSmallMap(); break;
01064 case WKC_F5: ShowTownDirectory(); break;
01065 case WKC_F6: ShowSubsidiesList(); break;
01066 case WKC_F7: ShowCompanyStations(_local_company); break;
01067 case WKC_F8: ShowCompanyFinances(_local_company); break;
01068 case WKC_F9: ShowCompany(_local_company); break;
01069 case WKC_F10: ShowOperatingProfitGraph(); break;
01070 case WKC_F11: ShowCompanyLeagueTable(); break;
01071 case WKC_F12: ShowBuildIndustryWindow(); break;
01072 case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(_local_company, VEH_TRAIN); break;
01073 case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_company, VEH_ROAD); break;
01074 case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_company, VEH_SHIP); break;
01075 case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_company, VEH_AIRCRAFT); break;
01076 case WKC_NUM_PLUS:
01077 case WKC_EQUALS:
01078 case WKC_SHIFT | WKC_EQUALS:
01079 case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(this); break;
01080 case WKC_NUM_MINUS:
01081 case WKC_MINUS:
01082 case WKC_SHIFT | WKC_MINUS:
01083 case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(this); break;
01084 case WKC_SHIFT | WKC_F7: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, -1); break;
01085 case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break;
01086 case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break;
01087 case WKC_SHIFT | WKC_F10: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break;
01088 case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break;
01089 case WKC_SHIFT | WKC_F12: ShowMusicWindow(); break;
01090 case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break;
01091 case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break;
01092 case WKC_CTRL | WKC_ALT | 'C': if (!_networking) ShowCheatWindow(); break;
01093 case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break;
01094 case 'L': ShowTerraformToolbar(); break;
01095 case 'M': ShowSmallMap(); break;
01096 case 'V': ShowExtraViewPortWindow(); break;
01097 default: return ES_NOT_HANDLED;
01098 }
01099 return ES_HANDLED;
01100 }
01101
01102 virtual void OnPlaceObject(Point pt, TileIndex tile)
01103 {
01104 _place_proc(tile);
01105 }
01106
01107 virtual void OnTick()
01108 {
01109 if (this->IsWidgetLowered(TBN_PAUSE) != !!_pause_game) {
01110 this->ToggleWidgetLoweredState(TBN_PAUSE);
01111 this->InvalidateWidget(TBN_PAUSE);
01112 }
01113
01114 if (this->IsWidgetLowered(TBN_FASTFORWARD) != !!_fast_forward) {
01115 this->ToggleWidgetLoweredState(TBN_FASTFORWARD);
01116 this->InvalidateWidget(TBN_FASTFORWARD);
01117 }
01118 }
01119
01120 virtual void OnResize(Point new_size, Point delta)
01121 {
01122 if (this->width <= TBP_NORMAL_MAXBUTTON * TBP_BUTTONWIDTH) {
01123 SplitToolbar(this);
01124 } else {
01125 ResizeToolbar(this);
01126 }
01127 }
01128
01129 virtual void OnTimeout()
01130 {
01131 for (uint i = TBN_SETTINGS; i < this->widget_count - 1; i++) {
01132 if (this->IsWidgetLowered(i)) {
01133 this->RaiseWidget(i);
01134 this->InvalidateWidget(i);
01135 }
01136 }
01137 }
01138
01139 virtual void OnInvalidateData(int data)
01140 {
01141 if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, TBN_ZOOMIN, TBN_ZOOMOUT);
01142 }
01143 };
01144
01145 static const Widget _toolb_normal_widgets[] = {
01146 { WWT_IMGBTN, RESIZE_LEFT, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME},
01147 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD},
01148 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS},
01149 { WWT_IMGBTN_2, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0172_SAVE_GAME_ABANDON_GAME},
01150
01151 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0174_DISPLAY_MAP},
01152 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_TOWN, STR_0176_DISPLAY_TOWN_DIRECTORY},
01153 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SUBSIDIES, STR_02DC_DISPLAY_SUBSIDIES},
01154 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_COMPANY_LIST, STR_0173_DISPLAY_LIST_OF_COMPANY},
01155
01156 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_COMPANY_FINANCE, STR_0177_DISPLAY_COMPANY_FINANCES},
01157 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_COMPANY_GENERAL, STR_0178_DISPLAY_COMPANY_GENERAL},
01158 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_GRAPHS, STR_0179_DISPLAY_GRAPHS},
01159 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_COMPANY_LEAGUE, STR_017A_DISPLAY_COMPANY_LEAGUE},
01160 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0312_FUND_CONSTRUCTION_OF_NEW},
01161
01162 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_TRAINLIST, STR_017B_DISPLAY_LIST_OF_COMPANY},
01163 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_TRUCKLIST, STR_017C_DISPLAY_LIST_OF_COMPANY},
01164 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SHIPLIST, STR_017D_DISPLAY_LIST_OF_COMPANY},
01165 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_AIRPLANESLIST, STR_017E_DISPLAY_LIST_OF_COMPANY},
01166
01167 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN},
01168 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT},
01169
01170 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDRAIL, STR_0181_BUILD_RAILROAD_TRACK},
01171 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0182_BUILD_ROADS},
01172 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDWATER, STR_0183_BUILD_SHIP_DOCKS},
01173 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDAIR, STR_0184_BUILD_AIRPORTS},
01174 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_LANDSCAPING_TOOLBAR_TIP},
01175
01176 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW},
01177 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_MESSAGES, STR_0203_SHOW_LAST_MESSAGE_NEWS},
01178 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION},
01179 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_SWITCH_TOOLBAR, STR_EMPTY},
01180 { WIDGETS_END},
01181 };
01182
01183 static const WindowDesc _toolb_normal_desc(
01184 0, 0, 0, TBP_BUTTONHEIGHT, 640, TBP_BUTTONHEIGHT,
01185 WC_MAIN_TOOLBAR, WC_NONE,
01186 WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_NO_FOCUS,
01187 _toolb_normal_widgets
01188 );
01189
01190
01191
01192
01193 static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
01194 ToolbarPauseClick,
01195 ToolbarFastForwardClick,
01196 ToolbarOptionsClick,
01197 ToolbarScenSaveOrLoad,
01198 ToolbarBtn_NULL,
01199 ToolbarBtn_NULL,
01200 ToolbarScenDateBackward,
01201 ToolbarScenDateForward,
01202 ToolbarScenMapTownDir,
01203 ToolbarZoomInClick,
01204 ToolbarZoomOutClick,
01205 ToolbarScenGenLand,
01206 ToolbarScenGenTown,
01207 ToolbarScenGenIndustry,
01208 ToolbarScenBuildRoad,
01209 ToolbarScenBuildDocks,
01210 ToolbarScenPlantTrees,
01211 ToolbarScenPlaceSign,
01212 NULL,
01213 NULL,
01214 NULL,
01215 NULL,
01216 NULL,
01217 NULL,
01218 ToolbarMusicClick,
01219 NULL,
01220 ToolbarHelpClick,
01221 };
01222
01223 struct ScenarioEditorToolbarWindow : Window {
01224 public:
01225 ScenarioEditorToolbarWindow(const WindowDesc *desc) : Window(desc)
01226 {
01227 CLRBITS(this->flags4, WF_WHITE_BORDER_MASK);
01228
01229 this->FindWindowPlacementAndResize(desc);
01230 PositionMainToolbar(this);
01231 DoZoomInOutWindow(ZOOM_NONE, this);
01232 }
01233
01234 virtual void OnPaint()
01235 {
01236 this->SetWidgetDisabledState(TBSE_DATEBACKWARD, _settings_newgame.game_creation.starting_year <= MIN_YEAR);
01237 this->SetWidgetDisabledState(TBSE_DATEFORWARD, _settings_newgame.game_creation.starting_year >= MAX_YEAR);
01238
01239
01240 GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB2);
01241 GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4, FILLRECT_CHECKER);
01242
01243 this->DrawWidgets();
01244
01245 SetDParam(0, ConvertYMDToDate(_settings_newgame.game_creation.starting_year, 0, 1));
01246 DrawStringCenteredTruncated(this->widget[TBSE_DATEBACKWARD].right, this->widget[TBSE_DATEFORWARD].left, 6, STR_00AF, TC_FROMSTRING);
01247
01248
01249 const Widget *panel = &this->widget[TBSE_SPACERPANEL];
01250 if (panel->left != panel->right) {
01251 DrawStringCenteredTruncated(panel->left + 1, panel->right - 1, 1, STR_0221_OPENTTD, TC_FROMSTRING);
01252 DrawStringCenteredTruncated(panel->left + 1, panel->right - 1, 11, STR_0222_SCENARIO_EDITOR, TC_FROMSTRING);
01253 }
01254 }
01255
01256 virtual void OnClick(Point pt, int widget)
01257 {
01258 if (_game_mode == GM_MENU) return;
01259 _scen_toolbar_button_procs[widget](this);
01260 }
01261
01262 virtual void OnDropdownSelect(int widget, int index)
01263 {
01264
01265
01266 if (widget == TBSE_SMALLMAP) widget = TBN_SMALLMAP;
01267 _menu_clicked_procs[widget](index);
01268 SndPlayFx(SND_15_BEEP);
01269 }
01270
01271 virtual EventState OnKeyPress(uint16 key, uint16 keycode)
01272 {
01273 switch (keycode) {
01274 case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(this); break;
01275 case WKC_F2: ShowGameOptions(); break;
01276 case WKC_F3: MenuClickSaveLoad(); break;
01277 case WKC_F4: ToolbarScenGenLand(this); break;
01278 case WKC_F5: ToolbarScenGenTown(this); break;
01279 case WKC_F6: ToolbarScenGenIndustry(this); break;
01280 case WKC_F7: ToolbarScenBuildRoad(this); break;
01281 case WKC_F8: ToolbarScenBuildDocks(this); break;
01282 case WKC_F9: ToolbarScenPlantTrees(this); break;
01283 case WKC_F10: ToolbarScenPlaceSign(this); break;
01284 case WKC_F11: ShowMusicWindow(); break;
01285 case WKC_F12: PlaceLandBlockInfo(); break;
01286 case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break;
01287 case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break;
01288
01289
01290 case WKC_NUM_PLUS:
01291 case WKC_EQUALS:
01292 case WKC_SHIFT | WKC_EQUALS:
01293 case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(this); break;
01294
01295
01296 case WKC_NUM_MINUS:
01297 case WKC_MINUS:
01298 case WKC_SHIFT | WKC_MINUS:
01299 case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(this); break;
01300
01301 case 'L': ShowEditorTerraformToolbar(); break;
01302 case 'M': ShowSmallMap(); break;
01303 case 'V': ShowExtraViewPortWindow(); break;
01304 default: return ES_NOT_HANDLED;
01305 }
01306 return ES_HANDLED;
01307 }
01308
01309 virtual void OnPlaceObject(Point pt, TileIndex tile)
01310 {
01311 _place_proc(tile);
01312 }
01313
01314 virtual void OnResize(Point new_size, Point delta)
01315 {
01316
01317
01318
01319 uint buttons_width;
01320 uint spacing;
01321
01322 static const int normal_min_width = (TBP_SCENARIO_MAXBUTTON * TBP_BUTTONWIDTH) + (2 * TBP_DATEPANELWIDTH);
01323 static const int one_less_panel_min_width = (TBP_SCENARIO_MAXBUTTON * TBP_BUTTONWIDTH) + TBP_DATEPANELWIDTH;
01324
01325 if (this->width >= one_less_panel_min_width) {
01326 buttons_width = TBP_SCENARIO_MAXBUTTON * TBP_BUTTONWIDTH;
01327 spacing = this->width - ((this->width >= normal_min_width) ? normal_min_width : one_less_panel_min_width);
01328 } else {
01329 buttons_width = this->width - TBP_DATEPANELWIDTH;
01330 spacing = 0;
01331 }
01332 static const uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 17, 0 };
01333
01334 for (uint i = 0, x = 0, j = 0, b = 0; i < this->widget_count; i++) {
01335 switch (i) {
01336 case TBSE_SPACERPANEL:
01337 this->widget[i].left = x;
01338 if (this->width < normal_min_width) {
01339 this->widget[i].right = x;
01340 j++;
01341 continue;
01342 }
01343
01344 x += TBP_DATEPANELWIDTH;
01345 this->widget[i].right = x - 1;
01346 break;
01347
01348 case TBSE_DATEPANEL: {
01349 int offset = x - this->widget[i].left;
01350 this->widget[i + 1].left += offset;
01351 this->widget[i + 1].right += offset;
01352 this->widget[i + 2].left += offset;
01353 this->widget[i + 2].right += offset;
01354 this->widget[i].left = x;
01355 x += TBP_DATEPANELWIDTH;
01356 this->widget[i].right = x - 1;
01357 i += 2;
01358 } break;
01359
01360 default:
01361 if (this->widget[i].bottom == 0) continue;
01362
01363 this->widget[i].left = x;
01364 x += buttons_width / (TBP_SCENARIO_MAXBUTTON - b);
01365 this->widget[i].right = x - 1;
01366 buttons_width -= buttons_width / (TBP_SCENARIO_MAXBUTTON - b);
01367 b++;
01368 break;
01369 }
01370
01371 if (extra_spacing_at[j] == i) {
01372 j++;
01373 uint add = spacing / (lengthof(extra_spacing_at) - j);
01374 spacing -= add;
01375 x += add;
01376 }
01377 }
01378 }
01379
01380 virtual void OnTick()
01381 {
01382 if (this->IsWidgetLowered(TBSE_PAUSE) != !!_pause_game) {
01383 this->ToggleWidgetLoweredState(TBSE_PAUSE);
01384 this->SetDirty();
01385 }
01386
01387 if (this->IsWidgetLowered(TBSE_FASTFORWARD) != !!_fast_forward) {
01388 this->ToggleWidgetLoweredState(TBSE_FASTFORWARD);
01389 this->SetDirty();
01390 }
01391 }
01392
01393 virtual void OnInvalidateData(int data)
01394 {
01395 if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, TBSE_ZOOMIN, TBSE_ZOOMOUT);
01396 }
01397 };
01398
01399 static const Widget _toolb_scen_widgets[] = {
01400 { WWT_IMGBTN, RESIZE_LEFT, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME},
01401 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD},
01402 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS},
01403 {WWT_IMGBTN_2, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0297_SAVE_SCENARIO_LOAD_SCENARIO},
01404
01405 { WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, 0x0, STR_NULL},
01406
01407 { WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 129, 0, 21, 0x0, STR_NULL},
01408 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 3, 14, 5, 16, SPR_ARROW_DOWN, STR_029E_MOVE_THE_STARTING_DATE},
01409 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 113, 125, 5, 16, SPR_ARROW_UP, STR_029F_MOVE_THE_STARTING_DATE},
01410
01411 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0175_DISPLAY_MAP_TOWN_DIRECTORY},
01412
01413 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN},
01414 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT},
01415
01416 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_022E_LANDSCAPE_GENERATION},
01417 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_TOWN, STR_022F_TOWN_GENERATION},
01418 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0230_INDUSTRY_GENERATION},
01419 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0231_ROAD_CONSTRUCTION},
01420 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_BUILDWATER, STR_0183_BUILD_SHIP_DOCKS},
01421 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_PLANTTREES, STR_0288_PLANT_TREES},
01422 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_SIGN, STR_0289_PLACE_SIGN},
01423
01424 { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL},
01425 { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL},
01426 { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL},
01427 { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL},
01428 { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL},
01429 { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL},
01430 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW},
01431 { WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL},
01432 { WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION},
01433 {WIDGETS_END},
01434 };
01435
01436 static const WindowDesc _toolb_scen_desc(
01437 0, 0, 130, TBP_BUTTONHEIGHT, 640, TBP_BUTTONHEIGHT,
01438 WC_MAIN_TOOLBAR, WC_NONE,
01439 WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_NO_FOCUS,
01440 _toolb_scen_widgets
01441 );
01442
01443
01444
01445 void AllocateToolbar()
01446 {
01447
01448 _last_built_roadtype = ROADTYPE_ROAD;
01449
01450 if (_game_mode == GM_EDITOR) {
01451 new ScenarioEditorToolbarWindow(&_toolb_scen_desc);;
01452 } else {
01453 new MainToolbarWindow(&_toolb_normal_desc);
01454 }
01455 }