From ffce10dad95e61b1923f96ecde3d12b4ebb658c6 Mon Sep 17 00:00:00 2001 From: Tranquiliti <118501563+Tranquiliti@users.noreply.github.com> Date: Sat, 24 Aug 2024 14:19:49 -0700 Subject: [PATCH 1/2] Update v2.1.1 --- changelog.txt | 17 ++ customizablestarsystems.version | 4 +- data/config/referenceStarSystem.json | 29 ++- data/config/settings.json | 11 +- data/strings/strings.json | 8 +- jars/CustomizableStarSystems.jar | Bin 37625 -> 38397 bytes mod_info.json | 2 +- .../customizablestarsystems/CSSModPlugin.java | 2 +- .../customizablestarsystems/CSSStrings.java | 8 +- .../customizablestarsystems/CSSUtil.java | 7 +- .../CustomStarSystem.java | 183 +++++++++++------- 11 files changed, 182 insertions(+), 89 deletions(-) diff --git a/changelog.txt b/changelog.txt index 499d15e..af2fd67 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,20 @@ +Version 2.1.1 + +* Added "numAsteroids" option for "asteroid_field" and "asteroid_belt" entities +* Added "hyperspaceCenter" setting to settings.json + - Used to determine the closest constellations for the normal "setLocation" option +* Added "systemSpacing" setting to settings.json + - Adds to the minimum distance a custom star system generates away from other star systems when using the normal "setLocation" option + - Increased spacing to 150 units (from 100) +* Added "marketMemoryKeys" option for planets and stations + - Similar to "memoryKeys", but for the market of any planet or station (including uninhabited planets and abandoned stations) +* Added String support for "memoryKeys" and "marketMemoryKeys" +* "station" entities can now use the "condition" option regardless of "marketSize" + - I.e. abandoned stations can now have custom conditions +* Some code refactors + + + Version 2.1.0 * Added "teleportUponGeneration" option for custom star systems diff --git a/customizablestarsystems.version b/customizablestarsystems.version index dbbc5ff..b81832a 100644 --- a/customizablestarsystems.version +++ b/customizablestarsystems.version @@ -6,9 +6,9 @@ { "major":2, "minor":1, - "patch":0 + "patch":1 }, "starsectorVersion":"0.97a-RC11", - "directDownloadURL":"https://github.com/Tranquiliti/CustomizableStarSystems/releases/download/v2.1.0/CustomizableStarSystems-v2.1.0.zip", + "directDownloadURL":"https://github.com/Tranquiliti/CustomizableStarSystems/releases/download/v2.1.1/CustomizableStarSystems-v2.1.1.zip", "changelogURL":"https://raw.githubusercontent.com/Tranquiliti/CustomizableStarSystems/main/changelog.txt" } \ No newline at end of file diff --git a/data/config/referenceStarSystem.json b/data/config/referenceStarSystem.json index 3a42dd6..17b590c 100644 --- a/data/config/referenceStarSystem.json +++ b/data/config/referenceStarSystem.json @@ -135,12 +135,12 @@ "orbitDays":0, # For ADVANCED users only! - # A map of memory keys and values added to this entity's memory - # Only Boolean values are currently supported for each memory key + # A map of memory keys and values to add or replace in the memory of this entity + # Only Boolean and String values are currently supported for each memory key # Defaults to not applying any additional memory keys if this entry is ommitted "memoryKeys":{ "$example_mem_key":true, - "$example_mem_key_2":false, + "$example_mem_key_2":"example_value", } }, { # A star, made as part of the system center @@ -365,6 +365,16 @@ # Defaults to 0, or uninhabited, if this entry is omitted "marketSize":0, + # For ADVANCED users only! + # A map of memory keys and values to add or replace in the memory of this planet's market + # (Note that uninhabited planets and abandoned stations also generate with a market) + # Only Boolean and String values are currently supported for each memory key + # Defaults to not applying any additional memory keys if this entry is ommitted + "marketMemoryKeys":{ + "$example_mem_key":true, + "$example_mem_key_2":"example_value", + }, + #------------------------------------------------------------# # Planet entries below require "marketSize" to be at least 1 # #------------------------------------------------------------# @@ -459,7 +469,9 @@ "orbitClockwise":true, "name":"Placeholder Station", "customDescriptionId":"station_chupi_orco", + "conditions":[], "memoryKeys":{}, + "marketMemoryKeys":{}, # Type of station graphic to use # Station graphics are found in starsector-core/graphics/stations @@ -479,7 +491,6 @@ #-------------------------------------------------------------# "freePort":false, "aiCoreAdmin":false, - "conditions":[], "industries":["population","spaceport"], }, { # Remnant battlestation @@ -508,6 +519,10 @@ # Size of the asteroid field # Defaults to 400 if this entry is omitted "size":400, + + # Number of interactable asteroids within the asteroid field + # Defaults to proc-gen settings if this entry is omitted or is set to a negative number + "numAsteroids":100 }, { # Accretion disk "entity":"accretion_disk", @@ -599,7 +614,11 @@ # Size of the asteroid belt # Defaults to 256 if this entry is omitted - "size":256 + "size":256, + + # Number of interactable asteroids within the asteroid belt + # Defaults to proc-gen settings if this entry is omitted or is set to a negative number + "numAsteroids":250 }, { # Custom entities (also the default option for handling unrecognized or modded entities) # Custom entity IDs can be found in starsector-core/data/config/custom_entities.json diff --git a/data/config/settings.json b/data/config/settings.json index 2fcf3ef..f491e15 100644 --- a/data/config/settings.json +++ b/data/config/settings.json @@ -7,5 +7,14 @@ { # Generates custom star systems upon starting a new game # Custom star systems can be configured in customStarSystems.json - "enableCustomStarSystems":true, + "customizablestarsystems_enableCustomStarSystems":true, + + # The hyperspace coordinates used to determine the closest constellations for the "setLocation" option + # Default values (-4531,-5865) provide the centroid point of all vanilla THEME_CORE systems + # Only applies to systems not using the [x,y] "setLocation" option + "customizablestarsystems_hyperspaceCenter":[-4531,-5865], + + # Additional distance a custom star system generates away from other star systems when using "setLocation" + # Only applies to systems not using the [x,y] "setLocation" option + "customizablestarsystems_systemSpacing":150 } \ No newline at end of file diff --git a/data/strings/strings.json b/data/strings/strings.json index a303760..0ec82c6 100644 --- a/data/strings/strings.json +++ b/data/strings/strings.json @@ -10,7 +10,9 @@ "mod_id_customizablestarsystems":"customizablestarsystems", # Settings in settings.json - "settings_enableCustomStarSystems":"enableCustomStarSystems", + "settings_enableCustomStarSystems":"customizablestarsystems_enableCustomStarSystems", + "settings_hyperspaceCenter":"customizablestarsystems_hyperspaceCenter", + "settings_systemSpacing":"customizablestarsystems_systemSpacing", # Main system options in customStarSystems.json "opt_isEnabled":"isEnabled", @@ -48,7 +50,8 @@ "opt_freePort":"freePort", "opt_aiCoreAdmin":"aiCoreAdmin", "opt_industries":"industries", - "opt_memory_keys":"memoryKeys", + "opt_memoryKeys":"memoryKeys", + "opt_marketMemoryKeys":"marketMemoryKeys", # Sub-options for "opt_specChanges" "opt_atmosphereColor":"atmosphereColor", @@ -71,6 +74,7 @@ # Sub-options for certain entities "opt_isDamaged":"isDamaged", "opt_size":"size", + "opt_numAsteroids":"numAsteroids", "opt_innerBandIndex":"innerBandIndex", "opt_outerBandIndex":"outerBandIndex", "opt_bandIndex":"bandIndex", diff --git a/jars/CustomizableStarSystems.jar b/jars/CustomizableStarSystems.jar index fb187a3c513d2c2dbff707b82286a411c9567ff9..ad8a76ec83ff20c80162795312d7f4979fefef5a 100644 GIT binary patch delta 33820 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 D=?_w- diff --git a/mod_info.json b/mod_info.json index dce9422..29e2069 100644 --- a/mod_info.json +++ b/mod_info.json @@ -3,7 +3,7 @@ "name":"Customizable Star Systems", "author":"Tranquility", "utility":"true", - "version":{"major":2,"minor":1,"patch":0}, + "version":{"major":2,"minor":1,"patch":1}, "description":"Adds customizable star systems, editable through a JSON config file.", "gameVersion":"0.97a-RC11", "jars":["jars/CustomizableStarSystems.jar"], diff --git a/src/org/tranquility/customizablestarsystems/CSSModPlugin.java b/src/org/tranquility/customizablestarsystems/CSSModPlugin.java index e96d157..8c9c1be 100644 --- a/src/org/tranquility/customizablestarsystems/CSSModPlugin.java +++ b/src/org/tranquility/customizablestarsystems/CSSModPlugin.java @@ -37,7 +37,7 @@ public void onGameLoad(boolean newGame) { // Generates mod systems after proc-gen so that planet markets can properly generate @Override public void onNewGameAfterProcGen() { - boolean doCustomStarSystems = LUNALIB_ENABLED ? Boolean.TRUE.equals(CSSLunaUtil.getBoolean(MOD_ID_CUSTOMIZABLE_STAR_SYSTEMS, SETTINGS_ENABLE_CUSTOM_STAR_SYSTEMS)) : Global.getSettings().getBoolean(SETTINGS_ENABLE_CUSTOM_STAR_SYSTEMS); + boolean doCustomStarSystems = LUNALIB_ENABLED ? Boolean.TRUE.equals(CSSLunaUtil.getBoolean(MOD_ID_CUSTOMIZABLE_STAR_SYSTEMS, SETTINGS_ENABLE_CUSTOM_STAR_SYSTEMS.replace(MOD_ID_CUSTOMIZABLE_STAR_SYSTEMS + '_', ""))) : Global.getSettings().getBoolean(SETTINGS_ENABLE_CUSTOM_STAR_SYSTEMS); if (doCustomStarSystems) try { generateCustomStarSystems(); } catch (Exception e) { diff --git a/src/org/tranquility/customizablestarsystems/CSSStrings.java b/src/org/tranquility/customizablestarsystems/CSSStrings.java index a4a625d..bf2b755 100644 --- a/src/org/tranquility/customizablestarsystems/CSSStrings.java +++ b/src/org/tranquility/customizablestarsystems/CSSStrings.java @@ -6,12 +6,14 @@ * A class containing the strings.json entries for this mod */ public final class CSSStrings { - public static final String STRINGS_CATEGORY = "customizablestarsystems"; + private static final String STRINGS_CATEGORY = "customizablestarsystems"; public static final String MOD_ID_CUSTOMIZABLE_STAR_SYSTEMS = Global.getSettings().getString(STRINGS_CATEGORY, "mod_id_customizablestarsystems"); // Settings in settings.json public static final String SETTINGS_ENABLE_CUSTOM_STAR_SYSTEMS = Global.getSettings().getString(STRINGS_CATEGORY, "settings_enableCustomStarSystems"); + public static final String SETTINGS_HYPERSPACE_CENTER = Global.getSettings().getString(STRINGS_CATEGORY, "settings_hyperspaceCenter"); + public static final String SETTINGS_SYSTEM_SPACING = Global.getSettings().getString(STRINGS_CATEGORY, "settings_systemSpacing"); // Main system options in customStarSystems.json public static final String OPT_IS_ENABLED = Global.getSettings().getString(STRINGS_CATEGORY, "opt_isEnabled"); @@ -49,7 +51,8 @@ public final class CSSStrings { public static final String OPT_FREE_PORT = Global.getSettings().getString(STRINGS_CATEGORY, "opt_freePort"); public static final String OPT_AI_CORE_ADMIN = Global.getSettings().getString(STRINGS_CATEGORY, "opt_aiCoreAdmin"); public static final String OPT_INDUSTRIES = Global.getSettings().getString(STRINGS_CATEGORY, "opt_industries"); - public static final String OPT_MEMORY_KEYS = Global.getSettings().getString(STRINGS_CATEGORY, "opt_memory_keys"); + public static final String OPT_MEMORY_KEYS = Global.getSettings().getString(STRINGS_CATEGORY, "opt_memoryKeys"); + public static final String OPT_MARKET_MEMORY_KEYS = Global.getSettings().getString(STRINGS_CATEGORY, "opt_marketMemoryKeys"); // Sub-options for "specChanges" public static final String OPT_ATMOSPHERE_COLOR = Global.getSettings().getString(STRINGS_CATEGORY, "opt_atmosphereColor"); @@ -72,6 +75,7 @@ public final class CSSStrings { // Sub-options for certain entities public static final String OPT_IS_DAMAGED = Global.getSettings().getString(STRINGS_CATEGORY, "opt_isDamaged"); public static final String OPT_SIZE = Global.getSettings().getString(STRINGS_CATEGORY, "opt_size"); + public static final String OPT_NUM_ASTEROIDS = Global.getSettings().getString(STRINGS_CATEGORY, "opt_numAsteroids"); public static final String OPT_INNER_BAND_INDEX = Global.getSettings().getString(STRINGS_CATEGORY, "opt_innerBandIndex"); public static final String OPT_OUTER_BAND_INDEX = Global.getSettings().getString(STRINGS_CATEGORY, "opt_outerBandIndex"); public static final String OPT_BAND_INDEX = Global.getSettings().getString(STRINGS_CATEGORY, "opt_bandIndex"); diff --git a/src/org/tranquility/customizablestarsystems/CSSUtil.java b/src/org/tranquility/customizablestarsystems/CSSUtil.java index cd1fca9..16abdf3 100644 --- a/src/org/tranquility/customizablestarsystems/CSSUtil.java +++ b/src/org/tranquility/customizablestarsystems/CSSUtil.java @@ -14,8 +14,7 @@ import java.io.IOException; import java.util.Map; -import static org.tranquility.customizablestarsystems.CSSStrings.MOD_ID_CUSTOMIZABLE_STAR_SYSTEMS; -import static org.tranquility.customizablestarsystems.CSSStrings.PATH_MERGED_JSON_CUSTOM_STAR_SYSTEMS; +import static org.tranquility.customizablestarsystems.CSSStrings.*; /** * A utility class for the Customizable Star Systems mod @@ -31,7 +30,7 @@ public static JSONObject getMergedSystemJSON() throws JSONException, IOException } /** - * Sets admins accordingly on given markets; the Map is cleared afterwards + * Sets admins accordingly on given markets; the Map is cleared afterward * * @param marketMap A map of market IDs to the admins to place */ @@ -47,7 +46,7 @@ public static void generateAdminsOnMarkets(Map marketMap) { market.setAdmin(aiPlugin.createPerson(Commodities.ALPHA_CORE, market.getFaction().getId(), 0)); break; } - marketMap.clear(); // No need for the HashMap afterwards, so clear it just in case + marketMap.clear(); // No need for the HashMap afterward, so clear it just in case } } diff --git a/src/org/tranquility/customizablestarsystems/CustomStarSystem.java b/src/org/tranquility/customizablestarsystems/CustomStarSystem.java index 59220c9..f45660b 100644 --- a/src/org/tranquility/customizablestarsystems/CustomStarSystem.java +++ b/src/org/tranquility/customizablestarsystems/CustomStarSystem.java @@ -4,6 +4,7 @@ import com.fs.starfarer.api.campaign.*; import com.fs.starfarer.api.campaign.econ.Industry; import com.fs.starfarer.api.campaign.econ.MarketAPI; +import com.fs.starfarer.api.campaign.rules.HasMemory; import com.fs.starfarer.api.characters.PersonAPI; import com.fs.starfarer.api.fleet.FleetMemberAPI; import com.fs.starfarer.api.fleet.FleetMemberType; @@ -55,7 +56,7 @@ public class CustomStarSystem { public final String ID_STAR = ":star_"; public final String ID_PLANET = ":planet_"; public final String ID_STATION = ":station_"; - public final String ID_MARKET = "_market"; + public final String ID_MARKET = "market_"; public final String CONDITION_POPULATION = "population_"; // addMarket() appends a number to this // addRemnantStation() strings @@ -66,14 +67,14 @@ public class CustomStarSystem { // Other private ArrayList procGenConstellations; // Filled in during 1st setLocation() call private final String[] RANDOM_STAR_GIANT_TYPES = {StarTypes.ORANGE_GIANT, StarTypes.RED_GIANT, StarTypes.RED_SUPERGIANT, StarTypes.BLUE_GIANT, StarTypes.BLUE_SUPERGIANT}; - private final Vector2f CORE_WORLD_CENTER = new Vector2f(-4531, -5865); // The centroid point of all vanilla THEME_CORE systems private final Random randomSeed = StarSystemGenerator.random; // Sector seed private final HashMap marketsToOverrideAdmin = new HashMap<>(); // Updated in CustomStarSystem.addMarket() + private final String SYSTEM_ID; + private final JSONObject SYSTEM_OPTIONS; + private final Vector2f HYPERSPACE_CENTER; private StarSystemAPI system; private List systemEntities; - private final String systemId; - private final JSONObject systemOptions; private float systemRadius = 0f; private boolean hasFactionPresence = false; private boolean hasJumpPoint = false; @@ -86,8 +87,9 @@ public class CustomStarSystem { * @throws JSONException If systemOptions is invalid */ public CustomStarSystem(JSONObject systemOptions, String systemId) throws JSONException { - this.systemId = systemId; - this.systemOptions = systemOptions; + SYSTEM_ID = systemId; + SYSTEM_OPTIONS = systemOptions; + HYPERSPACE_CENTER = getHyperspaceCenter(); createStarSystem(); generateEntities(); @@ -119,14 +121,19 @@ public Map getMarketsToOverrideAdmin() { /** * Gets the actual star system * - * @return The star system represented by this CustomStarSystem + * @return The StarSystemAPI represented by this CustomStarSystem */ public StarSystemAPI getSystem() { return system; } + private Vector2f getHyperspaceCenter() throws JSONException { + JSONArray coordinates = Global.getSettings().getJSONArray(SETTINGS_HYPERSPACE_CENTER); + return new Vector2f(coordinates.getInt(0), coordinates.getInt(1)); + } + private void createStarSystem() throws JSONException { - JSONArray entities = systemOptions.getJSONArray(OPT_ENTITIES); + JSONArray entities = SYSTEM_OPTIONS.getJSONArray(OPT_ENTITIES); // Create a star system based on the 1st star's name // Looping through "entities" list since 1st entity may be an "empty_location" and not a star @@ -138,8 +145,8 @@ private void createStarSystem() throws JSONException { } private void generateEntities() throws JSONException { - JSONArray entities = systemOptions.getJSONArray(OPT_ENTITIES); - if (entities.length() == 0) throw new IllegalArgumentException(String.format(ERROR_BAD_CENTER_STAR, systemId)); + JSONArray entities = SYSTEM_OPTIONS.getJSONArray(OPT_ENTITIES); + if (entities.length() == 0) throw new IllegalArgumentException(String.format(ERROR_BAD_CENTER_STAR, SYSTEM_ID)); systemEntities = new ArrayList<>(entities.length()); @@ -148,7 +155,7 @@ private void generateEntities() throws JSONException { String entityType = entityOptions.getString(OPT_ENTITY); if (i == 0 && !entityType.equals(Tags.STAR) && !entityType.equals(ENTITY_EMPTY_LOCATION)) - throw new IllegalArgumentException(String.format(ERROR_BAD_CENTER_STAR, systemId)); + throw new IllegalArgumentException(String.format(ERROR_BAD_CENTER_STAR, SYSTEM_ID)); SectorEntityToken newEntity; switch (entityType) { @@ -208,7 +215,7 @@ private void generateEntities() throws JSONException { setEntityLocation(newEntity, entityOptions, i); } - addMemoryKeys(newEntity, entityOptions); + addMemoryKeys(newEntity, entityOptions, OPT_MEMORY_KEYS); systemEntities.add(newEntity); } @@ -330,7 +337,7 @@ private int addCenterStars(JSONArray entities) throws JSONException { for (int i = 1; i <= numOfCenterStars; i++) { JSONObject starOptions = entities.getJSONObject(i); if (!starOptions.getString(OPT_ENTITY).equals(Tags.STAR)) - throw new IllegalArgumentException(String.format(ERROR_BAD_CENTER_STAR, systemId)); + throw new IllegalArgumentException(String.format(ERROR_BAD_CENTER_STAR, SYSTEM_ID)); systemEntities.add(addStar(starOptions, i, true)); systemEntities.get(i).setCircularOrbit(system.getCenter(), angle, orbitRadius + i - 1, orbitDays); angle = (angle + angleDifference) % 360f; @@ -346,7 +353,7 @@ private PlanetAPI addStar(JSONObject options, int index, boolean isClose) throws StarGenDataSpec starData = (StarGenDataSpec) Global.getSettings().getSpec(StarGenDataSpec.class, starType, true); if (starData == null) - throw new IllegalArgumentException(String.format(ERROR_STAR_TYPE_NOT_FOUND, starType, systemId, index)); + throw new IllegalArgumentException(String.format(ERROR_STAR_TYPE_NOT_FOUND, starType, SYSTEM_ID, index)); float radius = options.optInt(OPT_RADIUS, DEFAULT_SET_TO_PROC_GEN); if (radius <= 0) @@ -412,7 +419,7 @@ private PlanetAPI addPlanet(JSONObject options, int index) throws JSONException String planetType = options.optString(OPT_TYPE, DEFAULT_PLANET_TYPE); PlanetGenDataSpec planetData = (PlanetGenDataSpec) Global.getSettings().getSpec(PlanetGenDataSpec.class, planetType, true); if (planetData == null) - throw new IllegalArgumentException(String.format(ERROR_PLANET_TYPE_NOT_FOUND, planetType, systemId, index)); + throw new IllegalArgumentException(String.format(ERROR_PLANET_TYPE_NOT_FOUND, planetType, SYSTEM_ID, index)); String name = options.optString(OPT_NAME, null); if (name == null) name = getProcGenName(Tags.PLANET, system.getBaseName()); @@ -423,15 +430,17 @@ private PlanetAPI addPlanet(JSONObject options, int index) throws JSONException // Need to set a default orbit, else new game creation will fail when attempting to save PlanetAPI newPlanet = system.addPlanet(system.getCenter().getId() + ID_PLANET + index, system.getCenter(), name, planetType, 0f, radius, 10000f, 1000f); - newPlanet.getMemoryWithoutUpdate().set(MemFlags.SALVAGE_SEED, randomSeed.nextLong()); addSpecChanges(newPlanet, options.optJSONObject(OPT_SPEC_CHANGES)); addCustomDescription(newPlanet, options); int marketSize = options.optInt(OPT_MARKET_SIZE, DEFAULT_MARKET_SIZE); - if (marketSize <= 0) setPlanetConditions(newPlanet, options); - else addMarket(newPlanet, options, marketSize); + if (marketSize <= 0) setPlanetConditions(newPlanet, options); // initConditionMarket() sets salvage seed already + else { + newPlanet.getMemoryWithoutUpdate().set(MemFlags.SALVAGE_SEED, randomSeed.nextLong()); + addMarket(newPlanet, options, marketSize); + } return newPlanet; } @@ -451,7 +460,7 @@ private SectorEntityToken addStation(JSONObject options, int index) throws JSONE addCustomDescription(station, options); int marketSize = options.optInt(OPT_MARKET_SIZE, DEFAULT_MARKET_SIZE); - if (marketSize <= 0) Misc.setAbandonedStationMarket(station.getId(), station); + if (marketSize <= 0) setStationConditions(station, options); else addMarket(station, options, marketSize); return station; @@ -514,9 +523,14 @@ private CampaignFleetAPI addRemnantStation(JSONObject options) { private SectorEntityToken addAsteroidField(JSONObject options) { String name = options.optString(OPT_NAME, null); float radius = options.optInt(OPT_SIZE, 400); - int count = (int) (radius * radius * 3.14f / 80000f); - if (count < 10) count = 10; - if (count > 100) count = 100; + + int count = options.optInt(OPT_NUM_ASTEROIDS, DEFAULT_SET_TO_PROC_GEN); + if (count < 0) { + count = (int) (radius * radius * 3.14f / 80000f); + if (count < 10) count = 10; + if (count > 100) count = 100; + } + return system.addTerrain(Terrain.ASTEROID_FIELD, new AsteroidFieldTerrainPlugin.AsteroidFieldParams(radius, radius + 100f, count, count, 4f, 16f, name)); } @@ -593,9 +607,12 @@ private SectorEntityToken addAsteroidBelt(JSONObject options, int index) throws float orbitDays = options.optInt(OPT_ORBIT_DAYS, DEFAULT_SET_TO_PROC_GEN); if (orbitDays <= 0) orbitDays = orbitRadius / (15f + 5f * randomSeed.nextFloat()); - int count = (int) (orbitDays * (0.25f + 0.5f * randomSeed.nextFloat())); - if (count > 100) count = (int) (100f + (count - 100f) * 0.25f); - if (count > 250) count = 250; + int count = options.optInt(OPT_NUM_ASTEROIDS, DEFAULT_SET_TO_PROC_GEN); + if (count < 0) { + count = (int) (orbitDays * (0.25f + 0.5f * randomSeed.nextFloat())); + if (count > 100) count = (int) (100f + (count - 100f) * 0.25f); + if (count > 250) count = 250; + } int innerBandIndex = options.optInt(OPT_INNER_BAND_INDEX, 0); int outerBandIndex = options.optInt(OPT_OUTER_BAND_INDEX, 0); @@ -617,7 +634,7 @@ private SectorEntityToken addCustomEntity(JSONObject options) throws JSONExcepti try { entity = system.addCustomEntity(null, name, type, factionId); } catch (Exception e) { - throw new IllegalArgumentException(String.format(String.format(ERROR_INVALID_ENTITY_ID, type, systemId))); + throw new IllegalArgumentException(String.format(String.format(ERROR_INVALID_ENTITY_ID, type, SYSTEM_ID))); } switch (type) { @@ -652,30 +669,51 @@ private SectorEntityToken addCustomEntity(JSONObject options) throws JSONExcepti return entity; } - private void addMemoryKeys(SectorEntityToken entity, JSONObject entityOptions) { - JSONObject memoryKeys = entityOptions.optJSONObject(OPT_MEMORY_KEYS); + private void addMemoryKeys(HasMemory entity, JSONObject entityOptions, String optionKey) { + JSONObject memoryKeys = entityOptions.optJSONObject(optionKey); if (memoryKeys != null) for (Iterator it = memoryKeys.keys(); it.hasNext(); ) { String memKey = it.next(); - entity.getMemoryWithoutUpdate().set(memKey, memoryKeys.optBoolean(memKey, false)); + + try { // Try-catch because it's otherwise impossible to distinguish the source of optBoolean()'s false value + entity.getMemoryWithoutUpdate().set(memKey, memoryKeys.getBoolean(memKey)); + } catch (JSONException e) { + entity.getMemoryWithoutUpdate().set(memKey, memoryKeys.optString(memKey, null)); + } } } private SectorEntityToken getFocusEntity(JSONObject entityOptions, int index) { int focus = entityOptions.optInt(OPT_FOCUS); if (focus >= systemEntities.size()) - throw new IllegalArgumentException(String.format(ERROR_INVALID_FOCUS, systemId, index)); + throw new IllegalArgumentException(String.format(ERROR_INVALID_FOCUS, SYSTEM_ID, index)); return systemEntities.get(focus); } private void setPlanetConditions(PlanetAPI planet, JSONObject planetOptions) throws JSONException { Misc.initConditionMarket(planet); MarketAPI planetMarket = planet.getMarket(); + addMemoryKeys(planetMarket, planetOptions, OPT_MARKET_MEMORY_KEYS); + JSONArray conditions = planetOptions.optJSONArray(OPT_CONDITIONS); if (conditions != null) for (int i = 0; i < conditions.length(); i++) try { planetMarket.addCondition(conditions.getString(i)); } catch (Exception e) { - throw new IllegalArgumentException(String.format(ERROR_INVALID_CONDITION_UNINHABITED, conditions.getString(i), planet.getTypeId(), systemId)); + throw new IllegalArgumentException(String.format(ERROR_INVALID_CONDITION_UNINHABITED, conditions.getString(i), planet.getTypeId(), SYSTEM_ID)); + } + } + + private void setStationConditions(SectorEntityToken station, JSONObject stationOptions) throws JSONException { + Misc.setAbandonedStationMarket(station.getId(), station); + MarketAPI stationMarket = station.getMarket(); + addMemoryKeys(stationMarket, stationOptions, OPT_MARKET_MEMORY_KEYS); + + JSONArray conditions = stationOptions.optJSONArray(OPT_CONDITIONS); + if (conditions != null) for (int i = 0; i < conditions.length(); i++) + try { + stationMarket.addCondition(conditions.getString(i)); + } catch (Exception e) { // Error message still assume planets, but whatever + throw new IllegalArgumentException(String.format(ERROR_INVALID_CONDITION_UNINHABITED, conditions.getString(i), station.getCustomEntityType(), SYSTEM_ID)); } } @@ -684,19 +722,23 @@ private void addMarket(SectorEntityToken entity, JSONObject marketOptions, int s if (size > 10 && Global.getSettings().getMarketConditionSpec(CONDITION_POPULATION + size) == null) size = 10; String factionId = marketOptions.getString(OPT_FACTION_ID); - MarketAPI planetMarket = Global.getFactory().createMarket(entity.getId() + ID_MARKET, entity.getName(), size); - planetMarket.setFactionId(factionId); - planetMarket.setPrimaryEntity(entity); - planetMarket.getTariff().setBaseValue(0.3f); // Default tariff value - planetMarket.setFreePort(marketOptions.optBoolean(OPT_FREE_PORT, false)); - planetMarket.addCondition(CONDITION_POPULATION + size); + // Similar to initEconomyMarket() in Misc.java + MarketAPI entityMarket = Global.getFactory().createMarket(ID_MARKET + entity.getId(), entity.getName(), size); + addMemoryKeys(entityMarket, marketOptions, OPT_MARKET_MEMORY_KEYS); + + entityMarket.setPrimaryEntity(entity); + entityMarket.setFactionId(factionId); + entityMarket.getTariff().setBaseValue(0.3f); // Default tariff value + entityMarket.setFreePort(marketOptions.optBoolean(OPT_FREE_PORT, false)); + + entityMarket.addCondition(CONDITION_POPULATION + size); JSONArray conditions = marketOptions.optJSONArray(OPT_CONDITIONS); if (conditions != null) for (int i = 0; i < conditions.length(); i++) try { - planetMarket.addCondition(conditions.getString(i)); + entityMarket.addCondition(conditions.getString(i)); } catch (Exception e) { - throw new IllegalArgumentException(String.format(ERROR_INVALID_CONDITION_INHABITED, conditions.getString(i), size, factionId, systemId)); + throw new IllegalArgumentException(String.format(ERROR_INVALID_CONDITION_INHABITED, conditions.getString(i), size, factionId, SYSTEM_ID)); } JSONArray industries = marketOptions.optJSONArray(OPT_INDUSTRIES); @@ -708,13 +750,13 @@ private void addMarket(SectorEntityToken entity, JSONObject marketOptions, int s else industryId = industries.optString(i, null); try { - planetMarket.addIndustry(industryId); + entityMarket.addIndustry(industryId); } catch (Exception e) { - throw new IllegalArgumentException(String.format(ERROR_INVALID_INDUSTRY, industryId, size, factionId, systemId)); + throw new IllegalArgumentException(String.format(ERROR_INVALID_INDUSTRY, industryId, size, factionId, SYSTEM_ID)); } if (specials != null && specials.length() > 1) { - Industry newIndustry = planetMarket.getIndustry(industryId); + Industry newIndustry = entityMarket.getIndustry(industryId); String aiCoreId = specials.optString(1, null); if (aiCoreId != null) newIndustry.setAICoreId(aiCoreId); @@ -727,31 +769,31 @@ private void addMarket(SectorEntityToken entity, JSONObject marketOptions, int s } // "Population & Infrastructure" industry must exist for colonies to work properly - if (!planetMarket.hasIndustry(Industries.POPULATION)) planetMarket.addIndustry(Industries.POPULATION); + if (!entityMarket.hasIndustry(Industries.POPULATION)) entityMarket.addIndustry(Industries.POPULATION); } else { // Just give market the bare minimum colony - planetMarket.addIndustry(Industries.POPULATION); - planetMarket.addIndustry(Industries.SPACEPORT); + entityMarket.addIndustry(Industries.POPULATION); + entityMarket.addIndustry(Industries.SPACEPORT); } - planetMarket.addSubmarket(Submarkets.SUBMARKET_STORAGE); + entityMarket.addSubmarket(Submarkets.SUBMARKET_STORAGE); if (factionId.equals(Factions.PLAYER)) { - planetMarket.setPlayerOwned(true); - planetMarket.addSubmarket(Submarkets.LOCAL_RESOURCES); - ((StoragePlugin) planetMarket.getSubmarket(Submarkets.SUBMARKET_STORAGE).getPlugin()).setPlayerPaidToUnlock(true); - marketsToOverrideAdmin.put(planetMarket, Factions.PLAYER); + entityMarket.setPlayerOwned(true); + entityMarket.addSubmarket(Submarkets.LOCAL_RESOURCES); + ((StoragePlugin) entityMarket.getSubmarket(Submarkets.SUBMARKET_STORAGE).getPlugin()).setPlayerPaidToUnlock(true); + marketsToOverrideAdmin.put(entityMarket, Factions.PLAYER); } else { - planetMarket.addSubmarket(Submarkets.SUBMARKET_OPEN); - if (planetMarket.hasIndustry(Industries.MILITARYBASE) || planetMarket.hasIndustry(Industries.HIGHCOMMAND)) - planetMarket.addSubmarket(Submarkets.GENERIC_MILITARY); - planetMarket.addSubmarket(Submarkets.SUBMARKET_BLACK); + entityMarket.addSubmarket(Submarkets.SUBMARKET_OPEN); + if (entityMarket.hasIndustry(Industries.MILITARYBASE) || entityMarket.hasIndustry(Industries.HIGHCOMMAND)) + entityMarket.addSubmarket(Submarkets.GENERIC_MILITARY); + entityMarket.addSubmarket(Submarkets.SUBMARKET_BLACK); } if (marketOptions.optBoolean(OPT_AI_CORE_ADMIN, false)) - marketsToOverrideAdmin.put(planetMarket, Commodities.ALPHA_CORE); + marketsToOverrideAdmin.put(entityMarket, Commodities.ALPHA_CORE); - Global.getSector().getEconomy().addMarket(planetMarket, true); - entity.setMarket(planetMarket); entity.setFaction(factionId); + entity.setMarket(entityMarket); + Global.getSector().getEconomy().addMarket(entityMarket, true); hasFactionPresence = true; } @@ -902,7 +944,7 @@ private void addSpecChanges(PlanetAPI body, JSONObject specOptions) throws JSONE // See com.fs.starfarer.api.impl.campaign.procgen.themes.DerelictThemeGenerator's addCryosleeper() for vanilla implementation private void generateDomainCryosleeperIfApplicable() { - if (!systemOptions.optBoolean(OPT_ADD_DOMAIN_CRYOSLEEPER, false)) return; + if (!SYSTEM_OPTIONS.optBoolean(OPT_ADD_DOMAIN_CRYOSLEEPER, false)) return; float orbitRadius = systemRadius + 1000f; SectorEntityToken cryosleeper = system.addCustomEntity(null, DEFAULT_CRYOSLEEPER_NAME, Entities.DERELICT_CRYOSLEEPER, Factions.DERELICT); @@ -917,7 +959,7 @@ private void generateDomainCryosleeperIfApplicable() { // See com.fs.starfarer.api.impl.campaign.procgen.themes.MiscellaneousThemeGenerator's addCoronalTaps() for vanilla implementation private void generateCoronalHypershuntIfApplicable() { - if (!systemOptions.optBoolean(OPT_ADD_CORONAL_HYPERSHUNT, false)) return; + if (!SYSTEM_OPTIONS.optBoolean(OPT_ADD_CORONAL_HYPERSHUNT, false)) return; SectorEntityToken systemCenter = system.getCenter(); SectorEntityToken hypershunt = system.addCustomEntity(null, null, Entities.CORONAL_TAP, null); @@ -944,7 +986,7 @@ private void makeDiscoverable(SectorEntityToken entity, float detectedRange) { } private void addCoreSystemTags() { - if (systemOptions.optBoolean(OPT_IS_CORE_WORLD_SYSTEM, false)) { + if (SYSTEM_OPTIONS.optBoolean(OPT_IS_CORE_WORLD_SYSTEM, false)) { system.addTag(Tags.THEME_CORE); system.addTag(hasFactionPresence ? Tags.THEME_CORE_POPULATED : Tags.THEME_CORE_UNPOPULATED); } else { @@ -954,17 +996,17 @@ private void addCoreSystemTags() { } private void addMusicIfApplicable() { - String musicId = systemOptions.optString(OPT_SYSTEM_MUSIC, null); + String musicId = SYSTEM_OPTIONS.optString(OPT_SYSTEM_MUSIC, null); if (musicId != null) system.getMemoryWithoutUpdate().set(MusicPlayerPluginImpl.MUSIC_SET_MEM_KEY, musicId); } private void addNebulaIfApplicable() { - if (systemOptions.optBoolean(OPT_HAS_SYSTEMWIDE_NEBULA, false)) + if (SYSTEM_OPTIONS.optBoolean(OPT_HAS_SYSTEMWIDE_NEBULA, false)) StarSystemGenerator.addSystemwideNebula(system, system.getAge()); } private void setBackground() { - String bgFileName = systemOptions.optString(OPT_SYSTEM_BACKGROUND, null); + String bgFileName = SYSTEM_OPTIONS.optString(OPT_SYSTEM_BACKGROUND, null); if (bgFileName != null) system.setBackgroundTextureFilename(PATH_GRAPHICS_BACKGROUND + bgFileName); else { String nebulaType = system.hasSystemwideNebula() ? StarSystemGenerator.nebulaTypes.get(system.getAge()) : StarSystemGenerator.NEBULA_NONE; @@ -973,14 +1015,14 @@ private void setBackground() { } private void addSystemTagsIfApplicable() throws JSONException { - JSONArray systemTags = systemOptions.optJSONArray(OPT_SYSTEM_TAGS); + JSONArray systemTags = SYSTEM_OPTIONS.optJSONArray(OPT_SYSTEM_TAGS); if (systemTags != null) for (int i = 0; i < systemTags.length(); i++) { system.addTag(systemTags.getString(i)); } } private void setLightColor() throws JSONException { - Color result = getColor(systemOptions.optJSONArray(OPT_SYSTEM_LIGHT_COLOR)); + Color result = getColor(SYSTEM_OPTIONS.optJSONArray(OPT_SYSTEM_LIGHT_COLOR)); if (result == null) { result = Color.WHITE; List planetList = system.getPlanets(); @@ -1032,9 +1074,9 @@ private Color[] getColors(JSONArray colorList) throws JSONException { } private void setLocation() throws JSONException { - JSONArray locationOverride = systemOptions.optJSONArray(OPT_SET_LOCATION); + JSONArray locationOverride = SYSTEM_OPTIONS.optJSONArray(OPT_SET_LOCATION); if (locationOverride == null) - setConstellationLocation(systemRadius / 10f + 100f, systemOptions.optInt(OPT_SET_LOCATION, 0)); + setConstellationLocation(systemRadius / 10f + Global.getSettings().getInt(SETTINGS_SYSTEM_SPACING), SYSTEM_OPTIONS.optInt(OPT_SET_LOCATION, 0)); else setLocation(locationOverride.getInt(0), locationOverride.getInt(1)); } @@ -1052,7 +1094,7 @@ private void setConstellationLocation(float hyperspaceRadius, int index) { TreeSet sortedSet = new TreeSet<>(new Comparator() { public int compare(Constellation c1, Constellation c2) { if (c1 == c2) return 0; - return Float.compare(Misc.getDistance(CORE_WORLD_CENTER, c1.getLocation()), Misc.getDistance(CORE_WORLD_CENTER, c2.getLocation())); + return Float.compare(Misc.getDistance(HYPERSPACE_CENTER, c1.getLocation()), Misc.getDistance(HYPERSPACE_CENTER, c2.getLocation())); } }); @@ -1062,10 +1104,9 @@ public int compare(Constellation c1, Constellation c2) { procGenConstellations = new ArrayList<>(sortedSet); } - // If no constellations exist (for whatever reason), just set location to middle of Core Worlds - // (you could consider them a special constellation?) + // If no constellations exist (for whatever reason), fallback to the hyperspace center if (procGenConstellations.isEmpty()) { - setLocation(CORE_WORLD_CENTER.getX(), CORE_WORLD_CENTER.getY()); + setLocation(HYPERSPACE_CENTER.getX(), HYPERSPACE_CENTER.getY()); return; } From a660911dfe1e1d570207a1cc1e5c9cb2ac15e8d6 Mon Sep 17 00:00:00 2001 From: Tranquiliti <118501563+Tranquiliti@users.noreply.github.com> Date: Sat, 24 Aug 2024 16:23:58 -0700 Subject: [PATCH 2/2] Update v2.1.1 --- changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index af2fd67..44dd8e4 100644 --- a/changelog.txt +++ b/changelog.txt @@ -5,7 +5,7 @@ Version 2.1.1 - Used to determine the closest constellations for the normal "setLocation" option * Added "systemSpacing" setting to settings.json - Adds to the minimum distance a custom star system generates away from other star systems when using the normal "setLocation" option - - Increased spacing to 150 units (from 100) + - Increased default spacing to 150 units (from 100) * Added "marketMemoryKeys" option for planets and stations - Similar to "memoryKeys", but for the market of any planet or station (including uninhabited planets and abandoned stations) * Added String support for "memoryKeys" and "marketMemoryKeys"