private void NewObject(SimulationEvent e) { string objectType = ((StringValue)e["ObjectType"]).value; Console.WriteLine(String.Format("Blackboard gets new object; ID: {0}; Type: {1}", ((StringValue)e["ID"]).value, objectType)); SimulationObject ob = SimulationObjectFactory.BuildObject(ref simModel, objectType); ob.attributes["ID"] = e["ID"]; // REFACTOR: I shouldn't actually do this. I should only initialize the values that I own. //AD: I'm populating the values passed in the NewObject event into the SimulationObject foreach (string attname in ((AttributeCollectionValue)e["Attributes"]).attributes.Keys) { ob.attributes[attname] = ((AttributeCollectionValue)e["Attributes"])[attname]; } blackboard.AddObject(ob); // Initialize StateDB objects if (((StringValue)e["ObjectType"]).value == "Team") { StateDB.Team t = new StateDB.Team(((StringValue)e["ID"]).value, ((StringListValue)((AttributeCollectionValue)e["Attributes"]).attributes["TeamHostility"]).strings); StateDB.teams[t.id] = t; } else if (((StringValue)e["ObjectType"]).value == "DecisionMaker") { string teamID = ((StringValue)((AttributeCollectionValue)e["Attributes"]).attributes["TeamMember"]).value; StateDB.DecisionMaker d = new StateDB.DecisionMaker(((StringValue)e["ID"]).value, StateDB.teams.ContainsKey(teamID) ? StateDB.teams[teamID] : null); StateDB.decisionMakers[d.id] = d; } else if (SimUtility.isPhysicalObject(objectType)) { String linkedRegion = ""; if (e.parameters.ContainsKey("LinkedRegion")) { linkedRegion = ((StringValue)e["LinkedRegion"]).value; } StateDB.AddPhysicalObject(((StringValue)e["ID"]).value, objectType, linkedRegion); } }
/* * 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; } } } } }