| @@ -83,21 +83,21 @@ export class Cafat extends Creature { | |||
| this.side = Side.Monsters | |||
| const stomach = new Stomach(this, 1, new Damage( | |||
| const stomach = new Stomach(this, 1, new ConstantDamageFormula(new Damage( | |||
| { amount: 20, type: DamageType.Acid, target: Vigor.Health }, | |||
| { amount: 10, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 10, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| stomach.name = new ImproperNoun("upper stomach", "upper stomachs").all | |||
| this.containers.push(stomach) | |||
| const lowerStomach = new InnerStomach(this, 1.5, new Damage( | |||
| const lowerStomach = new InnerStomach(this, 1.5, new ConstantDamageFormula(new Damage( | |||
| { amount: 40, type: DamageType.Acid, target: Vigor.Health }, | |||
| { amount: 20, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 20, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| ), stomach) | |||
| )), stomach) | |||
| lowerStomach.name = new ImproperNoun("lower stomach", "lower stomachs").all | |||
| @@ -20,19 +20,19 @@ export class Dragon extends Creature { | |||
| this.side = Side.Monsters | |||
| const stomach = new Stomach(this, 0.5, new Damage( | |||
| const stomach = new Stomach(this, 0.5, new ConstantDamageFormula(new Damage( | |||
| { amount: 40, type: DamageType.Acid, target: Vigor.Health }, | |||
| { amount: 20, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 20, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| this.containers.push(stomach) | |||
| const bowels = new Bowels(this, 0.5, new Damage( | |||
| const bowels = new Bowels(this, 0.5, new ConstantDamageFormula(new Damage( | |||
| { amount: 10, type: DamageType.Crush, target: Vigor.Health }, | |||
| { amount: 25, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 50, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| this.containers.push(bowels) | |||
| @@ -23,18 +23,18 @@ export class Geta extends Creature { | |||
| this.side = Side.Monsters | |||
| const stomach = new Stomach(this, 0.25, new Damage( | |||
| const stomach = new Stomach(this, 0.25, new ConstantDamageFormula(new Damage( | |||
| { amount: 100, type: DamageType.Acid, target: Vigor.Health }, | |||
| { amount: 40, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 80, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| this.containers.push(stomach) | |||
| const bowels = new Bowels(this, 0.25, new Damage( | |||
| const bowels = new Bowels(this, 0.25, new ConstantDamageFormula(new Damage( | |||
| { amount: 30, type: DamageType.Crush, target: Vigor.Health }, | |||
| { amount: 90, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 120, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| this.containers.push(bowels) | |||
| @@ -42,11 +42,11 @@ export class Geta extends Creature { | |||
| this.otherActions.push(new FeedAction(stomach)) | |||
| const cock = new Cock(this, 0.25, new Damage( | |||
| const cock = new Cock(this, 0.25, new ConstantDamageFormula(new Damage( | |||
| { amount: 10, type: DamageType.Crush, target: Vigor.Health }, | |||
| { amount: 50, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 150, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| cock.digestLine = (user, target, args) => { | |||
| return new LogLine(`${user.name.capital.possessive} ${args.container.name} throbs as it abruptly absorbs ${target.name.objective}, transforming ${target.name.objective} into more of ${user.pronouns.possessive} meaty shaft.`) | |||
| @@ -85,11 +85,11 @@ export class Geta extends Creature { | |||
| ) | |||
| ) | |||
| const balls = new Balls(this, 0.25, new Damage( | |||
| const balls = new Balls(this, 0.25, new ConstantDamageFormula(new Damage( | |||
| { amount: 50, type: DamageType.Acid, target: Vigor.Health }, | |||
| { amount: 25, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 50, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| ), cock) | |||
| )), cock) | |||
| this.containers.push(balls) | |||
| this.containers.push(cock) | |||
| @@ -109,8 +109,10 @@ class GoldeneyeStomach extends InnerVoreContainer { | |||
| owner, | |||
| new Set([VoreType.Oral]), | |||
| 900, | |||
| new Damage( | |||
| { amount: 1000, target: Vigor.Health, type: DamageType.Acid } | |||
| new ConstantDamageFormula( | |||
| new Damage( | |||
| { amount: 1000, target: Vigor.Health, type: DamageType.Acid } | |||
| ) | |||
| ), | |||
| crop | |||
| ) | |||
| @@ -1,7 +1,7 @@ | |||
| import { Creature } from "../creature" | |||
| import { ProperNoun, ImproperNoun, FemalePronouns, Verb } from '../language' | |||
| import { VoreType, Stomach } from '../vore' | |||
| import { Side, Damage, DamageType, Vigor, StatDamageFormula, Stat, VoreStat, DamageFormula } from '../combat' | |||
| import { Side, Damage, DamageType, Vigor, StatDamageFormula, Stat, VoreStat, DamageFormula, ConstantDamageFormula } from '../combat' | |||
| import { AttackAction, DevourAction } from '../combat/actions' | |||
| import { LogEntry, LogLines } from '../interface' | |||
| import { StunEffect, PredatorCounterEffect } from '../combat/effects' | |||
| @@ -39,11 +39,11 @@ export class Kenzie extends Creature { | |||
| this.side = Side.Monsters | |||
| const stomach = new Stomach(this, 0.1, new Damage( | |||
| const stomach = new Stomach(this, 0.1, new ConstantDamageFormula(new Damage( | |||
| { amount: 100, type: DamageType.Acid, target: Vigor.Health }, | |||
| { amount: 100, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 100, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| this.applyEffect(new PredatorCounterEffect(new DevourAction(stomach), 0.4)) | |||
| @@ -18,18 +18,18 @@ export class Kuro extends Creature { | |||
| this.side = Side.Monsters | |||
| const stomach = new Stomach(this, 0.5, new Damage( | |||
| const stomach = new Stomach(this, 0.5, new ConstantDamageFormula(new Damage( | |||
| { amount: 100, type: DamageType.Acid, target: Vigor.Health }, | |||
| { amount: 40, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 80, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| this.containers.push(stomach) | |||
| const bowels = new Bowels(this, 0.5, new Damage( | |||
| const bowels = new Bowels(this, 0.5, new ConstantDamageFormula(new Damage( | |||
| { amount: 30, type: DamageType.Crush, target: Vigor.Health }, | |||
| { amount: 90, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 120, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| this.containers.push(bowels) | |||
| @@ -37,17 +37,17 @@ export class Kuro extends Creature { | |||
| this.otherActions.push(new FeedAction(stomach)) | |||
| const cock = new Cock(this, 0.5, new Damage( | |||
| const cock = new Cock(this, 0.5, new ConstantDamageFormula(new Damage( | |||
| { amount: 10, type: DamageType.Crush, target: Vigor.Health }, | |||
| { amount: 30, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 30, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| const balls = new Balls(this, 0.5, new Damage( | |||
| const balls = new Balls(this, 0.5, new ConstantDamageFormula(new Damage( | |||
| { amount: 50, type: DamageType.Acid, target: Vigor.Health }, | |||
| { amount: 25, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 150, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| ), cock) | |||
| )), cock) | |||
| this.containers.push(balls) | |||
| this.containers.push(cock) | |||
| @@ -18,10 +18,10 @@ export class Player extends Creature { | |||
| this.actions.push(new AttackAction(new ConstantDamageFormula(new Damage({ type: DamageType.Pierce, amount: 20, target: Vigor.Health }, { type: DamageType.Pierce, amount: 20, target: Vigor.Stamina })))) | |||
| const stomach = new Stomach(this, 2, new Damage({ amount: 20, type: DamageType.Acid, target: Vigor.Health }, { amount: 10, type: DamageType.Crush, target: Vigor.Health })) | |||
| const stomach = new Stomach(this, 2, new ConstantDamageFormula(new Damage({ amount: 20, type: DamageType.Acid, target: Vigor.Health }, { amount: 10, type: DamageType.Crush, target: Vigor.Health }))) | |||
| this.containers.push(stomach) | |||
| const bowels = new Bowels(this, 2, new Damage({ amount: 20, type: DamageType.Crush, target: Vigor.Health })) | |||
| const bowels = new Bowels(this, 2, new ConstantDamageFormula(new Damage({ amount: 20, type: DamageType.Crush, target: Vigor.Health }))) | |||
| this.containers.push(bowels) | |||
| this.perspective = POV.Second | |||
| @@ -158,11 +158,11 @@ export class Shingo extends Creature { | |||
| this.side = Side.Monsters | |||
| const stomach = new Stomach(this, 0.1, new Damage( | |||
| const stomach = new Stomach(this, 0.1, new ConstantDamageFormula(new Damage( | |||
| { amount: 200, type: DamageType.Acid, target: Vigor.Health }, | |||
| { amount: 100, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 100, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| this.containers.push(stomach) | |||
| @@ -317,11 +317,11 @@ export class Withers extends Creature { | |||
| this.side = Side.Monsters | |||
| const stomach = new Stomach(this, 0.1, new Damage( | |||
| const stomach = new Stomach(this, 0.1, new ConstantDamageFormula(new Damage( | |||
| { amount: 300, type: DamageType.Acid, target: Vigor.Health }, | |||
| { amount: 200, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 200, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| this.containers.push(stomach) | |||
| this.otherActions.push(new FeedAction(stomach)) | |||
| @@ -28,18 +28,18 @@ export class Wolf extends Creature { | |||
| this.side = Side.Monsters | |||
| const stomach = new Stomach(this, 2, new Damage( | |||
| const stomach = new Stomach(this, 2, new ConstantDamageFormula(new Damage( | |||
| { amount: 60, type: DamageType.Acid, target: Vigor.Health }, | |||
| { amount: 30, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 30, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| this.containers.push(stomach) | |||
| const bowels = new Bowels(this, 2, new Damage( | |||
| const bowels = new Bowels(this, 2, new ConstantDamageFormula(new Damage( | |||
| { amount: 30, type: DamageType.Crush, target: Vigor.Health }, | |||
| { amount: 60, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 60, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| this.containers.push(bowels) | |||
| @@ -47,29 +47,29 @@ export class Wolf extends Creature { | |||
| this.otherActions.push(new FeedAction(stomach)) | |||
| const cock = new Cock(this, 2, new Damage( | |||
| const cock = new Cock(this, 2, new ConstantDamageFormula(new Damage( | |||
| { amount: 30, type: DamageType.Crush, target: Vigor.Health }, | |||
| { amount: 60, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 60, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| const balls = new Balls(this, 2, new Damage( | |||
| const balls = new Balls(this, 2, new ConstantDamageFormula(new Damage( | |||
| { amount: 30, type: DamageType.Crush, target: Vigor.Health }, | |||
| { amount: 60, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 60, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| ), cock) | |||
| )), cock) | |||
| const slit = new Slit(this, 2, new Damage( | |||
| const slit = new Slit(this, 2, new ConstantDamageFormula(new Damage( | |||
| { amount: 30, type: DamageType.Crush, target: Vigor.Health }, | |||
| { amount: 60, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 60, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| )) | |||
| ))) | |||
| const womb = new Womb(this, 2, new Damage( | |||
| const womb = new Womb(this, 2, new ConstantDamageFormula(new Damage( | |||
| { amount: 30, type: DamageType.Crush, target: Vigor.Health }, | |||
| { amount: 60, type: DamageType.Crush, target: Vigor.Stamina }, | |||
| { amount: 60, type: DamageType.Dominance, target: Vigor.Resolve } | |||
| ), slit) | |||
| )), slit) | |||
| this.containers.push(balls) | |||
| this.containers.push(cock) | |||
| @@ -1,5 +1,5 @@ | |||
| import { Mortal } from './entity' | |||
| import { Damage, DamageType, Stats, Actionable, Action, Vigor, VoreStats, VisibleStatus, VoreStat, DamageInstance } from './combat' | |||
| import { Damage, DamageType, Stats, Actionable, Action, Vigor, VoreStats, VisibleStatus, VoreStat, DamageInstance, DamageFormula } from './combat' | |||
| import { LogLines, LogEntry, LogLine, nilLog } from './interface' | |||
| import { Noun, Pronoun, ImproperNoun, TextLike, Verb, SecondPersonPronouns, PronounAsNoun, FirstPersonPronouns, PairLineArgs, SoloLine, POV, RandomWord } from './language' | |||
| import { DigestAction, DevourAction, ReleaseAction, StruggleAction, TransferAction } from './combat/actions' | |||
| @@ -172,7 +172,7 @@ export abstract class NormalVoreContainer extends NormalContainer implements Vor | |||
| digested: Array<Creature> = [] | |||
| absorbed: Array<Creature> = [] | |||
| constructor (name: Noun, owner: Creature, voreTypes: Set<VoreType>, capacity: number, private damage: Damage) { | |||
| constructor (name: Noun, owner: Creature, voreTypes: Set<VoreType>, capacity: number, private damage: DamageFormula) { | |||
| super(name, owner, voreTypes, capacity) | |||
| this.name = name | |||
| @@ -204,13 +204,14 @@ export abstract class NormalVoreContainer extends NormalContainer implements Vor | |||
| const justDigested: Array<Creature> = [] | |||
| const justAbsorbed: Array<Creature> = [] | |||
| const scaled = this.damage.scale(dt / 60) | |||
| const damageResults: Array<LogEntry> = [] | |||
| const tickedEntries = new LogLines(...this.contents.map(prey => this.tickLine(this.owner, prey, { container: this, damage: scaled }))) | |||
| const tickedEntryList: LogEntry[] = [] | |||
| this.contents.forEach(prey => { | |||
| const scaled = this.damage.calc(this.owner, prey).scale(dt / 60) | |||
| tickedEntryList.push(this.tickLine(this.owner, prey, { container: this, damage: scaled })) | |||
| damageResults.push(prey.takeDamage(scaled)) | |||
| if (prey.vigors[Vigor.Health] <= 0) { | |||
| @@ -221,7 +222,10 @@ export abstract class NormalVoreContainer extends NormalContainer implements Vor | |||
| } | |||
| }) | |||
| const tickedEntries = new LogLines(...tickedEntryList) | |||
| this.digested.forEach(prey => { | |||
| const scaled = this.damage.calc(this.owner, prey).scale(dt / 60) | |||
| const damageTotal: number = prey.effectiveDamage(scaled).damages.filter(instance => instance.target === Vigor.Health).reduce( | |||
| (total: number, instance: DamageInstance) => total + instance.amount, | |||
| 0 | |||
| @@ -271,7 +275,7 @@ export abstract class NormalVoreContainer extends NormalContainer implements Vor | |||
| } | |||
| export abstract class InnerVoreContainer extends NormalVoreContainer { | |||
| constructor (name: Noun, owner: Creature, voreTypes: Set<VoreType>, capacity: number, damage: Damage, private escape: Container) { | |||
| constructor (name: Noun, owner: Creature, voreTypes: Set<VoreType>, capacity: number, damage: DamageFormula, private escape: Container) { | |||
| super(name, owner, voreTypes, capacity, damage) | |||
| this.actions = [] | |||
| @@ -289,7 +293,7 @@ export abstract class InnerVoreContainer extends NormalVoreContainer { | |||
| } | |||
| export class Stomach extends NormalVoreContainer { | |||
| constructor (owner: Creature, capacity: number, damage: Damage) { | |||
| constructor (owner: Creature, capacity: number, damage: DamageFormula) { | |||
| super(new ImproperNoun('stomach', 'stomachs').all, owner, new Set([VoreType.Oral]), capacity, damage) | |||
| } | |||
| @@ -316,13 +320,13 @@ export class Stomach extends NormalVoreContainer { | |||
| export class InnerStomach extends InnerVoreContainer { | |||
| consumeVerb = new Verb('swallow') | |||
| releaseVerb = new Verb('hork') | |||
| constructor (owner: Creature, capacity: number, damage: Damage, escape: VoreContainer) { | |||
| constructor (owner: Creature, capacity: number, damage: DamageFormula, escape: VoreContainer) { | |||
| super(new ImproperNoun('inner stomach', 'inner stomachs').all, owner, new Set([VoreType.Oral]), capacity, damage, escape) | |||
| } | |||
| } | |||
| export class Bowels extends NormalVoreContainer { | |||
| constructor (owner: Creature, capacity: number, damage: Damage) { | |||
| constructor (owner: Creature, capacity: number, damage: DamageFormula) { | |||
| super(new ImproperNoun('bowel', 'bowels').plural.all, owner, new Set([VoreType.Anal]), capacity, damage) | |||
| } | |||
| @@ -339,7 +343,7 @@ export class Bowels extends NormalVoreContainer { | |||
| export class Cock extends NormalVoreContainer { | |||
| fluidColor = "#eeeeee66"; | |||
| constructor (owner: Creature, capacity: number, damage: Damage) { | |||
| constructor (owner: Creature, capacity: number, damage: DamageFormula) { | |||
| super( | |||
| new ImproperNoun('cock').all, | |||
| owner, | |||
| @@ -362,7 +366,7 @@ export class Cock extends NormalVoreContainer { | |||
| export class Balls extends InnerVoreContainer { | |||
| fluidColor = "#eeeeeecc"; | |||
| constructor (owner: Creature, capacity: number, damage: Damage, escape: Container) { | |||
| constructor (owner: Creature, capacity: number, damage: DamageFormula, escape: Container) { | |||
| super( | |||
| new ImproperNoun('ball', 'balls').all.plural, | |||
| owner, | |||
| @@ -377,7 +381,7 @@ export class Balls extends InnerVoreContainer { | |||
| export class Slit extends NormalVoreContainer { | |||
| fluidColor = "#cccccc99"; | |||
| constructor (owner: Creature, capacity: number, damage: Damage) { | |||
| constructor (owner: Creature, capacity: number, damage: DamageFormula) { | |||
| super( | |||
| new ImproperNoun('slit').all, | |||
| owner, | |||
| @@ -391,7 +395,7 @@ export class Slit extends NormalVoreContainer { | |||
| export class Womb extends InnerVoreContainer { | |||
| fluidColor = "#ddddddbb"; | |||
| constructor (owner: Creature, capacity: number, damage: Damage, escape: Container) { | |||
| constructor (owner: Creature, capacity: number, damage: DamageFormula, escape: Container) { | |||
| super( | |||
| new ImproperNoun('womb').all, | |||
| owner, | |||