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