From 0af83e6caf5b08aca5d576076e5674b08ac110cd Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sun, 11 Jun 2017 20:42:24 +0300 Subject: [PATCH] Option to make MonsterEvents spawn more monsters when previous ones are killed (to prevent predators from clearing the ocean of weaker creatures) --- Subsurface/Content/randomevents.xml | 8 +++-- Subsurface/Source/Events/MonsterEvent.cs | 45 +++++++++++++++++++----- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/Subsurface/Content/randomevents.xml b/Subsurface/Content/randomevents.xml index 249d2835f..6bb1c18b7 100644 --- a/Subsurface/Content/randomevents.xml +++ b/Subsurface/Content/randomevents.xml @@ -2,9 +2,10 @@ @@ -20,13 +21,14 @@ characterfile="Content/Characters/Moloch/moloch.xml" commonness="10" difficulty="30" - spawntype="mainpath" + spawntype="mainpath" musictype="monster"/> @@ -70,7 +72,7 @@ commonness="5" difficulty="10" minamount="2" maxamount="3" - + repeat="true" spawntype="mainpath,cave,ruin" musictype="monster"/> diff --git a/Subsurface/Source/Events/MonsterEvent.cs b/Subsurface/Source/Events/MonsterEvent.cs index bdc894828..9bc7a5cdd 100644 --- a/Subsurface/Source/Events/MonsterEvent.cs +++ b/Subsurface/Source/Events/MonsterEvent.cs @@ -17,6 +17,8 @@ namespace Barotrauma private bool spawnDeep; private bool disallowed; + + private bool repeat; private Level.PositionType spawnPosType; @@ -39,7 +41,9 @@ namespace Barotrauma { characterFile = ToolBox.GetAttributeString(element, "characterfile", ""); - minAmount = ToolBox.GetAttributeInt(element, "minamount", 1); + int defaultAmount = ToolBox.GetAttributeInt(element, "amount", 1); + + minAmount = ToolBox.GetAttributeInt(element, "minamount", defaultAmount); maxAmount = Math.Max(ToolBox.GetAttributeInt(element, "maxamount", 1), minAmount); var spawnPosTypeStr = ToolBox.GetAttributeString(element, "spawntype", ""); @@ -52,6 +56,8 @@ namespace Barotrauma spawnDeep = ToolBox.GetAttributeBool(element, "spawndeep", false); + repeat = ToolBox.GetAttributeBool(element, "repeat", repeat); + if (GameMain.NetworkMember != null) { List monsterNames = GameMain.NetworkMember.monsterEnabled.Keys.ToList(); @@ -67,18 +73,17 @@ namespace Barotrauma { base.Init(); - SpawnMonsters(); + SpawnMonsters(Rand.Range(minAmount, maxAmount, false)); } - private void SpawnMonsters() + private Character[] SpawnMonsters(int amount) { - if (disallowed) return; + if (disallowed) return null; Vector2 spawnPos = Level.Loaded.GetRandomInterestingPosition(true, spawnPosType, true); - int amount = Rand.Range(minAmount, maxAmount, false); - monsters = new Character[amount]; + var monsters = new Character[amount]; if (spawnDeep) spawnPos.Y -= Level.Loaded.Size.Y; @@ -88,6 +93,8 @@ namespace Barotrauma spawnPos.Y += Rand.Range(-0.5f, 0.5f, false); monsters[i] = Character.Create(characterFile, spawnPos, null, GameMain.Client != null); } + + return monsters; } public override void Update(float deltaTime) @@ -97,7 +104,29 @@ namespace Barotrauma Finished(); return; } - if (monsters == null) SpawnMonsters(); + + if (monsters == null) + { + monsters = SpawnMonsters(Rand.Range(minAmount, maxAmount, false)); + return; + } + + if (repeat) + { + //clients aren't allowed to spawn more monsters mid-round + if (GameMain.Client != null) + { + return; + } + + for (int i = 0; i < monsters.Length; i++) + { + if (monsters[i] == null || monsters[i].Removed || monsters[i].IsDead) + { + monsters[i] = SpawnMonsters(1)[0]; + } + } + } if (isFinished) return; @@ -128,7 +157,7 @@ namespace Barotrauma } } - if (monstersDead) Finished(); + if (monstersDead && !repeat) Finished(); } } }