From fe9ac340b20ed64ca9748cc2c18b0cd61ff2c1b8 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Sun, 2 Aug 2020 13:13:34 -0400 Subject: [PATCH] Allow effects to cause test failures; make surrendering drain resolve Also fixes a dumb bug where humans could make OTHER units surrender --- src/game/combat.ts | 11 +++++++++++ src/game/combat/effects.ts | 13 +++++++++---- src/game/combat/tests.ts | 11 +++++++++++ src/game/creatures/human.ts | 4 ++++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/game/combat.ts b/src/game/combat.ts index fb13010..d9e12c0 100644 --- a/src/game/combat.ts +++ b/src/game/combat.ts @@ -466,6 +466,17 @@ export class Effective { modResistance (type: DamageType, factor: number): number { return factor } + + /** + * Called when a test is about to resolve. Decides if the creature should automatically fail. + */ + + failTest (creature: Creature, opponent: Creature): { failed: boolean; log: LogEntry } { + return { + failed: false, + log: nilLog + } + } } /** * A displayable status effect diff --git a/src/game/combat/effects.ts b/src/game/combat/effects.ts index 3e620ad..4474641 100644 --- a/src/game/combat/effects.ts +++ b/src/game/combat/effects.ts @@ -1,4 +1,4 @@ -import { StatusEffect, Damage, DamageType, Action, Condition } from '../combat' +import { StatusEffect, Damage, DamageType, Action, Condition, Vigor } from '../combat' import { DynText, LiveText, ToBe, Verb } from '../language' import { Creature } from "../creature" import { LogLine, LogEntry, LogLines, FAElem, nilLog } from '../interface' @@ -138,18 +138,23 @@ export class DazzlingEffect extends StatusEffect { export class SurrenderEffect extends StatusEffect { constructor () { - super('Surrendered', 'This creature has given up', 'fas fa-flag') + super('Surrendered', 'This creature has given up, and will fail most tests', 'fas fa-flag') } onApply (creature: Creature): LogEntry { + creature.takeDamage( + new Damage( + { amount: creature.vigors.Resolve, target: Vigor.Resolve, type: DamageType.Pure } + ) + ) return new LogLine( `${creature.name.capital} ${creature.name.conjugate(new Verb('surrender'))}!` ) } - preTurn (creature: Creature): { prevented: boolean; log: LogEntry } { + failTest (creature: Creature, opponent: Creature): { failed: boolean; log: LogEntry } { return { - prevented: true, + failed: true, log: nilLog } } diff --git a/src/game/combat/tests.ts b/src/game/combat/tests.ts index 7f3e7da..d3c9792 100644 --- a/src/game/combat/tests.ts +++ b/src/game/combat/tests.ts @@ -8,8 +8,19 @@ function logistic (x0: number, L: number, k: number): (x: number) => number { } } +// TODO this will need to be able to return a LogEntry at some point + abstract class RandomTest implements CombatTest { test (user: Creature, target: Creature): boolean { + const userFail = user.effects.map(effect => effect.failTest(user, target)) + if (userFail.some(result => result.failed)) { + return false + } + const targetFail = target.effects.map(effect => effect.failTest(target, user)) + if (targetFail.some(result => result.failed)) { + return true + } + return Math.random() < this.odds(user, target) } diff --git a/src/game/creatures/human.ts b/src/game/creatures/human.ts index 1957fe7..ee8b324 100644 --- a/src/game/creatures/human.ts +++ b/src/game/creatures/human.ts @@ -4,6 +4,7 @@ import { Noun, Pronoun, ImproperNoun } from '../language' import { VoreType } from '../vore' import { StatusConsequence } from '../combat/consequences' import { SurrenderEffect } from '../combat/effects' +import { SoloCondition } from '../combat/conditions' export class Human extends Creature { constructor (name: Noun, pronouns: Pronoun, options: { @@ -33,6 +34,9 @@ export class Human extends Creature { new StatusConsequence( () => new SurrenderEffect() ) + ], + conditions: [ + new SoloCondition() ] } ))