Ejemplo n.º 1
0
        private void CancelCapabilityAttack(string capabilityName, string attackingObjectID)
        {
            SimulationObjectProxy attacker = objectProxies[attackingObjectID];

            if (attacker == null)
            {
                return;
            }

            List <AttackCollectionValue.AttackValue> attacksToRemove = new List <AttackCollectionValue.AttackValue>();
            AttackCollectionValue currentAttacks = attacker["CurrentAttacks"].GetDataValue() as AttackCollectionValue;

            foreach (AttackCollectionValue.AttackValue av in currentAttacks.GetCurrentAttacks())
            {
                if (av.capabilityName == capabilityName && attackingObjectID == av.attackingObjectId)
                {
                    attacksToRemove.Add(av);
                }
            }

            foreach (AttackCollectionValue.AttackValue av in attacksToRemove)
            {
                RemoveIntensityFromTargetsVulnerability(av.targetObjectId, av.capabilityName, av.appliedIntensity);
                currentAttacks.RemoveAttack(av);
            }

            attacker["CurrentAttacks"].SetDataValue(currentAttacks);
            attacksToRemove.Clear();
        }
Ejemplo n.º 2
0
        private void UpdateAttackTimeWindow(SimulationEvent e)
        {
            string targetObjectId    = ((StringValue)e["TargetObjectID"]).value;
            string attackingObjectId = ((StringValue)e["AttackingObjectID"]).value;
            string capabilityName    = ((StringValue)e["CapabilityName"]).value;
            int    newAttackWindow   = ((IntegerValue)e["NewAttackTimeWindow"]).value;

            //get attacker proxy
            SimulationObjectProxy attacker = objectProxies[attackingObjectId];
            AttackCollectionValue attacks  = attacker["CurrentAttacks"].GetDataValue() as AttackCollectionValue;

            //find engagement between attacker and target
            AttackCollectionValue.AttackValue av = null;
            foreach (AttackCollectionValue.AttackValue att in attacks.GetCurrentAttacksOnTarget(targetObjectId))
            {
                if (att.capabilityName == capabilityName && att.attackingObjectId == attackingObjectId && att.targetObjectId == targetObjectId)
                {
                    av = att;
                    break;
                }
            }

            if (av != null)
            {
                //set the CurrentAttacks time window accordingly
                av.attackTimeWindow = newAttackWindow;

                attacker["CurrentAttacks"].SetDataValue(attacks);
            }
        }
Ejemplo n.º 3
0
        private bool CancelAttack(string attackingObjectID, string targetObjectID, string capabilityName)
        {
            //get attacker proxy
            SimulationObjectProxy attacker = objectProxies[attackingObjectID];

            //find engagement between attacker and target
            AttackCollectionValue attacks = attacker["CurrentAttacks"].GetDataValue() as AttackCollectionValue;
            List <AttackCollectionValue.AttackValue> attacksToRemove = new List <AttackCollectionValue.AttackValue>();

            foreach (AttackCollectionValue.AttackValue att in attacks.GetCurrentAttacksOnTarget(targetObjectID))
            {
                if (att.capabilityName == capabilityName && att.attackingObjectId == attackingObjectID && att.targetObjectId == targetObjectID)
                {
                    //cancel out Transition amount applied for this attack
                    RemoveIntensityFromTargetsVulnerability(targetObjectID, capabilityName, att.appliedIntensity);
                    attacksToRemove.Add(att);
                }
            }

            //for attacker, cancel the attack.
            foreach (AttackCollectionValue.AttackValue atv in attacksToRemove)
            {
                attacks.RemoveAttack(atv);
            }

            attacker["CurrentAttacks"].SetDataValue(attacks);

            return(true);
        }
Ejemplo n.º 4
0
        public void ToXMLTest()
        {
            AttackCollectionValue target = new AttackCollectionValue();

            target.FromXML(LoadableXML);
            string expected = LoadableXML;
            string actual;

            actual = target.ToXML();
            Assert.AreEqual(expected, actual);
        }
Ejemplo n.º 5
0
        public void RemoveAttackTest1()
        {
            AttackCollectionValue target = new AttackCollectionValue();

            target.FromXML(LoadableXML);
            AttackCollectionValue.AttackValue attack = null;
            bool expected = true;
            bool actual;
            int  remainingCapabilityPercentage = 40;

            attack = target.GetCurrentAttacks()[1];
            actual = target.RemoveAttack(attack);
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(remainingCapabilityPercentage, target.GetCurrentAttacks()[1].percentageApplied);
        }
Ejemplo n.º 6
0
        public void RemoveAttackTest()
        {
            AttackCollectionValue target = new AttackCollectionValue();

            target.FromXML(LoadableXML);
            string capabilityName                = "Missile";
            string targetObjectId                = "MyTarget";
            string attackingObjectId             = "MyAttacker";
            int    attackStartTime               = 8;
            int    remainingCapabilityPercentage = 40;
            bool   expected = true;
            bool   actual;

            actual = target.RemoveAttack(capabilityName, targetObjectId, attackingObjectId, attackStartTime);
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(remainingCapabilityPercentage, target.GetCurrentAttacks()[1].percentageApplied);
        }
