//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; } } } } }