Ejemplo n.º 1
0
            public static SeamateObject FromDDDObject(SimObject baseObject)
            {
                SeamateObject obj = new SeamateObject(baseObject.ID);
                obj.Capabilities = baseObject.Capabilities;
                obj.CapabilityList = baseObject.CapabilityList;
                obj.CapabilityRangeRings = baseObject.CapabilityRangeRings;
                obj.ChildObjects = baseObject.ChildObjects;
                obj.ClassName = baseObject.ClassName;
                obj.CustomAttributes = baseObject.CustomAttributes;
                obj.DestinationLocation = baseObject.DestinationLocation;
                obj.DockedObjects = baseObject.DockedObjects;
                obj.DockedToParent = baseObject.DockedToParent;
                obj.DockedWeapons = baseObject.DockedWeapons;
                obj.FuelAmount = baseObject.FuelAmount;
                obj.FuelCapacity = baseObject.FuelCapacity;
                obj.FuelConsumptionRate = baseObject.FuelConsumptionRate;
                obj.IconName = baseObject.IconName;
                obj.InActiveRegions = baseObject.InActiveRegions;
                obj.IsWeapon = baseObject.IsWeapon;
                obj.Location = baseObject.Location;
                obj.MaximumSpeed = baseObject.MaximumSpeed;
                obj.Owner = baseObject.Owner;
                obj.ParentObjectID = baseObject.ParentObjectID;
                obj.Sensors = baseObject.Sensors;
                obj.ShouldProject = baseObject.ShouldProject;
                obj.State = baseObject.State;
                obj.TeamName = baseObject.TeamName;
                obj.Throttle = baseObject.Throttle;
                obj.Velocity = baseObject.Velocity;
                obj.Vulnerabilities = baseObject.Vulnerabilities;
                obj.VulnerabilityList = baseObject.VulnerabilityList;
                obj.VulnerabilityRangeRings = baseObject.VulnerabilityRangeRings;

                //obj.GroundTruthIFF;
                //obj.Heading;
                //obj.SensorRange;
                return obj;
            }
Ejemplo n.º 2
0
        //public WaypointRoute GenerateRoute(LocationValue currentLocation, LocationValue destination, List<WaypointRoute> routes)
        //{
        //    WaypointRoute result = null;

        //    LocationGraph graph = LocationGraph.GenerateRouteGraph("start",currentLocation, "end",destination, routes);

        //    result = graph.GenerateWaypointRoute("start","end");
        //    return result;
        //}

        internal void ViewProInitializeObject(SimulationEvent ev)
        {
            String id = ((StringValue)ev["ObjectID"]).value;
            SimObject ob;
            if (AllObjects.ContainsKey(id))
            {
                ob = AllObjects[id];
            }
            else
            {
                ob = new SimObject(id);
            }
            ob.Owner = ((StringValue)ev["OwnerID"]).value;
            ob.Location = ((LocationValue)ev["Location"]);
            ob.IconName = ((StringValue)ev["IconName"]).value;
            
            ob.IsWeapon = ((BooleanValue)ev["IsWeapon"]).value;
            if (ob.Owner == m_decisionMakerID)
            {
                m_myObjects[ob.ID] = ob;
            }
            else
            {
                if (m_myObjects.ContainsKey(id))
                {
                    m_myObjects.Remove(id);
                }
            }
            

            m_allObjects[ob.ID] = ob;

            if (PlayerAgent != null)
            {
                PlayerAgent.ViewProInitializeObject(ev);
            }
        }
Ejemplo n.º 3
0
 void UpdateInActiveRegions(ref SimObject ob)
 {
     ob.InActiveRegions.Clear();
     foreach (SimActiveRegion sar in m_activeRegions.Values)
     {
         Polygon2D azPoly = new Polygon2D();
         foreach (PolygonValue.PolygonPoint p in sar.Shape.points)
         {
             azPoly.AddVertex(new Vec2D(p.X, p.Y));
         }
         if (Polygon2D.IsPointInside(azPoly, new Vec2D(ob.Location)))
         {
             ob.InActiveRegions.Add(sar.ID);
         }
     }
 }
