1--       _________ __                 __
2--      /   _____//  |_____________ _/  |______     ____  __ __  ______
3--      \_____  \\   __\_  __ \__  \\   __\__  \   / ___\|  |  \/  ___/
4--      /        \|  |  |  | \// __ \|  |  / __ \_/ /_/  >  |  /\___ \
5--     /_______  /|__|  |__|  (____  /__| (____  /\___  /|____//____  >
6--             \/                  \/          \//_____/            \/
7--  ______________________                           ______________________
8--                        T H E   W A R   B E G I N S
9--         Stratagus - A free fantasy real time strategy game engine
10--
11--      options.lua - Define the menu for options.
12--
13--      (c) Copyright 2006-2016 by Jimmy Salmon, Pali Rohár, Kyran Jackson and cybermind
14--
15--      This program is free software; you can redistribute it and/or modify
16--      it under the terms of the GNU General Public License as published by
17--      the Free Software Foundation; either version 2 of the License, or
18--      (at your option) any later version.
19--
20--      This program is distributed in the hope that it will be useful,
21--      but WITHOUT ANY WARRANTY; without even the implied warranty of
22--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23--      GNU General Public License for more details.
24--
25--      You should have received a copy of the GNU General Public License
26--      along with this program; if not, write to the Free Software
27--      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28--
29
30function AddSoundOptions(menu, offx, offy, centerx, bottom)
31   local b
32
33   b = menu:addLabel(_("Sound Options"), 128, 11, Fonts["game"])
34
35   b = Label(_("Effects Volume"))
36   b:setFont(CFont:Get("game"))
37   b:adjustSize();
38   menu:add(b, offx + 16, offy + 36 * 1)
39
40   local soundslider = {}
41   local soundsliderleftbutton = {}
42   local soundsliderrightbutton = {}
43   -- slider button to decrease slider value
44   soundsliderleftbutton = menu:addImageLeftSliderButton("", nil, 21, offy + 36 * 1.5,
45							 function() soundslider:setValue(soundslider:getValue() - 25.5); SetEffectsVolume(soundslider:getValue()) end)
46
47   -- slider button to increase slider value
48   soundsliderrightbutton = menu:addImageRightSliderButton("", nil, 213, offy + 36 * 1.5,
49							   function() soundslider:setValue(soundslider:getValue() + 25.5); SetEffectsVolume(soundslider:getValue()) end)
50
51   -- slider itself
52   soundslider = menu:addImageSlider(0, 255, 172, 18, offx + 41, offy + 36 * 1.5, g_marker, g_slider,
53				     function() SetEffectsVolume(soundslider:getValue()) end)
54
55   -- set the value so the game saves it
56   soundslider:setValue(GetEffectsVolume())
57
58   b = Label("min")
59   b:setFont(CFont:Get("small"))
60   b:adjustSize();
61   menu:addCentered(b, offx + 32, offy + 36 * 2 + 2)
62
63   b = Label("max")
64   b:setFont(CFont:Get("small"))
65   b:adjustSize();
66   menu:addCentered(b, offx + 224, offy + 36 * 2 + 2)
67
68   menu:addLabel(_("Sound:"), 12, 176, Fonts["game"], false)
69   menu:addLabel(_("On"), 60, 202, Fonts["game"], false)
70   menu:addLabel(_("Off"), 60, 224, Fonts["game"], false)
71
72   local effectscheckbox = {}
73   effectscheckbox = menu:addImageRadioButton("", "effectscheckbox", 37, 200, offi, offi2, oni, oni2, function()
74						 SetEffectsEnabled(true)
75						 soundslider:setEnabled(true)
76						 soundsliderrightbutton:setEnabled(true)
77						 soundsliderleftbutton:setEnabled(true)
78   end)
79   effectscheckbox:setMarked(IsEffectsEnabled())
80
81   effectscheckbox = menu:addImageRadioButton("", "effectscheckbox", 37, 222, offi, offi2, oni, oni2, function()
82						 SetEffectsEnabled(false)
83						 soundslider:setEnabled(false)
84						 soundsliderrightbutton:setEnabled(false)
85						 soundsliderleftbutton:setEnabled(false)
86   end)
87   if (IsEffectsEnabled() == true) then
88      effectscheckbox:setMarked(false)
89      soundslider:setEnabled(true)
90      soundsliderrightbutton:setEnabled(true)
91      soundsliderleftbutton:setEnabled(true)
92   else
93      effectscheckbox:setMarked(true)
94      soundslider:setEnabled(false)
95      soundsliderrightbutton:setEnabled(false)
96      soundsliderleftbutton:setEnabled(false)
97   end
98
99   b = Label(_("Music Volume"))
100   b:setFont(CFont:Get("game"))
101   b:adjustSize();
102   menu:add(b, offx + 16, offy + 36 * 2.75)
103
104   local musicslider = {}
105   local musicsliderleftbutton = {}
106   local musicsliderrightbutton = {}
107   -- slider button to decrease slider value
108   musicsliderleftbutton = menu:addImageLeftSliderButton("", nil, 21, offy + 36 * 3.25, function() musicslider:setValue(musicslider:getValue() - 25.5); SetMusicVolume(musicslider:getValue()) end)
109
110   -- slider button to decrease slider value
111   musicsliderrightbutton = menu:addImageRightSliderButton("", nil, 213, offy + 36 * 3.25, function() musicslider:setValue(musicslider:getValue() + 25.5); SetMusicVolume(musicslider:getValue()) end)
112
113   -- slider itself
114   musicslider = menu:addImageSlider(0, 255, 172, 18, offx + 41, offy + 36 * 3.25, g_marker, g_slider, function() SetMusicVolume(musicslider:getValue()) end)
115
116   -- set the value so the game saves it
117   musicslider:setValue(GetMusicVolume())
118
119   b = Label("min")
120   b:setFont(CFont:Get("small"))
121   b:adjustSize();
122   menu:addCentered(b, offx + 32, 137)
123
124   b = Label("max")
125   b:setFont(CFont:Get("small"))
126   b:adjustSize();
127   menu:addCentered(b, offx + 224, 137)
128
129   local stereoSound = menu:addImageCheckBox(_("Stereo Sound"), offx + 16, offy + 36 * 4.25, offi, offi2, oni, oni2, function() end)
130   stereoSound:setMarked(Preference.StereoSound)
131   stereoSound:setActionCallback(
132      function()
133	 Preference.StereoSound = stereoSound:isMarked()
134   end)
135
136   menu:addLabel(_("Music:"), 112, 176, Fonts["game"], false)
137   menu:addLabel(_("On"), 160, 202, Fonts["game"], false)
138   menu:addLabel(_("Off"), 160, 224, Fonts["game"], false)
139
140   local musiccheckbox = {}
141   musiccheckbox = menu:addImageRadioButton("", "musiccheckbox", 138, 200, offi, offi2, oni, oni2, function()
142					       SetMusicEnabled(true)
143					       musicslider:setEnabled(true)
144					       musicsliderrightbutton:setEnabled(true)
145					       musicsliderleftbutton:setEnabled(true)
146					       MusicStopped()
147   end)
148   musiccheckbox:setMarked(IsMusicEnabled())
149
150   musiccheckbox = menu:addImageRadioButton("", "musiccheckbox", 138, 222, offi, offi2, oni, oni2, function()
151					       SetMusicEnabled(false)
152					       musicslider:setEnabled(false)
153					       musicsliderrightbutton:setEnabled(false)
154					       musicsliderleftbutton:setEnabled(false)
155   end)
156   if (IsMusicEnabled() == true) then
157      musiccheckbox:setMarked(false)
158      musicslider:setEnabled(true)
159      musicsliderrightbutton:setEnabled(true)
160      musicsliderleftbutton:setEnabled(true)
161   else
162      musiccheckbox:setMarked(true)
163      musicslider:setEnabled(false)
164      musicsliderrightbutton:setEnabled(false)
165      musicsliderleftbutton:setEnabled(false)
166   end
167
168   b = menu:addHalfButton("~!OK", "o", 16 + 12 + 106, 288 - 40,
169			  function()
170			     wc2.preferences.EffectsVolume = GetEffectsVolume()
171			     wc2.preferences.EffectsEnabled = IsEffectsEnabled()
172			     wc2.preferences.MusicVolume = GetMusicVolume()
173			     wc2.preferences.MusicEnabled = IsMusicEnabled()
174			     wc2.preferences.StereoSound = Preference.StereoSound
175			     SavePreferences()
176			     menu:stop()
177   end)
178
179   b = menu:addHalfButton(_("Cancel (~<Esc~>)"), "escape", 16, 288 - 40,
180			  function()
181			     menu:stop()
182   end)
183end
184
185function RunGameSoundOptionsMenu()
186   local menu = WarGameMenu(panel(1))
187   menu:resize(256, 288)
188
189   AddSoundOptions(menu, 0, 0, 256/2 - 192/2, 256)
190
191   if GameCycle > 0 then
192      menu:run(false)
193   else
194      menu:run()
195   end
196end
197
198function RunPreferencesMenu()
199   local menu = WarGameMenu(panel(5))
200   menu:resize(352, 352)
201   menu:addLabel(_("Preferences"), 352 / 2, 11, Fonts["large"], true)
202
203   local row = 2;
204   local showHotkeys = menu:addImageCheckBox(_("Show Hotkeys"), 10, 10 + 18 * row,  offi, offi2, oni, oni2,
205					     function()
206   end)
207   showHotkeys:setMarked(UI.ButtonPanel.ShowCommandKey)
208   showHotkeys:setActionCallback(
209      function()
210	 UI.ButtonPanel.ShowCommandKey = showHotkeys:isMarked()
211   end)
212   row = row + 1;
213
214   local grabMouse = menu:addImageCheckBox(_("Grab Mouse"), 10, 10 + 18 * row, offi, offi2, oni, oni2, function()end)
215   grabMouse:setMarked(GetGrabMouse())
216   grabMouse:setActionCallback(
217      function()
218	 SetGrabMouse(grabMouse:isMarked())
219   end)
220   row = row + 1;
221
222   local showDamage = menu:addImageCheckBox(_("~!*Show damage"), 10, 10 + 18 * row, offi, offi2, oni, oni2, function() end)
223   showDamage:setActionCallback(
224      function()
225	 if showDamage:isMarked() == true then
226	    SetDamageMissile("missile-hit")
227	 else
228	    SetDamageMissile(nil)
229	 end
230   end)
231   showDamage:setMarked(wc2.preferences.ShowDamage)
232   row = row + 1;
233
234   local showButtonPopups = menu:addImageCheckBox(_("~!*Show button popups"), 10, 10 + 18 * row, offi, offi2, oni, oni2,
235						  function()
236   end)
237   showButtonPopups:setMarked(wc2.preferences.ShowButtonPopups)
238   row = row + 1;
239
240   local mineNotifications = menu:addImageCheckBox(_("Mine notifications"), 10, 10 + 18 * row,  offi, offi2, oni, oni2, function() end)
241   mineNotifications:setActionCallback(
242      function()
243	 Preference.MineNotifications = mineNotifications:isMarked()
244   end)
245   mineNotifications:setMarked(Preference.MineNotifications)
246   row = row + 1;
247
248   local showOrders = menu:addImageCheckBox(_("Show orders"), 10, 10 + 18 * row,  offi, offi2, oni, oni2, function() end)
249   showOrders:setActionCallback(
250      function()
251	 if showOrders:isMarked() == true then
252	    Preference.ShowOrders = 1
253	 else
254	    Preference.ShowOrders = 0
255	 end
256   end)
257   if Preference.ShowOrders > 0 then
258      showOrders:setMarked(true)
259   else
260      showOrders:setMarked(false)
261   end
262   row = row + 1;
263
264   local useFancyBuildings = menu:addImageCheckBox(_("Mirrored buildings"), 10, 10 + 18 * row,  offi, offi2, oni, oni2, function() end)
265   useFancyBuildings:setActionCallback(
266      function()
267	 SetFancyBuildings(useFancyBuildings:isMarked())
268   end)
269   useFancyBuildings:setMarked(wc2.preferences.UseFancyBuildings)
270   row = row + 1;
271
272   local showMessages = menu:addImageCheckBox(_("Show messages"), 10, 10 + 18 * row,  offi, offi2, oni, oni2, function() end)
273   showMessages:setActionCallback(
274      function()
275	 Preference.ShowMessages = showMessages:isMarked()
276   end)
277   showMessages:setMarked(wc2.preferences.ShowMessages)
278   row = row + 1;
279
280   local pauseOnLeave = menu:addImageCheckBox(_("Pause on leave"), 10, 10 + 18 * row, offi, offi2, oni, oni2, function() end)
281   pauseOnLeave:setActionCallback(
282      function()
283	 Preference.PauseOnLeave = pauseOnLeave:isMarked()
284   end)
285   pauseOnLeave:setMarked(wc2.preferences.PauseOnLeave)
286   row = row + 1;
287
288   local enhancedEffects = menu:addImageCheckBox(_("~!*Enhanced effects"), 10, 10 + 18 * row, offi, offi2, oni, oni2, function() end)
289   enhancedEffects:setMarked(wc2.preferences.EnhancedEffects)
290   row = row + 1;
291
292   local deselectInMine = menu:addImageCheckBox(_("Deselect in mines"), 10, 10 + 18 * row, offi, offi2, oni, oni2, function() end)
293   deselectInMine:setActionCallback(
294      function()
295	 Preference.DeselectInMine = deselectInMine:isMarked()
296   end)
297   deselectInMine:setMarked(wc2.preferences.DeselectInMine)
298   row = row + 1;
299
300   local fogOfWar
301   if (not IsNetworkGame()) then
302      fogOfWar = menu:addImageCheckBox(_("Fog of War"), 10, 10 + 18 * row, offi, offi2, oni, oni2, function() end)
303      fogOfWar:setActionCallback(
304	 function()
305	    SetFogOfWar(fogOfWar:isMarked())
306      end)
307      fogOfWar:setMarked(wc2.preferences.FogOfWar)
308      row = row + 1;
309   end
310
311   local simplifiedAutoTargeting
312   if (not IsNetworkGame()) then
313      simplifiedAutoTargeting = menu:addImageCheckBox(_("Simplified auto targ."),  10, 10 + 18 * row, offi, offi2, oni, oni2, function() end)
314      simplifiedAutoTargeting:setMarked(Preference.SimplifiedAutoTargeting)
315      simplifiedAutoTargeting:setActionCallback(
316	      function()
317	         Preference.SimplifiedAutoTargeting = simplifiedAutoTargeting:isMarked()
318            -- EnableSimplifiedAutoTargeting(simplifiedAutoTargeting:isMarked())
319      end)
320      row = row + 1;
321   end
322
323   local useFancyShadows = menu:addImageCheckBox(_("~!*Animated shadows"), 10, 10 + 18 * row,  offi, offi2, oni, oni2, function() end)
324   useFancyShadows:setActionCallback(
325      function()
326	 Preference.UseFancyShadows = useFancyShadows:isMarked()
327         wc2.preferences.UseFancyShadows = useFancyShadows:isMarked()
328         SavePreferences()
329   end)
330   useFancyShadows:setMarked(wc2.preferences.UseFancyShadows)
331   row = row + 1;
332
333   local selectionStyleList = {"rectangle", "alpha-rectangle", "circle", "alpha-circle", "corners"}
334   local selectionStyleList1 = {_("rectangle"), _("alpha-rectangle"), _("circle"), _("alpha-circle"), _("corners")}
335   menu:addLabel(_("Selection style:"), 225, 28 + 19 * 0, Fonts["game"], false)
336   local selectionStyle = menu:addDropDown(selectionStyleList1, 225, 28 + 19 * 1, function(dd) end)
337   selectionStyle:setSelected(tableindex(selectionStyleList, wc2.preferences.SelectionStyle) - 1)
338   selectionStyle:setActionCallback(
339      function()
340	 SetSelectionStyle(selectionStyleList[selectionStyle:getSelected() + 1])
341   end)
342   selectionStyle:setSize(120, 16)
343
344   local viewportModeList = {_("single"), _("horizontal 1 + 1"), _("horizontal 1 + 2"), _("vertical 1 + 1"), _("quad")}
345   menu:addLabel(_("Viewport mode:"), 225, 28 + 19 * 2, Fonts["game"], false)
346   local viewportMode = menu:addDropDown(viewportModeList, 225, 28 + 19 * 3, function(dd) end)
347   viewportMode:setSelected(wc2.preferences.ViewportMode)
348   viewportMode:setActionCallback(
349      function()
350	 SetNewViewportMode(viewportMode:getSelected())
351   end)
352   viewportMode:setSize(120, 16)
353
354   if GetShaderNames then
355      local shaderNames = GetShaderNames()
356      if #shaderNames > 0 then
357         menu:addLabel(_("Shader:"), 225, 28 + 19 * 4, Fonts["game"], false)
358         local shaderName = menu:addDropDown(shaderNames, 225, 28 + 19 * 5, function(dd) end)
359         local function getCurrentShaderIndex()
360            local currentShader = GetShader()
361            for idx,name in pairs(shaderNames) do
362               if name == currentShader then
363                  return idx
364               end
365            end
366         end
367         shaderName:setSelected(getCurrentShaderIndex() - 1)
368         shaderName:setActionCallback(function()
369               local newShader = shaderNames[shaderName:getSelected() + 1];
370               if SetShader(newShader) then
371                  Preference.VideoShader = newShader
372                  wc2.preferences.VideoShader = newShader
373                  SavePreferences()
374               end
375         end)
376         shaderName:setSize(120, 16)
377      end
378   end
379
380   local fogOfWarTypes    = {"tiled", "enhanced", "fast"}
381   local fogOfWarTypeList = {_("tiled"), _("enhanced"), _("fast")}
382   menu:addLabel(_("Fog of War type:"),  225, 28 + 19 * 6 + 5, Fonts["game"], false)
383   local fogOfWarType = menu:addDropDown(fogOfWarTypeList, 225, 28 + 19 * 7 + 5, function(dd) end)
384   fogOfWarType:setSelected(GetFogOfWarType())
385   fogOfWarType:setActionCallback(
386      function()
387         SetFogOfWarType(fogOfWarTypes[fogOfWarType:getSelected() + 1])
388   end)
389   fogOfWarType:setSize(120, 16)
390
391   local fowBilinear = menu:addImageCheckBox(_("Bilinear fog"), 225, 28 + 19 * 8 + 10, offi, offi2, oni, oni2, function()end)
392   fowBilinear:setMarked(GetIsFogOfWarBilinear())
393   fowBilinear:setActionCallback(
394      function()
395         SetFogOfWarBilinear(fowBilinear:isMarked())
396   end)
397
398   menu:addLabel(_("~!* - requires restart"), 10, 10 + 18 * 16, Fonts["game"], false)
399
400
401   menu:addHalfButton("~!OK", "o", 206, 352 - 40,
402		      function()
403			 wc2.preferences.GrabMouse = GetGrabMouse()
404			 wc2.preferences.ShowCommandKey = UI.ButtonPanel.ShowCommandKey
405			 wc2.preferences.MineNotifications = Preference.MineNotifications
406			 wc2.preferences.ShowDamage = showDamage:isMarked()
407			 wc2.preferences.ShowButtonPopups = showButtonPopups:isMarked()
408			 wc2.preferences.UseFancyBuildings = useFancyBuildings:isMarked()
409			 wc2.preferences.ShowMessages = Preference.ShowMessages
410			 wc2.preferences.PauseOnLeave = Preference.PauseOnLeave
411			 wc2.preferences.EnhancedEffects = enhancedEffects:isMarked()
412			 wc2.preferences.DeselectInMine = Preference.DeselectInMine
413			 wc2.preferences.SimplifiedAutoTargeting = Preference.SimplifiedAutoTargeting
414          wc2.preferences.FogOfWarType = fogOfWarTypes[fogOfWarType:getSelected() + 1]
415          wc2.preferences.FogOfWarBilinear = fowBilinear:isMarked()
416
417			 if (not IsNetworkGame()) then
418			    wc2.preferences.FogOfWar = fogOfWar:isMarked()
419			 end
420			 if Preference.ShowOrders > 0 then
421			    wc2.preferences.ShowOrders = true
422			 else
423			    wc2.preferences.ShowOrders = false
424			 end
425			 wc2.preferences.SelectionStyle = selectionStyleList[selectionStyle:getSelected() + 1]
426			 wc2.preferences.ViewportMode = viewportMode:getSelected()
427			 SavePreferences()
428			 menu:stop(1)
429   end)
430
431   menu:addHalfButton(_("Cancel (~<Esc~>)"), "escape", 40, 352 - 40,
432		      function()
433			 menu:stop()
434   end)
435   if GameCycle > 0 then
436      menu:run(false)
437   else
438      menu:run()
439   end
440end
441
442function RunDebugMenu()
443   local menu = WarGameMenu(panel(5))
444   menu:resize(352, 352)
445   menu:addLabel(_("Debug"), 352 / 2, 11, Fonts["large"], true)
446
447   local showGrid = menu:addImageCheckBox(_("Show map grid"), 10, 10 + 19 * 2,  offi, offi2, oni, oni2, function() end)
448   showGrid:setMarked(GetIsMapGridEnabled())
449   showGrid:setActionCallback(
450      function()
451         SetEnableMapGrid(showGrid:isMarked())
452   end)
453
454   -- Declared here because could be upadated by the fog of war type change
455   local fieldOfViewType
456
457   local fogOfWarTypes    = {"tiled", "enhanced", "fast"}
458   local fogOfWarTypeList = {_("tiled"), _("enhanced"), _("fast")}
459   menu:addLabel(_("Fog of War type:"), 10, 28 + 19 * 3, Fonts["game"], false)
460   local fogOfWarType = menu:addDropDown(fogOfWarTypeList, 10, 28 + 19 * 4, function(dd) end)
461   fogOfWarType:setSelected(GetFogOfWarType())
462   fogOfWarType:setActionCallback(
463      function()
464         SetFogOfWarType(fogOfWarTypes[fogOfWarType:getSelected() + 1])
465         fieldOfViewType:setSelected(GetFieldOfViewType())
466   end)
467   fogOfWarType:setSize(130, 16)
468
469   local fowBilinear = menu:addImageCheckBox(_("Bilinear interp."), 200, 28 + 19 * 4, offi, offi2, oni, oni2, function()end)
470   fowBilinear:setMarked(GetIsFogOfWarBilinear())
471   fowBilinear:setActionCallback(
472      function()
473         SetFogOfWarBilinear(fowBilinear:isMarked())
474   end)
475
476
477
478   -- if IsNetworkGame() and we are host - send according cmd to clients
479   local fieldOfViewTypes    = {"shadow-casting", "simple-radial"}
480   local fieldOfViewTypeList = {_("shadow-casting"), _("radial")}
481   menu:addLabel(_("Field of View type:"), 10, 28 + 19 * 6, Fonts["game"], false)
482   fieldOfViewType = menu:addDropDown(fieldOfViewTypeList, 10, 28 + 19 * 7, function(dd) end) -- declared earlier
483   fieldOfViewType:setSelected(GetFieldOfViewType())
484   fieldOfViewType:setActionCallback(
485      function()
486         SetFieldOfViewType(fieldOfViewTypes[fieldOfViewType:getSelected() + 1])
487         fogOfWarType:setSelected(GetFogOfWarType())
488   end)
489   fieldOfViewType:setSize(130, 16)
490
491   menu:addLabel(_("Enable opacity for:"), 200, 28 + 19 * 6, Fonts["game"], false)
492   local opaqueFores = menu:addImageCheckBox(_("Forest"), 200, 28 + 19 * 7,  offi, offi2, oni, oni2, function() end)
493   opaqueFores:setMarked(GetIsOpaqueFor("forest"))
494   opaqueFores:setActionCallback(
495      function()
496         if opaqueFores:isMarked() then
497            SetOpaqueFor("forest")
498         else
499            RemoveOpaqueFor("forest")
500         end
501   end)
502   local opaqueFores = menu:addImageCheckBox(_("Rocks"), 200, 28 + 19 * 8,  offi, offi2, oni, oni2, function() end)
503   opaqueFores:setMarked(GetIsOpaqueFor("rock"))
504   opaqueFores:setActionCallback(
505      function()
506         if opaqueFores:isMarked() then
507            SetOpaqueFor("rock")
508         else
509            RemoveOpaqueFor("rock")
510         end
511   end)
512   local opaqueFores = menu:addImageCheckBox(_("Walls"), 200, 28 + 19 * 9,  offi, offi2, oni, oni2, function() end)
513   opaqueFores:setMarked(GetIsOpaqueFor("wall"))
514   opaqueFores:setActionCallback(
515      function()
516         if opaqueFores:isMarked() then
517            SetOpaqueFor("wall")
518         else
519            RemoveOpaqueFor("wall")
520         end
521   end)
522
523   local enableWalls = menu:addImageCheckBox(_("Enable walls"), 10, 28 + 19 * 10,  offi, offi2, oni, oni2, function() end)
524   enableWalls:setMarked(GetIsWallsEnabledForSP())
525   enableWalls:setActionCallback(
526      function()
527         SetEnableWallsForSP(enableWalls:isMarked())
528   end)
529
530   local simplifiedAutoTargeting = menu:addImageCheckBox(_("Simplified auto targ."),  10, 28 + 19 * 11, offi, offi2, oni, oni2, function() end)
531   simplifiedAutoTargeting:setMarked(Preference.SimplifiedAutoTargeting)
532   simplifiedAutoTargeting:setActionCallback(
533      function()
534         EnableSimplifiedAutoTargeting(simplifiedAutoTargeting:isMarked())
535   end)
536
537
538   menu:addHalfButton("~!OK", "o", 206, 352 - 40,
539		      function()
540               wc2.preferences.MapGrid = GetIsMapGridEnabled()
541               -- Don't save other preferencies because it is just a debug menu
542               SavePreferences()
543               menu:stop(1)
544   end)
545
546   menu:addHalfButton(_("Cancel (~<Esc~>)"), "escape", 40, 352 - 40,
547         function()
548            menu:stop()
549   end)
550   if GameCycle > 0 then
551      menu:run(false)
552   else
553      menu:run()
554   end
555end
556
557function RunSpeedsMenu()
558   local menu = WarGameMenu(panel(1))
559
560   menu:addLabel(_("Speed Settings"), 128, 8, Fonts["game"])
561   menu:addLabel(_("Game Speed"), 12, 44, Fonts["game"], false)
562
563   local gamespeed = {}
564   -- slider button to decrease slider value
565   gamespeed = menu:addImageLeftSliderButton("", nil, 21, 60, function() gamespeed:setValue(gamespeed:getValue() - 5); SetGameSpeed(gamespeed:getValue()) end)
566
567   -- slider button to decrease slider value
568   gamespeed = menu:addImageRightSliderButton("", nil, 213, 60, function() gamespeed:setValue(gamespeed:getValue() + 5); SetGameSpeed(gamespeed:getValue()) end)
569
570   -- slider itself
571   gamespeed = menu:addImageSlider(15, 75, 172, 18, 41, 60, g_marker, g_slider, function() SetGameSpeed(gamespeed:getValue()) end)
572
573   -- set the value so the game saves it
574   gamespeed:setValue(GetGameSpeed())
575
576   menu:addLabel(_("slow "), 22, 80, Fonts["small"], false)
577   local l = Label(_("fast"))
578   l:setFont(Fonts["small"])
579   l:adjustSize()
580   menu:add(l, 234 - l:getWidth(), 80)
581
582   menu:addLabel(_("Mouse Scroll Speed"), 12, 112, Fonts["game"], false)
583
584   local mousescrollspeed = {}
585   -- slider button to decrease slider value
586   mousescrollspeed = menu:addImageLeftSliderButton("", nil, 21, 128, function() mousescrollspeed:setValue(mousescrollspeed:getValue() - .5); SetMouseScrollSpeed(mousescrollspeed:getValue()) end)
587
588   -- slider button to decrease slider value
589   mousescrollspeed = menu:addImageRightSliderButton("", nil, 213, 128, function() mousescrollspeed:setValue(mousescrollspeed:getValue() + .5); SetMouseScrollSpeed(mousescrollspeed:getValue()) end)
590
591   -- slider itself
592   mousescrollspeed = menu:addImageSlider(1, 10, 172, 18, 41, 128, g_marker, g_slider, function() SetMouseScrollSpeed(mousescrollspeed:getValue()) end)
593
594   -- set the value so the game saves it
595   mousescrollspeed:setValue(GetMouseScrollSpeed())
596
597   menu:addLabel(_("slow "), 22, 148, Fonts["small"], false)
598   local l = Label(_("fast"))
599   l:setFont(Fonts["small"])
600   l:adjustSize()
601   menu:add(l, 228 - l:getWidth() + 6, 148)
602
603   menu:addLabel(_("Key Scroll Speed"), 12, 180, Fonts["game"], false)
604
605   local keyscrollspeed = {}
606   -- slider button to decrease slider value
607   keyscrollspeed = menu:addImageLeftSliderButton("", nil, 21, 196, function() keyscrollspeed:setValue(keyscrollspeed:getValue() - .5); SetMouseScrollSpeed(keyscrollspeed:getValue()) end)
608
609   -- slider button to decrease slider value
610   keyscrollspeed = menu:addImageRightSliderButton("", nil, 213, 196, function() keyscrollspeed:setValue(keyscrollspeed:getValue() + .5); SetMouseScrollSpeed(keyscrollspeed:getValue()) end)
611
612   -- slider itself
613   keyscrollspeed = menu:addImageSlider(1, 10, 172, 18, 41, 196, g_marker, g_slider,
614					function()
615					   SetKeyScrollSpeed(keyscrollspeed:getValue())
616   end)
617
618   -- set the value so the game saves it
619   keyscrollspeed:setValue(GetKeyScrollSpeed())
620
621   menu:addLabel(_("slow "), 22, 216, Fonts["small"], false)
622   local l = Label(_("fast"))
623   l:setFont(Fonts["small"])
624   l:adjustSize()
625   menu:add(l, 228 - l:getWidth() + 6, 216)
626
627   menu:addHalfButton("~!OK", "o", 16 + 12 + 106, 288 - 40,
628		      function()
629			 wc2.preferences.GameSpeed = GetGameSpeed()
630			 wc2.preferences.MouseScrollSpeed = GetMouseScrollSpeed()
631			 wc2.preferences.KeyScrollSpeed = GetKeyScrollSpeed()
632			 SavePreferences()
633			 menu:stop(1)
634   end)
635
636   menu:addHalfButton(_("Cancel (~<Esc~>)"), "escape", 16, 288 - 40,
637		      function()
638			 menu:stop()
639   end)
640
641   if GameCycle > 0 then
642      menu:run(false)
643   else
644      menu:run()
645   end
646end
647
648function SetVideoSize(width, height)
649   if (Video:ResizeScreen(width, height) == false) then
650      return
651   end
652   bckground:Resize(Video.Width, Video.Height)
653   backgroundWidget = ImageWidget(bckground)
654   Load("scripts/ui.lua")
655   wc2.preferences.VideoWidth = Video.Width
656   wc2.preferences.VideoHeight = Video.Height
657   SavePreferences()
658end
659
660function BuildVideoOptionsMenu()
661   local menu = WarMenu()
662   local offx = (Video.Width - 352) / 2
663   local offy = (Video.Height - 352) / 2
664   local checkTexture
665   local b
666
667   local videoModes = {
668      640, 480,
669      800, 480,
670      720, 480,
671      720, 576,
672      800, 600,
673      1024, 600,
674      1024, 768,
675      1152, 864,
676      1280, 720,
677      1280, 768,
678      1280, 800,
679      1280, 960,
680      1280, 1024,
681      1360, 768,
682      1366, 768,
683      1440, 900,
684      1400, 1050,
685      1600, 900,
686      1600, 1200,
687      1600, 1280,
688      1680, 1050,
689      1920, 1080,
690      1920, 1200,
691      1920, 1440,
692      2560, 1600
693   }
694
695   local vlist = {}
696   for i=1,table.getn(videoModes)/2 do
697      vlist[i]=""..tostring(videoModes[i*2-1]).." x "..tostring(videoModes[i*2])..""
698   end
699
700   menu:addLabel(wargus.Name .. " V" .. wargus.Version .. ", " .. wargus.Copyright, ((Video.Width - 640) / 2 + 320), (Video.Height - 90) + 18*4, Fonts["small"]) -- Copyright information.
701
702   menu:addLabel(_("Video Options"), offx + 176, offy + 1 + 26*-2)
703   menu:addLabel(_("Video Resolution"), offx + 16, offy + 34 , Fonts["game"], false)
704
705   videoList = menu:addImageListBox(offx + 16, offy + 50, 200, 7*(table.getn(videoModes)/2+1), vlist)
706
707   local function cb(s)
708      SetVideoSize(videoModes[videoList:getSelected()*2+1], videoModes[videoList:getSelected()*2+2])
709      menu:stop(1)
710   end
711   videoList:setActionCallback(cb)
712
713   b = menu:addImageCheckBox(_("Full Screen"), offx + 17, offy + 55 + 26*7 + 14, offi, offi2, oni, oni2,
714			     function()
715				ToggleFullScreen()
716				wc2.preferences.VideoFullScreen = Video.FullScreen
717				SavePreferences()
718				menu:stop(1)
719   end)
720   b:setMarked(Video.FullScreen)
721
722   menu:addHalfButton("~!OK", "o", offx + 123, offy + 55 + 26*11 + 14, function() menu:stop() end)
723
724   return menu:run()
725end
726
727function RunConfirmRestart(menu)
728   local confirm = WarGameMenu(panel(4))
729   confirm:resize(288, 128)
730
731   local mes = MultiLineLabel(_("You need to restart game to apply changes, exit now?"))
732   mes:setFont(Fonts["game"])
733   mes:setAlignment(MultiLineLabel.CENTER)
734   mes:setVerticalAlignment(MultiLineLabel.TOP)
735   mes:setLineWidth(250)
736   mes:setWidth(288)
737   mes:setHeight(48)
738   mes:setBackgroundColor(dark)
739   confirm:add(mes, 0, 25)
740
741   confirm:addHalfButton(_("~!Yes"), "y", 1 * (300 / 3) - 90, 120 - 16 - 27,
742			 function()
743			    confirm:stop()
744			    menu:stop()
745			    Exit(0)
746   end)
747
748   confirm:addHalfButton(_("~!No"), "n", 3 * (300 / 3) - 130, 120 - 16 - 27,
749			 function() confirm:stop() end)
750
751   return confirm:run()
752end
753
754function RunLanguageMenu()
755   local menu = WarGameMenu(panel(5))
756   menu:resize(352, 352)
757   local b
758   local languageList
759
760   local langlist = {}
761   if (LanguageTable ~= nil) then
762      for i=1,table.getn(LanguageTable)/3 do
763	 langlist[i]=tostring(LanguageTable[(i-1)*3+1])
764      end
765   end
766
767   menu:addLabel(_("Language Options"), 176, 10)
768
769   menu:addLabel(_("Available languages:"), 16, 34, Fonts["game"], false)
770   languageList = menu:addImageListBox(16, 50, 300, math.max(250, 8*(table.getn(LanguageTable)/3+1)), langlist)
771
772   menu:addHalfButton("~!OK", "o", 40, 320, function()
773			 if (languageList:getSelected() >= 0) then
774			    wc2.preferences.StratagusTranslation = LanguageTable[languageList:getSelected()*3 + 2]
775			    wc2.preferences.GameTranslation = LanguageTable[languageList:getSelected()*3 + 3]
776			    SetTranslationsFiles(wc2.preferences.StratagusTranslation, wc2.preferences.GameTranslation)
777			    SavePreferences()
778			    RunConfirmRestart(menu)
779			 end
780			 menu:stop()
781   end)
782
783   menu:addHalfButton(_("Cancel (~<Esc~>)"), "escape", 206, 320, function()
784			 menu:stop()
785   end)
786
787   if GameCycle > 0 then
788      menu:run(false)
789   else
790      menu:run()
791   end
792end
793
794
795function RunVideoOptionsMenu()
796   local continue = 1
797   while (continue == 1) do
798      continue = BuildVideoOptionsMenu()
799   end
800end
801
802function RunGameOptionsMenu()
803   local menu = WarGameMenu(panel(1))
804
805   menu:addLabel(_("Game Options"), 128, 11)
806   menu:addFullButton(_("Speeds (~<F6~>)"), "f6", 16, 40 + 36*0,
807		      function() RunSpeedsMenu() end)
808   menu:addFullButton(_("Sound (~<F7~>)"), "f7", 16, 40 + 36*1,
809		      function() RunGameSoundOptionsMenu() end)
810   menu:addFullButton(_("Preferences (~<F8~>)"), "f8", 16, 40 + 36*2,
811		      function() RunPreferencesMenu() end)
812   if (GameCycle > 0) then
813      menu:addFullButton(_("Diplomacy (~<F9~>)"), "f9", 16, 40 + 36*3,
814         function() RunDiplomacyMenu() end)
815      if IsDebugEnabled then
816         menu:addFullButton(_("~<D~>ebug"), "d", 16, 40 + 36*4,
817            function() RunDebugMenu() end)
818      end
819   else
820      menu:addFullButton(_("Video (~<F9~>)"), "f9", 16, 40 + 36*3,
821			 function() RunVideoOptionsMenu() end)
822      menu:addFullButton(_("Language"), "f13", 16, 40 + 36*4,
823			 function() RunLanguageMenu() end)
824   end
825   menu:addFullButton(_("Previous (~<Esc~>)"), "escape", 128 - (224 / 2), 288 - 40,
826		      function() menu:stop() end)
827   if (GameCycle > 0) then
828      menu:run(false)
829   else
830      menu:run()
831   end
832end
833
834function RunOptionsSubMenu()
835   wargus.playlist = { "music/Orc Briefing" .. wargus.music_extension }
836   SetDefaultRaceView()
837
838   if not (IsMusicPlaying()) then
839     PlayMusic("music/Orc Briefing" .. wargus.music_extension)
840   end
841
842   local menu = WarMenu()
843   local offx = (Video.Width - 640) / 2
844   local offy = (Video.Height - 480) / 2
845
846   menu:addLabel(wargus.Name .. _(" V") .. wargus.Version .. ", " .. wargus.Copyright, offx + 320, (Video.Height - 90) + 18*4, Fonts["small"])
847
848   menu:addLabel(_("~<Game Options~>"), offx + 640/2, offy + 104 + 10)
849   menu:addFullButton(_("Speeds (~<F6~>)"), "f6", offx + 208, offy + 104 + 36*1,
850     function() RunSpeedsMenu() end)
851   menu:addFullButton(_("Sound (~<F7~>)"), "f7", offx + 208, offy + 104 + 36*2,
852                      function() RunGameSoundOptionsMenu(); end)
853   menu:addFullButton(_("Preferences (~<F8~>)"), "f8", offx + 208, offy + 104 + 36*3,
854     function() RunPreferencesMenu(); end)
855   menu:addFullButton(_("Video (~<F9~>)"), "f9", offx + 208, offy + 104 + 36*4,
856     function() RunVideoOptionsMenu(); end)
857   menu:addFullButton(_("Language"), "f13", offx + 208, offy + 104 + 36*5,
858     function() RunLanguageMenu();  end)
859
860   menu:addFullButton(_("Previous (~<Esc~>)"), "escape", offx + 208, offy + 104 + 36*7,
861     function() menu:stop() end)
862
863   return menu:run()
864 end
865