Просмотр исходного кода

Track digested prey properly; show text for dying prey

master
Fen Dweller 5 лет назад
Родитель
Сommit
60757e3005
4 измененных файлов: 23 добавлений и 32 удалений
  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 Просмотреть файл

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


allowed (user: Creature, target: Creature) { 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) return super.allowed(user, target)
} else { } else {
return false return false


+ 4
- 13
src/game/entity.ts Просмотреть файл

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


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


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


+ 1
- 1
src/game/interface.ts Просмотреть файл

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


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


+ 17
- 17
src/game/vore.ts Просмотреть файл

@@ -1,7 +1,7 @@
import { Entity, Mortal, POV, Creature } from './entity' import { Entity, Mortal, POV, Creature } from './entity'
import { Damage, DamageType, Stats, Actionable, Action, Vigor } from './combat' import { Damage, DamageType, Stats, Actionable, Action, Vigor } from './combat'
import { LogLines, LogEntry, CompositeLog, LogLine } from './interface' 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' import { DigestAction, DevourAction, ReleaseAction, StruggleAction } from './combat/actions'


export enum VoreType { export enum VoreType {
@@ -19,7 +19,7 @@ export abstract class Vore implements Mortal {
abstract maxVigors: {[key in Vigor]: number}; abstract maxVigors: {[key in Vigor]: number};
abstract disabled: boolean; abstract disabled: boolean;
abstract resistances: Map<DamageType, number>; abstract resistances: Map<DamageType, number>;
abstract takeDamage (damage: Damage): void;
abstract takeDamage (damage: Damage): LogEntry;
abstract stats: Stats; abstract stats: Stats;
abstract status: string; abstract status: string;
abstract preyPrefs: Set<VoreType>; abstract preyPrefs: Set<VoreType>;
@@ -28,6 +28,10 @@ export abstract class Vore implements Mortal {
abstract predPrefs: Set<VoreType>; abstract predPrefs: Set<VoreType>;
abstract containers: Array<Container>; abstract containers: Array<Container>;
destroy (): LogEntry { 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 => { this.containers.map(container => {
container.contents.map(prey => { container.contents.map(prey => {
prey.containedIn = this.containedIn 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; owner: Vore;
voreTypes: Set<VoreType>; voreTypes: Set<VoreType>;
contents: Array<Vore>; contents: Array<Vore>;
digested: Array<Vore>;
capacity: number; capacity: number;
fullness: number; fullness: number;
canTake: (prey: Vore) => boolean; canTake: (prey: Vore) => boolean;
@@ -62,6 +67,7 @@ export interface Container extends Actionable {


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


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


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


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


const damageResults: Array<LogEntry> = []
this.contents.forEach(prey => { 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) 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 => { 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 { 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) { constructor (public name: Noun, public owner: Vore, public voreTypes: Set<VoreType>, public capacity: number, private damage: Damage) {
this.contents = [] this.contents = []
this.digested = []


this.actions = [] this.actions = []




Загрузка…
Отмена
Сохранить