Ejemplo n.º 7
0
        public void FromXMLTest()
        {
            AttackCollectionValue target = new AttackCollectionValue();
            bool caughtException         = false;

            try
            {
                target.FromXML(LoadableXML);
            }
            catch (System.Exception ex)
            {
                caughtException = true;
            }
            Assert.IsTrue(!caughtException, "Error creating FromXML");
            Assert.IsTrue(target.GetCurrentAttacks().Count == 3, "Incorrect Amount of attacks populated");
            Assert.IsTrue(target.GetCurrentPercentageApplied("Missile") == 100, "Incorrect Percentage Applied for Missile");

            target.FromXML("");
            Assert.IsTrue(target.GetCurrentAttacks().Count == 0, "Incorrect Amount of attacks populated");
            Assert.IsTrue(target.GetCurrentPercentageApplied("Missile") == 0, "Incorrect Percentage Applied for Missile");
        }
Ejemplo n.º 8
0
        public void AddAttackTest()
        {
            AttackCollectionValue target = new AttackCollectionValue();

            AttackCollectionValue.AttackValue attack       = new AttackCollectionValue.AttackValue(8, 5, "MyTarget", "MyAttacker", "Missile", 60, false);
            AttackCollectionValue.AttackValue secondAttack = new AttackCollectionValue.AttackValue(10, 5, "MyTarget", "MyAttacker", "Guns", 80, false);
            AttackCollectionValue.AttackValue thirdAttack  = new AttackCollectionValue.AttackValue(11, 5, "MyTarget", "MyAttacker", "Missile", 60, false);
            string errorMessage         = string.Empty;
            string errorMessageExpected = string.Empty; // TODO: Initialize to an appropriate value
            bool   expected             = true;
            bool   actual;

            //Add Attack 1
            actual = target.AddAttack(attack, out errorMessage);
            Assert.AreEqual(errorMessageExpected, errorMessage);
            Assert.AreEqual(expected, actual);

            //Add Attack 2
            actual = target.AddAttack(secondAttack, out errorMessage);
            Assert.AreEqual(errorMessageExpected, errorMessage);
            Assert.AreEqual(expected, actual);

            //Add Attack 3
            errorMessageExpected = "Applying 40% instead of 60%, as that's all available";
            actual = target.AddAttack(thirdAttack, out errorMessage);
            Assert.AreEqual(errorMessageExpected, errorMessage);
            Assert.AreEqual(expected, actual);

            //Add Attack 4
            AttackCollectionValue.AttackValue fourthAttack = new AttackCollectionValue.AttackValue(12, 5, "MyTarget", "MyAttacker", "Missile", 60, false);
            expected             = false;
            errorMessageExpected = "There is no more available percentage to apply for this capability.  Try again later.";
            actual = target.AddAttack(thirdAttack, out errorMessage);
            Assert.AreEqual(errorMessageExpected, errorMessage);
            Assert.AreEqual(expected, actual);
            string serialized = target.ToXML();

            Assert.AreEqual(serialized, LoadableXML);
        }
Ejemplo n.º 9
0
        public void GetCurrentPercentageAppliedTest()
        {
            AttackCollectionValue target = new AttackCollectionValue();
            string capabilityName        = "Missile";

            target.FromXML(LoadableXML);
            int expected = 100;
            int actual;

            actual = target.GetCurrentPercentageApplied(capabilityName);
            Assert.AreEqual(expected, actual);

            capabilityName = "Guns";
            expected       = 80;
            actual         = target.GetCurrentPercentageApplied(capabilityName);
            Assert.AreEqual(expected, actual);

            capabilityName = "Nonexistant";
            expected       = 0;
            actual         = target.GetCurrentPercentageApplied(capabilityName);
            Assert.AreEqual(expected, actual);
        }
