public static TES5EventCodeBlock CreateOnInit() { TES5FunctionScope onInitFunctionScope = TES5FunctionScopeFactory.CreateFromBlockType("OnInit"); TES5EventCodeBlock newInitBlock = new TES5EventCodeBlock(onInitFunctionScope, TES5CodeScopeFactory.CreateCodeScopeRoot(onInitFunctionScope)); return(newInitBlock); }
public TES5BlockList CreateBlock(TES4CodeBlock block, TES5GlobalScope globalScope, TES5MultipleScriptsScope multipleScriptsScope, ref TES5EventCodeBlock?onUpdateBlockForNonQuestOrAME) { TES5BlockList blockList = new TES5BlockList(); string blockType = block.BlockType; string newBlockType = MapBlockType(blockType); TES4CodeChunks?chunks = block.Chunks; if (chunks != null && chunks.Any()) { TES5FunctionScope blockFunctionScope = TES5FunctionScopeFactory.CreateFromBlockType(newBlockType); bool onUpdateOfNonQuestOrAME = newBlockType == "OnUpdate" && globalScope.ScriptHeader.ScriptType.NativeType != TES5BasicType.T_QUEST && globalScope.ScriptHeader.ScriptType.NativeType != TES5BasicType.T_ACTIVEMAGICEFFECT; bool onUpdateBlockOfNonQuestOrAMEAlreadyPresent = onUpdateBlockForNonQuestOrAME != null; TES5BlockList? onUpdateAdditionalBlocksOfNonQuestOrAME = null; TES5EventCodeBlock targetEventBlock; TES5CodeScope targetCodeScope; if (onUpdateOfNonQuestOrAME) { if (!onUpdateBlockOfNonQuestOrAMEAlreadyPresent) { CreateActivationStates(globalScope, out onUpdateAdditionalBlocksOfNonQuestOrAME, out targetEventBlock); onUpdateBlockForNonQuestOrAME = targetEventBlock; } else { if (onUpdateBlockForNonQuestOrAME == null) { throw new NullableException(nameof(onUpdateBlockForNonQuestOrAME)); } targetEventBlock = onUpdateBlockForNonQuestOrAME; } targetCodeScope = targetEventBlock.CodeScope; } else { targetEventBlock = CreateEventCodeBlock(blockFunctionScope, globalScope); targetCodeScope = this.initialBlockCodeFactory.AddInitialCode(globalScope, targetEventBlock); } TES5CodeScope newScope = TES5CodeScopeFactory.CreateCodeScopeRecursive(targetCodeScope.LocalScope); TES5CodeScope convertedCodeScope = this.ConvertTES4CodeChunksToTES5CodeScope(chunks, newScope, globalScope, multipleScriptsScope); TES5CodeScope modifiedCodeScope = this.changesPass.Modify(block, blockList, blockFunctionScope, convertedCodeScope, globalScope, multipleScriptsScope); targetEventBlock.CodeScope.LocalScope.CopyVariablesFrom(modifiedCodeScope.LocalScope); targetEventBlock.CodeScope.AddChunks(modifiedCodeScope.CodeChunks); blockList.Add(targetEventBlock); if (onUpdateOfNonQuestOrAME) { if (!onUpdateBlockOfNonQuestOrAMEAlreadyPresent) { if (onUpdateAdditionalBlocksOfNonQuestOrAME == null) { throw new NullableException(nameof(onUpdateAdditionalBlocksOfNonQuestOrAME)); } return(onUpdateAdditionalBlocksOfNonQuestOrAME); } return(new TES5BlockList()); } } return(blockList); }
public TES5BlockList CreateBlock(TES4CodeBlock block, TES5GlobalScope globalScope, TES5MultipleScriptsScope multipleScriptsScope) { TES5BlockList blockList = new TES5BlockList(); string blockType = block.BlockType; if (blockType.Equals("menumode", StringComparison.OrdinalIgnoreCase)) { return(blockList); } string newBlockType = MapBlockType(blockType); TES4CodeChunks chunks = block.Chunks; if (chunks != null && chunks.Any()) { TES5EventCodeBlock newBlock; bool onUpdateOfNonQuest = newBlockType == "OnUpdate" && globalScope.ScriptHeader.BasicScriptType != TES5BasicType.T_QUEST; TES5BlockList onUpdateOfNonQuestAdditionalBlocks = null; if (onUpdateOfNonQuest) { CreateActivationStates(globalScope, multipleScriptsScope, out onUpdateOfNonQuestAdditionalBlocks, out newBlock); } else { TES5FunctionScope blockFunctionScope = TES5FunctionScopeFactory.CreateFromBlockType(newBlockType); newBlock = CreateEventCodeBlock(newBlockType, blockFunctionScope); } this.ConvertTES4CodeChunksToTES5EventCodeBlock(chunks, newBlock, globalScope, multipleScriptsScope); this.changesPass.Modify(block, blockList, newBlock, globalScope, multipleScriptsScope); blockList.Add(newBlock); if (onUpdateOfNonQuest) { return(onUpdateOfNonQuestAdditionalBlocks); } } return(blockList); }