|
|
|
@@ -10,11 +10,13 @@ function logistic (x0: number, L: number, k: number): (x: number) => number { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* A [[Scorer]] produces a score for a creature in a certain situation |
|
|
|
* A [[Scorer]] produces a score for a creature in a certain situation. |
|
|
|
* |
|
|
|
* It takes the current score and returns a new one. |
|
|
|
*/ |
|
|
|
export interface Scorer { |
|
|
|
userScore (attacker: Creature): number; |
|
|
|
targetScore (defender: Creature): number; |
|
|
|
userScore (attacker: Creature, score: number): number; |
|
|
|
targetScore (defender: Creature, score: number): number; |
|
|
|
explain(user: Creature, target: Creature): LogEntry; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -52,12 +54,12 @@ export class OpposedStatScorer implements Scorer { |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
userScore (attacker: Creature): number { |
|
|
|
return this.computeScore(attacker, this.userStats) |
|
|
|
userScore (attacker: Creature, score: number): number { |
|
|
|
return score + this.computeScore(attacker, this.userStats) |
|
|
|
} |
|
|
|
|
|
|
|
targetScore (defender: Creature): number { |
|
|
|
return this.computeScore(defender, this.targetStats) |
|
|
|
targetScore (defender: Creature, score: number): number { |
|
|
|
return score + this.computeScore(defender, this.targetStats) |
|
|
|
} |
|
|
|
|
|
|
|
private computeScore (subject: Creature, parts: Partial<Stats & VoreStats>): number { |
|
|
|
@@ -141,8 +143,8 @@ export class CompositionTest extends RandomTest { |
|
|
|
} |
|
|
|
|
|
|
|
odds (user: Creature, target: Creature): number { |
|
|
|
const userScore = this.scorers.reduce((score, scorer) => score + scorer.userScore(user), 0) |
|
|
|
const targetScore = this.scorers.reduce((score, scorer) => score + scorer.targetScore(target), 0) |
|
|
|
const userScore = this.scorers.reduce((score, scorer) => scorer.userScore(user, score), 0) |
|
|
|
const targetScore = this.scorers.reduce((score, scorer) => scorer.targetScore(target, score), 0) |
|
|
|
|
|
|
|
const userMod = user.effects.reduce((score, effect) => score + effect.modTestOffense(user, target, this.category), 0) |
|
|
|
const targetMod = target.effects.reduce((score, effect) => score + effect.modTestDefense(target, user, this.category), 0) |
|
|
|
|