Ejemplo n.º 10
0
        private void CompareNewDMViewWithPrevious(string dm, Dictionary <string, AttributeCollectionValue> singleDMView, ref List <string> recentDiscoveries)
        {
            if (!dmViews.ContainsKey(dm))
            {
                return;
            }
            ObjectsAttributeCollection prevDMView     = dmViews[dm];
            List <string> objectsToRemove             = new List <string>();
            List <string> objectsToAdd                = new List <string>();
            List <string> previouslyNotVisibleObjects = new List <string>();

            foreach (string obj in prevDMView.GetObjectKeys())
            {
                if (!singleDMView.ContainsKey(obj))
                {
                    objectsToRemove.Add(obj);
                }
                if (prevDMView[obj].attributes.ContainsKey("Location"))
                {
                    if (!((LocationValue)((DetectedAttributeValue)prevDMView[obj]["Location"]).value).exists)
                    {
                        previouslyNotVisibleObjects.Add(obj);
                    }
                }
            }
            foreach (string obj in singleDMView.Keys)
            {
                if (!prevDMView.ContainsObject(obj) && singleDMView[obj].attributes.ContainsKey("Location"))
                {
                    objectsToAdd.Add(obj);
                }
            }
            AttributeCollectionValue acv = new AttributeCollectionValue();

            //acv.attributes.Add("ID", new StringValue() as DataValue);
            foreach (string obj in objectsToAdd.ToArray())
            {
                //
                acv = singleDMView[obj]; //singleDMView stores DetectedValues, which need to be
                //stripped before sending to SendVPIO
                if (acv.attributes.ContainsKey("Location"))
                {
                    if (!((LocationValue)((DetectedAttributeValue)acv["Location"]).value).exists)
                    {
                        objectsToRemove.Add(obj);
                        objectsToAdd.Remove(obj);
                        continue;
                    }
                    else
                    {
                        //if (!previouslyNotVisibleObjects.Contains(obj))
                        //    continue;
                        //objectsToAdd.Add(obj);
                        //objectsToRemove.Remove(obj);
                    }
                }
                if (!acv.attributes.ContainsKey("ID"))
                {
                    acv["ID"] = DataValueFactory.BuildDetectedValue(DataValueFactory.BuildString(obj), 100);
                }
                if (!acv.attributes.ContainsKey("OwnerID"))
                {
                    acv["OwnerID"] = DataValueFactory.BuildDetectedValue(objectProxies[obj]["OwnerID"].GetDataValue(), 100);
                }
                SendViewProInitializeObject(dm, ExtractDetectedValuesFromACV(acv));
            }

            foreach (string obj in objectsToRemove)
            {
                SendRemoveObjectEvent(obj, dm);
                prevDMView.RemoveObject(obj);
            }

            bool anyAttributeChanged = false;

            acv = null;

            foreach (string obj in objectsToAdd)
            {
                //AttributeCollectionValue atts = new AttributeCollectionValue(); //prevDMView.UpdateObject(obj, singleDMView[obj]);
                //SendViewProAttributeUpdate(dm, atts);
                prevDMView.UpdateObject(obj, new AttributeCollectionValue());
                if (!movingObjects.Contains(obj))
                {
                    continue;
                }
                if (!activeDMs.Contains(dm))
                {
                    continue;
                }
                if (!recentDiscoveries.Contains(obj))
                {
                    recentDiscoveries.Add(obj);
                }
                //atts["ObjectID"] = DataValueFactory.BuildString(obj);//this is needed as the
                //                                                     //above Update call will
                //                                                     //add "ID", not "ObjectID"
                //SendViewProMotionUpdate(atts);
            }
            foreach (string obj in prevDMView.GetObjectKeys())
            {
                acv = prevDMView.UpdateObject(obj, singleDMView[obj]);
                //add recent tags
                if (recentUnitTags != null)
                {
                    if (recentUnitTags.ContainsKey(obj))
                    {
                        if (recentUnitTags[obj].ContainsKey(dm))
                        {
                            if (acv == null)
                            {
                                acv = new AttributeCollectionValue();
                            }
                            acv.attributes["InitialTag"] = DataValueFactory.BuildString(recentUnitTags[obj][dm]);
                            recentUnitTags[obj].Remove(dm); //remove once the DM has been notified.
                            acv.attributes["ID"]      = DataValueFactory.BuildString(obj);
                            acv.attributes["OwnerID"] = prevDMView[obj]["OwnerID"];
                        }
                    }
                }

                String classification = GetChangedClassificationForDM(obj, dm);
                if (classification != null)
                {
                    if (acv == null)
                    {
                        acv = new AttributeCollectionValue();
                        acv.attributes["ID"]      = DataValueFactory.BuildString(obj);
                        acv.attributes["OwnerID"] = prevDMView[obj]["OwnerID"];
                    }
                    acv.attributes["CurrentClassification"] = DataValueFactory.BuildString(classification);
                }

                if (acv == null)
                {
                    continue;
                }
                if (acv.attributes.ContainsKey("Location"))
                {
                    if (((LocationValue)((DetectedAttributeValue)acv["Location"]).value).exists)
                    {
                        //SendViewProInitializeObject(dm, ExtractDetectedValuesFromACV(prevDMView[obj]));
                    }
                }

                SendViewProAttributeUpdate(dm, acv);
                if (acv.attributes.ContainsKey("OwnerID") && acv.attributes.ContainsKey("CurrentAttacks"))
                {
                    if (((StringValue)((DetectedAttributeValue)acv.attributes["OwnerID"]).value).value == dm)
                    {
                        AttackCollectionValue attacks = (AttackCollectionValue)((DetectedAttributeValue)acv.attributes["CurrentAttacks"]).value;
                        foreach (AttackCollectionValue.AttackValue av in attacks.GetCurrentAttacks())
                        {
                            foreach (Attack a in currentAttacks)
                            {
                                if (a.attacker == av.attackingObjectId && a.target == av.targetObjectId && a.capabilityName == av.capabilityName)
                                {
                                    a.SetTimes(av.attackStartTime, av.attackTimeWindow);
                                }
                            }
                        }
                    }
                }
                if (acv.attributes.ContainsKey("DestinationLocation") ||
                    acv.attributes.ContainsKey("Throttle"))
                {
                    if (!recentDiscoveries.Contains(obj))
                    {
                        recentDiscoveries.Add(obj);
                    }
                    //acv["ObjectID"] = acv["ID"];
                    //SendViewProMotionUpdate(ExtractDetectedValuesFromACV(acv));
                }
                acv = null;
            }
        }
