Ejemplo n.º 1
0
 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);
     }
 }
Ejemplo n.º 2
0
 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
     }
 }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
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);
        }