package com.fdangelo.circleworld.universeengine; import com.fdangelo.circleworld.universeengine.tilemap.Planet; public class UniverseGeneratorDefault extends UniverseGenerator { @Override protected void addGalaxy() { final int galaxyOrbits = random.nextInt(10) + 10; final short galaxySafeRadius = (short) (things[currentThing].safeRadius / 2); final short solarSystemRadius = (short) (galaxySafeRadius / (galaxyOrbits * 2)); for (int i = 0; i < galaxyOrbits; i++) { final short solarSystemDistance = (short) ((galaxySafeRadius * i) / galaxyOrbits); final int minSolarSystems = (Math.max(i * 5, 1) + 1) / 2; final int maxSolarSystems = Math.max(i * 5, 1) + 1; final int solarSystems = random.nextInt(maxSolarSystems - minSolarSystems) + minSolarSystems; short solarSystemOrbitalPeriod = (short) (random.nextInt(120) + 120); if (random.nextInt(2) == 0) { solarSystemOrbitalPeriod = (short) -solarSystemOrbitalPeriod; } for (int j = 0; j < solarSystems; j++) { final short solarSystemAngle = (short) ((36000 * j) / solarSystems); pushThing(ThingType.SolarSystem, solarSystemAngle, solarSystemDistance, (short) 0, solarSystemOrbitalPeriod, (short) 0, solarSystemRadius, 0); { final int suns = random.nextInt(3) + 1; final short solarSystemSafeRadius = things[currentThing].safeRadius; final short minRadius = (short) ((solarSystemRadius / 8) / 2); final short maxRadius = (short) (solarSystemRadius / 8); final short sunRadius = (short) (random.nextInt(maxRadius - minRadius) + minRadius); if (suns == 1) { pushThing(ThingType.Sun, (short) 0, (short) 0, (short) 0, (short) 0, Planet.getClosestValidRadius(sunRadius), (short) 0, random.nextInt()); popThing(); } else { final short sunDistance = (short) (sunRadius * 4 / 3); short sunOrbitalPerdiod = (short) (random.nextInt(30) + 30); if (random.nextInt(2) == 0) { sunOrbitalPerdiod = (short) -sunOrbitalPerdiod; } for (int k = 0; k < suns; k++) { final short sunAngle = (short) ((36000 * k) / suns); pushThing(ThingType.Sun, sunAngle, sunDistance, (short) 0, sunOrbitalPerdiod, Planet.getClosestValidRadius(sunRadius), (short) 0, random.nextInt()); popThing(); } } final int planetsOrbits = random.nextInt(7) + 1; final short planetSafeRadius = (short) ((solarSystemSafeRadius - sunRadius * 6) / (planetsOrbits * 2)); for (int l = 0; l < planetsOrbits; l++) { final short planetDistance = (short) (sunRadius * 6 + ((solarSystemSafeRadius - sunRadius * 6) * l) / planetsOrbits); final short planetAngle = (short) random.nextInt(36000); short planetRotationPeriod = (short) (random.nextInt(30) + 30); if (random.nextInt(2) == 0) { planetRotationPeriod = (short) -planetRotationPeriod; } short planetOrbitationPeriod = (short) (random.nextInt(30) + 30); if (random.nextInt(2) == 0) { planetOrbitationPeriod = (short) -planetOrbitationPeriod; } final short minPlanetRadius = (short) (planetSafeRadius / 16); final short maxPlanetRadius = (short) (planetSafeRadius / 9); short planetRadius; if (maxPlanetRadius - minPlanetRadius > 0) { planetRadius = (short) (random.nextInt(maxPlanetRadius - minPlanetRadius) + minPlanetRadius); } else { planetRadius = minPlanetRadius; } pushThing(ThingType.Planet, planetAngle, planetDistance, planetRotationPeriod, planetOrbitationPeriod, Planet.getClosestValidRadius(planetRadius), planetSafeRadius, random.nextInt()); popThing(); } } popThing(); } } } }