示例#1
0
        private void UpdatePathsNodeRemoved(PathPointObject removedNode)
        {
            int pathNum = GetPathNodeParentIDFromNodeID(removedNode.m_NodeID);

            if (pathNum == -1)
            {
                return;
            }

            // Decrease length of current path
            IEnumerable <LevelObject> paths = GetAllObjectsByType(LevelObject.Type.PATH);

            paths.ElementAt(pathNum).Parameters[1] -= 1;
            paths.ElementAt(pathNum).GenerateProperties();
            // Decrease starting indices of following paths
            for (int i = pathNum + 1; i < paths.Count(); i++)
            {
                paths.ElementAt(i).Parameters[0] -= 1;
                paths.ElementAt(i).GenerateProperties();
            }
            IEnumerable <LevelObject> pathNodes = GetAllObjectsByType(LevelObject.Type.PATH_NODE);

            // Update Node ID's of following path nodes
            for (int i = removedNode.m_NodeID + 1; i < pathNodes.Count(); i++)
            {
                PathPointObject node = (PathPointObject)pathNodes.Where(obj0 => ((PathPointObject)obj0).m_NodeID == i).ElementAt(0);
                node.m_NodeID--;
            }
        }
示例#2
0
        public PathPointObject AddPathPointObject(PathObject parent)
        {
            // Calculate the Node ID using the parent path's start offset and length
            int             nodeID = parent.Parameters[0] + parent.Parameters[1];
            PathPointObject obj    = new PathPointObject(
                InitialiseDataForObject(LevelObject.Type.PATH_NODE), (int)GetNextUniqueID(), nodeID);

            m_LevelObjects.Add(obj.m_UniqueID, obj);
            return(obj);
        }
示例#3
0
        protected virtual void WritePathNodeObjectToXML(XmlWriter writer, PathPointObject obj, int index = -1)
        {
            writer.WriteStartElement("PathPointObject");
            if (index > -1)
            {
                writer.WriteAttributeString("index", index.ToString());
            }

            WriteObjectPositionToXML(writer, obj);

            writer.WriteEndElement();
        }
        private static void WritePathNodeObjectToXML(XmlWriter writer, PathPointObject obj, int index = -1)
        {
            writer.WriteStartElement("PathPointObject");
            if (index > -1)
            {
                writer.WriteAttributeString("index", index.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.WriteEndElement();
        }
示例#5
0
        protected virtual void ReadPathPointObject(XmlReader reader, Level level, PathObject parent)
        {
            int index = int.Parse(reader.GetAttribute("index"));

            PathPointObject obj = level.AddPathPointObject(parent.m_PathID);

            while (reader.Read())
            {
                reader.MoveToContent();
                if (reader.NodeType.Equals(XmlNodeType.Element) && reader.LocalName.Equals("Position"))
                {
                    Vector3 position = ReadPositionVector3(reader);
                    obj.Position = position;
                }
                else if (reader.NodeType.Equals(XmlNodeType.EndElement) && reader.LocalName.Equals("PathPointObject"))
                {
                    break;
                }
            }
        }
        private static void WritePathNodeObjectToXML(XmlWriter writer, PathPointObject obj, int index = -1)
        {
            writer.WriteStartElement("PathPointObject");
            if (index > -1)
                writer.WriteAttributeString("index", index.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.WriteEndElement();
        }
示例#7
0
        public PathPointObject AddPathPointObject(int pathID, int index = -1)
        {
            // Calculate the Node ID using the parent path's start offset and length

            Console.WriteLine("PathID for adding: " + pathID);

            List <LevelObject> paths     = this.GetAllObjectsByType(LevelObject.Type.PATH).ToList();
            List <LevelObject> pathNodes = this.GetAllObjectsByType(LevelObject.Type.PATH_NODE)
                                           .OrderBy(obj1 => ((PathPointObject)obj1).m_NodeID).ToList();

            PathObject path = (PathObject)paths[pathID];

            int indexInPath;

            if (index < 0)
            {
                indexInPath = path.Parameters[1];
            }
            else
            {
                indexInPath = index;
            }
            int nodeID = path.Parameters[0] + indexInPath;

            Console.WriteLine("NodeIndex: " + nodeID);

            // Update Node ID's of following path nodes
            if (pathNodes.Count > 0)
            {
                for (int i = pathNodes.Count - 1; i >= nodeID; i--)
                {
                    PathPointObject node = (PathPointObject)pathNodes[i];
                    node.m_NodeID++;
                }
            }
            // If possible, create object after last node in path
            PathPointObject obj = new PathPointObject(
                InitialiseDataForObject(LevelObject.Type.PATH_NODE), (int)GetNextUniqueID(), nodeID);

            obj.m_IndexInPath = (byte)indexInPath;
            obj.ParentPath    = (ushort)pathID;
            if (indexInPath > 0)
            {
                obj.Position = pathNodes[nodeID - 1].Position;
            }

            obj.GenerateProperties();
            m_LevelObjects.Add(obj.m_UniqueID, obj);

            // Update start indices and lengths of paths
            for (int i = pathID; i < paths.Count; i++)
            {
                if (i == pathID)
                {
                    // Increase length of parent path
                    paths[i].Parameters[1] += 1;
                }
                else if (i > pathID)
                {
                    // Increase start node index for all following paths
                    paths[i].Parameters[0] += 1;
                }
                paths[i].GenerateProperties();
            }
            return(obj);
        }
示例#8
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);
                }
            }
        }