diff --git a/NewHorizons/Builder/Volumes/Rulesets/PlayerImpactRulesetBuilder.cs b/NewHorizons/Builder/Volumes/Rulesets/PlayerImpactRulesetBuilder.cs new file mode 100644 index 00000000..9ef330de --- /dev/null +++ b/NewHorizons/Builder/Volumes/Rulesets/PlayerImpactRulesetBuilder.cs @@ -0,0 +1,18 @@ +using NewHorizons.External.Modules; +using UnityEngine; + +namespace NewHorizons.Builder.Volumes +{ + public static class PlayerImpactRulesetBuilder + { + public static PlayerImpactRuleset Make(GameObject planetGO, Sector sector, VolumesModule.RulesetModule.PlayerImpactRulesetInfo info) + { + var volume = VolumeBuilder.Make(planetGO, sector, info); + + volume.minImpactSpeed = info.minImpactSpeed; + volume.maxImpactSpeed = info.maxImpactSpeed; + + return volume; + } + } +} diff --git a/NewHorizons/Builder/Volumes/Rulesets/ProbeRulesetBuilder.cs b/NewHorizons/Builder/Volumes/Rulesets/ProbeRulesetBuilder.cs new file mode 100644 index 00000000..b8293d94 --- /dev/null +++ b/NewHorizons/Builder/Volumes/Rulesets/ProbeRulesetBuilder.cs @@ -0,0 +1,21 @@ +using NewHorizons.External.Modules; +using UnityEngine; + +namespace NewHorizons.Builder.Volumes +{ + public static class ProbeRulesetBuilder + { + public static ProbeRuleset Make(GameObject planetGO, Sector sector, VolumesModule.RulesetModule.ProbeRulesetInfo info) + { + var volume = VolumeBuilder.Make(planetGO, sector, info); + + volume._overrideProbeSpeed = info.overrideProbeSpeed; + volume._probeSpeedOverride = info.probeSpeed; + volume._overrideLanternRange = info.overrideLanternRange; + volume._lanternRange = info.lanternRange; + volume._ignoreAnchor = info.ignoreAnchor; + + return volume; + } + } +} diff --git a/NewHorizons/Builder/Volumes/Rulesets/ThrustRulesetBuilder.cs b/NewHorizons/Builder/Volumes/Rulesets/ThrustRulesetBuilder.cs new file mode 100644 index 00000000..8541f516 --- /dev/null +++ b/NewHorizons/Builder/Volumes/Rulesets/ThrustRulesetBuilder.cs @@ -0,0 +1,19 @@ +using NewHorizons.External.Modules; +using UnityEngine; + +namespace NewHorizons.Builder.Volumes +{ + public static class ThrustRulesetBuilder + { + public static ThrustRuleset Make(GameObject planetGO, Sector sector, VolumesModule.RulesetModule.ThrustRulesetInfo info) + { + var volume = VolumeBuilder.Make(planetGO, sector, info); + + volume._thrustLimit = info.thrustLimit; + volume._nerfJetpackBooster = info.nerfJetpackBooster; + volume._nerfDuration = info.nerfDuration; + + return volume; + } + } +} diff --git a/NewHorizons/Builder/Volumes/VolumesBuildManager.cs b/NewHorizons/Builder/Volumes/VolumesBuildManager.cs index cddff16c..75a4d8c8 100644 --- a/NewHorizons/Builder/Volumes/VolumesBuildManager.cs +++ b/NewHorizons/Builder/Volumes/VolumesBuildManager.cs @@ -140,6 +140,37 @@ namespace NewHorizons.Builder.Volumes } } } + if (config.Volumes.rulesets != null) + { + if (config.Volumes.rulesets.antiTravelMusicRulesets != null) + { + foreach (var antiTravelMusicRuleset in config.Volumes.rulesets.antiTravelMusicRulesets) + { + VolumeBuilder.Make(go, sector, antiTravelMusicRuleset); + } + } + if (config.Volumes.rulesets.playerImpactRulesets != null) + { + foreach (var playerImpactRuleset in config.Volumes.rulesets.playerImpactRulesets) + { + PlayerImpactRulesetBuilder.Make(go, sector, playerImpactRuleset); + } + } + if (config.Volumes.rulesets.probeRulesets != null) + { + foreach (var probeRuleset in config.Volumes.rulesets.probeRulesets) + { + ProbeRulesetBuilder.Make(go, sector, probeRuleset); + } + } + if (config.Volumes.rulesets.thrustRulesets != null) + { + foreach (var thrustRuleset in config.Volumes.rulesets.thrustRulesets) + { + ThrustRulesetBuilder.Make(go, sector, thrustRuleset); + } + } + } } } } diff --git a/NewHorizons/External/Modules/VolumesModule.cs b/NewHorizons/External/Modules/VolumesModule.cs index 216e3724..9095952a 100644 --- a/NewHorizons/External/Modules/VolumesModule.cs +++ b/NewHorizons/External/Modules/VolumesModule.cs @@ -75,6 +75,11 @@ namespace NewHorizons.External.Modules /// public VolumeInfo[] reverbVolumes; + /// + /// Add ruleset volumes to this planet. + /// + public RulesetModule rulesets; + /// /// Add visor effect volumes to this planet. /// @@ -483,6 +488,89 @@ namespace NewHorizons.External.Modules public float streakRate = 1f; } } + + [JsonObject] + public class RulesetModule + { + /// + /// Add anti travel music rulesets to this planet. + /// + public VolumeInfo[] antiTravelMusicRulesets; + /// + /// Add player impact rulesets to this planet. + /// + public PlayerImpactRulesetInfo[] playerImpactRulesets; + /// + /// Add probe rulesets to this planet. + /// + public ProbeRulesetInfo[] probeRulesets; + /// + /// Add thrust rulesets to this planet. + /// + public ThrustRulesetInfo[] thrustRulesets; + + [JsonObject] + public class PlayerImpactRulesetInfo : VolumeInfo + { + /// + /// Minimum player impact speed. Player will take the minimum amount of damage if they impact something at this speed. + /// + [DefaultValue(20f)] public float minImpactSpeed = 20f; + + /// + /// Maximum player impact speed. Players will die if they impact something at this speed. + /// + [DefaultValue(40f)] public float maxImpactSpeed = 40f; + } + + [JsonObject] + public class ProbeRulesetInfo : VolumeInfo + { + /// + /// Should this ruleset override the probe's speed? + /// + public bool overrideProbeSpeed; + + /// + /// The speed of the probe while in this ruleset volume. + /// + public float probeSpeed; + + /// + /// Should this ruleset override the range of probe's light? + /// + public bool overrideLanternRange; + + /// + /// The range of probe's light while in this ruleset volume. + /// + public float lanternRange; + + /// + /// Stop the probe from attaching to anything while in this ruleset volume. + /// + public bool ignoreAnchor; + } + + [JsonObject] + public class ThrustRulesetInfo : VolumeInfo + { + /// + /// Limit how fast you can fly with your jetpack while in this ruleset volume. + /// + [DefaultValue(float.PositiveInfinity)] public float thrustLimit = float.PositiveInfinity; + + /// + /// Nerf the jetpack booster. + /// + public bool nerfJetpackBooster; + + /// + /// How long the jetpack booster will be nerfed. + /// + [DefaultValue(0.5f)] public float nerfDuration = 0.5f; + } + } } [JsonConverter(typeof(StringEnumConverter))]