public override double computeUtility(Person voter, VoteOption option,List<ReasonMsg> msgs) { double u = option.getBaseUtility(voter); double ourStrength = society.currentMilitary; double theirStrength = option.group.currentMilitary; double localU = 0; //1 if we're 100% of the balance, -1 if they are double relativeStrength = (ourStrength - theirStrength) / (ourStrength + theirStrength); //Don't just always attack the weakest, it causes blobbing. Check military to avoid suicide charges, but attack should be modulated by threat //As such, this modifier only applies when its negative (aversion to attacking stronger targets) localU = society.map.param.utility_militaryTargetRelStrengthOffensive*relativeStrength; if (localU < 0) { msgs.Add(new ReasonMsg("Relative Strength of Current Militaries", localU)); u += localU; } //We want to expand into territory we already partially own bool hasMyTerritory = false; foreach (Location loc in option.group.lastTurnLocs) { if (loc.province == voter.getLocation().province) { hasMyTerritory = true; break; } } if (hasMyTerritory) { localU = society.map.param.utility_militaryTargetCompleteProvince; msgs.Add(new ReasonMsg("Has territory from my province", localU)); u += localU; } bool hasOurTerritory = false; foreach (Location loc in option.group.lastTurnLocs) { foreach (Location l2 in society.lastTurnLocs) { if (loc.province == l2.province) { hasOurTerritory = true; } } } //We want to own more land. Invade weak neighbours bool shouldExpand = true; int nDukes = 0; foreach (Title t in society.titles) { if (t is Title_ProvinceRuler) { nDukes += 1; } } if (nDukes >= society.map.param.society_maxDukes) { shouldExpand = false; } if (shouldExpand && option.group is Society && option.group.currentMilitary*1.5 < this.society.currentMilitary && option.group.getNeighbours().Contains(this.society)) { //Society soc = (Society)option.group; //if (this.society.getCapital() != null && soc.getCapital() != null) //{ // if (soc.getCapital().hex.getHabilitability() > 0.5) // { localU = society.map.param.utility_militaryTargetExpansion; msgs.Add(new ReasonMsg("Expand our holdings", localU)); u += localU; // } //} } foreach (ThreatItem threat in voter.threatEvaluations) { if (threat.group == option.group) { localU = threat.threat*society.map.param.utility_fromThreat; msgs.Add(new ReasonMsg("Perceived Threat", localU)); u += localU; break; } } //If we already have a military target if (society.offensiveTarget != null) { theirStrength = society.offensiveTarget.currentMilitary; localU = 0; //1 if we're 100% of the balance, -1 if they are relativeStrength = (ourStrength - theirStrength) / (ourStrength + theirStrength); if (relativeStrength > 0) { relativeStrength = 0; } //Add current target threat foreach (ThreatItem threat in voter.threatEvaluations) { if (threat.group == society.offensiveTarget) { localU -= threat.threat; break; } } //We want to expand into territory we already partially own hasOurTerritory = false; foreach (Location loc in society.offensiveTarget.lastTurnLocs) { if (loc.province == voter.getLocation().province) { hasOurTerritory = true; break; } } if (hasOurTerritory) { localU -= society.map.param.utility_militaryTargetCompleteProvince; } localU -= society.map.param.utility_militaryTargetRelStrengthOffensive * relativeStrength; msgs.Add(new ReasonMsg("Desirability of current target (" + society.offensiveTarget.getName() + ")", localU)); u += localU; } return u; }
public ThreatItem(Map map, Person parent) { this.map = map; this.p = parent; }
public VoteIssue_SetOffensiveTarget(Society soc,Person proposer) : base(soc,proposer) { }
public void add(Person key, RelObj value) { keys.Add(key); values.Add(value); }
public bool ContainsKey(Person key) { return(keys.Contains(key)); }
public void Add(Person key, RelObj value) { add(key, value); }
public override double computeUtility(Person p, VoteOption option, List <ReasonMsg> msgs) { double u = option.getBaseUtility(p); double concernLevel = p.threat_agents.threat; //curr 0 to 200 concernLevel += (100 * p.awareness) + (100 * p.map.worldPanic); //0 to 400 concernLevel /= 4; concernLevel = Math.Min(concernLevel, (p.map.worldPanic * 100) + 20); concernLevel *= (1 - p.shadow); if (p.state == Person.personState.enthralled || p.state == Person.personState.broken) { concernLevel = 0; } //Define the range at which this manner of response is appropriate double responseLevelMin = 0; double responseLevelMax = 0; if (option.index == DEFEND_PROVINCE) { responseLevelMin = 10; responseLevelMax = 40; int evidenceFound = 0; foreach (Evidence ev in foundEvidence) { if (ev.locationFound.province.index == option.province) { evidenceFound += 1; } } double localU = World.staticMap.param.utility_defendEvidenceProvince * evidenceFound * (1 - p.shadow); msgs.Add(new ReasonMsg("Amount of evidence found in " + society.map.provinces[option.province].name + " province", localU)); u += localU; localU = 0; foreach (Person person in society.people) { if (person.getLocation() != null && person.getLocation().province.index == option.province) { localU += p.getRelation(person.index).getLiking() * World.staticMap.param.utility_agentDefendProvinceLikingMult; } } string add = ""; msgs.Add(new ReasonMsg("Liking for nobles in province" + add, localU)); u += localU; if (p.getLocation().province.index != option.province) { localU = p.getSelfInterest() * p.threat_agents.threat * World.staticMap.param.utility_selfInterestFromThreat; if (localU != 0) { msgs.Add(new ReasonMsg("Does not help me personally", localU)); u += localU; } } else { localU = -1 * p.getSelfInterest() * p.threat_agents.threat * World.staticMap.param.utility_selfInterestFromThreat; if (localU != 0) { msgs.Add(new ReasonMsg("Helps me personally", localU)); u += localU; } } } if (option.index == NATIONWIDE_SECURITY) { responseLevelMin = 10; responseLevelMax = 40; double localU = World.staticMap.param.utility_evidenceResonseBaseline * (concernLevel / 100); msgs.Add(new ReasonMsg("Base Desirability", localU)); u += localU; localU = p.getSelfInterest() * p.threat_agents.threat * World.staticMap.param.utility_selfInterestFromThreat / 2; if (localU != 0) { msgs.Add(new ReasonMsg("Doesn't maximise my provinces' defences", localU)); u += localU; } } if (option.index == NO_RESPONSE) { responseLevelMin = 0; responseLevelMax = 10; if (p.getGreatestThreat() != null && p.getGreatestThreat() != p.threat_agents) { double localU = World.staticMap.param.utility_greatestThreatDelta * 0.5; msgs.Add(new ReasonMsg("Not our greatest threat", localU)); u += localU; } else { double localU = -World.staticMap.param.utility_greatestThreatDelta; msgs.Add(new ReasonMsg("Dark Agents are our greatest threat", localU)); u += localU; } } if (option.index == EXPELL_ALL_FOREIGN_AGENTS) { responseLevelMin = 75; responseLevelMax = 100; double n = 0; foreach (Unit unit in society.map.units) { if (unit.society == society) { continue; } if (society.enemies.Contains(unit) == false) { n += 1; } } if (n > 0) { msgs.Add(new ReasonMsg("So many potential enemies!", concernLevel)); u += concernLevel; } } if (option.index == LOCKDOWN_PROVINCE) { responseLevelMin = 40; responseLevelMax = 100; int evidenceFound = 0; foreach (Evidence ev in foundEvidence) { if (ev.locationFound.province.index == option.province) { evidenceFound += 1; } } double localU = World.staticMap.param.utility_defendEvidenceProvince * evidenceFound * (1 - p.shadow); msgs.Add(new ReasonMsg("Amount of evidence found in " + society.map.provinces[option.province].name + " province", localU)); u += localU; localU = 0; foreach (Person person in society.people) { if (person.getLocation() != null && person.getLocation().province.index == option.province) { localU += p.getRelation(person.index).getLiking() * World.staticMap.param.utility_agentDefendProvinceLikingMult; } } string add = "" + (int)(localU); msgs.Add(new ReasonMsg("Liking for nobles in province" + add, localU)); u += localU; if (p.getLocation().province.index != option.province) { localU = p.getSelfInterest() * p.threat_agents.threat * World.staticMap.param.utility_selfInterestFromThreat; if (localU != 0) { msgs.Add(new ReasonMsg("Does not help me personally", localU)); u += localU; } } else { localU = -1 * p.getSelfInterest() * p.threat_agents.threat * World.staticMap.param.utility_selfInterestFromThreat; if (localU != 0) { msgs.Add(new ReasonMsg("Helps me personally", localU)); u += localU; } } } if (option.index == AGENT_TO_INVESTIGATOR) { responseLevelMin = 0; responseLevelMax = 100; Unit_Investigator inv = (Unit_Investigator)option.unit; double localU = Unit_Investigator.getSwitchUtility(p, (Unit_Investigator)option.unit, Unit_Investigator.unitState.investigator); localU *= p.map.param.utility_swapAgentRolesMult; msgs.Add(new ReasonMsg("Balance of agent skills vs balance of threats", localU)); u += localU; bool hasSuspicions = false; foreach (RelObj rel in inv.person.relations.Values) { if (inv.location.map.persons[rel.them] == null) { continue; } if (rel.suspicion > 0 && inv.location.map.persons[rel.them].unit != null && inv.location.map.units.Contains(inv.location.map.persons[rel.them].unit)) { hasSuspicions = true; } } if (hasSuspicions) { localU = 12; msgs.Add(new ReasonMsg("Has a suspect", localU)); u += localU; } } if (option.index == AGENT_TO_BASIC) { responseLevelMin = 0; responseLevelMax = 100; double localU = Unit_Investigator.getSwitchUtility(p, (Unit_Investigator)option.unit, Unit_Investigator.unitState.basic); localU *= p.map.param.utility_swapAgentRolesMult; msgs.Add(new ReasonMsg("Balance of agent skills vs balance of threats", localU)); u += localU; } if (concernLevel > responseLevelMax) { double delta = responseLevelMax - concernLevel; delta *= society.map.param.utility_extremeismScaling; double localU = delta; msgs.Add(new ReasonMsg("Too weak response for current concern level (" + (int)(concernLevel) + "%)", localU)); u += localU; } if (concernLevel < responseLevelMin) { double delta = concernLevel - responseLevelMin; delta *= society.map.param.utility_extremeismScaling; double localU = delta; msgs.Add(new ReasonMsg("Too extreme for current concern level (" + (int)(concernLevel) + "%)", localU)); u += localU; } return(u); }
public VoteIssue_Crisis_EvidenceDiscovered(Society soc, Person proposer, List <Evidence> evidence) : base(soc, proposer) { foundEvidence = evidence; }
public virtual void castInner(Map map, Person person) { }
public virtual bool castable(Map map, Person person) { return(false); }