public TPRP GetLabels(ushort chunkID) { if (chunkID >= 8192) { // Semi-Global if (SemiGlobal != null) { return(SemiGlobal.Get <TPRP>(chunkID)); } return(null); } else if (chunkID >= 4096) { // Private sub-routine call if (Object != null) { return(Object.Resource.Get <TPRP>(chunkID)); } return(null); } else { // Global sub-routine call if (Globals != null) { return(Globals.Resource.Get <TPRP>(chunkID)); } return(null); } }
public BHAV GetBHAV(ushort id) { if (id >= 8192) { return(SemiGlobal?.Get <BHAV>(id)); //semiglobal } else if (id >= 4096) { return(Object.Resource.Get <BHAV>(id)); //private } else { return(Globals.Resource.Get <BHAV>(id)); //global } }
public bool ExecuteEntryPoint(int entry,VMContext context,bool runImmediately,VMEntity stackOBJ,short[] args) { if (entry == 11) { //user placement, hack to do auto floor removal/placement for stairs if (Object.OBJ.LevelOffset > 0 && Position != LotTilePos.OUT_OF_WORLD) { var floor = context.Architecture.GetFloor(Position.TileX,Position.TileY,Position.Level); var placeFlags = (VMPlacementFlags)ObjectData[(int)VMStackObjectVariable.PlacementFlags]; if ((placeFlags & VMPlacementFlags.InAir) > 0) { context.Architecture.SetFloor(Position.TileX,Position.TileY,Position.Level,new FloorTile(),true); } if ((placeFlags & VMPlacementFlags.OnFloor) > 0 && (floor.Pattern == 0)) { context.Architecture.SetFloor(Position.TileX,Position.TileY,Position.Level,new FloorTile { Pattern = 1 },true); } } } bool result = false; if (EntryPoints[entry].ActionFunction > 255) { VMSandboxRestoreState SandboxState = null; if (GhostImage && runImmediately) { SandboxState = context.VM.Sandbox(); for (int i = 0; i < MultitileGroup.Objects.Count; i++) { var obj = MultitileGroup.Objects[i]; context.VM.AddEntity(obj); } } BHAV bhav; GameObject CodeOwner; ushort ActionID = EntryPoints[entry].ActionFunction; if (ActionID < 4096) { //global bhav = context.Globals.Resource.Get <BHAV>(ActionID); } else if (ActionID < 8192) { //local bhav = Object.Resource.Get <BHAV>(ActionID); } else { //semi-global bhav = SemiGlobal.Get <BHAV>(ActionID); } CodeOwner = Object; if (bhav != null) { var routine = context.VM.Assemble(bhav); var action = new VMQueuedAction { Callee = this, CodeOwner = CodeOwner, /** Main function **/ StackObject = stackOBJ, Routine = routine, Args = args }; if (runImmediately) { var checkResult = VMThread.EvaluateCheck(context,this,action); result = (checkResult == VMPrimitiveExitCode.RETURN_TRUE); } else { this.Thread.EnqueueAction(action); } } if (GhostImage && runImmediately) { //restore state context.VM.SandboxRestore(SandboxState); } return(result); } else { return(false); } }
/// <summary> /// Constructs a new VMEntity instance. /// </summary> /// <param name="obj">A GameObject instance.</param> public VMEntity(GameObject obj) { this.Object = obj; /** * For some reason, in the aquarium object (maybe others) the numAttributes is set to 0 * but it should be 4. There are 4 entries in the label table. Go figure? */ ObjectData = new short[80]; MeToObject = new Dictionary <ushort,List <short> >(); SoundThreads = new List <VMSoundEntry>(); RTTI = new VMEntityRTTI(); var numAttributes = obj.OBJ.NumAttributes; if (obj.OBJ.UsesFnTable == 0) { EntryPoints = GenerateFunctionTable(obj.OBJ); } else { var OBJfChunk = obj.Resource.Get <OBJf>(obj.OBJ.ChunkID); //objf has same id as objd if (OBJfChunk != null) { EntryPoints = OBJfChunk.functions; } } if (obj.GUID == 0xa9bb3a76) { EntryPoints[17] = new OBJfFunctionEntry(); } var test = obj.Resource.List <OBJf>(); SemiGlobal = obj.Resource.SemiGlobal; Slots = obj.Resource.Get <SLOT>(obj.OBJ.SlotID); //containment slots are dealt with in the avatar and object classes respectively. var attributeTable = obj.Resource.Get <STR>(256); if (attributeTable != null) { numAttributes = (ushort)Math.Max(numAttributes,attributeTable.Length); RTTI.AttributeLabels = new string[numAttributes]; for (var i = 0; i < numAttributes; i++) { RTTI.AttributeLabels[i] = attributeTable.GetString(i); } } TreeTable = obj.Resource.Get <TTAB>(obj.OBJ.TreeTableID); if (TreeTable != null) { TreeTableStrings = obj.Resource.Get <TTAs>(obj.OBJ.TreeTableID); } if (TreeTable == null && SemiGlobal != null) { TreeTable = SemiGlobal.Get <TTAB>(obj.OBJ.TreeTableID); //tree not in local, try semiglobal TreeTableStrings = SemiGlobal.Get <TTAs>(obj.OBJ.TreeTableID); } //no you cannot get global tree tables don't even ask this.Attributes = new List <short>(numAttributes); SetFlag(VMEntityFlags.ChairFacing,true); }
public short GetTuningVariable(ushort data) { var tableID = (ushort)(data >> 7); var keyID = (ushort)(data & 0x7F); int mode = 0; if (tableID < 64) { mode = 0; } else if (tableID < 128) { tableID = (ushort)((tableID - 64)); mode = 1; } else if (tableID < 192) { tableID = (ushort)((tableID - 128)); mode = 2; } BCON bcon; OTFTable tuning; /** This could be in a BCON or an OTF **/ switch (mode) { case 0: //local bcon = Object.Resource.Get <BCON>((ushort)(tableID + 4096)); if (bcon != null) { return((short)bcon.Constants[keyID]); } tuning = Object.Resource.Get <OTFTable>((ushort)(tableID + 4096)); if (tuning != null) { return((short)tuning.GetKey(keyID).Value); } break; case 1: //semi globals ushort testTab = (ushort)(tableID + 8192); bcon = Object.Resource.Get <BCON>(testTab); if (bcon != null && keyID < bcon.Constants.Length) { return((short)bcon.Constants[keyID]); } tuning = Object.Resource.Get <OTFTable>(testTab); if (tuning != null) { return((short)tuning.GetKey(keyID).Value); } if (SemiGlobal != null) { bcon = SemiGlobal.Get <BCON>(testTab); if (bcon != null && keyID < bcon.Constants.Length) { return((short)bcon.Constants[keyID]); } tuning = SemiGlobal.Get <OTFTable>(testTab); if (tuning != null) { return((short)tuning.GetKey(keyID).Value); } } break; case 2: //global bcon = Globals.Resource.Get <BCON>((ushort)(tableID + 256)); if (bcon != null && keyID < bcon.Constants.Length) { return((short)bcon.Constants[keyID]); } tuning = Globals.Resource.Get <OTFTable>((ushort)(tableID + 256)); if (tuning != null) { return((short)tuning.GetKey(keyID).Value); } break; } return(0); }
/// <summary> /// Constructs a new VMEntity instance. /// </summary> /// <param name="obj">A GameObject instance.</param> public VMEntity(GameObject obj) { this.Object = obj; /** * For some reason, in the aquarium object (maybe others) the numAttributes is set to 0 * but it should be 4. There are 4 entries in the label table. Go figure? */ ObjectData = new short[80]; MeToObject = new Dictionary<ushort, List<short>>(); SoundThreads = new List<VMSoundEntry>(); RTTI = new VMEntityRTTI(); var numAttributes = obj.OBJ.NumAttributes; if (obj.OBJ.UsesFnTable == 0) EntryPoints = GenerateFunctionTable(obj.OBJ); else { var OBJfChunk = obj.Resource.Get<OBJf>(obj.OBJ.ChunkID); //objf has same id as objd if (OBJfChunk != null) EntryPoints = OBJfChunk.functions; } if (obj.GUID == 0xa9bb3a76) EntryPoints[17] = new OBJfFunctionEntry(); var test = obj.Resource.List<OBJf>(); SemiGlobal = obj.Resource.SemiGlobal; Slots = obj.Resource.Get<SLOT>(obj.OBJ.SlotID); //containment slots are dealt with in the avatar and object classes respectively. var attributeTable = obj.Resource.Get<STR>(256); if (attributeTable != null) { numAttributes = (ushort)Math.Max(numAttributes, attributeTable.Length); RTTI.AttributeLabels = new string[numAttributes]; for (var i = 0; i < numAttributes; i++) { RTTI.AttributeLabels[i] = attributeTable.GetString(i); } } TreeTable = obj.Resource.Get<TTAB>(obj.OBJ.TreeTableID); if (TreeTable != null) TreeTableStrings = obj.Resource.Get<TTAs>(obj.OBJ.TreeTableID); if (TreeTable == null && SemiGlobal != null) { TreeTable = SemiGlobal.Get<TTAB>(obj.OBJ.TreeTableID); //tree not in local, try semiglobal TreeTableStrings = SemiGlobal.Get<TTAs>(obj.OBJ.TreeTableID); } //no you cannot get global tree tables don't even ask this.Attributes = new List<short>(numAttributes); SetFlag(VMEntityFlags.ChairFacing, true); }