Ejemplo n.º 11
0
        private void TimeTick(SimulationEvent e)
        {
            time = ((IntegerValue)e["Time"]).value;

            DataValue dv = null;

            SimulationObjectProxy targetProx = null;
            Vec3D targetLoc = new Vec3D(0, 0, 0);
            SimulationObjectProxy obProx = null;

            bool   selfDefenseStartAttack;
            string selfDefenseCapability;
            string selfDefenseTargetID;
            Dictionary <string, Dictionary <string, List <AttackCollectionValue.AttackValue> > > currentAttackCollection = new Dictionary <string, Dictionary <string, List <AttackCollectionValue.AttackValue> > >();
            //[ [TargetID]/[ CapabilityUsed]/[List of Attacks] ]
            Dictionary <string, List <AttackCollectionValue.AttackValue> > attacksToRemove = new Dictionary <string, List <AttackCollectionValue.AttackValue> >();

            // [AttackerID]/[List of attacks to remove]
            //as you clean up attacks, add them to this list.  once done iterating over targets, go through this list and update the attacks in the keys.
            foreach (string id in objectProxies.Keys)
            {
                obProx = objectProxies[id];
                //Generate Attack dictionary
                AttackCollectionValue attacks = (AttackCollectionValue)obProx["CurrentAttacks"].GetDataValue();

                foreach (AttackCollectionValue.AttackValue av in attacks.GetCurrentAttacks())
                {
                    if (!currentAttackCollection.ContainsKey(av.targetObjectId))
                    {
                        currentAttackCollection.Add(av.targetObjectId, new Dictionary <string, List <AttackCollectionValue.AttackValue> >());
                    }
                    if (!currentAttackCollection[av.targetObjectId].ContainsKey(av.capabilityName))
                    {
                        currentAttackCollection[av.targetObjectId].Add(av.capabilityName, new List <AttackCollectionValue.AttackValue>());
                    }
                    currentAttackCollection[av.targetObjectId][av.capabilityName].Add(av); //store pointer
                }

                selfDefenseStartAttack = ((BooleanValue)obProx["SelfDefenseStartAttack"].GetDataValue()).value;

                if (selfDefenseStartAttack)
                {
                    selfDefenseCapability = ((StringValue)obProx["SelfDefenseCapability"].GetDataValue()).value;
                    selfDefenseTargetID   = ((StringValue)obProx["SelfDefenseTargetID"].GetDataValue()).value;

                    targetProx = objectProxies[selfDefenseTargetID];

                    if (((AttackCollectionValue)obProx["CurrentAttacks"].GetDataValue()).GetCurrentAttacks().Count == 0 &&
                        ((StringValue)obProx["State"].GetDataValue()).value != "Dead" &&
                        ((StringValue)targetProx["State"].GetDataValue()).value != "Dead")
                    {
                        AttackObject(id, selfDefenseTargetID, selfDefenseCapability, 100, true);
                        if (((StringValue)obProx["AttackState"].GetDataValue()).value == "")
                        {
                            SendSelfDefenseAttackStarted(id, selfDefenseTargetID);
                        }
                    }
                }
            }

            foreach (string targetID in objectProxies.Keys)
            {
                targetProx = objectProxies[targetID];
                string currentState = ((StringValue)objectProxies[targetID]["State"].GetDataValue()).value;
                dv = targetProx["AttackState"].GetDataValue();
                if (((StringValue)dv).value == "BEING_ATTACKED")
                {
                    if (!currentAttackCollection.ContainsKey(targetID))
                    {
                        currentAttackCollection.Add(targetID, new Dictionary <string, List <AttackCollectionValue.AttackValue> >());
                        //this should not happen, or we're in trouble
                    }
                    int capabilitiesCompleted = 0; //this gets incremented as you add to attacksToRemove
                    foreach (String capability in currentAttackCollection[targetID].Keys)
                    {
                        //update attack windows for each attack object?
                        int attackEndTime = -1;
                        foreach (AttackCollectionValue.AttackValue av in currentAttackCollection[targetID][capability])
                        {
                            if (attackEndTime == -1)
                            {
                                attackEndTime = av.attackStartTime + av.attackTimeWindow;
                            }
                            else
                            {
                                attackEndTime = Math.Min(attackEndTime, av.attackStartTime + av.attackTimeWindow);
                            }
                        }
                        int newDuration = attackEndTime - time;
                        foreach (AttackCollectionValue.AttackValue av in currentAttackCollection[targetID][capability])
                        {
                            av.attackTimeWindow = attackEndTime - av.attackStartTime;// newDuration;
                        }

                        //check attack window vs current time
                        if (time >= attackEndTime)
                        {
                            //cleanup if needed

                            //add attacks to remove list

                            foreach (AttackCollectionValue.AttackValue av in currentAttackCollection[targetID][capability])
                            {
                                if (!attacksToRemove.ContainsKey(av.attackingObjectId))
                                {
                                    attacksToRemove.Add(av.attackingObjectId, new List <AttackCollectionValue.AttackValue>());
                                }
                                attacksToRemove[av.attackingObjectId].Add(av);
                            }

                            //check vulnerabilities
                            VulnerabilityValue targetVul = (VulnerabilityValue)targetProx["Vulnerability"].GetDataValue();
                            bool          attackSuccess  = false;
                            List <string> capabilitiesApplied;
                            List <string> attackers = new List <string>();

                            foreach (VulnerabilityValue.Transition t in targetVul.transitions)
                            {
                                foreach (String cap in t.GetAppliedCapabilities())
                                {
                                    if (!currentAttackCollection[targetID].ContainsKey(cap))
                                    {
                                        continue; //workaround for issue at USF; for some reason capability was not added to current attack collection.
                                    }
                                    foreach (AttackCollectionValue.AttackValue val in currentAttackCollection[targetID][cap])
                                    {
                                        string attackerID = val.attackingObjectId;
                                        if (!attackers.Contains(attackerID))
                                        {
                                            attackers.Add(attackerID);
                                        }
                                    }
                                }
                                if (t.ConditionsMet())
                                {
                                    capabilitiesApplied = t.GetAppliedCapabilities();
                                    // Send state change
                                    string          newState = t.state;
                                    SimulationEvent sc       = SimulationEventFactory.BuildEvent(ref simModel, "StateChange");
                                    ((StringValue)sc["ObjectID"]).value = targetID;
                                    ((StringValue)sc["NewState"]).value = newState;
                                    ((IntegerValue)sc["Time"]).value    = time;
                                    distClient.PutEvent(sc);
                                    foreach (string attackerID in attackers)
                                    {
                                        distClient.PutEvent(SimUtility.BuildSystemMessageEvent(ref simModel,
                                                                                               time,
                                                                                               ((StringValue)(objectProxies[attackerID]["OwnerID"].GetDataValue())).value,
                                                                                               attackerID + " has succesfully engaged " + targetID));
                                        distClient.PutEvent(SimUtility.BuildSystemMessageEvent(ref simModel,
                                                                                               time,
                                                                                               ((StringValue)(targetProx["OwnerID"].GetDataValue())).value,
                                                                                               targetID + " has been succesfully engaged by " + attackerID));

                                        ScoringDB.UpdateScore_StateChange(new ScoringDB.ActorFrame(attackerID,
                                                                                                   StateDB.physicalObjects[attackerID].speciesName,
                                                                                                   StateDB.physicalObjects[attackerID].ownerID,
                                                                                                   StateDB.physicalObjects[attackerID].activeRegions),
                                                                          currentState,
                                                                          t.state,
                                                                          new ScoringDB.ActorFrame(targetID,
                                                                                                   StateDB.physicalObjects[targetID].speciesName,
                                                                                                   StateDB.physicalObjects[targetID].ownerID,
                                                                                                   StateDB.physicalObjects[targetID].activeRegions));
                                    }


                                    t.ClearAppliedEffects();

                                    distClient.PutEvent(SimUtility.BuildHistory_AttackedObjectReportEvent(ref simModel,
                                                                                                          time,
                                                                                                          targetID,
                                                                                                          targetLoc,
                                                                                                          true,
                                                                                                          t.state));
                                    distClient.PutEvent(SimUtility.BuildAttackSucceededEvent(ref simModel, time, attackers[0], targetID, newState, capabilitiesApplied));
                                    attackSuccess = true;
                                    break;
                                }
                            }
                            //send messages
                            if (!attackSuccess)
                            {
                                foreach (String attackerID in attackers)
                                {
                                    distClient.PutEvent(SimUtility.BuildSystemMessageEvent(ref simModel,
                                                                                           time,
                                                                                           ((StringValue)(objectProxies[attackerID]["OwnerID"].GetDataValue())).value,
                                                                                           attackerID + " has failed in engagement of " + targetID));
                                    distClient.PutEvent(SimUtility.BuildSystemMessageEvent(ref simModel,
                                                                                           time,
                                                                                           ((StringValue)(targetProx["OwnerID"].GetDataValue())).value,
                                                                                           targetID + " has been unsuccesfully engaged by " + attackerID));
                                }
                                foreach (VulnerabilityValue.Transition t in targetVul.transitions)
                                {
                                    t.ClearAppliedEffects();
                                }

                                distClient.PutEvent(SimUtility.BuildHistory_AttackedObjectReportEvent(ref simModel,
                                                                                                      time,
                                                                                                      targetID,
                                                                                                      targetLoc,
                                                                                                      false,
                                                                                                      ""));
                            }

                            capabilitiesCompleted++;
                            //if there are more capabilities being applied than this one, don't remove target's attack state.
                            if (currentAttackCollection[targetID].Count - capabilitiesCompleted == 0)
                            {// this occurs when all attacks will be removed in this loop
                                dv = targetProx["AttackState"].GetDataValue();
                                ((StringValue)dv).value = "";
                                targetProx["AttackState"].SetDataValue(dv);
                            }
                        }
                    }

                    foreach (string attackerID in attacksToRemove.Keys)
                    {
                        SimulationObjectProxy attackerProxy = objectProxies[attackerID];
                        if (attackerProxy != null)
                        {
                            AttackCollectionValue acv = attackerProxy["CurrentAttacks"].GetDataValue() as AttackCollectionValue;
                            foreach (AttackCollectionValue.AttackValue attackVal in attacksToRemove[attackerID])
                            {
                                if (!acv.RemoveAttack(attackVal))
                                {
                                    acv.RemoveAttack(attackVal.capabilityName, attackVal.targetObjectId, attackVal.attackingObjectId, attackVal.attackStartTime);
                                }
                            }

                            attackerProxy["CurrentAttacks"].SetDataValue(acv);
                            if (((BooleanValue)attackerProxy["IsWeapon"].GetDataValue()).value)
                            {
                                distClient.PutEvent(SimUtility.BuildStateChangeEvent(ref simModel, time, attackerID, "Dead"));
                            }
                        }
                    }

                    if (capabilitiesCompleted > 0)
                    {//some attacks were removed, actually remove them from the currentAttackCollection, update attacker list.
                     //update attack lists (this will require some iteration over the attacks.
                        List <string> attackers = null;
                        dv        = targetProx["AttackerList"].GetDataValue();
                        attackers = ((StringListValue)dv).strings;
                        attackers.Clear();

                        foreach (String capability in currentAttackCollection[targetID].Keys)
                        {
                            foreach (AttackCollectionValue.AttackValue av in currentAttackCollection[targetID][capability])
                            {
                                if (!attackers.Contains(av.attackingObjectId))
                                {
                                    attackers.Add(av.attackingObjectId);
                                }
                            }
                        }

                        ((StringListValue)dv).strings = attackers;
                        targetProx["AttackerList"].SetDataValue(dv);
                    }
                }
            }
        }
