You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.6 KiB
80 lines
2.6 KiB
5 years ago
|
// This code is part of the Fungus library (https://github.com/snozbot/fungus)
|
||
|
// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE)
|
||
|
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Fungus
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Use the collection as a source of random items and turn it into a random bag. Drawing the
|
||
|
/// next random item until out of items and then reshuffling them.
|
||
|
/// </summary>
|
||
|
[CommandInfo("Collection",
|
||
|
"RandomBag",
|
||
|
"Use the collection as a source of random items and turn it into a random bag. " +
|
||
|
"Drawing the next random item until out of items and then reshuffling them.")]
|
||
|
[AddComponentMenu("")]
|
||
|
public class CollectionRandomBag : CollectionBaseVarCommand
|
||
|
{
|
||
|
[SerializeField]
|
||
|
[Tooltip("Will add this many copies to the bag. If you want 5 of everything, you want 4 copies.")]
|
||
|
protected IntegerData duplicatesToPutInBag = new IntegerData(0);
|
||
|
|
||
|
[SerializeField]
|
||
|
protected IntegerData currentIndex = new IntegerData(int.MaxValue);
|
||
|
|
||
|
protected bool isInit = false;
|
||
|
|
||
|
protected override void OnEnterInner()
|
||
|
{
|
||
|
if (!isInit)
|
||
|
{
|
||
|
Init();
|
||
|
}
|
||
|
|
||
|
currentIndex.Value++;
|
||
|
|
||
|
if (currentIndex.Value >= collection.Value.Count)
|
||
|
{
|
||
|
Reshuffle();
|
||
|
}
|
||
|
|
||
|
collection.Value.Get(currentIndex.Value, ref variableToUse);
|
||
|
}
|
||
|
|
||
|
protected void Init()
|
||
|
{
|
||
|
var startingCount = collection.Value.Count;
|
||
|
for (int i = 0; i < duplicatesToPutInBag.Value; i++)
|
||
|
{
|
||
|
for (int j = 0; j < startingCount; j++)
|
||
|
{
|
||
|
collection.Value.Add(collection.Value.Get(j));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//force invalid index
|
||
|
currentIndex.Value = collection.Value.Count;
|
||
|
|
||
|
isInit = true;
|
||
|
}
|
||
|
|
||
|
protected void Reshuffle()
|
||
|
{
|
||
|
currentIndex.Value = 0;
|
||
|
collection.Value.Shuffle();
|
||
|
}
|
||
|
|
||
|
public override bool HasReference(Variable variable)
|
||
|
{
|
||
|
return base.HasReference(variable) || duplicatesToPutInBag.integerRef == variable || currentIndex.integerRef;
|
||
|
}
|
||
|
|
||
|
public override string GetSummary()
|
||
|
{
|
||
|
return base.GetSummary() +
|
||
|
(duplicatesToPutInBag.integerRef != null ? " " + duplicatesToPutInBag.integerRef.Key : "") +
|
||
|
(currentIndex.integerRef != null ? " " + currentIndex.integerRef.Key : ""); ;
|
||
|
}
|
||
|
}
|
||
|
}
|