|  |  | @@ -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) | 
		
	
	
		
			
				|  |  | 
 |