Bläddra i källkod

Track digested prey properly; show text for dying prey

master
Fen Dweller 5 år sedan
förälder
incheckning
60757e3005
4 ändrade filer med 23 tillägg och 32 borttagningar
  1. +1
    -1
      src/game/combat/actions.ts
  2. +4
    -13
      src/game/entity.ts
  3. +1
    -1
      src/game/interface.ts
  4. +17
    -17
      src/game/vore.ts

+ 1
- 1
src/game/combat/actions.ts Visa fil

@@ -235,7 +235,7 @@ export class TransferAction extends PairAction {
])

allowed (user: Creature, target: Creature) {
if (target.containedIn === this.from) {
if (target.containedIn === this.from && this.from.contents.includes(target)) {
return super.allowed(user, target)
} else {
return false


+ 4
- 13
src/game/entity.ts Visa fil

@@ -71,7 +71,7 @@ export class Creature extends Vore implements Combatant {
}
})

if (this.vigors.Health <= -100) {
if (this.vigors.Health <= 0) {
return this.destroy()
} else {
return new LogLine()
@@ -79,23 +79,14 @@ export class Creature extends Vore implements Combatant {
}

get status (): string {
if (this.vigors[Vigor.Health] <= -100) {
return "Dead"
}
if (this.vigors[Vigor.Stamina] <= -100) {
return "Unconscious"
}
if (this.vigors[Vigor.Resolve] <= -100) {
return "Broken"
}
if (this.vigors[Vigor.Health] <= 0) {
return "Unconscious"
return "Dead"
}
if (this.vigors[Vigor.Stamina] <= 0) {
return "Exhausted"
return "Unconscious"
}
if (this.vigors[Vigor.Resolve] <= 0) {
return "Overpowered"
return "Broken"
}
if (this.containedIn !== null) {
return "Devoured"


+ 1
- 1
src/game/interface.ts Visa fil

@@ -16,7 +16,7 @@ export class LogLines implements LogEntry {

this.parts.forEach(part => {
if (typeof part === "string") {
const partDiv = document.createElement("span")
const partDiv = document.createElement("div")
partDiv.innerText = part
div.appendChild(partDiv)
} else {


+ 17
- 17
src/game/vore.ts Visa fil

@@ -1,7 +1,7 @@
import { Entity, Mortal, POV, Creature } from './entity'
import { Damage, DamageType, Stats, Actionable, Action, Vigor } from './combat'
import { LogLines, LogEntry, CompositeLog, LogLine } from './interface'
import { Noun, Pronoun, POVPair, POVPairArgs, ImproperNoun } from './language'
import { Noun, Pronoun, POVPair, POVPairArgs, ImproperNoun, POVSolo } from './language'
import { DigestAction, DevourAction, ReleaseAction, StruggleAction } from './combat/actions'

export enum VoreType {
@@ -19,7 +19,7 @@ export abstract class Vore implements Mortal {
abstract maxVigors: {[key in Vigor]: number};
abstract disabled: boolean;
abstract resistances: Map<DamageType, number>;
abstract takeDamage (damage: Damage): void;
abstract takeDamage (damage: Damage): LogEntry;
abstract stats: Stats;
abstract status: string;
abstract preyPrefs: Set<VoreType>;
@@ -28,6 +28,10 @@ export abstract class Vore implements Mortal {
abstract predPrefs: Set<VoreType>;
abstract containers: Array<Container>;
destroy (): LogEntry {
const lines = new POVSolo<Vore>([
[[POV.First], (target: Vore) => new LogLine('You die!')],
[[POV.Third], (target: Vore) => new LogLine(`${target.name.capital} dies!`)]
])
this.containers.map(container => {
container.contents.map(prey => {
prey.containedIn = this.containedIn
@@ -37,7 +41,7 @@ export abstract class Vore implements Mortal {
})
})

return new LogLine(`${this.name.capital} dies!`)
return lines.run(this)
}
}

@@ -46,6 +50,7 @@ export interface Container extends Actionable {
owner: Vore;
voreTypes: Set<VoreType>;
contents: Array<Vore>;
digested: Array<Vore>;
capacity: number;
fullness: number;
canTake: (prey: Vore) => boolean;
@@ -62,6 +67,7 @@ export interface Container extends Actionable {

abstract class NormalContainer implements Container {
contents: Array<Vore>
digested: Array<Vore>

abstract consumeLines: POVPair<Vore, Vore>
abstract releaseLines: POVPair<Vore, Vore>
@@ -107,33 +113,26 @@ abstract class NormalContainer implements Container {

tick (dt: number): LogEntry {
const digested: Array<Vore> = []
const absorbed: Array<Vore> = []

const scaled = this.damage.scale(dt / 60)

const damageResults: Array<LogEntry> = []
this.contents.forEach(prey => {
const start = prey.vigors[Vigor.Health]
prey.takeDamage(scaled)
const end = prey.vigors[Vigor.Health]
damageResults.push(prey.takeDamage(scaled))

if (start > 0 && end <= 0) {
if (prey.vigors[Vigor.Health] <= 0) {
digested.push(prey)
}

if (start > -100 && end <= -100) {
absorbed.push(prey)
}
})

const tickedEntries = new CompositeLog(...this.contents.map(prey => this.tickLines.run(this.owner, prey, { damage: scaled })))
const digestedEntries = new CompositeLog(...digested.map(prey => this.digest(prey)))
const absorbedEntries = new CompositeLog(...absorbed.map(prey => this.absorb(prey)))
const tickedEntries = new LogLines(...this.contents.map(prey => this.tickLines.run(this.owner, prey, { damage: scaled })))
const digestedEntries = new LogLines(...digested.map(prey => this.digest(prey)))

this.contents = this.contents.filter(prey => {
return prey.vigors[Vigor.Health] > -100
return prey.vigors[Vigor.Health] > 0
})

return new CompositeLog(tickedEntries, digestedEntries, absorbedEntries)
return new LogLines(tickedEntries, new LogLines(...damageResults), digestedEntries)
}

describe (): LogEntry {
@@ -162,6 +161,7 @@ abstract class NormalContainer implements Container {

constructor (public name: Noun, public owner: Vore, public voreTypes: Set<VoreType>, public capacity: number, private damage: Damage) {
this.contents = []
this.digested = []

this.actions = []



Laddar…
Avbryt
Spara