Ejemplo n.º 12
0
        private void AttackObject(string attackerID, string targetID, string capabilityName, int percentageApplied, bool isSelfDefense)
        {
            DataValue dv = null;


            //AD Note: on 9/23/09, we decided that Vulnerabilities would now have an "EngagementDuration", which is the Vulnerability
            // version of Capability's "AttackDuration".  If an EngagementDuration exists, it will override a Capability's AttackDuration.

            SimulationObjectProxy attackerProx = objectProxies[attackerID];
            SimulationObjectProxy targetProx   = objectProxies[targetID];

            CapabilityValue    attackerCap = (CapabilityValue)attackerProx["Capability"].GetDataValue();
            VulnerabilityValue targetVul   = (VulnerabilityValue)targetProx["Vulnerability"].GetDataValue();

            // Check to see if this attack can start

            if (((StringValue)attackerProx["AttackState"].GetDataValue()).value == "BEING_ATTACKED")
            {
                distClient.PutEvent(SimUtility.BuildSystemMessageEvent(ref simModel,
                                                                       time,
                                                                       ((StringValue)(attackerProx["OwnerID"].GetDataValue())).value,
                                                                       attackerID + " is being engaged -- it can't initiate an engagement."));

                return;
            }
            if (targetVul.transitions.Count == 0)
            {
                distClient.PutEvent(SimUtility.BuildSystemMessageEvent(ref simModel,
                                                                       time,
                                                                       ((StringValue)(attackerProx["OwnerID"].GetDataValue())).value,
                                                                       attackerID + " can't engage " + targetID + " -- object has no vulnerabilities."));
                return;
            }

            //AD 11/16/2009: New Attack Logic: Allow for partial capabilities to be applied to attacks.

            AttackCollectionValue attackCollection = (AttackCollectionValue)attackerProx["CurrentAttacks"].GetDataValue();
            int attackDuration = -1;

            AttackCollectionValue.AttackValue newAttack = new AttackCollectionValue.AttackValue(time, attackDuration, targetID, attackerID, capabilityName, percentageApplied, isSelfDefense);
            string errMsg = String.Empty;

            attackDuration = ((IntegerValue)attackerProx["AttackDuration"].GetDataValue()).value;
            int  defenseDuration  = ((IntegerValue)targetProx["EngagementDuration"].GetDataValue()).value;
            int  attackTimeWindow = attackDuration;
            bool attackSuccess    = true;

            if (defenseDuration > 0)
            {
                attackTimeWindow = defenseDuration;
            }
            Console.WriteLine("AttackObject: Attack duration for " + attackerID + " is " + attackDuration.ToString());
            Console.WriteLine("AttackObject: Attack duration for attack is " + attackTimeWindow.ToString());
            newAttack.attackTimeWindow = attackTimeWindow;

            if (attackCollection.AddAttack(newAttack, out errMsg) == false)
            {
                string msg = "The attack between " + attackerID + " and " + targetID + " encountered the following problem: " + errMsg;
                distClient.PutEvent(SimUtility.BuildSystemMessageEvent(ref simModel,
                                                                       time,
                                                                       ((StringValue)(attackerProx["OwnerID"].GetDataValue())).value,
                                                                       msg));
                attackSuccess = false;
            }
            else if (errMsg != String.Empty)
            {
                string msg = "The attack between " + attackerID + " and " + targetID + " encountered the following problem: " + errMsg;
                distClient.PutEvent(SimUtility.BuildSystemMessageEvent(ref simModel,
                                                                       time,
                                                                       ((StringValue)(attackerProx["OwnerID"].GetDataValue())).value,
                                                                       msg));
            }
            else //success
            {
                dv = targetProx["AttackState"].GetDataValue();
                ((StringValue)dv).value = "BEING_ATTACKED";
                targetProx["AttackState"].SetDataValue(dv);

                dv = targetProx["AttackerList"].GetDataValue();
                ((StringListValue)dv).strings.Add(attackerID);
                targetProx["AttackerList"].SetDataValue(dv);
            }



            if (!attackSuccess)
            {
                attackerProx["CurrentAttacks"].SetDataValue(attackCollection); //set below if attackSuccess is true
                return;
            }


            //End new attack logic.


            //
            Vec3D  attackerPosition = new Vec3D((LocationValue)attackerProx["Location"].GetDataValue());
            Vec3D  targetPosition   = new Vec3D((LocationValue)targetProx["Location"].GetDataValue());
            double distance         = attackerPosition.ScalerDistanceTo(targetPosition); //FIX find actual diatance

            int appliedIntensity = -1;
            List <CapabilityValue.Effect> capabilities = attackerCap.GetOrderedEffectsByCapability(capabilityName);

            foreach (CapabilityValue.Effect eff in capabilities)
            {
                if (eff.name == capabilityName && distance <= eff.range)
                {
                    int r = random.Next(0, 100);
                    if (r <= ((int)(eff.probability * 100)))
                    {
                        appliedIntensity           = Convert.ToInt32(Math.Round(((double)eff.intensity * (double)newAttack.percentageApplied / 100), MidpointRounding.AwayFromZero));
                        newAttack.appliedIntensity = appliedIntensity;
                        targetVul.ApplyEffect(eff.name, appliedIntensity, distance, ref random);
                    }
                    //break outside of the if because if the probability failed, you dont want a second chance with a different range.
                    break; //break because we only want to apply the first range found that satisfied the distance restraint
                }
            }
            attackerProx["CurrentAttacks"].SetDataValue(attackCollection);
            targetProx["Vulnerability"].SetDataValue((DataValue)targetVul);


            distClient.PutEvent(SimUtility.BuildSystemMessageEvent(ref simModel,
                                                                   time,
                                                                   ((StringValue)(attackerProx["OwnerID"].GetDataValue())).value,
                                                                   attackerID + " has engaged " + targetID));
            distClient.PutEvent(SimUtility.BuildSystemMessageEvent(ref simModel,
                                                                   time,
                                                                   ((StringValue)(targetProx["OwnerID"].GetDataValue())).value,
                                                                   targetID + " has been engaged by " + attackerID));

            distClient.PutEvent(SimUtility.BuildHistory_AttackerObjectReportEvent(ref simModel,
                                                                                  time,
                                                                                  attackerID,
                                                                                  attackerPosition,
                                                                                  targetID,
                                                                                  targetPosition,
                                                                                  capabilityName,
                                                                                  appliedIntensity));
        }
