Option to make MonsterEvents spawn more monsters when previous ones are killed (to prevent predators from clearing the ocean of weaker creatures)

This commit is contained in:
Joonas Rikkonen
2017-06-11 20:42:24 +03:00
parent 024094cfba
commit 0af83e6caf
2 changed files with 42 additions and 11 deletions

View File

@@ -2,9 +2,10 @@
<Randomevents>
<MonsterEvent name="Under attack" description=""
characterfile="Content/Characters/Crawler/crawler.xml"
commonness="10"
commonness="15"
difficulty="10"
minamount="2" maxamount="3"
repeat="true"
spawntype="mainpath,cave,ruin"
musictype="monster"/>
@@ -20,13 +21,14 @@
characterfile="Content/Characters/Moloch/moloch.xml"
commonness="10"
difficulty="30"
spawntype="mainpath"
spawntype="mainpath"
musictype="monster"/>
<MonsterEvent name="Under attack" description=""
characterfile="Content/Characters/Mantis/mantis.xml"
commonness="10"
difficulty="15"
repeat="true"
minamount="1" maxamount="2"
spawntype="mainpath,cave,ruin"
musictype="monster"/>
@@ -70,7 +72,7 @@
commonness="5"
difficulty="10"
minamount="2" maxamount="3"
repeat="true"
spawntype="mainpath,cave,ruin"
musictype="monster"/>

View File

@@ -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<string> 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();
}
}
}