00001 #ifdef WIN32
00002 #include <windows.h>
00003 #else
00004 #include <unistd.h>
00005 #endif
00006 #include <GL/glut.h>
00007 #include <plib/pu.h>
00008
00009 #include "common_vars_gui.h"
00010 #include "common_vars_game.h"
00011 #include "common_gui_funcs.h"
00012
00013 #include "configuration.h"
00014
00015 #include <signal.h>
00016
00017 class MainMenu {
00018 public:
00019 MainMenu();
00020 ~MainMenu();
00021 void _display_total();
00022 void _display_graph_config();
00023 puButtonBox* fsORwindow_switch;
00024 puInput* window_width;
00025 puInput* window_height;
00026 puButtonBox* resolution_switch;
00027 puButtonBox* bpp_switch;
00028 puButtonBox* refresh_switch;
00029 puGroup* left;
00030 puGroup* right;
00031 bool test_graph_settings(char* gms);
00032 void apply_graph_settings();
00033 bool wasfs;
00034 };
00035
00036 bool MainMenu::test_graph_settings(char* gms) {
00037 if (!config->get_fullscreen())
00038 return true;
00039 glutGameModeString(gms);
00040 if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE) != -1) {
00041 return true;
00042 }
00043 return false;
00044 }
00045
00046 void MainMenu::apply_graph_settings() {
00047 int I;
00048 fsORwindow_switch->getValue(&I);
00049 config->set_fullscreen((bool)I);
00050 if (I) {
00051 char tmpg[50];
00052 int tw, th, tb, tr;
00053 tw=th=tb=tr = 0;
00054 resolution_switch->getValue(&tw);
00055 switch(tw) {
00056 case 0:
00057 tw = 640;
00058 th = 480;
00059 break;
00060 case 1:
00061 tw = 800;
00062 th = 600;
00063 break;
00064 case 2:
00065 tw = 1024;
00066 th = 768;
00067 break;
00068 case 3:
00069 tw = 1280;
00070 th = 960;
00071 break;
00072 case 4:
00073 tw = 1280;
00074 th = 1024;
00075 break;
00076 }
00077 bpp_switch->getValue(&tb);
00078 tb = (++tb) * 8;
00079
00080 refresh_switch->getValue(&tr);
00081 switch(tr) {
00082 case 0:
00083 tr = 60;
00084 break;
00085 case 1:
00086 tr = 65;
00087 break;
00088 case 2:
00089 tr = 70;
00090 break;
00091 case 3:
00092 tr = 72;
00093 break;
00094 case 4:
00095 tr = 75;
00096 break;
00097 case 5:
00098 tr = 80;
00099 break;
00100 }
00101 sprintf((char*)&tmpg, "%ix%i:%i@%i",tw, th, tb, tr);
00102 if (test_graph_settings((char*)&tmpg)) {
00103 config->set_game_mode_string((char*)&tmpg);
00104 glutEnterGameMode();
00105 _register_glutfuncs_menuonly();
00106 display_height = th;
00107 display_width = tw;
00108 }
00109 }
00110 else {
00111 window_width->getValue(&I);
00112 config->set_window_width(I);
00113 window_height->getValue(&I);
00114 config->set_window_height(I);
00115 display_width = config->get_window_width();
00116 display_height = config->get_window_height();
00117 if (wasfs) {
00118 glutLeaveGameMode();
00119 if (win_handle != -1)
00120 glutDestroyWindow(win_handle);
00121 glutInitWindowSize(config->get_window_width(), config->get_window_height());
00122 win_handle = glutCreateWindow(WINDOW_TITLE);
00123 _register_glutfuncs_menuonly();
00124 }
00125 else {
00126 glutReshapeWindow(display_width, display_height);
00127 }
00128 }
00129 _display_graph_config();
00130 }
00131 MainMenu* _mm = NULL;
00132
00133 void apply_settings_cb(puObject* e) {
00134 _mm->apply_graph_settings();
00135 }
00136
00137 void _clear_main_menu(puObject* o) {
00138 if (total_menu != NULL)
00139 total_menu->hide();
00140 if (_mm != NULL) {
00141 delete _mm;
00142 _mm = NULL;
00143 }
00144 }
00145
00146 void quit_callback(puObject* e) {
00147 _clear_main_menu(NULL);
00148 _clear_total_menu();
00149 raise(SIGINT);
00150 }
00151
00152
00153 void _make_main_menu(puObject* o) {
00154 _clear_main_menu(NULL);
00155 _mm = new MainMenu();
00156 }
00157
00158 void _show_graph_config(puObject* e) {
00159 _mm->_display_graph_config();
00160 }
00161
00162 void _switch_window2fs (puObject* p) {
00163 int i;
00164 p->getValue(&i);
00165 if (!i) {
00166 _mm->right->greyOut();
00167 _mm->right->setChildColourScheme(PUCLASS_BUTTONBOX, 0.5, 0.5, 0.5, 0.8);
00168 _mm->left->setChildColourScheme(PUCLASS_INPUT, 0.3, 0.6, 0.7, 0.8);
00169 _mm->left->activate();
00170 }
00171 else {
00172 _mm->left->greyOut();
00173 _mm->right->activate();
00174 _mm->left->setChildColourScheme(PUCLASS_INPUT, 0.5, 0.5, 0.5, 0.8);
00175 _mm->right->setChildColourScheme(PUCLASS_BUTTONBOX, 0.3, 0.6, 0.7, 0.8);
00176 }
00177 }
00178
00179 MainMenu::MainMenu() {
00180 wasfs=false;
00181 _display_total();
00182 }
00183
00184 MainMenu::~MainMenu() {
00185 }
00186
00187 void MainMenu::_display_total() {
00188 _clear_total_menu();
00189 total_menu = new puGroup(0, 0);
00190 puFrame* top_frame = new puFrame(10, display_height-10,
00191 display_width - 10, display_height - 30);
00192 top_frame->setLegend("main menu");
00193 top_frame->setColour(PUCOL_FOREGROUND, 0.2, 0.5, 0.9, 1.0);
00194
00195 puButton* new_game_button = new puButton(30, display_height/2 + 40,
00196 "new game");
00197 new_game_button->setCallback(make_char_creator);
00198 puButton* graph_config_button = new puButton(30, display_height/2,
00199 "graphic configuration");
00200 graph_config_button->setCallback(_show_graph_config);
00201
00202 puButton* quit_button = new puButton(30, display_height/2 - 40,
00203 "quit game");
00204 quit_button->setCallback(quit_callback);
00205 total_menu->close();
00206 total_menu->setChildColourScheme(PUCLASS_BUTTON, 0.3, 0.6, 0.7, 0.8);
00207 }
00208
00209 void MainMenu::_display_graph_config() {
00210 _clear_total_menu();
00211 total_menu = new puGroup(0,0);
00212 puFrame* top_frame = new puFrame(10, display_height-10,
00213 display_width - 10, display_height - 30);
00214 top_frame->setLegend("graphic configuration");
00215 top_frame->setColour(PUCOL_FOREGROUND, 0.2, 0.5, 0.9, 1.0);
00216
00217 static char* windowstr[] = { "window", "fullscreen", NULL};
00218 fsORwindow_switch = new puButtonBox(20, display_height - 110,
00219 140, display_height - 50, windowstr, 1);
00220 fsORwindow_switch->setLabel("select main viewmode");
00221 fsORwindow_switch->setCallback(_switch_window2fs);
00222 fsORwindow_switch->setValue((int)config->get_fullscreen());
00223 wasfs = config->get_fullscreen();
00224 left = new puGroup(10, display_height - 250);
00225 window_width = new puInput(10, 0, 60, 25);
00226 window_width->setLabel("width");
00227 window_width->setValue(config->get_window_width());
00228 window_width->setValidData("0123456789");
00229 window_height = new puInput(10, 35, 60, 60);
00230 window_height->setLabel("height");
00231 window_height->setValue(config->get_window_height());
00232 window_height->setValidData("0123456789");
00233 left->close();
00234
00235 right = new puGroup(display_width/2, display_height - 450);
00236
00237 char* tmpstr;
00238 tmpstr = config->get_game_mode_string();
00239
00240 resolution_switch = new puButtonBox(10, 0, 160, 120,
00241 default_resolutions, 1);
00242 resolution_switch->setLabel("screen resolution");
00243
00244 bpp_switch = new puButtonBox(10, 125, 160, 230,
00245 default_bpp, 1);
00246 bpp_switch->setLabel("colour depth");
00247
00248 refresh_switch = new puButtonBox(10, 235, 160, 350,
00249 default_refresh, 1);
00250 refresh_switch->setLabel("refresh rate");
00251 right->close();
00252
00253 if (!config->get_fullscreen()) {
00254 right->greyOut();
00255 right->setChildColourScheme(PUCLASS_BUTTONBOX, 0.5, 0.5, 0.5, 0.8);
00256 left->setChildColourScheme(PUCLASS_INPUT, 0.3, 0.6, 0.7, 0.8);
00257 }
00258 else {
00259 left->greyOut();
00260 left->setChildColourScheme(PUCLASS_INPUT, 0.5, 0.5, 0.5, 0.8);
00261 right->setChildColourScheme(PUCLASS_BUTTONBOX, 0.3, 0.6, 0.7, 0.8);
00262 }
00263
00264 puButton* test_graph_config = new puButton(30, 70, "test config");
00265 test_graph_config->setCallback(apply_settings_cb);
00266 puButton* cancel_button = new puButton(10, 10, "main menu");
00267 cancel_button->setCallback(_make_main_menu);
00268 total_menu->close();
00269 total_menu->setChildColourScheme(PUCLASS_BUTTONBOX,0.3, 0.6, 0.7, 0.8);
00270 total_menu->setChildColourScheme(PUCLASS_BUTTON,0.3, 0.6, 0.7, 0.8);
00271 }
00272