void dumpPlanetType (FILE *out, int index, const PlanetFrame *planetType) { int i; fprintf (out, "%s\n" "\tType: %s\n" "\tColor: %s\n" "\tSurface generation algoritm: %s\n" "\tTectonics: %s\n" "\tAtmosphere: %s\n" "\tDensity: %s\n" "\tElements:\n", planetTypeString (index), worldSizeString (PLANSIZE (planetType->Type)), bodyColorString (PLANCOLOR (planetType->Type)), worldGenAlgoString (PLANALGO (planetType->Type)), tectonicsString (planetType->BaseTectonics), atmosphereString (HINIBBLE (planetType->AtmoAndDensity)), densityString (LONIBBLE (planetType->AtmoAndDensity)) ); for (i = 0; i < NUM_USEFUL_ELEMENTS; i++) { const ELEMENT_ENTRY *entry; entry = &planetType->UsefulElements[i]; if (entry->Density == 0) continue; fprintf(out, "\t\t0 to %d %s-quality (+%d) deposits of %s (%s)\n", DEPOSIT_QUANTITY (entry->Density), depositQualityString (DEPOSIT_QUALITY (entry->Density)), DEPOSIT_QUALITY (entry->Density) * 5, GAME_STRING (ELEMENTS_STRING_BASE + entry->ElementType), GAME_STRING (CARGO_STRING_BASE + 2 + ElementCategory ( entry->ElementType)) ); } fprintf (out, "\n"); }
static COUNT CalcLifeForms (SYSTEM_INFO *SysInfoPtr, COUNT which_life) { COUNT num_life_forms; num_life_forms = 0; if (PLANSIZE (SysInfoPtr->PlanetInfo.PlanDataPtr->Type) == GAS_GIANT) SysInfoPtr->PlanetInfo.LifeChance = -1; else { #define MIN_LIFE_CHANCE 10 SIZE life_var; life_var = 0; if (SysInfoPtr->PlanetInfo.SurfaceTemperature < -151) life_var -= 300; else if (SysInfoPtr->PlanetInfo.SurfaceTemperature < -51) life_var -= 100; else if (SysInfoPtr->PlanetInfo.SurfaceTemperature < 0) life_var += 100; else if (SysInfoPtr->PlanetInfo.SurfaceTemperature < 50) life_var += 300; else if (SysInfoPtr->PlanetInfo.SurfaceTemperature < 150) life_var += 50; else if (SysInfoPtr->PlanetInfo.SurfaceTemperature < 250) life_var -= 100; else if (SysInfoPtr->PlanetInfo.SurfaceTemperature < 500) life_var -= 400; else life_var -= 800; if (SysInfoPtr->PlanetInfo.AtmoDensity == 0) life_var -= 1000; else if (SysInfoPtr->PlanetInfo.AtmoDensity < 15) life_var += 100; else if (SysInfoPtr->PlanetInfo.AtmoDensity < 30) life_var += 200; else if (SysInfoPtr->PlanetInfo.AtmoDensity < 100) life_var += 300; else if (SysInfoPtr->PlanetInfo.AtmoDensity < 1000) life_var += 150; else if (SysInfoPtr->PlanetInfo.AtmoDensity < 2500) ; else life_var -= 100; #ifndef NOTYET life_var += 200 + 80 + 80; #else /* NOTYET */ if (SysInfoPtr->PlanetInfo.SurfaceGravity < 10) ; else if (SysInfoPtr->PlanetInfo.SurfaceGravity < 35) life_var += 50; else if (SysInfoPtr->PlanetInfo.SurfaceGravity < 75) life_var += 100; else if (SysInfoPtr->PlanetInfo.SurfaceGravity < 150) life_var += 200; else if (SysInfoPtr->PlanetInfo.SurfaceGravity < 400) life_var += 50; else if (SysInfoPtr->PlanetInfo.SurfaceGravity < 800) ; else life_var -= 100; if (SysInfoPtr->PlanetInfo.Tectonics < 1) life_var += 80; else if (SysInfoPtr->PlanetInfo.Tectonics < 2) life_var += 70; else if (SysInfoPtr->PlanetInfo.Tectonics < 3) life_var += 60; else if (SysInfoPtr->PlanetInfo.Tectonics < 4) life_var += 50; else if (SysInfoPtr->PlanetInfo.Tectonics < 5) life_var += 25; else if (SysInfoPtr->PlanetInfo.Tectonics < 6) ; else life_var -= 100; if (SysInfoPtr->PlanetInfo.Weather < 1) life_var += 80; else if (SysInfoPtr->PlanetInfo.Weather < 2) life_var += 70; else if (SysInfoPtr->PlanetInfo.Weather < 3) life_var += 60; else if (SysInfoPtr->PlanetInfo.Weather < 4) life_var += 50; else if (SysInfoPtr->PlanetInfo.Weather < 5) life_var += 25; else if (SysInfoPtr->PlanetInfo.Weather < 6) ; else life_var -= 100; #endif /* NOTYET */ SysInfoPtr->PlanetInfo.LifeChance = life_var; life_var = (COUNT)TFB_Random () & 1023; if (life_var < SysInfoPtr->PlanetInfo.LifeChance || (SysInfoPtr->PlanetInfo.LifeChance < MIN_LIFE_CHANCE && life_var < MIN_LIFE_CHANCE)) { BYTE num_types; num_types = (BYTE)(((BYTE)TFB_Random () % MAX_LIFE_VARIATION) + 1); do { BYTE index, num_creatures, range_types; DWORD rand_val; // JMS_GFX: Was UWORD UWORD loword, hiword; BOOLEAN zoneA, zoneB, zoneC; rand_val = (UWORD)TFB_Random (); // BW: Compute which life forms should appear zoneA = (LOGX_TO_UNIVERSE(GLOBAL_SIS (log_x)) + LOGY_TO_UNIVERSE(GLOBAL_SIS (log_y)) > 9000); zoneB = (LOGX_TO_UNIVERSE(GLOBAL_SIS (log_x)) + 3 * LOGY_TO_UNIVERSE(GLOBAL_SIS (log_y)) < 21000); zoneC = (3 * LOGX_TO_UNIVERSE(GLOBAL_SIS (log_x)) + LOGY_TO_UNIVERSE(GLOBAL_SIS (log_y)) < 19000); range_types = 0; if (zoneA) range_types += NUM_CREATURE_TYPES; if (zoneB) range_types += NUM_B_CREATURE_TYPES; if (zoneC) range_types += NUM_C_CREATURE_TYPES; //index = LOBYTE (rand_val) % range_types; index = LOBYTE ((UWORD)rand_val) % range_types; // JMS_GFX // BW: adjust index so that it takes creatures from the correct set. if (!zoneA) { index += NUM_CREATURE_TYPES + NUM_SPECIAL_CREATURE_TYPES; if (!zoneB) index += NUM_B_CREATURE_TYPES; } if (zoneA && index >= NUM_CREATURE_TYPES) { index += NUM_SPECIAL_CREATURE_TYPES; if (!zoneB) index += NUM_B_CREATURE_TYPES; } // BW: Reduce amounts in the NE quadrant if ((GLOBAL_SIS (log_x) > UNIVERSE_TO_LOGX(5000)) && (GLOBAL_SIS (log_y) < UNIVERSE_TO_LOGY(6000))) num_creatures = (BYTE)((HIBYTE ((UWORD)rand_val) % 3) + 1); else num_creatures = (BYTE)((HIBYTE ((UWORD)rand_val) % 10) + 1); do { rand_val = (DWORD)TFB_Random (); loword = LOWORD (rand_val); hiword = HIWORD (rand_val); /* if (RESOLUTION_FACTOR == 0) SysInfoPtr->PlanetInfo.CurPt.x = (LOBYTE (rand_val) % (MAP_WIDTH - (8 << 1))) + 8; else SysInfoPtr->PlanetInfo.CurPt.x = rand_val % (MAP_WIDTH - (8 << 1)) + 8; // JMS_GFX: Replaced previous line with this line (BYTE was too small for 640x480 maps.) SysInfoPtr->PlanetInfo.CurPt.y = (HIBYTE (rand_val) % (MAP_HEIGHT - (8 << 1))) + 8; // JMS_GFX */ if (RESOLUTION_FACTOR == 0) SysInfoPtr->PlanetInfo.CurPt.x = (LOBYTE ((UWORD)rand_val) % (MAP_WIDTH - (8 << 1))) + 8; else SysInfoPtr->PlanetInfo.CurPt.x = loword % (MAP_WIDTH - (8 << 1)) + 8; // JMS_GFX: Replaced previous line with this line (BYTE was too small for 640x480 maps.) if (RESOLUTION_FACTOR == 0) SysInfoPtr->PlanetInfo.CurPt.y = (HIBYTE ((UWORD)rand_val) % (MAP_HEIGHT - (8 << 1))) + 8; else SysInfoPtr->PlanetInfo.CurPt.y = hiword % (MAP_HEIGHT - (8 << 1)) + 8; // JMS_GFX: Replaced previous line with this line (BYTE was too small for 1280x960 maps.) SysInfoPtr->PlanetInfo.CurType = index; if ((num_life_forms >= which_life && !(SysInfoPtr->PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN] & (1L << num_life_forms))) || ++num_life_forms == sizeof (DWORD) * 8) { num_types = 1; break; } } while (--num_creatures); } while (--num_types); } #ifdef DEBUG_SURFACE else log_add (log_Debug, "It's dead, Jim! (%d >= %d)", life_var, SysInfoPtr->PlanetInfo.LifeChance); #endif /* DEBUG_SURFACE */ } return (num_life_forms); }