/// module AIRules { export function printGrudgeResult (atom : ContentAtomAnnoy) : Say { return ContentMoleculeAnnoy.getSay(new ContentMolecule(atom)); } export var actedUponAggressively = AI.reacttoRules.createAndAddRule({ name : "Reacting to Aggressive action", code : (runner : RulebookRunner) => { let person = runner.noun; let pai = runner.noun.AI; let action = pai.reactingTo; person.AI.addHostility(action.actor, action.aggressivenessRating); person.reputation -= action.aggressivenessRating; if (person.AI.hostileTargets.includes(action.actor)) { return; // Already hostile } if (action.actor == WorldState.player) { person.reputation -= action.aggressivenessRating; } let ai = person.AI; let response : Say; let gain = ai.grudgeRate * action.aggressivenessRating; let actionLevel = ContentAtomAnnoy.TYPE_LOW; let result = ContentAtomAnnoy.RESULT_FRIENDLY; if (ai.getHostilityTo(action.actor) > 100) { result = ContentAtomAnnoy.RESULT_HOSTILE; } else if (ai.retaliates && ai.getHostilityTo(action.actor) >= (ai.hostileThreshold / 2)) { result = ContentAtomAnnoy.RESULT_PISSED; } if (gain >= (ai.hostileThreshold / 2)) { actionLevel = ContentAtomAnnoy.TYPE_HIGH; } else if (gain >= (ai.hostileThreshold / 4)) { actionLevel = ContentAtomAnnoy.TYPE_MEDIUM; } response = printGrudgeResult(new ContentAtomAnnoy(action.actor, person, [actionLevel, result])); let nAct : Action; if (result != ContentAtomAnnoy.RESULT_FRIENDLY) { nAct = new ActionAttack(person, action.actor); nAct.finalSay = response.add(Say.PARAGRAPH_BREAK); nAct.finalSayOnEnd = false; person.AI.storedReaction = nAct; } else { // nAct = new ActionWait(person); // nAct.finalSay = response.add(Say.PARAGRAPH_BREAK); // Stop waiting when hit? } }, conditions : (runner : RulebookRunner) => { let pai = runner.noun.AI; let action = pai.reactingTo; return action.actingAgressively; } }) }