diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 0000000..807e077 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,6 @@ +version: "2" +checks: + return-statements: + enabled: false + similar-code: + enabled: false diff --git a/README.md b/README.md index 3b42f1b..e47c0ec 100644 --- a/README.md +++ b/README.md @@ -3,28 +3,32 @@ A collection of QoL improvements to campaign layer of Starsector. Named after first QoL addition - Transponder Off, or just `transpoffder`. Safe to install and uninstall mid-game. -Also changes some vanilla settings. -## Transponder Off in Hyperspace - -Automatically turn off fleet transponder whenever transitioning to Hyperspace. +Comes in two flavours: basic mod (`transpoffder-x.y.z.zip`) and mod that changes some settings (see below, `transpoffder-x.y.z-with-settings.zip`). ## Better Active Sensor Burst Do not disable Sustained Burn or Neutrino Detector when using Active Sensor Burst. -Fleet will move slowly for the cool-down duration (instead of doing full stop). +Fleet will move slowly for the cool-down duration (instead of doing full stop) and resume full burn afterwards. + +## Partial Survey as You Fly + +Automatically provide partial survey for planets within your sensor range. +No need to land on the planet any more. ## Scavenge as You Fly Use Scavenge ability as soon as it is usable. +Toggled via new ability (blue Scavenge icon). -## Partial Survey as You Fly +## Transponder Off in Hyperspace -No need to "touch" the planet any more. -Automatically provide partial survey for planets within your sensor range. +Automatically turn off fleet transponder when transitioning to Hyperspace. ## Vanilla Settings Changed +List of settings changes in `transpoffder-x.y.z-with-settings.zip` version: + - `altMouseMoveToMassTransfer` (true instead of false), - `campaignSpeedupMult` (3 instead of 2), - `enableShipExplosionWhiteout` (false instead of true), diff --git a/assets/data/config/LunaSettings.csv b/assets/data/config/LunaSettings.csv new file mode 100644 index 0000000..f59d507 --- /dev/null +++ b/assets/data/config/LunaSettings.csv @@ -0,0 +1,6 @@ +fieldID,fieldName,fieldType,defaultValue,secondaryValue,fieldDescription,minValue,maxValue,tab +,,,,,,,, +BetterActiveBurst,Better Active Burst,Boolean,true,,"Slow down fleet movement (instead of full-stop) and resume Sustained Burn (if it was active) after the cooldown.",,, +PartialSurveyAsYouFly,Partial Survey As You Fly,Boolean,true,,"Automatically provide partial survey for planets within your sensor range. No need to land on the planet anymore.",,, +ScavengeAsYouFly,Scavenge As You Fly,Boolean,true,,"Use Scavenge ability as soon as it is usable. Toggled via new ability (blue Scavenge icon).",,, +TransponderOff,Transponder Off in Hyperspace,Boolean,true,,"Automatically turn off fleet transponder when transitioning to Hyperspace.",,, \ No newline at end of file diff --git a/assets/data/config/LunaSettingsConfig.json b/assets/data/config/LunaSettingsConfig.json new file mode 100644 index 0000000..99deca9 --- /dev/null +++ b/assets/data/config/LunaSettingsConfig.json @@ -0,0 +1,5 @@ +{ + "transpoffder": { + "iconPath": "graphics/icons/transpoffder.png" + } +} diff --git a/assets/graphics/icons/transpoffder.png b/assets/graphics/icons/transpoffder.png new file mode 100644 index 0000000..a1c5d25 Binary files /dev/null and b/assets/graphics/icons/transpoffder.png differ diff --git a/assets/mod_info.json b/assets/mod_info.json index 43dc52b..c45bf1b 100644 --- a/assets/mod_info.json +++ b/assets/mod_info.json @@ -3,9 +3,9 @@ "name": "Transponder Off", "author": "Jaghaimo", "utility": true, - "version": "1.2.2", + "version": "2.0.0-rc2", "description": "QoL improvements to the campaign layer of Starsector", - "gameVersion": "0.95.1a-RC6", + "gameVersion": "0.96a-RC10", "modPlugin": "transpoffder.TranspoffderMod", "jars": ["transpoffder.jar"] } diff --git a/assets/transpoffder.json b/assets/transpoffder.json deleted file mode 100644 index bdc00cc..0000000 --- a/assets/transpoffder.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "BetterSensorBurst": true, - "PartialSurveyAsYouFly": true, - "ScavengeAsYouFly": true, - "Transpoffder": true -} diff --git a/assets/transpoffder.version b/assets/transpoffder.version index a7c3d1c..e869f7a 100644 --- a/assets/transpoffder.version +++ b/assets/transpoffder.version @@ -3,9 +3,10 @@ "modName": "Transponder Off", "modThreadId": 23545, "modVersion": { - "major": 1, - "minor": 2, - "patch": 2 + "major": 2, + "minor": 0, + "patch": 0 }, - "directDownloadURL": "https://github.com/jaghaimo/transpoffder/releases/download/1.2.2/transpoffder-1.2.2.zip" + "directDownloadURL": "https://github.com/jaghaimo/transpoffder/releases/download/2.0.0/transpoffder-2.0.0.zip", + "changelogURL": "https://raw.githubusercontent.com/jaghaimo/transpoffder/2.0.0/changelog.txt" } diff --git a/build.gradle b/build.gradle index f1f9a44..28d0603 100644 --- a/build.gradle +++ b/build.gradle @@ -10,12 +10,36 @@ repositories { url 'https://github.com/' patternLayout { artifact '/[organization]/[module]/releases/download/[revision]/[ext]' + artifact '/[organization]/[module]/raw/[revision]/jars/[ext]' } metadataSources { artifact() } } } + +// add zipped configuration +configurations { + zipped +} + +// install dependencies from zipped releases +task installDependencies(type: Sync) { + def extractDir = "${buildDir}/libs" + + ext.extractedJars = fileTree(extractDir) { + include "**/*.jar" + exclude "transpoffder.jar" + builtBy "installDependencies" + } + + dependsOn configurations.zipped + from { + configurations.zipped.collect { zipTree(it) } + } + into extractDir +} + // project level config java { sourceCompatibility = JavaVersion.VERSION_1_7 @@ -38,7 +62,9 @@ build { // compile time dependencies dependencies { - implementation "jaghaimo:starsector-api:0.95.1a-RC6@starfarer.api.jar" + implementation "jaghaimo:starsector-api:0.96a-RC10@starfarer.api.jar" + zipped "Lukas22041:LunaLib:1.7.7@LunaLib.zip" + implementation files({ tasks.installDependencies.extractedJars }) // game dependencies implementation group: 'com.thoughtworks.xstream', name: 'xstream', version: '1.4.10' diff --git a/src/transpoffder/AutoScavengeAbility.java b/src/transpoffder/AutoScavengeAbility.java index 5708ed4..5c49a8d 100644 --- a/src/transpoffder/AutoScavengeAbility.java +++ b/src/transpoffder/AutoScavengeAbility.java @@ -11,6 +11,10 @@ public class AutoScavengeAbility extends BaseToggleAbility { + public static boolean has() { + return getInstance() != null; + } + public static boolean isOn() { return getInstance().isActive(); } diff --git a/src/transpoffder/TranspoffderMod.java b/src/transpoffder/TranspoffderMod.java index fcbc9a2..1422404 100644 --- a/src/transpoffder/TranspoffderMod.java +++ b/src/transpoffder/TranspoffderMod.java @@ -1,94 +1,28 @@ package transpoffder; import com.fs.starfarer.api.BaseModPlugin; -import com.fs.starfarer.api.EveryFrameScript; -import com.fs.starfarer.api.Global; -import com.fs.starfarer.api.util.Misc; -import lombok.extern.log4j.Log4j; -import org.json.JSONObject; +import transpoffder.settings.Settings; +import transpoffder.settings.SettingsListener; -@Log4j public class TranspoffderMod extends BaseModPlugin { - private JSONObject settings; - @Override public void afterGameSave() { - if (hasQol("ScavengeAsYouFly")) { - restoreAutoScavenge(); - } + Settings.SCAVENGE_AS_YOU_FLY.configure(); } @Override public void beforeGameSave() { - if (hasQol("ScavengeAsYouFly")) { - removeAutoScavenge(); - } + Settings.SCAVENGE_AS_YOU_FLY.disable(); } @Override public void onApplicationLoad() throws Exception { - settings = Global.getSettings().loadJSON("transpoffder.json"); - if (hasQol("BetterSensorBurst")) { - Global.getSettings().getAbilitySpec("sensor_burst").getTags().remove("burn-"); - Global.getSettings().getAbilitySpec("sensor_burst").getTags().remove("sensors+"); - log.info("Enabled better sensor burst"); - } + SettingsListener.register(); } @Override public void onGameLoad(boolean newGame) { - if (hasQol("PartialSurveyAsYouFly")) { - addTransientScript(new PartialSurveyScript()); - log.info("Enabled partial survey as you fly"); - } - if (hasQol("ScavengeAsYouFly")) { - restoreAutoScavenge(); - notifyAboutState(); - log.info("Enabled scavenge as you fly"); - } - if (hasQol("Transpoffder")) { - addTransientListener(new TranspoffderListener()); - log.info("Enabled transpoffder"); - } - } - - private void addTransientListener(Object listener) { - Global.getSector().getListenerManager().addListener(listener, true); - } - - private void addTransientScript(EveryFrameScript script) { - Global.getSector().addTransientScript(script); - } - - private boolean hasQol(String key) { - return settings.optBoolean(key, true); - } - - private void notifyAboutState() { - String state = AutoScavengeAbility.isOn() ? "enabled" : "disabled"; - Global - .getSector() - .getCampaignUI() - .addMessage( - "Automatic scavenging is %s.", - Misc.getTextColor(), - state, - state, - Misc.getHighlightColor(), - Misc.getHighlightColor() - ); - } - - private void removeAutoScavenge() { - boolean isOn = AutoScavengeAbility.isOn(); - Global.getSector().getMemoryWithoutUpdate().set("$transpoffderAutoScavenge", isOn); - Global.getSector().getCharacterData().removeAbility("auto_scavenge"); - } - - private void restoreAutoScavenge() { - Global.getSector().getCharacterData().addAbility("auto_scavenge"); - boolean isOn = Global.getSector().getMemoryWithoutUpdate().getBoolean("$transpoffderAutoScavenge"); - AutoScavengeAbility.setOn(isOn); + SettingsListener.configure(); } } diff --git a/src/transpoffder/TranspoffderListener.java b/src/transpoffder/TransponderOffListener.java similarity index 90% rename from src/transpoffder/TranspoffderListener.java rename to src/transpoffder/TransponderOffListener.java index 7e727cf..f2dd5fc 100644 --- a/src/transpoffder/TranspoffderListener.java +++ b/src/transpoffder/TransponderOffListener.java @@ -6,7 +6,7 @@ import com.fs.starfarer.api.campaign.listeners.CurrentLocationChangedListener; import com.fs.starfarer.api.impl.campaign.ids.Abilities; -public class TranspoffderListener implements CurrentLocationChangedListener { +public class TransponderOffListener implements CurrentLocationChangedListener { @Override public void reportCurrentLocationChanged(LocationAPI prev, LocationAPI curr) { diff --git a/src/transpoffder/Utils.java b/src/transpoffder/Utils.java new file mode 100644 index 0000000..d82488d --- /dev/null +++ b/src/transpoffder/Utils.java @@ -0,0 +1,47 @@ +package transpoffder; + +import com.fs.starfarer.api.EveryFrameScript; +import com.fs.starfarer.api.GameState; +import com.fs.starfarer.api.Global; +import com.fs.starfarer.api.util.Misc; + +public class Utils { + + public static void addTransientListener(Object listener) { + Global.getSector().getListenerManager().addListener(listener, true); + } + + public static void addTransientScript(EveryFrameScript script) { + Global.getSector().addTransientScript(script); + } + + public static boolean isInCampaign() { + return Global.getSettings().getCurrentState() == GameState.CAMPAIGN; + } + + public static void quickNotify(String text, String highlight1, String highlight2) { + Global + .getSector() + .getCampaignUI() + .addMessage( + text, + Misc.getTextColor(), + highlight1, + highlight2, + Misc.getHighlightColor(), + Misc.getHighlightColor() + ); + } + + public static void removeTransientListeners(Class clazz) { + Global.getSector().getListenerManager().removeListenerOfClass(clazz); + } + + public static void removeTransientScripts(Class clazz) { + for (EveryFrameScript script : Global.getSector().getTransientScripts()) { + if (clazz.isInstance(script)) { + Global.getSector().removeTransientScript(null); + } + } + } +} diff --git a/src/transpoffder/settings/BetterSensorBurst.java b/src/transpoffder/settings/BetterSensorBurst.java new file mode 100644 index 0000000..8484e60 --- /dev/null +++ b/src/transpoffder/settings/BetterSensorBurst.java @@ -0,0 +1,22 @@ +package transpoffder.settings; + +import com.fs.starfarer.api.Global; +import lombok.extern.log4j.Log4j; + +@Log4j +public class BetterSensorBurst implements Toggler { + + @Override + public void enable() { + Global.getSettings().getAbilitySpec("sensor_burst").getTags().remove("burn-"); + Global.getSettings().getAbilitySpec("sensor_burst").getTags().remove("sensors+"); + log.info("Enabled better sensor burst"); + } + + @Override + public void disable() { + Global.getSettings().getAbilitySpec("sensor_burst").getTags().add("burn-"); + Global.getSettings().getAbilitySpec("sensor_burst").getTags().add("sensors+"); + log.info("Disabled better sensor burst"); + } +} diff --git a/src/transpoffder/settings/PartialSurveyToggler.java b/src/transpoffder/settings/PartialSurveyToggler.java new file mode 100644 index 0000000..aabdb92 --- /dev/null +++ b/src/transpoffder/settings/PartialSurveyToggler.java @@ -0,0 +1,21 @@ +package transpoffder.settings; + +import lombok.extern.log4j.Log4j; +import transpoffder.PartialSurveyScript; +import transpoffder.Utils; + +@Log4j +public class PartialSurveyToggler implements Toggler { + + @Override + public void enable() { + Utils.addTransientScript(new PartialSurveyScript()); + log.info("Enabled partial survey as you fly"); + } + + @Override + public void disable() { + Utils.removeTransientScripts(PartialSurveyScript.class); + log.info("Disabled partial survey as you fly"); + } +} diff --git a/src/transpoffder/settings/ScavengeAsYouFlyToggler.java b/src/transpoffder/settings/ScavengeAsYouFlyToggler.java new file mode 100644 index 0000000..d0157cd --- /dev/null +++ b/src/transpoffder/settings/ScavengeAsYouFlyToggler.java @@ -0,0 +1,30 @@ +package transpoffder.settings; + +import com.fs.starfarer.api.Global; +import lombok.extern.log4j.Log4j; +import transpoffder.AutoScavengeAbility; +import transpoffder.Utils; + +@Log4j +public class ScavengeAsYouFlyToggler implements Toggler { + + @Override + public void enable() { + boolean isOn = Global.getSector().getMemoryWithoutUpdate().getBoolean("$transpoffderAutoScavenge"); + Global.getSector().getCharacterData().addAbility("auto_scavenge"); + AutoScavengeAbility.setOn(isOn); + String state = isOn ? "enabled" : "disabled"; + Utils.quickNotify("Automatic scavenging is %s.", state, state); + log.info("Enabled scavenge as you fly"); + } + + @Override + public void disable() { + if (AutoScavengeAbility.has()) { + boolean isOn = AutoScavengeAbility.isOn(); + Global.getSector().getMemoryWithoutUpdate().set("$transpoffderAutoScavenge", isOn); + Global.getSector().getCharacterData().removeAbility("auto_scavenge"); + } + log.info("Disabled scavenge as you fly"); + } +} diff --git a/src/transpoffder/settings/Settings.java b/src/transpoffder/settings/Settings.java new file mode 100644 index 0000000..44dd31b --- /dev/null +++ b/src/transpoffder/settings/Settings.java @@ -0,0 +1,28 @@ +package transpoffder.settings; + +import lombok.RequiredArgsConstructor; +import lunalib.lunaSettings.LunaSettings; + +@RequiredArgsConstructor +public enum Settings { + BETTER_ACTIVE_BURST("BetterActiveBurst", new BetterSensorBurst()), + PARTIAL_SURVEY_AS_YOU_FLY("PartialSurveyAsYouFly", new PartialSurveyToggler()), + SCAVENGE_AS_YOU_FLY("ScavengeAsYouFly", new ScavengeAsYouFlyToggler()), + TRANSPONDER_OFF("TransponderOff", new TransponderOffToggler()); + + private final String key; + private final Toggler toggler; + public static final String MOD_ID = "transpoffder"; + + public void configure() { + if (LunaSettings.getBoolean(MOD_ID, key)) { + toggler.enable(); + } else { + toggler.disable(); + } + } + + public void disable() { + toggler.disable(); + } +} diff --git a/src/transpoffder/settings/SettingsListener.java b/src/transpoffder/settings/SettingsListener.java new file mode 100644 index 0000000..1c449a4 --- /dev/null +++ b/src/transpoffder/settings/SettingsListener.java @@ -0,0 +1,45 @@ +package transpoffder.settings; + +import com.fs.starfarer.api.Global; +import lombok.extern.log4j.Log4j; +import lunalib.lunaSettings.LunaSettings; +import lunalib.lunaSettings.LunaSettingsListener; +import transpoffder.Utils; + +@Log4j +public class SettingsListener implements LunaSettingsListener { + + public static void configure() { + Settings.BETTER_ACTIVE_BURST.configure(); + Settings.PARTIAL_SURVEY_AS_YOU_FLY.configure(); + Settings.SCAVENGE_AS_YOU_FLY.configure(); + Settings.TRANSPONDER_OFF.configure(); + } + + public static void deactivate() { + Settings.BETTER_ACTIVE_BURST.disable(); + Settings.PARTIAL_SURVEY_AS_YOU_FLY.disable(); + Settings.SCAVENGE_AS_YOU_FLY.disable(); + Settings.TRANSPONDER_OFF.disable(); + } + + public static void register() { + LunaSettings.addSettingsListener(new SettingsListener()); + try { + Global.getSettings().loadTexture("graphics/icons/transpoffder.png"); + } catch (Exception exception) { + log.error("Failed to load tranpoffder icon!"); + } + } + + @Override + public void settingsChanged(String modId) { + if (!modId.equals(Settings.MOD_ID)) { + return; + } + if (!Utils.isInCampaign()) { + return; + } + configure(); + } +} diff --git a/src/transpoffder/settings/Toggler.java b/src/transpoffder/settings/Toggler.java new file mode 100644 index 0000000..0b6ea34 --- /dev/null +++ b/src/transpoffder/settings/Toggler.java @@ -0,0 +1,7 @@ +package transpoffder.settings; + +public interface Toggler { + public void enable(); + + public void disable(); +} diff --git a/src/transpoffder/settings/TransponderOffToggler.java b/src/transpoffder/settings/TransponderOffToggler.java new file mode 100644 index 0000000..f47d683 --- /dev/null +++ b/src/transpoffder/settings/TransponderOffToggler.java @@ -0,0 +1,21 @@ +package transpoffder.settings; + +import lombok.extern.log4j.Log4j; +import transpoffder.TransponderOffListener; +import transpoffder.Utils; + +@Log4j +public class TransponderOffToggler implements Toggler { + + @Override + public void enable() { + Utils.addTransientListener(new TransponderOffListener()); + log.info("Enabled transponder off"); + } + + @Override + public void disable() { + Utils.removeTransientListeners(TransponderOffListener.class); + log.info("Disabled transponder off"); + } +}