Example #1
0
        public void ScenarioControllerLoop(IController receiver)
        {
            _receiver = receiver;
            UTM_Mapping.HorizonalMetersPerPixel = 8.49990671075954650f;
            UTM_Mapping.VerticalMetersPerPixel = 8.56718696599567760f;


            try
            {


                while (true)
                {
                    if (DDD_Global.Instance.IsConnected)
                    {
                        List<SimulationEvent> events = DDD_Global.Instance.GetEvents();



                        foreach (SimulationEvent vpEvent in events)
                        {


                            switch (vpEvent.eventType)
                            {
                                case "SimulationTimeEvent":
                                    try
                                    {
                                        receiver.TimeTick(((StringValue)vpEvent.parameters["SimulationTime"]).value);
                                        receiver.SendMapUpdate(false);
                                    }
                                    catch (Exception e)
                                    {
                                        Console.WriteLine(e.StackTrace);
                                        throw new ControllerException(Fmt_ErrorMsg("SimulationTimeEvent", e.Message));
                                    }
                                    break;




                                case "ScoreUpdate":
                                    try
                                    {
                                        if (((StringValue)vpEvent.parameters["DecisionMakerID"]).value == DDD_Global.Instance.PlayerID)
                                        {
                                            string score_name = ((StringValue)vpEvent.parameters["ScoreName"]).value;
                                            double score_value = ((DoubleValue)vpEvent.parameters["ScoreValue"]).value;
                                            receiver.ScoreUpdate(score_name, score_value);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("ScoreUpdate", e.Message));
                                    }
                                    break;




                                case "GameSpeed":
                                    try
                                    {
                                        DDD_Global.Instance.GameSpeed = ((DoubleValue)vpEvent.parameters["SpeedFactor"]).value;
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("GameSpeed", e.Message));
                                    }
                                    break;




                                case "CreateChatRoom":
                                    try
                                    {
                                        string room_name = ((StringValue)vpEvent.parameters["RoomName"]).value;
                                        List<string> membership_list = ((StringListValue)vpEvent.parameters["MembershipList"]).strings;
                                        if (membership_list != null)
                                        {
                                            if (membership_list.Contains(DDD_Global.Instance.PlayerID))
                                            {
                                                if (room_name != null)
                                                {
                                                    if (room_name.Length > 0)
                                                    {
                                                        receiver.CreateChatRoom("chat - " + room_name, room_name, membership_list);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("CreateChatRoom", e.Message));
                                    }
                                    break;




                                case "FailedToCreateChatRoom":
                                    try
                                    {
                                        string message = ((StringValue)vpEvent.parameters["Message"]).value;
                                        string dm_id = ((StringValue)vpEvent.parameters["SenderDM_ID"]).value;
                                        if (message != null)
                                        {
                                            if (dm_id == DDD_Global.Instance.PlayerID)
                                            {
                                                receiver.FailedToCreateChatRoom(message, dm_id);
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("FailedToCreateChatRoom", e.Message));
                                    }
                                    break;




                                case "CloseChatRoom":
                                    try
                                    {
                                        string room_name = ((StringValue)vpEvent.parameters["RoomName"]).value;
                                        if (room_name != null)
                                        {
                                            receiver.CloseChatRoom(room_name);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("CloseChatRoom", e.Message));
                                    }
                                    break;

                                case "CreateWhiteboardRoom":
                                    try
                                    {
                                        string room_name = ((StringValue)vpEvent.parameters["RoomName"]).value;
                                        string senderDM = ((StringValue)vpEvent.parameters["SenderDM_ID"]).value;
                                        List<string> membership_list = ((StringListValue)vpEvent.parameters["MembershipList"]).strings;
                                        if (membership_list != null)
                                        {
                                            if (membership_list.Contains(DDD_Global.Instance.PlayerID))
                                            {
                                                if (room_name != null)
                                                {
                                                    if (room_name.Length > 0)
                                                    {
                                                        receiver.CreateWhiteboardRoom("whiteboard - " + room_name, room_name, membership_list, senderDM);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("CreateWhiteboardRoom", e.Message));
                                    }
                                    break;

                                case "ViewProMotionUpdate":
                                    try
                                    {
                                        if (((StringValue)vpEvent.parameters["ObjectID"]).value != null)
                                        {
                                            _viewpro_motion_update.ObjectId = ((StringValue)vpEvent.parameters["ObjectID"]).value;
                                            _viewpro_motion_update.HideObject = !((LocationValue)vpEvent.parameters["Location"]).exists;
                                            _viewpro_motion_update.Icon = ((StringValue)vpEvent.parameters["IconName"]).value;
                                            _viewpro_motion_update.IsWeapon = ((BooleanValue)vpEvent.parameters["IsWeapon"]).value;

                                            _viewpro_motion_update.Throttle = ((DoubleValue)vpEvent.parameters["Throttle"]).value;
                                            _viewpro_motion_update.MaxSpeed = ((DoubleValue)vpEvent.parameters["MaximumSpeed"]).value;
                                            _viewpro_motion_update.StartX = UTM_Mapping.HorizontalMetersToPixels((float)((LocationValue)vpEvent.parameters["Location"]).X);
                                            _viewpro_motion_update.StartY = UTM_Mapping.VerticalMetersToPixels((float)((LocationValue)vpEvent.parameters["Location"]).Y);
                                            _viewpro_motion_update.StartZ = (int)((LocationValue)vpEvent.parameters["Location"]).Z;
                                            if ((((LocationValue)vpEvent.parameters["DestinationLocation"]).X == 0) && (((LocationValue)vpEvent.parameters["DestinationLocation"]).Y == 0) &&
                                                (((LocationValue)vpEvent.parameters["DestinationLocation"]).Z == 0))
                                            {
                                                _viewpro_motion_update.StartX = _viewpro_motion_update.DestinationX;
                                                _viewpro_motion_update.StartY = _viewpro_motion_update.DestinationY;
                                                _viewpro_motion_update.StartZ = _viewpro_motion_update.DestinationZ;
                                            }
                                            else
                                            {
                                                _viewpro_motion_update.DestinationX = UTM_Mapping.HorizontalMetersToPixels((float)((LocationValue)vpEvent.parameters["DestinationLocation"]).X);
                                                _viewpro_motion_update.DestinationY = UTM_Mapping.VerticalMetersToPixels((float)((LocationValue)vpEvent.parameters["DestinationLocation"]).Y);
                                                _viewpro_motion_update.DestinationZ = (int)((LocationValue)vpEvent.parameters["DestinationLocation"]).Z;
                                            }
                                            receiver.ViewProMotionUpdate(_viewpro_motion_update);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("ViewProMotionUpdate", e.Message));
                                    }
                                    break;




                                case "ViewProInitializeObject":
                                    try
                                    {
                                        if (((StringValue)vpEvent.parameters["ObjectID"]).value != null)
                                        {
                                            _viewpro_motion_update.ObjectId = ((StringValue)vpEvent.parameters["ObjectID"]).value;
                                            _viewpro_motion_update.PlayerId = ((StringValue)vpEvent.parameters["TargetPlayer"]).value;
                                            _viewpro_motion_update.HideObject = !((LocationValue)vpEvent.parameters["Location"]).exists;
                                            _viewpro_motion_update.Icon = ((StringValue)vpEvent.parameters["IconName"]).value;
                                            _viewpro_motion_update.IsWeapon = ((BooleanValue)vpEvent.parameters["IsWeapon"]).value;
                                            _viewpro_motion_update.OwnerID = ((StringValue)vpEvent.parameters["OwnerID"]).value;
                                            _viewpro_motion_update.PlayerColor = ((IntegerValue)vpEvent.parameters["LabelColor"]).value;

                                            if (_viewpro_motion_update.PlayerId == DDD_Global.Instance.PlayerID)
                                            {
                                                _viewpro_motion_update.StartX = UTM_Mapping.HorizontalMetersToPixels((float)((LocationValue)vpEvent.parameters["Location"]).X);
                                                _viewpro_motion_update.StartY = UTM_Mapping.VerticalMetersToPixels((float)((LocationValue)vpEvent.parameters["Location"]).Y);
                                                _viewpro_motion_update.StartZ = (int)((LocationValue)vpEvent.parameters["Location"]).Z;

                                                receiver.ViewProInitializeUpdate(_viewpro_motion_update);
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("ViewProInitializeObject", e.Message + e.StackTrace));
                                    }
                                    break;


                                case "ViewProActiveRegionUpdate":
                                    try
                                    {
                                        string ObjectId = ((StringValue)vpEvent.parameters["ObjectID"]).value;
                                        if (ObjectId != null)
                                        {
                                            int color = ((IntegerValue)vpEvent.parameters["DisplayColor"]).value;
                                            bool visible = ((BooleanValue)vpEvent.parameters["IsVisible"]).value;
                                            List<PolygonValue.PolygonPoint> points = ((PolygonValue)vpEvent.parameters["Shape"]).points;
                                            List<CustomVertex.TransformedColored> pointlist = new List<CustomVertex.TransformedColored>();
                                            foreach (PolygonValue.PolygonPoint point in points)
                                            {
                                                pointlist.Add(new CustomVertex.TransformedColored(UTM_Mapping.HorizontalMetersToPixels((float)point.X), UTM_Mapping.VerticalMetersToPixels((float)point.Y), 1f, 1, color));
                                            }
                                            receiver.ActiveRegionUpdate(ObjectId, visible, color, pointlist);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("ViewProActiveRegionUpdate", e.Message + e.StackTrace));
                                    }
                                    break;


                                case "ViewProAttributeUpdate":
                                    if (receiver is DDD_MainWinFormInterface)
                                    {
                                        while (((DDD_MainWinFormInterface)receiver).IsCanvasReady() == false)
                                        {
                                            Console.WriteLine("Canvas not ready...");
                                            System.Threading.Thread.Sleep(300);
                                        }
                                    }
                                    else
                                    {
                                        Console.WriteLine("receiver isn't win form interface.");
                                    }
                                    try
                                    {
                                        if (((StringValue)vpEvent.parameters["ObjectID"]).value != null)
                                        {
                                            _viewpro_attr_update.ObjectId = ((StringValue)vpEvent.parameters["ObjectID"]).value;
                                            _viewpro_attr_update.PlayerId = ((StringValue)vpEvent.parameters["TargetPlayer"]).value;
                                            _viewpro_attr_update.CapabilityAndWeapons = null;

                                            if (vpEvent.parameters.ContainsKey("Attributes"))
                                            {
                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("State"))
                                                {
                                                    _viewpro_attr_update.State = ((StringValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["State"]).value;
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.State = string.Empty;
                                                }

                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("Throttle"))
                                                {
                                                    _viewpro_attr_update.Throttle = ((DoubleValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["Throttle"]).value;
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.Throttle = -1;
                                                }

                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("IconName"))
                                                {
                                                    _viewpro_attr_update.IconName = ((StringValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["IconName"]).value;
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.IconName = string.Empty;
                                                }

                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("ParentObjectID"))
                                                {
                                                    _viewpro_attr_update.ParentId = ((StringValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["ParentObjectID"]).value;
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.ParentId = string.Empty;
                                                }

                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("ClassName"))
                                                {
                                                    _viewpro_attr_update.ClassName = ((StringValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["ClassName"]).value;
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.ClassName = string.Empty;
                                                }
                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("CurrentClassification"))
                                                {
                                                    _viewpro_attr_update.Classification = ((StringValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["CurrentClassification"]).value;
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.Classification = string.Empty;
                                                }
                                            }

                                            if (_viewpro_attr_update.PlayerId == DDD_Global.Instance.PlayerID)
                                            {
                                                _viewpro_attr_update.OwnerId = ((StringValue)vpEvent.parameters["OwnerID"]).value;

                                                if (vpEvent.parameters.ContainsKey("Attributes"))
                                                {
                                                    List<string> cap_list = new List<string>();
                                                    if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("CapabilitiesList"))
                                                    {
                                                        cap_list = ((StringListValue)((AttributeCollectionValue)vpEvent["Attributes"])["CapabilitiesList"]).strings;
                                                        _viewpro_attr_update.CapabilityAndWeapons = cap_list.ToArray();
                                                    }
                                                    else
                                                    {
                                                        _viewpro_attr_update.CapabilityAndWeapons = null;
                                                    }
                                                    List<string> dock_list = new List<string>();
                                                    if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("DockedObjects"))
                                                    {
                                                        dock_list = ((StringListValue)((AttributeCollectionValue)vpEvent["Attributes"])["DockedObjects"]).strings;
                                                        _viewpro_attr_update.SubPlatforms = dock_list.ToArray();
                                                    }
                                                    else
                                                    {
                                                        _viewpro_attr_update.SubPlatforms = null;
                                                    }
                                                    List<string> vulnerabilities = new List<string>();
                                                    if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("VulnerabilityList"))
                                                    {
                                                        vulnerabilities = ((StringListValue)((AttributeCollectionValue)vpEvent["Attributes"])["VulnerabilityList"]).strings;
                                                        _viewpro_attr_update.Vulnerabilities = vulnerabilities.ToArray();
                                                    }
                                                    else
                                                    {
                                                        _viewpro_attr_update.Vulnerabilities = null;
                                                    }
                                                    List<string> sensors = new List<string>();
                                                    if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("SensorList"))
                                                    {
                                                        sensors = ((StringListValue)((AttributeCollectionValue)vpEvent["Attributes"])["SensorList"]).strings;
                                                        _viewpro_attr_update.Sensors = sensors.ToArray();
                                                    }
                                                    else
                                                    {
                                                        _viewpro_attr_update.Sensors = null;
                                                    }

                                                }

                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("MaximumSpeed"))
                                                {
                                                    _viewpro_attr_update.MaxSpeed = ((DoubleValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["MaximumSpeed"]).value;
                                                }

                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("FuelCapacity"))
                                                {
                                                    _viewpro_attr_update.FuelCapacity = ((DoubleValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["FuelCapacity"]).value;
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.FuelCapacity = -1;
                                                }
                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("FuelAmount"))
                                                {
                                                    _viewpro_attr_update.FuelAmount = ((DoubleValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["FuelAmount"]).value;
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.FuelAmount = -1;
                                                }

                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("CustomAttributes"))
                                                {
                                                    _viewpro_attr_update.CustomAttributes = ((CustomAttributesValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["CustomAttributes"]).attributes;
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.CustomAttributes = null;
                                                }

                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("Location"))
                                                {
                                                    if (((LocationValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"])["Location"]).exists)
                                                    {
                                                        _viewpro_attr_update.LocationX = (int)((LocationValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"])["Location"]).X;
                                                        _viewpro_attr_update.LocationY = (int)((LocationValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"])["Location"]).Y;
                                                        _viewpro_attr_update.LocationZ = (int)((LocationValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"])["Location"]).Z;
                                                    }
                                                    else
                                                    {
                                                        _viewpro_attr_update.LocationX = 0;
                                                        _viewpro_attr_update.LocationY = 0;
                                                        _viewpro_attr_update.LocationZ = 0;
                                                    }
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.LocationX = 0;
                                                    _viewpro_attr_update.LocationY = 0;
                                                    _viewpro_attr_update.LocationZ = 0;
                                                }

                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("InitialTag"))
                                                {
                                                    _viewpro_attr_update.Tag = ((StringValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["InitialTag"]).value;
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.Tag = null;
                                                }

                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("SensorRangeRings"))
                                                {
                                                    Console.WriteLine("Sensor Range Ring received in VPAU");
                                                    //Console.WriteLine("ToString: {0}", ((CustomAttributesValue)((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["SensorRangeRings"]).ToString());
                                                    CustomAttributesValue acv = ((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["SensorRangeRings"] as CustomAttributesValue;
                                                    Console.WriteLine("Sensor Range Ring extracted in VPAU");
                                                    _viewpro_attr_update.SensorRangeRings = new Dictionary<string,RangeRingInfo>();
                                                    foreach (string sensorName in acv.attributes.Keys)
                                                    { 
                                                        //do stuff!
                                                        Console.WriteLine("Sensor '{0}' received in VPAU", sensorName);
                                                       _viewpro_attr_update.SensorRangeRings.Add(sensorName, new RangeRingInfo(acv[sensorName] as RangeRingDisplayValue));
                                                    }
                                                    
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.SensorRangeRings = null;
                                                }

                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("CapabilityRangeRings"))
                                                {
                                                    Console.WriteLine("Capability Range Rings received in VPAU");
                                                    CustomAttributesValue acv = ((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["CapabilityRangeRings"] as CustomAttributesValue;
                                                    _viewpro_attr_update.CapabilityRangeRings = new Dictionary<string, RangeRingInfo>();
                                                    Console.WriteLine("{0} ", ((StringValue)vpEvent.parameters["ObjectID"]).value);
                                                    foreach (string capabilityName in acv.attributes.Keys)
                                                    {
                                                        //do stuff!
                                                        _viewpro_attr_update.CapabilityRangeRings.Add(capabilityName, new RangeRingInfo(acv[capabilityName] as RangeRingDisplayValue));
                                                    }
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.CapabilityRangeRings = null;
                                                }

                                                if (((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes.ContainsKey("VulnerabilityRangeRings"))
                                                {
                                                    Console.WriteLine("Vulnerability Range Rings received in VPAU");
                                                    CustomAttributesValue acv = ((AttributeCollectionValue)vpEvent.parameters["Attributes"]).attributes["VulnerabilityRangeRings"] as CustomAttributesValue;
                                                    _viewpro_attr_update.VulnerabilityRangeRings = new Dictionary<string, RangeRingInfo>();
                                                    Console.WriteLine("{0} ", ((StringValue)vpEvent.parameters["ObjectID"]).value);
                                                    foreach (string vulnerabilityName in acv.attributes.Keys)
                                                    {
                                                        //do stuff!
                                                        _viewpro_attr_update.VulnerabilityRangeRings.Add(vulnerabilityName, new RangeRingInfo(acv[vulnerabilityName] as RangeRingDisplayValue));
                                                    }
                                                }
                                                else
                                                {
                                                    _viewpro_attr_update.VulnerabilityRangeRings = null;
                                                }

                                                receiver.ViewProAttributeUpdate(_viewpro_attr_update);
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("ViewProAttributeUpdate", e.Message));
                                    }
                                    break;




                                case "ViewProStopObjectUpdate":
                                    try
                                    {
                                        receiver.ViewProStopObjectUpdate(((StringValue)vpEvent["ObjectID"]).value);
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("ViewProStopObjectUpdate", e.Message));
                                    }
                                    break;




                                case "ClientRemoveObject":
                                    try
                                    {
                                        if (((StringValue)vpEvent.parameters["TargetPlayer"]).value == DDD_Global.Instance.PlayerID)
                                        {
                                            receiver.RemoveObject(((StringValue)vpEvent.parameters["ObjectID"]).value);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("ClientRemoveObject", e.Message));
                                    }

                                    break;




                                case "TextChat":
                                    try
                                    {
                                        string user_id = ((StringValue)vpEvent.parameters["UserID"]).value;
                                        string target_id = ((StringValue)vpEvent.parameters["TargetUserID"]).value;
                                        string chat_body = ((StringValue)(vpEvent.parameters["ChatBody"])).value;
                                        if ((user_id != null) && (target_id != null))
                                        {
                                            receiver.TextChatRequest(user_id, chat_body, target_id);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("TextChat", e.Message));
                                    }
                                    break;

                                case "WhiteboardLine":
                                    try
                                    {
                                        string object_id = ((StringValue)vpEvent.parameters["ObjectID"]).value;
                                        string user_id = ((StringValue)vpEvent.parameters["UserID"]).value;
                                        string target_id = ((StringValue)vpEvent.parameters["TargetUserID"]).value;
                                        LocationValue start = (LocationValue)vpEvent.parameters["StartLocation"];
                                        LocationValue end = (LocationValue)vpEvent.parameters["EndLocation"];
                                        int mode = ((IntegerValue)(vpEvent.parameters["Mode"])).value;
                                        double width = ((DoubleValue)(vpEvent.parameters["Width"])).value;
                                        double originalScale = ((DoubleValue)(vpEvent.parameters["OriginalScale"])).value;
                                        int color = ((IntegerValue)(vpEvent.parameters["Color"])).value;
                                        string text = ((StringValue)vpEvent.parameters["Text"]).value;
                                        if ((user_id != null) && (target_id != null))
                                        {
                                            receiver.WhiteboardLine(object_id, user_id, mode, start, end, width, originalScale, color, text, target_id);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("Whiteboard", e.Message));
                                    }
                                    break;

                                case "WhiteboardClear":
                                    try
                                    {
                                        string user_id = ((StringValue)vpEvent.parameters["UserID"]).value;
                                        string target_id = ((StringValue)vpEvent.parameters["TargetUserID"]).value;
                                        if ((user_id != null) && (target_id != null))
                                        {
                                            receiver.WhiteboardClear(user_id, target_id);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("Whiteboard", e.Message));
                                    }
                                    break;

                                case "WhiteboardClearAll":
                                    try
                                    {
                                        string user_id = ((StringValue)vpEvent.parameters["UserID"]).value;
                                        string target_id = ((StringValue)vpEvent.parameters["TargetUserID"]).value;
                                        if ((user_id != null) && (target_id != null))
                                        {
                                            receiver.WhiteboardClearAll(user_id, target_id);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("Whiteboard", e.Message));
                                    }
                                    break;

                                case "WhiteboardUndo":
                                    try
                                    {
                                        string object_id = ((StringValue)vpEvent.parameters["ObjectID"]).value;
                                        string user_id = ((StringValue)vpEvent.parameters["UserID"]).value;
                                        string target_id = ((StringValue)vpEvent.parameters["TargetUserID"]).value;
                                        if ((user_id != null) && (target_id != null))
                                        {
                                            receiver.WhiteboardUndo(object_id, user_id, target_id);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("Whiteboard", e.Message));
                                    }
                                    break;

                                case "ClientMeasure_ScreenView":
                                    try
                                    {
                                        string user_id = ((StringValue)vpEvent.parameters["UserID"]).value;
                                        int originX = ((IntegerValue)vpEvent.parameters["Origin-X"]).value;
                                        int originY = ((IntegerValue)vpEvent.parameters["Origin-Y"]).value;
                                        int screenSizeWidth = ((IntegerValue)vpEvent.parameters["ScreenSizeWidth"]).value;
                                        int screenSizeHeight = ((IntegerValue)vpEvent.parameters["ScreenSizeHeight"]).value;
                                        double screenZoom = ((DoubleValue)vpEvent.parameters["ScreenZoom"]).value;
                                        if (user_id != null)
                                        {
                                            receiver.WhiteboardScreenView(user_id, originX, originY, screenSizeWidth, screenSizeHeight, screenZoom);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("Whiteboard", e.Message));
                                    }
                                    break;


                                case "WhiteboardSyncScreenView":
                                    try
                                    {
                                        string user_id = ((StringValue)vpEvent.parameters["UserID"]).value;
                                        string whiteboard_id = ((StringValue)vpEvent.parameters["WhiteboardID"]).value;
                                        string target_id = ((StringValue)vpEvent.parameters["TargetUserID"]).value;
                                        if ((user_id != null) && (target_id != null) & (whiteboard_id != null))
                                        {
                                            receiver.WhiteboardSyncScreenView(user_id, target_id, whiteboard_id);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("Whiteboard", e.Message));
                                    }
                                    break;

                                case "HandshakeAvailablePlayers":
                                    try
                                    {
                                        if (((StringValue)vpEvent.parameters["TargetTerminalID"]).value == DDD_Global.Instance.TerminalID && DDD_Global.Instance.HasAuthenticated)
                                        {

                                            StringListValue s = vpEvent.parameters["AvailablePlayers"] as StringListValue;
                                            DDD_Global.Instance.DM_List = ((StringListValue)vpEvent.parameters["Players"]).strings;
                                            if (s != null)
                                            {
                                                if (s.strings.Count > 0)
                                                {
                                                    receiver.HandshakeAvailablePlayers(s.strings.ToArray());
                                                }
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("HandshakeAvailablePlayers", e.Message));
                                    }
                                    break;




                                case "HandshakeInitializeGUI":
                                    try
                                    {
                                        if (((StringValue)vpEvent.parameters["TerminalID"]).value == DDD_Global.Instance.TerminalID)
                                        {
                                            UTM_Mapping.HorizonalMetersPerPixel = (float)(((DoubleValue)vpEvent.parameters["HorizontalPixelsPerMeter"]).value);
                                            UTM_Mapping.VerticalMetersPerPixel = (float)(((DoubleValue)vpEvent.parameters["VerticalPixelsPerMeter"]).value);
                                            DDD_Global.Instance.PlayerID = ((StringValue)vpEvent.parameters["PlayerID"]).value;
                                            DDD_Global.Instance.ImageLibrary = ((StringValue)vpEvent.parameters["IconLibrary"]).value;
                                            DDD_Global.Instance.MapName = ((StringValue)vpEvent.parameters["MapName"]).value;
                                            DDD_Global.Instance.MapLocation = string.Format("{0}\\MapLib\\{1}", DDD_Global.Instance.DDDClientShareFolder, DDD_Global.Instance.MapName);
                                            DDD_Global.Instance.ScenarioName = ((StringValue)vpEvent.parameters["ScenarioName"]).value;
                                            DDD_Global.Instance.ScenarioDescription = ((StringValue)vpEvent.parameters["ScenarioDescription"]).value;
                                            DDD_Global.Instance.PlayerBrief = ((StringValue)vpEvent.parameters["PlayerBrief"]).value;
                                            //DDD_Global.Instance.VoiceServerHostname = ((StringValue)vpEvent.parameters["VoiceChatServerName"]).value;
                                            DDD_Global.Instance.VoiceServerHostname = _HostName;
                                            DDD_Global.Instance.VoiceServerPort = ((IntegerValue)vpEvent.parameters["VoiceChatServerPort"]).value;
                                            DDD_Global.Instance.ConaitoServerPassword = ((StringValue)vpEvent.parameters["VoiceChatUserPassword"]).value;
                                            DDD_Global.Instance.VoiceChatEnabled = ( ( BooleanValue )vpEvent.parameters["VoiceChatEnabled"] ).value;
                                            DDD_Global.Instance.IsObserver = ((BooleanValue)vpEvent.parameters["IsObserver"]).value;
                                            DDD_Global.Instance.IsForkReplay = ((BooleanValue)vpEvent.parameters["IsForkReplay"]).value;
                                            if (vpEvent.parameters.ContainsKey("DefaultDisplayLabels"))
                                            {
                                                String val = ((StringValue)vpEvent.parameters["DefaultDisplayLabels"]).value;
                                                ((DDD_MainWinFormInterface)receiver).toggleDisplayLabels(val);

                                            }
                                            if (vpEvent.parameters.ContainsKey("DefaultDisplayTags"))
                                            {
                                                String val = ((StringValue)vpEvent.parameters["DefaultDisplayTags"]).value;
                                                ((DDD_MainWinFormInterface)receiver).toggleTagDisplay(val);
                                            }

                                            System.Console.WriteLine( "DDD_Global.Instance.VoiceChatEnabled = {0}", DDD_Global.Instance.VoiceChatEnabled );

                                            receiver.HandshakeInitializeGUI();
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("HandshakeInitializeGUI", e.Message));
                                    }
                                    break;

                                case "HandshakeInitializeGUIDone":
                                    //This is when another user joins, we need to send them our current screen coords
                                    if (((StringValue)vpEvent.parameters["PlayerID"]).value != DDD_Global.Instance.PlayerID)
                                    {
                                        try
                                        {
                                            receiver.SendMapUpdate(true);
                                        }
                                        catch (Exception e)
                                        {
                                            throw new ControllerException(Fmt_ErrorMsg("HandshakeInitializeGUIDone", e.Message));
                                        }
                                    }
                                    break;
                                case "PauseScenario":
                                    receiver.PauseScenario();
                                    break;

                                case "ResumeScenario":
                                    receiver.ResumeScenario();
                                    break;
                                case "StopScenario":
                                    receiver.StopScenario();
                                    break;
                                case "StopReplay":
                                    receiver.StopReplay();
                                    break;



                                case "ViewProAttackUpdate":
                                    try
                                    {
                                        receiver.AttackUpdate(((StringValue)vpEvent.parameters["AttackerID"]).value,
                                                                                        ((StringValue)vpEvent.parameters["TargetID"]).value,
                                                                                        ((IntegerValue)vpEvent.parameters["Time"]).value,
                                                                                        ((IntegerValue)vpEvent.parameters["AttackEndTime"]).value);
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("ViewProAttackUpdate", e.Message));
                                    }
                                    break;




                                case "AuthenticationResponse":
                                    try
                                    {
                                        bool authentication_result = ((BooleanValue)vpEvent.parameters["Success"]).value;
                                        string message = ((StringValue)vpEvent.parameters["Message"]).value;
                                        string terminal_id = ((StringValue)vpEvent.parameters["TerminalID"]).value;
                                        if (terminal_id == DDD_Global.Instance.TerminalID)
                                        {
                                            if (message == null)
                                            {
                                                message = string.Empty;
                                            }
                                            if (authentication_result)
                                            {
                                                DDD_Global.Instance.HasAuthenticated = true;
                                            }
                                            receiver.AuthenticationResponse(authentication_result, message);
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new Exception(Fmt_ErrorMsg("AuthenticationResponse", e.Message));
                                    }
                                    break;





                                case "SystemMessage":
                                    try
                                    {
                                        if (((StringValue)vpEvent.parameters["PlayerID"]).value != null)
                                        {
                                            if (((StringValue)vpEvent.parameters["PlayerID"]).value == DDD_Global.Instance.PlayerID)
                                            {
                                                receiver.SystemMessageUpdate(((StringValue)vpEvent["Message"]).value, ((IntegerValue)vpEvent["TextColor"]).value);
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("SystemMessage", e.Message));
                                    }
                                    break;

                                case "TransferObject":
                                    try
                                    {
                                        if (((StringValue)vpEvent.parameters["UserID"]).value != null 
                                            && ((StringValue)vpEvent.parameters["DonorUserID"]).value != null)
                                        {
                                            if (((StringValue)vpEvent.parameters["DonorUserID"]).value == DDD_Global.Instance.PlayerID)
                                            {
                                                receiver.TransferObjectToOther(((StringValue)vpEvent.parameters["ObjectID"]).value);
                                            }
                                            else if (((StringValue)vpEvent.parameters["UserID"]).value == DDD_Global.Instance.PlayerID)
                                            {
                                                receiver.TransferObjectToMe(((StringValue)vpEvent.parameters["ObjectID"]).value);
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("TransferObject", e.Message));
                                    }
                                    break;
                                case "ClientSideAssetTransferAllowed":
                                    try
                                    {
                                        DDD_Global.Instance.AssetTransferEnabled = ((BooleanValue)vpEvent["EnableAssetTransfer"]).value;
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("ClientSideAssetTransferAllowed", e.Message));
                                    }
                                    break;

                                case "CreateVoiceChannel":
                                    try
                                    {
                                        if ( receiver is IVoiceClientController )
                                        {
                                            string strChannelName = ((StringValue)vpEvent["ChannelName"]).value;
                                            List<string> astrMembershipList = ( ( StringListValue )vpEvent.parameters["MembershipList"] ).strings;
                                            if ( astrMembershipList != null )
                                            {
                                                if ( astrMembershipList.Contains( DDD_Global.Instance.PlayerID ) )
                                                {
                                                    if ( strChannelName.Length > 0 )
                                                    {
                                                        DDD_Global.Instance.VoiceChannels[strChannelName] = astrMembershipList;
                                                        ( ( IVoiceClientController )receiver ).NotifyCreatedVoiceChannel( strChannelName, astrMembershipList );
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    catch ( Exception e )
                                    {
                                        throw new ControllerException( Fmt_ErrorMsg( "CreateVoiceChannel", e.Message ) );
                                    }
                                    break;
                                case "CloseVoiceChannel":
                                    try
                                    {
                                        if ( receiver is IVoiceClientController )
                                        {
                                            string strChannelName = ( ( StringValue )vpEvent["ChannelName"] ).value;
                                            if ( strChannelName.Length > 0 )
                                            {
                                                if (DDD_Global.Instance.VoiceChannels.ContainsKey(strChannelName))
                                                {
                                                    DDD_Global.Instance.VoiceChannels.Remove(strChannelName);
                                                }
                                                ( ( IVoiceClientController )receiver ).NotifyClosedVoiceChannel( strChannelName );
                                            }
                                        }
                                    }
                                    catch ( Exception e )
                                    {
                                        throw new ControllerException( Fmt_ErrorMsg( "CloseVoiceChannel", e.Message ) );
                                    }
                                    break;

                                case "JoinVoiceChannel":
                                    try
                                    {
                                        if ( receiver is IVoiceClientController )
                                        {
                                            // Check to see if it's my event, otherwise ignore it
                                            if ( 0 == DDD_Global.Instance.PlayerID.CompareTo( ( ( StringValue )vpEvent["DecisionMakerID"] ).value ) )
                                            {
                                                string strChannelName = ( ( StringValue )vpEvent["ChannelName"] ).value;
                                                if ( strChannelName.Length > 0 )
                                                {
                                                    ( ( IVoiceClientController )receiver ).NotifyJoinVoiceChannel( strChannelName );
                                                }
                                            }
                                        }
                                    }
                                    catch ( Exception e )
                                    {
                                        throw new ControllerException( Fmt_ErrorMsg( "JoinVoiceChannel", e.Message ) );
                                    }
                                    break;

                                case "LeaveVoiceChannel":
                                    try
                                    {
                                        if ( receiver is IVoiceClientController )
                                        {
                                            // Check to see if it's my event, otherwise ignore it
                                            if ( 0 == DDD_Global.Instance.PlayerID.CompareTo( ( ( StringValue )vpEvent["DecisionMakerID"] ).value ) )
                                            {
                                                string strChannelName = ( ( StringValue )vpEvent["ChannelName"] ).value;
                                                if ( strChannelName.Length > 0 )
                                                {
                                                    ( ( IVoiceClientController )receiver ).NotifyLeaveVoiceChannel( strChannelName );
                                                }
                                            }
                                        }
                                    }
                                    catch ( Exception e )
                                    {
                                        throw new ControllerException( Fmt_ErrorMsg( "LeaveVoiceChannel", e.Message ) );
                                    }
                                    break;

                                case "StartedTalking":
                                    try
                                    {
                                        if (receiver is IVoiceClientController)
                                        {
                                            string strUsername = ((StringValue)vpEvent["Speaker"]).value;
                                            string strChannelName = ((StringValue)vpEvent["ChannelName"]).value;
                                            if (strChannelName.Length > 0)
                                            {
                                                ((IVoiceClientController)receiver).NotifyStartedTalking(strUsername, strChannelName);
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("StartedTalking", e.Message));
                                    }
                                    break;
                                case "PlayVoiceMessage":
                                    break;
                                case "StoppedTalking":
                                    try
                                    {
                                        if (receiver is IVoiceClientController)
                                        {
                                            string strUsername = ((StringValue)vpEvent["Speaker"]).value;
                                            string strChannelName = ((StringValue)vpEvent["ChannelName"]).value;
                                            if (strChannelName.Length > 0)
                                            {
                                                ((IVoiceClientController)receiver).NotifyStoppedTalking(strUsername, strChannelName);
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("StoppedTalking", e.Message));
                                    }
                                    break;
                                case "MuteUser":
                                    try
                                    {
                                        if (receiver is IVoiceClientController)
                                        {
                                            string strUsername = ((StringValue)vpEvent["Speaker"]).value;
                                            string strChannelName = ((StringValue)vpEvent["ChannelName"]).value;
                                            if (strChannelName.Length > 0)
                                            {
                                                ((IVoiceClientController)receiver).NotifyMuteUser(strUsername, strChannelName);
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("MuteUser", e.Message));
                                    }
                                    break;
                                case "UnmuteUser":
                                    try
                                    {
                                        if (receiver is IVoiceClientController)
                                        {
                                            string strUsername = ((StringValue)vpEvent["Speaker"]).value;
                                            string strChannelName = ((StringValue)vpEvent["ChannelName"]).value;
                                            if (strChannelName.Length > 0)
                                            {
                                                ((IVoiceClientController)receiver).NotifyUnmuteUser(strUsername, strChannelName);
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("UnmuteUser", e.Message));
                                    }
                                    break;
                                case "ForkReplayStarted":
                                    DDD_Global.Instance.IsForkReplay = true;
                                    break;
                                case "ForkReplayFinished":
                                    DDD_Global.Instance.IsForkReplay = false;
                                    break;
                                case "InitializeClassifications":
                                    //Time, Classifications
                                    try
                                    {
                                        List<String> classificationEnumeration = ((StringListValue)vpEvent["Classifications"]).strings;
                                        receiver.SetClassifications(classificationEnumeration);                                        
                                    }
                                    catch (Exception e)
                                    {
                                        throw new ControllerException(Fmt_ErrorMsg("UnmuteUser", e.Message));
                                    }
                                    break;

                                default:
                                    break;
                            }
                        }
                        System.Threading.Thread.Sleep(100); //control this loop so it doesn't chew through processor cycles
                    }
                    else
                    {
                        if (InformServerDisconnect || DemoEvents == null)
                        {
                            // TBD - through server lost exception.
                            throw new ServerDisconnectException("The client and server have been disconnected.");
                        }
                        lock (this)
                        {
                            foreach (SimulationEvent vpEvent in DemoEvents)
                            {
                                switch (vpEvent.eventType)
                                {
                                    case "TimeTick":
                                        break;

                                    case "MoveObjectRequest":
                                        if (((StringValue)vpEvent.parameters["ObjectID"]).value != null)
                                        {
                                            _viewpro_motion_update.ObjectId = ((StringValue)vpEvent.parameters["ObjectID"]).value;
                                            _viewpro_motion_update.DestinationX = UTM_Mapping.HorizontalMetersToPixels((float)((LocationValue)vpEvent.parameters["DestinationLocation"]).X);
                                            _viewpro_motion_update.DestinationY = UTM_Mapping.VerticalMetersToPixels((float)((LocationValue)vpEvent.parameters["DestinationLocation"]).Y);
                                            _viewpro_motion_update.DestinationZ = (int)((LocationValue)vpEvent.parameters["DestinationLocation"]).Z;
                                            _viewpro_motion_update.StartX = _viewpro_motion_update.DestinationX;
                                            _viewpro_motion_update.StartY = _viewpro_motion_update.DestinationY;
                                            _viewpro_motion_update.StartZ = _viewpro_motion_update.DestinationZ;
                                            _viewpro_motion_update.Throttle = ((DoubleValue)vpEvent.parameters["Throttle"]).value;
                                            _viewpro_motion_update.Icon = "F16";

                                            receiver.ViewProMotionUpdate(_viewpro_motion_update);
                                        }
                                        break;


                                    case "ClientAttackRequest":
                                        if (((StringValue)vpEvent.parameters["AttackingObjectID"]).value != null)
                                        {
                                            receiver.AttackUpdate(((StringValue)vpEvent.parameters["AttackingObjectID"]).value,
                                                ((StringValue)(vpEvent.parameters["TargetObjectID"])).value, 10000, 20000);
                                        }

                                        break;

                                    case "TextChatRequest":
                                        receiver.TextChatRequest(((StringValue)vpEvent.parameters["UserID"]).value,
                                            ((StringValue)(vpEvent.parameters["ChatBody"])).value,
                                            ((StringValue)(vpEvent.parameters["TargetUserID"])).value);
                                        break;


                                }
                            }
                            DemoEvents.Clear();
                        }
                    }
                }
            }
            catch (ControllerException controller_exception)
            {
                System.Windows.Forms.MessageBox.Show(controller_exception.Message, "Controller Exception");
                DisconnectDecisionMaker(DDD_Global.Instance.PlayerID);
                return;
            }
            catch (ServerDisconnectException server_disconnect)
            {
                System.Windows.Forms.MessageBox.Show(server_disconnect.Message, "Network Warning");
                DisconnectDecisionMaker(DDD_Global.Instance.PlayerID);
                return;
            }
            catch (System.Threading.ThreadInterruptedException)
            {
                DisconnectDecisionMaker(DDD_Global.Instance.PlayerID);
                return;
            }
            catch (System.Threading.ThreadAbortException)
            {
                DisconnectDecisionMaker(DDD_Global.Instance.PlayerID);
                return;
            }
            catch (Exception exception)
            {
                DisconnectDecisionMaker(DDD_Global.Instance.PlayerID);
                return;
            }

            
        }