///<summary> ///constructor ///</summary> ///<param name="healthData"></param> public TriggerHealthGiver(HealthData healthData) : base(new HealthSceneObject()) { //TODO: integrate with Torque //SceneObject.CreateWithCollision = false; //SceneObject.CreateWithPhysics = false; Name = healthData.Name; Position = healthData.Position; BoundingRadius = healthData.Radius; _healthGiven = healthData.HealthGiven; NodeIndex = healthData.NodeIndex; //create this trigger's region of influence AddCircularTriggerRegion( Position, GameManager.GameManager.Instance.Parameters.DefaultGiverTriggerRange); TmeBetweenRespawns = GameManager.GameManager.Instance.Parameters.HealthRespawnDelay; EntityType = EntityTypes.Health; }
///<summary> ///Add health using given health data ///</summary> ///<param name="healthData"></param> public void AddHealth(HealthData healthData) { TriggerHealthGiver hg = new TriggerHealthGiver(healthData); TriggerSystem.Register(hg); //let the corresponding navgraph node point to this object NavGraphNode node = NavGraph.GetNode(hg.NodeIndex); node.ExtraInfo = hg; //register the entity EntityManager.Instance.RegisterEntity(hg); }
///<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"); } } }