From 3f5ca423f80d6ccdfa9b78d20058582a62ad257c Mon Sep 17 00:00:00 2001 From: Tuomo Untinen Date: Sat, 11 May 2024 08:21:17 +0300 Subject: [PATCH] #700 Fixes tectonic quake status. Now same status is added only once. Tectonic quake cannot kill zero gravity beings. Fixed city in fire picture. --- .../starMap/newsCorp/ImageInstruction.java | 2 +- .../starMap/planet/Planet.java | 50 +++++++++++++++++-- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/openRealmOfStars/starMap/newsCorp/ImageInstruction.java b/src/main/java/org/openRealmOfStars/starMap/newsCorp/ImageInstruction.java index 9ac3805b5..04cad09ef 100644 --- a/src/main/java/org/openRealmOfStars/starMap/newsCorp/ImageInstruction.java +++ b/src/main/java/org/openRealmOfStars/starMap/newsCorp/ImageInstruction.java @@ -1310,7 +1310,7 @@ private static BufferedImage paintImage(final BufferedImage workImage, if (VIRUSES.equals(image)) { drawImg = IOUtilities.loadImage(GuiStatics.IMAGE_VIRUSES); } - if (VIRUSES.equals(image)) { + if (CITY_IN_FIRE.equals(image)) { drawImg = IOUtilities.loadImage(GuiStatics.IMAGE_FIRE_IN_CITY); } if (SIGNAL.equals(image)) { diff --git a/src/main/java/org/openRealmOfStars/starMap/planet/Planet.java b/src/main/java/org/openRealmOfStars/starMap/planet/Planet.java index 05789cd7f..af30489d1 100644 --- a/src/main/java/org/openRealmOfStars/starMap/planet/Planet.java +++ b/src/main/java/org/openRealmOfStars/starMap/planet/Planet.java @@ -3848,6 +3848,32 @@ public boolean addStatus(final AppliedStatus status) { return statuses.add(status); } + /** + * Tries to add applied status on planet. It checks possible conflict and + * that status is unique. How ever even if status is unique it does not + * mean that apply could not happen. There can be multiple tectonic events + * but only one status is needed for them. + * @param status Applied status to apply + * @return True applied status was added to applied statuses list. + */ + public boolean addAppliedStatus(final AppliedStatus status) { + var statusesArray = new PlanetaryStatus[statuses.size()]; + for (int i = 0; i < statusesArray.length; i++) { + statusesArray[i] = statuses.get(i).getStatus(); + } + var conflicting = PlanetaryStatus.isConflictingWith(status.getStatus(), + statusesArray); + + if (conflicting) { + return false; + } + for (AppliedStatus comp : statuses) { + if (comp.getStatusId().equals(status.getStatusId())) { + return false; + } + } + return statuses.add(status); + } /** * Return true if Planet has status with given ID * @param statusId ID of status @@ -4633,7 +4659,7 @@ EventType.PLANET_COLONIZED, getCoordinate(), getName(), } continue; } - if (statuses.add(applied) && planetOwnerInfo != null) { + if (addAppliedStatus(applied) && planetOwnerInfo != null) { // Need to improve text for new status String text = status.getStatus().getDiscoveryText(); text = text.replaceAll("", getName()); @@ -4686,12 +4712,24 @@ EventType.PLANET_COLONIZED, getCoordinate(), getName(), sb.append(building.getName()); and = true; } + boolean onGround = true; + if (planetOwnerInfo.getRace().hasTrait(TraitIds.ZERO_GRAVITY_BEING)) { + onGround = false; + } if (getTotalPopulation() > 1 && chance < getTotalPopulation()) { - killOneWorker(); - if (and) { - sb.append(" and"); + if (onGround) { + killOneWorker(); + if (and) { + sb.append(" and"); + } + sb.append(" kills one population"); + } else { + if (and) { + sb.append(" and"); + } + sb.append(" does not affect on population since they are" + + " safe in orbital"); } - sb.append(" kills one population"); } sb.append("."); ImageInstruction imageInst = new ImageInstruction(); @@ -4704,6 +4742,7 @@ EventType.PLANET_COLONIZED, getCoordinate(), getName(), msg.setMatchByString(getName()); msg.setCoordinate(getCoordinate()); planetOwnerInfo.getMsgList().addNewMessage(msg); + removeList.add(status); } if (status.getStatus().getId().equals(StatusIds.VOLCANIC_ERUPTION)) { StringBuilder sb = new StringBuilder(); @@ -4722,6 +4761,7 @@ EventType.PLANET_COLONIZED, getCoordinate(), getName(), msg.setMatchByString(getName()); msg.setCoordinate(getCoordinate()); planetOwnerInfo.getMsgList().addNewMessage(msg); + removeList.add(status); } } }