///<summary> ///constructor ///</summary> ///<param name="doorTriggerData"></param> public TriggerOnButtonSendMsg(DoorTriggerData doorTriggerData) : base(new DoorButtonSceneObject()) { //grap the name Name = doorTriggerData.Name; //grab the name of the entity it messages _receiverName = doorTriggerData.ReceiverName; _receiverId = INVALID_RECEIVER; //use lazy lookup later //grab the message type _messageToSend = doorTriggerData.MessageToSend; //grab the position and radius Position = doorTriggerData.Position; BoundingRadius = doorTriggerData.Radius; //create and set this trigger's region of influence AddRectangularTriggerRegion( //top left corner Position - new Vector2(BoundingRadius, BoundingRadius), //bottom right corner Position + new Vector2(BoundingRadius, BoundingRadius)); }
///<summary> ///Add a door trigger using given door trigger data ///</summary> ///<param name="doorTriggerData"></param> public void AddDoorTrigger(DoorTriggerData doorTriggerData) { TriggerOnButtonSendMsg tr = new TriggerOnButtonSendMsg(doorTriggerData); TriggerSystem.Register(tr); //register the entity EntityManager.Instance.RegisterEntity(tr); }
///<summary> ///load a map in Raven .map format ///</summary> ///<param name="ravenMapFilename">the Raven map file</param> ///<exception cref="ApplicationException"></exception> public void LoadFromRavenMap(string ravenMapFilename) { //used to find index of edge crossed by entity with given ravenId Dictionary<int, List<int>> idEdgeMap = new Dictionary<int, List<int>>(); //used to find the index of door having trigger with given ravenId Dictionary<int, int> idDoorMap = new Dictionary<int, int>(); //used to find the index of the door with the given ravenId Dictionary<int, int> doorIdIndexMap = new Dictionary<int, int>(); DataStreamReader inStream = new DataStreamReader(ravenMapFilename); Name = ravenMapFilename; int numNodes = inStream.GetIntFromStream(); NodeList = new List<NodeData>(numNodes); for (int i = 0; i < numNodes; i++) { NodeData nodeData = new NodeData(); nodeData.Name = "Node_" + i; inStream.SkipNextFieldInStream(); //Index: nodeData.Index = inStream.GetIntFromStream(); inStream.SkipNextFieldInStream(); //PosX: float x = inStream.GetIntFromStream(); inStream.SkipNextFieldInStream(); //PosY: float y = inStream.GetIntFromStream(); nodeData.Position = new Vector2(x, y); NodeList.Add(nodeData); } int numEdges = inStream.GetIntFromStream(); EdgeList = new List<EdgeData>(numEdges); for (int i = 0; i < numEdges; i++) { EdgeData edgeData = new EdgeData(); edgeData.Name = "Edge_" + i; inStream.SkipNextFieldInStream(); //From: edgeData.FromIndex = inStream.GetIntFromStream(); inStream.SkipNextFieldInStream(); //To: edgeData.ToIndex = inStream.GetIntFromStream(); inStream.SkipNextFieldInStream(); //Cost: edgeData.Cost = inStream.GetFloatFromStream(); inStream.SkipNextFieldInStream(); //Flags: edgeData.BehaviorType = (EdgeData.BehaviorTypes) inStream.GetIntFromStream(); inStream.SkipNextFieldInStream(); //ID: //we'll save the id and use it later to fill in //the object name when we process the enities int idOfIntersectingEntity = inStream.GetIntFromStream(); if (idOfIntersectingEntity > 0) //if valid { if (!idEdgeMap.ContainsKey(idOfIntersectingEntity)) { idEdgeMap.Add(idOfIntersectingEntity, new List<int>()); } idEdgeMap[idOfIntersectingEntity].Add(i); } edgeData.NameOfIntersectingEntity = ""; //may replace later EdgeList.Add(edgeData); } SizeX = inStream.GetIntFromStream(); SizeY = inStream.GetIntFromStream(); WallList = new List<WallData>(); DoorList = new List<DoorData>(); DoorTriggerList = new List<DoorTriggerData>(); SpawnPointList = new List<SpawnPointData>(); HealthList = new List<HealthData>(); RailgunList = new List<RailgunData>(); RocketLauncherList = new List<RocketLauncherData>(); ShotgunList = new List<ShotgunData>(); while (inStream.Peek() >= 0) { EntityTypes entityType = (EntityTypes) inStream.GetIntFromStream(); float x, y; switch (entityType) { case EntityTypes.Wall: WallData wallData = new WallData(); wallData.Name = "Wall_" + WallList.Count; x = inStream.GetFloatFromStream(); y = inStream.GetFloatFromStream(); wallData.From = new Vector2(x, y); x = inStream.GetFloatFromStream(); y = inStream.GetFloatFromStream(); wallData.To = new Vector2(x, y); x = inStream.GetFloatFromStream(); y = inStream.GetFloatFromStream(); wallData.Normal = new Vector2(x, y); WallList.Add(wallData); break; case EntityTypes.SlidingDoor: DoorData doorData = new DoorData(); doorData.Name = "Door_" + DoorList.Count; int ravenDoorId = inStream.GetIntFromStream(); doorIdIndexMap.Add(ravenDoorId, DoorList.Count); //save if (idEdgeMap.ContainsKey(ravenDoorId)) { foreach (int i in idEdgeMap[ravenDoorId]) { EdgeList[i].NameOfIntersectingEntity = doorData.Name; } } x = inStream.GetFloatFromStream(); y = inStream.GetFloatFromStream(); doorData.From = new Vector2(x, y); x = inStream.GetFloatFromStream(); y = inStream.GetFloatFromStream(); doorData.To = new Vector2(x, y); doorData.TriggerList = new List<string>(); int numDoorTriggers = inStream.GetIntFromStream(); for (int i = 0; i < numDoorTriggers; i++) { //we'll save the trigger id and use it later to //fill in the object name when we process the door //triggers idDoorMap.Add( inStream.GetIntFromStream(), DoorList.Count); } DoorList.Add(doorData); break; case EntityTypes.DoorTrigger: DoorTriggerData doorTriggerData = new DoorTriggerData(); doorTriggerData.Name = "DoorTrigger_" + DoorTriggerList.Count; int ravenDoorTriggerId = inStream.GetIntFromStream(); DoorList[idDoorMap[ravenDoorTriggerId]].TriggerList.Add( doorTriggerData.Name); int ravenReceiverId = inStream.GetIntFromStream(); doorTriggerData.ReceiverName = DoorList[doorIdIndexMap[ravenReceiverId]].Name; doorTriggerData.MessageToSend = (MessageTypes) inStream.GetIntFromStream(); x = inStream.GetFloatFromStream(); y = inStream.GetFloatFromStream(); doorTriggerData.Position = new Vector2(x, y); doorTriggerData.Radius = inStream.GetFloatFromStream(); DoorTriggerList.Add(doorTriggerData); break; case EntityTypes.SpawnPoint: SpawnPointData spawnPointData = new SpawnPointData(); spawnPointData.Name = "SpawnPoint_" + SpawnPointList.Count; inStream.SkipNextFieldInStream(); x = inStream.GetFloatFromStream(); y = inStream.GetFloatFromStream(); spawnPointData.Position = new Vector2(x, y); inStream.SkipNextFieldInStream(); inStream.SkipNextFieldInStream(); SpawnPointList.Add(spawnPointData); break; case EntityTypes.Health: HealthData healthData = new HealthData(); healthData.Name = "Health_" + HealthList.Count; inStream.SkipNextFieldInStream(); //heathId x = inStream.GetFloatFromStream(); y = inStream.GetFloatFromStream(); healthData.Position = new Vector2(x, y); healthData.Radius = inStream.GetFloatFromStream(); healthData.HealthGiven = inStream.GetIntFromStream(); healthData.NodeIndex = inStream.GetIntFromStream(); HealthList.Add(healthData); break; case EntityTypes.Shotgun: ShotgunData shotgunData = new ShotgunData(); shotgunData.Name = "Shotgun_" + ShotgunList.Count; inStream.SkipNextFieldInStream(); //shotgunId x = inStream.GetFloatFromStream(); y = inStream.GetFloatFromStream(); shotgunData.Position = new Vector2(x, y); shotgunData.Radius = inStream.GetFloatFromStream(); shotgunData.NodeIndex = inStream.GetIntFromStream(); ShotgunList.Add(shotgunData); break; case EntityTypes.Railgun: RailgunData railgunData = new RailgunData(); railgunData.Name = "Railgun_" + RailgunList.Count; inStream.SkipNextFieldInStream(); //shotgunId x = inStream.GetFloatFromStream(); y = inStream.GetFloatFromStream(); railgunData.Position = new Vector2(x, y); railgunData.Radius = inStream.GetFloatFromStream(); railgunData.NodeIndex = inStream.GetIntFromStream(); RailgunList.Add(railgunData); break; case EntityTypes.RocketLauncher: RocketLauncherData rocketLauncherData = new RocketLauncherData(); rocketLauncherData.Name = "RocketLauncher_" + RocketLauncherList.Count; inStream.SkipNextFieldInStream(); //shotgunId x = inStream.GetFloatFromStream(); y = inStream.GetFloatFromStream(); rocketLauncherData.Position = new Vector2(x, y); rocketLauncherData.Radius = inStream.GetFloatFromStream(); rocketLauncherData.NodeIndex = inStream.GetIntFromStream(); RocketLauncherList.Add(rocketLauncherData); break; default: throw new ApplicationException( "MapData.LoadFromRavenMap: Attempting to load undefined object"); } } }