Ejemplo n.º 1
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.º 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 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();
        }