00001 //Filename : OGAMESET.CPP 00002 //Description : Object Game Set 00003 00004 #include <ALL.H> 00005 #include <OSTR.H> 00006 #include <ODIR.H> 00007 #include <OGAMESET.H> 00008 #include <OMISC.H> 00009 00010 //-------- Define constant -------------// 00011 00012 #define SET_HEADER_DB "HEADER" 00013 00014 //--------- Begin of GameSet::init -------------// 00015 00016 void GameSet::init() { 00017 set_opened_flag=0; // no set has been opened 00018 00019 load_set_header(); // load the info. of all sets 00020 00021 init_flag=1; 00022 } 00023 00024 //----------- End of GameSet::init -------------// 00025 00026 //--------- Begin of GameSet::deinit -------------// 00027 00028 void GameSet::deinit() { 00029 if( init_flag ) { 00030 mem_del(set_info_array); 00031 00032 init_flag = 0; 00033 } 00034 } 00035 00036 //----------- End of GameSet::deinit -------------// 00037 00038 //--------- Begin of GameSet::load_set_header -------------// 00039 00040 void GameSet::load_set_header() { 00041 int i; 00042 Directory setDir; 00043 SetRec *setRec; 00044 SetInfo *setInfo; 00045 char *dataPtr; 00046 String str; 00047 00048 setDir.read( DIR_RES"*.SET", 1 ); // read in the file list of all game sets in the directory, 1-Sort file names 00049 00050 set_count = setDir.size(); // no. of game set available to choose 00051 00052 err_when( !set_count ); // error if there is no GameSet 00053 00054 set_info_array = (SetInfo*) mem_add( sizeof(SetInfo) * set_count ); 00055 00056 //-------- read in the headers of all game sets -------// 00057 00058 for( i=1 ; i<=set_count ; i++ ) { 00059 str = DIR_RES; 00060 str += setDir[i]->name; 00061 00062 set_res.init( str, 0 ); // open the game set first 00063 00064 dataPtr = set_res.read(SET_HEADER_DB); // get the pointer to the header database 00065 00066 err_when( !dataPtr ); 00067 00068 set_db.open_from_buf(dataPtr); // read in the header database 00069 00070 setRec = (SetRec*) set_db.read(1); // the header database only contains one record 00071 setInfo = set_info_array+i-1; 00072 00073 m.rtrim_fld( setInfo->code, setRec->code, setRec->CODE_LEN ); 00074 m.rtrim_fld( setInfo->des , setRec->des , setRec->DES_LEN ); 00075 } 00076 } 00077 00078 //----------- End of GameSet::load_set_header -------------// 00079 00080 //--------- Begin of GameSet::open_set -------------// 00081 // 00082 // Open the specific set. 00083 // Only one set can be activiated at a time in GameSet. 00084 // 00085 // <int> setId = the id. of the set; = 1 to ... 00086 // 00087 void GameSet::open_set(int setId) { 00088 err_if( setId<0 || setId>set_count ) 00089 err_here(); 00090 00091 cur_set_id = setId; 00092 00093 String str; 00094 00095 str = DIR_RES; 00096 str += set_info_array[setId-1].code; 00097 str += ".SET"; 00098 00099 set_res.init( str, 0 ); // 0-don't read all into the buffer 00100 00101 //-----------------------------------------------// 00102 00103 set_opened_flag=1; 00104 } 00105 00106 //----------- End of GameSet::open_set -------------// 00107 00108 //--------- Begin of GameSet::close_set -------------// 00109 // 00110 // Close current set 00111 // 00112 void GameSet::close_set() { 00113 set_res.deinit(); 00114 00115 set_opened_flag=0; 00116 } 00117 00118 //----------- End of GameSet::close_set -------------// 00119 00120 //--------- Begin of GameSet::open_db -------------// 00121 // 00122 // Open a database in the current set 00123 // 00124 // <char*> dbName = the name of the database to be opened 00125 // 00126 Database* GameSet::open_db(char* dbName) { 00127 err_when(!set_opened_flag); 00128 00129 char* dataPtr = set_res.read(dbName); 00130 00131 err_when( !dataPtr ); 00132 00133 set_db.open_from_buf(dataPtr); 00134 00135 return &set_db; 00136 } 00137 00138 //----------- End of GameSet::open_db -------------// 00139 00140 //--------- Begin of GameSet::get_db -------------// 00141 00142 Database* GameSet::get_db() { 00143 err_when(!set_opened_flag); 00144 00145 return &set_db; 00146 } 00147 00148 //----------- End of GameSet::get_db -------------// 00149 00150 //--------- Begin of GameSet::find_set -------------// 00151 // 00152 // Look for a specified game set 00153 // 00154 // <char*> setCode = the code of the game set. 00155 // 00156 // return : <int> >=1 - the id. of the game set 00157 // 0 - the game set code is not found 00158 // 00159 int GameSet::find_set(char* setCode) { 00160 int i; 00161 00162 for( i=0 ; i<set_count ; i++ ) { 00163 if( strcmp( set_info_array[i].code, setCode )==0 ) 00164 return i+1; 00165 } 00166 00167 return 0; 00168 } 00169 00170 //----------- End of GameSet::find_set -------------//