示例#1
0
    public void ExecuteFibre(string FunctionName, CFibreReg[] Args = null)
    {
        CFibreReg funcDef;

        if (!_script.mFunctionDefs.TryGetValue(FunctionName, out funcDef))
        {
            throw new CFibreRuntimeException("Tried to execute undefined fibre function: " + FunctionName);
        }

        int argCount = 0;

        if (Args != null)
        {
            argCount = Args.Length;
        }

        CFibre fibre = new CFibre(_script, funcDef, argCount, _dataStore, _globalStore, new CFibreRegStore(), _interopFuncs);

        for (int i = 0; i < argCount; ++i)
        {
            fibre.SetLocalRegister(i, Args[i]);
        }

        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();
        CFibre.ERunResult result = fibre.Run();
        sw.Stop();
        //Debug.LogWarning("FibreVM: (" + FunctionName + ") " + sw.Elapsed.TotalMilliseconds + "ms");
        //Debug.Log("Ret: " + fibre.GetLocalRegister(0).PrintVal());

        //if (result == CFibre.ERunResult.CONTINUE)
        //_fibres.Add(fibre);
    }
示例#2
0
    public void ContinueFibre(CFibre Fibre, CFibreReg[] Args = null)
    {
        // Push args from wait result.
        // Can't just push arg to store since frame pointer is at caller local and not callee local.
        // Could stall frame pointer restore until here.

        CFibre.ERunResult result = Fibre.Run();
    }
    public CFibreReg SetInternCap(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 1)
        {
            _world.mInternCap = (int)Fibre.mLocal.mStore[Fibre.mFramePtr].mNumber;
        }

        return(null);
    }
示例#4
0
    public CFibreReg Log(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 1)
        {
            Debug.LogWarning("Fibre Log: " + Fibre.GetLocalRegister(0).PrintVal());
        }

        return(null);
    }
    public CFibreReg MusicPlay(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 2)
        {
            int playerId = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
            int trackId  = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 1].mNumber;
            _world.mPlayers[playerId].mMusicTrack = trackId;
        }

        return(null);
    }
    public CFibreReg CinematicStart(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 1)
        {
            int playerId = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
            _world.mPlayers[playerId].mCanInteractWithWorld = false;
            _world.mPlayers[playerId].mCanControlCamera     = false;
            _world.mPlayers[playerId].mShowUI = false;
        }

        return(null);
    }
    public CFibreReg TriggerEntityGone(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 2)
        {
            CTrigger trigger = new CTrigger();
            trigger.mType             = ETriggerType.ENTITY_GONE;
            trigger.mInfo             = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
            trigger.mCallbackFuncName = Fibre.mLocal.mStore[Fibre.mFramePtr + 1].mString;
            _triggers.Add(trigger);
        }

        return(null);
    }
    public CFibreReg PlayerSetRep(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 3)
        {
            int playerId  = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
            int companyId = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 1].mNumber;
            int rep       = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 2].mNumber;

            _world.mClientCompanies[companyId].SetPlayerReputation(playerId, rep);
        }

        return(null);
    }
