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); }
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); }
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); }
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)); }
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); }