[Add] 3 and 4 star systems (with system-wide center of mass).
							
								
								
									
										
											BIN
										
									
								
								icons/object_white_dwarf.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshot/atmos.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 311 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshot/labels.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 333 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshot/launch.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 332 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshot/ship_view.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 332 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshot/sys_view.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 354 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshot/systems.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 369 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshot/this_is_earth.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 315 KiB  | 
@ -49,9 +49,9 @@ Sector::Sector(int x, int y) {
 | 
			
		||||
 | 
			
		||||
      float spec = rng.Int32(1000000);
 | 
			
		||||
      /* Frequencies from wiki. :D */
 | 
			
		||||
      if(spec < 1) {
 | 
			
		||||
      /*if(spec < 1) {
 | 
			
		||||
        s.primaryStarClass = StarSystem::TYPE_STAR_O;
 | 
			
		||||
      } else if(spec < 1300) {
 | 
			
		||||
      } else*/ if(spec < 1300) {
 | 
			
		||||
        s.primaryStarClass = StarSystem::TYPE_STAR_B;
 | 
			
		||||
      } else if(spec < 7300) {
 | 
			
		||||
        s.primaryStarClass = StarSystem::TYPE_STAR_A;
 | 
			
		||||
@ -61,6 +61,8 @@ Sector::Sector(int x, int y) {
 | 
			
		||||
        s.primaryStarClass = StarSystem::TYPE_STAR_G;
 | 
			
		||||
      } else if(spec < 234300) {
 | 
			
		||||
        s.primaryStarClass = StarSystem::TYPE_STAR_K;
 | 
			
		||||
      } else if(spec < 250000) {
 | 
			
		||||
        s.primaryStarClass = StarSystem::TYPE_WHITE_DWARF;
 | 
			
		||||
      } else {
 | 
			
		||||
        s.primaryStarClass = StarSystem::TYPE_STAR_M;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@ -7,142 +7,143 @@
 | 
			
		||||
 | 
			
		||||
/* Indexed by enum type. */
 | 
			
		||||
float StarSystem::starColors[][3] = {
 | 
			
		||||
  { 0, 0, 0 },       /* Gravpoint. /
 | 
			
		||||
  { 0, 0, 0 },       /* Gravpoint. */
 | 
			
		||||
  { 1.0, 0.2, 0.0 }, /* M */
 | 
			
		||||
  { 1.0, 0.6, 0.1 }, /* K */
 | 
			
		||||
  { 1.0, 1.0, 0.4 }, /* G */
 | 
			
		||||
  { 1.0, 1.0, 0.8 }, /* F */
 | 
			
		||||
  { 1.0, 1.0, 1.0 }, /* A */
 | 
			
		||||
  { 0.7, 0.7, 1.0 }, /* B */
 | 
			
		||||
  { 1.0, 0.7, 1.0 }  /* O */
 | 
			
		||||
  { 1.0, 0.7, 1.0 }, /* O */
 | 
			
		||||
  { 0.4, 0.4, 0.8 }  /* White dwarf. */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const struct SBodySubTypeInfo {
 | 
			
		||||
  StarSystem::BodySuperType supertype;
 | 
			
		||||
  int         mass; /* % sol for stars, unused for planets. */
 | 
			
		||||
  int         radius; /* % Sol radii for stars, % earth radii for planets. */
 | 
			
		||||
  int         mass[2]; /* Min, max % sol for stars, unused for planets. */
 | 
			
		||||
  int         radius;  /* % Sol radii for stars, % earth radii for planets. */
 | 
			
		||||
  const char *description;
 | 
			
		||||
  const char *icon;
 | 
			
		||||
  int tempMin, tempMax;
 | 
			
		||||
} bodyTypeInfo[StarSystem::TYPE_MAX] = {
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_NONE, 0, 0, "You can't see me!",
 | 
			
		||||
    StarSystem::SUPERTYPE_NONE, {}, 0, 0, "You can't see me!",
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_STAR,
 | 
			
		||||
    40, 50, "Type 'M' red star",
 | 
			
		||||
    {10, 47}, 50, "Type 'M' red star",
 | 
			
		||||
    "icons/object_star_m.png",
 | 
			
		||||
    2000, 3500
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_STAR,
 | 
			
		||||
    80, 90, "Type 'K' orange star",
 | 
			
		||||
    {50,78}, 90, "Type 'K' orange star",
 | 
			
		||||
    "icons/object_star_k.png",
 | 
			
		||||
    3500, 5000
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_STAR,
 | 
			
		||||
    110, 110, "Type 'G' yellow star",
 | 
			
		||||
    {80,110}, 110, "Type 'G' yellow star",
 | 
			
		||||
    "icons/object_star_g.png",
 | 
			
		||||
    5000, 6000
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_STAR,
 | 
			
		||||
    170, 140, "Type 'F' white star",
 | 
			
		||||
    {115,170}, 140, "Type 'F' white star",
 | 
			
		||||
    "icons/object_star_f.png",
 | 
			
		||||
    6000, 7500
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_STAR,
 | 
			
		||||
    310, 210, "Type 'A' hot white star",
 | 
			
		||||
    {180,320}, 210, "Type 'A' hot white star",
 | 
			
		||||
    "icons/object_star_a.png",
 | 
			
		||||
    7500, 10000
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_STAR,
 | 
			
		||||
    1800, 700, "Bright type 'B' blue star",
 | 
			
		||||
    {400,1000}, 700, "Bright type 'B' blue star",
 | 
			
		||||
    "icons/object_star_b.png",
 | 
			
		||||
    10000, 30000
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_STAR,
 | 
			
		||||
    6400, 1600, "Hot, massive type 'O' blue star",
 | 
			
		||||
    {2000,4000}, 1600, "Hot, massive type 'O' blue star",
 | 
			
		||||
    "icons/object_star_o.png",
 | 
			
		||||
    30000, 60000
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_GAS_GIANT,
 | 
			
		||||
    0, 30, "Brown dwarf sub-stellar object",
 | 
			
		||||
    {}, 30, "Brown dwarf sub-stellar object",
 | 
			
		||||
    "icons/object_brown_dwarf.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_GAS_GIANT,
 | 
			
		||||
    0, 390, "Small gas giant",
 | 
			
		||||
    {}, 390, "Small gas giant",
 | 
			
		||||
    "icons/object_planet_small_gas_giant.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_GAS_GIANT,
 | 
			
		||||
    0, 950, "Medium gas giant",
 | 
			
		||||
    {}, 950, "Medium gas giant",
 | 
			
		||||
    "icons/object_planet_medium_gas_giant.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_GAS_GIANT,
 | 
			
		||||
    0, 1110, "Large gas giant",
 | 
			
		||||
    {}, 1110, "Large gas giant",
 | 
			
		||||
    "icons/object_planet_large_gas_giant.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_GAS_GIANT,
 | 
			
		||||
    0, 1500, "Very large gas giant",
 | 
			
		||||
    {}, 1500, "Very large gas giant",
 | 
			
		||||
    "icons/object_planet_large_gas_giant.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_ROCKY_PLANET,
 | 
			
		||||
    0, 26, "Small, rocky dwarf planet",
 | 
			
		||||
    {}, 26, "Small, rocky dwarf planet",
 | 
			
		||||
    "icons/object_planet_dwarf.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_ROCKY_PLANET,
 | 
			
		||||
    0, 52, "Small, rocky planet with a thin atmosphere",
 | 
			
		||||
    {}, 52, "Small, rocky planet with a thin atmosphere",
 | 
			
		||||
    "icons/object_planet_small.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_ROCKY_PLANET,
 | 
			
		||||
    0, 100, "Rocky planet with liquid water and a nitrogen atmosphere",
 | 
			
		||||
    {}, 100, "Rocky planet with liquid water and a nitrogen atmosphere",
 | 
			
		||||
    "icons/object_planet_small.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_ROCKY_PLANET,
 | 
			
		||||
    0, 100, "Rocky planet with a carbon dioxide atmosphere",
 | 
			
		||||
    {}, 100, "Rocky planet with a carbon dioxide atmosphere",
 | 
			
		||||
    "icons/object_planet_small.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_ROCKY_PLANET,
 | 
			
		||||
    0, 100, "Rocky planet with a methane atmosphere",
 | 
			
		||||
    {}, 100, "Rocky planet with a methane atmosphere",
 | 
			
		||||
    "icons/object_planet_small.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_ROCKY_PLANET,
 | 
			
		||||
    0, 100, "Rocky planet with running water and a thick nitrogen atmosphere",
 | 
			
		||||
    {}, 100, "Rocky planet with running water and a thick nitrogen atmosphere",
 | 
			
		||||
    "icons/object_planet_small.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_ROCKY_PLANET,
 | 
			
		||||
    0, 100, "Rocky planet with a thick carbon dioxide atmosphere",
 | 
			
		||||
    {}, 100, "Rocky planet with a thick carbon dioxide atmosphere",
 | 
			
		||||
    "icons/object_planet_small.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_ROCKY_PLANET,
 | 
			
		||||
    0, 100, "Rocky planet with a thick methane atmosphere",
 | 
			
		||||
    {}, 100, "Rocky planet with a thick methane atmosphere",
 | 
			
		||||
    "icons/object_planet_small.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_ROCKY_PLANET,
 | 
			
		||||
    0, 100, "Highly volcanic world",
 | 
			
		||||
    {}, 100, "Highly volcanic world",
 | 
			
		||||
    "icons/object_planet_small.png"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    StarSystem::SUPERTYPE_ROCKY_PLANET,
 | 
			
		||||
    0, 100, "World with indigenous life and an oxygen atmosphere",
 | 
			
		||||
    {}, 100, "World with indigenous life and an oxygen atmosphere",
 | 
			
		||||
    "icons/object_planet_life.png"
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
@ -368,6 +369,66 @@ void StarSystem::GenerateFromCustom(const CustomSBody* customDef) {
 | 
			
		||||
  CustomGetChildOf(rootBody, customDef, idx);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StarSystem::MakeStarOfType(SBody* sbody, BodyType type, MTRand& rand) {
 | 
			
		||||
  sbody->type = type;
 | 
			
		||||
  sbody->radius = fixed(bodyTypeInfo[type].radius, 100);
 | 
			
		||||
  sbody->mass = fixed(rand.Int32(bodyTypeInfo[type].mass[0],
 | 
			
		||||
        bodyTypeInfo[type].mass[1]), 100);
 | 
			
		||||
  sbody->averageTemp = rand.Int32(bodyTypeInfo[type].tempMin,
 | 
			
		||||
      bodyTypeInfo[type].tempMax);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StarSystem::MakeRandomStar(SBody* sbody, MTRand& rand) {
 | 
			
		||||
  BodyType type = (BodyType)rand.Int32((int)TYPE_STAR_MIN, (int)TYPE_STAR_MAX);
 | 
			
		||||
  MakeStarOfType(sbody, type, rand);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StarSystem::MakeRandomStarLighterThan(SBody* sbody, fixed maxMass, MTRand& rand) {
 | 
			
		||||
  do {
 | 
			
		||||
    MakeRandomStar(sbody, rand);
 | 
			
		||||
  } while(sbody->mass > maxMass);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StarSystem::MakeBinaryPair(SBody* a, SBody* b, fixed minDist, MTRand& rand) {
 | 
			
		||||
  fixed ecc = rand.NFixed(3);
 | 
			
		||||
  fixed m = a->mass + b->mass;
 | 
			
		||||
  fixed a0 = b->mass / m;
 | 
			
		||||
  fixed a1 = a->mass / m;
 | 
			
		||||
  fixed semiMajorAxis;
 | 
			
		||||
  int mul = 1;
 | 
			
		||||
 | 
			
		||||
  do {
 | 
			
		||||
    switch(rand.Int32(3)) {
 | 
			
		||||
      case 2: semiMajorAxis = fixed(rand.Int32(100, 10000), 100); break;
 | 
			
		||||
      case 1: semiMajorAxis = fixed(rand.Int32(10, 1000), 100); break;
 | 
			
		||||
      default:
 | 
			
		||||
        case 0: semiMajorAxis = fixed(rand.Int32(1, 100), 100); break;
 | 
			
		||||
    }
 | 
			
		||||
    semiMajorAxis *= mul;
 | 
			
		||||
    mul *= 2;
 | 
			
		||||
  } while(semiMajorAxis < minDist);
 | 
			
		||||
 | 
			
		||||
  a->orbit.eccentricity = ecc.ToDouble();
 | 
			
		||||
  a->orbit.semiMajorAxis = AU * (semiMajorAxis * a0).ToDouble();
 | 
			
		||||
  a->orbit.period = 60*60*24*365*semiMajorAxis.ToDouble() * sqrt(semiMajorAxis.ToDouble() / m.ToDouble());
 | 
			
		||||
 | 
			
		||||
  const float rotY = rand.Double()*M_PI/2.0;
 | 
			
		||||
  const float rotZ = rand.Double(M_PI);
 | 
			
		||||
  a->orbit.rotMatrix = matrix4x4d::RotateYMatrix(rotY) * matrix4x4d::RotateZMatrix(rotZ);
 | 
			
		||||
  b->orbit.rotMatrix = matrix4x4d::RotateYMatrix(rotY) * matrix4x4d::RotateZMatrix(rotZ-M_PI);
 | 
			
		||||
 | 
			
		||||
  b->orbit.eccentricity = ecc.ToDouble();
 | 
			
		||||
  b->orbit.semiMajorAxis = AU * (semiMajorAxis * a1).ToDouble();
 | 
			
		||||
  b->orbit.period = a->orbit.period;
 | 
			
		||||
 | 
			
		||||
  fixed orbMin = semiMajorAxis - ecc*semiMajorAxis;
 | 
			
		||||
  fixed orbMax = 2*semiMajorAxis - orbMin;
 | 
			
		||||
  a->orbMin = orbMin;
 | 
			
		||||
  b->orbMin = orbMin;
 | 
			
		||||
  a->orbMax = orbMax;
 | 
			
		||||
  b->orbMax = orbMax;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Choices that depend on floating point values will result in
 | 
			
		||||
 * different universes on different platforms it seems.
 | 
			
		||||
@ -395,13 +456,9 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) {
 | 
			
		||||
  int isBinary = rand.Int32(2);
 | 
			
		||||
  if(!isBinary) {
 | 
			
		||||
    StarSystem::BodyType type = s.m_systems[system_idx].primaryStarClass;
 | 
			
		||||
    primary->type = type;
 | 
			
		||||
    primary->parent = NULL;
 | 
			
		||||
    primary->radius = fixed(bodyTypeInfo[type].radius, 100);
 | 
			
		||||
    primary->mass = fixed(bodyTypeInfo[type].mass, 100);
 | 
			
		||||
    primary->averageTemp = rand.Int32(bodyTypeInfo[type].tempMin,
 | 
			
		||||
                                      bodyTypeInfo[type].tempMax);
 | 
			
		||||
    primary->name = s.m_systems[system_idx].name;
 | 
			
		||||
    MakeStarOfType(primary, type, rand);
 | 
			
		||||
    rootBody = primary;
 | 
			
		||||
  } else {
 | 
			
		||||
    SBody* centGrav = new SBody;
 | 
			
		||||
@ -410,64 +467,70 @@ StarSystem::StarSystem(int sector_x, int sector_y, int system_idx) {
 | 
			
		||||
    centGrav->name = s.m_systems[system_idx].name;
 | 
			
		||||
    rootBody = centGrav;
 | 
			
		||||
 | 
			
		||||
    fixed ecc = rand.NFixed(3);
 | 
			
		||||
    StarSystem::BodyType type = s.m_systems[system_idx].primaryStarClass;
 | 
			
		||||
    SBody* star[2];
 | 
			
		||||
    SBody* star[4];
 | 
			
		||||
    star[0] = new SBody;
 | 
			
		||||
    star[0]->type = type;
 | 
			
		||||
    star[0]->name = s.m_systems[system_idx].name+" A";
 | 
			
		||||
    star[0]->parent = centGrav;
 | 
			
		||||
    star[0]->radius = fixed(bodyTypeInfo[type].radius, 100);
 | 
			
		||||
    star[0]->mass = fixed(bodyTypeInfo[type].mass, 100);
 | 
			
		||||
    star[0]->averageTemp = rand.Int32(bodyTypeInfo[type].tempMin,
 | 
			
		||||
                                      bodyTypeInfo[type].tempMax);
 | 
			
		||||
    
 | 
			
		||||
    MakeStarOfType(star[0], type, rand);
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Usually, star types are chosen by spectral class distribution in
 | 
			
		||||
     * our galactic neighbourhood. In binary systems, we instead just choose
 | 
			
		||||
     * random companion types up to spectral class of primary.
 | 
			
		||||
     */
 | 
			
		||||
    StarSystem::BodyType type2 = (BodyType)rand.Int32(TYPE_STAR_M, type);
 | 
			
		||||
    star[1] = new SBody;
 | 
			
		||||
    star[1]->type = type2;
 | 
			
		||||
    star[1]->name = s.m_systems[system_idx].name+" B";
 | 
			
		||||
    star[1]->parent = centGrav;
 | 
			
		||||
    star[1]->radius  = fixed(bodyTypeInfo[type2].radius, 100);
 | 
			
		||||
    star[1]->mass = fixed(bodyTypeInfo[type2].mass, 100);
 | 
			
		||||
    star[1]->averageTemp = rand.Int32(bodyTypeInfo[type2].tempMin,
 | 
			
		||||
                                      bodyTypeInfo[type2].tempMax);
 | 
			
		||||
    fixed m = star[0]->mass + star[1]->mass;
 | 
			
		||||
    fixed a0 = star[1]->mass / m;
 | 
			
		||||
    fixed a1 = star[0]->mass / m;
 | 
			
		||||
    fixed semiMajorAxis;
 | 
			
		||||
 | 
			
		||||
    switch(rand.Int32(3)) {
 | 
			
		||||
      case 2: semiMajorAxis = fixed(rand.Int32(100, 10000), 100); break;
 | 
			
		||||
      case 1: semiMajorAxis = fixed(rand.Int32(10, 1000), 100); break;
 | 
			
		||||
      default:
 | 
			
		||||
        case 0: semiMajorAxis = fixed(rand.Int32(1, 100), 100); break;
 | 
			
		||||
    }
 | 
			
		||||
    printf("Binary seperation: %.2fAU\n", semiMajorAxis.ToDouble());
 | 
			
		||||
    MakeRandomStarLighterThan(star[1], star[0]->mass, rand);
 | 
			
		||||
 | 
			
		||||
    star[0]->orbit.eccentricity = ecc.ToDouble();
 | 
			
		||||
    star[0]->orbit.semiMajorAxis = AU * (semiMajorAxis*a0).ToDouble();
 | 
			
		||||
    star[0]->orbit.period = 60*60*24*365*semiMajorAxis.ToDouble()*sqrt(semiMajorAxis.ToDouble() / m.ToDouble());
 | 
			
		||||
    star[0]->orbit.rotMatrix = matrix4x4d::RotateZMatrix(M_PI);
 | 
			
		||||
 | 
			
		||||
    star[1]->orbit.eccentricity = ecc.ToDouble();
 | 
			
		||||
    star[1]->orbit.semiMajorAxis = AU * (semiMajorAxis*a1).ToDouble();
 | 
			
		||||
    star[1]->orbit.period = star[0]->orbit.period;
 | 
			
		||||
    star[1]->orbit.rotMatrix = matrix4x4d::Identity();
 | 
			
		||||
 | 
			
		||||
    fixed orbMin = semiMajorAxis - ecc*semiMajorAxis;
 | 
			
		||||
    fixed orbMax = 2*semiMajorAxis - orbMin;
 | 
			
		||||
    star[0]->orbMin = orbMin;
 | 
			
		||||
    star[1]->orbMin = orbMin;
 | 
			
		||||
    star[0]->orbMax = orbMax;
 | 
			
		||||
    star[1]->orbMax = orbMax;
 | 
			
		||||
    MakeBinaryPair(star[0], star[1], fixed(0), rand);
 | 
			
		||||
 | 
			
		||||
    centGrav->mass = star[0]->mass + star[1]->mass;
 | 
			
		||||
    centGrav->children.push_back(star[0]);
 | 
			
		||||
    centGrav->children.push_back(star[1]);
 | 
			
		||||
 | 
			
		||||
    if((star[0]->orbMax < fixed(100, 1)) &&
 | 
			
		||||
        (!rand.Int32(3))) {
 | 
			
		||||
      SBody* centGrav2;
 | 
			
		||||
      /* 3rd and maybe 4th star. */
 | 
			
		||||
      if(!rand.Int32(2)) {
 | 
			
		||||
        star[2] = new SBody;
 | 
			
		||||
        star[2]->name = s.m_systems[system_idx].name+" C";
 | 
			
		||||
        star[2]->orbMax = 0;
 | 
			
		||||
        MakeRandomStarLighterThan(star[2], star[0]->mass, rand);
 | 
			
		||||
        centGrav2 = star[2];
 | 
			
		||||
      } else {
 | 
			
		||||
        centGrav2 = new SBody;
 | 
			
		||||
        centGrav2->type = TYPE_GRAVPOINT;
 | 
			
		||||
        centGrav2->name = s.m_systems[system_idx].name;
 | 
			
		||||
        centGrav2->orbMax = 0;
 | 
			
		||||
 | 
			
		||||
        StarSystem::BodyType type = s.m_systems[system_idx].primaryStarClass;
 | 
			
		||||
        star[2] = new SBody;
 | 
			
		||||
        star[2]->name = s.m_systems[system_idx].name+" C";
 | 
			
		||||
        star[2]->parent = centGrav2;
 | 
			
		||||
        MakeRandomStarLighterThan(star[2], star[0]->mass, rand);
 | 
			
		||||
 | 
			
		||||
        star[3] = new SBody;
 | 
			
		||||
        star[3]->name = s.m_systems[system_idx].name+" D";
 | 
			
		||||
        star[3]->parent = centGrav2;
 | 
			
		||||
        MakeRandomStarLighterThan(star[3], star[2]->mass, rand);
 | 
			
		||||
 | 
			
		||||
        MakeBinaryPair(star[2], star[3], fixed(0), rand);
 | 
			
		||||
        centGrav2->mass = star[2]->mass + star[3]->mass;
 | 
			
		||||
        centGrav2->children.push_back(star[2]);
 | 
			
		||||
        centGrav2->children.push_back(star[3]);
 | 
			
		||||
      }
 | 
			
		||||
      SBody* superCentGrav = new SBody;
 | 
			
		||||
      superCentGrav->type = TYPE_GRAVPOINT;
 | 
			
		||||
      superCentGrav->parent = NULL;
 | 
			
		||||
      superCentGrav->name = s.m_systems[system_idx].name;
 | 
			
		||||
      centGrav->parent = superCentGrav;
 | 
			
		||||
      centGrav2->parent = superCentGrav;
 | 
			
		||||
      rootBody = superCentGrav;
 | 
			
		||||
      const fixed minDist = star[0]->orbMax + star[2]->orbMax;
 | 
			
		||||
      MakeBinaryPair(centGrav, centGrav2, 4*minDist, rand);
 | 
			
		||||
      superCentGrav->children.push_back(centGrav);
 | 
			
		||||
      superCentGrav->children.push_back(centGrav2);
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -46,6 +46,7 @@ public:
 | 
			
		||||
    TYPE_STAR_A,
 | 
			
		||||
    TYPE_STAR_B,
 | 
			
		||||
    TYPE_STAR_O,
 | 
			
		||||
    TYPE_WHITE_DWARF,
 | 
			
		||||
    TYPE_BROWN_DWARF,
 | 
			
		||||
    TYPE_PLANET_SMALL_GAS_GIANT,
 | 
			
		||||
    TYPE_PLANET_MEDIUM_GAS_GIANT,
 | 
			
		||||
@ -61,7 +62,9 @@ public:
 | 
			
		||||
    TYPE_PLANET_METHANE_THICK_ATMOS,
 | 
			
		||||
    TYPE_PLANET_HIGHLY_VOLCANIC,
 | 
			
		||||
    TYPE_PLANET_INDIGENOUS_LIFE,
 | 
			
		||||
    TYPE_MAX
 | 
			
		||||
    TYPE_MAX,
 | 
			
		||||
    TYPE_STAR_MIN = TYPE_STAR_M,
 | 
			
		||||
    TYPE_STAR_MAX = TYPE_WHITE_DWARF
 | 
			
		||||
    /* TODO: Need larger atmosphereless thing. */
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
@ -122,6 +125,10 @@ public:
 | 
			
		||||
  SBody* rootBody;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  void MakeRandomStar(SBody* sbody, MTRand& rand);
 | 
			
		||||
  void MakeRandomStarLighterThan(SBody* sbody, fixed maxMass, MTRand& rand);
 | 
			
		||||
  void MakeStarOfType(SBody* sbody, BodyType type, MTRand& rand);
 | 
			
		||||
  void MakeBinaryPair(SBody* a, SBody* b, fixed minDist, MTRand& rand);
 | 
			
		||||
  void CustomGetChildOf(SBody* parent, const CustomSBody* customDef, const int parentIdx);
 | 
			
		||||
  void GenerateFromCustom(const CustomSBody*);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -47,8 +47,10 @@ void SystemInfoView::OnBodySelected(StarSystem::SBody* b) {
 | 
			
		||||
    snprintf(buf, sizeof(buf), "Eccentricity    %.2f\n", b->orbit.eccentricity);
 | 
			
		||||
    desc += buf;
 | 
			
		||||
    const float dayLen = b->GetRotationPeriod();
 | 
			
		||||
    if(dayLen) snprintf(buf, sizeof(buf), "Day length   %.1f earth days\n", dayLen/(60*60*24));
 | 
			
		||||
    desc += buf;
 | 
			
		||||
    if(dayLen) {
 | 
			
		||||
      snprintf(buf, sizeof(buf), "Day length    %.1f earth days\n", dayLen/(60*60*24));
 | 
			
		||||
      desc += buf;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  m_infoText->SetText(desc);
 | 
			
		||||
}
 | 
			
		||||
@ -93,11 +95,15 @@ void SystemInfoView::SystemChanged(StarSystem* s) {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for(; i != s->rootBody->children.end(); ++i) {
 | 
			
		||||
    Gui::ImageButton* ib = new Gui::ImageButton((*i)->GetIcon());
 | 
			
		||||
    ib->GetSize(size);
 | 
			
		||||
    ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), *i));
 | 
			
		||||
    Add(ib, xpos, ycent - 0.5*size[1]);
 | 
			
		||||
    majorBodies++;
 | 
			
		||||
    if((*i)->type == StarSystem::TYPE_GRAVPOINT) {
 | 
			
		||||
 | 
			
		||||
    } else {
 | 
			
		||||
      Gui::ImageButton* ib = new Gui::ImageButton((*i)->GetIcon());
 | 
			
		||||
      ib->GetSize(size);
 | 
			
		||||
      ib->onClick.connect(sigc::bind(sigc::mem_fun(this, &SystemInfoView::OnBodySelected), *i));
 | 
			
		||||
      Add(ib, xpos, ycent - 0.5*size[1]);
 | 
			
		||||
      majorBodies++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    float moon_ypos = ycent - size[1] - 5;
 | 
			
		||||
    if((*i)->children.size())
 | 
			
		||||
 | 
			
		||||