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(&current_w,&current_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