| @@ -90,12 +90,6 @@ export interface CombatTest { | |||||
| explain: (user: Creature, target: Creature) => LogEntry; | explain: (user: Creature, target: Creature) => LogEntry; | ||||
| } | } | ||||
| export interface Effect { | |||||
| name: string; | |||||
| desc: string; | |||||
| apply: (target: Creature) => LogEntry; | |||||
| } | |||||
| /** | /** | ||||
| * An instance of damage. Contains zero or more [[DamageInstance]] objects | * An instance of damage. Contains zero or more [[DamageInstance]] objects | ||||
| */ | */ | ||||
| @@ -374,41 +368,3 @@ export abstract class StatusEffect implements VisibleStatus { | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| export class StunEffect extends StatusEffect { | |||||
| constructor (private duration: number) { | |||||
| super('Stun', 'Cannot act!', 'fas fa-sun') | |||||
| this.desc = new DynText('Stunned for your next ', new LiveText(this, x => x.duration), ' actions!') | |||||
| } | |||||
| get topLeft () { | |||||
| return this.duration.toString() | |||||
| } | |||||
| onApply (creature: Creature) { | |||||
| return new LogLine(`${creature.name.capital} ${creature.name.conjugate(new ToBe())} is stunned!`) | |||||
| } | |||||
| onRemove (creature: Creature) { | |||||
| return new LogLine(`${creature.name.capital} ${creature.name.conjugate(new ToBe())} no longer stunned.`) | |||||
| } | |||||
| preAction (creature: Creature): { prevented: boolean; log: LogEntry } { | |||||
| if (--this.duration <= 0) { | |||||
| return { | |||||
| prevented: true, | |||||
| log: new LogLines( | |||||
| `${creature.name.capital} ${creature.name.conjugate(new ToBe())} stunned! ${creature.pronouns.capital.subjective} can't move.`, | |||||
| creature.removeEffect(this) | |||||
| ) | |||||
| } | |||||
| } else { | |||||
| return { | |||||
| prevented: true, | |||||
| log: new LogLines( | |||||
| `${creature.name.capital} ${creature.name.conjugate(new ToBe())} stunned! ${creature.pronouns.capital.subjective} can't move!` | |||||
| ) | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,18 +1,58 @@ | |||||
| import { StatusEffect, Damage } from '../combat' | |||||
| import { DynText, LiveText, ToBe } from '../language' | |||||
| import { Creature } from '../entity' | import { Creature } from '../entity' | ||||
| import { LogEntry, LogLine, FAElem } from '../interface' | |||||
| import { Effect } from '../combat' | |||||
| import { SoloLine, ToBe } from '../language' | |||||
| import { LogLine, LogEntry, LogLines, FAElem } from '../interface' | |||||
| export class InstantKill implements Effect { | |||||
| line: SoloLine<Creature> = (victim) => new LogLine( | |||||
| `${victim.name.capital} ${victim.name.conjugate(new ToBe())} killed instantly!`, | |||||
| new FAElem('fas fa-skull') | |||||
| ) | |||||
| export class InstantKillEffect extends StatusEffect { | |||||
| constructor () { | |||||
| super('Instant Kill', 'Instant kill!', 'fas fa-skull') | |||||
| } | |||||
| onApply (creature: Creature) { | |||||
| creature.vigors.Health = 0 | |||||
| return new LogLines( | |||||
| new LogLine( | |||||
| `${creature.name.capital} ${creature.name.conjugate(new ToBe())} killed instantly! `, | |||||
| new FAElem('fas fa-skull') | |||||
| ), | |||||
| creature.takeDamage(new Damage()) | |||||
| ) | |||||
| } | |||||
| } | |||||
| export class StunEffect extends StatusEffect { | |||||
| constructor (private duration: number) { | |||||
| super('Stun', 'Cannot act!', 'fas fa-sun') | |||||
| this.desc = new DynText('Stunned for your next ', new LiveText(this, x => x.duration), ' actions!') | |||||
| } | |||||
| get topLeft () { | |||||
| return this.duration.toString() | |||||
| } | |||||
| onApply (creature: Creature) { | |||||
| return new LogLine(`${creature.name.capital} ${creature.name.conjugate(new ToBe())} is stunned!`) | |||||
| } | |||||
| onRemove (creature: Creature) { | |||||
| return new LogLine(`${creature.name.capital} ${creature.name.conjugate(new ToBe())} no longer stunned.`) | |||||
| } | |||||
| name = "Instant Kill" | |||||
| desc = "Instantly kills its victim" | |||||
| apply (target: Creature): LogEntry { | |||||
| target.vigors.Health = Math.min(0, target.vigors.Health) | |||||
| return this.line(target) | |||||
| preAction (creature: Creature): { prevented: boolean; log: LogEntry } { | |||||
| if (--this.duration <= 0) { | |||||
| return { | |||||
| prevented: true, | |||||
| log: new LogLines( | |||||
| `${creature.name.capital} ${creature.name.conjugate(new ToBe())} stunned! ${creature.pronouns.capital.subjective} can't move.`, | |||||
| creature.removeEffect(this) | |||||
| ) | |||||
| } | |||||
| } else { | |||||
| return { | |||||
| prevented: true, | |||||
| log: new LogLines( | |||||
| `${creature.name.capital} ${creature.name.conjugate(new ToBe())} stunned! ${creature.pronouns.capital.subjective} can't move!` | |||||
| ) | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -4,7 +4,7 @@ import { ProperNoun, TheyPronouns, ImproperNoun, FemalePronouns, Verb, POV, Pair | |||||
| import { VoreType, Stomach, InnerStomach, VoreContainer } from '../vore' | import { VoreType, Stomach, InnerStomach, VoreContainer } from '../vore' | ||||
| import { LogLine, LogLines, LogEntry, FAElem, CompositeLog, ImgElem } from '../interface' | import { LogLine, LogLines, LogEntry, FAElem, CompositeLog, ImgElem } from '../interface' | ||||
| import { AttackAction, EatenAction, TransferAction, FeedAction } from '../combat/actions' | import { AttackAction, EatenAction, TransferAction, FeedAction } from '../combat/actions' | ||||
| import { InstantKill } from '../combat/effects' | |||||
| import { InstantKillEffect } from '../combat/effects' | |||||
| import * as Words from '../words' | import * as Words from '../words' | ||||
| class BellyCrushAction extends AttackAction { | class BellyCrushAction extends AttackAction { | ||||
| @@ -56,7 +56,7 @@ class CrushAction extends EatenAction { | |||||
| } | } | ||||
| execute (user: Creature, target: Creature): LogEntry { | execute (user: Creature, target: Creature): LogEntry { | ||||
| return new LogLines(this.line(user, target, { container: this._container }), new InstantKill().apply(target)) | |||||
| return new LogLines(this.line(user, target, { container: this._container }), target.applyEffect(new InstantKillEffect())) | |||||
| } | } | ||||
| describe (user: Creature, target: Creature): LogEntry { | describe (user: Creature, target: Creature): LogEntry { | ||||
| @@ -1,10 +1,11 @@ | |||||
| import { Creature } from '../entity' | import { Creature } from '../entity' | ||||
| import { ProperNoun, ImproperNoun, FemalePronouns, Verb } from '../language' | import { ProperNoun, ImproperNoun, FemalePronouns, Verb } from '../language' | ||||
| import { VoreType, Stomach } from '../vore' | import { VoreType, Stomach } from '../vore' | ||||
| import { Side, Damage, DamageType, Vigor, StatDamageFormula, Stat, VoreStat, DamageFormula, StunEffect } from '../combat' | |||||
| import { Side, Damage, DamageType, Vigor, StatDamageFormula, Stat, VoreStat, DamageFormula } from '../combat' | |||||
| import { AttackAction } from '../combat/actions' | import { AttackAction } from '../combat/actions' | ||||
| import { LogEntry, LogLines } from '../interface' | import { LogEntry, LogLines } from '../interface' | ||||
| import { StatTest } from '../combat/tests' | import { StatTest } from '../combat/tests' | ||||
| import { StunEffect } from '../combat/effects' | |||||
| class StompAttack extends AttackAction { | class StompAttack extends AttackAction { | ||||
| execute (user: Creature, target: Creature): LogEntry { | execute (user: Creature, target: Creature): LogEntry { | ||||
| @@ -2,10 +2,10 @@ import { Creature } from '../entity' | |||||
| import { Damage, DamageType, ConstantDamageFormula, Vigor, Side, GroupAction, CombatTest, Stat, DamageFormula, UniformRandomDamageFormula, Action, DamageInstance, StatDamageFormula, VoreStat } from '../combat' | import { Damage, DamageType, ConstantDamageFormula, Vigor, Side, GroupAction, CombatTest, Stat, DamageFormula, UniformRandomDamageFormula, Action, DamageInstance, StatDamageFormula, VoreStat } from '../combat' | ||||
| import { ImproperNoun, ProperNoun, FemalePronouns, RandomWord, Adjective, Verb, POV, PairLine } from '../language' | import { ImproperNoun, ProperNoun, FemalePronouns, RandomWord, Adjective, Verb, POV, PairLine } from '../language' | ||||
| import { LogLine, LogLines, LogEntry, Newline } from '../interface' | import { LogLine, LogLines, LogEntry, Newline } from '../interface' | ||||
| import { VoreType, Stomach, VoreContainer, Vore, NormalContainer, Container } from '../vore' | |||||
| import { VoreType, Stomach, VoreContainer, Vore, NormalContainer, Container, InnerStomach } from '../vore' | |||||
| import { AttackAction, FeedAction, TransferAction, EatenAction } from '../combat/actions' | import { AttackAction, FeedAction, TransferAction, EatenAction } from '../combat/actions' | ||||
| import { TogetherCondition, ContainsCondition, EnemyCondition, AllyCondition, PairCondition, CapableCondition } from '../combat/conditions' | import { TogetherCondition, ContainsCondition, EnemyCondition, AllyCondition, PairCondition, CapableCondition } from '../combat/conditions' | ||||
| import { InstantKill } from '../combat/effects' | |||||
| import { InstantKillEffect } from '../combat/effects' | |||||
| import * as Words from '../words' | import * as Words from '../words' | ||||
| import { StatVigorTest } from '../combat/tests' | import { StatVigorTest } from '../combat/tests' | ||||
| @@ -197,7 +197,7 @@ class StompAction extends GroupAction { | |||||
| ) | ) | ||||
| execute (user: Creature, target: Creature): LogEntry { | execute (user: Creature, target: Creature): LogEntry { | ||||
| return new LogLines(this.line(user, target), new InstantKill().apply(target)) | |||||
| return new LogLines(this.line(user, target), target.applyEffect(new InstantKillEffect())) | |||||
| } | } | ||||
| describe (user: Creature, target: Creature): LogEntry { | describe (user: Creature, target: Creature): LogEntry { | ||||
| @@ -237,7 +237,7 @@ class StompAllyAction extends Action { | |||||
| return new LogLines( | return new LogLines( | ||||
| this.line(user, target), | this.line(user, target), | ||||
| new InstantKill().apply(target), | |||||
| target.applyEffect(new InstantKillEffect()), | |||||
| new LogLine(`${user.name.capital} absorbs ${target.pronouns.possessive} power, gaining `, heal.renderShort()) | new LogLine(`${user.name.capital} absorbs ${target.pronouns.possessive} power, gaining `, heal.renderShort()) | ||||
| ) | ) | ||||
| } | } | ||||