/* * Seven Kingdoms: Ancient Adversaries * * Copyright 1997,1998 Enlight Software Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ //Filename : OGAMMAIN.CPP //Description : Main Game Object - Main menu #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef DEMO #define DISABLE_MULTI_PLAYER #define DISABLE_SINGLE_PLAYER_NEW_GAME #endif //----------- Define structure ---------// struct OptionInfo { short x1, y1, x2, y2; }; // -------- define constant ----------// enum { SWORD1_X = 258, SWORD1_Y = 194 }; //---------- Begin of function Game::main_menu ----------// // void Game::main_menu() { enum { MAIN_OPTION_COUNT = 6 }; static OptionInfo main_option_array[MAIN_OPTION_COUNT] = { { 6+SWORD1_X, 11+SWORD1_Y, 282+SWORD1_X , 63+SWORD1_Y }, { 6+SWORD1_X, 68+SWORD1_Y, 282+SWORD1_X , 113+SWORD1_Y }, { 6+SWORD1_X, 121+SWORD1_Y, 282+SWORD1_X , 176+SWORD1_Y }, // ####### begin Gilbert 20/10 ######// // { 6+SWORD1_X, 189+SWORD1_Y, 282+SWORD1_X , 219+SWORD1_Y }, { 6+SWORD1_X, 184+SWORD1_Y, 282+SWORD1_X , 222+SWORD1_Y }, // ####### end Gilbert 20/10 ######// { 6+SWORD1_X, 224+SWORD1_Y, 282+SWORD1_X , 295+SWORD1_Y }, {40+SWORD1_X, 297+SWORD1_Y, 254+SWORD1_X , 337+SWORD1_Y }, }; char main_option_flag[MAIN_OPTION_COUNT] = { 1, 1, 1, 1, 1, 1, }; // test sys.game_version, skip single player main_option_flag[0] = (sys.game_version == VERSION_MULTIPLAYER_ONLY) ? 0 : 1; // main_option_flag[0] = 1; // ###### begin Gilbert 25/9 #######// #ifdef DISABLE_MULTI_PLAYER // disable multiplayer game, Game::multi_player_menu is disabled main_option_flag[1] = 0; #endif // ###### end Gilbert 25/9 #######// // skip encyclopedia if not found main_option_flag[2] = *sys.dir_encyc ? 1 : 0; //------------- display menu options -------------// int refreshFlag=1, i; mouse_cursor.set_icon(CURSOR_NORMAL); vga_front.bar(0,0,VGA_WIDTH-1,VGA_HEIGHT-1,V_BLACK); OptionInfo* optionInfo; char *menuBitmap = NULL; char *brightBitmap = NULL; char *darkBitmap = NULL; int pointingOption = -1; while(1) { game_mode = GAME_PREGAME; //------- Display game title and paint menu box --------// if( refreshFlag ) { mouse_cursor.set_icon(CURSOR_NORMAL); image_interface.put_to_buf( &vga_back, "M_MAIN" ); vga.blt_buf(0,0,VGA_WIDTH-1,VGA_HEIGHT-1); // blt the main menu screen from the back buffer to the front buffer disp_version(); if(!menuBitmap) { int resSize; File *resFile; resFile = image_interface.get_file("SWRD-1", resSize); menuBitmap = mem_add(resSize); resFile->file_read(menuBitmap, resSize); } if(!brightBitmap) { int resSize; File *resFile; resFile = image_interface.get_file("SWRD-1B", resSize); brightBitmap = mem_add(resSize); resFile->file_read(brightBitmap, resSize); } if(!darkBitmap) { int resSize; File *resFile; resFile = image_interface.get_file("SWRD-1C", resSize); darkBitmap = mem_add(resSize); resFile->file_read(darkBitmap, resSize); } for( i = 0; i < MAIN_OPTION_COUNT; ++i ) { if( main_option_flag[i] >= 0 ) { mouse.hide_area(main_option_array[i].x1, main_option_array[i].y1, main_option_array[i].x2, main_option_array[i].y2); vga_front.put_bitmap_area(SWORD1_X, SWORD1_Y, main_option_flag[i] ? menuBitmap : darkBitmap, main_option_array[i].x1 - SWORD1_X, main_option_array[i].y1 - SWORD1_Y, main_option_array[i].x2 - SWORD1_X, main_option_array[i].y2 - SWORD1_Y); mouse.show_area(); } } pointingOption = -1; refreshFlag=0; } if( config.music_flag ) { if( !music.is_playing(1) ) music.play(1, sys.cdrom_drive ? MUSIC_CD_THEN_WAV : 0 ); } else { music.stop(); } // display main menu int newPointingOption = -1; for(i = 0, optionInfo = main_option_array; i < MAIN_OPTION_COUNT; ++i, ++optionInfo) { if( main_option_flag[i] > 0 && mouse.in_area(optionInfo->x1, optionInfo->y1, optionInfo->x2, optionInfo->y2) ) { newPointingOption = i; break; } } if( pointingOption != newPointingOption) { err_when( !menuBitmap ); err_when( !brightBitmap ); err_when( !darkBitmap ); // put un-highlighted option back i = pointingOption; if( i >= 0 && i < MAIN_OPTION_COUNT ) { mouse.hide_area(main_option_array[i].x1, main_option_array[i].y1, main_option_array[i].x2, main_option_array[i].y2); vga_front.put_bitmap_area(SWORD1_X, SWORD1_Y, menuBitmap, main_option_array[i].x1 - SWORD1_X, main_option_array[i].y1 - SWORD1_Y, main_option_array[i].x2 - SWORD1_X, main_option_array[i].y2 - SWORD1_Y); mouse.show_area(); } // put new hightlighted option i = newPointingOption; if( i >= 0 && i < MAIN_OPTION_COUNT ) { mouse.hide_area(main_option_array[i].x1, main_option_array[i].y1, main_option_array[i].x2, main_option_array[i].y2); vga_front.put_bitmap_area(SWORD1_X, SWORD1_Y, brightBitmap, main_option_array[i].x1 - SWORD1_X, main_option_array[i].y1 - SWORD1_Y, main_option_array[i].x2 - SWORD1_X, main_option_array[i].y2 - SWORD1_Y); mouse.show_area(); } pointingOption = newPointingOption; } // ######### end Gilbert 23/7 ##########// sys.blt_virtual_buf(); // blt the virtual front buffer to the screen //---------- detect buttons -----------// sys.yield(); mouse.get_event(); optionInfo = main_option_array; sys.signal_exit_flag = 0; for( i=0 ; i 0 && mouse.single_click( optionInfo->x1, optionInfo->y1, optionInfo->x2, optionInfo->y2 ) ) { // ------- free some resource for a moment --------// if( menuBitmap ) { mem_del(menuBitmap); menuBitmap = NULL; } if( brightBitmap) { mem_del(brightBitmap); brightBitmap = NULL; } if( darkBitmap) { mem_del(darkBitmap); darkBitmap = NULL; } run_main_menu_option(i+1); refreshFlag=1; break; } } //-------------------------------------// if( sys.signal_exit_flag == 1 || i == MAIN_OPTION_COUNT-1 ) // quit the system now break; } //--------------------------------------// music.stop(); if( menuBitmap ) mem_del(menuBitmap); if( brightBitmap) mem_del(brightBitmap); if( darkBitmap) mem_del(darkBitmap); //--------------------------------------// } //------------ End of function Game::main_menu -----------// //-------- Begin of function Game::run_main_menu_option --------// // // Run the selected game option. // void Game::run_main_menu_option(int optionId) { //------- Single Player Game -------// if( optionId==1 ) { single_player_menu(); } //-------- Multiplayer Game ----------// if( optionId==2 ) { #ifndef DISABLE_MULTI_PLAYER game_mode = GAME_MULTI_PLAYER; multi_player_menu(NULL); // multi_player_game(); #endif } //----------- Encyclopedia -----------// if( optionId==3 ) { game_mode = GAME_ENCYCLOPEDIA; view_encyclopedia(); } //----------- Hall of Fame -----------// if( optionId==4 ) { game_file_array.disp_hall_of_fame(); } //------------- Credits -----------// // ####### begin Gilbert 2/9 #######// if( optionId==5 ) { if( m.is_file_exist("TESTING2.SYS") ) { game_mode = GAME_TEST; // testing game instead test_game(); } else { game_mode = GAME_CREDITS; view_credits(); } } // ####### end Gilbert 2/9 #######// // ####### begin Gilbert 7/11 #########// if( optionId==6 ) { sys.signal_exit_flag = 1; } // ####### end Gilbert 7/11 #########// } //---------- End of function Game::run_main_menu_option ---------// //-------- Begin of static function disp_version --------// // void Game::disp_version() { //----------- display version string --------// String str; str = "Version "; str += GAME_VERSION_STR; #ifdef DEMO str = "Demo Version"; #endif #ifdef BETA str = "This is a Beta version. Unauthorized distribution of this Beta is illegal."; #endif if( str.len() > 40 ) font_news.center_put( 0, VGA_HEIGHT-20, VGA_WIDTH-1, VGA_HEIGHT-1, str ); else font_news.right_put( VGA_WIDTH-10, VGA_HEIGHT-20, str ); } //---------- End of function Game::disp_version ---------// //---------- Begin of function Game::single_player_menu ----------// // void Game::single_player_menu() { enum { SINGLE_PLAYER_OPTION_COUNT = 5 }; #ifndef DISABLE_SINGLE_PLAYER_NEW_GAME static OptionInfo single_player_option_array[SINGLE_PLAYER_OPTION_COUNT] = { { 5+SWORD1_X, 10+SWORD1_Y, 282+SWORD1_X, 62+SWORD1_Y }, { 5+SWORD1_X, 67+SWORD1_Y, 282+SWORD1_X, 112+SWORD1_Y }, { 5+SWORD1_X, 120+SWORD1_Y, 282+SWORD1_X, 175+SWORD1_Y }, { 5+SWORD1_X, 182+SWORD1_Y, 282+SWORD1_X, 223+SWORD1_Y }, {40+SWORD1_X, 238+SWORD1_Y, 254+SWORD1_X, 280+SWORD1_Y }, }; static char single_player_option_flag[SINGLE_PLAYER_OPTION_COUNT] = { 1, 1, 1, 1, 1, // 1 = in use, 0 = darken, -1 = invisible }; #else static OptionInfo single_player_option_array[SINGLE_PLAYER_OPTION_COUNT] = { { 2+SWORD1_X, 10+SWORD1_Y, 286+SWORD1_X, 65+SWORD1_Y }, { 2+SWORD1_X, 67+SWORD1_Y, 286+SWORD1_X, 109+SWORD1_Y }, { 2+SWORD1_X, 112+SWORD1_Y, 286+SWORD1_X, 171+SWORD1_Y }, { 2+SWORD1_X, 112+SWORD1_Y, 286+SWORD1_X, 171+SWORD1_Y }, // not used {38+SWORD1_X, 174+SWORD1_Y, 256+SWORD1_X, 216+SWORD1_Y }, }; static char single_player_option_flag[SINGLE_PLAYER_OPTION_COUNT] = { 1, 1, 1, -1, 1, // 1 = in use, 0 = darken, -1 = invisible }; #endif game_mode = GAME_SINGLE_PLAYER; //------ display the single player menu options ------// // image_interface.put_large( &vga_back, 247, 242, "M_SINGLE" ); // vga.blt_buf(247, 242, 545, 567); // sys.blt_virtual_buf(); // blt the virtual front buffer to the screen int refreshFlag = 1, i; mouse_cursor.set_icon(CURSOR_NORMAL); char *menuBitmap = NULL; char *brightBitmap = NULL; char *darkBitmap = NULL; int pointingOption = -1; //---------- detect buttons -----------// while(1) { sys.yield(); mouse.get_event(); if( refreshFlag ) { image_interface.put_to_buf( &vga_back, "M_MAIN" ); vga.blt_buf(0,0,VGA_WIDTH-1, VGA_HEIGHT-1); if(!menuBitmap) { int resSize; File *resFile; #ifndef DISABLE_SINGLE_PLAYER_NEW_GAME resFile = image_interface.get_file("SWRD-2", resSize); #else resFile = image_interface.get_file("SWRD-4", resSize); #endif menuBitmap = mem_add(resSize); resFile->file_read(menuBitmap, resSize); } if(!brightBitmap) { int resSize; File *resFile; #ifndef DISABLE_SINGLE_PLAYER_NEW_GAME resFile = image_interface.get_file("SWRD-2B", resSize); #else resFile = image_interface.get_file("SWRD-4B", resSize); #endif brightBitmap = mem_add(resSize); resFile->file_read(brightBitmap, resSize); } if(!darkBitmap) { int resSize; File *resFile; #ifndef DISABLE_SINGLE_PLAYER_NEW_GAME resFile = image_interface.get_file("SWRD-2C", resSize); #else resFile = image_interface.get_file("SWRD-2C", resSize); // no SWRD-4C #endif darkBitmap = mem_add(resSize); resFile->file_read(darkBitmap, resSize); } for( i = 0; i < SINGLE_PLAYER_OPTION_COUNT; ++i ) { if( single_player_option_flag[i] >= 0) { mouse.hide_area(single_player_option_array[i].x1, single_player_option_array[i].y1, single_player_option_array[i].x2, single_player_option_array[i].y2); vga_front.put_bitmap_area(SWORD1_X, SWORD1_Y, single_player_option_flag[i] ? menuBitmap : darkBitmap, single_player_option_array[i].x1 - SWORD1_X, single_player_option_array[i].y1 - SWORD1_Y, single_player_option_array[i].x2 - SWORD1_X, single_player_option_array[i].y2 - SWORD1_Y); mouse.show_area(); } } pointingOption = -1; refreshFlag=0; } // ###### begin Gilbert 18/9 ########// if( config.music_flag ) { if( !music.is_playing(1) ) music.play(1, sys.cdrom_drive ? MUSIC_CD_THEN_WAV : 0 ); } else music.stop(); // ###### end Gilbert 18/9 ########// // display main menu int newPointingOption = -1; for(i = 0; i < SINGLE_PLAYER_OPTION_COUNT; ++i) { if( single_player_option_flag[i] > 0 && mouse.in_area(single_player_option_array[i].x1, single_player_option_array[i].y1, single_player_option_array[i].x2, single_player_option_array[i].y2) ) { newPointingOption = i; break; } } if( pointingOption != newPointingOption) { err_when( !menuBitmap ); err_when( !brightBitmap ); err_when( !darkBitmap ); // put un-highlighted option back i = pointingOption; if( i >= 0 && i < SINGLE_PLAYER_OPTION_COUNT ) { mouse.hide_area(single_player_option_array[i].x1, single_player_option_array[i].y1, single_player_option_array[i].x2, single_player_option_array[i].y2); vga_front.put_bitmap_area(SWORD1_X, SWORD1_Y, menuBitmap, single_player_option_array[i].x1 - SWORD1_X, single_player_option_array[i].y1 - SWORD1_Y, single_player_option_array[i].x2 - SWORD1_X, single_player_option_array[i].y2 - SWORD1_Y); mouse.show_area(); } // put new hightlighted option i = newPointingOption; if( i >= 0 && i < SINGLE_PLAYER_OPTION_COUNT ) { mouse.hide_area(single_player_option_array[i].x1,single_player_option_array[i].y1, single_player_option_array[i].x2,single_player_option_array[i].y2); vga_front.put_bitmap_area(SWORD1_X, SWORD1_Y, brightBitmap, single_player_option_array[i].x1 -SWORD1_X,single_player_option_array[i].y1 -SWORD1_Y, single_player_option_array[i].x2 -SWORD1_X,single_player_option_array[i].y2 -SWORD1_Y); mouse.show_area(); } pointingOption = newPointingOption; } sys.blt_virtual_buf(); // blt the virtual front buffer to the screen OptionInfo* optionInfo = single_player_option_array; for( int i=0 ; i 0 && mouse.single_click( optionInfo->x1, optionInfo->y1, optionInfo->x2, optionInfo->y2 ) ) { // free some resource if( menuBitmap ) { mem_del(menuBitmap); menuBitmap = NULL; } if( brightBitmap ) { mem_del(brightBitmap); brightBitmap = NULL; } if( darkBitmap ) { mem_del(darkBitmap); darkBitmap = NULL; } refreshFlag = 1; switch(i+1) { case 1: tutor.select_run_tutor(0); // select and run tutorial, 0-called from the main menu, not from in-game break; case 2: #ifndef DEMO single_player_game(0); #else select_run_scenario(); #endif break; case 3: game_file_array.init("*.SAV"); if( game_file_array.menu(2) == 1) { battle.run_loaded(); deinit(); } { char signalExitFlagBackup = sys.signal_exit_flag; sys.signal_exit_flag = 2; game.deinit(); // game.deinit() is needed if game_file_array.menu fails sys.signal_exit_flag = signalExitFlagBackup; } break; case 4: select_run_scenario(); break; } return; } } } if( menuBitmap ) mem_del(menuBitmap); if( brightBitmap ) mem_del(brightBitmap); if( darkBitmap ) mem_del(darkBitmap); } //------------ End of function Game::single_player_menu -----------// //-------- Begin of function Game::test_game --------// // // noAI - if there should be no AI in the game. // void Game::test_game() { init(); battle.run_test(); deinit(); } //--------- End of function Game::test_game ---------// #ifndef DISABLE_MULTI_PLAYER //---------- Begin of function Game::multi_player_menu ----------// // // ####### begin Gilbert 13/2 ########// void Game::multi_player_menu(char *cmdLine) // ####### end Gilbert 13/2 ########// { enum { MULTI_PLAYER_OPTION_COUNT = 5 }; static OptionInfo multi_player_option_array[MULTI_PLAYER_OPTION_COUNT] = { { 5+SWORD1_X, 10+SWORD1_Y, 282+SWORD1_X, 62+SWORD1_Y }, { 5+SWORD1_X, 67+SWORD1_Y, 282+SWORD1_X, 112+SWORD1_Y }, { 5+SWORD1_X, 120+SWORD1_Y, 282+SWORD1_X, 175+SWORD1_Y }, { 5+SWORD1_X, 182+SWORD1_Y, 282+SWORD1_X, 223+SWORD1_Y }, {40+SWORD1_X, 238+SWORD1_Y, 254+SWORD1_X, 280+SWORD1_Y }, }; static char multi_player_option_flag[MULTI_PLAYER_OPTION_COUNT] = { -1, 1, 1, -1, 1, }; game_mode = GAME_MULTI_PLAYER; //------ display the multi player menu options ------// int refreshFlag = 1, i; mouse_cursor.set_icon(CURSOR_NORMAL); char *menuBitmap = NULL; char *brightBitmap = NULL; char *darkBitmap = NULL; int pointingOption = -1; //---------- detect buttons -----------// while(1) { sys.yield(); mouse.get_event(); if( refreshFlag ) { image_interface.put_to_buf( &vga_back, "M_MAIN" ); vga.blt_buf(0,0,VGA_WIDTH-1, VGA_HEIGHT-1); if(!menuBitmap) { int resSize; File *resFile; resFile = image_interface.get_file("SWRD-2", resSize); menuBitmap = mem_add(resSize); resFile->file_read(menuBitmap, resSize); } if(!brightBitmap) { int resSize; File *resFile; resFile = image_interface.get_file("SWRD-2B", resSize); brightBitmap = mem_add(resSize); resFile->file_read(brightBitmap, resSize); } if(!darkBitmap) { int resSize; File *resFile; resFile = image_interface.get_file("SWRD-2C", resSize); darkBitmap = mem_add(resSize); resFile->file_read(darkBitmap, resSize); } for( i = 0; i < MULTI_PLAYER_OPTION_COUNT; ++i ) { if( multi_player_option_flag[i] >= 0 ) { mouse.hide_area(multi_player_option_array[i].x1, multi_player_option_array[i].y1, multi_player_option_array[i].x2, multi_player_option_array[i].y2); vga_front.put_bitmap_area(SWORD1_X, SWORD1_Y, multi_player_option_flag[i] ? menuBitmap : darkBitmap, multi_player_option_array[i].x1 - SWORD1_X, multi_player_option_array[i].y1 - SWORD1_Y, multi_player_option_array[i].x2 - SWORD1_X, multi_player_option_array[i].y2 - SWORD1_Y); mouse.show_area(); } } pointingOption = -1; refreshFlag=0; } // ###### begin Gilbert 18/9 ########// if( config.music_flag ) { if( !music.is_playing(1) ) music.play(1, sys.cdrom_drive ? MUSIC_CD_THEN_WAV : 0 ); } else music.stop(); // ###### end Gilbert 18/9 ########// // display main menu int newPointingOption = -1; for(i = 0; i < MULTI_PLAYER_OPTION_COUNT; ++i) { if( multi_player_option_flag[i] > 0 && mouse.in_area(multi_player_option_array[i].x1, multi_player_option_array[i].y1, multi_player_option_array[i].x2, multi_player_option_array[i].y2) ) { newPointingOption = i; break; } } if( pointingOption != newPointingOption) { err_when( !menuBitmap ); err_when( !brightBitmap ); err_when( !darkBitmap ); // put un-highlighted option back i = pointingOption; if( i >= 0 && i < MULTI_PLAYER_OPTION_COUNT ) { mouse.hide_area(multi_player_option_array[i].x1, multi_player_option_array[i].y1, multi_player_option_array[i].x2, multi_player_option_array[i].y2); vga_front.put_bitmap_area(SWORD1_X, SWORD1_Y, menuBitmap, multi_player_option_array[i].x1 - SWORD1_X, multi_player_option_array[i].y1 - SWORD1_Y, multi_player_option_array[i].x2 - SWORD1_X, multi_player_option_array[i].y2 - SWORD1_Y); mouse.show_area(); } // put new hightlighted option i = newPointingOption; if( i >= 0 && i < MULTI_PLAYER_OPTION_COUNT ) { mouse.hide_area(multi_player_option_array[i].x1, multi_player_option_array[i].y1, multi_player_option_array[i].x2, multi_player_option_array[i].y2); vga_front.put_bitmap_area(SWORD1_X, SWORD1_Y, brightBitmap, multi_player_option_array[i].x1 - SWORD1_X, multi_player_option_array[i].y1 - SWORD1_Y, multi_player_option_array[i].x2 - SWORD1_X, multi_player_option_array[i].y2 - SWORD1_Y); mouse.show_area(); } pointingOption = newPointingOption; } sys.blt_virtual_buf(); // blt the virtual front buffer to the screen OptionInfo* optionInfo = multi_player_option_array; for( int i=0 ; i 0 && mouse.single_click( optionInfo->x1, optionInfo->y1, optionInfo->x2, optionInfo->y2 ) ) { // free some resource if( menuBitmap ) { mem_del(menuBitmap); menuBitmap = NULL; } if( brightBitmap ) { mem_del(brightBitmap); brightBitmap = NULL; } if( darkBitmap ) { mem_del(darkBitmap); darkBitmap = NULL; } refreshFlag = 1; switch(i+1) { case 2: // ####### begin Gilbert 13/2 #######// multi_player_game(cmdLine); // ####### end Gilbert 13/2 #######// break; case 3: // ##### begin Gilbert 26/8 ######// { int loadedRecno = 0; game_file_array.init("*.SVM"); if( game_file_array.menu(2, &loadedRecno) == 1 ) { err_when( !loadedRecno ); // ####### begin Gilbert 13/2 #######// load_mp_game(game_file_array[loadedRecno]->file_name, cmdLine); // ####### begin Gilbert 13/2 #######// } { char signalExitFlagBackup = sys.signal_exit_flag; sys.signal_exit_flag = 2; game.deinit(); // game.deinit() is needed if game_file_array.menu fails sys.signal_exit_flag = signalExitFlagBackup; } // ##### end Gilbert 26/8 ######// } break; case 5: break; } return; } } } if( menuBitmap ) mem_del(menuBitmap); if( brightBitmap ) mem_del(brightBitmap); if( darkBitmap ) mem_del(darkBitmap); } //------------ End of function Game::multi_player_menu -----------// #endif