diff --git a/PckStudio.Core/DLC/DLCMashUpPackage.cs b/PckStudio.Core/DLC/DLCMashUpPackage.cs index 0514e11d..fcac0bd2 100644 --- a/PckStudio.Core/DLC/DLCMashUpPackage.cs +++ b/PckStudio.Core/DLC/DLCMashUpPackage.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using OMI.Formats.GameRule; +using PckStudio.Core.GameRule; using PckStudio.Core.Interfaces; namespace PckStudio.Core.DLC @@ -42,14 +43,7 @@ namespace PckStudio.Core.DLC new GameRuleFile.BoolParameter("flatworld", false), new GameRuleFile.IntParameter("texturePackId", Identifier) ); - _gameRule.AddRule("LevelRules") - .AddRule("UpdatePlayer", - new GameRuleFile.FloatParameter("yRot", 0f), - new GameRuleFile.FloatParameter("xRot", 0f), - new GameRuleFile.IntParameter("spawnX", 0), - new GameRuleFile.IntParameter("spawnY", 0), - new GameRuleFile.IntParameter("spawnZ", 0) - ); + _gameRule.AddRule(LevelRules.Default); } public IDLCPackage GetSkinPackage() => _skinPackage; diff --git a/PckStudio.Core/GameRule/AbstractGameRule.cs b/PckStudio.Core/GameRule/AbstractGameRule.cs index d36ff6fa..8ceaaeaa 100644 --- a/PckStudio.Core/GameRule/AbstractGameRule.cs +++ b/PckStudio.Core/GameRule/AbstractGameRule.cs @@ -11,6 +11,7 @@ namespace PckStudio.Core.GameRule { private List _gameRules = new List(); protected void AddRule(AbstractGameRule gameRule) => _gameRules.Add(gameRule); + protected void AddRules(IEnumerable gameRules) => _gameRules.AddRange(gameRules); protected abstract GameRuleFile.GameRule GetGameRule(); public static implicit operator GameRuleFile.GameRule(AbstractGameRule abstractGameRule) diff --git a/PckStudio.Core/GameRule/LevelRules.cs b/PckStudio.Core/GameRule/LevelRules.cs new file mode 100644 index 00000000..1c8353f0 --- /dev/null +++ b/PckStudio.Core/GameRule/LevelRules.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using System.Text; +using System.Threading.Tasks; +using OMI.Formats.GameRule; + +namespace PckStudio.Core.GameRule +{ + internal sealed class LevelRules : AbstractGameRule + { + private readonly GameRuleFile.GameRuleParameter[] _parameters; + + public static LevelRules Default { get; } = new LevelRules([new UpdatePlayer(Vector3.Zero, Vector2.Zero)]); + public static LevelRules GetLevelRules(MiniGameId miniGame) => new LevelRules(Enumerable.Empty(), new GameRuleFile.IntParameter("ruleType", (int)miniGame)); + + public LevelRules(IEnumerable gameRules, params GameRuleFile.GameRuleParameter[] parameters) + { + AddRules(gameRules); + _parameters = parameters; + } + + protected override GameRuleFile.GameRule GetGameRule() + { + var gameRule = new GameRuleFile.GameRule("LevelRules"); + gameRule.AddParameters(_parameters); + return gameRule; + } + } +} diff --git a/PckStudio.Core/MapData.cs b/PckStudio.Core/MapData.cs index 615eb7a1..d51c04f6 100644 --- a/PckStudio.Core/MapData.cs +++ b/PckStudio.Core/MapData.cs @@ -40,7 +40,7 @@ namespace PckStudio.Core new GameRuleFile.IntParameter("mapSize", (int)mapSize), new GameRuleFile.IntParameter("themeId", 0) ); - LevelRules = Grf.AddRule("LevelRules", [new GameRuleFile.IntParameter("ruleType", (int)miniGame)]); + LevelRules = Grf.AddRule(GameRule.LevelRules.GetLevelRules(miniGame)); World = world; } diff --git a/PckStudio.Core/PckStudio.Core.csproj b/PckStudio.Core/PckStudio.Core.csproj index 212494d4..f48ed240 100644 --- a/PckStudio.Core/PckStudio.Core.csproj +++ b/PckStudio.Core/PckStudio.Core.csproj @@ -102,6 +102,7 @@ + diff --git a/Vendor/OMI-Lib b/Vendor/OMI-Lib index cc67b280..87fcc157 160000 --- a/Vendor/OMI-Lib +++ b/Vendor/OMI-Lib @@ -1 +1 @@ -Subproject commit cc67b280e8719ad40e101a07d8cca555ebd2213b +Subproject commit 87fcc15776c0829a06430f82eac9b343d7989b10