/* * 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 : OTECHRES.CPP //Description : Tech class #include #include #include #include #include #include #include #include //---------- #define constant ------------// #define TECH_DB "TECH" #define TECH_CLASS_DB "TECHCLAS" #define TECH_BITMAP_FILE DIR_RES"I_TECH.RES" //------- Begin of function TechRes::TechRes -----------// TechRes::TechRes() { init_flag=0; } //--------- End of function TechRes::TechRes -----------// //---------- Begin of function TechRes::init -----------// // // This function must be called after a map is generated. // void TechRes::init() { deinit(); //---------- init bitmap resource ---------// res_bitmap.init(TECH_BITMAP_FILE, 1); // 1-read all into buffer //------- load database information --------// load_tech_class(); load_tech_info(); init_flag=1; } //---------- End of function TechRes::init -----------// //---------- Begin of function TechRes::deinit -----------// void TechRes::deinit() { if( init_flag ) { mem_del(tech_class_array); mem_del(tech_info_array); res_bitmap.deinit(); init_flag=0; } } //---------- End of function TechRes::deinit -----------// //------- Begin of function TechRes::load_tech_class -------// // // Read in information of TECHCLAS.DBF into memory array // void TechRes::load_tech_class() { TechClassRec *techClassRec; TechClass *techClass; Database *dbTechClass = game_set.open_db(TECH_CLASS_DB); tech_class_count = (short) dbTechClass->rec_count(); tech_class_array = (TechClass*) mem_add( sizeof(TechClass)*tech_class_count ); //------ read in tech information array -------// memset( tech_class_array, 0, sizeof(TechClass) * tech_class_count ); for( int i=0 ; iread(i+1); techClass = tech_class_array+i; techClass->class_id = i+1; techClass->icon_index = res_bitmap.get_index( m.nullify(techClassRec->icon_name, techClassRec->ICON_NAME_LEN) ); err_when( !techClass->icon_index ); } } //--------- End of function TechRes::load_tech_class ---------// //------- Begin of function TechRes::load_tech_info -------// // // Read in information of TECH.DBF into memory array // void TechRes::load_tech_info() { TechRec *techRec; TechInfo *techInfo; Database *dbTech = game_set.open_db(TECH_DB); tech_count = (short) dbTech->rec_count(); tech_info_array = (TechInfo*) mem_add( sizeof(TechInfo)*tech_count ); //------ read in tech information array -------// memset( tech_info_array, 0, sizeof(TechInfo) * tech_count ); int techClassId=0; TechClass* techClass; total_tech_level = 0; for( int i=0 ; iread(i+1); techInfo = tech_info_array+i; techInfo->tech_id = i+1; techInfo->class_id = m.atoi( techRec->class_id , techRec->ID_LEN ); techInfo->max_tech_level = m.atoi( techRec->max_tech_level, techRec->MAX_TECH_LEVEL_LEN ); techInfo->complex_level = m.atoi( techRec->complex_level , techRec->COMPLEX_LEVEL_LEN ); techInfo->unit_id = m.atoi( techRec->unit_id , techRec->ID_LEN ); techInfo->firm_id = m.atoi( techRec->firm_id , techRec->ID_LEN ); techInfo->parent_unit_id = m.atoi( techRec->parent_unit_id, techRec->ID_LEN ); techInfo->parent_firm_id = m.atoi( techRec->parent_firm_id, techRec->ID_LEN ); techInfo->parent_level = techRec->parent_level - '0'; if( techInfo->parent_unit_id || techInfo->parent_firm_id ) err_when( techInfo->parent_level<1 || techInfo->parent_level>9 ); techInfo->icon_index = res_bitmap.get_index( m.nullify(techRec->icon_name, techRec->ICON_NAME_LEN) ); if( techClassId != techInfo->class_id ) { techClass = tech_class(techInfo->class_id); techClassId = techInfo->class_id; techClass->first_tech_id = i+1; techClass->tech_count = 1; } else techClass->tech_count++; total_tech_level += techInfo->max_tech_level; } } //--------- End of function TechRes::load_tech_info ---------// //---------- Begin of function TechClass::tech_icon -----------// char* TechClass::tech_icon() { return tech_res.res_bitmap.get_data(icon_index); } //---------- End of function TechClass::tech_icon -----------// //---------- Begin of function TechInfo::tech_large_icon -----------// char* TechInfo::tech_large_icon() { if( unit_id ) // ######## begin Gilbert 8/8 #########// return unit_res[unit_id]->get_large_icon_ptr(0); // ######## end Gilbert 8/8 #########// else return tech_res.res_bitmap.get_data(icon_index); } //---------- End of function TechInfo::tech_large_icon -----------// //---------- Begin of function TechInfo::tech_small_icon -----------// char* TechInfo::tech_small_icon() { if( unit_id ) // ####### begin Gilbert 17/10 #########// return unit_res[unit_id]->get_small_icon_ptr(RANK_SOLDIER); // ####### end Gilbert 17/10 #########// else return tech_res.res_bitmap.get_data(icon_index); } //---------- End of function TechInfo::tech_small_icon -----------// //---------- Begin of function TechInfo::tech_des -----------// char* TechInfo::tech_des() { if( unit_id ) return unit_res[unit_id]->name; else if( firm_id ) return firm_res[firm_id]->name; else return ""; } //---------- End of function TechInfo::tech_des -----------// #ifdef DEBUG //---------- Begin of function TechRes::operator[] -----------// TechInfo* TechRes::operator[](int techId) { err_if( techId<1 || techId>tech_count ) err_now( "TechRes::operator[]" ); return tech_info_array+techId-1; } //------------ End of function TechRes::operator[] -----------// //---------- Begin of function TechRes::tech_class -----------// TechClass* TechRes::tech_class(int techClassId) { err_if( techClassId<1 || techClassId>tech_count ) err_now( "TechRes::tech_class" ); return tech_class_array+techClassId-1; } //------------ End of function TechRes::tech_class -----------// #endif //--------- Begin of function TechRes::init_nation_tech --------// // // Close down all firms under this nation. // void TechRes::init_nation_tech(int nationRecno) { int i; TechInfo* techInfo = tech_res.tech_info_array; for( i=0 ; iset_nation_tech_level(nationRecno, 0); } } //----------- End of function TechRes::init_nation_tech ---------// //--------- Begin of function TechInfo::is_parent_tech_invented --------// // // Whether this technology can be researched or not. // int TechInfo::is_parent_tech_invented(int nationRecno) { if( parent_unit_id ) { if( unit_res[parent_unit_id]->get_nation_tech_level(nationRecno) < parent_level ) return 0; } if( parent_firm_id ) { if( firm_res[parent_firm_id]->get_nation_tech_level(nationRecno) < parent_level ) return 0; } return 1; } //----------- End of function TechInfo::is_parent_tech_invented ---------// //--------- Begin of function TechInfo::can_research --------// // // Whether this technology can be researched or not. // int TechInfo::can_research(int nationRecno) { return get_nation_tech_level(nationRecno) < max_tech_level && is_parent_tech_invented(nationRecno); } //----------- End of function TechInfo::can_research ---------// //--------- Begin of function TechInfo::progress --------// // // Make a progress with this technology's research. // // nationRecno - the nation which makes progresses on the research of this technology. // progressPoint - the progress point to be added to this research // // return: 1 - the research is completed // 0 - the researhc is not completed yet. // int TechInfo::progress(int nationRecno, float progressPoint) { err_when( nationRecno<1 || nationRecno>nation_array.size() ); nation_research_progress_array[nationRecno-1] += progressPoint; if( nation_research_progress_array[nationRecno-1] > 100 ) { set_nation_tech_level( nationRecno, nation_tech_level_array[nationRecno-1]+1 ); nation_research_progress_array[nationRecno-1] = (float) 0; return 1; } return 0; } //----------- End of function TechInfo::progress ---------// //--------- Begin of function TechInfo::get_progress --------// // float TechInfo::get_progress(int nationRecno) { err_when( nationRecno<1 || nationRecno>nation_array.size() ); return nation_research_progress_array[nationRecno-1]; } //----------- End of function TechInfo::get_progress ---------// //------ Begin of function TechInfo::inc_nation_is_researching ------// // void TechInfo::inc_nation_is_researching(int nationRecno) { err_when( nationRecno<1 || nationRecno>nation_array.size() ); nation_is_researching_array[nationRecno-1]++; } //------- End of function TechInfo::inc_nation_is_researching ------// //------ Begin of function TechInfo::dec_nation_is_researching ------// // void TechInfo::dec_nation_is_researching(int nationRecno) { err_when( nationRecno<1 || nationRecno>nation_array.size() ); nation_is_researching_array[nationRecno-1]--; err_when( nation_is_researching_array[nationRecno-1] < 0 ); } //------- End of function TechInfo::dec_nation_is_researching ------// //------ Begin of function TechInfo::set_nation_tech_level ------// // // Set the nation's tech level on this technology. // void TechInfo::set_nation_tech_level(int nationRecno, int techLevel) { err_when( nationRecno<1 || nationRecno>nation_array.size() ); err_when( techLevel > max_tech_level ); nation_tech_level_array[nationRecno-1] = techLevel; if( unit_id ) unit_res[unit_id]->set_nation_tech_level( nationRecno, techLevel ); else if( firm_id ) firm_res[firm_id]->set_nation_tech_level( nationRecno, techLevel ); //--- if the max level has been reached and there are still other firms researching this technology ---// if( techLevel == max_tech_level && is_nation_researching(nationRecno) > 0 ) { //---- stop other firms researching the same tech -----// Firm* firmPtr; for( int i=firm_array.size() ; i>0 ; i-- ) { if( firm_array.is_deleted(i) ) continue; firmPtr = firm_array[i]; if( firmPtr->firm_id == FIRM_RESEARCH && firmPtr->nation_recno == nationRecno && ((FirmResearch*)firmPtr)->tech_id == tech_id ) { ((FirmResearch*)firmPtr)->terminate_research(); } } } } //------- End of function TechInfo::set_nation_tech_level -------// //---------- Begin of function TechRes::inc_all_tech_level -----------// // // One of the cheating functions - increase the levels of all technology // by one level for the specific nation. // void TechRes::inc_all_tech_level(int nationRecno) { int curTechLevel; TechInfo* techInfo = tech_res.tech_info_array; for( int i=1 ; i<=tech_count ; i++, techInfo++ ) { curTechLevel = techInfo->get_nation_tech_level(nationRecno); if( curTechLevel < techInfo->max_tech_level ) techInfo->set_nation_tech_level( nationRecno, curTechLevel+1 ); } } //------------ End of function TechRes::inc_all_tech_level -----------//