1 /*
2 	This file is part of Warzone 2100.
3 	Copyright (C) 1999-2004  Eidos Interactive
4 	Copyright (C) 2005-2020  Warzone 2100 Project
5 
6 	Warzone 2100 is free software; you can redistribute it and/or modify
7 	it under the terms of the GNU General Public License as published by
8 	the Free Software Foundation; either version 2 of the License, or
9 	(at your option) any later version.
10 
11 	Warzone 2100 is distributed in the hope that it will be useful,
12 	but WITHOUT ANY WARRANTY; without even the implied warranty of
13 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 	GNU General Public License for more details.
15 
16 	You should have received a copy of the GNU General Public License
17 	along with Warzone 2100; if not, write to the Free Software
18 	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20 
21 #ifndef __INCLUDED_SRC_FRONTEND_H__
22 #define __INCLUDED_SRC_FRONTEND_H__
23 
24 #include "lib/widget/widgbase.h"
25 #include "levels.h"
26 
27 // determines which option screen to use. when in GS_TITLE_SCREEN mode.
28 enum tMode
29 {
30 	TITLE,			// 0 intro mode
31 	SINGLE,			// 1 single player menu
32 	MULTI,			// 2 multiplayer menu
33 	OPTIONS,		// 3 options menu
34 	GAME,			// 4
35 	TUTORIAL,		// 5  tutorial/fastplay
36 	TITLE_UNUSED,	// 6
37 	FORCESELECT,	// 7 MULTIPLAYER, Force design screen
38 	STARTGAME,		// 8 Fire up the game
39 	SHOWINTRO,		// 9 reshow the intro
40 	QUIT,			// 10 leaving game
41 	LOADSAVEGAME,	// 11 loading a save game
42 	KEYMAP,			// 12 keymap editor
43 	GRAPHICS_OPTIONS,       // 13 graphics options menu
44 	AUDIO_AND_ZOOM_OPTIONS, // 14 audio and zoom options menu
45 	VIDEO_OPTIONS,          // 15 video options menu
46 	MOUSE_OPTIONS,          // 16 mouse options menu
47 	CAMPAIGNS,              // 17 campaign selector
48 	MUSIC_MANAGER,			// 18 music manager
49 };
50 
51 #define MAX_LEVEL_NAME_SIZE	(256)
52 
53 extern char	aLevelName[MAX_LEVEL_NAME_SIZE + 1];	//256];			// vital! the wrf file to use.
54 
55 extern bool	bLimiterLoaded;
56 
57 
58 void changeTitleMode(tMode mode);
59 bool runTitleMenu();
60 bool runSinglePlayerMenu();
61 bool runCampaignSelector();
62 bool runMultiPlayerMenu();
63 bool runGameOptionsMenu();
64 bool runOptionsMenu();
65 bool runGraphicsOptionsMenu();
66 bool runAudioAndZoomOptionsMenu();
67 bool runVideoOptionsMenu();
68 bool runMouseOptionsMenu();
69 bool runTutorialMenu();
70 void runContinue();
71 void startTitleMenu();
72 void startTutorialMenu();
73 void startSinglePlayerMenu();
74 void startCampaignSelector();
75 void startMultiPlayerMenu();
76 void startOptionsMenu();
77 void startGraphicsOptionsMenu();
78 void startAudioAndZoomOptionsMenu();
79 void startVideoOptionsMenu();
80 void startMouseOptionsMenu();
81 void startGameOptionsMenu();
82 void refreshCurrentVideoOptionsValues();
83 
84 void addTopForm(bool wide);
85 void addBottomForm();
86 W_FORM *addBackdrop();
87 W_FORM *addBackdrop(const std::shared_ptr<W_SCREEN> &screen);
88 void addTextButton(UDWORD id, UDWORD PosX, UDWORD PosY, const std::string &txt, unsigned int style);
89 W_LABEL *addSideText(UDWORD id, UDWORD PosX, UDWORD PosY, const char *txt);
90 W_LABEL *addSideText(const std::shared_ptr<W_SCREEN> &screen, UDWORD formId, UDWORD id, UDWORD PosX, UDWORD PosY, const char *txt);
91 void addFESlider(UDWORD id, UDWORD parent, UDWORD x, UDWORD y, UDWORD stops, UDWORD pos);
92 
93 void displayTextOption(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset);
94 
95 bool CancelPressed();
96 
97 /* Tell the frontend when the screen has been resized */
98 void frontendScreenSizeDidChange(int oldWidth, int oldHeight, int newWidth, int newHeight);
99 
100 // Graphics options, shared for in-game options menu use
101 char const *graphicsOptionsFmvmodeString();
102 char const *graphicsOptionsScanlinesString();
103 char const *graphicsOptionsSubtitlesString();
104 char const *graphicsOptionsShadowsString();
105 char const *graphicsOptionsRadarString();
106 char const *graphicsOptionsRadarJumpString();
107 char const *graphicsOptionsScreenShakeString();
108 void seqFMVmode();
109 void seqScanlineMode();
110 
111 // Video options, shared for in-game options menu use
112 char const *videoOptionsDisplayScaleLabel();
113 char const *videoOptionsVsyncString();
114 std::string videoOptionsDisplayScaleString();
115 std::vector<unsigned int> availableDisplayScalesSorted();
116 void seqDisplayScale();
117 void seqVsyncMode();
118 
119 // Mouse options, shared for in-game options menu use
120 char const *mouseOptionsMflipString();
121 char const *mouseOptionsTrapString();
122 char const *mouseOptionsMbuttonsString();
123 char const *mouseOptionsMmrotateString();
124 char const *mouseOptionsCursorModeString();
125 char const *mouseOptionsScrollEventString();
126 void seqScrollEvent();
127 
128 struct DisplayTextOptionCache
129 {
130 	WzText wzText;
131 };
132 
133 
134 // ////////////////////////////////////////////////////////////////////////////
135 // defines.
136 
137 #define FRONTEND_TOPFORMX		50
138 #define FRONTEND_TOPFORMY		10
139 #define FRONTEND_TOPFORMW		540
140 #define FRONTEND_TOPFORMH		150
141 
142 
143 #define FRONTEND_TOPFORM_WIDEX	28
144 #define FRONTEND_TOPFORM_WIDEY	10
145 #define FRONTEND_TOPFORM_WIDEW	588
146 #define FRONTEND_TOPFORM_WIDEH	150
147 
148 
149 #define FRONTEND_BOTFORMX		FRONTEND_TOPFORMX
150 #define FRONTEND_BOTFORMY		170
151 #define FRONTEND_BOTFORMW		FRONTEND_TOPFORMW
152 #define FRONTEND_BOTFORMH		305				// keep Y+H < 480 (minimum display height)
153 
154 
155 #define FRONTEND_BUTWIDTH		FRONTEND_BOTFORMW-40 // text button sizes.
156 #define FRONTEND_BUTHEIGHT		35
157 
158 #define FRONTEND_POS1X			20				// button positions
159 #define FRONTEND_POS1Y			(0*FRONTEND_BUTHEIGHT)
160 #define FRONTEND_POS1M			340
161 
162 #define FRONTEND_POS2X			20
163 #define FRONTEND_POS2Y			(1*FRONTEND_BUTHEIGHT)
164 #define FRONTEND_POS2M			340
165 
166 #define FRONTEND_POS3X			20
167 #define FRONTEND_POS3Y			(2*FRONTEND_BUTHEIGHT)
168 #define FRONTEND_POS3M			340
169 
170 #define FRONTEND_POS4X			20
171 #define FRONTEND_POS4Y			(3*FRONTEND_BUTHEIGHT)
172 #define FRONTEND_POS4M			340
173 
174 #define FRONTEND_POS5X			20
175 #define FRONTEND_POS5Y			(4*FRONTEND_BUTHEIGHT)
176 #define FRONTEND_POS5M			340
177 
178 #define FRONTEND_POS6X			20
179 #define FRONTEND_POS6Y			(5*FRONTEND_BUTHEIGHT)
180 #define FRONTEND_POS6M			340
181 
182 #define FRONTEND_POS7X			20
183 #define FRONTEND_POS7Y			(6*FRONTEND_BUTHEIGHT)
184 #define FRONTEND_POS7M			340
185 
186 #define FRONTEND_POS8X			20
187 #define FRONTEND_POS8Y			(7*FRONTEND_BUTHEIGHT)
188 #define FRONTEND_POS8M			340
189 
190 #define FRONTEND_POS9X			-30				// special case for our hyperlink
191 #define FRONTEND_POS9Y			(8*FRONTEND_BUTHEIGHT)
192 
193 
194 #define FRONTEND_SIDEX			24
195 #define FRONTEND_SIDEY			FRONTEND_BOTFORMY
196 
197 enum
198 {
199 	FRONTEND_BACKDROP		= 20000,
200 	FRONTEND_TOPFORM,
201 	FRONTEND_BOTFORM,
202 	FRONTEND_LOGO,
203 	FRONTEND_SIDETEXT,					// sideways text
204 	FRONTEND_MULTILINE_SIDETEXT,				// sideways text
205 	FRONTEND_SIDETEXT1,					// sideways text
206 	FRONTEND_SIDETEXT2,					// sideways text
207 	FRONTEND_SIDETEXT3,					// sideways text
208 	FRONTEND_SIDETEXT4,					// sideways text
209 	FRONTEND_PASSWORDFORM,
210 	FRONTEND_HYPERLINK,
211 	FRONTEND_UPGRDLINK,
212 	FRONTEND_DONATELINK,
213 	FRONTEND_CHATLINK,
214 	// begin menu
215 	FRONTEND_SINGLEPLAYER	= 20100,	// title screen
216 	FRONTEND_MULTIPLAYER,
217 	FRONTEND_TUTORIAL,
218 	FRONTEND_PLAYINTRO,
219 	FRONTEND_OPTIONS,
220 	FRONTEND_QUIT,
221 	FRONTEND_FASTPLAY,					//tutorial menu option
222 	FRONTEND_CONTINUE,
223 	FRONTEND_NEWGAME		= 20200,	// single player (menu)
224 	FRONTEND_LOADGAME_MISSION,
225 	FRONTEND_LOADGAME_SKIRMISH,
226 	FRONTEND_SKIRMISH,
227 	FRONTEND_CHALLENGES,
228 	FRONTEND_HOST			= 20300,	//multiplayer menu options
229 	FRONTEND_JOIN,
230 	FE_P0,								// player 0 buton
231 	FE_P1,								// player 1 buton
232 	FE_P2,								// player 2 buton
233 	FE_P3,								// player 3 buton
234 	FE_P4,								// player 4 buton
235 	FE_P5,								// player 5 buton
236 	FE_P6,								// player 6 buton
237 	FE_P7,								// player 7 buton
238 	FE_MP_PR,  // Multiplayer player random button
239 	FE_MP_PMAX = FE_MP_PR + MAX_PLAYERS_IN_GUI,  // Multiplayer player blah button
240 
241 	FRONTEND_CAMPAIGN_1,
242 	FRONTEND_CAMPAIGN_2,
243 	FRONTEND_CAMPAIGN_3,
244 	FRONTEND_CAMPAIGN_4,
245 	FRONTEND_CAMPAIGN_5,
246 	FRONTEND_CAMPAIGN_6,
247 
248 	FRONTEND_GAMEOPTIONS = 21000,           // Game Options menu
249 	FRONTEND_LANGUAGE,
250 	FRONTEND_LANGUAGE_R,
251 	FRONTEND_COLOUR,
252 	FRONTEND_COLOUR_CAM,
253 	FRONTEND_COLOUR_MP,
254 	FRONTEND_DIFFICULTY,
255 	FRONTEND_DIFFICULTY_R,
256 	FRONTEND_CAMERASPEED,
257 	FRONTEND_CAMERASPEED_R,
258 
259 	FRONTEND_GRAPHICSOPTIONS = 22000,       // Graphics Options Menu
260 	FRONTEND_FMVMODE,
261 	FRONTEND_FMVMODE_R,
262 	FRONTEND_SCANLINES,
263 	FRONTEND_SCANLINES_R,
264 	FRONTEND_SUBTITLES,
265 	FRONTEND_SUBTITLES_R,
266 	FRONTEND_SHADOWS,
267 	FRONTEND_SHADOWS_R,
268 	FRONTEND_RADAR,
269 	FRONTEND_RADAR_R,
270 	FRONTEND_RADAR_JUMP,
271 	FRONTEND_RADAR_JUMP_R,
272 	FRONTEND_SSHAKE,
273 	FRONTEND_SSHAKE_R,
274 
275 	FRONTEND_AUDIO_AND_ZOOMOPTIONS = 23000,                 // Audio and Zoom Options Menu
276 	FRONTEND_3D_FX,						// 3d sound volume
277 	FRONTEND_FX,						// 2d (voice) sound volume
278 	FRONTEND_MUSIC,						// music volume
279 	FRONTEND_SOUND_HRTF,				// HRTF mode
280 	FRONTEND_MAP_ZOOM,					// map zoom
281 	FRONTEND_MAP_ZOOM_RATE,					// map zoom rate
282 	FRONTEND_RADAR_ZOOM,					// radar zoom rate
283 	FRONTEND_3D_FX_SL,
284 	FRONTEND_FX_SL,
285 	FRONTEND_MUSIC_SL,
286 	FRONTEND_SOUND_HRTF_R,
287 	FRONTEND_MAP_ZOOM_R,
288 	FRONTEND_MAP_ZOOM_RATE_R,
289 	FRONTEND_RADAR_ZOOM_R,
290 
291 	FRONTEND_VIDEOOPTIONS = 24000,          // video Options Menu
292 	FRONTEND_WINDOWMODE,
293 	FRONTEND_WINDOWMODE_R,
294 	FRONTEND_RESOLUTION_READONLY_LABEL,
295 	FRONTEND_RESOLUTION_READONLY,
296 	FRONTEND_RESOLUTION_DROPDOWN_LABEL,
297 	FRONTEND_RESOLUTION_DROPDOWN,
298 	FRONTEND_TEXTURESZ,
299 	FRONTEND_TEXTURESZ_R,
300 	FRONTEND_VSYNC,
301 	FRONTEND_VSYNC_R,
302 	FRONTEND_FSAA,
303 	FRONTEND_FSAA_R,
304 	FRONTEND_DISPLAYSCALE,
305 	FRONTEND_DISPLAYSCALE_R,
306 	FRONTEND_GFXBACKEND,
307 	FRONTEND_GFXBACKEND_R,
308 
309 	FRONTEND_MOUSEOPTIONS = 25000,          // Mouse Options Menu
310 	FRONTEND_CURSORMODE,
311 	FRONTEND_CURSORMODE_R,
312 	FRONTEND_TRAP,
313 	FRONTEND_TRAP_R,
314 	FRONTEND_MFLIP,
315 	FRONTEND_MFLIP_R,
316 	FRONTEND_MBUTTONS,
317 	FRONTEND_MBUTTONS_R,
318 	FRONTEND_MMROTATE,
319 	FRONTEND_MMROTATE_R,
320 	FRONTEND_SCROLLEVENT,
321 	FRONTEND_SCROLLEVENT_R,
322 
323 	FRONTEND_KEYMAP			= 26000,	// Keymap menu
324 
325 	FRONTEND_MUSICMANAGER   = 27000,	// Music manager menu
326 
327 	FRONTEND_NOGAMESAVAILABLE = 31666	// Used when no games are available in lobby
328 
329 };
330 
331 void SPinit(LEVEL_TYPE gameType);
332 
333 #endif // __INCLUDED_SRC_FRONTEND_H__
334