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