An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
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

// 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 : ""); ;
}
}
}