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