Ejemplo n.º 13
0
        private void ChangeObjectVulnerability(VulnerabilityValue newVulnerabilitySet, string objectID)
        {
            SimulationObjectProxy obj = objectProxies[objectID];

            if (obj == null)
            {
                return;
            }

            VulnerabilityValue previousVulnerabilityValue = obj["Vulnerability"].GetDataValue() as VulnerabilityValue;
            List <string>      previousVulnerabilityNames = new List <string>();

            foreach (VulnerabilityValue.Transition tr in previousVulnerabilityValue.transitions)
            {
                foreach (VulnerabilityValue.TransitionCondition tc in tr.conditions)
                {
                    if (!previousVulnerabilityNames.Contains(tc.capability))
                    {
                        previousVulnerabilityNames.Add(tc.capability);
                    }
                }
            }
            List <string> newVulnerabilityNames = new List <string>();

            foreach (VulnerabilityValue.Transition tr in newVulnerabilitySet.transitions)
            {
                foreach (VulnerabilityValue.TransitionCondition tc in tr.conditions)
                {
                    if (!newVulnerabilityNames.Contains(tc.capability))
                    {
                        newVulnerabilityNames.Add(tc.capability);
                    }
                }
            }
            List <string> missingVulnerabilityNames = new List <string>();

            foreach (string capName in previousVulnerabilityNames)
            {
                if (!newVulnerabilityNames.Contains(capName))
                {
                    if (!missingVulnerabilityNames.Contains(capName))
                    {
                        missingVulnerabilityNames.Add(capName);
                    }
                }
            }
            List <string> attackerList        = ((StringListValue)obj["AttackerList"].GetDataValue()).strings;
            List <string> updatedAttackerList = new List <string>();

            foreach (string attacker in attackerList)
            {
                //get attacker's current attacks
                AttackCollectionValue currentAttacks = objectProxies[attacker]["CurrentAttacks"].GetDataValue() as AttackCollectionValue;
                List <AttackCollectionValue.AttackValue> attacksOnTarget = currentAttacks.GetCurrentAttacksOnTarget(objectID);
                List <AttackCollectionValue.AttackValue> allAttacks      = currentAttacks.GetCurrentAttacks();

                //foreach attack
                foreach (AttackCollectionValue.AttackValue av in attacksOnTarget)
                {
                    if (missingVulnerabilityNames.Contains(av.capabilityName))
                    {
//if this attack is targetting my object with a capability that's in missingVulnerabilities, cancel the attack
                        CancelAttack(attacker, objectID, av.capabilityName);
                    }
                }
                if (allAttacks.Count > attacksOnTarget.Count)
                {
                    updatedAttackerList.Add(attacker);
                }
            }
            obj["AttackerList"].SetDataValue(DataValueFactory.BuildStringList(updatedAttackerList));
            obj["Vulnerability"].SetDataValue(newVulnerabilitySet);
            previousVulnerabilityNames.Clear();
            newVulnerabilityNames.Clear();
        }
