/* * 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 : OINGMENU.H // Description : in-game menu (async version) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef AMPLUS enum { GAME_MENU_WIDTH = 350, GAME_MENU_HEIGHT = 400 }; #else enum { GAME_MENU_WIDTH = 350, GAME_MENU_HEIGHT = 386 }; #endif enum { GAME_MENU_X1 = ZOOM_X1 + ( (ZOOM_X2-ZOOM_X1+1) - GAME_MENU_WIDTH ) / 2, GAME_MENU_Y1 = ZOOM_Y1 + ( (ZOOM_Y2-ZOOM_Y1+1) - GAME_MENU_HEIGHT ) / 2 }; enum { GAME_OPTION_WIDTH = 170, GAME_OPTION_HEIGHT = 34 }; // ####### begin Gilbert 29/10 #########// #ifdef AMPLUS enum { GAME_OPTION_X1 = GAME_MENU_X1+90, GAME_OPTION_Y1 = GAME_MENU_Y1+93 }; enum { MAP_ID_X1 = GAME_MENU_X1 + 18, MAP_ID_Y1 = GAME_MENU_Y1 + 362, MAP_ID_X2 = GAME_MENU_X1 + 330, MAP_ID_Y2 = GAME_MENU_Y1 + 382 }; #else enum { GAME_OPTION_X1 = GAME_MENU_X1+90, GAME_OPTION_Y1 = GAME_MENU_Y1+76 }; enum { MAP_ID_X1 = GAME_MENU_X1 + 18, MAP_ID_Y1 = GAME_MENU_Y1 + 350, MAP_ID_X2 = GAME_MENU_X1 + 330, MAP_ID_Y2 = GAME_MENU_Y1 + 373 }; #endif // ####### end Gilbert 29/10 #########// unsigned InGameMenu::menu_hot_key[GAME_OPTION_COUNT] = {'o','s','l', 0,0,0,0,KEY_ESC }; InGameMenu::InGameMenu() { active_flag = 0; } void InGameMenu::enter(char untilExitFlag) { if( active_flag ) return; refresh_flag = 1; active_flag = 1; memset(game_menu_option_flag, 1, sizeof(game_menu_option_flag) ); if( !nation_array.player_recno) { // when in observe mode game_menu_option_flag[1] = 0; // disable save game game_menu_option_flag[4] = 0; // disable retire } if( remote.is_enable() ) { // when in when in multi-player mode, game_menu_option_flag[2] = 0; // disable load game game_menu_option_flag[3] = 0; // disable training game_menu_option_flag[4] = 0; // disable retire } mouse_cursor.set_icon(CURSOR_NORMAL); power.win_opened = 1; if( untilExitFlag ) { while( is_active() ) { sys.yield(); mouse.get_event(); // display on front buffer char useBackBuf = vga.use_back_buf; vga.use_front(); disp(); if(useBackBuf) vga.use_back(); sys.blt_virtual_buf(); music.yield(); detect(); } } } void InGameMenu::disp(int needRepaint) { if( !active_flag ) return; // since use back buffer, always refresh if( Vga::use_back_buf || needRepaint ) refresh_flag = 1; if( refresh_flag ) { int x=GAME_MENU_X1+20, y=GAME_MENU_Y1+17; if( Vga::use_back_buf ) image_interface.put_back( GAME_MENU_X1, GAME_MENU_Y1, "GAMEMENU" ); else image_interface.put_front( GAME_MENU_X1, GAME_MENU_Y1, "GAMEMENU" ); for( int b = 0; b < GAME_OPTION_COUNT; ++b) { if( !game_menu_option_flag[b]) { // darked disabled button Vga::active_buf->adjust_brightness( GAME_OPTION_X1, GAME_OPTION_Y1 + b*GAME_OPTION_HEIGHT, GAME_OPTION_X1+GAME_OPTION_WIDTH-1, GAME_OPTION_Y1 + (b+1)*GAME_OPTION_HEIGHT-1, -8); } } String str; #if(defined(SPANISH)) str = "I.D del Mapa: "; #elif(defined(FRENCH) ) str = "Nš de la carte: "; #elif(defined(GERMAN)) str = "Karten-I.D.: "; #else str = "Map I.D.: "; #endif str += info.random_seed; font_bible.center_put( MAP_ID_X1, MAP_ID_Y1, MAP_ID_X2, MAP_ID_Y2, str); refresh_flag = 0; } } int InGameMenu::detect() { if( !active_flag ) return 0; int i, y=GAME_OPTION_Y1, x2, y2; for( i=1 ; i<=GAME_OPTION_COUNT ; i++, y+=GAME_OPTION_HEIGHT ) { x2 = GAME_OPTION_X1+GAME_OPTION_WIDTH-1; y2 = y+GAME_OPTION_HEIGHT-1; if( game_menu_option_flag[i-1] == 1 && (menu_hot_key[i-1] && mouse.key_code == menu_hot_key[i-1] || mouse.single_click( GAME_OPTION_X1, y, x2, y2 )) ) break; if( i == GAME_OPTION_COUNT && // assume last option is 'continue' (mouse.any_click(1) || mouse.key_code==KEY_ESC) ) break; } if( i>GAME_OPTION_COUNT ) return 0; //------ display the pressed down button -----// vga_front.save_area_common_buf( GAME_OPTION_X1, y, x2, y2 ); image_interface.put_front( GAME_OPTION_X1, y, "MENU-DWN" ); while( mouse.left_press ) // holding down the button { sys.yield(); mouse.get_event(); } vga_front.rest_area_common_buf(); // restore the up button //--------- run the option -------// exit(0); switch(i) { case 1: // options option_menu.enter(!remote.is_enable()); break; case 2: // save game sys.save_game(); break; case 3: // load game sys.load_game(); break; case 4: // training tutor.select_run_tutor(1); break; case 5: // retire if( nation_array.player_recno ) // only when the player's kingdom still exists { if( box.ask("Do you really want to retire?", "Yes", "No", 175, 320) ) { if( remote.is_enable() ) { // BUGHERE : message will not be sent out short *shortPtr = (short *)remote.new_send_queue_msg( MSG_PLAYER_QUIT, 2*sizeof(short)); shortPtr[0] = nation_array.player_recno; shortPtr[1] = 1; // retire } game.game_end(0, 0, 0, 1); // 1 - retire } } break; case 6: // quit to main menu { int boxX1; #ifdef GERMAN boxX1 = 125; #else boxX1 = 115; #endif if( !nation_array.player_recno || box.ask( "Do you really want to quit to the Main Menu?", "Yes", "No", boxX1, 350 ) ) { if( remote.is_enable() && nation_array.player_recno ) { // BUGHERE : message will not be sent out short *shortPtr = (short *)remote.new_send_queue_msg( MSG_PLAYER_QUIT, 2*sizeof(short)); shortPtr[0] = nation_array.player_recno; shortPtr[1] = 0; // not retire } sys.signal_exit_flag = 2; } break; } case 7: // quit to Windows if( !nation_array.player_recno || box.ask( "Do you really want to quit to Windows?", "Yes", "No", 130, 400 ) ) { if( remote.is_enable() && nation_array.player_recno ) { // BUGHERE : message will not be sent out short *shortPtr = (short *)remote.new_send_queue_msg( MSG_PLAYER_QUIT, 2*sizeof(short)); shortPtr[0] = nation_array.player_recno; shortPtr[1] = 1; // retire } sys.signal_exit_flag = 1; } break; } return 1; } void InGameMenu::exit(int action) { power.win_opened = 0; active_flag = 0; } void InGameMenu::abort() { power.win_opened = 0; active_flag = 0; }