3
* Copyright (C) 2006-2008 Battle Tanks team
3
* Copyright (C) 2006-2009 Battle Tanks team
5
5
* This program is free software; you can redistribute it and/or
6
6
* modify it under the terms of the GNU General Public License
37
38
#include "checkbox.h"
38
39
#include "sound/mixer.h"
39
40
#include "redefine_keys.h"
40
#include "gamepad_setup.h"
41
41
#include "player_manager.h"
42
42
#include "game_monitor.h"
43
43
#include "window.h"
45
#include "sdlx/joystick.h"
45
OptionsMenu::OptionsMenu(MainMenu *parent, const int w, const int h) : _parent(parent), _shoot(0.5f, false) {
47
OptionsMenu::OptionsMenu(const int w, const int h) : _shoot(0.5f, false), _gamepad(NULL) {
46
48
Mixer->loadSample("shot.ogg");
49
bool has_gamepad = sdlx::Joystick::getCount() > 0;
48
51
_background.init("menu/background_box.png", w - 100, h - 100);
54
57
_by = ( h - _background.h ) / 2;
55
58
int base_x = _bx + 3 * _background.w / 4;
57
_b_back = new Button("medium_dark", I18n->get("menu", "back"));
58
_b_back->get_size(bw, bh);
60
add(_bx + mx + _background.w / 4 - bw / 2, h - my - bh - _by, _b_back);
62
60
_b_ok = new Button("medium_dark", I18n->get("menu", "ok"));
63
61
_b_ok->get_size(bw, bh);
64
62
add(_by + my + 3 * _background.w / 4 - bw / 2, h - my - bh - _by, _b_ok);
64
_b_revert = new Button("medium_dark", I18n->get("menu", "revert-to-defaults"));
65
_b_revert->get_size(bw, bh);
66
add(_by + my + _background.w / 4 - bw / 2, h - my - bh - _by, _b_revert);
66
68
int width = _background.w - 2 * mx;
83
85
add(_bx + base_x - sw / 2, yp, _lang);
86
sp = new ControlPicker(width, "medium", I18n->get("menu", "single-player"), "player.control-method", "keys", std::string());
88
sp = new ControlPicker(width, "medium", I18n->get("menu", "single-player"), "control-method", "keys", std::string());
87
89
sp->get_size(sw, sh);
88
90
add(_bx + mx, yp, sp);
91
sp1 = new ControlPicker(width, "medium", I18n->get("menu", "split-player-1"), "player.control-method-1", "keys-1", "split");
93
sp1 = new ControlPicker(width, "medium", I18n->get("menu", "split-player-1"), "control-method-1", "keys-1", "split");
92
94
sp1->get_size(sw, sh);
93
95
add(_bx + mx, yp, sp1);
96
sp2 = new ControlPicker(width, "medium", I18n->get("menu", "split-player-2"), "player.control-method-2", "keys-2", "split");
98
sp2 = new ControlPicker(width, "medium", I18n->get("menu", "split-player-2"), "control-method-2", "keys-2", "split");
97
99
sp2->get_size(sw, sh);
98
100
add(_bx + mx, yp, sp2);
102
104
_b_redefine = new Button("medium_dark", I18n->get("menu", "redefine-keys"));
103
105
_b_redefine->get_size(sw, sh);
104
add((w - sw) / 2, yp + 6, _b_redefine);
106
add(has_gamepad? w / 2 - sw - my: (w - sw) / 2, yp + 6, _b_redefine);
109
_b_setup_gamepad = new Button("medium_dark", I18n->get("menu", "setup-gamepad"));
110
_b_setup_gamepad->get_size(sw, sh);
111
add(w / 2, yp + 6, _b_setup_gamepad);
113
_b_setup_gamepad = NULL;
107
117
//volume controls
127
137
////////////////////
129
Config->get("engine.sound.volume.fx", volume, 1.0f);
139
Config->get("engine.sound.volume.fx", volume, 0.66f);
131
141
l = new Label("medium", I18n->get("menu", "fx-volume"));
132
142
s = _fx = new Slider(volume);
196
206
_c_res->set(mrt::format_string("%dx%d", screen_w, screen_h));
197
} CATCH("default resolution setup", );
207
} CATCH("default resolution setup", {});
199
209
l = new Label("medium", I18n->get("menu", "fullscreen-mode"));
200
210
add(_bx + mx, yp, l);
246
256
add((w - sw) / 2, (h - sh) / 2, _keys);
249
_gamepad = new GamepadSetup(w, h);
250
_gamepad->get_size(sw, sh);
251
add((w - sw) / 2, (h - sh) / 2, _gamepad);
260
_gamepad = new SimpleGamepadSetup();
261
_gamepad->get_size(sw, sh);
263
add((w - sw) / 2, (h - sh) / 2, _gamepad);
259
270
void OptionsMenu::get_size(int &w, int &h) const {
261
272
h = _background.h;
264
void OptionsMenu::reload() {
265
LOG_DEBUG(("reloading options..."));
275
void OptionsMenu::revert_to_defaults() {
276
Config->remove("engine.sound.volume.music");
277
Config->remove("engine.sound.volume.fx");
278
Config->remove("engine.sound.volume.ambience");
279
Config->remove("engine.language");
280
Config->remove("engine.window.width");
281
Config->remove("engine.window.height");
282
Config->remove("engine.window.fullscreen");
283
Config->remove("engine.donate-screen-duration");
284
Config->remove("engine.fog-of-war.enabled");
288
void OptionsMenu::load() {
289
LOG_DEBUG(("loading options..."));
271
295
Config->get("engine.sound.volume.music", volume, 1.0f);
272
296
_music->set(volume);
274
Config->get("engine.sound.volume.fx", volume, 1.0f);
298
Config->get("engine.sound.volume.fx", volume, 0.66f);
275
299
_fx->set(volume);
277
301
Config->get("engine.sound.volume.ambience", volume, 0.5f);
278
302
_ambient->set(volume);
282
306
std::string lang;
283
307
if (Config->has("engine.language"))
301
325
Config->get("engine.window.width", w, 800);
302
326
Config->get("engine.window.height", h, 600);
303
327
_c_res->set(mrt::format_string("%dx%d", w, h));
304
} CATCH("default resolution setup", );
328
} CATCH("default resolution setup", {});
307
331
Config->get("engine.window.fullscreen", fs, false);
378
402
Window->initSDL();
379
403
Window->createMainWindow();
381
} CATCH("setting video mode", );
405
} CATCH("setting video mode", {});
384
408
Config->get("engine.window.fullscreen", fsmode, false);
402
426
Mixer->setFXVolume(_fx->get());
403
427
if (_shoot.tick(dt)) {
404
Mixer->setListener(v3<float>(), v3<float>(), 64);
428
Mixer->set_listener(v3<float>(), v3<float>(), 64);
405
429
Mixer->playSample(NULL, "shot.ogg", false);
414
438
_ambient->reset();
415
439
Mixer->setAmbienceVolume(_ambient->get());
441
if (_b_revert->changed()) {
443
revert_to_defaults();
417
445
if (_b_ok->changed()) {
421
} else if (_b_back->changed()) {
426
450
if (_b_redefine->changed()) {
427
451
_b_redefine->reset();
428
452
_keys->hide(false);
454
if (_b_setup_gamepad != NULL && _b_setup_gamepad->changed()) {
455
_b_setup_gamepad->reset();
456
if (_gamepad != NULL) //does not really needed
457
_gamepad->hide(false);
430
459
Container::tick(dt);