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.

76 lines
2.9 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 System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace Fungus.EditorUtils
{
#if UNITY_2019_2_OR_NEWER
public static class GenerateEverythingMenuItem
{
[MenuItem("Tools/Fungus/Utilities/Generate Everything Flowchart")]
public static void GenerateEverythingFlowchart()
{
var newGO = new GameObject("Flowchart w/ EVERYTHING");
var flow = newGO.AddComponent<Flowchart>();
var blockPos = Vector2.zero;
var blockPosStep = new Vector2(0, 60);
//adding a block for all event handlers
foreach (var eventHandlerType in TypeCache.GetTypesWithAttribute<EventHandlerInfoAttribute>())
{
var block = flow.CreateBlock(blockPos);
blockPos += blockPosStep;
block.BlockName = eventHandlerType.Name;
EventHandler newHandler = newGO.AddComponent(eventHandlerType) as EventHandler;
newHandler.ParentBlock = block;
block._EventHandler = newHandler;
}
//reset head
blockPos = new Vector2(200, 0);
//adding a block for each category, fill it with its commands
var blockComCats = new Dictionary<string, Block>();
foreach (var commandType in TypeCache.GetTypesWithAttribute<CommandInfoAttribute>())
{
var commandTypeAttr = commandType.GetCustomAttributes(typeof(CommandInfoAttribute), false)[0] as CommandInfoAttribute;
blockComCats.TryGetValue(commandTypeAttr.Category, out Block targetBlock);
if (targetBlock == null)
{
targetBlock = flow.CreateBlock(blockPos);
blockPos += blockPosStep;
targetBlock.BlockName = commandTypeAttr.Category;
blockComCats[commandTypeAttr.Category] = targetBlock;
}
var newCommand = newGO.AddComponent(commandType) as Command;
newCommand.ParentBlock = targetBlock;
newCommand.ItemId = flow.NextItemId();
// Let command know it has just been added to the block
newCommand.OnCommandAdded(targetBlock);
targetBlock.CommandList.Add(newCommand);
}
//add all variable types
foreach (var varType in TypeCache.GetTypesWithAttribute<VariableInfoAttribute>())
{
Variable newVariable = newGO.AddComponent(varType) as Variable;
newVariable.Key = flow.GetUniqueVariableKey("");
flow.Variables.Add(newVariable);
}
}
}
#endif
}