/// /// module AIRules { // Only one at a time export var actionMin = new ContentMarker("That pissed me off a little", true); export var actionMed = new ContentMarker("That pissed me off", true); export var actionMax = new ContentMarker("That pissed me off HARD", true); // Only one at a time export var resultNotHostile = new ContentMarker("I'm not gonna do anything about it", true); export var resultRetaliate = new ContentMarker("I'll hit you once so you can see how you like it", true); export var resultHostile = new ContentMarker("I'll hit you until you drop dead.", true); export function printGrudgeResult (aggressor : Thing, victim : Person, ...markers : Array) : Say { let group = new ContentGroup(); let unit = new CombatPokeUnit(); group.addUnit(unit); unit.setTarget(victim); unit.setAggressor(aggressor); unit.addMarker(...markers); if (aggressor == WorldState.player) { victim.AI.warnedTimes++; } return new Say(...CombatPokeDescription.getDescription(group)); } 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; if (person.AI.hostileTargets.includes(action.actor)) { return; // Already hostile } person.AI.addHostility(action.actor, action.aggressivenessRating); if (action.actor == WorldState.player) { person.reputation -= action.aggressivenessRating; } let ai = person.AI; let response : Say; let gain = ai.grudgeRate * action.aggressivenessRating; let actionLevel = actionMin; let result = resultNotHostile; if (ai.getHostilityTo(action.actor) > 100) { result = resultHostile; } else if (ai.retaliates && ai.getHostilityTo(action.actor) >= (ai.hostileThreshold / 2)) { result = resultRetaliate; } if (gain >= (ai.hostileThreshold / 2)) { actionLevel = actionMax; } else if (gain >= (ai.hostileThreshold / 4)) { actionLevel = actionMed; } response = printGrudgeResult(action.actor, person, actionLevel, result); let nAct : Action; if (result == resultRetaliate) { nAct = new ActionAttack(person, action.actor); nAct.finalSay = response.add(Say.PARAGRAPH_BREAK); nAct.finalSayOnEnd = false; } else { nAct = new ActionWait(person); nAct.finalSay = response.add(Say.PARAGRAPH_BREAK); } person.AI.storedReaction = nAct; }, conditions : (runner : RulebookRunner) => { let pai = runner.noun.AI; let action = pai.reactingTo; return action.actingAgressively; } }) }