|
1 /* $Id$ */ |
|
2 |
|
3 #include "stdafx.h" |
|
4 #include "openttd.h" |
|
5 #include "table/sprites.h" |
|
6 #include "table/strings.h" |
|
7 #include "functions.h" |
|
8 #include "map.h" |
|
9 #include "window.h" |
|
10 #include "station.h" |
|
11 #include "gui.h" |
|
12 #include "viewport.h" |
|
13 #include "gfx.h" |
|
14 #include "sound.h" |
|
15 #include "command.h" |
|
16 #include "variables.h" |
|
17 |
|
18 static void ShowBuildDockStationPicker(void); |
|
19 static void ShowBuildDocksDepotPicker(void); |
|
20 |
|
21 static Axis _ship_depot_direction; |
|
22 |
|
23 void CcBuildDocks(bool success, TileIndex tile, uint32 p1, uint32 p2) |
|
24 { |
|
25 if (success) { |
|
26 SndPlayTileFx(SND_02_SPLAT, tile); |
|
27 ResetObjectToPlace(); |
|
28 } |
|
29 } |
|
30 |
|
31 void CcBuildCanal(bool success, TileIndex tile, uint32 p1, uint32 p2) |
|
32 { |
|
33 if (success) SndPlayTileFx(SND_02_SPLAT, tile); |
|
34 } |
|
35 |
|
36 |
|
37 static void PlaceDocks_Dock(TileIndex tile) |
|
38 { |
|
39 DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_DOCK | CMD_AUTO | CMD_MSG(STR_9802_CAN_T_BUILD_DOCK_HERE)); |
|
40 } |
|
41 |
|
42 static void PlaceDocks_Depot(TileIndex tile) |
|
43 { |
|
44 DoCommandP(tile, _ship_depot_direction, 0, CcBuildDocks, CMD_BUILD_SHIP_DEPOT | CMD_AUTO | CMD_MSG(STR_3802_CAN_T_BUILD_SHIP_DEPOT)); |
|
45 } |
|
46 |
|
47 static void PlaceDocks_Buoy(TileIndex tile) |
|
48 { |
|
49 DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_BUOY | CMD_AUTO | CMD_MSG(STR_9835_CAN_T_POSITION_BUOY_HERE)); |
|
50 } |
|
51 |
|
52 static void PlaceDocks_DemolishArea(TileIndex tile) |
|
53 { |
|
54 VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_DemolishArea); |
|
55 } |
|
56 |
|
57 static void PlaceDocks_BuildCanal(TileIndex tile) |
|
58 { |
|
59 VpStartPlaceSizing(tile, VPM_X_OR_Y); |
|
60 } |
|
61 |
|
62 static void PlaceDocks_BuildLock(TileIndex tile) |
|
63 { |
|
64 DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_LOCK | CMD_AUTO | CMD_MSG(STR_CANT_BUILD_LOCKS)); |
|
65 } |
|
66 |
|
67 |
|
68 enum { |
|
69 DTW_CANAL = 3, |
|
70 DTW_LOCK = 4, |
|
71 DTW_DEMOLISH = 6, |
|
72 DTW_DEPOT = 7, |
|
73 DTW_STATION = 8, |
|
74 DTW_BUOY = 9 |
|
75 }; |
|
76 |
|
77 |
|
78 static void BuildDocksClick_Canal(Window *w) |
|
79 { |
|
80 HandlePlacePushButton(w, DTW_CANAL, SPR_CURSOR_CANAL, 1, PlaceDocks_BuildCanal); |
|
81 } |
|
82 |
|
83 static void BuildDocksClick_Lock(Window *w) |
|
84 { |
|
85 HandlePlacePushButton(w, DTW_LOCK, SPR_CURSOR_LOCK, 1, PlaceDocks_BuildLock); |
|
86 } |
|
87 |
|
88 static void BuildDocksClick_Demolish(Window *w) |
|
89 { |
|
90 HandlePlacePushButton(w, DTW_DEMOLISH, ANIMCURSOR_DEMOLISH, 1, PlaceDocks_DemolishArea); |
|
91 } |
|
92 |
|
93 static void BuildDocksClick_Depot(Window *w) |
|
94 { |
|
95 if (HandlePlacePushButton(w, DTW_DEPOT, SPR_CURSOR_SHIP_DEPOT, 1, PlaceDocks_Depot)) ShowBuildDocksDepotPicker(); |
|
96 } |
|
97 |
|
98 static void BuildDocksClick_Dock(Window *w) |
|
99 { |
|
100 if (HandlePlacePushButton(w, DTW_STATION, SPR_CURSOR_DOCK, 3, PlaceDocks_Dock)) ShowBuildDockStationPicker(); |
|
101 } |
|
102 |
|
103 static void BuildDocksClick_Buoy(Window *w) |
|
104 { |
|
105 HandlePlacePushButton(w, DTW_BUOY, SPR_CURSOR_BOUY, 1, PlaceDocks_Buoy); |
|
106 } |
|
107 |
|
108 static void BuildDocksClick_Landscaping(Window *w) |
|
109 { |
|
110 ShowTerraformToolbar(); |
|
111 } |
|
112 |
|
113 typedef void OnButtonClick(Window *w); |
|
114 static OnButtonClick * const _build_docks_button_proc[] = { |
|
115 BuildDocksClick_Canal, |
|
116 BuildDocksClick_Lock, |
|
117 NULL, |
|
118 BuildDocksClick_Demolish, |
|
119 BuildDocksClick_Depot, |
|
120 BuildDocksClick_Dock, |
|
121 BuildDocksClick_Buoy, |
|
122 BuildDocksClick_Landscaping, |
|
123 }; |
|
124 |
|
125 static void BuildDocksToolbWndProc(Window *w, WindowEvent *e) |
|
126 { |
|
127 switch (e->event) { |
|
128 case WE_PAINT: |
|
129 DrawWindowWidgets(w); |
|
130 break; |
|
131 |
|
132 case WE_CLICK: |
|
133 if (e->we.click.widget - 3 >= 0 && e->we.click.widget != 5) _build_docks_button_proc[e->we.click.widget - 3](w); |
|
134 break; |
|
135 |
|
136 case WE_KEYPRESS: |
|
137 switch (e->we.keypress.keycode) { |
|
138 case '1': BuildDocksClick_Canal(w); break; |
|
139 case '2': BuildDocksClick_Lock(w); break; |
|
140 case '3': BuildDocksClick_Demolish(w); break; |
|
141 case '4': BuildDocksClick_Depot(w); break; |
|
142 case '5': BuildDocksClick_Dock(w); break; |
|
143 case '6': BuildDocksClick_Buoy(w); break; |
|
144 case 'l': BuildDocksClick_Landscaping(w); break; |
|
145 default: return; |
|
146 } |
|
147 break; |
|
148 |
|
149 case WE_PLACE_OBJ: |
|
150 _place_proc(e->we.place.tile); |
|
151 break; |
|
152 |
|
153 case WE_PLACE_DRAG: { |
|
154 VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.userdata); |
|
155 return; |
|
156 } |
|
157 |
|
158 case WE_PLACE_MOUSEUP: |
|
159 if (e->we.place.pt.x != -1) { |
|
160 if ((e->we.place.userdata & 0xF) == VPM_X_AND_Y) { // dragged actions |
|
161 GUIPlaceProcDragXY(e); |
|
162 } else if (e->we.place.userdata == VPM_X_OR_Y) { |
|
163 DoCommandP(e->we.place.tile, e->we.place.starttile, _ctrl_pressed, CcBuildCanal, CMD_BUILD_CANAL | CMD_AUTO | CMD_MSG(STR_CANT_BUILD_CANALS)); |
|
164 } |
|
165 } |
|
166 break; |
|
167 |
|
168 case WE_ABORT_PLACE_OBJ: |
|
169 RaiseWindowButtons(w); |
|
170 |
|
171 w = FindWindowById(WC_BUILD_STATION, 0); |
|
172 if (w != NULL) WP(w,def_d).close = true; |
|
173 |
|
174 w = FindWindowById(WC_BUILD_DEPOT, 0); |
|
175 if (w != NULL) WP(w,def_d).close = true; |
|
176 break; |
|
177 |
|
178 case WE_PLACE_PRESIZE: { |
|
179 TileIndex tile_from; |
|
180 TileIndex tile_to; |
|
181 |
|
182 tile_from = tile_to = e->we.place.tile; |
|
183 switch (GetTileSlope(tile_from, NULL)) { |
|
184 case SLOPE_SW: tile_to += TileDiffXY(-1, 0); break; |
|
185 case SLOPE_SE: tile_to += TileDiffXY( 0, -1); break; |
|
186 case SLOPE_NW: tile_to += TileDiffXY( 0, 1); break; |
|
187 case SLOPE_NE: tile_to += TileDiffXY( 1, 0); break; |
|
188 default: break; |
|
189 } |
|
190 VpSetPresizeRange(tile_from, tile_to); |
|
191 } break; |
|
192 |
|
193 case WE_DESTROY: |
|
194 if (_patches.link_terraform_toolbar) DeleteWindowById(WC_SCEN_LAND_GEN, 0); |
|
195 break; |
|
196 } |
|
197 } |
|
198 |
|
199 static const Widget _build_docks_toolb_widgets[] = { |
|
200 { WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, |
|
201 { WWT_CAPTION, RESIZE_NONE, 7, 11, 145, 0, 13, STR_9801_DOCK_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS}, |
|
202 { WWT_STICKYBOX, RESIZE_NONE, 7, 146, 157, 0, 13, 0x0, STR_STICKY_BUTTON}, |
|
203 { WWT_IMGBTN, RESIZE_NONE, 7, 0, 21, 14, 35, SPR_IMG_BUILD_CANAL, STR_BUILD_CANALS_TIP}, |
|
204 { WWT_IMGBTN, RESIZE_NONE, 7, 22, 43, 14, 35, SPR_IMG_BUILD_LOCK, STR_BUILD_LOCKS_TIP}, |
|
205 |
|
206 { WWT_PANEL, RESIZE_NONE, 7, 44, 47, 14, 35, 0x0, STR_NULL}, |
|
207 |
|
208 { WWT_IMGBTN, RESIZE_NONE, 7, 48, 69, 14, 35, SPR_IMG_DYNAMITE, STR_018D_DEMOLISH_BUILDINGS_ETC}, |
|
209 { WWT_IMGBTN, RESIZE_NONE, 7, 70, 91, 14, 35, SPR_IMG_SHIP_DEPOT, STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING}, |
|
210 { WWT_IMGBTN, RESIZE_NONE, 7, 92, 113, 14, 35, SPR_IMG_SHIP_DOCK, STR_981D_BUILD_SHIP_DOCK}, |
|
211 { WWT_IMGBTN, RESIZE_NONE, 7, 114, 135, 14, 35, SPR_IMG_BOUY, STR_9834_POSITION_BUOY_WHICH_CAN}, |
|
212 { WWT_IMGBTN, RESIZE_NONE, 7, 136, 157, 14, 35, SPR_IMG_LANDSCAPING, STR_LANDSCAPING_TOOLBAR_TIP}, |
|
213 { WIDGETS_END}, |
|
214 }; |
|
215 |
|
216 static const WindowDesc _build_docks_toolbar_desc = { |
|
217 WDP_ALIGN_TBR, 22, 158, 36, |
|
218 WC_BUILD_TOOLBAR, 0, |
|
219 WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON, |
|
220 _build_docks_toolb_widgets, |
|
221 BuildDocksToolbWndProc |
|
222 }; |
|
223 |
|
224 void ShowBuildDocksToolbar(void) |
|
225 { |
|
226 if (!IsValidPlayer(_current_player)) return; |
|
227 |
|
228 DeleteWindowById(WC_BUILD_TOOLBAR, 0); |
|
229 AllocateWindowDesc(&_build_docks_toolbar_desc); |
|
230 if (_patches.link_terraform_toolbar) ShowTerraformToolbar(); |
|
231 } |
|
232 |
|
233 static void BuildDockStationWndProc(Window *w, WindowEvent *e) |
|
234 { |
|
235 switch (e->event) { |
|
236 case WE_CREATE: LowerWindowWidget(w, _station_show_coverage + 3); break; |
|
237 |
|
238 case WE_PAINT: { |
|
239 int rad; |
|
240 |
|
241 if (WP(w,def_d).close) return; |
|
242 DrawWindowWidgets(w); |
|
243 |
|
244 rad = (_patches.modified_catchment) ? CA_DOCK : 4; |
|
245 |
|
246 if (_station_show_coverage) SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad); |
|
247 |
|
248 DrawStationCoverageAreaText(4, 50, (uint)-1, rad); |
|
249 break; |
|
250 } |
|
251 |
|
252 case WE_CLICK: |
|
253 switch (e->we.click.widget) { |
|
254 case 3: |
|
255 case 4: |
|
256 RaiseWindowWidget(w, _station_show_coverage + 3); |
|
257 _station_show_coverage = e->we.click.widget - 3; |
|
258 LowerWindowWidget(w, _station_show_coverage + 3); |
|
259 SndPlayFx(SND_15_BEEP); |
|
260 SetWindowDirty(w); |
|
261 break; |
|
262 } |
|
263 break; |
|
264 |
|
265 case WE_MOUSELOOP: |
|
266 if (WP(w,def_d).close) { |
|
267 DeleteWindow(w); |
|
268 return; |
|
269 } |
|
270 |
|
271 CheckRedrawStationCoverage(w); |
|
272 break; |
|
273 |
|
274 case WE_DESTROY: |
|
275 if (!WP(w,def_d).close) ResetObjectToPlace(); |
|
276 break; |
|
277 } |
|
278 } |
|
279 |
|
280 static const Widget _build_dock_station_widgets[] = { |
|
281 { WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, |
|
282 { WWT_CAPTION, RESIZE_NONE, 7, 11, 147, 0, 13, STR_3068_DOCK, STR_018C_WINDOW_TITLE_DRAG_THIS}, |
|
283 { WWT_PANEL, RESIZE_NONE, 7, 0, 147, 14, 74, 0x0, STR_NULL}, |
|
284 { WWT_TEXTBTN, RESIZE_NONE, 14, 14, 73, 30, 40, STR_02DB_OFF, STR_3065_DON_T_HIGHLIGHT_COVERAGE}, |
|
285 { WWT_TEXTBTN, RESIZE_NONE, 14, 74, 133, 30, 40, STR_02DA_ON, STR_3064_HIGHLIGHT_COVERAGE_AREA}, |
|
286 { WWT_LABEL, RESIZE_NONE, 7, 0, 147, 17, 30, STR_3066_COVERAGE_AREA_HIGHLIGHT, STR_NULL}, |
|
287 { WIDGETS_END}, |
|
288 }; |
|
289 |
|
290 static const WindowDesc _build_dock_station_desc = { |
|
291 WDP_AUTO, WDP_AUTO, 148, 75, |
|
292 WC_BUILD_STATION, WC_BUILD_TOOLBAR, |
|
293 WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, |
|
294 _build_dock_station_widgets, |
|
295 BuildDockStationWndProc |
|
296 }; |
|
297 |
|
298 static void ShowBuildDockStationPicker(void) |
|
299 { |
|
300 AllocateWindowDesc(&_build_dock_station_desc); |
|
301 } |
|
302 |
|
303 static void UpdateDocksDirection(void) |
|
304 { |
|
305 if (_ship_depot_direction != AXIS_X) { |
|
306 SetTileSelectSize(1, 2); |
|
307 } else { |
|
308 SetTileSelectSize(2, 1); |
|
309 } |
|
310 } |
|
311 |
|
312 static void BuildDocksDepotWndProc(Window *w, WindowEvent *e) |
|
313 { |
|
314 switch (e->event) { |
|
315 case WE_CREATE: LowerWindowWidget(w, _ship_depot_direction + 3); break; |
|
316 |
|
317 case WE_PAINT: |
|
318 DrawWindowWidgets(w); |
|
319 |
|
320 DrawShipDepotSprite(67, 35, 0); |
|
321 DrawShipDepotSprite(35, 51, 1); |
|
322 DrawShipDepotSprite(135, 35, 2); |
|
323 DrawShipDepotSprite(167, 51, 3); |
|
324 return; |
|
325 |
|
326 case WE_CLICK: { |
|
327 switch (e->we.click.widget) { |
|
328 case 3: |
|
329 case 4: |
|
330 RaiseWindowWidget(w, _ship_depot_direction + 3); |
|
331 _ship_depot_direction = e->we.click.widget - 3; |
|
332 LowerWindowWidget(w, _ship_depot_direction + 3); |
|
333 SndPlayFx(SND_15_BEEP); |
|
334 UpdateDocksDirection(); |
|
335 SetWindowDirty(w); |
|
336 break; |
|
337 } |
|
338 } break; |
|
339 |
|
340 case WE_MOUSELOOP: |
|
341 if (WP(w,def_d).close) DeleteWindow(w); |
|
342 break; |
|
343 |
|
344 case WE_DESTROY: |
|
345 if (!WP(w,def_d).close) ResetObjectToPlace(); |
|
346 break; |
|
347 } |
|
348 } |
|
349 |
|
350 static const Widget _build_docks_depot_widgets[] = { |
|
351 { WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, |
|
352 { WWT_CAPTION, RESIZE_NONE, 7, 11, 203, 0, 13, STR_3800_SHIP_DEPOT_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS}, |
|
353 { WWT_PANEL, RESIZE_NONE, 7, 0, 203, 14, 85, 0x0, STR_NULL}, |
|
354 { WWT_PANEL, RESIZE_NONE, 14, 3, 100, 17, 82, 0x0, STR_3803_SELECT_SHIP_DEPOT_ORIENTATION}, |
|
355 { WWT_PANEL, RESIZE_NONE, 14, 103, 200, 17, 82, 0x0, STR_3803_SELECT_SHIP_DEPOT_ORIENTATION}, |
|
356 { WIDGETS_END}, |
|
357 }; |
|
358 |
|
359 static const WindowDesc _build_docks_depot_desc = { |
|
360 WDP_AUTO, WDP_AUTO, 204, 86, |
|
361 WC_BUILD_DEPOT, WC_BUILD_TOOLBAR, |
|
362 WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, |
|
363 _build_docks_depot_widgets, |
|
364 BuildDocksDepotWndProc |
|
365 }; |
|
366 |
|
367 |
|
368 static void ShowBuildDocksDepotPicker(void) |
|
369 { |
|
370 AllocateWindowDesc(&_build_docks_depot_desc); |
|
371 UpdateDocksDirection(); |
|
372 } |
|
373 |
|
374 |
|
375 void InitializeDockGui(void) |
|
376 { |
|
377 _ship_depot_direction = AXIS_X; |
|
378 } |