diff options
Diffstat (limited to 'src/uqm/planets/orbits.c')
-rw-r--r-- | src/uqm/planets/orbits.c | 629 |
1 files changed, 629 insertions, 0 deletions
diff --git a/src/uqm/planets/orbits.c b/src/uqm/planets/orbits.c new file mode 100644 index 0000000..f1ad0f4 --- /dev/null +++ b/src/uqm/planets/orbits.c @@ -0,0 +1,629 @@ +//Copyright Paul Reiche, Fred Ford. 1992-2002 + +/* + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "planets.h" +#include "../starmap.h" +#include "libs/compiler.h" +#include "libs/mathlib.h" +#include "libs/log.h" + + +//#define DEBUG_ORBITS + +enum +{ + PLANET_NEVER = 0, + PLANET_RARE = 15, + PLANET_FEW = 63, + PLANET_COMMON = 127, + PLANET_ALWAYS = 255 +}; + +static BYTE +BlueDistribution (BYTE which_world) +{ + const BYTE PlanetDistribution[NUMBER_OF_PLANET_TYPES] = + { + PLANET_ALWAYS, /* OOLITE_WORLD */ + PLANET_ALWAYS, /* YTTRIC_WORLD */ + PLANET_ALWAYS, /* QUASI_DEGENERATE_WORLD */ + PLANET_ALWAYS, /* LANTHANIDE_WORLD */ + PLANET_ALWAYS, /* TREASURE_WORLD */ + PLANET_ALWAYS, /* UREA_WORLD */ + PLANET_ALWAYS, /* METAL_WORLD */ + PLANET_ALWAYS, /* RADIOACTIVE_WORLD */ + PLANET_ALWAYS, /* OPALESCENT_WORLD */ + PLANET_ALWAYS, /* CYANIC_WORLD */ + PLANET_ALWAYS, /* ACID_WORLD */ + PLANET_ALWAYS, /* ALKALI_WORLD */ + PLANET_ALWAYS, /* HALIDE_WORLD */ + PLANET_ALWAYS, /* GREEN_WORLD */ + PLANET_ALWAYS, /* COPPER_WORLD */ + PLANET_ALWAYS, /* CARBIDE_WORLD */ + PLANET_ALWAYS, /* ULTRAMARINE_WORLD */ + PLANET_ALWAYS, /* NOBLE_WORLD */ + PLANET_ALWAYS, /* AZURE_WORLD */ + PLANET_NEVER, /* CHONDRITE_WORLD */ + PLANET_NEVER, /* PURPLE_WORLD */ + PLANET_NEVER, /* SUPER_DENSE_WORLD */ + PLANET_NEVER, /* PELLUCID_WORLD */ + PLANET_NEVER, /* DUST_WORLD */ + PLANET_NEVER, /* CRIMSON_WORLD */ + PLANET_NEVER, /* CIMMERIAN_WORLD */ + PLANET_NEVER, /* INFRARED_WORLD */ + PLANET_ALWAYS, /* SELENIC_WORLD */ + PLANET_ALWAYS, /* AURIC_WORLD */ + + PLANET_ALWAYS, /* FLUORESCENT_WORLD */ + PLANET_ALWAYS, /* ULTRAVIOLET_WORLD */ + PLANET_ALWAYS, /* PLUTONIC_WORLD */ + PLANET_NEVER, /* RAINBOW_WORLD */ + PLANET_NEVER, /* SHATTERED_WORLD */ + PLANET_ALWAYS, /* SAPPHIRE_WORLD */ + PLANET_ALWAYS, /* ORGANIC_WORLD */ + PLANET_ALWAYS, /* XENOLITHIC_WORLD */ + PLANET_ALWAYS, /* REDUX_WORLD */ + PLANET_ALWAYS, /* PRIMORDIAL_WORLD */ + PLANET_NEVER, /* EMERALD_WORLD */ + PLANET_ALWAYS, /* CHLORINE_WORLD */ + PLANET_ALWAYS, /* MAGNETIC_WORLD */ + PLANET_ALWAYS, /* WATER_WORLD */ + PLANET_ALWAYS, /* TELLURIC_WORLD */ + PLANET_NEVER, /* HYDROCARBON_WORLD */ + PLANET_NEVER, /* IODINE_WORLD */ + PLANET_NEVER, /* VINYLOGOUS_WORLD */ + PLANET_NEVER, /* RUBY_WORLD */ + PLANET_NEVER, /* MAGMA_WORLD */ + PLANET_NEVER, /* MAROON_WORLD */ + + PLANET_ALWAYS, /* BLU_GAS_GIANT */ + PLANET_ALWAYS, /* CYA_GAS_GIANT */ + PLANET_ALWAYS, /* GRN_GAS_GIANT */ + PLANET_ALWAYS, /* GRY_GAS_GIANT */ + PLANET_ALWAYS, /* ORA_GAS_GIANT */ + PLANET_ALWAYS, /* PUR_GAS_GIANT */ + PLANET_ALWAYS, /* RED_GAS_GIANT */ + PLANET_ALWAYS, /* VIO_GAS_GIANT */ + PLANET_ALWAYS, /* YEL_GAS_GIANT */ + }; + + return (PlanetDistribution[which_world]); +} + +static BYTE +GreenDistribution (BYTE which_world) +{ + const BYTE PlanetDistribution[NUMBER_OF_PLANET_TYPES] = + { + PLANET_NEVER, /* OOLITE_WORLD */ + PLANET_NEVER, /* YTTRIC_WORLD */ + PLANET_ALWAYS, /* QUASI_DEGENERATE_WORLD */ + PLANET_ALWAYS, /* LANTHANIDE_WORLD */ + PLANET_ALWAYS, /* TREASURE_WORLD */ + PLANET_ALWAYS, /* UREA_WORLD */ + PLANET_ALWAYS, /* METAL_WORLD */ + PLANET_ALWAYS, /* RADIOACTIVE_WORLD */ + PLANET_ALWAYS, /* OPALESCENT_WORLD */ + PLANET_ALWAYS, /* CYANIC_WORLD */ + PLANET_ALWAYS, /* ACID_WORLD */ + PLANET_ALWAYS, /* ALKALI_WORLD */ + PLANET_ALWAYS, /* HALIDE_WORLD */ + PLANET_ALWAYS, /* GREEN_WORLD */ + PLANET_ALWAYS, /* COPPER_WORLD */ + PLANET_ALWAYS, /* CARBIDE_WORLD */ + PLANET_ALWAYS, /* ULTRAMARINE_WORLD */ + PLANET_ALWAYS, /* NOBLE_WORLD */ + PLANET_ALWAYS, /* AZURE_WORLD */ + PLANET_ALWAYS, /* CHONDRITE_WORLD */ + PLANET_ALWAYS, /* PURPLE_WORLD */ + PLANET_ALWAYS, /* SUPER_DENSE_WORLD */ + PLANET_ALWAYS, /* PELLUCID_WORLD */ + PLANET_NEVER, /* DUST_WORLD */ + PLANET_NEVER, /* CRIMSON_WORLD */ + PLANET_NEVER, /* CIMMERIAN_WORLD */ + PLANET_NEVER, /* INFRARED_WORLD */ + PLANET_ALWAYS, /* SELENIC_WORLD */ + PLANET_ALWAYS, /* AURIC_WORLD */ + + PLANET_ALWAYS, /* FLUORESCENT_WORLD */ + PLANET_ALWAYS, /* ULTRAVIOLET_WORLD */ + PLANET_ALWAYS, /* PLUTONIC_WORLD */ + PLANET_NEVER, /* RAINBOW_WORLD */ + PLANET_NEVER, /* SHATTERED_WORLD */ + PLANET_NEVER, /* SAPPHIRE_WORLD */ + PLANET_ALWAYS, /* ORGANIC_WORLD */ + PLANET_ALWAYS, /* XENOLITHIC_WORLD */ + PLANET_ALWAYS, /* REDUX_WORLD */ + PLANET_ALWAYS, /* PRIMORDIAL_WORLD */ + PLANET_ALWAYS, /* EMERALD_WORLD */ + PLANET_ALWAYS, /* CHLORINE_WORLD */ + PLANET_ALWAYS, /* MAGNETIC_WORLD */ + PLANET_ALWAYS, /* WATER_WORLD */ + PLANET_ALWAYS, /* TELLURIC_WORLD */ + PLANET_ALWAYS, /* HYDROCARBON_WORLD */ + PLANET_ALWAYS, /* IODINE_WORLD */ + PLANET_NEVER, /* VINYLOGOUS_WORLD */ + PLANET_NEVER, /* RUBY_WORLD */ + PLANET_NEVER, /* MAGMA_WORLD */ + PLANET_NEVER, /* MAROON_WORLD */ + + PLANET_ALWAYS, /* BLU_GAS_GIANT */ + PLANET_ALWAYS, /* CYA_GAS_GIANT */ + PLANET_ALWAYS, /* GRN_GAS_GIANT */ + PLANET_ALWAYS, /* GRY_GAS_GIANT */ + PLANET_ALWAYS, /* ORA_GAS_GIANT */ + PLANET_ALWAYS, /* PUR_GAS_GIANT */ + PLANET_ALWAYS, /* RED_GAS_GIANT */ + PLANET_ALWAYS, /* VIO_GAS_GIANT */ + PLANET_ALWAYS, /* YEL_GAS_GIANT */ + }; + + return (PlanetDistribution[which_world]); +} + +static BYTE +OrangeDistribution (BYTE which_world) +{ + const BYTE PlanetDistribution[NUMBER_OF_PLANET_TYPES] = + { + PLANET_NEVER, /* OOLITE_WORLD */ + PLANET_NEVER, /* YTTRIC_WORLD */ + PLANET_NEVER, /* QUASI_DEGENERATE_WORLD */ + PLANET_NEVER, /* LANTHANIDE_WORLD */ + PLANET_NEVER, /* TREASURE_WORLD */ + PLANET_ALWAYS, /* UREA_WORLD */ + PLANET_NEVER, /* METAL_WORLD */ + PLANET_ALWAYS, /* RADIOACTIVE_WORLD */ + PLANET_NEVER, /* OPALESCENT_WORLD */ + PLANET_NEVER, /* CYANIC_WORLD */ + PLANET_ALWAYS, /* ACID_WORLD */ + PLANET_ALWAYS, /* ALKALI_WORLD */ + PLANET_ALWAYS, /* HALIDE_WORLD */ + PLANET_ALWAYS, /* GREEN_WORLD */ + PLANET_ALWAYS, /* COPPER_WORLD */ + PLANET_ALWAYS, /* CARBIDE_WORLD */ + PLANET_ALWAYS, /* ULTRAMARINE_WORLD */ + PLANET_ALWAYS, /* NOBLE_WORLD */ + PLANET_ALWAYS, /* AZURE_WORLD */ + PLANET_ALWAYS, /* CHONDRITE_WORLD */ + PLANET_ALWAYS, /* PURPLE_WORLD */ + PLANET_ALWAYS, /* SUPER_DENSE_WORLD */ + PLANET_ALWAYS, /* PELLUCID_WORLD */ + PLANET_ALWAYS, /* DUST_WORLD */ + PLANET_ALWAYS, /* CRIMSON_WORLD */ + PLANET_ALWAYS, /* CIMMERIAN_WORLD */ + PLANET_ALWAYS, /* INFRARED_WORLD */ + PLANET_ALWAYS, /* SELENIC_WORLD */ + PLANET_NEVER, /* AURIC_WORLD */ + + PLANET_NEVER, /* FLUORESCENT_WORLD */ + PLANET_NEVER, /* ULTRAVIOLET_WORLD */ + PLANET_NEVER, /* PLUTONIC_WORLD */ + PLANET_NEVER, /* RAINBOW_WORLD */ + PLANET_NEVER, /* SHATTERED_WORLD */ + PLANET_NEVER, /* SAPPHIRE_WORLD */ + PLANET_NEVER, /* ORGANIC_WORLD */ + PLANET_NEVER, /* XENOLITHIC_WORLD */ + PLANET_NEVER, /* REDUX_WORLD */ + PLANET_NEVER, /* PRIMORDIAL_WORLD */ + PLANET_NEVER, /* EMERALD_WORLD */ + PLANET_ALWAYS, /* CHLORINE_WORLD */ + PLANET_ALWAYS, /* MAGNETIC_WORLD */ + PLANET_ALWAYS, /* WATER_WORLD */ + PLANET_ALWAYS, /* TELLURIC_WORLD */ + PLANET_ALWAYS, /* HYDROCARBON_WORLD */ + PLANET_ALWAYS, /* IODINE_WORLD */ + PLANET_ALWAYS, /* VINYLOGOUS_WORLD */ + PLANET_NEVER, /* RUBY_WORLD */ + PLANET_ALWAYS, /* MAGMA_WORLD */ + PLANET_ALWAYS, /* MAROON_WORLD */ + + PLANET_ALWAYS, /* BLU_GAS_GIANT */ + PLANET_ALWAYS, /* CYA_GAS_GIANT */ + PLANET_ALWAYS, /* GRN_GAS_GIANT */ + PLANET_ALWAYS, /* GRY_GAS_GIANT */ + PLANET_ALWAYS, /* ORA_GAS_GIANT */ + PLANET_ALWAYS, /* PUR_GAS_GIANT */ + PLANET_ALWAYS, /* RED_GAS_GIANT */ + PLANET_ALWAYS, /* VIO_GAS_GIANT */ + PLANET_ALWAYS, /* YEL_GAS_GIANT */ + }; + + return (PlanetDistribution[which_world]); +} + +static BYTE +RedDistribution (BYTE which_world) +{ + const BYTE PlanetDistribution[NUMBER_OF_PLANET_TYPES] = + { + PLANET_NEVER, /* OOLITE_WORLD */ + PLANET_NEVER, /* YTTRIC_WORLD */ + PLANET_NEVER, /* QUASI_DEGENERATE_WORLD */ + PLANET_NEVER, /* LANTHANIDE_WORLD */ + PLANET_NEVER, /* TREASURE_WORLD */ + PLANET_ALWAYS, /* UREA_WORLD */ + PLANET_ALWAYS, /* METAL_WORLD */ + PLANET_NEVER, /* RADIOACTIVE_WORLD */ + PLANET_NEVER, /* OPALESCENT_WORLD */ + PLANET_NEVER, /* CYANIC_WORLD */ + PLANET_NEVER, /* ACID_WORLD */ + PLANET_NEVER, /* ALKALI_WORLD */ + PLANET_NEVER, /* HALIDE_WORLD */ + PLANET_NEVER, /* GREEN_WORLD */ + PLANET_NEVER, /* COPPER_WORLD */ + PLANET_NEVER, /* CARBIDE_WORLD */ + PLANET_ALWAYS, /* ULTRAMARINE_WORLD */ + PLANET_ALWAYS, /* NOBLE_WORLD */ + PLANET_ALWAYS, /* AZURE_WORLD */ + PLANET_ALWAYS, /* CHONDRITE_WORLD */ + PLANET_ALWAYS, /* PURPLE_WORLD */ + PLANET_ALWAYS, /* SUPER_DENSE_WORLD */ + PLANET_ALWAYS, /* PELLUCID_WORLD */ + PLANET_ALWAYS, /* DUST_WORLD */ + PLANET_ALWAYS, /* CRIMSON_WORLD */ + PLANET_ALWAYS, /* CIMMERIAN_WORLD */ + PLANET_ALWAYS, /* INFRARED_WORLD */ + PLANET_ALWAYS, /* SELENIC_WORLD */ + PLANET_NEVER, /* AURIC_WORLD */ + + PLANET_NEVER, /* FLUORESCENT_WORLD */ + PLANET_NEVER, /* ULTRAVIOLET_WORLD */ + PLANET_NEVER, /* PLUTONIC_WORLD */ + PLANET_NEVER, /* RAINBOW_WORLD */ + PLANET_NEVER, /* SHATTERED_WORLD */ + PLANET_NEVER, /* SAPPHIRE_WORLD */ + PLANET_NEVER, /* ORGANIC_WORLD */ + PLANET_NEVER, /* XENOLITHIC_WORLD */ + PLANET_NEVER, /* REDUX_WORLD */ + PLANET_NEVER, /* PRIMORDIAL_WORLD */ + PLANET_NEVER, /* EMERALD_WORLD */ + PLANET_NEVER, /* CHLORINE_WORLD */ + PLANET_ALWAYS, /* MAGNETIC_WORLD */ + PLANET_ALWAYS, /* WATER_WORLD */ + PLANET_ALWAYS, /* TELLURIC_WORLD */ + PLANET_ALWAYS, /* HYDROCARBON_WORLD */ + PLANET_ALWAYS, /* IODINE_WORLD */ + PLANET_ALWAYS, /* VINYLOGOUS_WORLD */ + PLANET_ALWAYS, /* RUBY_WORLD */ + PLANET_ALWAYS, /* MAGMA_WORLD */ + PLANET_ALWAYS, /* MAROON_WORLD */ + + PLANET_ALWAYS, /* BLU_GAS_GIANT */ + PLANET_ALWAYS, /* CYA_GAS_GIANT */ + PLANET_ALWAYS, /* GRN_GAS_GIANT */ + PLANET_ALWAYS, /* GRY_GAS_GIANT */ + PLANET_ALWAYS, /* ORA_GAS_GIANT */ + PLANET_ALWAYS, /* PUR_GAS_GIANT */ + PLANET_ALWAYS, /* RED_GAS_GIANT */ + PLANET_ALWAYS, /* VIO_GAS_GIANT */ + PLANET_ALWAYS, /* YEL_GAS_GIANT */ + }; + + return (PlanetDistribution[which_world]); +} + +static BYTE +WhiteDistribution (BYTE which_world) +{ + const BYTE PlanetDistribution[NUMBER_OF_PLANET_TYPES] = + { + PLANET_ALWAYS, /* OOLITE_WORLD */ + PLANET_ALWAYS, /* YTTRIC_WORLD */ + PLANET_ALWAYS, /* QUASI_DEGENERATE_WORLD */ + PLANET_ALWAYS, /* LANTHANIDE_WORLD */ + PLANET_ALWAYS, /* TREASURE_WORLD */ + PLANET_ALWAYS, /* UREA_WORLD */ + PLANET_ALWAYS, /* METAL_WORLD */ + PLANET_ALWAYS, /* RADIOACTIVE_WORLD */ + PLANET_ALWAYS, /* OPALESCENT_WORLD */ + PLANET_ALWAYS, /* CYANIC_WORLD */ + PLANET_ALWAYS, /* ACID_WORLD */ + PLANET_ALWAYS, /* ALKALI_WORLD */ + PLANET_ALWAYS, /* HALIDE_WORLD */ + PLANET_NEVER, /* GREEN_WORLD */ + PLANET_NEVER, /* COPPER_WORLD */ + PLANET_NEVER, /* CARBIDE_WORLD */ + PLANET_NEVER, /* ULTRAMARINE_WORLD */ + PLANET_NEVER, /* NOBLE_WORLD */ + PLANET_NEVER, /* AZURE_WORLD */ + PLANET_NEVER, /* CHONDRITE_WORLD */ + PLANET_NEVER, /* PURPLE_WORLD */ + PLANET_NEVER, /* SUPER_DENSE_WORLD */ + PLANET_NEVER, /* PELLUCID_WORLD */ + PLANET_NEVER, /* DUST_WORLD */ + PLANET_NEVER, /* CRIMSON_WORLD */ + PLANET_NEVER, /* CIMMERIAN_WORLD */ + PLANET_NEVER, /* INFRARED_WORLD */ + PLANET_ALWAYS, /* SELENIC_WORLD */ + PLANET_ALWAYS, /* AURIC_WORLD */ + + PLANET_ALWAYS, /* FLUORESCENT_WORLD */ + PLANET_ALWAYS, /* ULTRAVIOLET_WORLD */ + PLANET_ALWAYS, /* PLUTONIC_WORLD */ + PLANET_NEVER, /* RAINBOW_WORLD */ + PLANET_NEVER, /* SHATTERED_WORLD */ + PLANET_ALWAYS, /* SAPPHIRE_WORLD */ + PLANET_ALWAYS, /* ORGANIC_WORLD */ + PLANET_ALWAYS, /* XENOLITHIC_WORLD */ + PLANET_ALWAYS, /* REDUX_WORLD */ + PLANET_ALWAYS, /* PRIMORDIAL_WORLD */ + PLANET_ALWAYS, /* EMERALD_WORLD */ + PLANET_NEVER, /* CHLORINE_WORLD */ + PLANET_NEVER, /* MAGNETIC_WORLD */ + PLANET_NEVER, /* WATER_WORLD */ + PLANET_NEVER, /* TELLURIC_WORLD */ + PLANET_NEVER, /* HYDROCARBON_WORLD */ + PLANET_NEVER, /* IODINE_WORLD */ + PLANET_ALWAYS, /* VINYLOGOUS_WORLD */ + PLANET_ALWAYS, /* RUBY_WORLD */ + PLANET_NEVER, /* MAGMA_WORLD */ + PLANET_NEVER, /* MAROON_WORLD */ + + PLANET_ALWAYS, /* BLU_GAS_GIANT */ + PLANET_ALWAYS, /* CYA_GAS_GIANT */ + PLANET_ALWAYS, /* GRN_GAS_GIANT */ + PLANET_ALWAYS, /* GRY_GAS_GIANT */ + PLANET_ALWAYS, /* ORA_GAS_GIANT */ + PLANET_ALWAYS, /* PUR_GAS_GIANT */ + PLANET_ALWAYS, /* RED_GAS_GIANT */ + PLANET_ALWAYS, /* VIO_GAS_GIANT */ + PLANET_ALWAYS, /* YEL_GAS_GIANT */ + }; + + return (PlanetDistribution[which_world]); +} + +static BYTE +YellowDistribution (BYTE which_world) +{ + const BYTE PlanetDistribution[NUMBER_OF_PLANET_TYPES] = + { + PLANET_NEVER, /* OOLITE_WORLD */ + PLANET_NEVER, /* YTTRIC_WORLD */ + PLANET_NEVER, /* QUASI_DEGENERATE_WORLD */ + PLANET_NEVER, /* LANTHANIDE_WORLD */ + PLANET_ALWAYS, /* TREASURE_WORLD */ + PLANET_ALWAYS, /* UREA_WORLD */ + PLANET_ALWAYS, /* METAL_WORLD */ + PLANET_ALWAYS, /* RADIOACTIVE_WORLD */ + PLANET_ALWAYS, /* OPALESCENT_WORLD */ + PLANET_ALWAYS, /* CYANIC_WORLD */ + PLANET_ALWAYS, /* ACID_WORLD */ + PLANET_ALWAYS, /* ALKALI_WORLD */ + PLANET_ALWAYS, /* HALIDE_WORLD */ + PLANET_ALWAYS, /* GREEN_WORLD */ + PLANET_ALWAYS, /* COPPER_WORLD */ + PLANET_ALWAYS, /* CARBIDE_WORLD */ + PLANET_ALWAYS, /* ULTRAMARINE_WORLD */ + PLANET_ALWAYS, /* NOBLE_WORLD */ + PLANET_ALWAYS, /* AZURE_WORLD */ + PLANET_ALWAYS, /* CHONDRITE_WORLD */ + PLANET_ALWAYS, /* PURPLE_WORLD */ + PLANET_ALWAYS, /* SUPER_DENSE_WORLD */ + PLANET_ALWAYS, /* PELLUCID_WORLD */ + PLANET_ALWAYS, /* DUST_WORLD */ + PLANET_ALWAYS, /* CRIMSON_WORLD */ + PLANET_ALWAYS, /* CIMMERIAN_WORLD */ + PLANET_ALWAYS, /* INFRARED_WORLD */ + PLANET_ALWAYS, /* SELENIC_WORLD */ + PLANET_ALWAYS, /* AURIC_WORLD */ + + PLANET_NEVER, /* FLUORESCENT_WORLD */ + PLANET_NEVER, /* ULTRAVIOLET_WORLD */ + PLANET_NEVER, /* PLUTONIC_WORLD */ + PLANET_NEVER, /* RAINBOW_WORLD */ + PLANET_NEVER, /* SHATTERED_WORLD */ + PLANET_NEVER, /* SAPPHIRE_WORLD */ + PLANET_ALWAYS, /* ORGANIC_WORLD */ + PLANET_ALWAYS, /* XENOLITHIC_WORLD */ + PLANET_ALWAYS, /* REDUX_WORLD */ + PLANET_ALWAYS, /* PRIMORDIAL_WORLD */ + PLANET_NEVER, /* EMERALD_WORLD */ + PLANET_ALWAYS, /* CHLORINE_WORLD */ + PLANET_ALWAYS, /* MAGNETIC_WORLD */ + PLANET_ALWAYS, /* WATER_WORLD */ + PLANET_ALWAYS, /* TELLURIC_WORLD */ + PLANET_ALWAYS, /* HYDROCARBON_WORLD */ + PLANET_ALWAYS, /* IODINE_WORLD */ + PLANET_ALWAYS, /* VINYLOGOUS_WORLD */ + PLANET_NEVER, /* RUBY_WORLD */ + PLANET_ALWAYS, /* MAGMA_WORLD */ + PLANET_ALWAYS, /* MAROON_WORLD */ + + PLANET_ALWAYS, /* BLU_GAS_GIANT */ + PLANET_ALWAYS, /* CYA_GAS_GIANT */ + PLANET_ALWAYS, /* GRN_GAS_GIANT */ + PLANET_ALWAYS, /* GRY_GAS_GIANT */ + PLANET_ALWAYS, /* ORA_GAS_GIANT */ + PLANET_ALWAYS, /* PUR_GAS_GIANT */ + PLANET_ALWAYS, /* RED_GAS_GIANT */ + PLANET_ALWAYS, /* VIO_GAS_GIANT */ + PLANET_ALWAYS, /* YEL_GAS_GIANT */ + }; + + return (PlanetDistribution[which_world]); +} + +#define DWARF_ROCK_DIST MIN_PLANET_RADIUS +#define DWARF_GASG_DIST SCALE_RADIUS (12) + +#define GIANT_ROCK_DIST SCALE_RADIUS (8) +#define GIANT_GASG_DIST SCALE_RADIUS (13) + +#define SUPERGIANT_ROCK_DIST SCALE_RADIUS (16) +#define SUPERGIANT_GASG_DIST SCALE_RADIUS (33) + +void +FillOrbits (SOLARSYS_STATE *system, BYTE NumPlanets, + PLANET_DESC *pBaseDesc, BOOLEAN TypesDefined) +{ /* Generate Planets in orbit around star */ + BYTE StarColor, PlanetCount, MaxPlanet; + BOOLEAN GeneratingMoons; + COUNT StarSize; + PLANET_DESC *pPD; + struct + { + COUNT MinRockyDist, MinGasGDist; + } Suns[] = + { + {DWARF_ROCK_DIST, DWARF_GASG_DIST}, + {GIANT_ROCK_DIST, GIANT_GASG_DIST}, + {SUPERGIANT_ROCK_DIST, SUPERGIANT_GASG_DIST}, + }; +#ifdef DEBUG_ORBITS +UNICODE buf[256]; +char stype[] = {'D', 'G', 'S'}; +char scolor[] = {'B', 'G', 'O', 'R', 'W', 'Y'}; +#endif /* DEBUG_ORBITS */ + + pPD = pBaseDesc; + StarSize = system->SunDesc[0].data_index; + StarColor = STAR_COLOR (CurStarDescPtr->Type); + + if (NumPlanets == (BYTE)~0) + { +#define MAX_GENERATED_PLANETS 9 + // XXX: This is pretty funny. Instead of calling RNG once, like so: + // 1 + Random % MAX_GENERATED_PLANETS + // we spin in a loop until the result > 0. + // Note that this behavior must be kept to preserve the universe. + do + NumPlanets = LOWORD (RandomContext_Random (SysGenRNG)) + % (MAX_GENERATED_PLANETS + 1); + while (NumPlanets == 0); + system->SunDesc[0].NumPlanets = NumPlanets; + } + +#ifdef DEBUG_ORBITS + GetClusterName (CurStarDescPtr, buf); + log_add (log_Debug, "cluster name = %s color = %c type = %c", buf, + scolor[STAR_COLOR (CurStarDescPtr->Type)], + stype[STAR_TYPE (CurStarDescPtr->Type)]); +#endif /* DEBUG_ORBITS */ + GeneratingMoons = (BOOLEAN) (pBaseDesc == system->MoonDesc); + if (GeneratingMoons) + MaxPlanet = FIRST_LARGE_ROCKY_WORLD; + else + MaxPlanet = NUMBER_OF_PLANET_TYPES; + PlanetCount = NumPlanets; + while (NumPlanets--) + { + BYTE chance; + DWORD rand_val; + COUNT min_radius, angle; + SIZE delta_r; + PLANET_DESC *pLocPD; + + do + { + rand_val = RandomContext_Random (SysGenRNG); + if (TypesDefined) + rand_val = 0; + else + pPD->data_index = + (BYTE)(HIBYTE (LOWORD (rand_val)) % MaxPlanet); + + chance = PLANET_NEVER; + switch (StarColor) + { + case BLUE_BODY: + chance = BlueDistribution (pPD->data_index); + break; + case GREEN_BODY: + chance = GreenDistribution (pPD->data_index); + break; + case ORANGE_BODY: + chance = OrangeDistribution (pPD->data_index); + break; + case RED_BODY: + chance = RedDistribution (pPD->data_index); + break; + case WHITE_BODY: + chance = WhiteDistribution (pPD->data_index); + break; + case YELLOW_BODY: + chance = YellowDistribution (pPD->data_index); + break; + } + } while (LOBYTE (LOWORD (rand_val)) >= chance); + + if (pPD->data_index < FIRST_GAS_GIANT) + min_radius = Suns[StarSize].MinRockyDist; + else + min_radius = Suns[StarSize].MinGasGDist; +RelocatePlanet: + rand_val = RandomContext_Random (SysGenRNG); + if (GeneratingMoons) + { + pPD->radius = MIN_MOON_RADIUS + + ((LOWORD (rand_val) % MAX_MOONS) * MOON_DELTA); + for (pLocPD = pPD - 1; pLocPD >= pBaseDesc; --pLocPD) + { + if (pPD->radius == pLocPD->radius) + goto RelocatePlanet; + } + pPD->NumPlanets = 0; + } + else + { + pPD->radius = + (LOWORD (rand_val) % (MAX_PLANET_RADIUS - min_radius)) + + min_radius; + for (pLocPD = pPD - 1; pLocPD >= pBaseDesc; --pLocPD) + { + delta_r = UNSCALE_RADIUS (pLocPD->radius) / 5 + - UNSCALE_RADIUS (pPD->radius) / 5; + if (delta_r < 0) + delta_r = -delta_r; + if (delta_r <= 1) + goto RelocatePlanet; + } + } + + rand_val = RandomContext_Random (SysGenRNG); + angle = NORMALIZE_ANGLE (LOWORD (rand_val)); + pPD->location.x = COSINE (angle, pPD->radius); + pPD->location.y = SINE (angle, pPD->radius); + pPD->rand_seed = MAKE_DWORD (pPD->location.x, pPD->location.y); + + ++pPD; + } + + { + BYTE i; + + for (i = 0; i < PlanetCount; ++i) + { + BYTE j; + + for (j = (BYTE)(PlanetCount - 1); j > i; --j) + { + if (pBaseDesc[i].radius > pBaseDesc[j].radius) + { + PLANET_DESC temp; + + temp = pBaseDesc[i]; + pBaseDesc[i] = pBaseDesc[j]; + pBaseDesc[j] = temp; + } + } + } + } +} + |