1 #include <cmath>
2 #include "gamemenu.h"
3 #include "layout.h"
4 #include "resources.h"
5 #include "game.h"
6 #include "background.h"
7
8 extern bool g_exit;
9 extern bool g_restart;
10 extern Settings *g_settings;
11 extern Layouts *g_layouts;
12 extern Mouse g_mouse;
13
GameMenu()14 GameMenu::GameMenu() :
15 m_menusystem()
16 {
17 create_menus();
18 if (g_current_game)
19 m_menusystem.switch_to_menu("main_ingame");
20 }
21
~GameMenu()22 GameMenu::~GameMenu()
23 {
24 for (unsigned int i=0;i<m_menus.size();++i)
25 delete m_menus[i];
26 }
27
create_menus(void)28 void GameMenu::create_menus(void)
29 {
30 m_menusystem = MenuSystem();
31
32 int current_w=0,current_h=0;
33 glfwGetWindowSize(¤t_w,¤t_h);
34
35 GLFWvidmode *vidmodes = new GLFWvidmode[256];
36 int nummodes = glfwGetVideoModes(vidmodes,256);
37
38 // get resolutions
39 menuoptions_t resolutions;
40 int selected_resolution=0;
41 for(int i=0,x=0;i<nummodes;++i) {
42 if ((vidmodes[i].RedBits + vidmodes[i].GreenBits + vidmodes[i].BlueBits) < 24) continue;
43 if (vidmodes[i].Width < 1024) continue;
44
45 string s = to_string<int>(vidmodes[i].Width) + "x" + to_string<int>(vidmodes[i].Height);
46 string s2 = to_string<int>(vidmodes[i].Width) + " " + to_string<int>(vidmodes[i].Height);
47 resolutions.push_back(MenuitemOption(s,s2));
48 if (vidmodes[i].Width == current_w && vidmodes[i].Height == current_h)
49 selected_resolution = x;
50
51 x++;
52 }
53 delete[] vidmodes;
54
55 // resolutions.push_back(MenuitemOption("1280x720","1280 720"));
56
57 // construct menus
58
59 menuitems_t items;
60
61 // main
62 items.push_back(Menuitem("","New Game", "", "newgame"));
63 items.push_back(Menuitem("","Settings", "", "settings"));
64 items.push_back(Menuitem("","Hiscore", "scores", ""));
65 items.push_back(Menuitem("","Credits", "credits", ""));
66 items.push_back(Menuitem("","Exit", "exit", ""));
67 Menu *m_menu = new GraphicMenu(items,g_resources.font,1.0);
68 m_menusystem.add_menu("main",m_menu); m_menus.push_back(m_menu);
69
70 // main in game
71 items.push_front(Menuitem("","Resume Game", "resumegame", ""));
72 m_menu = new GraphicMenu(items,g_resources.font,1.0);
73 m_menusystem.add_menu("main_ingame",m_menu); m_menus.push_back(m_menu);
74
75 // settings
76 items.clear();
77 items.push_back(Menuitem("","Video Settings","","videosettings"));
78 items.push_back(Menuitem("","Input Settings","","inputsettings"));
79 items.push_back(Menuitem("","Back","",":up_level"));
80 m_menu = new GraphicMenu(items,g_resources.font,1.0);
81 m_menusystem.add_menu("settings",m_menu); m_menus.push_back(m_menu);
82
83 // video settings
84 menuoptions_t boolean;
85 boolean.push_back(MenuitemOption("No","0"));
86 boolean.push_back(MenuitemOption("Yes","1"));
87
88 //menuoptions_t fsaa;
89 //fsaa.push_back(MenuitemOption("No","0"));
90 //fsaa.push_back(MenuitemOption("2x","2"));
91 //fsaa.push_back(MenuitemOption("4x","4"));
92 //// fsaa.push_back(MenuitemOption("6x","6"));
93 //// fsaa.push_back(MenuitemOption("8x","8"));
94
95 items.clear();
96 items.push_back(Menuitem("resolution","Resolution","","",resolutions,selected_resolution));
97 items.push_back(Menuitem("fullscreen","Fullscreen","","",boolean,g_settings->m_fullscreen));
98 //items.push_back(Menuitem("fsaa","Multisampling","","",fsaa,g_settings->m_fsaa/2));
99 items.push_back(Menuitem("vsync","V-sync","","",boolean,g_settings->m_vsync));
100 items.push_back(Menuitem("","Apply settings","apply_video_settings",""));
101 items.push_back(Menuitem("","Back","",":up_level"));
102 m_menu = new GraphicMenu(items,g_resources.font,1.0);
103 m_menusystem.add_menu("videosettings",m_menu); m_menus.push_back(m_menu);
104
105 menuoptions_t sensitivity;
106 for(int i=1;i<=10;++i)
107 sensitivity.push_back(MenuitemOption(to_string<int>(i),to_string<int>(i)));
108
109 items.clear();
110 items.push_back(Menuitem("mouse_sensitivity","Mouse Sensitivity","mouse_sensitivity_change","",sensitivity,(g_settings->m_mouse_sensitivity)-1));
111 items.push_back(Menuitem("","Back","",":up_level"));
112 m_menu = new GraphicMenu(items,g_resources.font,1.0);
113 m_menusystem.add_menu("inputsettings",m_menu); m_menus.push_back(m_menu);
114
115
116 // start menu
117
118 menuoptions_t layouts;
119 vector<string> names = g_layouts->get_names();
120 FOR_EACH_CONST(vector<string>,names,it)
121 layouts.push_back(MenuitemOption(*it,*it));
122
123 menuoptions_t difficulty;
124 difficulty.push_back(MenuitemOption("Easy","0"));
125 difficulty.push_back(MenuitemOption("Normal","1"));
126 difficulty.push_back(MenuitemOption("Hard","2"));
127
128 menuoptions_t waves;
129 waves.push_back(MenuitemOption("1","1"));
130 waves.push_back(MenuitemOption("5","5"));
131 waves.push_back(MenuitemOption("10","10"));
132 waves.push_back(MenuitemOption("25","25"));
133 waves.push_back(MenuitemOption("50","50"));
134
135 items.clear();
136 items.push_back(Menuitem("","Start","start_game",""));
137 items.push_back(Menuitem("difficulty","Difficulty","","",difficulty,1));
138 items.push_back(Menuitem("startingwave","Starting wave","","",waves,0));
139 items.push_back(Menuitem("layout","Theme","layout_change","",layouts,0));
140 items.push_back(Menuitem("","Back","",":up_level"));
141 m_menu = new GraphicMenu(items,g_resources.font,1.0);
142 m_menusystem.add_menu("newgame",m_menu); m_menus.push_back(m_menu);
143 }
144
process_action(str_pair_t action)145 void GameMenu::process_action(str_pair_t action)
146 {
147 string &name = action.first;
148 string &value = action.second;
149
150 if (name=="exit") {
151 g_exit = true;
152 }
153
154 if (name=="apply_video_settings") {
155 // collect save settings
156 Menu *m = m_menusystem.str_to_menup("videosettings");
157 map_str_str_t opts = m->collect_options();
158
159 stringstream s(opts["resolution"]);
160 s >> g_settings->m_res_x >> g_settings->m_res_y;
161 // g_settings->m_fsaa = from_string<int>(opts["fsaa"]);
162 g_settings->m_vsync = (from_string<int>(opts["vsync"]) ? true : false);
163 g_settings->m_fullscreen = (from_string<int>(opts["fullscreen"]) ? true : false);
164
165 // set for restart
166 g_restart = true;
167 g_exit = true;
168 }
169
170 if (name=="layout_change") {
171 g_layouts->set_layout(value);
172 }
173
174 if (name=="mouse_sensitivity_change") {
175 int sens = from_string<int>(value);
176 g_settings->m_mouse_sensitivity = sens;
177 g_mouse.set_accel(sens);
178 }
179
180 if (name=="credits") {
181 g_mode = MODE_CREDITS;
182 }
183
184 if (name=="scores") {
185 g_mode = MODE_SCORES;
186 }
187
188 if (name=="start_game") {
189 Menu *m = m_menusystem.str_to_menup("newgame");
190 map_str_str_t opts = m->collect_options();
191
192 int difficulty = from_string<int>(opts["difficulty"]);
193 int wave = from_string<int>(opts["startingwave"]);
194
195 // m_menusystem.up_level();
196 m_menusystem.switch_to_menu("main_ingame");
197
198 delete g_current_game;
199 g_current_game = new Game(difficulty,wave);
200 g_mode = MODE_GAME;
201 g_timer->unpause();
202 }
203
204 if (name=="resumegame") {
205 g_mode = MODE_GAME;
206 g_timer->unpause();
207 }
208 }
209
draw(void)210 void GameMenu::draw(void)
211 {
212 m_menusystem.draw(vec2(0.0,0.45f),true);
213 }
214
mouse_action(int button)215 void GameMenu::mouse_action(int button)
216 {
217 m_menusystem.mouse_action(button);
218
219 vec_str_pair_t actions = m_menusystem.get_pending_actions();
220 FOR_EACH_CONST(vec_str_pair_t,actions,it)
221 process_action(*it);
222 }
223
mouse_moved(void)224 void GameMenu::mouse_moved(void) { m_menusystem.mouse_moved(); }
mouse_wheel(int dir)225 void GameMenu::mouse_wheel(int dir) { m_menusystem.mouse_wheel(dir);}
226
key_action(int key)227 void GameMenu::key_action(int key)
228 {
229 bool topexit = m_menusystem.key_action(key);
230
231 if (topexit) {
232 if (g_current_game) {
233 g_mode = MODE_GAME;
234 g_timer->unpause();
235 } else {
236 g_exit = true;
237 }
238 }
239
240 vec_str_pair_t actions = m_menusystem.get_pending_actions();
241 FOR_EACH_CONST(vec_str_pair_t,actions,it)
242 process_action(*it);
243 }
244
switch_to_item(const int item)245 void GameMenu::switch_to_item(const int item)
246 {
247 m_menusystem.switch_to_item(item);
248 }
249
switch_to_menu(const string & menu)250 void GameMenu::switch_to_menu(const string& menu)
251 {
252 m_menusystem.switch_to_menu(menu);
253 }
254