diff --git a/src/components/ContainerView.vue b/src/components/ContainerView.vue
index 82b5a11..4636fab 100644
--- a/src/components/ContainerView.vue
+++ b/src/components/ContainerView.vue
@@ -6,6 +6,8 @@
{{prey.name}}
Digested:
{{prey.name}}
+ Absorbed:
+ {{prey.name}}
diff --git a/src/game/vore.ts b/src/game/vore.ts
index b7ee244..447c41b 100644
--- a/src/game/vore.ts
+++ b/src/game/vore.ts
@@ -1,5 +1,5 @@
import { Mortal } from './entity'
-import { Damage, DamageType, Stats, Actionable, Action, Vigor, VoreStats, VisibleStatus, VoreStat } from './combat'
+import { Damage, DamageType, Stats, Actionable, Action, Vigor, VoreStats, VisibleStatus, VoreStat, DamageInstance } from './combat'
import { LogLines, LogEntry, LogLine } from './interface'
import { Noun, Pronoun, ImproperNoun, TextLike, Verb, SecondPersonPronouns, PronounAsNoun, FirstPersonPronouns, PairLineArgs, SoloLine, POV } from './language'
import { DigestAction, DevourAction, ReleaseAction, StruggleAction } from './combat/actions'
@@ -21,11 +21,15 @@ export abstract class Vore extends Mortal {
voreStats: VoreStats
- constructor (name: Noun, kind: Noun, pronouns: Pronoun, baseStats: Stats, public preyPrefs: Set, public predPrefs: Set, public mass: number) {
+ constructor (name: Noun, kind: Noun, pronouns: Pronoun, baseStats: Stats, public preyPrefs: Set, public predPrefs: Set, private baseMass: number) {
super(name, kind, pronouns, baseStats)
const containers = this.containers
+ // we can't use arrow notation for getters, so we gotta do this
+ // eslint-disable-next-line
+ const self = this
+
this.voreStats = {
get [VoreStat.Bulk] () {
return containers.reduce(
@@ -45,7 +49,12 @@ export abstract class Vore extends Mortal {
this.Mass
)
},
- [VoreStat.Mass]: mass,
+ get [VoreStat.Mass] () {
+ return self.baseMass
+ },
+ set [VoreStat.Mass] (mass: number) {
+ self.baseMass = mass
+ },
get [VoreStat.PreyCount] () {
return containers.reduce(
(total: number, container: VoreContainer) => {
@@ -224,6 +233,7 @@ export abstract class NormalVoreContainer extends NormalContainer implements Vor
fluidColor = "#00ff0088"
digested: Array = []
+ absorbed: Array = []
constructor (name: Noun, owner: Vore, voreTypes: Set, capacity: number, private damage: Damage) {
super(name, owner, voreTypes, capacity)
@@ -234,7 +244,7 @@ export abstract class NormalVoreContainer extends NormalContainer implements Vor
}
get fullness (): number {
- return Array.from(this.contents.concat(this.digested).values()).reduce((total: number, prey: Vore) => total + prey.voreStats.Bulk, 0)
+ return Array.from(this.contents.concat(this.digested, this.absorbed).values()).reduce((total: number, prey: Vore) => total + prey.voreStats.Bulk, 0)
}
consumeLine: PairLineArgs = (user, target, args) => {
@@ -249,8 +259,13 @@ export abstract class NormalVoreContainer extends NormalContainer implements Vor
return new LogLine(`${user.name.capital.possessive} ${args.container.name} ${args.container.name.conjugate(new Verb('finish', 'finishes'))} ${Words.Digests.present} ${target.name.objective} down, ${target.pronouns.possessive} ${Words.Struggles.singular} fading away.`)
}
+ absorbLine: PairLineArgs = (user, target, args) => {
+ return new LogLine(`${user.name.capital.possessive} ${args.container.name} ${args.container.name.conjugate(new Verb('finish', 'finishes'))} ${Words.Absorbs.present} ${target.name.objective}, fully claiming ${target.pronouns.objective}.`)
+ }
+
tick (dt: number): LogEntry {
const justDigested: Array = []
+ const justAbsorbed: Array = []
const scaled = this.damage.scale(dt / 60)
@@ -268,13 +283,43 @@ export abstract class NormalVoreContainer extends NormalContainer implements Vor
}
})
+ this.digested.forEach(prey => {
+ const damageTotal: number = prey.effectiveDamage(scaled).damages.filter(instance => instance.target === Vigor.Health).reduce(
+ (total: number, instance: DamageInstance) => total + instance.amount,
+ 0
+ )
+
+ console.log(damageTotal)
+
+ const massStolen = Math.min(damageTotal / 100, prey.voreStats.Mass)
+
+ console.log(massStolen)
+ prey.voreStats.Mass -= massStolen
+ this.owner.voreStats.Mass += massStolen
+
+ if (prey.voreStats.Mass === 0) {
+ this.absorbed.push(prey)
+ justAbsorbed.push(prey)
+ }
+ })
+
const digestedEntries = this.digest(justDigested)
+ const absorbedEntries = this.absorb(justAbsorbed)
+ console.log(this.digested, this.absorbed)
this.contents = this.contents.filter(prey => {
return prey.vigors[Vigor.Health] > 0
})
- return new LogLines(tickedEntries, new LogLines(...damageResults), digestedEntries)
+ this.digested = this.digested.filter(prey => {
+ return prey.voreStats.Mass > 0
+ })
+
+ return new LogLines(tickedEntries, new LogLines(...damageResults), digestedEntries, absorbedEntries)
+ }
+
+ absorb (preys: Vore[]): LogEntry {
+ return new LogLines(...preys.map(prey => this.absorbLine(this.owner, prey, { container: this })))
}
digest (preys: Vore[]): LogEntry {
diff --git a/src/game/words.ts b/src/game/words.ts
index 0e2d7ef..70bf32b 100644
--- a/src/game/words.ts
+++ b/src/game/words.ts
@@ -31,6 +31,12 @@ export const Digests = new RandomWord([
new Verb("dissolve", "dissolves", "dissolving", "dissolved")
])
+export const Absorbs = new RandomWord([
+ new Verb("absorb"),
+ new Verb("soak up", "soaks up", "soaking up", "soaked up"),
+ new Verb("melt")
+])
+
export const Struggles = new RandomWord([
new Verb("squirm"),
new Verb("struggle", "struggles", "struggling", "struggled"),