Ejemplo n.º 14
0
        public void AttackCollectionValueConstructorTest()
        {
            AttackCollectionValue target = new AttackCollectionValue();

            Assert.IsTrue(target != null, "AttackCollectionValue did not correctly construct the object");
        }
Ejemplo n.º 15
0
        /*
         * private CapabilityValue.Effect FindCapabilityEffect(CapabilityValue cap, VulnerabilityValue vuln)
         * {
         *  List<string> vulnNames = new List<string>();
         *
         *  foreach (VulnerabilityValue.Transition t in vuln.transitions)
         *  {
         *      foreach (VulnerabilityValue.TransitionCondition tc in t.conditions)
         *      {
         *          if (!vulnNames.Contains(tc.capability))
         *          {
         *              vulnNames.Add(tc.capability);
         *          }
         *      }
         *  }
         *
         *  foreach (CapabilityValue.Effect e in cap.effects)
         *  {
         *      if (vulnNames.Contains(e.name))
         *      {
         *          return e;
         *      }
         *  }
         *  return null;
         * }*/

        private void TimeTick(SimulationEvent e)
        {
            if (objectProxies == null)
            {
                objectProxies = bbClient.GetObjectProxies();
            }
            time = ((IntegerValue)e["Time"]).value;

            DataValue dv = null;

            SimulationObjectProxy obProx = null, targetProx = null;

            Vec3D  myLoc;
            Vec3D  targetLoc;
            string targetID;
            bool   isWeapon = false;
            bool   pursueStarted;

            CapabilityValue    capabilities;
            VulnerabilityValue vulnerabilities;

            CapabilityValue.Effect effect;
            double        distance;
            LocationValue location;

            foreach (string id in objectProxies.Keys)
            {
                obProx = objectProxies[id];

                // update the StateDB info

                if (StateDB.physicalObjects[id].ownerID == "")
                {
                    string owner = ((StringValue)obProx["OwnerID"].GetDataValue()).value;
                    if (StateDB.decisionMakers.ContainsKey(owner))
                    {
                        StateDB.physicalObjects[id].ownerID = owner;
                    }
                }

                if (StateDB.physicalObjects[id].speciesName == "")
                {
                    string speciesName = ((StringValue)obProx["ClassName"].GetDataValue()).value;
                    StateDB.physicalObjects[id].speciesName = speciesName;
                }

                if (StateDB.physicalObjects[id].ownerID != "" && StateDB.physicalObjects[id].teamName == "")
                {
                    if (StateDB.decisionMakers[StateDB.physicalObjects[id].ownerID].team != null)
                    {
                        StateDB.physicalObjects[id].teamName = StateDB.decisionMakers[StateDB.physicalObjects[id].ownerID].team.id;
                    }
                }

                if (((StringValue)obProx["AttackState"].GetDataValue()).value == "BEING_ATTACKED")
                {
                    continue;
                }

                AttackCollectionValue attCV = (AttackCollectionValue)obProx["CurrentAttacks"].GetDataValue();
                if (attCV.GetCurrentSelfDefenseAttacks().Count == 0)
                //if (((StringValue)obProx["AttackTargetID"].GetDataValue()).value == "")
                {
                    dv = obProx["SelfDefenseStartAttack"].GetDataValue();
                    ((BooleanValue)dv).value = false;
                    obProx["SelfDefenseStartAttack"].SetDataValue(dv);

                    dv = obProx["SelfDefenseCapability"].GetDataValue();
                    ((StringValue)dv).value = "";
                    obProx["SelfDefenseCapability"].SetDataValue(dv);

                    dv = obProx["SelfDefenseTargetID"].GetDataValue();
                    ((StringValue)dv).value = "";
                    obProx["SelfDefenseTargetID"].SetDataValue(dv);
                }

                if (((BooleanValue)obProx["SelfDefenseStartAttack"].GetDataValue()).value == true)
                {
                    continue;
                }

                isWeapon      = ((BooleanValue)obProx["IsWeapon"].GetDataValue()).value;
                pursueStarted = ((BooleanValue)obProx["PursueStarted"].GetDataValue()).value;
                targetID      = ((StringValue)obProx["PursueTargetID"].GetDataValue()).value;

                capabilities = (CapabilityValue)obProx["Capability"].GetDataValue();

                if (isWeapon && pursueStarted && objectProxies.ContainsKey(targetID))
                {
                    targetProx = objectProxies[targetID];

                    location = (LocationValue)obProx["Location"].GetDataValue();
                    if (!location.exists)
                    {
                        continue;
                    }
                    myLoc = new Vec3D(location);

                    location = (LocationValue)targetProx["Location"].GetDataValue();
                    if (!location.exists)
                    {
                        continue;
                    }
                    targetLoc = new Vec3D(location);

                    distance = myLoc.ScalerDistanceTo(targetLoc);


                    vulnerabilities = (VulnerabilityValue)targetProx["Vulnerability"].GetDataValue();

                    //string cap = FindCapability(capabilities, vulnerabilities);
                    effect = SimUtility.FindCapabilityEffect(capabilities, vulnerabilities);
                    if (effect != null && distance < effect.range)
                    {
                        dv = obProx["SelfDefenseStartAttack"].GetDataValue();
                        ((BooleanValue)dv).value = true;
                        obProx["SelfDefenseStartAttack"].SetDataValue(dv);

                        dv = obProx["SelfDefenseCapability"].GetDataValue();
                        ((StringValue)dv).value = effect.name;
                        obProx["SelfDefenseCapability"].SetDataValue(dv);

                        dv = obProx["SelfDefenseTargetID"].GetDataValue();
                        ((StringValue)dv).value = targetID;
                        obProx["SelfDefenseTargetID"].SetDataValue(dv);
                    }
                    else if (effect == null && distance < 1)
                    {
                        distClient.PutEvent(SimUtility.BuildStateChangeEvent(ref simModel, time, id, "Dead"));
                    }

                    continue;
                }

                string ownerID = ((StringValue)obProx["OwnerID"].GetDataValue()).value;
                if (StateDB.decisionMakers.ContainsKey(ownerID))
                {
                    StateDB.DecisionMaker thisDM  = StateDB.decisionMakers[ownerID];
                    List <string>         targets = ((StringListValue)obProx["TargetsInRange"].GetDataValue()).strings;

                    //if (targets.Count == 0)
                    //{
                    //    continue;
                    //}
                    foreach (string target in targets)
                    {
                        SimulationObjectProxy obProx2 = objectProxies[target];
                        string ownerID2 = ((StringValue)obProx2["OwnerID"].GetDataValue()).value;
                        if (!StateDB.decisionMakers.ContainsKey(ownerID2))
                        {
                            continue;
                        }
                        StateDB.DecisionMaker thatDM = StateDB.decisionMakers[ownerID2];
                        vulnerabilities = (VulnerabilityValue)obProx2["Vulnerability"].GetDataValue();
                        effect          = SimUtility.FindCapabilityEffect(capabilities, vulnerabilities);

                        if (effect != null && thisDM.isHostile(thatDM) && !thisDM.isHuman)
                        {
                            dv = obProx["SelfDefenseStartAttack"].GetDataValue();
                            ((BooleanValue)dv).value = true;
                            obProx["SelfDefenseStartAttack"].SetDataValue(dv);

                            dv = obProx["SelfDefenseCapability"].GetDataValue();
                            ((StringValue)dv).value = effect.name;
                            obProx["SelfDefenseCapability"].SetDataValue(dv);

                            dv = obProx["SelfDefenseTargetID"].GetDataValue();
                            ((StringValue)dv).value = target;
                            obProx["SelfDefenseTargetID"].SetDataValue(dv);
                            break;
                        }
                    }
                }
            }
        }