/* * 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 : OGAMENCY.CPP // description : view encyclopedia #include #include #include #include #include #include #include #include #include //--------- define constant ---------// #define ENCYC_CLASS_COUNT 7 #define FRYHTAN_MAX_PAGE 3 #ifdef AMPLUS #define SUB_CLASS_BUTTON_MAX 10 #else #define SUB_CLASS_BUTTON_MAX 8 #endif enum { ENCYC_PEOPLE=1, ENCYC_WEAPONS, ENCYC_SHIPS, ENCYC_STRUCTURES, ENCYC_PALACE, ENCYC_GOD, ENCYC_FRYHTANS, }; const int START_SLIDE_MODE_TIME = 60000; // 60 seconds const int SLIDE_MODE_TIME = 10000; // 10 seconds // static int sub_class_count_array[ENCYC_CLASS_COUNT] = { 7, 5, 4, 8, 7, 7, 1 }; static int sub_class_count_array[ENCYC_CLASS_COUNT] = #ifdef AMPLUS { 10, 6, 4, 8, 10, 10, 17 }; #else { 7, 5, 4, 8, 7, 7, 17 }; #endif static char *race_name[] = #ifdef AMPLUS { "CHINESE", "EGYPTIAN", "GREEK", "JAPANESE", "MAYA", "INDIAN", "NORMAN", "PERSIAN", "VIKING", "ZULU" }; #else { "CHINESE", "GREEK", "JAPANESE", "MAYA", "NORMAN", "PERSIAN", "VIKING" }; #endif static char *weapon_name[] = #ifdef AMPLUS { "CATAPULT", "BALLISTA", "CANNON", "EXPCART", "FLAMETHR", "F_BALLIS" }; #else { "CATAPULT", "BALLISTA", "CANNON", "EXPCART", "FLAMETHR" }; #endif static char *ship_name[] = { "VESSEL", "TRANSPOR", "CARAVEL", "GALLEON", }; static char *firm_name[] = { "FORT", "FACTORY", "WARFACT", "MARKET", "MINE", "INN", "SCIENCE", "HARBOR", }; static char *god_name[] = #ifdef AMPLUS { "CHINESE", "GREEK", "PERSIAN", "NORMAN", "JAPANESE", "MAYA", "VIKING", "EGYPTIAN", "ZULU", "INDIAN" }; #else { "CHINESE", "GREEK", "JAPANESE", "MAYA", "NORMAN", "PERSIAN", "VIKING" }; #endif static char *monster_name[] = { "HOBGLOB", "SKELETON", "GREMJERM", "GNOLL", "GIANTET", "HEADLESS", "GOBLIN", "MAN", "GITH", "LYW", "ROCKMAN", "LIZARD", "FIREKIN", "STRUCT_1", "STRUCT_2", "STRUCT_3", "STRUCT_4", }; static char monster_page_index[FRYHTAN_MAX_PAGE+1] = { 0, 7, 13, 17 }; static char* button_name_array[ENCYC_CLASS_COUNT] = { "B_PEOP", "B_WEAP", "B_SHIP", "B_STRUCT", "B_PEOP", "B_GBEING", "B_FRYH", }; static char* monster_button_name_array[FRYHTAN_MAX_PAGE] = { "B_FRYH", "B_FRYH2", "B_FRYH3", }; static char std_extension[] = ".ICN"; static char pal_extension[] = ".COL"; //-------- define static variables ----------// static int main_class_id; static int sub_class_id_array[ENCYC_CLASS_COUNT]; static int fryhtan_page; //-------- declare static functions ----------// static int detect_main_class_button(); static int detect_sub_class_button(int n, int firstButton=1); static void disp_class_buttons(); static int disp_picture( int selClass, int selSubClass, int firstDisp=0); //-------- Begin of function Game::view_encyclopedia ---------// void Game::view_encyclopedia() { music.stop(); // no music for encyclopedia as it reads files from the CDROM //-------- backup and switch palette ----------// VgaCustomPalette *backupPal = new VgaCustomPalette(NULL); //---- load the interface into the back buffer ----// image_encyc.put_to_buf( &vga_back, "ENCYC" ); //-------- hide and change mouse cursor --------// mouse.hide(); mouse_cursor.set_icon(CURSOR_ENCYC); main_class_id = 1; for( int i=0 ; i= monster_page_index[monsterSubClass]; ++monsterSubClass); err_when( monsterSubClass > FRYHTAN_MAX_PAGE ); int pictButtonCount = monster_page_index[monsterSubClass] - monster_page_index[monsterSubClass-1]; #ifdef AMPLUS int nextPageButton = SUB_CLASS_BUTTON_MAX-1; int prevPageButton = SUB_CLASS_BUTTON_MAX; #else int nextPageButton = pictButtonCount+1; int prevPageButton = pictButtonCount+2; #endif // translate selSubClass from i-th button to new value of sub_class_count_array[main_class_id-1] if( (selSubClass = detect_sub_class_button(pictButtonCount)) > 0) { // click sub-class buttons selSubClass = monster_page_index[monsterSubClass-1]+(selSubClass-1)+1; } else if( nextPageButton <= SUB_CLASS_BUTTON_MAX && detect_sub_class_button(nextPageButton, nextPageButton) == nextPageButton ) { // click page switching buttons // increase monsterSubClass if( ++monsterSubClass > FRYHTAN_MAX_PAGE ) monsterSubClass = 1; // switch page, assume the first picture of that page selSubClass = monster_page_index[monsterSubClass-1]+1; } else if( prevPageButton <= SUB_CLASS_BUTTON_MAX && detect_sub_class_button(prevPageButton, prevPageButton) == prevPageButton ) { // decrease monsterSubClass if( --monsterSubClass < 1) monsterSubClass = FRYHTAN_MAX_PAGE; // switch page, assume the first picture of that page selSubClass = monster_page_index[monsterSubClass-1]+1; } else selSubClass = 0; // as if not selected anything } if( selSubClass && selSubClass != sub_class_id_array[main_class_id-1] ) { sub_class_id_array[main_class_id-1] = selSubClass; disp_class_buttons(); disp_picture(main_class_id, selSubClass); nextDisplayTime = m.get_time() + START_SLIDE_MODE_TIME; } //------ detect the "Return" button -------// if( mouse.single_click(6, 552, 165, 592) ) // return button break; //--------- F9 to capture screen ----------// if( mouse.single_click(174, 12, 787, 587, 1) ) // right clicking on the picture to save it sys.capture_screen(); //----------- auto slide show -------------// if( m.get_time() > nextDisplayTime ) { //--- display next pictures ---// if( ++sub_class_id_array[main_class_id-1] > sub_class_count_array[main_class_id-1] ) { sub_class_id_array[main_class_id-1] = 1; if( ++main_class_id > ENCYC_CLASS_COUNT ) main_class_id = 1; } disp_class_buttons(); if( disp_picture(main_class_id, sub_class_id_array[main_class_id-1]) ) nextDisplayTime = m.get_time() + SLIDE_MODE_TIME; } } //------- exiting: turn dark --------// // vga.adjust_brightness(-255); vga_front.bar(0,0, vga_front.buf_width()-1, vga_front.buf_height()-1, 0 ); sys.blt_virtual_buf(); //-------- restore mouse cursor --------// mouse_cursor.set_icon(CURSOR_NORMAL); //----- palette restore when backupPal destruct ----// { vga_front.bar( 0, 0, VGA_WIDTH-1, VGA_HEIGHT-1, 0 ); VgaFrontLock vgaLock; delete backupPal; } } //--------- End of function Game::view_encyclopedia ---------// //-------- Begin of static function detect_main_class_button ---------// static int detect_main_class_button() { #ifdef AMPLUS enum { BUTTON_X = 14, BUTTON_Y = 14, BUTTON_WIDTH = 146, BUTTON_HEIGHT = 28 }; enum { BUTTON_Y_SPACING = 30 }; #else enum { BUTTON_X = 14, BUTTON_Y = 14, BUTTON_WIDTH = 146, BUTTON_HEIGHT = 31 }; enum { BUTTON_Y_SPACING = 34 }; #endif for( int c=1 ; c<=ENCYC_CLASS_COUNT ; c++ ) { //if( mouse.press_area( BUTTON_X, BUTTON_Y + (c-1)*BUTTON_Y_SPACING, BUTTON_X + BUTTON_WIDTH-1, // BUTTON_Y + c*BUTTON_Y_SPACING-1) ) if( mouse.single_click( BUTTON_X, BUTTON_Y + (c-1)*BUTTON_Y_SPACING, BUTTON_X + BUTTON_WIDTH-1, BUTTON_Y + c*BUTTON_Y_SPACING-1) ) { vga.blt_buf( BUTTON_X, BUTTON_Y + (main_class_id-1)*BUTTON_Y_SPACING, BUTTON_X + BUTTON_WIDTH-1, BUTTON_Y + main_class_id*BUTTON_Y_SPACING-1, 0); // ###### begin Gilbert 22/9 #######// // image_encyc.put_front(BUTTON_X-2, BUTTON_Y + (c-1)*BUTTON_Y_SPACING-2, "B_DOWN"); image_encyc.put_front(BUTTON_X, BUTTON_Y + (c-1)*BUTTON_Y_SPACING, "B_DOWN"); // ###### end Gilbert 22/9 #######// return c; } } return 0; } //-------- End of static function detect_main_class_button ---------// //-------- Begin of static function detect_sub_class_button ---------// static int detect_sub_class_button(int n, int firstButton) { #ifdef AMPLUS enum { BUTTON_X = 14, BUTTON_Y = 236, BUTTON_WIDTH = 146, BUTTON_HEIGHT = 28 }; enum { BUTTON_Y_SPACING = 31, MAX_BUTTON = 10 }; #else enum { BUTTON_X = 14, BUTTON_Y = 266, BUTTON_WIDTH = 146, BUTTON_HEIGHT = 31 }; enum { BUTTON_Y_SPACING = 35, MAX_BUTTON = 8 }; #endif for( int c=firstButton ; c<=n && c<=SUB_CLASS_BUTTON_MAX ; c++ ) { //if( mouse.press_area( BUTTON_X, BUTTON_Y + (c-1)*BUTTON_Y_SPACING, BUTTON_X + BUTTON_WIDTH-1, // BUTTON_Y + c*BUTTON_Y_SPACING-1) ) if( mouse.single_click( BUTTON_X, BUTTON_Y + (c-1)*BUTTON_Y_SPACING, BUTTON_X + BUTTON_WIDTH-1, BUTTON_Y + c*BUTTON_Y_SPACING-1) ) { // int subClassId = sub_class_id_array[main_class_id-1]; // vga.blt_buf( BUTTON_X, BUTTON_Y + (subClassId-1)*BUTTON_Y_SPACING, BUTTON_X + BUTTON_WIDTH-1, // BUTTON_Y + subClassId*BUTTON_Y_SPACING-1, 0); // ###### begin Gilbert 22/9 #######// // image_encyc.put_front(BUTTON_X-2, BUTTON_Y + (c-1)*BUTTON_Y_SPACING-2, "B_DOWN"); image_encyc.put_front(BUTTON_X, BUTTON_Y + (c-1)*BUTTON_Y_SPACING, "B_DOWN"); // ###### end Gilbert 22/9 #######// return c; } } return 0; } //-------- End of static function detect_sub_class_button ---------// //-------- Begin of static function disp_class_buttons ---------// // static void disp_class_buttons() { // ###### begin Gilbert 22/9 #######// #ifdef AMPLUS enum { BUTTON_X=14, BUTTON_WIDTH=146, CLASS_BUTTON_Y=14, CLASS_BUTTON_Y_SPACING=30, SUBCLASS_BUTTON_Y=236, SUBCLASS_TOP_BORDER=3, BUTTON_Y_SPACING=31 }; #else enum { BUTTON_X=14, BUTTON_WIDTH=146, CLASS_BUTTON_Y=14, CLASS_BUTTON_Y_SPACING=34, SUBCLASS_BUTTON_Y=266, SUBCLASS_TOP_BORDER=4, BUTTON_Y_SPACING=35 }; #endif // ###### end Gilbert 22/9 #######// int subClassId = sub_class_id_array[main_class_id-1]; if( main_class_id != ENCYC_FRYHTANS ) { vga_back.put_bitmap(12, SUBCLASS_BUTTON_Y-SUBCLASS_TOP_BORDER, image_encyc.get_ptr(button_name_array[main_class_id-1]) ); } else { // if in monster class, find out which page int monsterSubClass; for( monsterSubClass = 1; monsterSubClass <= FRYHTAN_MAX_PAGE && sub_class_id_array[main_class_id-1]-1 >= monster_page_index[monsterSubClass]; ++monsterSubClass); err_when( monsterSubClass > FRYHTAN_MAX_PAGE ); vga_back.put_bitmap(12, SUBCLASS_BUTTON_Y-SUBCLASS_TOP_BORDER, image_encyc.get_ptr(monster_button_name_array[monsterSubClass-1]) ); // modify subClassId subClassId -= monster_page_index[monsterSubClass-1]; } vga.blt_buf( BUTTON_X, 14, BUTTON_X+BUTTON_WIDTH-1, VGA_HEIGHT-40, 0 ); int y=CLASS_BUTTON_Y; // ###### begin Gilbert 22/9 #######// image_encyc.put_front( BUTTON_X, y + (main_class_id-1)*CLASS_BUTTON_Y_SPACING, "B_DOWN"); // ###### end Gilbert 22/9 #######// y=SUBCLASS_BUTTON_Y; // #### begin Gilbert 22/9 #######// image_encyc.put_front( BUTTON_X, y + (subClassId-1)*BUTTON_Y_SPACING, "B_DOWN"); // #### end Gilbert 22/9 #######// } //-------- End of static function disp_class_buttons ---------// //-------- Begin of static function disp_picture ---------// // // selClass, selSubClass - currently selected class and subclass id. // [int] firstDisp - whether it is the first display action // when the encyclopedia is called upl. // static int disp_picture( int selClass, int selSubClass, int firstDisp) { if( !DIR_ENCYC[0] ) return 0; char filename[64]; char palname[64]; filename[0] = '\0'; #ifdef AMPLUS // alternative path char filename2[64]; char palname2[64]; filename2[0] = '\0'; #endif switch( selClass ) { case ENCYC_PEOPLE: strcpy( filename, DIR_ENCYC ); strcat( filename, "UNIT\\" ); strcat( filename, race_name[selSubClass-1] ); strcpy( palname, filename); strcat( palname, pal_extension); strcat( filename, std_extension ); #ifdef AMPLUS if( DIR_ENCYC2[0] ) { strcpy( filename2, DIR_ENCYC2 ); strcat( filename2, "UNIT\\" ); strcat( filename2, race_name[selSubClass-1] ); strcpy( palname2, filename2); strcat( palname2, pal_extension); strcat( filename2, std_extension ); } #endif break; case ENCYC_WEAPONS: strcpy( filename, DIR_ENCYC ); strcat( filename, "UNIT\\" ); strcat( filename, weapon_name[selSubClass-1] ); strcpy( palname, filename); strcat( palname, pal_extension); strcat( filename, std_extension ); #ifdef AMPLUS if( DIR_ENCYC2[0] ) { strcpy( filename2, DIR_ENCYC2 ); strcat( filename2, "UNIT\\" ); strcat( filename2, weapon_name[selSubClass-1] ); strcpy( palname2, filename2); strcat( palname2, pal_extension); strcat( filename2, std_extension ); } #endif break; case ENCYC_SHIPS: strcpy( filename, DIR_ENCYC ); strcat( filename, "UNIT\\" ); strcat( filename, ship_name[selSubClass-1] ); strcpy( palname, filename); strcat( palname, pal_extension); strcat( filename, std_extension ); #ifdef AMPLUS if( DIR_ENCYC2[0] ) { strcpy( filename2, DIR_ENCYC2 ); strcat( filename2, "UNIT\\" ); strcat( filename2, ship_name[selSubClass-1] ); strcpy( palname2, filename2); strcat( palname2, pal_extension); strcat( filename2, std_extension ); } #endif break; case ENCYC_STRUCTURES: strcpy( filename, DIR_ENCYC ); strcat( filename, "FIRM\\" ); strcat( filename, firm_name[selSubClass-1] ); strcpy( palname, filename); strcat( palname, pal_extension); strcat( filename, std_extension ); #ifdef AMPLUS if( DIR_ENCYC2[0] ) { strcpy( filename2, DIR_ENCYC2 ); strcat( filename2, "FIRM\\" ); strcat( filename2, firm_name[selSubClass-1] ); strcpy( palname2, filename2); strcat( palname2, pal_extension); strcat( filename2, std_extension ); } #endif break; case ENCYC_PALACE: strcpy( filename, DIR_ENCYC ); strcat( filename, "SEAT\\" ); strcat( filename, race_name[selSubClass-1] ); strcpy( palname, filename); strcat( palname, pal_extension); strcat( filename, std_extension ); #ifdef AMPLUS if( DIR_ENCYC2[0] ) { strcpy( filename2, DIR_ENCYC2 ); strcat( filename2, "SEAT\\" ); strcat( filename2, race_name[selSubClass-1] ); strcpy( palname2, filename2); strcat( palname2, pal_extension); strcat( filename2, std_extension ); } #endif break; case ENCYC_GOD: strcpy( filename, DIR_ENCYC ); strcat( filename, "GOD\\" ); strcat( filename, god_name[selSubClass-1] ); strcpy( palname, filename); strcat( palname, pal_extension); strcat( filename, std_extension ); #ifdef AMPLUS if( DIR_ENCYC2[0] ) { strcpy( filename2, DIR_ENCYC2 ); strcat( filename2, "GOD\\" ); strcat( filename2, god_name[selSubClass-1] ); strcpy( palname2, filename2); strcat( palname2, pal_extension); strcat( filename2, std_extension ); } #endif break; case ENCYC_FRYHTANS: strcpy( filename, DIR_ENCYC ); strcat( filename, "MONSTER\\" ); strcat( filename, monster_name[selSubClass-1] ); strcpy( palname, filename); strcat( palname, pal_extension); strcat( filename, std_extension ); #ifdef AMPLUS if( DIR_ENCYC2[0] ) { strcpy( filename2, DIR_ENCYC2 ); strcat( filename2, "MONSTER\\" ); strcat( filename2, monster_name[selSubClass-1] ); strcpy( palname2, filename2); strcat( palname2, pal_extension); strcat( filename2, std_extension ); } #endif break; default: err_here(); return 0; } File pictFile; char *palNamePtr = NULL; if( #ifdef AMPLUS // search DIR_ENCYC2 first filename2[0] && m.is_file_exist(filename2) && pictFile.file_open(filename2,0) && (palNamePtr = palname2) || #endif filename[0] && m.is_file_exist(filename) && pictFile.file_open(filename,0) && (palNamePtr = palname) ) { vga_back.put_large_bitmap(174, 12, &pictFile); if( !firstDisp ) vga_front.bar(174,12,787,587, 0x00); // wipe the picture screen if( palNamePtr && m.is_file_exist(palNamePtr) ) { VgaFrontLock vgaLock; VgaCustomPalette::set_custom_palette(palNamePtr); } if( !firstDisp ) vga.blt_buf(174,12,787,587, 0); return 1; } return 0; } //-------- End of static function disp_picture ---------//