/* * 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 : OTERRAIN.H //Description : Header file of object TerrainRes //Ownership : Gilbert #ifndef __OTERRAIN_H #define __OTERRAIN_H #ifndef __ORESDB_H #include #endif //---------- Define terrain type id. ----------// enum { TOTAL_TERRAIN_TYPE=4 }; enum { MAX_GEN_TERRAIN_TYPE=4 }; // map generator will not generate light dirt or above enum TerrainTypeCode { TERRAIN_OCEAN = 1, // abbrev = 'S' TERRAIN_DARK_GRASS, // 'G' TERRAIN_LIGHT_GRASS, // 'F' TERRAIN_DARK_DIRT, // 'D' - hill }; enum SubTerrainMask { BOTTOM_MASK = 1, // abbrev = '-' MIDDLE_MASK = 2, // '0' TOP_MASK = 4, // '+' NOT_TOP_MASK = BOTTOM_MASK | MIDDLE_MASK, // 'B' NOT_BOTTOM_MASK = MIDDLE_MASK | TOP_MASK, // 'A' ALL_MASK = BOTTOM_MASK | MIDDLE_MASK | TOP_MASK // '*' }; enum TerrainFlag { TERRAIN_FLAG_SNOW = 1, }; enum { TERRAIN_TILE_WIDTH = 64, TERRAIN_TILE_HEIGHT = 64, TERRAIN_TILE_X_MASK = 63, TERRAIN_TILE_Y_MASK = 63, }; //------------ Define struct TerrainRec ---------------// struct TerrainRec { enum { TYPE_CODE_LEN=2, FILE_NAME_LEN=8, BITMAP_PTR_LEN=4, PATTERN_ID_LEN=2 }; char nw_type_code[TYPE_CODE_LEN]; char ne_type_code[TYPE_CODE_LEN]; char sw_type_code[TYPE_CODE_LEN]; char se_type_code[TYPE_CODE_LEN]; char extra_flag; char special_flag; char represent_type; char secondary_type; char pattern_id[PATTERN_ID_LEN]; char file_name[FILE_NAME_LEN]; char bitmap_ptr[BITMAP_PTR_LEN]; }; //------------- Define struct TerrainInfo --------------// struct TerrainInfo { char nw_type, nw_subtype; char ne_type, ne_subtype; char sw_type, sw_subtype; char se_type, se_subtype; char average_type; char extra_flag; char special_flag; char secondary_type; char pattern_id; int is_coast() { return average_type==TERRAIN_OCEAN && secondary_type>TERRAIN_OCEAN || average_type> TERRAIN_OCEAN && secondary_type==TERRAIN_OCEAN; } char alternative_count_with_extra; // no. of alternative bitmaps of this terrain char alternative_count_without_extra; // no. of alternative bitmaps of this terrain unsigned char flags; char* bitmap_ptr; int anim_frames; char** anim_bitmap_ptr; char *get_bitmap(unsigned frameNo); int can_snow() { return flags & TERRAIN_FLAG_SNOW; } }; //------------ Define struct TerrainType ---------------// struct TerrainType { short first_terrain_id; short last_terrain_id; short min_height; }; // field related to terrain pattern substitution //----------- Define struct TerrainSubRec --------// struct TerrainSubRec { enum { SUB_NO_LEN=4, PATTERN_ID_LEN=2, DIRECTION_LEN=2, STEP_ID_LEN=2, SEC_ADJ_LEN=2}; char sub_no[SUB_NO_LEN]; char step_id[STEP_ID_LEN]; char old_pattern_id[PATTERN_ID_LEN]; char new_pattern_id[PATTERN_ID_LEN]; char sec_adj[SEC_ADJ_LEN]; char post_move[DIRECTION_LEN]; }; //---------- Define struct TerrainSubInfo --------// struct TerrainSubInfo { short sub_no; short step_id; char old_pattern_id; char new_pattern_id; char sec_adj; char post_move; TerrainSubInfo *next_step; }; //----------- Define struct TerrainAnimRec -------// struct TerrainAnimRec { enum { FILE_NAME_LEN=8, FRAME_NO_LEN=2, BITMAP_PTR_LEN=4 }; char base_file[FILE_NAME_LEN]; char frame_no[FRAME_NO_LEN]; char next_frame[FRAME_NO_LEN]; char filename[FILE_NAME_LEN]; char bitmap_ptr[BITMAP_PTR_LEN]; }; //----------- Define class TerrainRes ---------------// class TerrainRes { public: short terrain_count; TerrainInfo* terrain_info_array; char* file_name_array; TerrainType terrain_type_array[TOTAL_TERRAIN_TYPE]; short nw_type_min[TOTAL_TERRAIN_TYPE]; short nw_type_max[TOTAL_TERRAIN_TYPE]; //----- field related to terrain pattern substitution -----// short ter_sub_rec_count; short ter_sub_index_count; TerrainSubInfo* ter_sub_array; TerrainSubInfo** ter_sub_index; char init_flag; ResourceDb res_bitmap; ResourceDb anm_bitmap; public: TerrainRes(); void init(); void deinit(); int get_tera_type_id(char* teraTypeCode); char* get_map_tile(int terrainId); int scan(int nwType, int nwSubType, int neType, int neSubType, int swType, int swSubType, int seType, int seSubType, int firstInstance=0, int includeExtra=0, int special=0); int scan(int primaryType, int secondaryType, int patternId, int firstInstance=0, int includeExtra=0, int special=0); //---- function related to terrain pattern substitution ----// int search_pattern(int nwPatternId, TerrainSubInfo **resultArray, int maxResult); //---------- define code conversion function -------// static TerrainTypeCode terrain_code(char); static SubTerrainMask terrain_mask(char); static int terrain_height(int height, int* =NULL); static short min_height(TerrainTypeCode, SubTerrainMask = BOTTOM_MASK); static short max_height(TerrainTypeCode, SubTerrainMask = TOP_MASK); //-------------------------------------------------// #ifdef DEBUG TerrainInfo* operator[](int terrainId); #else TerrainInfo* operator[](int terrainId) { return terrain_info_array+terrainId-1; } #endif private: void load_info(); void load_sub_info(); void load_anim_info(); }; extern TerrainRes terrain_res; //----------------------------------------------------// #endif