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