//-------- Begin of function GameFileArray::menu --------// // // <int> actionMode = -2 - save screen to back buffer // -1 - restore screen to back buffer // 1 - save game // 2 - load game // // <int *> recno = if overwritting save game or load game acion // is succcessful, return the recno of GameFile // // return : <int> 1 - game loaded/saved // 0 - user cancel loading/saving // -1 - loading/saving error // int GameFileArray::menu(int actionMode, int *recno) { if( actionMode == -2 || actionMode == -1) { // copy or restore screen to back buffer int scrnX1, scrnY1, scrnX2, scrnY2; if( game.game_mode==GAME_PREGAME ) // called from the main menu, not in the game { scrnX1 = FILE_MAIN_MENU_X1; scrnY1 = FILE_MAIN_MENU_Y1; } else { scrnX1 = FILE_IN_GAME_MENU_X1; scrnY1 = FILE_IN_GAME_MENU_Y1; } scrnX2 = scrnX1 + FILE_MENU_WIDTH-1; scrnY2 = scrnY1 + FILE_MENU_HEIGHT-1; mouse.hide_area( scrnX1, scrnY1, scrnX2, scrnY2); if( actionMode == -2 ) // save to back buffer IMGcopy(vga_back.buf_ptr(), vga_back.buf_pitch(), vga_front.buf_ptr(), vga_front.buf_pitch(), scrnX1, scrnY1, scrnX2, scrnY2); else // restore from back buffer IMGcopy(vga_front.buf_ptr(), vga_front.buf_pitch(), vga_back.buf_ptr(), vga_back.buf_pitch(), scrnX1, scrnY1, scrnX2, scrnY2); mouse.show_area(); return 1; } // #### begin Gilbert 25/9 ########// //#ifdef DEMO // No game saving in demo version // box.msg( "Sorry, you cannot load/save game in the demo version." ); // return -1; //#endif // #### end Gilbert 25/9 ########// action_mode = actionMode; if( action_mode==2 && size()==0 ) { box.msg( _("You haven't saved any games yet.") ); return 0; } // load race icon char deinitGameSet=0; char deinitUnitRes=0; char deinitRaceRes=0; if( !game_set.set_opened_flag ) { game_set.open_set(1); deinitGameSet = 1; } if( !unit_res.init_flag ) { unit_res.init(); deinitUnitRes = 1; } if( !race_res.init_flag ) { race_res.init(); deinitRaceRes = 1; } //-------------------------------------// if( game.game_mode==GAME_PREGAME ) // called from the main menu, not in the game { menu_x1 = FILE_MAIN_MENU_X1; menu_y1 = FILE_MAIN_MENU_Y1; } else { menu_x1 = FILE_IN_GAME_MENU_X1; menu_y1 = FILE_IN_GAME_MENU_Y1; } int x=menu_x1, y=menu_y1+17; // vga_back.adjust_brightness( x, y, x+menu_x1-1, y+menu_y1-1, -6 ); vga_util.blt_buf( x, y, x+menu_x1-1, y+menu_y1-1, 0 ); mouse_cursor.set_icon(CURSOR_NORMAL); power.win_opened = 1; int minRecno = action_mode == 1 ? 0 : 1; //------ set current record no. -------// for( int i=1 ; i<=size() ; i++ ) { if( strcmp(last_file_name, game_file_array[i]->file_name)==0 ) { browse_recno = i; break; } } //---------------------------------// browse_top_recno = minRecno; // in save game mode, browse_recno = 0 means selecting empty slot // in load game mode, browse_recno = 0 means nonthing is selected // browse_top_recno = browse_recno ? browse_recno : minRecno; //--------------------------------------// Button3D scrollUp, scrollDown, saveButton, saveNewButton, delButton, cancelButton; int retFlag = 0; int refreshFlag = LSOPTION_ALL; //int scrollButtonY1 = menu_y1+SCROLL_Y1, scrollButtonY2 = menu_y1+SCROLL_Y2; //int dragingScrollBar = 0; //int dragScrollYDiff; // when draging begins, mouse.cur_y - scrollButtonY1 SlideVBar scrollBar; scrollBar.init_scroll(menu_x1+SCROLL_X1, menu_y1+SCROLL_Y1, menu_x1+SCROLL_X2, menu_y1+SCROLL_Y2, MAX_BROWSE_DISP_REC, disp_scroll_bar_func); scrollBar.set(minRecno, size(), browse_top_recno); // try to centre the selected record on the browser //browse_top_recno = browse_recno - MAX_BROWSE_DISP_REC /2; //if( browse_top_recno > size()-MAX_BROWSE_DISP_REC+1) // browse_top_recno = size()-MAX_BROWSE_DISP_REC+1; //if( browse_top_recno < minRecno ) // browse_top_recno = minRecno; browse_top_recno = scrollBar.set_view_recno(browse_recno - MAX_BROWSE_DISP_REC /2); Blob browseArea[MAX_BROWSE_DISP_REC]; Blob scrollArea; while(1) { //---------- yield --------// sys.yield(); mouse.get_event(); // When called ingame sys.signal_exit_flag is set to 2 by Sys::load_game if( sys.signal_exit_flag == 1 ) { retFlag = 0; break; } // --------- display ----------// if( refreshFlag ) { if( refreshFlag & LSOPTION_PAGE ) { mouse.hide_area(menu_x1, menu_y1, menu_x1+FILE_MENU_WIDTH, menu_y1+FILE_MENU_HEIGHT); image_interface.put_front( menu_x1, menu_y1, actionMode==1 ? (char*)"SAVEGAME" : (char*)"LOADGAME" ); scrollUp.paint(menu_x1+SCROLL_X1+1,menu_y1+SCROLL_Y1-17, "SV-UP-U", "SV-UP-D"); scrollDown.paint(menu_x1+SCROLL_X1+1,menu_y1+SCROLL_Y2+1, "SV-DW-U", "SV-DW-D"); if( action_mode == 1) { saveButton.paint(menu_x1+34, menu_y1+354, "SAVE", "CANCEL1D"); saveNewButton.paint(menu_x1+147, menu_y1+354, "SAVE-NEW", "CANCEL1D"); delButton.paint(menu_x1+260, menu_y1+354, "DELETE", "CANCEL1D"); } else if( action_mode == 2) { saveButton.paint(menu_x1+34, menu_y1+354, "LOAD", "CANCEL1D"); } cancelButton.paint(menu_x1+473, menu_y1+354, "CANCEL1", "CANCEL1D"); // capture browseArea, scrollArea for( int j = 0; j < MAX_BROWSE_DISP_REC; ++j) { browseArea[j].resize(2*sizeof(short)+BROWSE_REC_WIDTH*BROWSE_REC_HEIGHT); vga_front.read_bitmap( menu_x1+BROWSE_X1, menu_y1+BROWSE_Y1+j*BROWSE_REC_HEIGHT, menu_x1+BROWSE_X2, menu_y1+BROWSE_Y1+j*BROWSE_REC_HEIGHT+BROWSE_REC_HEIGHT-1, browseArea[j].ptr); } scrollArea.resize(2*sizeof(short)+SCROLL_WIDTH*SCROLL_HEIGHT); vga_front.read_bitmap( menu_x1+SCROLL_X1, menu_y1+SCROLL_Y1, menu_x1+SCROLL_X2, menu_y1+SCROLL_Y2, scrollArea.ptr); mouse.show_area(); } if( scrollBar.max_recno != size() ) { scrollBar.set_max_recno(size()); if( scrollBar.view_recno > scrollBar.max_view_recno() ) { scrollBar.view_recno = scrollBar.max_view_recno(); } refreshFlag |= LSOPTION_SCROLL; } if( refreshFlag & LSOPTION_SCROLL ) { vga_front.put_bitmap( menu_x1+SCROLL_X1, menu_y1+SCROLL_Y1, scrollArea.ptr); scrollBar.paint(); } if( refreshFlag & LSOPTION_ALL_SLOTS ) { for(int slot = 0; slot < MAX_BROWSE_DISP_REC; ++slot) { int rec = slot + scrollBar.view_recno; if( refreshFlag & LSOPTION_SLOT(slot) ) { int browseSlotX1 = menu_x1+BROWSE_X1; int browseSlotY1 = menu_y1+BROWSE_Y1+slot*BROWSE_REC_HEIGHT; int browseSlotX2 = menu_x1+BROWSE_X2; int browseSlotY2 = menu_y1+BROWSE_Y1+(slot+1)*BROWSE_REC_HEIGHT-1; mouse.hide_area(browseSlotX1, browseSlotY1, browseSlotX2, browseSlotY2); vga_front.put_bitmap( browseSlotX1, browseSlotY1, browseArea[rec%MAX_BROWSE_DISP_REC].ptr); if( rec == 0 ) { err_when( action_mode!=1 ); font_bible.center_put( browseSlotX1, browseSlotY1, browseSlotX2, browseSlotY2, _("Empty Game Slot") ); } else if( rec <= size() ) { game_file_array[rec]->disp_info(browseSlotX1, browseSlotY1); } if( rec == browse_recno ) { vga_front.adjust_brightness( browseSlotX1, browseSlotY1, browseSlotX2, browseSlotY2, -2); vga_front.put_bitmap_trans_decompress(browseSlotX1, browseSlotY1, image_button.read("LS-DWN")); } mouse.show_area(); } } // disp_browse(); } refreshFlag = 0; } sys.blt_virtual_buf(); if( scrollBar.detect() == 1 ) { browse_top_recno = scrollBar.view_recno; refreshFlag |= LSOPTION_SCROLL | LSOPTION_ALL_SLOTS; } else if( scrollUp.detect() ) { // click on scroll up int oldValue = scrollBar.view_recno; if( oldValue != scrollBar.set_view_recno(oldValue-1) ) refreshFlag |= LSOPTION_SCROLL | LSOPTION_ALL_SLOTS; browse_top_recno = scrollBar.view_recno; } else if( scrollDown.detect() ) { // click on scroll down // click on scroll up int oldValue = scrollBar.view_recno; if( oldValue != scrollBar.set_view_recno(oldValue+1) ) refreshFlag |= LSOPTION_SCROLL | LSOPTION_ALL_SLOTS; browse_top_recno = scrollBar.view_recno; } else if( mouse.double_click( menu_x1+BROWSE_X1, menu_y1+BROWSE_Y1, menu_x1+BROWSE_X1+BROWSE_REC_WIDTH-1, menu_y1+BROWSE_Y1+ BROWSE_REC_HEIGHT*MAX_BROWSE_DISP_REC -1) ) { // double click on game slot int oldValue = browse_recno; int newValue = scrollBar.view_recno + (mouse.click_y(0) - BROWSE_Y1 - menu_y1) / BROWSE_REC_HEIGHT; if( newValue <= size()) { // ######## begin Gilbert 31/10 ########// if( newValue == oldValue ) { browse_recno = newValue; refreshFlag |= LSOPTION_SLOT(newValue-scrollBar.view_recno); if( oldValue-scrollBar.view_recno >= 0 && oldValue-scrollBar.view_recno < MAX_BROWSE_DISP_REC ) refreshFlag |= LSOPTION_SLOT(oldValue-scrollBar.view_recno); if( recno ) *recno = browse_recno; retFlag = process_action(0); // if( retFlag < 0 ) // box.msg("Error"); break; } // ######## end Gilbert 31/10 ########// } } else if( mouse.single_click( menu_x1+BROWSE_X1, menu_y1+BROWSE_Y1, menu_x1+BROWSE_X1+BROWSE_REC_WIDTH-1, menu_y1+BROWSE_Y1+ BROWSE_REC_HEIGHT*MAX_BROWSE_DISP_REC -1) ) { // click on game slot int oldValue = browse_recno; int newValue = scrollBar.view_recno + (mouse.click_y(0) - BROWSE_Y1 - menu_y1) / BROWSE_REC_HEIGHT; if( newValue <= size()) { // ##### begin Gilbert 31/10 #######// //if( oldValue == browse_recno ) //{ // browse_recno = newValue; // refreshFlag |= LSOPTION_SLOT(oldValue-scrollBar.view_recno) // | LSOPTION_SLOT(newValue-scrollBar.view_recno); //} if( newValue != oldValue ) { browse_recno = newValue; refreshFlag |= LSOPTION_SLOT(newValue-scrollBar.view_recno); if( oldValue-scrollBar.view_recno >= 0 && oldValue-scrollBar.view_recno < MAX_BROWSE_DISP_REC ) refreshFlag |= LSOPTION_SLOT(oldValue-scrollBar.view_recno); } // ##### end Gilbert 31/10 #######// } } else if( cancelButton.detect(KEY_ESC) || mouse.any_click(RIGHT_BUTTON) > 0) // also when ESC key is pressed or right button { // cancel button or escape key refreshFlag = LSOPTION_ALL; retFlag = 0; break; // break while(1) } else if( (action_mode == 1 || (action_mode == 2 && browse_recno)) && saveButton.detect() ) { // save / load button refreshFlag = LSOPTION_ALL; if( recno ) *recno = browse_recno; retFlag = process_action(0); // ##### begin Gilbert 15/10 #####// if( retFlag != 0 ) { // if( retFlag < 0 ) // box.msg("Error"); break; } // ##### end Gilbert 15/10 #####// } else if( action_mode == 1 && saveNewButton.detect() ) { // save new button refreshFlag = LSOPTION_ALL; retFlag = process_action(1); // if( retFlag < 0 ) // box.msg("Error"); break; } else if( action_mode == 1 && browse_recno && delButton.detect() ) { // delete save game button if( browse_recno != 0 ) // cannot del save game slot { del_game(); if( browse_recno > size() ) { browse_recno = size(); } if( browse_top_recno > size()-MAX_BROWSE_DISP_REC+1) browse_top_recno = size()-MAX_BROWSE_DISP_REC+1; if( browse_top_recno < minRecno ) browse_top_recno = minRecno; scrollBar.set_view_recno(browse_top_recno); refreshFlag |= LSOPTION_ALL_SLOTS | LSOPTION_SCROLL; } else { box.msg(_("Cannot delete this slot")); } refreshFlag = LSOPTION_ALL; } } power.win_opened = 0; if( retFlag <= 0 ) { // if load game is successful, no need to deinit resource if( deinitGameSet ) game_set.close_set(); if( deinitUnitRes ) unit_res.deinit(); if( deinitRaceRes ) race_res.deinit(); } mouse.reset_click(); return retFlag; }
//---------- Begin of function Game::select_scenario ----------// // // Select a scenario. // // <int> scenCount - no. of available scenarios. // <char**> scenFileNameArray - an array of <char*> pointing to the file name of the // available scenarios. // // return : <int> >0 - id. of the scenario selected. // 0 - cancel // int Game::select_scenario(int scenCount, ScenInfo* scenInfoArray) { char* scenFileName; char pictName[20]; char textName[20]; char* pathName; if( scenCount==0 ) { box.msg( "Scenario files not found." ); return 0; } //-------------------------------------// // ##### begin Gilbert 4/11 ########// // stop any music music.stop(); // ##### end Gilbert 4/11 ########// int menuX1 = TUTOR_MENU_X1; int menuY1 = TUTOR_MENU_Y1; mouse_cursor.set_icon(CURSOR_NORMAL); power.win_opened = 1; int minRecno = 1; int browseRecno = minRecno; //--------------------------------------// Button3D scrollUp, scrollDown, startButton, cancelButton; int retFlag = 0; int refreshFlag = TUOPTION_ALL; scrollUp.create(menuX1+SCROLL_X1,menuY1+SCROLL_Y1-17, "SV-UP-U", "SV-UP-D", 1, 0); scrollDown.create(menuX1+SCROLL_X1,menuY1+SCROLL_Y2+1, "SV-DW-U", "SV-DW-D", 1, 0); // ###### begin Gilbert 1/11 ########// // startButton.create(menuX1+170, menuY1+529, "START-U", "START-D",1, 0); // cancelButton.create(menuX1+465, menuY1+529, "CANCEL-U", "CANCEL-D", 1, 0); startButton.create(menuX1+373, menuY1+529, "START-U", "START-D",1, 0); cancelButton.create(menuX1+548, menuY1+529, "CANCEL-U", "CANCEL-D", 1, 0); // ###### end Gilbert 1/11 ########// SlideVBar scrollBar; scrollBar.init_scroll(menuX1+SCROLL_X1, menuY1+SCROLL_Y1, menuX1+SCROLL_X2, menuY1+SCROLL_Y2, MAX_BROWSE_DISP_REC, disp_scroll_bar_func); scrollBar.set(minRecno, scenCount, minRecno); scrollBar.set_view_recno(browseRecno - MAX_BROWSE_DISP_REC/2); Button3D textScrollUp, textScrollDown; textScrollUp.create(menuX1+TEXT_SCROLL_X1, menuY1+TEXT_SCROLL_Y1-17, "SV-UP-U", "SV-UP-D", 1, 0); textScrollDown.create(menuX1+TEXT_SCROLL_X1,menuY1+TEXT_SCROLL_Y2+1, "SV-DW-U", "SV-DW-D", 1, 0); VLenQueue textBuffer; *(textBuffer.reserve(1)) = '\0'; Font &textFont = font_std; const int TEXT_LINE_SPACE = 4; const int ESTIMATED_LINE_IN_TEXT_AREA = (TEXT_AREA_Y2 - TEXT_AREA_Y1 + 1) / (textFont.font_height + TEXT_LINE_SPACE); SlideVBar textScrollBar; textScrollBar.init_scroll(menuX1+TEXT_SCROLL_X1, menuY1+TEXT_SCROLL_Y1, menuX1+TEXT_SCROLL_X2, menuY1+TEXT_SCROLL_Y2, ESTIMATED_LINE_IN_TEXT_AREA, disp_scroll_bar_func); // ###### begin Gilbert 1/11 ########// GetA playerNameField; playerNameField.init( menuX1+NAME_FIELD_X1, menuY1+NAME_FIELD_Y1, menuX1+NAME_FIELD_X2, config.player_name, config.PLAYER_NAME_LEN, &font_san, 0, 1); // ###### end Gilbert 1/11 ########// #ifdef TU_USE_BACKUP_SURFACE // create temporary surface Blob browseArea[MAX_BROWSE_DISP_REC]; Blob scrollArea; Blob textArea; Blob textScrollArea; // ##### begin Gilbert 1/11 #######// Blob nameFieldArea; // ##### end Gilbert 1/11 #######// #endif while(1) { //---------- yield --------// sys.yield(); mouse.get_event(); // --------- display ----------// if( refreshFlag ) { #ifndef TU_USE_BACKUP_SURFACE refreshFlag = TUOPTION_ALL; #endif scenFileName = scenInfoArray[browseRecno-1].file_name; m.change_file_ext( pictName, scenFileName, "SCP" ); m.change_file_ext( textName, scenFileName, "SCT" ); pathName = DIR_SCENARIO_PATH(scenInfoArray[browseRecno-1].dir_id); err_when( ! *pathName ); if( refreshFlag & TUOPTION_PAGE ) { mouse.hide_area(menuX1, menuY1, menuX1+TUTOR_MENU_WIDTH, menuY1+TUTOR_MENU_HEIGHT); image_interface.put_front( menuX1, menuY1, "SCENARIO" ); #ifdef TU_USE_BACKUP_SURFACE // capture into browseArea, scrollArea, textArea for( int j = 0; j < MAX_BROWSE_DISP_REC; ++j) { browseArea[j].resize(2*sizeof(short) + BROWSE_REC_WIDTH*BROWSE_REC_HEIGHT); vga_front.read_bitmap( menuX1+BROWSE_X1, menuY1+BROWSE_Y1 + j*BROWSE_REC_HEIGHT, menuX1+BROWSE_X2, menuY1+BROWSE_Y1 + j*BROWSE_REC_HEIGHT+BROWSE_REC_HEIGHT-1, browseArea[j].ptr); } scrollArea.resize(2*sizeof(short)+(SCROLL_X2-SCROLL_X1+1)*(SCROLL_Y2-SCROLL_Y1+1)); vga_front.read_bitmap(menuX1+SCROLL_X1,menuY1+SCROLL_Y1,menuX1+SCROLL_X2,menuY1+SCROLL_Y2, scrollArea.ptr); textArea.resize(2*sizeof(short)+TEXT_AREA_WIDTH*TEXT_AREA_HEIGHT); vga_front.read_bitmap(menuX1+TEXT_AREA_X1, menuY1+TEXT_AREA_Y1, menuX1+TEXT_AREA_X2, menuY1+TEXT_AREA_Y2, textArea.ptr); textScrollArea.resize( 2*sizeof(short)+ (TEXT_SCROLL_X2-TEXT_SCROLL_X1+1)*(TEXT_SCROLL_Y2-TEXT_SCROLL_Y1+1)); vga_front.read_bitmap(menuX1+TEXT_SCROLL_X1, menuY1+TEXT_SCROLL_Y1, menuX1+TEXT_SCROLL_X2, menuY1+TEXT_SCROLL_Y2, textScrollArea.ptr); // ###### begin Gilbert 1/11 ########// nameFieldArea.resize( 2*sizeof(short) + (playerNameField.x_limit-playerNameField.x+1)*playerNameField.height()); vga_front.read_bitmap(playerNameField.x, playerNameField.y, playerNameField.x_limit, playerNameField.y+playerNameField.height()-1, nameFieldArea.ptr); playerNameField.back_ground_bitmap = nameFieldArea.ptr; // ###### end Gilbert 1/11 ########// #endif scrollUp.paint(); scrollDown.paint(); startButton.paint(); cancelButton.paint(); textScrollUp.paint(); textScrollDown.paint(); mouse.show_area(); } if( refreshFlag & TUOPTION_PIC_AREA ) { String str; str = pathName; str += pictName; if( browseRecno && m.is_file_exist(str) ) { File pictFile; pictFile.file_open(str); vga_front.put_large_bitmap(menuX1+21,menuY1+19, &pictFile); pictFile.file_close(); } else { // draw the background #ifdef TU_USE_BACKUP_SURFACE // copy from ? #endif } } if( refreshFlag & TUOPTION_TEXT_BUFFER ) { // load text buffer String str; str = pathName; str += textName; if( browseRecno && m.is_file_exist(str) ) { File textFile; int dataSize; textFile.file_open(str); // ##### patch begin Gilbert 2/2 ####// dataSize = textFile.file_size(); FileTxt fileTxt( &textFile, dataSize ); // initialize fileTxt with an existing file stream fileTxt.next_line(); // skip the title lines fileTxt.next_line(); fileTxt.next_line(); fileTxt.next_line(); textBuffer.clear(); fileTxt.read_paragraph(textBuffer.reserve(dataSize+8), dataSize); // ##### end begin Gilbert 2/2 ####// int dispLines; // no. of lines can be displayed on the area int totalLines; // total no. of lines of the text textFont.count_line( menuX1+TEXT_AREA_X1, menuY1+TEXT_AREA_Y1, menuX1+TEXT_AREA_X2, menuY1+TEXT_AREA_Y2, textBuffer.queue_buf, TEXT_LINE_SPACE, dispLines, totalLines ); // textScrollBar.view_size = dispLines; textScrollBar.set(1, totalLines ,1); refreshFlag |= TUOPTION_TEXT_SCROLL; } } if( refreshFlag & TUOPTION_TEXT_AREA ) { #ifdef TU_USE_BACKUP_SURFACE // copy from back buffer vga_front.put_bitmap(menuX1+TEXT_AREA_X1, menuY1+TEXT_AREA_Y1, textArea.ptr); #endif textFont.put_paragraph(menuX1+TEXT_AREA_X1, menuY1+TEXT_AREA_Y1, menuX1+TEXT_AREA_X2, menuY1+TEXT_AREA_Y2, textBuffer.queue_buf, TEXT_LINE_SPACE, textScrollBar.view_recno ); // 4 - space between lines } if( refreshFlag & TUOPTION_TEXT_SCROLL ) { #ifdef TU_USE_BACKUP_SURFACE vga_front.put_bitmap(menuX1+TEXT_SCROLL_X1, menuY1+TEXT_SCROLL_Y1, textScrollArea.ptr); #endif // display scroll bar textScrollBar.paint(); } if( refreshFlag & TUOPTION_SCROLL ) { #ifdef TU_USE_BACKUP_SURFACE // copy from back buffer vga_front.put_bitmap(menuX1+SCROLL_X1, menuY1+SCROLL_Y1, scrollArea.ptr); #endif // display scroll bar scrollBar.paint(); } if( refreshFlag & TUOPTION_ALL_BROWSE ) { int rec, slot; for( slot = 0; slot < scrollBar.view_size; ++slot) { int browseSlotX1 = menuX1+BROWSE_X1; int browseSlotY1 = menuY1+BROWSE_Y1+slot*BROWSE_REC_HEIGHT; int browseSlotX2 = menuX1+BROWSE_X2; int browseSlotY2 = menuY1+BROWSE_Y1+(slot+1)*BROWSE_REC_HEIGHT-1; rec = scrollBar.view_recno + slot; if( refreshFlag & TUOPTION_BROWSE(slot) ) { #ifdef TU_USE_BACKUP_SURFACE vga_front.put_bitmap(browseSlotX1, browseSlotY1, browseArea[rec%MAX_BROWSE_DISP_REC].ptr); #endif if( rec >= 1 && rec <= scenCount ) { int textX = font_bible.put(browseSlotX1+TEXT_OFFSET_X, browseSlotY1+TEXT_OFFSET_Y, m.format(rec), 0, browseSlotX2 ); //----- display the scenario name -----// textX = font_bible.put(textX, browseSlotY1+TEXT_OFFSET_Y, ". ", 0, browseSlotX2 ); textX = font_bible.put(textX, browseSlotY1+TEXT_OFFSET_Y, scenInfoArray[rec-1].scen_name, 0, browseSlotX2 ); //---- display the scenario difficulty and bonus points ----// String str(translate.process("Difficulty: ")); str += scenInfoArray[rec-1].goal_difficulty; font_bible.put(browseSlotX1+TEXT_OFFSET_X+400, browseSlotY1+TEXT_OFFSET_Y, str, 0, browseSlotX2 ); str = translate.process("Score Bonus: "); str += scenInfoArray[rec-1].goal_score_bonus; font_bible.put(browseSlotX1+TEXT_OFFSET_X+530, browseSlotY1+TEXT_OFFSET_Y, str, 0, browseSlotX2 ); //--------------------------------------// if( rec == browseRecno ) { vga_front.adjust_brightness(browseSlotX1, browseSlotY1, browseSlotX2, browseSlotY2, -2); //vga_front.put_bitmap_trans_decompress( menuX1+BROWSE_X1, menuY1+BROWSE_Y1+slot*BROWSE_REC_HEIGHT, // image_button.read("LS-DWN")); } } } } } // ###### begin Gilbert 1/11 #######// if( refreshFlag & TUOPTION_NAME_FIELD ) playerNameField.paint(); // ###### end Gilbert 1/11 #######// refreshFlag = 0; } sys.blt_virtual_buf(); if( scrollBar.detect() == 1) { refreshFlag |= TUOPTION_SCROLL | TUOPTION_ALL_BROWSE; } else if( scrollUp.detect() ) { // click on scroll up int oldValue = scrollBar.view_recno; if( oldValue != scrollBar.set_view_recno(oldValue-1) ) refreshFlag |= TUOPTION_ALL_BROWSE | TUOPTION_SCROLL; } else if( scrollDown.detect() ) { // click on scroll down int oldValue = scrollBar.view_recno; if( oldValue != scrollBar.set_view_recno(oldValue+1) ) refreshFlag |= TUOPTION_ALL_BROWSE | TUOPTION_SCROLL; } else if( textScrollBar.detect() == 1 ) { refreshFlag |= TUOPTION_TEXT_SCROLL | TUOPTION_TEXT_AREA; } else if( textScrollUp.detect() ) { // click on scroll up int oldValue = textScrollBar.view_recno; if( oldValue != textScrollBar.set_view_recno(oldValue-1) ) refreshFlag |= TUOPTION_TEXT_SCROLL | TUOPTION_TEXT_AREA; } else if( textScrollDown.detect() ) { // click on scroll down int oldValue = textScrollBar.view_recno; if( oldValue != textScrollBar.set_view_recno(oldValue+1) ) refreshFlag |= TUOPTION_TEXT_SCROLL | TUOPTION_TEXT_AREA; } else if( mouse.double_click( menuX1+BROWSE_X1, menuY1+BROWSE_Y1, menuX1+BROWSE_X1+BROWSE_REC_WIDTH-1, menuY1+BROWSE_Y1+ BROWSE_REC_HEIGHT*MAX_BROWSE_DISP_REC -1) ) { // double click on game slot int oldValue = browseRecno; int newValue = scrollBar.view_recno + (mouse.click_y(0) - BROWSE_Y1 - menuY1) / BROWSE_REC_HEIGHT; if( newValue <= scenCount && newValue == oldValue ) { browseRecno = newValue; retFlag = newValue; break; } } else if( mouse.single_click( menuX1+BROWSE_X1, menuY1+BROWSE_Y1, menuX1+BROWSE_X1+BROWSE_REC_WIDTH-1, menuY1+BROWSE_Y1+ BROWSE_REC_HEIGHT*MAX_BROWSE_DISP_REC -1) ) { // click on game slot int oldValue = browseRecno; int newValue = scrollBar.view_recno + (mouse.click_y(0) - BROWSE_Y1 - menuY1) / BROWSE_REC_HEIGHT; if( newValue <= scenCount ) { if( oldValue != newValue ) { browseRecno = newValue; refreshFlag |= TUOPTION_BROWSE(newValue-scrollBar.view_recno) | TUOPTION_TEXT_BUFFER | TUOPTION_TEXT_AREA | TUOPTION_PIC_AREA; if( oldValue-scrollBar.view_recno >= 0 && oldValue-scrollBar.view_recno < MAX_BROWSE_DISP_REC) refreshFlag |= TUOPTION_BROWSE(oldValue-scrollBar.view_recno); } } } // ######## begin Gilbert 1/11 #########// else if( playerNameField.detect() ) { // load button refreshFlag = TUOPTION_NAME_FIELD; } // ######## end Gilbert 1/11 #########// else if( cancelButton.detect(KEY_ESC) || mouse.any_click(RIGHT_BUTTON) > 0) // also when ESC key is pressed or right button { // cancel button or escape key refreshFlag = TUOPTION_ALL; retFlag = 0; break; // break while(1) } else if( startButton.detect() ) { // load button refreshFlag = TUOPTION_ALL; retFlag = browseRecno; break; } } power.win_opened = 0; return retFlag; }
// actionMode = -2 save to back buffer // -1 restore from back buffer // // return 0 for cancelled // -1 for failure // >0 recno selected int Tutor::select_tutor(int actionMode) { if( actionMode == -2 || actionMode == -1) { // copy or restore screen to back buffer int scrnX1, scrnY1, scrnX2, scrnY2; scrnX1 = TUTOR_MENU_X1; scrnY1 = TUTOR_MENU_Y1; scrnX2 = scrnX1 + TUTOR_MENU_WIDTH-1; scrnY2 = scrnY1 + TUTOR_MENU_HEIGHT-1; mouse.hide_area( scrnX1, scrnY1, scrnX2, scrnY2); if( actionMode == -2 ) { info.save_game_scr(); // save to back buffer IMGcopy(vga_back.buf_ptr(), vga_back.buf_pitch(), vga_front.buf_ptr(), vga_front.buf_pitch(), scrnX1, scrnY1, scrnX2, scrnY2); } else { // restore from back buffer IMGcopy(vga_front.buf_ptr(), vga_front.buf_pitch(), vga_back.buf_ptr(), vga_back.buf_pitch(), scrnX1, scrnY1, scrnX2, scrnY2); info.rest_game_scr(); } mouse.show_area(); return 1; } if( tutor_count==0 ) { box.msg( _("Tutorial files not found.") ); return 0; } //-------------------------------------// // ##### begin Gilbert 4/11 ########// // stop any music music.stop(); // ##### end Gilbert 4/11 ########// int menuX1 = TUTOR_MENU_X1; int menuY1 = TUTOR_MENU_Y1; // int x=menuX1, y=menuY1+17; // vga_back.adjust_brightness( x, y, x+menuX1-1, y+menuY1-1, -6 ); // vga_util.blt_buf( x, y, x+menuX1-1, y+menuY1-1, 0 ); mouse_cursor.set_icon(CURSOR_NORMAL); power.win_opened = 1; int minRecno = 1; int browseRecno = minRecno; // ###### begin Gilbert 29/9 #######// // if called during the game, set the current tutorial selected if( cur_tutor_id >= 1 && cur_tutor_id <= tutor_count ) { browseRecno = cur_tutor_id; } // ###### end Gilbert 29/9 #######// //--------------------------------------// Button3D scrollUp, scrollDown, startButton, cancelButton; int retFlag = 0; int refreshFlag = TUOPTION_ALL; scrollUp.create(menuX1+SCROLL_X1,menuY1+SCROLL_Y1-17, "SV-UP-U", "SV-UP-D", 1, 0); scrollDown.create(menuX1+SCROLL_X1,menuY1+SCROLL_Y2+1, "SV-DW-U", "SV-DW-D", 1, 0); startButton.create(menuX1+170, menuY1+529, "START-U", "START-D",1, 0); cancelButton.create(menuX1+465, menuY1+529, "CANCEL-U", "CANCEL-D", 1, 0); SlideVBar scrollBar; scrollBar.init_scroll(menuX1+SCROLL_X1, menuY1+SCROLL_Y1, menuX1+SCROLL_X2, menuY1+SCROLL_Y2, MAX_BROWSE_DISP_REC, disp_scroll_bar_func); scrollBar.set(minRecno, tutor_count, minRecno); // try to centre the selected record on the browser // int newBrowseTopRecno = browseRecno - MAX_BROWSE_DISP_REC/2; // if( newBrowseTopRecno > scrollBar.max_view_recno() ) // newBrowseTopRecno = scrollBar.max_view_recno(); // if( newBrowseTopRecno < scrollBar.min_recno ) /// newBrowseTopRecno = scrollBar.min_recno; scrollBar.set_view_recno(browseRecno - MAX_BROWSE_DISP_REC/2); #ifdef TU_USE_BACKUP_SURFACE // create temporary surface Blob browseArea[MAX_BROWSE_DISP_REC]; Blob scrollArea; Blob textArea; #endif while(1) { //---------- yield --------// sys.yield(); mouse.get_event(); // --------- display ----------// if( refreshFlag ) { #ifndef TU_USE_BACKUP_SURFACE refreshFlag = TUOPTION_ALL; #endif if( refreshFlag & TUOPTION_PAGE ) { mouse.hide_area(menuX1, menuY1, menuX1+TUTOR_MENU_WIDTH, menuY1+TUTOR_MENU_HEIGHT); image_interface.put_front( menuX1, menuY1, "TUTORIAL" ); #ifdef TU_USE_BACKUP_SURFACE // capture into browseArea, scrollArea, textArea for( int j = 0; j < MAX_BROWSE_DISP_REC; ++j) { browseArea[j].resize(2*sizeof(short) + BROWSE_REC_WIDTH*BROWSE_REC_HEIGHT); vga_front.read_bitmap( menuX1+BROWSE_X1, menuY1+BROWSE_Y1 + j*BROWSE_REC_HEIGHT, menuX1+BROWSE_X2, menuY1+BROWSE_Y1 + j*BROWSE_REC_HEIGHT+BROWSE_REC_HEIGHT-1, browseArea[j].ptr); } scrollArea.resize(2*sizeof(short)+(SCROLL_X2-SCROLL_X1+1)*(SCROLL_Y2-SCROLL_Y1+1)); vga_front.read_bitmap(menuX1+SCROLL_X1,menuY1+SCROLL_Y1,menuX1+SCROLL_X2,menuY1+SCROLL_Y2, scrollArea.ptr); textArea.resize(2*sizeof(short)+TEXT_AREA_WIDTH*TEXT_AREA_HEIGHT); vga_front.read_bitmap(menuX1+TEXT_AREA_X1, menuY1+TEXT_AREA_Y1, menuX1+TEXT_AREA_X2, menuY1+TEXT_AREA_Y2, textArea.ptr); #endif scrollUp.paint(); scrollDown.paint(); startButton.paint(); cancelButton.paint(); mouse.show_area(); } if( refreshFlag & TUOPTION_PIC_AREA ) { if( browseRecno && image_tutorial.get_index(this->operator[](browseRecno)->code) ) { image_tutorial.put_large(&vga_front, 21,19, this->operator[](browseRecno)->code); } else { // draw the background #ifdef TU_USE_BACKUP_SURFACE // copy from ? #endif } } if( refreshFlag & TUOPTION_TEXT_AREA ) { #ifdef TU_USE_BACKUP_SURFACE // copy from back buffer vga_front.put_bitmap(menuX1+TEXT_AREA_X1, menuY1+TEXT_AREA_Y1, textArea.ptr); #endif if( browseRecno ) { #if(defined(GERMAN) || defined(FRENCH) || defined(SPANISH)) int lineSpace = 2; #else int lineSpace = 4; #endif int tutIntroLen = strlen(get_intro(browseRecno))-6; char tutIntro[512] = {0}; // Copy text without gettext markup _(""). strncpy(tutIntro, get_intro(browseRecno)+3, tutIntroLen); tutIntro[tutIntroLen] = '\0'; font_std.put_paragraph(menuX1+TEXT_AREA_X1, menuY1+TEXT_AREA_Y1, menuX1+TEXT_AREA_X2, menuY1+TEXT_AREA_Y2, _(tutIntro), lineSpace ); // 4 - space between lines } } if( refreshFlag & TUOPTION_SCROLL ) { #ifdef TU_USE_BACKUP_SURFACE // copy from back buffer vga_front.put_bitmap(menuX1+SCROLL_X1, menuY1+SCROLL_Y1, scrollArea.ptr); #endif // display scroll bar scrollBar.paint(); } if( refreshFlag & TUOPTION_ALL_BROWSE ) { int rec, slot; for( slot = 0; slot < scrollBar.view_size; ++slot) { int browseSlotX1 = menuX1+BROWSE_X1; int browseSlotY1 = menuY1+BROWSE_Y1+slot*BROWSE_REC_HEIGHT; int browseSlotX2 = menuX1+BROWSE_X2; int browseSlotY2 = menuY1+BROWSE_Y1+(slot+1)*BROWSE_REC_HEIGHT-1; rec = scrollBar.view_recno + slot; if( refreshFlag & TUOPTION_BROWSE(slot) ) { #ifdef TU_USE_BACKUP_SURFACE vga_front.put_bitmap(browseSlotX1, browseSlotY1, browseArea[rec%MAX_BROWSE_DISP_REC].ptr); #endif if( rec >= 1 && rec <= tutor_count ) { int textX = font_bible.put(browseSlotX1+TEXT_OFFSET_X, browseSlotY1+TEXT_OFFSET_Y, misc.format(rec), 0, browseSlotX2 ); textX = font_bible.put(textX, browseSlotY1+TEXT_OFFSET_Y, ". ", 0, browseSlotX2 ); int tutDescLen = strlen(this->operator[](rec)->des)-5; char tutDesc[TutorInfo::DES_LEN+1] = {0}; // Copy text without gettext markup _(""). strncpy(tutDesc, (this->operator[](rec)->des)+3, tutDescLen); tutDesc[tutDescLen] = '\0'; textX = font_bible.put(textX, browseSlotY1+TEXT_OFFSET_Y, _(tutDesc), 0, browseSlotX2 ); if( rec == browseRecno ) { vga_front.adjust_brightness(browseSlotX1, browseSlotY1, browseSlotX2, browseSlotY2, -2); //vga_front.put_bitmap_trans_decompress( menuX1+BROWSE_X1, menuY1+BROWSE_Y1+slot*BROWSE_REC_HEIGHT, // image_button.read("LS-DWN")); } } } } } refreshFlag = 0; } sys.blt_virtual_buf(); if( scrollBar.detect() == 1) { refreshFlag |= TUOPTION_SCROLL | TUOPTION_ALL_BROWSE; } else if( scrollUp.detect() ) { // click on scroll up int oldValue = scrollBar.view_recno; //if( scrollBar.view_recno > minRecno ) //{ // scrollBar.set_view_recno(oldValue-1); // refreshFlag = 1; //} if( oldValue != scrollBar.set_view_recno(oldValue-1) ) refreshFlag |= TUOPTION_ALL_BROWSE | TUOPTION_SCROLL; } else if( scrollDown.detect() ) { // click on scroll down int oldValue = scrollBar.view_recno; //if( scrollBar.view_recno+scrollBar.view_size <= tutor_count ) //{ // scrollBar.set_view_recno(oldValue+1); // refreshFlag = 1; //} if( oldValue != scrollBar.set_view_recno(oldValue+1) ) refreshFlag |= TUOPTION_ALL_BROWSE | TUOPTION_SCROLL; } else if( mouse.double_click( menuX1+BROWSE_X1, menuY1+BROWSE_Y1, menuX1+BROWSE_X1+BROWSE_REC_WIDTH-1, menuY1+BROWSE_Y1+ BROWSE_REC_HEIGHT*MAX_BROWSE_DISP_REC -1) ) { // double click on game slot int oldValue = browseRecno; int newValue = scrollBar.view_recno + (mouse.click_y(0) - BROWSE_Y1 - menuY1) / BROWSE_REC_HEIGHT; if( newValue <= tutor_count && newValue == oldValue) { browseRecno = newValue; retFlag = newValue; break; } } else if( mouse.single_click( menuX1+BROWSE_X1, menuY1+BROWSE_Y1, menuX1+BROWSE_X1+BROWSE_REC_WIDTH-1, menuY1+BROWSE_Y1+ BROWSE_REC_HEIGHT*MAX_BROWSE_DISP_REC -1) ) { // click on game slot int oldValue = browseRecno; int newValue = scrollBar.view_recno + (mouse.click_y(0) - BROWSE_Y1 - menuY1) / BROWSE_REC_HEIGHT; // ##### begin Gilbert 31/10 ########// if( newValue <= tutor_count ) { if( oldValue != newValue ) { browseRecno = newValue; refreshFlag |= TUOPTION_BROWSE(newValue-scrollBar.view_recno) | TUOPTION_TEXT_AREA | TUOPTION_PIC_AREA; if( oldValue-scrollBar.view_recno >= 0 && oldValue-scrollBar.view_recno < MAX_BROWSE_DISP_REC ) refreshFlag |= TUOPTION_BROWSE(oldValue-scrollBar.view_recno); } } // ##### end Gilbert 31/10 ########// } else if( cancelButton.detect(KEY_ESC) || mouse.any_click(RIGHT_BUTTON) > 0 || sys.signal_exit_flag == 1 ) // also when ESC key is pressed or right button, or when the user wants to exit { // cancel button or escape key refreshFlag = TUOPTION_ALL; retFlag = 0; break; // break while(1) } else if( startButton.detect() ) { // load button refreshFlag = TUOPTION_ALL; retFlag = browseRecno; break; } } power.win_opened = 0; return retFlag; }