From 6b4541f893f296cc2e5ad5e9c29b963d815333ec Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Tue, 13 Oct 2020 13:53:32 -0400 Subject: [PATCH] Add an acid potion that speeds up digestion --- src/game/combat.ts | 8 ++++++++ src/game/combat/effects.ts | 21 +++++++++++++++++++++ src/game/items.ts | 30 ++++++++++++++++++++++++++++-- src/game/maps/town.ts | 12 ++++++++++++ src/game/vore.ts | 8 ++++++-- 5 files changed, 75 insertions(+), 4 deletions(-) diff --git a/src/game/combat.ts b/src/game/combat.ts index d8714ba..3dece68 100644 --- a/src/game/combat.ts +++ b/src/game/combat.ts @@ -4,6 +4,7 @@ import { LogEntry, LogLines, FAElem, LogLine, FormatEntry, FormatOpt, PropElem, import { Resistances } from './entity' import { World } from './world' import { TestCategory } from './combat/tests' +import { VoreContainer } from './vore' export enum DamageType { Pierce = "Pierce", @@ -569,6 +570,13 @@ export class Effective { modTestDefense (defender: Creature, attacker: Creature, kind: TestCategory): number { return 0 } + + /** + * Affects digestion damage + */ + modDigestionDamage (predator: Creature, prey: Creature, container: VoreContainer, damage: Damage): Damage { + return damage + } } /** * A displayable status effect diff --git a/src/game/combat/effects.ts b/src/game/combat/effects.ts index 172e827..25920ad 100644 --- a/src/game/combat/effects.ts +++ b/src/game/combat/effects.ts @@ -2,6 +2,8 @@ import { StatusEffect, Damage, DamageType, Action, Condition, Vigor } from '../c import { DynText, LiveText, ToBe, Verb } from '../language' import { Creature } from "../creature" import { LogLine, LogEntry, LogLines, FAElem, nilLog } from '../interface' +import { VoreContainer } from '../vore' +import * as Words from '../words' export class InstantKillEffect extends StatusEffect { constructor () { @@ -173,3 +175,22 @@ export class SizeEffect extends StatusEffect { return scale * this.change } } + +export class DigestionPowerEffect extends StatusEffect { + constructor (private factor: number) { + super('Acid-fueled', 'This creature is digesting faster than nomral', 'fas fa-flask') + } + + onApply (creature: Creature): LogLine { + const voreContainer: VoreContainer|undefined = creature.containers.find(c => c.digest !== null) + if (voreContainer !== undefined) { + return new LogLine(`${creature.name.capital.possessive}'s ${voreContainer.name} ${Words.Churns} and ${voreContainer.sound}`) + } else { + return new LogLine(`${creature.name.capital} can't digest people...`) + } + } + + modDigestionDamage (predator: Creature, prey: Creature, container: VoreContainer, damage: Damage): Damage { + return damage.scale(this.factor) + } +} diff --git a/src/game/items.ts b/src/game/items.ts index 667881f..9c4ec43 100644 --- a/src/game/items.ts +++ b/src/game/items.ts @@ -2,8 +2,8 @@ import { TextLike, LiveText, DynText, Word, ImproperNoun, Verb, Noun } from './l import { Actionable, Action, DamageFormula, ConstantDamageFormula, Damage, DamageType, Vigor, StatDamageFormula, Stat, Effective, CompositionAction, Condition, CompositeDamageFormula } from './combat' import { AttackAction } from './combat/actions' import { Resistances } from './entity' -import { DamageTypeResistanceEffect } from './combat/effects' -import { DamageConsequence, LogConsequence, HealingConsequence } from './combat/consequences' +import { DamageTypeResistanceEffect, DigestionPowerEffect } from './combat/effects' +import { DamageConsequence, LogConsequence, HealingConsequence, StatusConsequence } from './combat/consequences' import { SoloCondition } from './combat/conditions' import { LogLine, LogEntry } from './interface' import { Creature } from './creature' @@ -230,3 +230,29 @@ export class HealthPotion extends Consumable { ) } } + +export class AcidPotion extends Consumable { + constructor () { + super( + new ImproperNoun("Acid Potion"), + "Boosts your digestive power and causes a burst of damage to your prey", + new CompositionAction( + "Drink Potion", + "Speed up your digestion", + { + conditions: [ + new SoloCondition() + ], + consequences: [ + new LogConsequence( + (user, target) => new LogLine(`${user.name.capital} ${user.name.conjugate(new Verb('drink'))} an acid potion.`) + ), + new StatusConsequence( + (user, target) => new DigestionPowerEffect(2) + ) + ] + } + ) + ) + } +} diff --git a/src/game/maps/town.ts b/src/game/maps/town.ts index c3a1437..a91646d 100644 --- a/src/game/maps/town.ts +++ b/src/game/maps/town.ts @@ -244,6 +244,18 @@ export const Town = (): Place => { ) ) + home.choices.push( + new Choice( + "Grab potions", + "Grab some potions", + (world, executor) => { + executor.items.push(new Items.HealthPotion()) + executor.items.push(new Items.AcidPotion()) + return new LogLine("You grab some potions") + } + ) + ) + westAve.choices.push( new Choice( "Eat someone", diff --git a/src/game/vore.ts b/src/game/vore.ts index e0906ec..9fc1857 100644 --- a/src/game/vore.ts +++ b/src/game/vore.ts @@ -160,6 +160,7 @@ export interface VoreContainer extends Container { tick: (dt: number) => LogEntry; digest: (preys: Creature[]) => LogEntry; absorb: (preys: Creature[]) => LogEntry; + sound: Word; fluidName: Word; fluidColor: string; @@ -176,6 +177,8 @@ export abstract class NormalVoreContainer extends NormalContainer implements Vor digested: Array = [] absorbed: Array = [] + sound = new Verb("slosh") + abstract fluidName: Word constructor (name: Noun, owner: Creature, voreTypes: Set, capacity: number, private damage: DamageFormula) { @@ -223,9 +226,10 @@ export abstract class NormalVoreContainer extends NormalContainer implements Vor this.contents.forEach(prey => { const scaled = this.damage.calc(this.owner, prey).scale(dt / 60) - tickedEntryList.push(this.tickLine(this.owner, prey, { damage: scaled })) + const modified = this.owner.effects.reduce((damage, effect) => effect.modDigestionDamage(this.owner, prey, this, damage), scaled) + tickedEntryList.push(this.tickLine(this.owner, prey, { damage: modified })) - damageResults.push(prey.takeDamage(scaled)) + damageResults.push(prey.takeDamage(modified)) if (prey.vigors[Vigor.Health] <= 0) { prey.destroyed = true