コード例 #1
0
        public static TES5EventCodeBlock CreateOnInit()
        {
            TES5FunctionScope  onInitFunctionScope = TES5FunctionScopeFactory.CreateFromBlockType("OnInit");
            TES5EventCodeBlock newInitBlock        = new TES5EventCodeBlock(onInitFunctionScope, TES5CodeScopeFactory.CreateCodeScopeRoot(onInitFunctionScope));

            return(newInitBlock);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }