/* * 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 : OR_TECH.CPP //Description : Technology Report #include #include #include #include #include #include #include #include #include #include #include //------------- Define coordinations -----------// enum { TECH_BROWSE_X1 = ZOOM_X1+6, TECH_BROWSE_Y1 = ZOOM_Y1+6, TECH_BROWSE_X2 = ZOOM_X2-6, TECH_BROWSE_Y2 = TECH_BROWSE_Y1+220 }; enum { SCROLL_X1 = ZOOM_X1+6, SCROLL_Y1 = TECH_BROWSE_Y2+6, SCROLL_X2 = ZOOM_X2-6, SCROLL_Y2 = SCROLL_Y1+80 }; enum { GOD_BROWSE_X1 = ZOOM_X1+6, GOD_BROWSE_Y1 = SCROLL_Y2+6, GOD_BROWSE_X2 = ZOOM_X2-6, GOD_BROWSE_Y2 = ZOOM_Y2-6 }; //----------- Define static variables ----------// static VBrowseIF browse_tech, browse_god; //----------- Define static functions ----------// static int tech_filter(int recNo=0); static int god_filter(int recNo=0); static void put_tech_rec(int recNo, int x, int y, int refreshFlag); static void put_god_rec(int recNo, int x, int y, int refreshFlag); static void disp_owned_scroll(); static void disp_scroll(int x, int y, int raceId); //--------- Begin of function Info::disp_tech ---------// // void Info::disp_tech(int refreshFlag) { //-------- display the technology browser ---------// int x=TECH_BROWSE_X1+9; int y=TECH_BROWSE_Y1+4; vga_back.d3_panel_up(TECH_BROWSE_X1, TECH_BROWSE_Y1, TECH_BROWSE_X2, TECH_BROWSE_Y1+32 ); font_san.put( x , y+7, "Technology" ); #if(defined(SPANISH)) font_san.put( x+160, y , "Version" ); font_san.put( x+160, y+13, "Present"); font_san.put( x+245, y , "Version" ); font_san.put( x+230, y+13, "Researching"); font_san.put( x+320, y+7, "Research Progress" ); font_san.put( x+460, y , "Tower of" ); font_san.put( x+468, y+13, "Science" ); #elif(defined(FRENCH)) font_san.put( x+160, y , "Catégorie" ); font_san.put( x+160, y+13, "Actuelle" ); font_san.put( x+230, y , "Catégorie" ); font_san.put( x+230, y+13, "Recherchée" ); font_san.put( x+320, y, "Etat de la" ); font_san.put( x+320, y+13, "Recherche"); font_san.put( x+460, y , "Tour du" ); font_san.put( x+462, y+13, "Savoir" ); #else // German and US font_san.put( x+160, y , "Present" ); font_san.put( x+160, y+13, "Version" ); font_san.put( x+230, y , "Researching" ); font_san.put( x+245, y+13, "Version" ); font_san.put( x+320, y+7, "Research Progress" ); font_san.put( x+460, y , "Tower of" ); font_san.put( x+462, y+13, "Science" ); #endif if( refreshFlag == INFO_REPAINT ) { browse_tech.init( TECH_BROWSE_X1, TECH_BROWSE_Y1+34, TECH_BROWSE_X2, TECH_BROWSE_Y2, 0, 22, tech_filter(), put_tech_rec, 1 ); browse_tech.open(browse_tech_recno); } else { browse_tech.paint(); browse_tech.open(browse_tech_recno, tech_filter()); } //----- display the list of acquired scrolls of power ----// disp_owned_scroll(); //-------- display the god unit browser ---------// x=GOD_BROWSE_X1+9; y=GOD_BROWSE_Y1+4; vga_back.d3_panel_up(GOD_BROWSE_X1, GOD_BROWSE_Y1, GOD_BROWSE_X2, GOD_BROWSE_Y1+20 ); font_san.put( x , y, "Greater Being" ); font_san.put( x+300, y, "Hit Points" ); if( refreshFlag == INFO_REPAINT ) { browse_god.init( GOD_BROWSE_X1, GOD_BROWSE_Y1+22, GOD_BROWSE_X2, GOD_BROWSE_Y2, 0, 22, god_filter(), put_god_rec, 1 ); browse_god.open(browse_god_recno); } else { browse_god.paint(); browse_god.open(browse_god_recno, god_filter()); } } //----------- End of function Info::disp_tech -----------// //--------- Begin of function Info::detect_tech ---------// // void Info::detect_tech() { if( browse_tech.detect() ) browse_tech_recno = browse_tech.recno(); if( browse_god.detect() ) { browse_god_recno = browse_god.recno(); if( browse_god.double_click ) { Unit* unitPtr = unit_array[ god_filter(browse_god.recno()) ]; world.go_loc( unitPtr->next_x_loc(), unitPtr->next_y_loc(), 1 ); } } } //----------- End of function Info::detect_tech -----------// //-------- Begin of static function tech_filter --------// // // This function has dual purpose : // // 1. when recNo is not given : // - return the total no. of firms of this nation // // 2. when recNo is given : // - return the firm recno in firm_array of the given recno. // static int tech_filter(int recNo) { int techCount=0; TechInfo* techInfo; for( int techId=tech_res.tech_count ; techId>0 ; techId-- ) { techInfo = tech_res[techId]; if( techInfo->is_nation_researching(info.viewing_nation_recno) || techInfo->get_nation_tech_level(info.viewing_nation_recno) > 0 ) { techCount++; } if( recNo && techCount==recNo ) return techId; } err_when( recNo ); // the recNo is not found, it is out of range return techCount; } //----------- End of static function tech_filter -----------// //-------- Begin of static function god_filter --------// // // This function has dual purpose : // // 1. when recNo is not given : // - return the total no. of firms of this nation // // 2. when recNo is given : // - return the firm recno in firm_array of the given recno. // static int god_filter(int recNo) { int godCount=0, totalUnit=unit_array.size(); Unit* unitPtr; for( int i=1 ; i<=totalUnit ; i++ ) { if( unit_array.is_deleted(i) ) continue; unitPtr = unit_array[i]; if( unitPtr->nation_recno == info.viewing_nation_recno && unit_res[ unitPtr->unit_id ]->unit_class == UNIT_CLASS_GOD ) { godCount++; } if( recNo && godCount==recNo ) return i; } err_when( recNo ); // the recNo is not found, it is out of range return godCount; } //----------- End of static function god_filter -----------// //-------- Begin of static function put_tech_rec --------// // static void put_tech_rec(int recNo, int x, int y, int refreshFlag) { int techId = tech_filter(recNo); TechInfo* techInfo = tech_res[techId]; //---------- display bitmap ----------// x+=3; y+=3; vga_back.put_bitmap( x, y-2, techInfo->tech_small_icon() ); //----------- display info ----------// y+=2; int curLevel = techInfo->get_nation_tech_level(info.viewing_nation_recno); font_san.put( x+28 , y, techInfo->tech_des() ); if( curLevel > 0 ) font_san.put( x+180, y, m.roman_number(curLevel) ); //----- if the nation is researching this technology -----// int isResearching = techInfo->is_nation_researching(info.viewing_nation_recno); if( isResearching ) { err_when( curLevel >= techInfo->max_tech_level ); font_san.put( x+260, y, m.roman_number(curLevel+1) ); font_san.put( x+480, y, isResearching ); //isResearching tells the no. of towers of science researching this technology //----- display the research progress bar -----// vga.d3_panel_down( x+320, y-2, x+440, y+14 ); vga_back.indicator( x+321, y-1, x+439, y+13, techInfo->get_progress(info.viewing_nation_recno), (float)100, VGA_GRAY ); } } //----------- End of static function put_tech_rec -----------// //-------- Begin of static function put_god_rec --------// // static void put_god_rec(int recNo, int x, int y, int refreshFlag) { UnitGod* unitGod = (UnitGod*) unit_array[ god_filter(recNo) ]; err_when( unit_res[unitGod->unit_id]->unit_class != UNIT_CLASS_GOD ); //----------- display info ----------// x+=3; y+=5; font_san.put( x, y, unit_res[unitGod->unit_id]->name ); //--------- display hit points -----------// String str; str = (int) unitGod->hit_points; str += "/"; str += unitGod->max_hit_points; font_san.put( x+300, y, str ); } //----------- End of static function put_god_rec -----------// //-------- Begin of static function disp_scroll --------// // static void disp_scroll(int x, int y, int raceId) { char iconName[]="SCROLL-0"; iconName[7] = race_res[raceId]->code[0]; image_spict.put_back( x, y, iconName ); } //----------- End of static function disp_scroll -----------// //-------- Begin of static function disp_owned_scroll --------// // static void disp_owned_scroll() { vga.d3_panel_down( SCROLL_X1, SCROLL_Y1, SCROLL_X2, SCROLL_Y2 ); //------ count the number of acquired scrolls ------// Nation* nationPtr = nation_array[info.viewing_nation_recno]; int scrollCount=0; int i; for( i=0 ; iknow_base_array[i] ) scrollCount++; } //------- display words -------// if( scrollCount > 1 ) font_san.put( SCROLL_X1+6, SCROLL_Y1+5, "Acquired Scrolls:" ); else font_san.put( SCROLL_X1+6, SCROLL_Y1+5, "Acquired Scroll:" ); //------- display scrolls ----------// int x=SCROLL_X1+6, y=SCROLL_Y1+18; for( i=0 ; iknow_base_array[i] ) continue; disp_scroll(x, y, i+1 ); font_san.put( x+36, y+6, race_res[i+1]->name ); x+=105; if( x+95 > SCROLL_X2 ) { x = SCROLL_X1+6; y += 30; } } } //----------- End of static function disp_owned_scroll -----------//