示例#9
0
    public void ExecuteGlobalFibre()
    {
        _globalStore = new CFibreRegStore();
        CFibre globalFibre = new CFibre(_script, null, 0, _dataStore, _globalStore, _globalStore, _interopFuncs);

        // TODO: Merge with code below
        Debug.LogWarning("Executing global fibre");
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();
        CFibre.ERunResult result = globalFibre.Run();
        sw.Stop();
        Debug.LogWarning("Global fibre completed in " + sw.Elapsed.TotalMilliseconds + "ms");
    }
    public CFibreReg TriggerUnitDead(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 2)
        {
            CTrigger trigger = new CTrigger();
            trigger.mType             = ETriggerType.UNIT_DEAD;
            trigger.mInfo             = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
            trigger.mCallbackFuncName = Fibre.mLocal.mStore[Fibre.mFramePtr + 1].mString;
            _triggers.Add(trigger);
        }

        return(null);
    }
    public CFibreReg NotifyNewItem(CFibre Fibre, int ArgCount)
    {
        if (ArgCount != 2)
        {
            return(null);
        }

        int    playerId = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
        string itemName = Fibre.mLocal.mStore[Fibre.mFramePtr + 1].mString;

        _world.AddTransientEvent(1 << playerId).SetNotify(itemName);

        return(null);
    }
    public CFibreReg AIEnable(CFibre Fibre, int ArgCount)
    {
        if (ArgCount != 2)
        {
            return(null);
        }

        int  playerId = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
        bool enabled  = Fibre.mLocal.mStore[Fibre.mFramePtr + 1].mBool;

        _world.mPlayers[playerId].SetAI(enabled);

        return(null);
    }
    public CFibreReg UnitSetStamina(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 2)
        {
            int   unitId = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
            CUnit unit   = _world.GetEntity <CUnit>(unitId);

            if (unit != null)
            {
                unit.mStamina = (float)Fibre.mLocal.mStore[Fibre.mFramePtr + 1].mNumber;
            }
        }

        return(null);
    }
    public CFibreReg SetWinMoney(CFibre Fibre, int ArgCount)
    {
        if (ArgCount < 1)
        {
            return(null);
        }
        bool match = true;
        int  value = Fibre.GetInt(0, ref match);

        if (match)
        {
            _world.mWinMoney = value;
        }
        return(null);
    }
    public CFibreReg SetFailSeconds(CFibre Fibre, int ArgCount)
    {
        if (ArgCount < 1)
        {
            return(null);
        }
        bool match = true;
        int  value = Fibre.GetInt(0, ref match);

        if (match)
        {
            _world.mFailSeconds = value;
        }
        return(null);
    }
    public CFibreReg SoundPlay(CFibre Fibre, int ArgCount)
    {
        if (ArgCount != 2)
        {
            return(null);
        }

        int playerId = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
        int soundId  = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 1].mNumber;

        //_world.AddTransientEvent(1 << playerId).SetSound(_world.mPlayers[playerId].mCamPosition, soundId);
        _world.AddTransientEvent(1 << playerId).SetUISound(_world.mPlayers[playerId].mCamPosition, soundId);

        return(null);
    }
    public CFibreReg SetPopulationCap(CFibre Fibre, int ArgCount)
    {
        if (ArgCount < 1)
        {
            return(null);
        }
        bool match = true;
        int  value = Fibre.GetInt(0, ref match);

        if (match)
        {
            _world.mPopCap = value;
        }
        return(null);
    }
    public CFibreReg ItemSetLocked(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 2)
        {
            int   itemId = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
            bool  locked = Fibre.mLocal.mStore[Fibre.mFramePtr + 1].mBool;
            CItem item   = _world.GetEntity <CItem>(itemId);

            if (item != null && item.mType == CEntity.EType.ITEM_DOOR)
            {
                ((CItemDoor)item).mLocked = locked;
            }
        }

        return(null);
    }
    public CFibreReg UnitGetAlive(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 1)
        {
            int   unitId = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
            CUnit unit   = _world.GetEntity <CUnit>(unitId);

            if (unit == null || unit.mDead)
            {
                return(new CFibreReg(false));
            }

            return(new CFibreReg(true));
        }

        return(null);
    }
    public CFibreReg WaitTime(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 1)
        {
            CTrigger trigger = new CTrigger();
            trigger.mType          = ETriggerType.TICK;
            trigger.mInfo          = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber + _world.mGameTick;
            trigger.mCallbackFibre = Fibre;
            _triggers.Add(trigger);

            // TODO: Fix this cheap way to indicate that we need to suspend thread.
            CFibreReg reg = new CFibreReg();
            reg.mType = EFibreType.COUNT;
            return(reg);
        }

        return(null);
    }
    public CFibreReg SpawnUnit(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 6)
        {
            int   ownerId = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
            float posX    = (float)Fibre.mLocal.mStore[Fibre.mFramePtr + 1].mNumber;
            float posY    = (float)Fibre.mLocal.mStore[Fibre.mFramePtr + 2].mNumber;
            int   rot     = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 3].mNumber;
            int   tier    = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 4].mNumber;
            int   level   = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 5].mNumber;

            CResume resume = new CResume();
            resume.Generate(_world, tier, level);
            CUnit entity = _world.SpawnUnit(ownerId, resume, new Vector2(posX, posY), rot);

            return(new CFibreReg(entity.mID));
        }

        throw new CFibreRuntimeException("unit_spawn does not take " + ArgCount + " parameters.", Fibre);
    }
    public CFibreReg SpawnItem(CFibre Fibre, int ArgCount)
    {
        if (ArgCount < 5)
        {
            return(null);
        }
        bool   match    = true;
        int    ownerId  = Fibre.GetInt(0, ref match);
        string itemName = Fibre.GetString(1, ref match);
        int    posX     = Fibre.GetInt(2, ref match);
        int    posY     = Fibre.GetInt(3, ref match);
        int    rot      = Fibre.GetInt(4, ref match);

        if (match)
        {
            CItem item = _world.SpawnItem(CGame.AssetManager.GetAsset <CItemAsset>(itemName), new Vector2(posX, posY), rot, ownerId);
            return(new CFibreReg(item.mID));
        }

        return(new CFibreReg(0));
    }
    public CFibreReg SetUnitSpeech(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 2)
        {
            bool   match  = true;
            int    unitId = Fibre.GetInt(0, ref match);
            string text   = Fibre.GetString(1, ref match);

            if (match)
            {
                CUnit unit = _world.GetEntity <CUnit>(unitId);

                if (unit != null)
                {
                    unit.SetSpeech(text);
                }
            }
        }

        return(null);
    }
    public CFibreReg CameraSetPosition(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 6)
        {
            int   playerId = (int)Fibre.mLocal.mStore[Fibre.mFramePtr + 0].mNumber;
            float x        = (float)Fibre.mLocal.mStore[Fibre.mFramePtr + 1].mNumber;
            float y        = (float)Fibre.mLocal.mStore[Fibre.mFramePtr + 2].mNumber;
            float z        = (float)Fibre.mLocal.mStore[Fibre.mFramePtr + 3].mNumber;
            float zoom     = (float)Fibre.mLocal.mStore[Fibre.mFramePtr + 4].mNumber;
            float speed    = (float)Fibre.mLocal.mStore[Fibre.mFramePtr + 5].mNumber;

            _world.mPlayers[playerId].mCamPosition = new Vector4(x, y, z, zoom);
            _world.mPlayers[playerId].mCamSpeed    = speed;

            if (speed == 0)
            {
                ++_world.mPlayers[playerId].mCamTrackCount;
            }
        }

        return(null);
    }
    public CFibreReg SetPlayerMoney(CFibre Fibre, int ArgCount)
    {
        if (ArgCount > 1)
        {
            bool match    = true;
            int  playerId = Fibre.GetInt(0, ref match);

            if (ArgCount == 1)
            {
                return(new CFibreReg(_world.mPlayers[playerId].mMoney));
            }
            else
            {
                int value = Fibre.GetInt(1, ref match);

                if (match)
                {
                    _world.mPlayers[playerId].mMoney = value;
                }
            }
        }

        return(null);
    }
    public CFibreReg SetItemAvailable(CFibre Fibre, int ArgCount)
    {
        if (ArgCount == 3)
        {
            bool   match     = true;
            int    playerId  = Fibre.GetInt(0, ref match);
            string itemName  = Fibre.GetString(1, ref match);
            bool   available = Fibre.GetBool(2, ref match);

            if (match)
            {
                if (available)
                {
                    _world.mPlayers[playerId].mAvailableItems.Add(itemName);
                }
                else
                {
                    _world.mPlayers[playerId].mAvailableItems.Remove(itemName);
                }
            }
        }

        return(null);
    }
 public CFibreReg GetVersion(CFibre Fibre, int ArgCount)
 {
     return(new CFibreReg(CGame.VERSION_MAJOR + "." + CGame.VERSION_MINOR));
 }
示例#28
0
 public CFibreRuntimeException(string Message, CFibre Fibre) : base(Message)
 {
     mFibreInfo = "(" + Fibre.mScript.GetFileLocationFromOpcode(Fibre.mInstructionPtr - 1) + ")";
 }
 public CFibreReg ContractSpawn(CFibre Fibre, int ArgCount)
 {
     _world.AddContractTurn(1, 1);
     return(null);
 }
 public CFibreReg ResumeSpawn(CFibre Fibre, int ArgCount)
 {
     _world.AddResumeturn(0);
     return(null);
 }