Ejemplo n.º 4
0
        private void ParseFileToOutput(String replayFilePath, String outputFilePath)
        {
            currentTime = 0;
            lastItemTime = -1;
            objects = new Dictionary<string, SimObject>();
            findTimes = new Dictionary<string, List<int>>();
            fixTimes = new Dictionary<string, List<int>>();
            trackTimes = new Dictionary<string, List<int>>();
            targetTimes = new Dictionary<string, List<int>>();
            objectsAssignedTo = new Dictionary<string, List<string>>();
            dmAssignedItems = new Dictionary<string, Dictionary<int, ItemDefinition>>();
            itemsByTime = new Dictionary<Int32, List<ItemDefinition>>();
            objectLastAttackItems = new Dictionary<string, String>();
            objectSpeeds = new Dictionary<string,double>();
            objectMaxSpeeds = new Dictionary<string, double>();
            rows = new List<RowOutput>();
            personMap = new Dictionary<string, string>();
            teamMap = new Dictionary<string, string>();
            scenDate = String.Format("{0:dd/MM/yyyy}", DateTime.Now);
            scenarioStart = String.Format("{0:hh:mm tt}", DateTime.Now);
            personMap.Add("BAMS DM", ".");
            personMap.Add("Firescout DM", ".");
            teamMap.Add("BAMS DM", ".");
            teamMap.Add("Firescout DM", ".");
            selfDefenses = new Dictionary<string, List<int>>();
            fixedAs = new Dictionary<string, Dictionary<string, string>>();
            iffValues = new Dictionary<string, string>();
            suspectObjects = new List<string>();

            bool hasViewProEvents = false;//unfortunately not all replays will have the VPAttUpdate events :-\
            //get scenario name from file name

            bool setBackItemTimes = false;
            bool hasReceivedStimuli = false;

            //parse scenario line by line
            int counter = 0;
            ItemDefinition def;
            string line;
            String id;
            SimObject o;
            String dm, itemId, action;
            int t;
            List<String> outputRows = new List<string>();
            outputRows.Add(RowOutput.ToOutputHeader());
            // Read the file and display it line by line.
            StreamReader file = new StreamReader(replayFilePath);
            List<SimulationEvent> inOrderEvents = new List<SimulationEvent>();
            while ((line = file.ReadLine()) != null)
            {
                SimulationEvent ev = null;
                try
                {
                    ev = SimulationEventFactory.XMLDeserialize(line);
                    if (ev.eventType == "SEAMATE_StimulusSent")
                    {
                        if (!hasReceivedStimuli)
                        {
                            if (((IntegerValue)ev.parameters["Time"]).value > 50000)
                            {
                                ((IntegerValue)ev.parameters["Time"]).value = Math.Max(1000, ((IntegerValue)ev.parameters["Time"]).value - 60000); //prevent items that start at min=1
                                setBackItemTimes = true;
                            }
                            hasReceivedStimuli = true;
                        }
                        else
                        {
                            if (setBackItemTimes && ((StringValue)ev["StimulusType"]).value != "Attack")
                                ((IntegerValue)ev.parameters["Time"]).value = Math.Max(1000, ((IntegerValue)ev.parameters["Time"]).value - 60000); //prevent items that start at min=1
                        }
                    }
                    AddToList(inOrderEvents, ev);
                }
                catch (Exception ex)
                {
                    continue;
                }

            }

            file.Close();
            foreach (SimulationEvent ev in inOrderEvents)
            {
                switch (ev.eventType)
                {
                    case "NewObject":
                        /*
                         * <NewObject><Parameter><Name>ID</Name><Value><StringType>7738</StringType></Value></Parameter><Parameter><Name>ObjectType</Name><Value><StringType>SeaObject</StringType></Value></Parameter><Parameter><Name>StateTable</Name><Value><StateTableType><StateName><Name>FullyFunctional</Name><Value><AttributeCollectionType><Attribute><Name>Capability</Name><Value><CapabilityType><Effect><Name>Surface to air</Name><Range>500</Range><Intensity>1</Intensity><Probability>0.100000001490116</Probability></Effect><Effect><Name>Surface to surface</Name><Range>4000</Range><Intensity>1</Intensity><Probability>0.899999976158142</Probability></Effect></CapabilityType></Value></Attribute><Attribute><Name>Vulnerability</Name><Value><VulnerabilityType><Transition><State>Dead</State><Conditions><Condition><Capability>Allied shelling</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Under Siege</State><Conditions><Condition><Capability>Surface to surface</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Dead</State><Conditions><Condition><Capability>Coordinate Strike</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Dead</State><Conditions><Condition><Capability>Laser</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition></VulnerabilityType></Value></Attribute><Attribute><Name>Sensors</Name><Value><SensorArrayType></SensorArrayType></Value></Attribute><Attribute><Name>Emitters</Name><Value><EmitterType><Emitter><AttributeName>ID</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>ClassName</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>State</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>Location</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>ObjectName</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>Velocity</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>Throttle</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>IconName</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter></EmitterType></Value></Attribute><Attribute><Name>IsWeapon</Name><Value><BooleanType>False</BooleanType></Value></Attribute><Attribute><Name>MaximumSpeed</Name><Value><DoubleType>75</DoubleType></Value></Attribute><Attribute><Name>Size</Name><Value><DoubleType>0</DoubleType></Value></Attribute><Attribute><Name>LaunchDuration</Name><Value><IntegerType>0</IntegerType></Value></Attribute><Attribute><Name>AttackDuration</Name><Value><IntegerType>50000</IntegerType></Value></Attribute><Attribute><Name>DockingDuration</Name><Value><IntegerType>0</IntegerType></Value></Attribute><Attribute><Name>FuelCapacity</Name><Value><DoubleType>0</DoubleType></Value></Attribute><Attribute><Name>FuelAmount</Name><Value><DoubleType>3000</DoubleType></Value></Attribute><Attribute><Name>FuelConsumptionRate</Name><Value><DoubleType>1</DoubleType></Value></Attribute><Attribute><Name>FuelDepletionState</Name><Value><StringType>Dead</StringType></Value></Attribute><Attribute><Name>IconName</Name><Value><StringType>ImageLib.big.png</StringType></Value></Attribute><Attribute><Name>RemoveOnDestruction</Name><Value><BooleanType>True</BooleanType></Value></Attribute><Attribute><Name>LaunchedByOwner</Name><Value><BooleanType>False</BooleanType></Value></Attribute><Attribute><Name>CanOwn</Name><Value><StringListType></StringListType></Value></Attribute><Attribute><Name>DefaultClassification</Name><Value><StringType></StringType></Value></Attribute><Attribute><Name>ClassificationDisplayRules</Name><Value><ClassificationDisplayRulesType><Rule><State>FullyFunctional</State><Classification>Hostile</Classification><DisplayIcon>ImageLib.hostile.png</DisplayIcon></Rule><Rule><State>FullyFunctional</State><Classification>Suspect</Classification><DisplayIcon>ImageLib.suspect.png</DisplayIcon></Rule><Rule><State>FullyFunctional</State><Classification>Friendly</Classification><DisplayIcon>ImageLib.friendly.png</DisplayIcon></Rule><Rule><State>FullyFunctional</State><Classification>Threat</Classification><DisplayIcon>ImageLib.threat.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Hostile</Classification><DisplayIcon>ImageLib.hostile.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Threat</Classification><DisplayIcon>ImageLib.threat.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Suspect</Classification><DisplayIcon>ImageLib.suspect.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Friendly</Classification><DisplayIcon>ImageLib.friendly.png</DisplayIcon></Rule></ClassificationDisplayRulesType></Value></Attribute></AttributeCollectionType></Value></StateName><StateName><Name>Hostile</Name><Value><AttributeCollectionType><Attribute><Name>Capability</Name><Value><CapabilityType><Effect><Name>Surface to air</Name><Range>500</Range><Intensity>1</Intensity><Probability>0.100000001490116</Probability></Effect><Effect><Name>Surface to surface</Name><Range>4000</Range><Intensity>1</Intensity><Probability>0.899999976158142</Probability></Effect></CapabilityType></Value></Attribute><Attribute><Name>Vulnerability</Name><Value><VulnerabilityType><Transition><State>Dead</State><Conditions><Condition><Capability>Allied shelling</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Under Siege</State><Conditions><Condition><Capability>Surface to surface</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Dead</State><Conditions><Condition><Capability>Coordinate Strike</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Dead</State><Conditions><Condition><Capability>Laser</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition></VulnerabilityType></Value></Attribute><Attribute><Name>Sensors</Name><Value><SensorArrayType></SensorArrayType></Value></Attribute><Attribute><Name>Emitters</Name><Value><EmitterType><Emitter><AttributeName>ID</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>ClassName</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>State</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>Location</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>ObjectName</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>Velocity</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>Throttle</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>IconName</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter></EmitterType></Value></Attribute><Attribute><Name>IsWeapon</Name><Value><BooleanType>False</BooleanType></Value></Attribute><Attribute><Name>MaximumSpeed</Name><Value><DoubleType>75</DoubleType></Value></Attribute><Attribute><Name>Size</Name><Value><DoubleType>0</DoubleType></Value></Attribute><Attribute><Name>LaunchDuration</Name><Value><IntegerType>0</IntegerType></Value></Attribute><Attribute><Name>AttackDuration</Name><Value><IntegerType>50000</IntegerType></Value></Attribute><Attribute><Name>DockingDuration</Name><Value><IntegerType>0</IntegerType></Value></Attribute><Attribute><Name>FuelCapacity</Name><Value><DoubleType>0</DoubleType></Value></Attribute><Attribute><Name>FuelAmount</Name><Value><DoubleType>3000</DoubleType></Value></Attribute><Attribute><Name>FuelConsumptionRate</Name><Value><DoubleType>1</DoubleType></Value></Attribute><Attribute><Name>FuelDepletionState</Name><Value><StringType>Dead</StringType></Value></Attribute><Attribute><Name>IconName</Name><Value><StringType>ImageLib.big.png</StringType></Value></Attribute><Attribute><Name>RemoveOnDestruction</Name><Value><BooleanType>True</BooleanType></Value></Attribute><Attribute><Name>LaunchedByOwner</Name><Value><BooleanType>False</BooleanType></Value></Attribute><Attribute><Name>CanOwn</Name><Value><StringListType></StringListType></Value></Attribute><Attribute><Name>DefaultClassification</Name><Value><StringType></StringType></Value></Attribute><Attribute><Name>ClassificationDisplayRules</Name><Value><ClassificationDisplayRulesType><Rule><State>FullyFunctional</State><Classification>Hostile</Classification><DisplayIcon>ImageLib.hostile.png</DisplayIcon></Rule><Rule><State>FullyFunctional</State><Classification>Suspect</Classification><DisplayIcon>ImageLib.suspect.png</DisplayIcon></Rule><Rule><State>FullyFunctional</State><Classification>Friendly</Classification><DisplayIcon>ImageLib.friendly.png</DisplayIcon></Rule><Rule><State>FullyFunctional</State><Classification>Threat</Classification><DisplayIcon>ImageLib.threat.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Hostile</Classification><DisplayIcon>ImageLib.hostile.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Threat</Classification><DisplayIcon>ImageLib.threat.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Suspect</Classification><DisplayIcon>ImageLib.suspect.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Friendly</Classification><DisplayIcon>ImageLib.friendly.png</DisplayIcon></Rule></ClassificationDisplayRulesType></Value></Attribute></AttributeCollectionType></Value></StateName><StateName><Name>Dead</Name><Value><AttributeCollectionType><Attribute><Name>Capability</Name><Value><CapabilityType><Effect><Name>Surface to air</Name><Range>500</Range><Intensity>1</Intensity><Probability>0.100000001490116</Probability></Effect><Effect><Name>Surface to surface</Name><Range>4000</Range><Intensity>1</Intensity><Probability>0.899999976158142</Probability></Effect></CapabilityType></Value></Attribute><Attribute><Name>Vulnerability</Name><Value><VulnerabilityType><Transition><State>Dead</State><Conditions><Condition><Capability>Allied shelling</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Under Siege</State><Conditions><Condition><Capability>Surface to surface</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Dead</State><Conditions><Condition><Capability>Coordinate Strike</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Dead</State><Conditions><Condition><Capability>Laser</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition></VulnerabilityType></Value></Attribute><Attribute><Name>Sensors</Name><Value><SensorArrayType></SensorArrayType></Value></Attribute><Attribute><Name>Emitters</Name><Value><EmitterType><Emitter><AttributeName>ID</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>ClassName</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>State</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>Location</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>ObjectName</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>Velocity</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>Throttle</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>IconName</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter></EmitterType></Value></Attribute><Attribute><Name>IsWeapon</Name><Value><BooleanType>False</BooleanType></Value></Attribute><Attribute><Name>MaximumSpeed</Name><Value><DoubleType>0</DoubleType></Value></Attribute><Attribute><Name>Size</Name><Value><DoubleType>0</DoubleType></Value></Attribute><Attribute><Name>LaunchDuration</Name><Value><IntegerType>0</IntegerType></Value></Attribute><Attribute><Name>AttackDuration</Name><Value><IntegerType>50000</IntegerType></Value></Attribute><Attribute><Name>DockingDuration</Name><Value><IntegerType>0</IntegerType></Value></Attribute><Attribute><Name>FuelCapacity</Name><Value><DoubleType>0</DoubleType></Value></Attribute><Attribute><Name>FuelAmount</Name><Value><DoubleType>3000</DoubleType></Value></Attribute><Attribute><Name>FuelConsumptionRate</Name><Value><DoubleType>1</DoubleType></Value></Attribute><Attribute><Name>FuelDepletionState</Name><Value><StringType>Dead</StringType></Value></Attribute><Attribute><Name>IconName</Name><Value><StringType>ImageLib.big.png</StringType></Value></Attribute><Attribute><Name>RemoveOnDestruction</Name><Value><BooleanType>True</BooleanType></Value></Attribute><Attribute><Name>LaunchedByOwner</Name><Value><BooleanType>False</BooleanType></Value></Attribute><Attribute><Name>CanOwn</Name><Value><StringListType></StringListType></Value></Attribute><Attribute><Name>DefaultClassification</Name><Value><StringType></StringType></Value></Attribute><Attribute><Name>ClassificationDisplayRules</Name><Value><ClassificationDisplayRulesType><Rule><State>FullyFunctional</State><Classification>Hostile</Classification><DisplayIcon>ImageLib.hostile.png</DisplayIcon></Rule><Rule><State>FullyFunctional</State><Classification>Suspect</Classification><DisplayIcon>ImageLib.suspect.png</DisplayIcon></Rule><Rule><State>FullyFunctional</State><Classification>Friendly</Classification><DisplayIcon>ImageLib.friendly.png</DisplayIcon></Rule><Rule><State>FullyFunctional</State><Classification>Threat</Classification><DisplayIcon>ImageLib.threat.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Hostile</Classification><DisplayIcon>ImageLib.hostile.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Threat</Classification><DisplayIcon>ImageLib.threat.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Suspect</Classification><DisplayIcon>ImageLib.suspect.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Friendly</Classification><DisplayIcon>ImageLib.friendly.png</DisplayIcon></Rule></ClassificationDisplayRulesType></Value></Attribute></AttributeCollectionType></Value></StateName><StateName><Name>Under Siege</Name><Value><AttributeCollectionType><Attribute><Name>Capability</Name><Value><CapabilityType><Effect><Name>Surface to air</Name><Range>500</Range><Intensity>1</Intensity><Probability>0.100000001490116</Probability></Effect><Effect><Name>Surface to surface</Name><Range>4000</Range><Intensity>1</Intensity><Probability>0.899999976158142</Probability></Effect></CapabilityType></Value></Attribute><Attribute><Name>Vulnerability</Name><Value><VulnerabilityType><Transition><State>Dead</State><Conditions><Condition><Capability>Allied shelling</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Dead</State><Conditions><Condition><Capability>Allied shelling</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Dead</State><Conditions><Condition><Capability>Surface to surface</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Dead</State><Conditions><Condition><Capability>Coordinate Strike</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition><Transition><State>Dead</State><Conditions><Condition><Capability>Laser</Capability><Effect>1</Effect><Range>0</Range><Probability>100</Probability></Condition></Conditions></Transition></VulnerabilityType></Value></Attribute><Attribute><Name>Sensors</Name><Value><SensorArrayType></SensorArrayType></Value></Attribute><Attribute><Name>Emitters</Name><Value><EmitterType><Emitter><AttributeName>ID</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>ClassName</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>State</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>Location</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>ObjectName</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>Velocity</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>Throttle</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter><Emitter><AttributeName>IconName</AttributeName><IsEngram>False</IsEngram><Levels><Level>A</Level><Variance>0</Variance></Levels></Emitter></EmitterType></Value></Attribute><Attribute><Name>IsWeapon</Name><Value><BooleanType>False</BooleanType></Value></Attribute><Attribute><Name>MaximumSpeed</Name><Value><DoubleType>75</DoubleType></Value></Attribute><Attribute><Name>Size</Name><Value><DoubleType>0</DoubleType></Value></Attribute><Attribute><Name>LaunchDuration</Name><Value><IntegerType>0</IntegerType></Value></Attribute><Attribute><Name>AttackDuration</Name><Value><IntegerType>50000</IntegerType></Value></Attribute><Attribute><Name>EngagementDuration</Name><Value><IntegerType>10000</IntegerType></Value></Attribute><Attribute><Name>DockingDuration</Name><Value><IntegerType>0</IntegerType></Value></Attribute><Attribute><Name>FuelCapacity</Name><Value><DoubleType>0</DoubleType></Value></Attribute><Attribute><Name>FuelAmount</Name><Value><DoubleType>3000</DoubleType></Value></Attribute><Attribute><Name>FuelConsumptionRate</Name><Value><DoubleType>1</DoubleType></Value></Attribute><Attribute><Name>FuelDepletionState</Name><Value><StringType>Dead</StringType></Value></Attribute><Attribute><Name>IconName</Name><Value><StringType>ImageLib.siege.png</StringType></Value></Attribute><Attribute><Name>RemoveOnDestruction</Name><Value><BooleanType>True</BooleanType></Value></Attribute><Attribute><Name>LaunchedByOwner</Name><Value><BooleanType>False</BooleanType></Value></Attribute><Attribute><Name>CanOwn</Name><Value><StringListType></StringListType></Value></Attribute><Attribute><Name>DefaultClassification</Name><Value><StringType></StringType></Value></Attribute><Attribute><Name>ClassificationDisplayRules</Name><Value><ClassificationDisplayRulesType><Rule><State>FullyFunctional</State><Classification>Hostile</Classification><DisplayIcon>ImageLib.hostile.png</DisplayIcon></Rule><Rule><State>FullyFunctional</State><Classification>Suspect</Classification><DisplayIcon>ImageLib.suspect.png</DisplayIcon></Rule><Rule><State>FullyFunctional</State><Classification>Friendly</Classification><DisplayIcon>ImageLib.friendly.png</DisplayIcon></Rule><Rule><State>FullyFunctional</State><Classification>Threat</Classification><DisplayIcon>ImageLib.threat.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Hostile</Classification><DisplayIcon>ImageLib.hostile.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Threat</Classification><DisplayIcon>ImageLib.threat.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Suspect</Classification><DisplayIcon>ImageLib.suspect.png</DisplayIcon></Rule><Rule><State>Hostile</State><Classification>Friendly</Classification><DisplayIcon>ImageLib.friendly.png</DisplayIcon></Rule></ClassificationDisplayRulesType></Value></Attribute></AttributeCollectionType></Value></StateName></StateTableType></Value></Parameter><Parameter><Name>Attributes</Name><Value><AttributeCollectionType><Attribute><Name>OwnerID</Name><Value><StringType>Merchant DM</StringType></Value></Attribute><Attribute><Name>ClassName</Name><Value><StringType>Cargo ship</StringType></Value></Attribute></AttributeCollectionType></Value></Parameter><Parameter><Name>Time</Name><Value><IntegerType>0</IntegerType></Value></Parameter></NewObject>
                         */
                        id = ((StringValue)ev["ID"]).value;
                        o = new SimObject(id);
                        String genus = ((StringValue)ev["ObjectType"]).value;
                        if (genus == "SeaObject" || genus == "AirObject")
                        {
                            //TODO: attrs
                            //-owner
                            //-classname
                            o.Owner = ((StringValue)((AttributeCollectionValue)ev["Attributes"])["OwnerID"]).value;
                            o.ClassName = ((StringValue)((AttributeCollectionValue)ev["Attributes"])["ClassName"]).value;

                            objects.Add(id, o);
                        }
                        else
                        {
                            Console.WriteLine("Didn't store new object data for " + id + ", type = " + genus);
                        }
                        break;
                    case "RevealObject":
                        /*
                         * <RevealObject><Parameter><Name>ObjectID</Name><Value><StringType>7738</StringType></Value></Parameter><Parameter><Name>Attributes</Name><Value><AttributeCollectionType><Attribute><Name>IsWeapon</Name><Value><BooleanType>False</BooleanType></Value></Attribute><Attribute><Name>MaximumSpeed</Name><Value><DoubleType>75</DoubleType></Value></Attribute><Attribute><Name>Size</Name><Value><DoubleType>0</DoubleType></Value></Attribute><Attribute><Name>LaunchDuration</Name><Value><IntegerType>0</IntegerType></Value></Attribute><Attribute><Name>AttackDuration</Name><Value><IntegerType>50000</IntegerType></Value></Attribute><Attribute><Name>DockingDuration</Name><Value><IntegerType>0</IntegerType></Value></Attribute><Attribute><Name>FuelCapacity</Name><Value><DoubleType>0</DoubleType></Value></Attribute><Attribute><Name>FuelAmount</Name><Value><DoubleType>3000</DoubleType></Value></Attribute><Attribute><Name>FuelConsumptionRate</Name><Value><DoubleType>1</DoubleType></Value></Attribute><Attribute><Name>FuelDepletionState</Name><Value><StringType>Dead</StringType></Value></Attribute><Attribute><Name>IconName</Name><Value><StringType>ImageLib.big.png</StringType></Value></Attribute><Attribute><Name>RemoveOnDestruction</Name><Value><BooleanType>True</BooleanType></Value></Attribute><Attribute><Name>InitialTag</Name><Value><StringType></StringType></Value></Attribute><Attribute><Name>LaunchedByOwner</Name><Value><BooleanType>False</BooleanType></Value></Attribute><Attribute><Name>DefaultClassification</Name><Value><StringType></StringType></Value></Attribute><Attribute><Name>DockedToParent</Name><Value><BooleanType>False</BooleanType></Value></Attribute><Attribute><Name>Location</Name><Value><LocationType><X>42200</X><Y>66000</Y><Z>0</Z></LocationType></Value></Attribute><Attribute><Name>State</Name><Value><StringType>FullyFunctional</StringType></Value></Attribute></AttributeCollectionType></Value></Parameter><Parameter><Name>Time</Name><Value><IntegerType>0</IntegerType></Value></Parameter></RevealObject>
                         */
                        id = ((StringValue)ev["ObjectID"]).value;
                        o = objects[id];
                        //TODO: attrs
                        AttributeCollectionValue acv = ev["Attributes"] as AttributeCollectionValue;
                        o.State = ((StringValue)acv["State"]).value;
                        objectMaxSpeeds.Add(id, ((DoubleValue)acv["MaximumSpeed"]).value);
                        if (acv.attributes.ContainsKey("ObjectName"))
                        {
                            String iff = ((StringValue)acv["ObjectName"]).value;
                            if (!iffValues.ContainsKey(id))
                                iffValues.Add(id, iff);
                            else //random edge case, but this did happen
                                iffValues[id] = iff;
                        }
                        else
                        {
                            //no object name is close to suspect
                            suspectObjects.Add(id);
                        }
                        //get max speed
                        break;
                    case "MoveObject":
                        /*
                         * <MoveObject><Parameter><Name>ObjectID</Name><Value><StringType>7738</StringType></Value></Parameter><Parameter><Name>DestinationLocation</Name><Value><LocationType><X>78600</X><Y>104200</Y><Z>0</Z></LocationType></Value></Parameter><Parameter><Name>Throttle</Name><Value><DoubleType>1</DoubleType></Value></Parameter><Parameter><Name>Time</Name><Value><IntegerType>1000</IntegerType></Value></Parameter></MoveObject>
                         */

                        //get throttle, set current speed
                        id = ((StringValue)ev["ObjectID"]).value;
                        double throttle = ((DoubleValue)ev["Throttle"]).value;
                        double maxSpeed = objectMaxSpeeds[id];
                        double speed = throttle * maxSpeed;

                            if (objectSpeeds.ContainsKey(id))
                            {
                                objectSpeeds[id] = speed;
                            }
                            else
                            {
                                objectSpeeds.Add(id, speed);
                            }
                        
                        break;
                    case "ViewProAttributeUpdate":
                        /*
                         * <ViewProAttributeUpdate><Parameter><Name>TargetPlayer</Name><Value><StringType>BAMS DM</StringType></Value></Parameter><Parameter><Name>ObjectID</Name><Value><StringType>7738</StringType></Value></Parameter><Parameter><Name>OwnerID</Name><Value><StringType>Merchant DM</StringType></Value></Parameter><Parameter><Name>Attributes</Name><Value><AttributeCollectionType><Attribute><Name>Location</Name><Value><LocationType><X>38230.7221663048</X><Y>83085.8679033485</Y><Z>0</Z></LocationType></Value></Attribute><Attribute><Name>ID</Name><Value><StringType>7738</StringType></Value></Attribute><Attribute><Name>OwnerID</Name><Value><StringType>Merchant DM</StringType></Value></Attribute><Attribute><Name>CapabilitiesList</Name><Value><StringListType><Value>Surface to air</Value><Value>Surface to surface</Value></StringListType></Value></Attribute><Attribute><Name>DockedObjects</Name><Value><StringListType></StringListType></Value></Attribute><Attribute><Name>MaximumSpeed</Name><Value><DoubleType>75</DoubleType></Value></Attribute><Attribute><Name>CurrentClassification</Name><Value><StringType></StringType></Value></Attribute><Attribute><Name>IconName</Name><Value><StringType>ImageLib.big.png</StringType></Value></Attribute></AttributeCollectionType></Value></Parameter><Parameter><Name>Time</Name><Value><IntegerType>311000</IntegerType></Value></Parameter></ViewProAttributeUpdate>
                         */
                        //hasViewProEvents = true;
                        //look for classifications, or attributes with times
                        id = ((StringValue)ev["ObjectID"]).value;
                        o = objects[id];
                        //TODO: attrs
                        AttributeCollectionValue VPAUacv = (AttributeCollectionValue)ev["Attributes"];
                        
                        break;
                    case "TimeTick":
                        currentTime = ((IntegerValue)ev["Time"]).value; //millis
                        int intTime = currentTime - 60000;
                        if (!itemsByTime.ContainsKey(intTime))
                            continue;
                        List<ItemDefinition> itemsWhoseTimeIsUp = itemsByTime[intTime];
                        if (itemsByTime == null)
                            continue;
                        foreach (ItemDefinition d in itemsWhoseTimeIsUp)
                        {
                            if (d.DM_ID == "")
                            {
                                //need to find DMs assigned to this attack
                                ItemDefinition.ActionDefinition ad = null;
                                int count = 0;
                                while (ad == null && count < d.Actions.Count)
                                {
                                    if (d.Actions[count].Action.Contains("Attack"))
                                        ad = d.Actions[count];
                                    count++;
                                }
                                if (ad != null)
                                {
                                    String stimObj = ad.ObjectID;
                                    if (objectsAssignedTo.ContainsKey(stimObj))
                                    {
                                        foreach (String dmid in objectsAssignedTo[stimObj])
                                        {
                                            if (dmid != String.Empty)
                                            {
                                                if (dmid == "FireScout")
                                                    d.DM_ID = "Firescout DM";
                                                else if (dmid == "BAMS")
                                                    d.DM_ID = "BAMS DM";
                                                else d.DM_ID = dmid;
                                                //itemsToOutput(d);
                                                //                                                outputRows.AddRange(ProcessItem(d, personMap[d.DM_ID], teamMap[d.DM_ID], scenDate, scenarioStart, scenarioEnd));
                                            }
                                            else
                                            {
                                                //without a DM nothing we can do
                                            }
                                        }
                                    }
                                }
                            }
                            else
                            {
                                //itemsToOutput(d);
                                //                                outputRows.AddRange(ProcessItem(d, personMap[d.DM_ID], teamMap[d.DM_ID], scenDate, scenarioStart, scenarioEnd));
                            }
                        }
                        break;
                    case "SEAMATE_ExperimenterLogin":
                        /*
                         * <SEAMATE_ExperimenterLogin>
                             * <Parameter><Name>IndividualID</Name><Value><StringType>291B</StringType></Value></Parameter>
                             * <Parameter><Name>TeamID</Name><Value><StringType>291</StringType></Value></Parameter>
                             * <Parameter><Name>DM_ID</Name><Value><StringType>BAMS DM</StringType></Value></Parameter>
                             * <Parameter><Name>Time</Name><Value><IntegerType>0</IntegerType></Value></Parameter>
                         * </SEAMATE_ExperimenterLogin>
                         */
                        dm = FixDM(((StringValue)ev["DM_ID"]).value);
                        String person = ((StringValue)ev["IndividualID"]).value;
                        String team = ((StringValue)ev["TeamID"]).value;
                        personMap[dm] = person;
                        teamMap[dm] = team;
                        break;
                    case "SEAMATE_StimulusSent":
                        /*
                         * <SEAMATE_StimulusSent>
                             * <Parameter><Name>ItemID</Name><Value><StringType>1</StringType></Value></Parameter>
                             * <Parameter><Name>DM_ID</Name><Value><StringType>BAMS DM</StringType></Value></Parameter>
                             * <Parameter><Name>ObjectID</Name><Value><StringType>2469</StringType></Value></Parameter>
                             * <Parameter><Name>StimulusType</Name><Value><StringType>Reveal</StringType></Value></Parameter>
                             * <Parameter><Name>Time</Name><Value><IntegerType>1000</IntegerType></Value></Parameter>
                         * </SEAMATE_StimulusSent>
                         */
                        dm = FixDM(((StringValue)ev["DM_ID"]).value);
                        itemId = ((StringValue)ev["ItemID"]).value;
                        id = ((StringValue)ev["ObjectID"]).value;
                        action = ((StringValue)ev["StimulusType"]).value;
                        t = ((IntegerValue)ev["Time"]).value;
                        
                        // def = dmAssignedItems[dm];
                        if (dm == String.Empty)
                        {
                            dm = GetAssignedDM(id);
                        }
                        if (action.ToLower().StartsWith("attack"))
                        {//add to previous item for DM 
                            def = FindLastItemForDm(itemId, dm, t);
                            if (objectLastAttackItems.ContainsKey(id))
                            { 
                                
                            }
                        }
                        else
                        {
                            if (!dmAssignedItems.ContainsKey(dm))
                            {
                                def = new ItemDefinition(itemId, dm, t);
                                
                                AddItem(def);
                            }
                            else
                            {
                                if (dmAssignedItems[dm].ContainsKey(t))
                                {
                                    def = dmAssignedItems[dm][t];
                                }
                                else
                                {
                                    def = new ItemDefinition(itemId, dm, t);
                                    dmAssignedItems[dm].Add(t, def);
                                    AddItem(def);
                                }

                            }
                        }
                        if (t != def.Time)
                        {
                            //we have a new item, process old one, unless we do that on TimeTicks.
                        }
                        if (!objectsAssignedTo.ContainsKey(id))
                        {
                            objectsAssignedTo.Add(id, new List<string>());
                        }
                        if (!objectsAssignedTo[id].Contains(dm))
                            objectsAssignedTo[id].Add(dm);
                        
                        if (action.ToLower().StartsWith("attack"))
                        {
                            if (!objectLastAttackItems.ContainsKey(id))
                            {
                                objectLastAttackItems.Add(id, itemId);
                            }
                            else
                            {
                                objectLastAttackItems[id]=itemId;
                            }
                            try
                            {
                                def.Actions.Add(new ItemDefinition.AttackActionDefinition(id, action, t, objectSpeeds[id]));
                            }
                            catch (Exception ex) { }
                        }
                        else
                        {
                            try
                            {
                                def.Actions.Add(new ItemDefinition.ActionDefinition(id, action, objectSpeeds[id]));
                            }
                            catch (Exception ex) { }
                        }
                        break;
                    case "StateChange":

                        break;
                    case "SelfDefenseAttackStarted":
                        dm = ((StringValue)ev["AttackerObjectID"]).value;
                        t = ((IntegerValue)ev["Time"]).value;
                        if (!selfDefenses.ContainsKey(dm))
                        {
                            selfDefenses.Add(dm, new List<int>());
                        }
                        selfDefenses[dm].Add(t);
                        break;

                    case "History_AttackedObjectReport":

                        break;
                    case "AttackSucceeded":

                        break;

                    case "ClientMeasure_ObjectSelected":
                        /*
                         * <ClientMeasure_ObjectSelected><Parameter><Name>ObjectID</Name><Value><StringType>5069</StringType></Value></Parameter><Parameter><Name>UserID</Name><Value><StringType>Firescout DM</StringType></Value></Parameter><Parameter><Name>OwnerID</Name><Value><StringType>Merchant DM</StringType></Value></Parameter><Parameter><Name>Time</Name><Value><IntegerType>3000</IntegerType></Value></Parameter></ClientMeasure_ObjectSelected>
                         */
                        //FIND
                        //hopefully not needed
                        if (hasViewProEvents)
                            continue;
                        //else we need to keep track here
                        id = ((StringValue)ev["ObjectID"]).value;
                        dm = ((StringValue)ev["UserID"]).value;
                        t = ((IntegerValue)ev["Time"]).value;
                        if (ObjectAssignedToDM(id, dm))
                        {
                            UpdateFindTime(id, t);
                        }
                        break;
                    case "ObjectClassificationRequest":
                        /*
                         * <ObjectClassificationRequest>
                             * <Parameter><Name>UserID</Name><Value><StringType>Firescout DM</StringType></Value></Parameter>
                             * <Parameter><Name>ObjectID</Name><Value><StringType>5069</StringType></Value></Parameter>
                             * <Parameter><Name>ClassificationName</Name><Value><StringType>Friendly</StringType></Value></Parameter>
                             * <Parameter><Name>Time</Name><Value><IntegerType>8000</IntegerType></Value></Parameter>
                         * </ObjectClassificationRequest>
                         */
                        //FIX
                        //hopefully not needed
                        if (hasViewProEvents)
                            continue;
                        //else we need to keep track here
                        id = ((StringValue)ev["ObjectID"]).value;
                        dm = ((StringValue)ev["UserID"]).value;
                        t = ((IntegerValue)ev["Time"]).value;
                        String classification = ((StringValue)ev["ClassificationName"]).value;
                        if (ObjectAssignedToDM(id, dm))
                        {
                            UpdateFixTime(id, t, dm, classification);//TODO Set classified as somewhere so we can check correctness
                        }
                        break;
                    case "SEAMATE_TrackAdded":
                        /*
                         * <SEAMATE_TrackAdded>
                             * <Parameter><Name>UserID</Name><Value><StringType>BAMS DM</StringType></Value></Parameter>
                             * <Parameter><Name>ObjectID</Name><Value><StringType>1604</StringType></Value></Parameter>
                             * <Parameter><Name>Time</Name><Value><IntegerType>24000</IntegerType></Value></Parameter>
                         * </SEAMATE_TrackAdded>
                         */
                        //TRACK
                        if (hasViewProEvents)
                            continue;
                        //else we need to keep track here
                        id = ((StringValue)ev["ObjectID"]).value;
                        dm = FixDM(((StringValue)ev["UserID"]).value);
                        t = ((IntegerValue)ev["Time"]).value;
                        if (ObjectAssignedToDM(id, dm))
                        {
                            UpdateTrackTime(id, t);
                        }
                        if (dm.ToLower().Contains("bams"))
                        {
                            bamsAvailableTracks--;
                        }
                        else
                        {
                            firescoutAvailableTracks--;
                        }
                        break;
                    case "AttackObject":
                        /*
                         * <AttackObject>
                             * <Parameter><Name>ObjectID</Name><Value><StringType>BAMS</StringType></Value></Parameter>
                             * <Parameter><Name>TargetObjectID</Name><Value><StringType>5553</StringType></Value></Parameter>
                             * <Parameter><Name>CapabilityName</Name><Value><StringType>Coordinate Strike</StringType></Value></Parameter>
                             * <Parameter><Name>PercentageApplied</Name><Value><IntegerType>0</IntegerType></Value></Parameter>
                             * <Parameter><Name>Time</Name><Value><IntegerType>210000</IntegerType></Value></Parameter>
                         * </AttackObject>
                         */
                        //TARGET
                        if (hasViewProEvents)
                            continue;
                        //else we need to keep track here
                        id = ((StringValue)ev["TargetObjectID"]).value;
                        // dm = id = ((StringValue)ev["UserID"]).value;
                        String attacker = ((StringValue)ev["ObjectID"]).value;
                        dm = FixDM(objects[attacker].Owner);
                        t = ((IntegerValue)ev["Time"]).value;
                        if (ObjectAssignedToDM(id, dm))
                        {
                            UpdateTargetTime(id, t);
                        }
                        break;
                    case "SEAMATE_TrackRemoved":
                        //<SEAMATE_TrackRemoved><Parameter><Name>UserID</Name><Value><StringType>BAMS DM</StringType></Value></Parameter><Parameter><Name>ObjectID</Name><Value><StringType>4257</StringType></Value></Parameter><Parameter><Name>Time</Name><Value><IntegerType>268000</IntegerType></Value></Parameter></SEAMATE_TrackRemoved>
                        id = ((StringValue)ev["ObjectID"]).value;
                        dm = FixDM(((StringValue)ev["UserID"]).value);

                        if (dm.ToLower().Contains("bams"))
                        {
                            bamsAvailableTracks++;
                        }
                        else
                        {
                            firescoutAvailableTracks++;
                        }
                        break;
                }
            }

            List<int> itemTimes = new List<int>();
            foreach (String dmName in dmAssignedItems.Keys)
            {
                foreach (int i in dmAssignedItems[dmName].Keys)
                {
                    if (!itemTimes.Contains(i))
                        itemTimes.Add(i);
                }
            }
            itemTimes.Sort();
            ItemDefinition itemDef;
            foreach (int i in itemTimes)
            {
                foreach (String dmName in dmAssignedItems.Keys)
                {
                    if (dmAssignedItems[dmName].ContainsKey(i))
                    {
                        itemDef = dmAssignedItems[dmName][i];
                        outputRows.AddRange(ProcessItem(itemDef, personMap[itemDef.DM_ID], teamMap[itemDef.DM_ID], scenDate, scenarioStart, scenarioEnd));                        
                    }
                }
            }

            FileStream fs = new FileStream(outputFilePath, FileMode.Create);
            byte[] b;
            ASCIIEncoding encoding = new ASCIIEncoding();
            foreach (String ss in outputRows)
            {
                b = encoding.GetBytes(ss);
                fs.Write(b, 0, b.Length);
            }
            fs.Close();
        }