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