diff --git a/src/main/java/org/openRealmOfStars/starMap/StarMapGenerator.java b/src/main/java/org/openRealmOfStars/starMap/StarMapGenerator.java index 6504b9ce6..3d5a795c3 100644 --- a/src/main/java/org/openRealmOfStars/starMap/StarMapGenerator.java +++ b/src/main/java/org/openRealmOfStars/starMap/StarMapGenerator.java @@ -53,6 +53,7 @@ import org.openRealmOfStars.starMap.planet.enums.RadiationType; import org.openRealmOfStars.starMap.planet.enums.TemperatureType; import org.openRealmOfStars.starMap.planet.enums.WaterLevelType; +import org.openRealmOfStars.starMap.planet.status.TimedStatus; import org.openRealmOfStars.utilities.DiceGenerator; import org.openRealmOfStars.utilities.ErrorLogger; import org.openRealmOfStars.utilities.WeightedList; @@ -993,15 +994,25 @@ private void createSolarSystem(final int sunx, final int suny, if (!elderRealmStart || playerInfo.isElderRealm()) { createRealmToPlanet(planet, playerInfo, playerIndex); } + TimedStatus status = TimedStatus.getRandomPlanetaryStatus( + planet.getPlanetType(), config.getChanceForPlanetaryEvent()); + if (status != null) { + planet.addTimedStatus(status); + } } else { - planet.setPlanetaryEvent(PlanetaryEvent.getRandomEvent( - planet.getPlanetType(), config.getChanceForPlanetaryEvent())); planet.setRadiationLevel(SunType.getRadiation(sunType)); planet.setTemperatureType(SunType.getTemperature(sunType)); planet.generateGravityBasedOnSize(); planet.generateWaterLevelBasedOnTemperature(); planet.generateWorldType(); planet.setEventActivation(false); + planet.setPlanetaryEvent(PlanetaryEvent.getRandomEvent( + planet.getPlanetType(), config.getChanceForPlanetaryEvent())); + TimedStatus status = TimedStatus.getRandomPlanetaryStatus( + planet.getPlanetType(), config.getChanceForPlanetaryEvent()); + if (status != null) { + planet.addTimedStatus(status); + } } starMap.getPlanetList().add(planet); int planetNumber = starMap.getPlanetList().size() - 1; @@ -1134,6 +1145,11 @@ private void createSolSystem(final int sunx, planet.generateGravityBasedOnSize(); planet.generateWorldType(); planet.setName("Mercury I"); + TimedStatus status = TimedStatus.getRandomPlanetaryStatus( + planet.getPlanetType(), config.getChanceForPlanetaryEvent()); + if (status != null) { + planet.addTimedStatus(status); + } } if (planets == 2) { planet.setPlanetType(PlanetTypes.SWAMPWORLD2); @@ -1144,6 +1160,11 @@ private void createSolSystem(final int sunx, planet.generateGravityBasedOnSize(); planet.generateWorldType(); planet.setName("Venus II"); + TimedStatus status = TimedStatus.getRandomPlanetaryStatus( + planet.getPlanetType(), config.getChanceForPlanetaryEvent()); + if (status != null) { + planet.addTimedStatus(status); + } } if (planets == 3) { planet.setPlanetType(PlanetTypes.PLANET_EARTH); @@ -1153,6 +1174,11 @@ private void createSolSystem(final int sunx, planet.setWaterLevel(WaterLevelType.OCEAN); planet.generateGravityBasedOnSize(); planet.setName("Earth III"); + TimedStatus status = TimedStatus.getRandomPlanetaryStatus( + planet.getPlanetType(), config.getChanceForPlanetaryEvent()); + if (status != null) { + planet.addTimedStatus(status); + } if (playerIndex != -1) { PlayerInfo playerInfo = starMap.getPlayerList() .getPlayerInfoByIndex(playerIndex); @@ -1184,6 +1210,11 @@ private void createSolSystem(final int sunx, planet.setWaterLevel(WaterLevelType.ARID); planet.generateGravityBasedOnSize(); planet.setName("Mars IV"); + TimedStatus status = TimedStatus.getRandomPlanetaryStatus( + planet.getPlanetType(), config.getChanceForPlanetaryEvent()); + if (status != null) { + planet.addTimedStatus(status); + } if (playerIndex == -1 && DiceGenerator.getRandom(99) <= 25) { WeightedList list = new WeightedList<>(); list.add(1, PlanetaryEvent.ANCIENT_FACTORY); diff --git a/src/main/java/org/openRealmOfStars/starMap/planet/Planet.java b/src/main/java/org/openRealmOfStars/starMap/planet/Planet.java index 8ea032954..3393e2046 100644 --- a/src/main/java/org/openRealmOfStars/starMap/planet/Planet.java +++ b/src/main/java/org/openRealmOfStars/starMap/planet/Planet.java @@ -2035,8 +2035,8 @@ public String generateInfoText(final boolean activeScanned, sb.append(getCulture()); sb.append("\n"); } - if (activeScanned && !isEventActivated() - && event != PlanetaryEvent.NONE) { + if (activeScanned && (!isEventActivated() + && event != PlanetaryEvent.NONE || hasStatusForAwayTeam())) { sb.append("\nAway team could be send down."); sb.append("\n"); } @@ -3822,6 +3822,20 @@ public List getTimedStatuses() { return Collections.unmodifiableList(timedStatuses); } + /** + * Has timed planetary status which away team can find. + * @return True if timed status can be discovered by away team. + */ + public boolean hasStatusForAwayTeam() { + boolean result = false; + for (TimedStatus status : timedStatuses) { + if (status.getTimedStatus() + == TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM) { + result = true; + } + } + return result; + } /** * Remove status with specified ID from planet * @param statusId ID of status to remove diff --git a/src/main/java/org/openRealmOfStars/starMap/planet/status/StatusFactory.java b/src/main/java/org/openRealmOfStars/starMap/planet/status/StatusFactory.java index e9b68780a..4690648be 100644 --- a/src/main/java/org/openRealmOfStars/starMap/planet/status/StatusFactory.java +++ b/src/main/java/org/openRealmOfStars/starMap/planet/status/StatusFactory.java @@ -84,6 +84,24 @@ public static Optional createTimedStatus( return Optional.empty(); } + /** + * Get new status with requested statusId. + * This will load data from files if not done already. + * @param statusId ID of PlanetaryStatus + * @param type TimedStatusType + * @param count Number of star year before to applied. + * @return Requested TimedStatus from planetaryStatus, + * null if statusId is invalid + */ + public static TimedStatus getTimedStatus( + final String statusId, final TimedStatusType type, final int count) { + var planetaryStatus = SINGLETON.createStatus(statusId); + if (planetaryStatus.isPresent()) { + return new TimedStatus(planetaryStatus.get(), type, count); + } + return null; + } + /** Statuses factory can create */ private HashMap validStatuses; /** Tracks if factory is already initialized from external data */ diff --git a/src/main/java/org/openRealmOfStars/starMap/planet/status/TimedStatus.java b/src/main/java/org/openRealmOfStars/starMap/planet/status/TimedStatus.java index fc5b4519e..e4e359740 100644 --- a/src/main/java/org/openRealmOfStars/starMap/planet/status/TimedStatus.java +++ b/src/main/java/org/openRealmOfStars/starMap/planet/status/TimedStatus.java @@ -22,6 +22,8 @@ import java.io.IOException; import java.util.Optional; +import org.openRealmOfStars.starMap.planet.enums.PlanetTypes; +import org.openRealmOfStars.utilities.DiceGenerator; import org.openRealmOfStars.utilities.ErrorLogger; import org.openRealmOfStars.utilities.IOUtilities; @@ -53,6 +55,155 @@ public TimedStatus(final PlanetaryStatus status, this.count = count; } + /** + * Get Random Planetary Status. + * @param planetType PlanetType + * @param chance Chance for getting planetary status + * @return TimedPlanetary status or null + */ + public static TimedStatus getRandomPlanetaryStatus( + final PlanetTypes planetType, final int chance) { + int value = DiceGenerator.getRandom(99); + TimedStatus status = null; + if (value < chance) { + switch (planetType) { + case PLANET_EARTH: + case PLANET_MARS: { + value = DiceGenerator.getRandom(99); + if (value < 33) { + status = StatusFactory.getTimedStatus("FERTILE_SOIL", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(8, 25)); + } else if (value < 66) { + status = StatusFactory.getTimedStatus("METAL_RICH_SURFACE", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(8, 30)); + } else if (value < 100) { + status = StatusFactory.getTimedStatus("MOLTEN_LAVA", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(4, 10)); + } + break; + } + case SWAMPWORLD1: + case SWAMPWORLD2: + case SWAMPWORLD3: + value = DiceGenerator.getRandom(99); + if (value < 70) { + status = StatusFactory.getTimedStatus("FERTILE_SOIL", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(10, 25)); + } else if (value < 85) { + status = StatusFactory.getTimedStatus("METAL_RICH_SURFACE", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(8, 30)); + } else if (value < 100) { + status = StatusFactory.getTimedStatus("MOLTEN_LAVA", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(4, 10)); + } + break; + case BARRENWORLD1: + value = DiceGenerator.getRandom(99); + if (value < 50) { + status = StatusFactory.getTimedStatus("METAL_RICH_SURFACE", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(8, 30)); + } else { + status = StatusFactory.getTimedStatus("MOLTEN_LAVA", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(4, 10)); + } + break; + case ICEWORLD1: + case ICEWORLD2: + case ICEWORLD3: + case ICEWORLD4: + value = DiceGenerator.getRandom(99); + if (value < 20) { + status = StatusFactory.getTimedStatus("FERTILE_SOIL", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(15, 35)); + } else if (value < 60) { + status = StatusFactory.getTimedStatus("METAL_RICH_SURFACE", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(15, 30)); + } else if (value < 100) { + status = StatusFactory.getTimedStatus("MOLTEN_LAVA", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(2, 8)); + } + break; + case DESERTWORLD1: + case DESERTWORLD2: + case DESERTWORLD3: + value = DiceGenerator.getRandom(99); + if (value < 10) { + status = StatusFactory.getTimedStatus("FERTILE_SOIL", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(15, 35)); + } else if (value < 55) { + status = StatusFactory.getTimedStatus("METAL_RICH_SURFACE", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(15, 30)); + } else if (value < 100) { + status = StatusFactory.getTimedStatus("MOLTEN_LAVA", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(2, 8)); + } + break; + case VOLCANICWORLD1: + case VOLCANICWORLD2: + case VOLCANICWORLD3: + case VOLCANICWORLD4: + case VOLCANICWORLD5: + case VOLCANICWORLD6: + value = DiceGenerator.getRandom(99); + if (value < 30) { + status = StatusFactory.getTimedStatus("FERTILE_SOIL", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(15, 35)); + } else if (value < 50) { + status = StatusFactory.getTimedStatus("METAL_RICH_SURFACE", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(15, 30)); + } else if (value < 100) { + status = StatusFactory.getTimedStatus("MOLTEN_LAVA", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(2, 8)); + } + break; + case WATERWORLD1: + case WATERWORLD2: + case WATERWORLD3: + case WATERWORLD4: + case WATERWORLD5: + case WATERWORLD6: + case WATERWORLD7: + case WATERWORLD8: + case WATERWORLD9: + value = DiceGenerator.getRandom(99); + if (value < 60) { + status = StatusFactory.getTimedStatus("FERTILE_SOIL", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(15, 35)); + } else if (value < 95) { + status = StatusFactory.getTimedStatus("METAL_RICH_SURFACE", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(6, 32)); + } else if (value < 100) { + status = StatusFactory.getTimedStatus("MOLTEN_LAVA", + TimedStatusType.AFTER_COLONIZATION_OR_AWAY_TEAM, + DiceGenerator.getRandom(3, 8)); + } + break; + + default: + break; + } + } + return status; + } /** * Decrease counter by one only if not active yet. */