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