From 89e5ecd2e1b1d520c3dd93ee72f05b5602ce80f8 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Fri, 6 Nov 2020 17:35:01 -0500 Subject: [PATCH] Only show digestion damage if it's non-zero Also avoid absorbing non-victims, if only certain creatures are being digested. --- src/game/combat.ts | 16 ++++++++++ src/game/combat/effects.ts | 4 +-- src/game/vore.ts | 60 ++++++++++++++++++++------------------ 3 files changed, 50 insertions(+), 30 deletions(-) diff --git a/src/game/combat.ts b/src/game/combat.ts index d93848e..b9dd797 100644 --- a/src/game/combat.ts +++ b/src/game/combat.ts @@ -172,6 +172,22 @@ export class Damage { const statEntries = Object.keys(Stat).flatMap(key => statTotals[key as Stat] === 0 ? [] : [new PropElem(key as Stat, statTotals[key as Stat]), ' ']) return new FormatEntry(new LogLine(...vigorEntries.concat(statEntries)), FormatOpt.DamageInst) } + + nonzero (): boolean { + /* eslint-disable-next-line */ + const vigorTotals: Vigors = Object.keys(Vigor).reduce((total: any, key) => { total[key] = 0; return total }, {}) + /* eslint-disable-next-line */ + const statTotals: Stats = Object.keys(Stat).reduce((total: any, key) => { total[key] = 0; return total }, {}) + this.damages.forEach(instance => { + const factor = instance.type === DamageType.Heal ? -1 : 1 + if (instance.target in Vigor) { + vigorTotals[instance.target as Vigor] += factor * instance.amount + } else if (instance.target in Stat) { + statTotals[instance.target as Stat] += factor * instance.amount + } + }) + return Object.values(vigorTotals).some(v => v !== 0) || Object.values(statTotals).some(v => v !== 0) + } } /** diff --git a/src/game/combat/effects.ts b/src/game/combat/effects.ts index 49b4c45..da2a3ec 100644 --- a/src/game/combat/effects.ts +++ b/src/game/combat/effects.ts @@ -218,10 +218,10 @@ export class InstantDigestionEffect extends StatusEffect { prey.applyEffect(new InstantKillEffect()) predator.voreStats.Mass += prey.voreStats.Mass prey.voreStats.Mass = 0 - container.tick(1, [prey]) return new LogLines( `${prey.name.capital} ${prey.name.conjugate(new ToBe())} instantly digested! `, - new FAElem('fas fa-skull') + new FAElem('fas fa-skull'), + container.tick(0, [prey]) ) } } diff --git a/src/game/vore.ts b/src/game/vore.ts index 080fbff..a16d0e8 100644 --- a/src/game/vore.ts +++ b/src/game/vore.ts @@ -230,40 +230,44 @@ export abstract class NormalVoreContainer extends NormalContainer implements Vor const tickedEntryList: LogEntry[] = [] - const victimList = victims ?? this.contents - victimList.forEach(prey => { - const scaled = this.damage.calc(this.owner, prey).scale(dt / 60) - 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(modified)) - - if (prey.vigors[Vigor.Health] <= 0) { - prey.destroyed = true - this.digested.push(prey) - justDigested.push(prey) - damageResults.push(this.onDigest(prey)) + this.contents.forEach(prey => { + if (victims === undefined || victims.indexOf(prey) >= 0) { + const scaled = this.damage.calc(this.owner, prey).scale(dt / 60) + const modified = this.owner.effects.reduce((damage, effect) => effect.modDigestionDamage(this.owner, prey, this, damage), scaled) + if (modified.nonzero()) { + tickedEntryList.push(this.tickLine(this.owner, prey, { damage: modified })) + damageResults.push(prey.takeDamage(modified)) + } + + if (prey.vigors[Vigor.Health] <= 0) { + prey.destroyed = true + this.digested.push(prey) + justDigested.push(prey) + damageResults.push(this.onDigest(prey)) + } } }) 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 - ) - - const massStolen = Math.min(damageTotal / 100, prey.voreStats.Mass) - - prey.voreStats.Mass -= massStolen - this.owner.voreStats.Mass += massStolen - - if (prey.voreStats.Mass === 0) { - this.absorbed.push(prey) - justAbsorbed.push(prey) - damageResults.push(this.onAbsorb(prey)) + if (victims === undefined || victims.indexOf(prey) >= 0) { + 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 + ) + + const massStolen = Math.min(damageTotal / 100, prey.voreStats.Mass) + + prey.voreStats.Mass -= massStolen + this.owner.voreStats.Mass += massStolen + + if (prey.voreStats.Mass === 0) { + this.absorbed.push(prey) + justAbsorbed.push(prey) + damageResults.push(this.onAbsorb(prey)) + } } })