Skip to content

Commit

Permalink
#676 Adds timed statuses on starmap generation.
Browse files Browse the repository at this point in the history
  • Loading branch information
tuomount committed Apr 4, 2024
1 parent 4b5da82 commit db66906
Show file tree
Hide file tree
Showing 4 changed files with 218 additions and 4 deletions.
35 changes: 33 additions & 2 deletions src/main/java/org/openRealmOfStars/starMap/StarMapGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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<PlanetaryEvent> list = new WeightedList<>();
list.add(1, PlanetaryEvent.ANCIENT_FACTORY);
Expand Down
18 changes: 16 additions & 2 deletions src/main/java/org/openRealmOfStars/starMap/planet/Planet.java
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
Expand Down Expand Up @@ -3822,6 +3822,20 @@ public List<TimedStatus> 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,24 @@ public static Optional<TimedStatus> 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<String, PlanetaryStatus> validStatuses;
/** Tracks if factory is already initialized from external data */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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.
*/
Expand Down

0 comments on commit db66906

Please sign in to comment.