123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439 |
- /*
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
- //Filename : OTECHRES.CPP
- //Description : Tech class
- #include <ALL.h>
- #include <OGAME.h>
- #include <OGAMESET.h>
- #include <OF_RESE.h>
- #include <OUNIT.h>
- #include <ORESX.h>
- #include <ONATION.h>
- #include <OTECHRES.h>
- //---------- #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 ; i<tech_class_count ; i++ )
- {
- techClassRec = (TechClassRec*) dbTechClass->read(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 ; i<tech_count ; i++ )
- {
- techRec = (TechRec*) dbTech->read(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 ; i<tech_res.tech_count ; i++, techInfo++ )
- {
- techInfo->set_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.
- //
- // <int> nationRecno - the nation which makes progresses on the research of this technology.
- // <float> progressPoint - the progress point to be added to this research
- //
- // return: <int> 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 -----------//
|