1 //Copyright Paul Reiche, Fred Ford. 1992-2002 2 3 /* 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 */ 18 19 #ifndef UQM_PLANETS_PLANDATA_H_ 20 #define UQM_PLANETS_PLANDATA_H_ 21 22 #include "libs/reslib.h" 23 24 #if defined(__cplusplus) 25 extern "C" { 26 #endif 27 28 /*------------------------------ Type Defines ----------------------------- */ 29 #define NUMBER_OF_ORBITS 16 30 #define VACANT 0xFF 31 32 enum 33 { 34 SMALL_ROCKY_WORLD = 0, 35 LARGE_ROCKY_WORLD, 36 GAS_GIANT, 37 38 NUM_PLANET_TYPES 39 }; 40 41 enum 42 { 43 DWARF_STAR = 0, 44 GIANT_STAR, 45 SUPER_GIANT_STAR, 46 47 NUM_STAR_TYPES 48 }; 49 50 enum 51 { 52 BLUE_BODY = 0, 53 GREEN_BODY, 54 ORANGE_BODY, 55 RED_BODY, 56 WHITE_BODY, 57 GRAY_BODY = WHITE_BODY, 58 YELLOW_BODY, 59 60 NUM_STAR_COLORS, 61 62 CYAN_BODY = NUM_STAR_COLORS, 63 PURPLE_BODY, 64 VIOLET_BODY 65 }; 66 67 enum 68 { 69 OWNER_NOBODY = 0, 70 OWNER_NEUTRAL, 71 OWNER_HIERARCHY, 72 73 OWNER_PLAYER = (1 << 2) 74 }; 75 76 #define STAR_OWNER_SHIFT 0 77 #define STAR_TYPE_SHIFT 3 /* STAR_OWNER_SHIFT + 3 */ 78 #define STAR_COLOR_SHIFT 5 /* STAR_TYPE_SHIFT + 2 */ 79 #define STAR_COLOR_MASK (BYTE)(0xFF << STAR_COLOR_SHIFT) 80 #define STAR_TYPE_MASK (BYTE)((0xFF << STAR_TYPE_SHIFT) \ 81 & ~STAR_COLOR_MASK) 82 #define STAR_OWNER_MASK (BYTE)((0xFF << STAR_OWNER_SHIFT) \ 83 & ~(STAR_COLOR_MASK \ 84 | STAR_TYPE_MASK)) 85 #define STAR_UNKNOWN_MASK (STAR_OWNER_MASK & ~OWNER_PLAYER) 86 87 #define MAKE_STAR(t,c,o) \ 88 (BYTE)((((BYTE)(t) << STAR_TYPE_SHIFT) & STAR_TYPE_MASK) \ 89 | (((BYTE)(c) << STAR_COLOR_SHIFT) & STAR_COLOR_MASK) \ 90 | (((BYTE)(o) << STAR_OWNER_SHIFT) & STAR_OWNER_MASK)) 91 #define STAR_TYPE(f) (BYTE)(((f) & STAR_TYPE_MASK) >> STAR_TYPE_SHIFT) 92 #define STAR_COLOR(f) (BYTE)(((f) & STAR_COLOR_MASK) >> STAR_COLOR_SHIFT) 93 #define STAR_OWNER(f) (BYTE)(((f) & STAR_OWNER_MASK) >> STAR_OWNER_SHIFT) 94 #define STAR_UNKNOWN(f) (BOOLEAN)((STAR_OWNER(f) \ 95 & STAR_UNKNOWN_MASK) == STAR_UNKNOWN_MASK) 96 97 #define PLAN_SIZE_MASK 0x03 98 99 #define TOPO_ALGO (0 << 2) 100 #define CRATERED_ALGO (1 << 2) 101 #define GAS_GIANT_ALGO (2 << 2) 102 #define PLAN_ALGO_MASK 0x0C 103 104 #define PLANSIZE(type) ((BYTE)((type) & PLAN_SIZE_MASK)) 105 #define PLANALGO(type) ((BYTE)((type) & PLAN_ALGO_MASK)) 106 #define PLANCOLOR(type) HINIBBLE (type) 107 108 #define THIN_ATMOSPHERE 10 109 #define NORMAL_ATMOSPHERE 75 110 #define THICK_ATMOSPHERE 200 111 #define SUPER_THICK_ATMOSPHERE 2500 112 #define GAS_GIANT_ATMOSPHERE 0xFFFF 113 114 enum 115 { 116 FIRST_ROCKY_WORLD = 0, 117 FIRST_SMALL_ROCKY_WORLD = FIRST_ROCKY_WORLD, 118 119 OOLITE_WORLD = FIRST_SMALL_ROCKY_WORLD, 120 YTTRIC_WORLD, 121 QUASI_DEGENERATE_WORLD, 122 LANTHANIDE_WORLD, 123 TREASURE_WORLD, 124 UREA_WORLD, 125 METAL_WORLD, 126 RADIOACTIVE_WORLD, 127 OPALESCENT_WORLD, 128 CYANIC_WORLD, 129 ACID_WORLD, 130 ALKALI_WORLD, 131 HALIDE_WORLD, 132 GREEN_WORLD, 133 COPPER_WORLD, 134 CARBIDE_WORLD, 135 ULTRAMARINE_WORLD, 136 NOBLE_WORLD, 137 AZURE_WORLD, 138 CHONDRITE_WORLD, 139 PURPLE_WORLD, 140 SUPER_DENSE_WORLD, 141 PELLUCID_WORLD, 142 DUST_WORLD, 143 CRIMSON_WORLD, 144 CIMMERIAN_WORLD, 145 INFRARED_WORLD, 146 SELENIC_WORLD, 147 AURIC_WORLD, 148 LAST_SMALL_ROCKY_WORLD = AURIC_WORLD, 149 150 FIRST_LARGE_ROCKY_WORLD, 151 FLUORESCENT_WORLD = FIRST_LARGE_ROCKY_WORLD, 152 ULTRAVIOLET_WORLD, 153 PLUTONIC_WORLD, 154 RAINBOW_WORLD, 155 SHATTERED_WORLD, 156 SAPPHIRE_WORLD, 157 ORGANIC_WORLD, 158 XENOLITHIC_WORLD, 159 REDUX_WORLD, 160 PRIMORDIAL_WORLD, 161 EMERALD_WORLD, 162 CHLORINE_WORLD, 163 MAGNETIC_WORLD, 164 WATER_WORLD, 165 TELLURIC_WORLD, 166 HYDROCARBON_WORLD, 167 IODINE_WORLD, 168 VINYLOGOUS_WORLD, 169 RUBY_WORLD, 170 MAGMA_WORLD, 171 MAROON_WORLD, 172 LAST_LARGE_ROCKY_WORLD = MAROON_WORLD, 173 174 FIRST_GAS_GIANT, 175 BLU_GAS_GIANT = FIRST_GAS_GIANT, /* Gas Giants */ 176 CYA_GAS_GIANT, 177 GRN_GAS_GIANT, 178 GRY_GAS_GIANT, 179 ORA_GAS_GIANT, 180 PUR_GAS_GIANT, 181 RED_GAS_GIANT, 182 VIO_GAS_GIANT, 183 YEL_GAS_GIANT, 184 LAST_GAS_GIANT = YEL_GAS_GIANT, 185 186 NUMBER_OF_PLANET_TYPES, 187 188 WORLD_TYPE_SPECIAL = 0x80, 189 PLANET_SHIELDED = WORLD_TYPE_SPECIAL, 190 191 HIERARCHY_STARBASE = 127 | WORLD_TYPE_SPECIAL, 192 SA_MATRA = 126 | WORLD_TYPE_SPECIAL, 193 }; 194 195 #define NUMBER_OF_SMALL_ROCKY_WORLDS (LAST_SMALL_ROCKY_WORLD - FIRST_SMALL_ROCKY_WORLD + 1) 196 #define NUMBER_OF_LARGE_ROCKY_WORLDS (LAST_LARGE_ROCKY_WORLD - FIRST_LARGE_ROCKY_WORLD + 1) 197 #define NUMBER_OF_ROCKY_WORLDS (NUMBER_OF_SMALL_ROCKY_WORLDS + NUMBER_OF_LARGE_ROCKY_WORLDS) 198 #define NUMBER_OF_GAS_GIANTS (LAST_GAS_GIANT - FIRST_GAS_GIANT + 1) 199 200 // TODO: This struct is highly alignment and padding dependent and 201 // should not be used! The data is loaded as binary from files and 202 // cast to this struct. 203 typedef struct 204 { 205 const SIZE level_tab[3]; 206 const BYTE xlat_tab[256]; 207 } XLAT_DESC; 208 209 typedef struct 210 { 211 BYTE ElementType; 212 /* Index of this element in element_array */ 213 BYTE Density; 214 /* bits 0-3: quantity of the deposits (maximum number of 215 * deposits), one of FEW, MODERATE, or NUMEROUS 216 * bits 4-7: quality of the deposit, one of LOW, MEDIUM, or HEAVY 217 */ 218 } ELEMENT_ENTRY; 219 220 // PlanetFrame describes a type of planet. It is not used to describe 221 // individual planets. 222 typedef struct 223 { 224 BYTE Type; 225 /* bits 0-1: size, one of SMALL_ROCKY_WORLD, LARGE_ROCKY_WORLD, or 226 * GAS_GIANT 227 * bits 2-3: map creation algoritm, one of TOPO_ALGO, 228 * CRATERED_ALGO, or GAS_GIANT_ALGO 229 * bits 4-7: interplanetary color, one of BLUE_BODY, GREEN_BODY, 230 * ORANGE_BODY, RED_BODY, WHITE_BODY (same as 231 * GRAY_BODY), YELLOW_BODY, CYAN_BODY, PURPLE_BODY, 232 * VIOLET_BODY) 233 */ 234 BYTE BaseTectonics; 235 /* Base constant for calculation of tectonic activity, 236 * relative to Earth at 100. 237 * One of: NO_TECTONICS, LOW_TECTONICS, MED_TECTONICS, 238 * HIGH_TECTONICS, or SUPER_TECTONICS 239 */ 240 BYTE AtmoAndDensity; 241 /* bits 0-3: planet density, one of GAS_DENSITY, LIGHT_DENSITY, 242 * LOW_DENSITY, NORMAL_DENSITY, HIGH_DENSITY, 243 * SUPER_DENSITY 244 * bits 4-7: atmosphere, one of LIGHT, MEDIUM, HEAVY, or 245 * (no define for this) super thick. 246 */ 247 #define NUM_USEFUL_ELEMENTS 8 248 ELEMENT_ENTRY UsefulElements[NUM_USEFUL_ELEMENTS]; 249 /* Minerals on the planet */ 250 251 RESOURCE CMapInstance; 252 /* Color map */ 253 RESOURCE XlatTabInstance; 254 /* Color translation map */ 255 256 // Parameters for map-generation algoritms: 257 COUNT num_faults; 258 SIZE fault_depth; 259 COUNT num_blemishes; 260 SIZE base_elevation; 261 } PlanetFrame; 262 263 typedef struct 264 { 265 SIZE AxialTilt; 266 UWORD Tectonics; 267 UWORD Weather; 268 UWORD PlanetDensity; 269 UWORD PlanetRadius; 270 UWORD SurfaceGravity; 271 SIZE SurfaceTemperature; 272 UWORD RotationPeriod; 273 UWORD AtmoDensity; 274 SIZE LifeChance; 275 UWORD PlanetToSunDist; 276 277 const PlanetFrame *PlanDataPtr; 278 279 DWORD ScanSeed[NUM_SCAN_TYPES]; 280 DWORD ScanRetrieveMask[NUM_SCAN_TYPES]; 281 282 STRING DiscoveryString; 283 FONT LanderFont; 284 FRAME LanderFontEff; 285 } PLANET_INFO; 286 287 enum 288 { 289 GAS_DENSITY, 290 LIGHT_DENSITY, 291 LOW_DENSITY, 292 NORMAL_DENSITY, 293 HIGH_DENSITY, 294 SUPER_DENSITY 295 }; 296 297 extern UWORD CalcGravity (const PLANET_INFO*); 298 299 #define EARTH_ATMOSPHERE 50 300 301 #define COLD_THRESHOLD -40 302 #define HOT_THRESHOLD 100 303 304 /*------------------------------ Global Data ------------------------------ */ 305 306 #define NO_TECTONICS 0 307 #define LOW_TECTONICS 40 308 #define MED_TECTONICS 80 309 #define HIGH_TECTONICS 140 310 #define SUPER_TECTONICS 200 311 312 extern const PlanetFrame *PlanData; 313 314 #if defined(__cplusplus) 315 } 316 #endif 317 318 #endif /* UQM_PLANETS_PLANDATA_H_ */ 319