1 /* 2 * Seven Kingdoms: Ancient Adversaries 3 * 4 * Copyright 1997,1998 Enlight Software Ltd. 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program. If not, see <http://www.gnu.org/licenses/>. 18 * 19 */ 20 21 //Filename : OFIRMRES.H 22 //Description : Header file of object FirmRes 23 24 #ifndef __OFIRMRES_H 25 #define __OFIRMRES_H 26 27 #ifndef __GAMEDEF_H 28 #include <GAMEDEF.h> 29 #endif 30 31 #ifndef __OFIRM_H 32 #include <OFIRM.h> 33 #endif 34 35 #ifndef __ORESDB_H 36 #include <ORESDB.h> 37 #endif 38 39 //------- Define constant ----------// 40 41 #define MAX_FIRM_FRAME 11 // Maximum frames for firm animation 42 43 #define MAX_FIRM_LOC_WIDTH 4 // Maximum no. of locations a firm can occupy 44 #define MAX_FIRM_LOC_HEIGHT 4 45 46 //------------- Firm Mode ------------// 47 48 enum { FIRM_UNDER_CONSTRUCTION='U', // definitions of FirmBuild::mode 49 FIRM_IDLE='I', 50 FIRM_ACTIVE='A', 51 }; 52 53 //------------ Define struct FirmRec ---------------// 54 55 struct FirmRec 56 { 57 enum { CODE_LEN=8, NAME_LEN=20, SHORT_NAME_LEN=12, TITLE_LEN=10, FIRST_BUILD_LEN=3, BUILD_COUNT_LEN=3, 58 HIT_POINTS_LEN=5, COST_LEN=5 }; 59 60 char code[CODE_LEN]; 61 char name[NAME_LEN]; 62 char short_name[SHORT_NAME_LEN]; 63 64 char overseer_title[TITLE_LEN]; 65 char worker_title[TITLE_LEN]; 66 67 char tera_type; 68 char all_know; // whether all nations know how to build this firm in the beginning of the game 69 char live_in_town; // whether the workers of the firm lives in towns or not. 70 71 char hit_points[HIT_POINTS_LEN]; 72 73 char is_linkable_to_town; 74 75 char setup_cost[COST_LEN]; 76 char year_cost[COST_LEN]; 77 78 char first_build[FIRST_BUILD_LEN]; 79 char build_count[BUILD_COUNT_LEN]; 80 }; 81 82 //------------ Define struct FirmBuildRec ---------------// 83 84 struct FirmBuildRec 85 { 86 enum { FIRM_CODE_LEN=8, RACE_CODE_LEN=8, BITMAP_RECNO_LEN=5, FIRST_FRAME_LEN=5, FRAME_COUNT_LEN=2, RACE_ID_LEN=3 }; 87 88 char firm_code[FIRM_CODE_LEN]; 89 char race_code[RACE_CODE_LEN]; 90 91 char animate_full_size; 92 93 char under_construction_bitmap_recno[BITMAP_RECNO_LEN]; 94 // ##### begin Gilbert 18/10 ########// 95 char under_construction_bitmap_count[FRAME_COUNT_LEN]; 96 // ##### end Gilbert 18/10 ########// 97 char idle_bitmap_recno[BITMAP_RECNO_LEN]; 98 char ground_bitmap_recno[BITMAP_RECNO_LEN]; 99 100 char first_frame[FIRST_FRAME_LEN]; 101 char frame_count[FRAME_COUNT_LEN]; 102 103 char race_id[RACE_ID_LEN]; 104 }; 105 106 //------------ Define struct FirmFrameRec ---------------// 107 108 struct FirmFrameRec 109 { 110 enum { FIRM_CODE_LEN=8, RACE_CODE_LEN=8, FRAME_ID_LEN=2, DELAY_LEN=2, FIRST_BITMAP_LEN=5, BITMAP_COUNT_LEN=2 }; 111 112 char firm_code[FIRM_CODE_LEN]; 113 char race_code[RACE_CODE_LEN]; 114 115 char frame_id[FRAME_ID_LEN]; 116 117 char delay[DELAY_LEN]; // unit: 1/10 second 118 119 char first_bitmap[FIRST_BITMAP_LEN]; 120 char bitmap_count[BITMAP_COUNT_LEN]; 121 }; 122 123 //------------ Define struct FirmBitmapRec ---------------// 124 125 struct FirmBitmapRec 126 { 127 enum { FIRM_CODE_LEN=8, RACE_CODE_LEN=8, FRAME_ID_LEN=2, LOC_LEN=3, OFFSET_LEN=3, DELAY_LEN=2, FILE_NAME_LEN=8, BITMAP_PTR_LEN=4 }; 128 129 char firm_code[FIRM_CODE_LEN]; 130 char race_code[RACE_CODE_LEN]; 131 char mode; 132 133 char frame_id[FRAME_ID_LEN]; 134 135 char loc_width[LOC_LEN]; 136 char loc_height[LOC_LEN]; 137 char layer; 138 139 char offset_x[OFFSET_LEN]; 140 char offset_y[OFFSET_LEN]; 141 142 char delay[DELAY_LEN]; // unit: 1/10 second 143 144 char file_name[FILE_NAME_LEN]; 145 char bitmap_ptr[BITMAP_PTR_LEN]; 146 }; 147 148 //------------- Define struct FirmInfo --------------// 149 150 #pragma pack(1) 151 struct FirmInfo 152 { 153 enum { NAME_LEN=20, SHORT_NAME_LEN=12, TITLE_LEN=10 }; 154 155 char firm_id; 156 char name[NAME_LEN+1]; 157 char short_name[SHORT_NAME_LEN+1]; 158 159 char overseer_title[TITLE_LEN+1]; 160 char worker_title[TITLE_LEN+1]; 161 162 char tera_type; 163 char buildable; // whether this building can be built by the player or it exists in the game since the beginning of the game. If setup_cost==0, this firm is not buildable 164 char live_in_town; // whether the workers of the firm lives in towns or not. 165 short max_hit_points; 166 167 char need_overseer; 168 char need_worker; need_unitFirmInfo169 char need_unit() { return need_overseer || need_worker; } 170 171 short setup_cost; 172 short year_cost; 173 174 short first_build_id; 175 short build_count; 176 177 short loc_width; 178 short loc_height; 179 180 char firm_skill_id; // the id. of the skill that fits this firm 181 char firm_race_id; // only can be built and operated by this race 182 183 int can_build(int unitRecno); 184 185 char is_linkable_to_town; 186 int is_linkable_to_firm(int linkFirmId); 187 188 int default_link_status(int linkFirmId); 189 190 //---------- game vars -----------// 191 192 short total_firm_count; // total no. of this firm type on the map 193 short nation_firm_count_array[MAX_NATION]; 194 195 char nation_tech_level_array[MAX_NATION]; get_nation_tech_levelFirmInfo196 int get_nation_tech_level(int nationRecno) { return nation_tech_level_array[nationRecno-1]; } set_nation_tech_levelFirmInfo197 void set_nation_tech_level(int nationRecno, char techLevel) { nation_tech_level_array[nationRecno-1] = techLevel; } 198 199 public: 200 int get_build_id(const char* buildCode); 201 202 void inc_nation_firm_count(int nationRecno); 203 void dec_nation_firm_count(int nationRecno); 204 }; 205 #pragma pack() 206 207 //------------- Define struct FirmBuild --------------// 208 209 struct FirmBuild 210 { 211 enum { BUILD_CODE_LEN=8 }; 212 213 char build_code[BUILD_CODE_LEN+1]; // building code, either a race code or a custom code for each firm's own use, it is actually read from FirmBuildRec::race_code[] 214 char race_id; 215 char animate_full_size; 216 217 //----- info of the first frame -----// 218 219 char loc_width; // no. of locations it takes horizontally and vertically 220 char loc_height; 221 222 char min_offset_x, min_offset_y; 223 short max_bitmap_width, max_bitmap_height; 224 225 //----------- frame info ------------// 226 227 short frame_count; 228 229 short first_bitmap_array[MAX_FIRM_FRAME]; 230 short bitmap_count_array[MAX_FIRM_FRAME]; 231 short frame_delay_array[MAX_FIRM_FRAME]; // unit: 1/10 second 232 233 short under_construction_bitmap_recno; // bitmap recno of the firm that is under construction 234 // ##### begin Gilbert 18/10 ########// 235 short under_construction_bitmap_count; 236 // ##### end Gilbert 18/10 ########// 237 short idle_bitmap_recno; // bitmap recno of the firm that is idle 238 short ground_bitmap_recno; 239 first_bitmapFirmBuild240 short first_bitmap(int frameId) { return first_bitmap_array[frameId-1]; } bitmap_countFirmBuild241 short bitmap_count(int frameId) { return bitmap_count_array[frameId-1]; } frame_delayFirmBuild242 short frame_delay(int frameId) { return frame_delay_array[frameId-1]; } 243 }; 244 245 //------------- Define struct FirmBitmap --------------// 246 247 struct FirmBitmap 248 { 249 char* bitmap_ptr; 250 short width, height; 251 252 char loc_width; // no. of locations it takes horizontally and vertically 253 char loc_height; 254 char offset_x, offset_y; 255 char display_layer; 256 257 void draw_at(int absX, int absY, char *colorTable, int displayLayer); 258 }; 259 260 //----------- Define class FirmRes ---------------// 261 262 class FirmRes 263 { 264 public: 265 short firm_count; 266 short firm_build_count; 267 short firm_bitmap_count; 268 269 FirmInfo* firm_info_array; 270 FirmBuild* firm_build_array; 271 FirmBitmap* firm_bitmap_array; 272 273 char init_flag; 274 ResourceDb res_bitmap; 275 276 public: 277 FirmRes(); 278 279 void init(); 280 void deinit(); 281 282 int write_file(File* filePtr); 283 int read_file(File* filePtr); 284 get_bitmap(int bitmapId)285 FirmBitmap* get_bitmap(int bitmapId) { return firm_bitmap_array+bitmapId-1; } get_build(int buildId)286 FirmBuild* get_build(int buildId) { return firm_build_array+buildId-1; } 287 FirmInfo* operator[](int firmId); 288 289 private: 290 void load_firm_info(); 291 void load_firm_build(); 292 void load_firm_bitmap(); 293 void process_firm_info(); 294 }; 295 296 extern FirmRes firm_res; 297 298 //----------------------------------------------------// 299 300 #endif 301