diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..5a910ce --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* linguist-detectable diff --git a/.github/workflows/github-repo-info.yml b/.github/workflows/github-repo-info.yml new file mode 100644 index 0000000..0d975fd --- /dev/null +++ b/.github/workflows/github-repo-info.yml @@ -0,0 +1,18 @@ +name: Update Github repository information + +on: + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Update Github repo info + uses: Darkborderman/github-actions/github-repo-info@master + env: + YML_PATH: metadata.yml + GH_TOKEN: ${{ secrets.PAT_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..84e6ab5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.gradle/ +build/ + +# artifacts +jars/ +bin/ diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6bdc53a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "java.project.sourcePaths": ["src"], + "java.project.referencedLibraries": [ + "lib/*.jar" + ] +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1d3c1b4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Darkborderman + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b689530 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Starsector-SkillParameterized + +Make most character's skills configurable in Starsector. diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..7edccbf --- /dev/null +++ b/build.gradle @@ -0,0 +1,44 @@ +repositories { + mavenCentral() +} + +apply plugin: 'java' + +// project level config +sourceSets.main.java.srcDir 'src' +sourceCompatibility = 1.7 +targetCompatibility = 1.7 +archivesBaseName = 'skillparameterized' + +build { + doLast { + copy { + from jar + into 'jars' + } + } +} + +task release(type: Zip) { + description 'Create releaseable zip file.' + def cmdOutput = 'jq -rj .version mod_info.json'.execute().text + from '.' + include 'src/' + include 'data/' + include 'graphics/' + include 'sounds/' + include 'jars/' + include 'mod_info.json' + archiveName archivesBaseName + '-' + cmdOutput + '.zip' + destinationDir(file('bin/')) +} + +clean { + description 'Cleanup files' + delete fileTree('jars/') { include '*.jar' } + delete fileTree('bin/') { include '*.zip' } +} + +dependencies { + implementation fileTree(dir: './lib/', include: '*.jar') +} diff --git a/data/config/settings.json b/data/config/settings.json new file mode 100644 index 0000000..a70b0a5 --- /dev/null +++ b/data/config/settings.json @@ -0,0 +1,240 @@ +{ + # The following skill definition is order by + # 1. Shared configuration across skills + # 2. Skill category + # 3. Skill order in character UI + # 4. Misc skills which are not available for character (usually for AI) + + # Shared configuration + "Shared": { + # Affects CarrierGroup, FighterUplink + "FIGHTER_BAYS_THRESHOLD": 8, # default 8 + # Affects TacticalDrills, CrewTraining, FluxRegulation + "OP_THRESHOLD": 240, # default 240 + # Affects FieldRepairs, ContainmentProcedures + "OP_ALL_THRESHOLD": 240 + }, + # Combat + "Helmsmanship": { + "MANEUVERABILITY_BONUS": 50, # default 50 + "SPEED_BONUS": 10, # default 10 + "ELITE_SPEED_BONUS_FLAT": 5, # default 5 + "ZERO_FLUX_LEVEL": 1 # default 1 + }, + "CombatEndurance": { + "PEAK_TIME_BONUS": 60, # default 60 + "DEGRADE_REDUCTION_PERCENT": 25, # default 25 + "MAX_CR_BONUS": 15, # default 15 + "MAX_REGEN_LEVEL": 0.5, # default 0.5 + "REGEN_RATE": 0.005, # default 0.005 + "TOTAL_REGEN_MAX_POINTS": 2000, # default 2000 + "TOTAL_REGEN_MAX_HULL_FRACTION": 0.5 # default 0.5 + }, + "ImpactMitigation": { + "MANEUVERABILITY_BONUS_LARGE": 50, # default 50 + "MANEUVERABILITY_BONUS_SMALL": 25, # default 25 + "MAX_DAMAGE_REDUCTION_BONUS": 0.05, # default 0.05 + "ARMOR_DAMAGE_REDUCTION": 25, # default 25 + "ARMOR_KINETIC_REDUCTION": 50, # default 50 + "DAMAGE_TO_MODULES_REDUCTION": 50 # default 50 + }, + "DamageControl": { + "SECONDS_PER_PROC": 2, # default 2 + "INSTA_REPAIR": 0.25, # default 0.25 + "CREW_LOSS_REDUCTION": 50, # default 50 + "MODULE_REPAIR_BONUS": 50, # default 50 + "HULL_DAMAGE_REDUCTION": 25, # default 25 + "ELITE_DAMAGE_THRESHOLD": 500, # default 500 + "ELITE_DAMAGE_REDUCTION_PERCENT": 60 # default 60 + }, + "FieldModulation": { + "SHIELD_DAMAGE_REDUCTION": 15, # default 15 + "FLUX_SHUNT_DISSIPATION": 15, # default 15 + "PHASE_FLUX_UPKEEP_REDUCTION": 25, # default 25 + "PHASE_COOLDOWN_REDUCTION": 50 # default 50 + }, + "PointDefense": { + "FIGHTER_DAMAGE_BONUS": 50, # default 50 + "MISSILE_DAMAGE_BONUS": 50, # default 50 + "PD_RANGE_BONUS_FLAT": 200 # default 200 + }, + "TargetAnalysis": { + # This skill does not expose any variable that can be modified + # Thus leave it empty here + }, + "BallisticMastery": { + "PROJ_SPEED_BONUS": 33, # default 33 + "DAMAGE_BONUS": 10, # default 10 + "RANGE_BONUS": 10 # default 10 + }, + "SystemsExpertise": { + "BONUS_CHARGES": 1, # default 1, in-game description doesn't update + "REGEN_PERCENT": 50, # default 50 + "SYSTEM_COOLDOWN_REDUCTION_PERCENT": 33, # default 33 + "RANGE_PERCENT": 50, # default 50 + "PEAK_TIME_BONUS": 30, # default 30 + "OVERLOAD_REDUCTION": 25, # default 25 + "MALFUNCTION_CHANCE_MULT": 0.5 # default 0.5 + }, + "MissileSpecialization": { + # This skill does not expose any variable that can be modified + # Thus leave it empty here + }, + # Leadership + "TacticalDrills": { + "DAMAGE_PERCENT": 5, # default 5 + "ATTACK_BONUS": 50, # default 50 + "CASUALTIES_MULT": 0.75 # default 0.75 + }, + "CoordinatedManeuvers": { + "NAV_FRIGATES": 6, # default 6 + "NAV_DESTROYERS": 3, # default 3 + "NAV_OTHER": 1, # default 1 + "CP_REGEN_FRIGATES": 50, # default 50 + "CP_REGEN_DESTROYERS": 25 # default 25 + }, + "WolfpackTactics": { + "DAMAGE_TO_LARGER_BONUS": 20, # default 20 + "DAMAGE_TO_LARGER_BONUS_DEST": 10, # default 10 + "PEAK_TIME_BONUS": 50, # default 50 + "PEAK_TIME_BONUS_DEST": 25 # default 25 + }, + "CrewTraining": { + "CR_PERCENT": 15 # default 15 + }, + "CarrierGroup": { + "REPLACEMENT_RATE_PERCENT": 50, # default 50 + "OFFICER_MULT": 1.5 # default 1.5 + }, + "FighterUplink": { + "MAX_SPEED_PERCENT": 20, # default 20 + "CREW_LOSS_PERCENT": 50, # default 50 + "TARGET_LEADING_BONUS": 50 # default 50 + }, + "OfficerTraining": { + # This skill does not expose any variable that can be modified + # Thus leave it empty here + }, + "OfficerManagement": { + "NUM_OFFICERS_BONUS": 2, # default 2 + "CP_BONUS": 2 # default 2 + }, + "BestOfTheBest": { + "EXTRA_MODS": 1, # default 1 + "DEPLOYMENT_BONUS": 0.1 # default 0.1 + }, + "SupportDoctrine": { + "COMMAND_POINT_REGEN_PERCENT": 100, # default 100 + "DP_REDUCTION": 0.2, # default 0.2 + "DP_REDUCTION_MAX": 10 # default 10 + }, + # Technology + "Navigation": { + "TERRAIN_PENALTY_REDUCTION": 30, # default 30 + "FLEET_BURN_BONUS": 1, # default 1 + "SB_BURN_BONUS": 1 # default 1 + }, + "Sensors": { + "DETECTED_BONUS": 25, # default 25 + "SENSOR_BONUS": 25, # default 25 + "SLOW_BURN_BONUS": 3 # default 3 + }, + "GunneryImplants": { + "RECOIL_BONUS": 25, # default 25 + "TARGET_LEADING_BONUS": 100, # default 100 + "RANGE_BONUS": 15, # default 15 + "EW_FRIGATES": 4, # default 4 + "EW_DESTROYERS": 2, # default 2 + "EW_OTHER": 1 # default 1 + }, + "EnergyWeaponMastery": { + "ENERGY_DAMAGE_PERCENT": 30, # default 30 + "MIN_RANGE": 600, # default 600 + "MAX_RANGE": 1000 # default 1000 + }, + "ElectronicWarfare": { + "PER_SHIP_BONUS": 1 # default 1 + }, + "FluxRegulation": { + "VENTS_BONUS": 5, # default 5 + "CAPACITORS_BONUS": 5, # default 5 + "DISSIPATION_PERCENT": 10, # default 10 + "CAPACITY_PERCENT": 10 # default 10 + }, + "PhaseCoilTuning": { + "PHASE_OP_THRESHOLD": 40, # default 40 + "PHASE_SPEED_BONUS": 50, # default 50 + "PEAK_TIME_BONUS": 180, # default 180 + "PHASE_SHIP_SENSOR_BONUS_PERCENT": 100 # default 100 + }, + "CyberneticAugmentation": { + "MAX_ELITE_SKILLS_BONUS": 2 # default 2 + }, + "NeuralLink": { + "INSTANT_TRANSFER_DP": 50 # default 50 + }, + "AutomatedShips": { + "AUTOMATED_POINTS_THRESHOLD": 200, # default 200 + "MAX_CR_BONUS": 100 # default 100 + }, + # Industry + "BulkTransport": { + "CARGO_CAPACITY_MAX_PERCENT": 50, # default 50 + "CARGO_CAPACITY_THRESHOLD": 2000, # default 2000 + "FUEL_CAPACITY_MAX_PERCENT": 50, # default 50 + "FUEL_CAPACITY_THRESHOLD": 2000, # default 2000 + "PERSONNEL_CAPACITY_MAX_PERCENT": 50, # default 50 + "PERSONNEL_CAPACITY_THRESHOLD": 5000, # default 5000 + "BURN_BONUS": 2 # default 2 + }, + "Salvaging": { + "CREW_LOSS_REDUCTION": 75, # default 75 + "SALVAGE_BONUS": 50 # default 50 + }, + "FieldRepairs": { + # This skill does not expose any variable that can be modified + # Thus leave it empty here + }, + "OrdnanceExpertise": { + "FLUX_PER_OP": 2, # default 2 + "CAP_PER_OP": 20 # default 20 + }, + "PolarizedArmor": { + "EFFECTIVE_ARMOR_BONUS": 50, # default 50 + "EMP_BONUS_PERCENT": 50, # default 50 + "VENT_RATE_BONUS": 25, # default 25 + "NON_SHIELD_FLUX_LEVEL": 50 # default 50 + }, + "ContainmentProcedures": { + "CREW_LOSS_REDUCTION": 50, # default 50 + "FUEL_USE_REDUCTION_MAX_PERCENT": 50, # default 50 + "FUEL_USE_REDUCTION_MAX_FUEL": 25, # default 25 + "FUEL_SALVAGE_BONUS": 25 # default 25 + }, + "MakeshiftEquipment": { + "SUPPLY_USE_REDUCTION_MAX_PERCENT": 50, # default 50 + "SUPPLY_USE_REDUCTION_MAX_UNITS": 100, # default 100 + "SURVEY_COST_MULT": 0.5 # default 0.5 + }, + "IndustrialPlanning": { + "SUPPLY_BONUS": 1, # default 1 + "CUSTOM_PRODUCTION_BONUS": 50 # default 50 + }, + "HullRestoration": { + "CR_PER_SMOD": 5, # default 5 + "DMOD_AVOID_MAX": 0.9, # default 0.9 + "DMOD_AVOID_MIN": 0.75, # default 0.75 + "DMOD_AVOID_MIN_DP": 5, # default 5 + "DMOD_AVOID_MAX_DP": 60 # default 60 + }, + "DerelictOperations": { + "MINUS_DP_PERCENT_PER_DMOD": 6 # default 6 + }, + # Misc Skill + "Hypercognition": { # Alpha core colony skill + "ACCESS": 0.1, # default 0.1 + "FLEET_SIZE": 20, # default 20 + "DEFEND_BONUS": 50, # default 50 + "STABILITY_BONUS": 1 # default 1 + } +} diff --git a/lib/commons-compiler-jdk.jar b/lib/commons-compiler-jdk.jar new file mode 100644 index 0000000..0895869 Binary files /dev/null and b/lib/commons-compiler-jdk.jar differ diff --git a/lib/commons-compiler.jar b/lib/commons-compiler.jar new file mode 100644 index 0000000..46cd663 Binary files /dev/null and b/lib/commons-compiler.jar differ diff --git a/lib/fs.common_obf.jar b/lib/fs.common_obf.jar new file mode 100644 index 0000000..fe5b536 Binary files /dev/null and b/lib/fs.common_obf.jar differ diff --git a/lib/fs.sound_obf.jar b/lib/fs.sound_obf.jar new file mode 100644 index 0000000..6e3549c Binary files /dev/null and b/lib/fs.sound_obf.jar differ diff --git a/lib/janino.jar b/lib/janino.jar new file mode 100644 index 0000000..79b946d Binary files /dev/null and b/lib/janino.jar differ diff --git a/lib/jinput.jar b/lib/jinput.jar new file mode 100644 index 0000000..7c2b6b0 Binary files /dev/null and b/lib/jinput.jar differ diff --git a/lib/jogg-0.0.7.jar b/lib/jogg-0.0.7.jar new file mode 100644 index 0000000..1cbd1ad Binary files /dev/null and b/lib/jogg-0.0.7.jar differ diff --git a/lib/jorbis-0.0.15.jar b/lib/jorbis-0.0.15.jar new file mode 100644 index 0000000..4cf51f9 Binary files /dev/null and b/lib/jorbis-0.0.15.jar differ diff --git a/lib/json.jar b/lib/json.jar new file mode 100644 index 0000000..5ad8c80 Binary files /dev/null and b/lib/json.jar differ diff --git a/lib/log4j-1.2.9.jar b/lib/log4j-1.2.9.jar new file mode 100644 index 0000000..a6568b0 Binary files /dev/null and b/lib/log4j-1.2.9.jar differ diff --git a/lib/lwjgl.jar b/lib/lwjgl.jar new file mode 100644 index 0000000..82294e1 Binary files /dev/null and b/lib/lwjgl.jar differ diff --git a/lib/lwjgl_util.jar b/lib/lwjgl_util.jar new file mode 100644 index 0000000..97911ab Binary files /dev/null and b/lib/lwjgl_util.jar differ diff --git a/lib/starfarer.api.jar b/lib/starfarer.api.jar new file mode 100644 index 0000000..a708efc Binary files /dev/null and b/lib/starfarer.api.jar differ diff --git a/lib/starfarer_obf.jar b/lib/starfarer_obf.jar new file mode 100644 index 0000000..54b096e Binary files /dev/null and b/lib/starfarer_obf.jar differ diff --git a/lib/xstream-1.4.10.jar b/lib/xstream-1.4.10.jar new file mode 100644 index 0000000..4d7c5d0 Binary files /dev/null and b/lib/xstream-1.4.10.jar differ diff --git a/metadata.yml b/metadata.yml new file mode 100644 index 0000000..ad9548c --- /dev/null +++ b/metadata.yml @@ -0,0 +1,12 @@ +github: + description: Make most character's skills configurable in Starsector. + enable_discussions: false + enable_issues: false + enable_projects: false + enable_wiki: false + homepage: https://github.com/DarkbordermanModding/Starsector-SkillParameterized + template: false + topics: + - mod + - starsector + - starsector-mod diff --git a/mod_info.json b/mod_info.json new file mode 100644 index 0000000..37dcf4e --- /dev/null +++ b/mod_info.json @@ -0,0 +1,10 @@ +{ + "id": "darkborderman.skillparameterized", + "name": "Skill Parameterized", + "author": "Darkborderman", + "version": "0.0.0", + "description": "Make most character's skills configurable in Starsector.", + "gameVersion": "0.96a-RC10", + "jars": ["jars/skillparameterized.jar"], + "modPlugin": "mod.skillparameterized.SkillPlugin" +} diff --git a/src/mod/skillparameterized/SkillPlugin.java b/src/mod/skillparameterized/SkillPlugin.java new file mode 100644 index 0000000..ba201d4 --- /dev/null +++ b/src/mod/skillparameterized/SkillPlugin.java @@ -0,0 +1,241 @@ +package mod.skillparameterized; + +import org.json.JSONException; + +import com.fs.starfarer.api.BaseModPlugin; +import com.fs.starfarer.api.Global; +import com.fs.starfarer.api.impl.campaign.skills.AutomatedShips; +import com.fs.starfarer.api.impl.campaign.skills.BallisticMastery; +import com.fs.starfarer.api.impl.campaign.skills.BaseSkillEffectDescription; +import com.fs.starfarer.api.impl.campaign.skills.BestOfTheBest; +import com.fs.starfarer.api.impl.campaign.skills.BulkTransport; +import com.fs.starfarer.api.impl.campaign.skills.CarrierGroup; +import com.fs.starfarer.api.impl.campaign.skills.CombatEndurance; +import com.fs.starfarer.api.impl.campaign.skills.ContainmentProcedures; +import com.fs.starfarer.api.impl.campaign.skills.CoordinatedManeuvers; +import com.fs.starfarer.api.impl.campaign.skills.CrewTraining; +import com.fs.starfarer.api.impl.campaign.skills.CyberneticAugmentation; +import com.fs.starfarer.api.impl.campaign.skills.DamageControl; +import com.fs.starfarer.api.impl.campaign.skills.DerelictContingent; +import com.fs.starfarer.api.impl.campaign.skills.ElectronicWarfare; +import com.fs.starfarer.api.impl.campaign.skills.EnergyWeaponMastery; +import com.fs.starfarer.api.impl.campaign.skills.FieldModulation; +import com.fs.starfarer.api.impl.campaign.skills.FighterUplink; +import com.fs.starfarer.api.impl.campaign.skills.FluxRegulation; +import com.fs.starfarer.api.impl.campaign.skills.GunneryImplants; +import com.fs.starfarer.api.impl.campaign.skills.Helmsmanship; +import com.fs.starfarer.api.impl.campaign.skills.HullRestoration; +import com.fs.starfarer.api.impl.campaign.skills.Hypercognition; +import com.fs.starfarer.api.impl.campaign.skills.ImpactMitigation; +import com.fs.starfarer.api.impl.campaign.skills.IndustrialPlanning; +import com.fs.starfarer.api.impl.campaign.skills.MakeshiftEquipment; +import com.fs.starfarer.api.impl.campaign.skills.Navigation; +import com.fs.starfarer.api.impl.campaign.skills.NeuralLinkScript; +import com.fs.starfarer.api.impl.campaign.skills.OfficerManagement; +import com.fs.starfarer.api.impl.campaign.skills.OrdnanceExpertise; +import com.fs.starfarer.api.impl.campaign.skills.PhaseCorps; +import com.fs.starfarer.api.impl.campaign.skills.PointDefense; +import com.fs.starfarer.api.impl.campaign.skills.PolarizedArmor; +import com.fs.starfarer.api.impl.campaign.skills.Salvaging; +import com.fs.starfarer.api.impl.campaign.skills.Sensors; +import com.fs.starfarer.api.impl.campaign.skills.SupportDoctrine; +import com.fs.starfarer.api.impl.campaign.skills.SystemsExpertise; +import com.fs.starfarer.api.impl.campaign.skills.TacticalDrills; +import com.fs.starfarer.api.impl.campaign.skills.WolfpackTactics; + + +public class SkillPlugin extends BaseModPlugin { + private float loadFloat(String skillName, String skillKey){ + try{ + return (float)Global.getSettings().getJSONObject(skillName).getDouble(skillKey); + } catch (JSONException e){ + throw new RuntimeException("Fail to load skill" + skillName); + } + } + + private int loadInt(String skillName, String skillKey){ + try{ + return Global.getSettings().getJSONObject(skillName).getInt(skillKey); + } catch (JSONException e){ + throw new RuntimeException("Fail to load skill" + skillName); + } + } + + // Load when Starsector initialized, before game + public void onApplicationLoad() { + // Shared + BaseSkillEffectDescription.FIGHTER_BAYS_THRESHOLD = loadFloat("Shared", "FIGHTER_BAYS_THRESHOLD"); + BaseSkillEffectDescription.OP_THRESHOLD = loadFloat("Shared", "OP_THRESHOLD"); + BaseSkillEffectDescription.OP_ALL_THRESHOLD = loadFloat("Shared", "OP_ALL_THRESHOLD"); + + // Combat + Helmsmanship.MANEUVERABILITY_BONUS = loadFloat("Helmsmanship", "MANEUVERABILITY_BONUS"); + Helmsmanship.SPEED_BONUS = loadFloat("Helmsmanship", "SPEED_BONUS"); + Helmsmanship.ELITE_SPEED_BONUS_FLAT = loadFloat("Helmsmanship", "ELITE_SPEED_BONUS_FLAT"); + Helmsmanship.ZERO_FLUX_LEVEL = loadFloat("Helmsmanship", "ZERO_FLUX_LEVEL"); + + CombatEndurance.PEAK_TIME_BONUS = loadFloat("CombatEndurance", "PEAK_TIME_BONUS"); + CombatEndurance.DEGRADE_REDUCTION_PERCENT = loadFloat("CombatEndurance", "DEGRADE_REDUCTION_PERCENT"); + CombatEndurance.MAX_CR_BONUS = loadFloat("CombatEndurance", "MAX_CR_BONUS"); + CombatEndurance.MAX_REGEN_LEVEL = loadFloat("CombatEndurance", "MAX_REGEN_LEVEL"); + CombatEndurance.REGEN_RATE = loadFloat("CombatEndurance", "REGEN_RATE"); + CombatEndurance.TOTAL_REGEN_MAX_POINTS = loadFloat("CombatEndurance", "TOTAL_REGEN_MAX_POINTS"); + CombatEndurance.TOTAL_REGEN_MAX_HULL_FRACTION = loadFloat("CombatEndurance", "TOTAL_REGEN_MAX_HULL_FRACTION"); + + ImpactMitigation.MANEUVERABILITY_BONUS_LARGE = loadFloat("ImpactMitigation", "MANEUVERABILITY_BONUS_LARGE"); + ImpactMitigation.MANEUVERABILITY_BONUS_SMALL = loadFloat("ImpactMitigation", "MANEUVERABILITY_BONUS_SMALL"); + ImpactMitigation.MAX_DAMAGE_REDUCTION_BONUS = loadFloat("ImpactMitigation", "MAX_DAMAGE_REDUCTION_BONUS"); + ImpactMitigation.ARMOR_DAMAGE_REDUCTION = loadFloat("ImpactMitigation", "ARMOR_DAMAGE_REDUCTION"); + ImpactMitigation.ARMOR_KINETIC_REDUCTION = loadFloat("ImpactMitigation", "ARMOR_KINETIC_REDUCTION"); + ImpactMitigation.DAMAGE_TO_MODULES_REDUCTION = loadFloat("ImpactMitigation", "DAMAGE_TO_MODULES_REDUCTION"); + + DamageControl.SECONDS_PER_PROC = loadFloat("DamageControl", "SECONDS_PER_PROC"); + DamageControl.INSTA_REPAIR = loadFloat("DamageControl", "INSTA_REPAIR"); + DamageControl.CREW_LOSS_REDUCTION = loadFloat("DamageControl", "CREW_LOSS_REDUCTION"); + DamageControl.MODULE_REPAIR_BONUS = loadFloat("DamageControl", "MODULE_REPAIR_BONUS"); + DamageControl.HULL_DAMAGE_REDUCTION = loadFloat("DamageControl", "HULL_DAMAGE_REDUCTION"); + DamageControl.ELITE_DAMAGE_THRESHOLD = loadFloat("DamageControl", "ELITE_DAMAGE_THRESHOLD"); + DamageControl.ELITE_DAMAGE_REDUCTION_PERCENT = loadFloat("DamageControl", "ELITE_DAMAGE_REDUCTION_PERCENT"); + + FieldModulation.SHIELD_DAMAGE_REDUCTION = loadFloat("FieldModulation", "SHIELD_DAMAGE_REDUCTION"); + FieldModulation.FLUX_SHUNT_DISSIPATION = loadFloat("FieldModulation", "FLUX_SHUNT_DISSIPATION"); + FieldModulation.PHASE_FLUX_UPKEEP_REDUCTION = loadFloat("FieldModulation", "PHASE_FLUX_UPKEEP_REDUCTION"); + FieldModulation.PHASE_COOLDOWN_REDUCTION = loadFloat("FieldModulation", "PHASE_COOLDOWN_REDUCTION"); + + PointDefense.FIGHTER_DAMAGE_BONUS = loadFloat("PointDefense", "FIGHTER_DAMAGE_BONUS"); + PointDefense.MISSILE_DAMAGE_BONUS = loadFloat("PointDefense", "MISSILE_DAMAGE_BONUS"); + PointDefense.PD_RANGE_BONUS_FLAT = loadFloat("PointDefense", "PD_RANGE_BONUS_FLAT"); + + BallisticMastery.PROJ_SPEED_BONUS = loadFloat("BallisticMastery", "PROJ_SPEED_BONUS"); + BallisticMastery.DAMAGE_BONUS = loadFloat("BallisticMastery", "DAMAGE_BONUS"); + BallisticMastery.RANGE_BONUS = loadFloat("BallisticMastery", "RANGE_BONUS"); + + SystemsExpertise.BONUS_CHARGES = loadFloat("SystemsExpertise", "BONUS_CHARGES"); + SystemsExpertise.REGEN_PERCENT = loadFloat("SystemsExpertise", "REGEN_PERCENT"); + SystemsExpertise.SYSTEM_COOLDOWN_REDUCTION_PERCENT = loadFloat("SystemsExpertise", "SYSTEM_COOLDOWN_REDUCTION_PERCENT"); + SystemsExpertise.RANGE_PERCENT = loadFloat("SystemsExpertise", "RANGE_PERCENT"); + SystemsExpertise.PEAK_TIME_BONUS = loadFloat("SystemsExpertise", "PEAK_TIME_BONUS"); + SystemsExpertise.OVERLOAD_REDUCTION = loadFloat("SystemsExpertise", "OVERLOAD_REDUCTION"); + SystemsExpertise.MALFUNCTION_CHANCE_MULT = loadFloat("SystemsExpertise", "MALFUNCTION_CHANCE_MULT"); + + // Leadership + TacticalDrills.DAMAGE_PERCENT = loadFloat("TacticalDrills", "DAMAGE_PERCENT"); + TacticalDrills.ATTACK_BONUS = loadInt("TacticalDrills", "ATTACK_BONUS"); + TacticalDrills.CASUALTIES_MULT = loadFloat("TacticalDrills", "CASUALTIES_MULT"); + + CoordinatedManeuvers.NAV_FRIGATES = loadFloat("CoordinatedManeuvers", "NAV_FRIGATES"); + CoordinatedManeuvers.NAV_DESTROYERS = loadFloat("CoordinatedManeuvers", "NAV_DESTROYERS"); + CoordinatedManeuvers.NAV_OTHER = loadFloat("CoordinatedManeuvers", "NAV_OTHER"); + CoordinatedManeuvers.CP_REGEN_FRIGATES = loadFloat("CoordinatedManeuvers", "CP_REGEN_FRIGATES"); + CoordinatedManeuvers.CP_REGEN_DESTROYERS = loadFloat("CoordinatedManeuvers", "CP_REGEN_DESTROYERS"); + + WolfpackTactics.DAMAGE_TO_LARGER_BONUS = loadFloat("WolfpackTactics", "DAMAGE_TO_LARGER_BONUS"); + WolfpackTactics.DAMAGE_TO_LARGER_BONUS_DEST = loadFloat("WolfpackTactics", "DAMAGE_TO_LARGER_BONUS_DEST"); + WolfpackTactics.PEAK_TIME_BONUS = loadFloat("WolfpackTactics", "PEAK_TIME_BONUS"); + WolfpackTactics.PEAK_TIME_BONUS_DEST = loadFloat("WolfpackTactics", "PEAK_TIME_BONUS_DEST"); + + CrewTraining.CR_PERCENT = loadFloat("CrewTraining", "CR_PERCENT"); + + CarrierGroup.REPLACEMENT_RATE_PERCENT = loadFloat("CarrierGroup", "REPLACEMENT_RATE_PERCENT"); + CarrierGroup.OFFICER_MULT = loadFloat("CarrierGroup", "OFFICER_MULT"); + + FighterUplink.MAX_SPEED_PERCENT = loadFloat("FighterUplink", "MAX_SPEED_PERCENT"); + FighterUplink.CREW_LOSS_PERCENT = loadFloat("FighterUplink", "CREW_LOSS_PERCENT"); + FighterUplink.TARGET_LEADING_BONUS = loadFloat("FighterUplink", "TARGET_LEADING_BONUS"); + + OfficerManagement.NUM_OFFICERS_BONUS = loadFloat("OfficerManagement", "NUM_OFFICERS_BONUS"); + OfficerManagement.CP_BONUS = loadFloat("OfficerManagement", "CP_BONUS"); + + BestOfTheBest.EXTRA_MODS = loadInt("BestOfTheBest", "EXTRA_MODS"); + BestOfTheBest.DEPLOYMENT_BONUS = loadFloat("BestOfTheBest", "DEPLOYMENT_BONUS"); + + SupportDoctrine.COMMAND_POINT_REGEN_PERCENT = loadFloat("SupportDoctrine", "COMMAND_POINT_REGEN_PERCENT"); + SupportDoctrine.DP_REDUCTION = loadFloat("SupportDoctrine", "DP_REDUCTION"); + SupportDoctrine.DP_REDUCTION_MAX = loadFloat("SupportDoctrine", "DP_REDUCTION_MAX"); + + // Technology + Navigation.TERRAIN_PENALTY_REDUCTION = loadFloat("Navigation", "TERRAIN_PENALTY_REDUCTION"); + Navigation.FLEET_BURN_BONUS = loadFloat("Navigation", "FLEET_BURN_BONUS"); + Navigation.SB_BURN_BONUS = loadFloat("Navigation", "SB_BURN_BONUS"); + + Sensors.DETECTED_BONUS = loadFloat("Sensors", "DETECTED_BONUS"); + Sensors.SENSOR_BONUS = loadFloat("Sensors", "SENSOR_BONUS"); + Sensors.SLOW_BURN_BONUS = loadFloat("Sensors", "SLOW_BURN_BONUS"); + + GunneryImplants.RECOIL_BONUS = loadFloat("GunneryImplants", "RECOIL_BONUS"); + GunneryImplants.TARGET_LEADING_BONUS = loadFloat("GunneryImplants", "TARGET_LEADING_BONUS"); + GunneryImplants.RANGE_BONUS = loadFloat("GunneryImplants", "RANGE_BONUS"); + GunneryImplants.EW_FRIGATES = loadFloat("GunneryImplants", "EW_FRIGATES"); + GunneryImplants.EW_DESTROYERS = loadFloat("GunneryImplants", "EW_DESTROYERS"); + GunneryImplants.EW_OTHER = loadFloat("GunneryImplants", "EW_OTHER"); + + EnergyWeaponMastery.ENERGY_DAMAGE_PERCENT = loadFloat("EnergyWeaponMastery", "ENERGY_DAMAGE_PERCENT"); + EnergyWeaponMastery.MIN_RANGE = loadFloat("EnergyWeaponMastery", "MIN_RANGE"); + EnergyWeaponMastery.MAX_RANGE = loadFloat("EnergyWeaponMastery", "MAX_RANGE"); + + ElectronicWarfare.PER_SHIP_BONUS = loadFloat("ElectronicWarfare", "PER_SHIP_BONUS"); + + FluxRegulation.VENTS_BONUS = loadInt("FluxRegulation", "VENTS_BONUS"); + FluxRegulation.CAPACITORS_BONUS = loadInt("FluxRegulation", "CAPACITORS_BONUS"); + FluxRegulation.DISSIPATION_PERCENT = loadFloat("FluxRegulation", "DISSIPATION_PERCENT"); + FluxRegulation.CAPACITY_PERCENT = loadFloat("FluxRegulation", "CAPACITY_PERCENT"); + + BaseSkillEffectDescription.PHASE_OP_THRESHOLD = loadFloat("PhaseCoilTuning", "PHASE_OP_THRESHOLD"); + PhaseCorps.PHASE_SPEED_BONUS = loadFloat("PhaseCoilTuning", "PHASE_SPEED_BONUS"); + PhaseCorps.PEAK_TIME_BONUS = loadFloat("PhaseCoilTuning", "PEAK_TIME_BONUS"); + PhaseCorps.PHASE_SHIP_SENSOR_BONUS_PERCENT = loadFloat("PhaseCoilTuning", "PHASE_SHIP_SENSOR_BONUS_PERCENT"); + + CyberneticAugmentation.MAX_ELITE_SKILLS_BONUS = loadFloat("CyberneticAugmentation", "MAX_ELITE_SKILLS_BONUS"); + + NeuralLinkScript.INSTANT_TRANSFER_DP = loadFloat("NeuralLink", "INSTANT_TRANSFER_DP"); + + AutomatedShips.MAX_CR_BONUS = loadFloat("AutomatedShips", "MAX_CR_BONUS"); + BaseSkillEffectDescription.AUTOMATED_POINTS_THRESHOLD = loadFloat("AutomatedShips", "AUTOMATED_POINTS_THRESHOLD"); + + // Industry + BulkTransport.CARGO_CAPACITY_MAX_PERCENT = loadFloat("BulkTransport", "CARGO_CAPACITY_MAX_PERCENT"); + BulkTransport.CARGO_CAPACITY_THRESHOLD = loadFloat("BulkTransport", "CARGO_CAPACITY_THRESHOLD"); + BulkTransport.FUEL_CAPACITY_MAX_PERCENT = loadFloat("BulkTransport", "FUEL_CAPACITY_MAX_PERCENT"); + BulkTransport.FUEL_CAPACITY_THRESHOLD = loadFloat("BulkTransport", "FUEL_CAPACITY_THRESHOLD"); + BulkTransport.PERSONNEL_CAPACITY_MAX_PERCENT = loadFloat("BulkTransport", "PERSONNEL_CAPACITY_MAX_PERCENT"); + BulkTransport.PERSONNEL_CAPACITY_THRESHOLD = loadFloat("BulkTransport", "PERSONNEL_CAPACITY_THRESHOLD"); + BulkTransport.BURN_BONUS = loadFloat("BulkTransport", "BURN_BONUS"); + + Salvaging.CREW_LOSS_REDUCTION = loadFloat("Salvaging", "CREW_LOSS_REDUCTION"); + Salvaging.SALVAGE_BONUS = loadFloat("Salvaging", "SALVAGE_BONUS"); + + OrdnanceExpertise.FLUX_PER_OP = loadFloat("OrdnanceExpertise", "FLUX_PER_OP"); + OrdnanceExpertise.CAP_PER_OP = loadFloat("OrdnanceExpertise", "CAP_PER_OP"); + + PolarizedArmor.EFFECTIVE_ARMOR_BONUS = loadFloat("PolarizedArmor", "EFFECTIVE_ARMOR_BONUS"); + PolarizedArmor.EMP_BONUS_PERCENT = loadFloat("PolarizedArmor", "EMP_BONUS_PERCENT"); + PolarizedArmor.VENT_RATE_BONUS = loadFloat("PolarizedArmor", "VENT_RATE_BONUS"); + PolarizedArmor.NON_SHIELD_FLUX_LEVEL = loadFloat("PolarizedArmor", "NON_SHIELD_FLUX_LEVEL"); + + ContainmentProcedures.CREW_LOSS_REDUCTION = loadFloat("ContainmentProcedures", "CREW_LOSS_REDUCTION"); + ContainmentProcedures.FUEL_USE_REDUCTION_MAX_PERCENT = loadFloat("ContainmentProcedures", "FUEL_USE_REDUCTION_MAX_PERCENT"); + ContainmentProcedures.FUEL_USE_REDUCTION_MAX_FUEL = loadFloat("ContainmentProcedures", "FUEL_USE_REDUCTION_MAX_FUEL"); + ContainmentProcedures.FUEL_SALVAGE_BONUS = loadFloat("ContainmentProcedures", "FUEL_SALVAGE_BONUS"); + + MakeshiftEquipment.SUPPLY_USE_REDUCTION_MAX_PERCENT = loadFloat("MakeshiftEquipment", "SUPPLY_USE_REDUCTION_MAX_PERCENT"); + MakeshiftEquipment.SUPPLY_USE_REDUCTION_MAX_UNITS = loadFloat("MakeshiftEquipment", "SUPPLY_USE_REDUCTION_MAX_UNITS"); + MakeshiftEquipment.SURVEY_COST_MULT = loadFloat("MakeshiftEquipment", "SURVEY_COST_MULT"); + + IndustrialPlanning.SUPPLY_BONUS = loadInt("IndustrialPlanning", "SUPPLY_BONUS"); + IndustrialPlanning.CUSTOM_PRODUCTION_BONUS = loadFloat("IndustrialPlanning", "CUSTOM_PRODUCTION_BONUS"); + + HullRestoration.CR_PER_SMOD = loadFloat("HullRestoration", "CR_PER_SMOD"); + HullRestoration.DMOD_AVOID_MAX = loadFloat("HullRestoration", "DMOD_AVOID_MAX"); + HullRestoration.DMOD_AVOID_MIN = loadFloat("HullRestoration", "DMOD_AVOID_MIN"); + HullRestoration.DMOD_AVOID_MIN_DP = loadFloat("HullRestoration", "DMOD_AVOID_MIN_DP"); + HullRestoration.DMOD_AVOID_MAX_DP = loadFloat("HullRestoration", "DMOD_AVOID_MAX_DP"); + + DerelictContingent.MINUS_DP_PERCENT_PER_DMOD = loadFloat("DerelictOperations", "MINUS_DP_PERCENT_PER_DMOD"); + + // Misc skills + Hypercognition.ACCESS = loadFloat("Hypercognition", "ACCESS"); + Hypercognition.FLEET_SIZE = loadFloat("Hypercognition", "FLEET_SIZE"); + Hypercognition.DEFEND_BONUS = loadInt("Hypercognition", "DEFEND_BONUS"); + Hypercognition.STABILITY_BONUS = loadFloat("Hypercognition", "STABILITY_BONUS"); + } +}