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); }
private static TES5ElseSubBranch ConvertElseBranch(TES4ElseSubBranch branch, TES5CodeScope outerCodeScope, TES5GlobalScope globalScope, TES5MultipleScriptsScope multipleScriptsScope, TES5ChainedCodeChunkFactory codeChunkFactory) { TES5CodeScope newCodeScope = TES5CodeScopeFactory.CreateCodeScopeRecursive(outerCodeScope.LocalScope); TES4CodeChunks?branchChunks = branch.CodeChunks; if (branchChunks != null) { foreach (ITES4CodeChunk codeChunk in branchChunks) { TES5CodeChunkCollection codeChunks = codeChunkFactory.CreateCodeChunk(codeChunk, newCodeScope, globalScope, multipleScriptsScope); foreach (ITES5CodeChunk newCodeChunk in codeChunks) { newCodeScope.AddChunk(newCodeChunk); } } } return(new TES5ElseSubBranch(newCodeScope)); }
private static TES5SubBranch ConvertSubBranch(TES4SubBranch branch, TES5CodeScope outerCodeScope, TES5GlobalScope globalScope, TES5MultipleScriptsScope multipleScriptsScope, TES5ChainedCodeChunkFactory codeChunkFactory, TES5ValueFactory valueFactory) { ITES5Value expression = valueFactory.CreateValue(branch.Expression, outerCodeScope, globalScope, multipleScriptsScope); TES5CodeScope newCodeScope = TES5CodeScopeFactory.CreateCodeScopeRecursive(outerCodeScope.LocalScope); TES4CodeChunks branchChunks = branch.CodeChunks; if (branchChunks != null) { foreach (ITES4CodeChunk codeChunk in branchChunks) { TES5CodeChunkCollection codeChunks = codeChunkFactory.createCodeChunk(codeChunk, newCodeScope, globalScope, multipleScriptsScope); if (codeChunks != null) { foreach (ITES5CodeChunk newCodeChunk in codeChunks) { newCodeScope.AddChunk(newCodeChunk); } } } } return(new TES5SubBranch(expression, newCodeScope)); }
public static TES5SubBranch CreateSubBranch(ITES5Expression expression, TES5LocalScope parentScope) { return(new TES5SubBranch(expression, TES5CodeScopeFactory.CreateCodeScopeRecursive(parentScope))); }