Пример #1
0
        private static void WriteEntranceObjectToXML(XmlWriter writer, EntranceObject obj)
        {
            writer.WriteStartElement("EntranceObject");
            writer.WriteAttributeString("entranceID", obj.m_EntranceID.ToString());

            writer.WriteStartElement("Position");
            writer.WriteElementString("X", obj.Position.X.ToString(usa));
            writer.WriteElementString("Y", obj.Position.Y.ToString(usa));
            writer.WriteElementString("Z", obj.Position.Z.ToString(usa));
            writer.WriteEndElement();

            writer.WriteElementString("YRotation", obj.YRotation.ToString(usa));

            writer.WriteStartElement("Parameters");
            writer.WriteAttributeString("count", "4");
            for (int j = 0; j < 4; j++)
            {
                writer.WriteStartElement("Parameter");
                writer.WriteAttributeString("id", j.ToString());
                writer.WriteString(obj.Parameters[j].ToString());
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            writer.WriteEndElement();
        }
Пример #2
0
        public EntranceObject AddEntranceObject(int layer)
        {
            IEnumerable <LevelObject> entrances = GetAllObjectsByType(LevelObject.Type.ENTRANCE);
            int            maxid = (entrances.Count() < 1) ? -1 : entrances.Max(obj2 => ((EntranceObject)obj2).m_EntranceID);
            EntranceObject obj   = new EntranceObject(
                InitialiseDataForObject(LevelObject.Type.ENTRANCE), (int)GetNextUniqueID(), layer, maxid + 1);

            m_LevelObjects.Add(obj.m_UniqueID, obj);
            return(obj);
        }
Пример #3
0
        protected virtual void ReadEntranceObject(XmlReader reader, Level level)
        {
            EntranceObject obj = level.AddEntranceObject(0);

            obj.m_EntranceID = int.Parse(reader.GetAttribute("entranceID"));

            while (reader.Read())
            {
                reader.MoveToContent();
                if (reader.NodeType.Equals(XmlNodeType.Element) && reader.LocalName.Equals("Position"))
                {
                    obj.Position = ReadPositionVector3(reader);
                }
                else if (reader.NodeType.Equals(XmlNodeType.Element) && reader.LocalName.Equals("YRotation"))
                {
                    obj.YRotation = Helper.ParseFloat(reader.ReadElementContentAsString());
                }
                else if (reader.NodeType.Equals(XmlNodeType.Element) && reader.LocalName.Equals("Parameters"))
                {
                    // Should be 4
                    string countAttr = reader.GetAttribute("count");
                    int    count     = (countAttr != null) ? int.Parse(countAttr) : 5;

                    ushort[] tempParams = ReadParameters(reader, count);

                    // Before this revision (R73) Entrance objects had 5 parameters but the third was a duplicate of
                    // the Y Rotation, no longer exported but older XML's will still have the 5
                    if (count == 5)
                    {
                        tempParams = new ushort[] { tempParams[0], tempParams[1], tempParams[3], tempParams[4] }
                    }
                    ;

                    obj.Parameters = tempParams;

                    // Eventually we want to get rid of this, and use only the below line

                    //obj.Parameters = ReadParameters(reader, 4);
                }
                else if (reader.NodeType.Equals(XmlNodeType.EndElement) && reader.LocalName.Equals("EntranceObject"))
                {
                    break;
                }
            }
        }
Пример #4
0
        protected virtual void WriteEntranceObjectToXML(XmlWriter writer, EntranceObject obj)
        {
            writer.WriteStartElement("EntranceObject");
            writer.WriteAttributeString("entranceID", obj.m_EntranceID.ToString());

            WriteObjectPositionToXML(writer, obj);

            writer.WriteElementString("YRotation", Helper.ToString(obj.YRotation));

            writer.WriteStartElement("Parameters");
            writer.WriteAttributeString("count", "4");
            for (int j = 0; j < 4; j++)
            {
                writer.WriteStartElement("Parameter");
                writer.WriteAttributeString("id", j.ToString());
                writer.WriteString(obj.Parameters[j].ToString());
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            writer.WriteEndElement();
        }
Пример #5
0
        public bool OnClickEntrance(int Number, MouseButton Button)
        {
            // do not enter when in fight mode
            if (fightMode)
            {
                return(false);
            }

            BurntimeClassic classic = app as BurntimeClassic;
            Location        loc     = classic.Game.World.ActiveLocationObj;

            MapEntrance entrance = loc.Map.Entrances[Number];

            EntranceObject entranceObject = new EntranceObject(entrance, Number);

            if (!TryEnterRoom(entranceObject, charOverlay.SelectedCharacter))
            {
                charOverlay.SelectedCharacter.Mind.MoveToObject(new InteractionObject(entranceObject,
                                                                                      classic.Game.World.ActiveLocationObj.Rooms[Number].EntryCondition, this));
            }

            return(true);
        }
Пример #6
0
        private static void WriteEntranceObjectToXML(XmlWriter writer, EntranceObject obj)
        {
            writer.WriteStartElement("EntranceObject");
            writer.WriteAttributeString("entranceID", obj.m_EntranceID.ToString());

            writer.WriteStartElement("Position");
            writer.WriteElementString("X", obj.Position.X.ToString(usa));
            writer.WriteElementString("Y", obj.Position.Y.ToString(usa));
            writer.WriteElementString("Z", obj.Position.Z.ToString(usa));
            writer.WriteEndElement();

            writer.WriteElementString("YRotation", obj.YRotation.ToString(usa));

            writer.WriteStartElement("Parameters");
            writer.WriteAttributeString("count", "4");
            for (int j = 0; j < 4; j++)
            {
                writer.WriteStartElement("Parameter");
                writer.WriteAttributeString("id", j.ToString());
                writer.WriteString(obj.Parameters[j].ToString());
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            writer.WriteEndElement();
        }
Пример #7
0
        private void ReadObjectTable(NitroOverlay ovl, uint offset, int area)
        {
            uint subtbl_num    = ovl.Read32(offset);
            uint subtbl_offset = ovl.ReadPointer(offset + 0x4);

            for (uint st = 0; st < subtbl_num; st++)
            {
                uint curoffset = subtbl_offset + (st * 8);

                byte flags          = ovl.Read8(curoffset);
                byte entries_num    = ovl.Read8(curoffset + 0x1);
                uint entries_offset = ovl.ReadPointer(curoffset + 0x4);

                byte type  = (byte)(flags & 0x1F);
                byte layer = (byte)(flags >> 5);

                if (type == 11)
                {
                    m_MinimapFileIDs = new ushort[entries_num];
                }

                for (byte e = 0; e < entries_num; ++e)
                {
                    LevelObject    obj;
                    INitroROMBlock objData = new INitroROMBlock();
                    objData.m_Data = ovl.ReadBlock((uint)(entries_offset + e * k_LevelObjTypeSizes[type]), (uint)k_LevelObjTypeSizes[type]);
                    switch (type)
                    {
                    case 0:
                        obj = new StandardObject(objData, m_LevelObjects.Count, layer, area);
                        break;

                    case 1:
                        obj = new EntranceObject(objData, m_LevelObjects.Count, layer, m_EntranceID++);
                        break;

                    case 2:     // Path Node
                        obj = new PathPointObject(objData, m_LevelObjects.Count, m_PathNodeID++);
                        break;

                    case 3:     // Path
                        obj = new PathObject(objData, m_LevelObjects.Count, (ushort)m_PathID++);
                        break;

                    case 4:
                        obj = new ViewObject(objData, m_LevelObjects.Count, m_ViewID++);
                        break;

                    case 5:
                        obj = new SimpleObject(objData, m_LevelObjects.Count, layer, area);
                        break;

                    case 6:
                        obj = new TpSrcObject(objData, m_LevelObjects.Count, layer);
                        break;

                    case 7:
                        obj = new TpDstObject(objData, m_LevelObjects.Count, layer);
                        break;

                    case 8:
                        // Fog
                        obj = new FogObject(objData, m_LevelObjects.Count, layer, area);
                        break;

                    case 9:
                        obj = new DoorObject(objData, m_LevelObjects.Count, layer);
                        break;

                    case 10:
                        obj = new ExitObject(objData, m_LevelObjects.Count, layer);
                        break;

                    case 11:
                        obj = new MinimapTileIDObject(objData, m_LevelObjects.Count, layer, m_MinimapTileIDNum++);
                        // This is still used by Minimap Editor
                        m_MinimapFileIDs[e] = ovl.Read16((uint)(entries_offset + (e * 2)));
                        break;

                    case 12:
                        // per-area minimap scale factors
                        obj = new MinimapScaleObject(objData, m_LevelObjects.Count, layer, area);
                        break;

                    case 14:
                        // ??? Unknown
                        obj = new Type14Object(objData, m_LevelObjects.Count, layer, area);
                        break;

                    default:
                        throw new InvalidDataException("Bad object type: " + type);
                    }

                    m_LevelObjects.Add(obj.m_UniqueID, obj);
                }
            }
        }
Пример #8
0
        private bool TryEnterRoom(EntranceObject entranceObject, Character chr)
        {
            MapEntrance     entrance = entranceObject.Data;
            int             number   = entranceObject.Number;
            BurntimeClassic classic  = BurntimeClassic.Instance;

            Condition condition = classic.Game.World.ActiveLocationObj.Rooms[number].EntryCondition;

            if (!condition.Process(charOverlay.SelectedCharacter))
            {
                return(false);
            }

            if (view.Location.Player != null && view.Location.Player != view.Player)
            {
                return(true);
            }

            charOverlay.SelectedCharacter.CancelAction();

            switch (entrance.RoomType)
            {
            case RoomType.Normal:
            case RoomType.WaterSource:
                classic.InventoryBackground = entrance.Background;
                classic.InventoryRoom       = classic.Game.World.ActiveLocationObj.Rooms[number];
                app.SceneManager.SetScene("InventoryScene", charOverlay.SelectedCharacter);
                break;

            case RoomType.Rope:
                classic.InventoryBackground = 3;
                classic.InventoryRoom       = classic.Game.World.ActiveLocationObj.Rooms[number];
                app.SceneManager.SetScene("InventoryScene", charOverlay.SelectedCharacter);
                break;

            case RoomType.Trader:
                classic.ImageScene                 = null;
                classic.ActionAfterImageScene      = ActionAfterImageScene.Trader;
                classic.Game.World.ActiveTraderObj = classic.Game.World.ActiveLocationObj.LocalTrader;
                switch (entrance.Background)
                {
                case 0x0D: classic.ImageScene = "film_10.pac"; break;

                case 0x11: classic.ImageScene = "film_05.pac"; break;
                }
                if (classic.ImageScene != null)
                {
                    app.SceneManager.SetScene("ImageScene");
                }
                break;

            case RoomType.Pub:
                classic.InventoryBackground = entrance.Background;
                if (entrance.Background == 14)
                {
                    classic.ImageScene            = "film_06.pac";
                    classic.ActionAfterImageScene = ActionAfterImageScene.Pub;
                    app.SceneManager.SetScene("ImageScene");
                }
                else
                {
                    app.SceneManager.SetScene("PubScene");
                }
                break;

            case RoomType.Restaurant:
                classic.InventoryBackground = entrance.Background;
                app.SceneManager.SetScene("RestaurantScene");
                break;

            case RoomType.Doctor:
                app.SceneManager.SetScene("DoctorScene");
                break;

            case RoomType.Church:
                app.SceneManager.SetScene("ChurchScene");
                break;

            case RoomType.Scene:
                classic.ImageScene            = null;
                classic.ActionAfterImageScene = ActionAfterImageScene.None;
                switch (entrance.Background)
                {
                case 0x0A:
                case 0x0B:
                case 0x0C: classic.ImageScene = "film_" + (entrance.Background - 8).ToString("D2") + ".pac"; break;

                case 0x10: classic.ImageScene = "film_08.pac"; break;

                case 0x12: classic.ImageScene = "film_09.pac"; break;
                }
                if (classic.ImageScene != null)
                {
                    app.SceneManager.SetScene("ImageScene");
                }
                break;
            }

            return(true);
        }