--- a/src/main_gui.cpp Tue Mar 27 23:27:27 2007 +0000
+++ b/src/main_gui.cpp Sat Jun 02 19:59:29 2007 +0000
@@ -37,6 +37,7 @@
#include "settings.h"
#include "date.h"
#include "vehicle_gui.h"
+#include "transparency_gui.h"
#include "newgrf_config.h"
#include "network/network_data.h"
@@ -50,7 +51,8 @@
static byte _terraform_size = 1;
RailType _last_built_railtype;
-static int _scengen_town_size = 2; // depress medium-sized towns per default
+RoadType _last_built_roadtype;
+static int _scengen_town_size = 1; // depress medium-sized towns per default
extern void GenerateIndustries();
extern bool GenerateTowns();
@@ -88,7 +90,7 @@
} else {
NetworkServer_HandleChat(NETWORK_ACTION_GIVE_MONEY, DESTTYPE_TEAM, id, msg, NETWORK_SERVER_INDEX);
}
- } break;
+ } break;
#endif /* ENABLE_NETWORK */
default: NOT_REACHED();
}
@@ -146,6 +148,22 @@
}
+/** Toggle all transparency options, except for signs */
+static void ToggleTransparency()
+{
+ static byte trans_opt = ~0;
+
+ if (GB(_transparent_opt, 1, 7) == 0) {
+ SB(_transparent_opt, 1, 7, GB(trans_opt, 1, 7));
+ } else {
+ trans_opt = _transparent_opt;
+ SB(_transparent_opt, 1, 7, 0);
+ }
+
+ MarkWholeScreenDirty();
+}
+
+
static void MenuClickSettings(int index)
{
switch (index) {
@@ -154,14 +172,14 @@
case 2: ShowPatchesSelection(); return;
case 3: ShowNewGRFSettings(!_networking, true, true, &_grfconfig); return;
- case 5: _display_opt ^= DO_SHOW_TOWN_NAMES; break;
- case 6: _display_opt ^= DO_SHOW_STATION_NAMES; break;
- case 7: _display_opt ^= DO_SHOW_SIGNS; break;
- case 8: _display_opt ^= DO_WAYPOINTS; break;
- case 9: _display_opt ^= DO_FULL_ANIMATION; break;
- case 10: _display_opt ^= DO_FULL_DETAIL; break;
- case 11: _display_opt ^= DO_TRANS_BUILDINGS; break;
- case 12: _display_opt ^= DO_TRANS_SIGNS; break;
+ case 5: TOGGLEBIT(_display_opt, DO_SHOW_TOWN_NAMES); break;
+ case 6: TOGGLEBIT(_display_opt, DO_SHOW_STATION_NAMES); break;
+ case 7: TOGGLEBIT(_display_opt, DO_SHOW_SIGNS); break;
+ case 8: TOGGLEBIT(_display_opt, DO_WAYPOINTS); break;
+ case 9: TOGGLEBIT(_display_opt, DO_FULL_ANIMATION); break;
+ case 10: TOGGLEBIT(_display_opt, DO_FULL_DETAIL); break;
+ case 11: ToggleTransparency(); break;
+ case 12: TOGGLEBIT(_transparent_opt, TO_SIGNS); break;
}
MarkWholeScreenDirty();
}
@@ -192,6 +210,7 @@
case 0: ShowSmallMap(); break;
case 1: ShowExtraViewPortWindow(); break;
case 2: ShowSignList(); break;
+ case 3: ShowTransparencyToolbar(); break;
}
}
@@ -206,7 +225,8 @@
case 0: ShowSmallMap(); break;
case 1: ShowExtraViewPortWindow(); break;
case 2: ShowSignList(); break;
- case 3: ShowTownDirectory(); break;
+ case 3: ShowTransparencyToolbar(); break;
+ case 4: ShowTownDirectory(); break;
}
}
@@ -291,7 +311,8 @@
static void MenuClickBuildRoad(int index)
{
- ShowBuildRoadToolbar();
+ _last_built_roadtype = (RoadType)index;
+ ShowBuildRoadToolbar(_last_built_roadtype);
}
static void MenuClickBuildWater(int index)
@@ -762,7 +783,7 @@
static void ToolbarMapClick(Window *w)
{
- PopupMainToolbMenu(w, 4, STR_02DE_MAP_OF_WORLD, 3, 0);
+ PopupMainToolbMenu(w, 4, STR_02DE_MAP_OF_WORLD, 4, 0);
}
static void ToolbarTownClick(Window *w)
@@ -861,20 +882,24 @@
switch (how) {
case ZOOM_IN:
- if (vp->zoom == 0) return false;
- vp->zoom--;
+ if (vp->zoom == ZOOM_LVL_MIN) return false;
+ vp->zoom = (ZoomLevel)((byte)vp->zoom - 1);
vp->virtual_width >>= 1;
vp->virtual_height >>= 1;
WP(w,vp_d).scrollpos_x += vp->virtual_width >> 1;
WP(w,vp_d).scrollpos_y += vp->virtual_height >> 1;
+ WP(w,vp_d).dest_scrollpos_x = WP(w,vp_d).scrollpos_x;
+ WP(w,vp_d).dest_scrollpos_y = WP(w,vp_d).scrollpos_y;
break;
case ZOOM_OUT:
- if (vp->zoom == 2) return false;
- vp->zoom++;
+ if (vp->zoom == ZOOM_LVL_MAX) return false;
+ vp->zoom = (ZoomLevel)((byte)vp->zoom + 1);
WP(w,vp_d).scrollpos_x -= vp->virtual_width >> 1;
WP(w,vp_d).scrollpos_y -= vp->virtual_height >> 1;
+ WP(w,vp_d).dest_scrollpos_x = WP(w,vp_d).scrollpos_x;
+ WP(w,vp_d).dest_scrollpos_y = WP(w,vp_d).scrollpos_y;
vp->virtual_width <<= 1;
vp->virtual_height <<= 1;
@@ -909,14 +934,16 @@
static void ToolbarBuildRailClick(Window *w)
{
const Player *p = GetPlayer(_local_player);
- Window *w2;
- w2 = PopupMainToolbMenu(w, 19, STR_1015_RAILROAD_CONSTRUCTION, RAILTYPE_END, ~p->avail_railtypes);
- WP(w2,menu_d).sel_index = _last_built_railtype;
+ Window *w2 = PopupMainToolbMenu(w, 19, STR_1015_RAILROAD_CONSTRUCTION, RAILTYPE_END, ~p->avail_railtypes);
+ WP(w2, menu_d).sel_index = _last_built_railtype;
}
static void ToolbarBuildRoadClick(Window *w)
{
- PopupMainToolbMenu(w, 20, STR_180A_ROAD_CONSTRUCTION, 1, 0);
+ const Player *p = GetPlayer(_local_player);
+ /* The standard road button is *always* available */
+ Window *w2 = PopupMainToolbMenu(w, 20, STR_180A_ROAD_CONSTRUCTION, 2, ~(p->avail_roadtypes | 1));
+ WP(w2, menu_d).sel_index = _last_built_roadtype;
}
static void ToolbarBuildWaterClick(Window *w)
@@ -955,14 +982,14 @@
w = PopupMainToolbMenu(w, 2, STR_02C3_GAME_OPTIONS, 13, 0);
- if (_display_opt & DO_SHOW_TOWN_NAMES) SETBIT(x, 5);
- if (_display_opt & DO_SHOW_STATION_NAMES) SETBIT(x, 6);
- if (_display_opt & DO_SHOW_SIGNS) SETBIT(x, 7);
- if (_display_opt & DO_WAYPOINTS) SETBIT(x, 8);
- if (_display_opt & DO_FULL_ANIMATION) SETBIT(x, 9);
- if (_display_opt & DO_FULL_DETAIL) SETBIT(x, 10);
- if (_display_opt & DO_TRANS_BUILDINGS) SETBIT(x, 11);
- if (_display_opt & DO_TRANS_SIGNS) SETBIT(x, 12);
+ if (HASBIT(_display_opt, DO_SHOW_TOWN_NAMES)) SETBIT(x, 5);
+ if (HASBIT(_display_opt, DO_SHOW_STATION_NAMES)) SETBIT(x, 6);
+ if (HASBIT(_display_opt, DO_SHOW_SIGNS)) SETBIT(x, 7);
+ if (HASBIT(_display_opt, DO_WAYPOINTS)) SETBIT(x, 8);
+ if (HASBIT(_display_opt, DO_FULL_ANIMATION)) SETBIT(x, 9);
+ if (HASBIT(_display_opt, DO_FULL_DETAIL)) SETBIT(x, 10);
+ if (GB(_transparent_opt, 1, 7) != 0) SETBIT(x, 11);
+ if (HASBIT(_transparent_opt, TO_SIGNS)) SETBIT(x, 12);
WP(w,menu_d).checked_items = x;
}
@@ -1001,7 +1028,7 @@
static void ToolbarScenMapTownDir(Window *w)
{
/* Scenario editor button, *hack*hack* use different button to activate */
- PopupMainToolbMenu(w, 8 | (17 << 8), STR_02DE_MAP_OF_WORLD, 4, 0);
+ PopupMainToolbMenu(w, 8 | (17 << 8), STR_02DE_MAP_OF_WORLD, 5, 0);
}
static void ToolbarScenZoomIn(Window *w)
@@ -1030,12 +1057,12 @@
vp = w->viewport;
if (_game_mode != GM_MENU) {
- if ((in && vp->zoom == 0) || (!in && vp->zoom == 2))
+ if ((in && vp->zoom == ZOOM_LVL_MIN) || (!in && vp->zoom == ZOOM_LVL_MAX))
return;
pt = GetTileZoomCenterWindow(in,w);
if (pt.x != -1) {
- ScrollWindowTo(pt.x, pt.y, w);
+ ScrollWindowTo(pt.x, pt.y, w, true);
DoZoomInOutWindow(in ? ZOOM_IN : ZOOM_OUT, w);
}
@@ -1109,7 +1136,7 @@
static void PlaceProc_RockyArea(TileIndex tile)
{
- VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_RockyArea);
+ VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_ROCKS);
}
static void PlaceProc_LightHouse(TileIndex tile)
@@ -1136,12 +1163,12 @@
static void PlaceProc_DesertArea(TileIndex tile)
{
- VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_DesertArea);
+ VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_DESERT);
}
static void PlaceProc_WaterArea(TileIndex tile)
{
- VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_WaterArea);
+ VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_WATER);
}
static const Widget _scen_edit_land_gen_widgets[] = {
@@ -1244,7 +1271,8 @@
/** Callback function for the scenario editor 'reset landscape' confirmation window
- * @param yes_clicked boolean value, true when yes was clicked, false otherwise */
+ * @param w Window unused
+ * @param confirmed boolean value, true when yes was clicked, false otherwise */
static void ResetLandscapeConfirmationCallback(Window *w, bool confirmed)
{
if (confirmed) {
@@ -1354,13 +1382,20 @@
_place_proc(e->we.place.tile);
break;
case WE_PLACE_DRAG:
- VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.userdata & 0xF);
+ VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
break;
case WE_PLACE_MOUSEUP:
if (e->we.place.pt.x != -1) {
- if ((e->we.place.userdata & 0xF) == VPM_X_AND_Y) // dragged actions
- GUIPlaceProcDragXY(e);
+ switch (e->we.place.select_proc) {
+ case DDSP_CREATE_ROCKS:
+ case DDSP_CREATE_DESERT:
+ case DDSP_CREATE_WATER:
+ case DDSP_LEVEL_AREA:
+ case DDSP_DEMOLISH_AREA:
+ GUIPlaceProcDragXY(e);
+ break;
+ }
}
break;
@@ -1402,7 +1437,9 @@
static void PlaceProc_Town(TileIndex tile)
{
- DoCommandP(tile, _scengen_town_size, 0, CcBuildTown, CMD_BUILD_TOWN | CMD_MSG(STR_0236_CAN_T_BUILD_TOWN_HERE));
+ uint32 size = min(_scengen_town_size, (int)TSM_CITY);
+ uint32 mode = _scengen_town_size > TSM_CITY ? TSM_CITY : TSM_FIXED;
+ DoCommandP(tile, size, mode, CcBuildTown, CMD_BUILD_TOWN | CMD_MSG(STR_0236_CAN_T_BUILD_TOWN_HERE));
}
@@ -1410,13 +1447,14 @@
{ WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
{ WWT_CAPTION, RESIZE_NONE, 7, 11, 147, 0, 13, STR_0233_TOWN_GENERATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
{ WWT_STICKYBOX, RESIZE_NONE, 7, 148, 159, 0, 13, 0x0, STR_STICKY_BUTTON},
-{ WWT_PANEL, RESIZE_NONE, 7, 0, 159, 14, 81, 0x0, STR_NULL},
+{ WWT_PANEL, RESIZE_NONE, 7, 0, 159, 14, 94, 0x0, STR_NULL},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 157, 16, 27, STR_0234_NEW_TOWN, STR_0235_CONSTRUCT_NEW_TOWN},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 157, 29, 40, STR_023D_RANDOM_TOWN, STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 157, 42, 53, STR_MANY_RANDOM_TOWNS, STR_RANDOM_TOWNS_TIP},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 53, 68, 79, STR_02A1_SMALL, STR_02A4_SELECT_TOWN_SIZE},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 54, 105, 68, 79, STR_02A2_MEDIUM, STR_02A4_SELECT_TOWN_SIZE},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 106, 157, 68, 79, STR_02A3_LARGE, STR_02A4_SELECT_TOWN_SIZE},
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 157, 81, 92, STR_SCENARIO_EDITOR_CITY, STR_02A4_SELECT_TOWN_SIZE},
{ WWT_LABEL, RESIZE_NONE, 7, 0, 147, 54, 67, STR_02A5_TOWN_SIZE, STR_NULL},
{ WIDGETS_END},
};
@@ -1429,7 +1467,7 @@
break;
case WE_CREATE:
- LowerWindowWidget(w, (_scengen_town_size - 1)+ 7);
+ LowerWindowWidget(w, _scengen_town_size + 7);
break;
case WE_CLICK:
@@ -1439,10 +1477,12 @@
break;
case 5: {// random town
Town *t;
+ uint size = min(_scengen_town_size, (int)TSM_CITY);
+ TownSizeMode mode = _scengen_town_size > TSM_CITY ? TSM_CITY : TSM_FIXED;
HandleButtonClick(w, 5);
_generating_world = true;
- t = CreateRandomTown(20, _scengen_town_size);
+ t = CreateRandomTown(20, mode, size);
_generating_world = false;
if (t == NULL) {
@@ -1462,10 +1502,10 @@
break;
}
- case 7: case 8: case 9:
- RaiseWindowWidget(w, (_scengen_town_size - 1) + 7);
- _scengen_town_size = (e->we.click.widget - 7) + 1;
- LowerWindowWidget(w, (_scengen_town_size - 1) + 7);
+ case 7: case 8: case 9: case 10:
+ RaiseWindowWidget(w, _scengen_town_size + 7);
+ _scengen_town_size = e->we.click.widget - 7;
+ LowerWindowWidget(w, _scengen_town_size + 7);
SetWindowDirty(w);
break;
}
@@ -1481,14 +1521,14 @@
break;
case WE_ABORT_PLACE_OBJ:
RaiseWindowButtons(w);
- LowerWindowWidget(w, (_scengen_town_size - 1) + 7);
+ LowerWindowWidget(w, _scengen_town_size + 7);
SetWindowDirty(w);
break;
}
}
static const WindowDesc _scen_edit_town_gen_desc = {
- WDP_AUTO, WDP_AUTO, 160, 82,
+ WDP_AUTO, WDP_AUTO, 160, 95,
WC_SCEN_TOWN_GEN, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
_scen_edit_town_gen_widgets,
@@ -1848,7 +1888,7 @@
case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
case WKC_SHIFT | WKC_F7: ShowBuildRailToolbar(_last_built_railtype, -1); break;
- case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(); break;
+ case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break;
case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break;
case WKC_SHIFT | WKC_F10:ShowBuildAirToolbar(); break;
case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break;
@@ -2330,9 +2370,24 @@
break;
#endif
+ case '1' | WKC_CTRL:
+ case '2' | WKC_CTRL:
+ case '3' | WKC_CTRL:
+ case '4' | WKC_CTRL:
+ case '5' | WKC_CTRL:
+ case '6' | WKC_CTRL:
+ case '7' | WKC_CTRL:
+ /* Transparency toggle hot keys */
+ TOGGLEBIT(_transparent_opt, e->we.keypress.keycode - ('1' | WKC_CTRL));
+ MarkWholeScreenDirty();
+ break;
+
+ case 'X' | WKC_CTRL:
+ ShowTransparencyToolbar();
+ break;
+
case 'X':
- _display_opt ^= DO_TRANS_BUILDINGS;
- MarkWholeScreenDirty();
+ ToggleTransparency();
break;
#ifdef ENABLE_NETWORK
@@ -2385,8 +2440,10 @@
_scrolling_viewport = false;
}
- WP(w, vp_d).scrollpos_x += e->we.scroll.delta.x << vp->zoom;
- WP(w, vp_d).scrollpos_y += e->we.scroll.delta.y << vp->zoom;
+ WP(w, vp_d).scrollpos_x += ScaleByZoom(e->we.scroll.delta.x, vp->zoom);
+ WP(w, vp_d).scrollpos_y += ScaleByZoom(e->we.scroll.delta.y, vp->zoom);
+ WP(w, vp_d).dest_scrollpos_x = WP(w, vp_d).scrollpos_x;
+ WP(w, vp_d).dest_scrollpos_y = WP(w, vp_d).scrollpos_y;
} break;
case WE_MOUSEWHEEL:
@@ -2420,7 +2477,7 @@
height = _screen.height;
w = AllocateWindow(0, 0, width, height, MainWindowWndProc, WC_MAIN_WINDOW, NULL);
- AssignWindowViewport(w, 0, 0, width, height, TileXY(32, 32), 0);
+ AssignWindowViewport(w, 0, 0, width, height, TileXY(32, 32), ZOOM_LVL_VIEWPORT);
/* XXX: these are not done */
switch (_game_mode) {
@@ -2474,6 +2531,7 @@
{
/* Clean old GUI values */
_last_built_railtype = RAILTYPE_RAIL;
+ _last_built_roadtype = ROADTYPE_ROAD;
}