@@ -1,7 +1,7 @@
import { Creature, POV, Entity } from './entity'
import { Creature, POV, Entity } from './entity'
import { POVPair, POVPairArgs } from './language'
import { POVPair, POVPairArgs } from './language'
import { Container } from './vore'
import { Container } from './vore'
import { LogEntry, LogLines, CompositeLog, FormatText, FormatOpt , LogLine } from './interface'
import { LogEntry, LogLines, CompositeLog, FAElem , LogLine } from './interface'
export interface CombatTest {
export interface CombatTest {
test: (user: Creature, target: Creature) => boolean;
test: (user: Creature, target: Creature) => boolean;
@@ -80,6 +80,34 @@ export interface DamageInstance {
target: Vigor;
target: Vigor;
}
}
export enum Vigor {
Health = "Health",
Stamina = "Stamina",
Willpower = "Willpower"
}
export const VigorIcons: {[key in Vigor]: string} = {
[Vigor.Health]: "fas fa-heart",
[Vigor.Stamina]: "fas fa-bolt",
[Vigor.Willpower]: "fas fa-brain"
}
export type Vigors = {[key in Vigor]: number}
export enum Stat {
STR = 'Strength',
DEX = 'Dexterity',
CON = 'Constitution'
}
export type Stats = {[key in Stat]: number}
export const StatIcons: {[key in Stat]: string} = {
[Stat.STR]: 'fas fa-fist-raised',
[Stat.DEX]: 'fas fa-feather',
[Stat.CON]: 'fas fa-heartbeat'
}
export class Damage {
export class Damage {
readonly damages: DamageInstance[]
readonly damages: DamageInstance[]
@@ -104,26 +132,22 @@ export class Damage {
toString (): string {
toString (): string {
return this.damages.map(damage => damage.amount + " " + damage.type).join("/")
return this.damages.map(damage => damage.amount + " " + damage.type).join("/")
}
}
}
export enum Vigor {
Health,
Stamina,
Willpower
}
render (): LogEntry {
return new LogLine(...this.damages.flatMap(instance => {
return [instance.amount.toString(), new FAElem(VigorIcons[instance.target]), " " + instance.type]
}))
}
export enum Stat {
STR = 'Strength',
DEX = 'Dexterity',
CON = 'Constitution'
}
renderShort (): LogEntry {
const totals: Vigors = Object.keys(Vigor).reduce((total: any, key) => { total[key] = 0; return total }, {})
export type Stats = {[key in Stat]: number}
this.damages.forEach(instance => {
totals[instance.target] += instance.amount
})
export const StatIcons: {[key in Stat]: string} = {
[Stat.STR]: 'fas fa-fist-raised',
[Stat.DEX]: 'fas fa-feather',
[Stat.CON]: 'fas fa-heartbeat'
return new LogLine(...Object.keys(Vigor).flatMap(key => totals[key as Vigor] === 0 ? [] : [totals[key as Vigor].toString(), new FAElem(VigorIcons[key as Vigor])]))
}
}
}
export interface Combatant {
export interface Combatant {
@@ -175,18 +199,15 @@ export class AttackAction extends TogetherAction {
protected successLines: POVPairArgs<Entity, Entity, { damage: Damage }> = new POVPairArgs([
protected successLines: POVPairArgs<Entity, Entity, { damage: Damage }> = new POVPairArgs([
[[POV.First, POV.Third], (user, target, args) => new LogLine(
[[POV.First, POV.Third], (user, target, args) => new LogLine(
`You smack ${target.name} for `,
`You smack ${target.name} for `,
new FormatText(`${args.damage}`, FormatOpt.Damage),
` damage`
args.damage.renderShort()
)],
)],
[[POV.Third, POV.First], (user, target, args) => new LogLine(
[[POV.Third, POV.First], (user, target, args) => new LogLine(
`${user.name.capital} smacks you for `,
`${user.name.capital} smacks you for `,
new FormatText(`${args.damage}`, FormatOpt.Damage),
` damage`
args.damage.renderShort()
)],
)],
[[POV.Third, POV.Third], (user, target, args) => new LogLine(
[[POV.Third, POV.Third], (user, target, args) => new LogLine(
`${user.name.capital} smacks ${target.name} for `,
`${user.name.capital} smacks ${target.name} for `,
new FormatText(`${args.damage}`, FormatOpt.Damage),
` damage`
args.damage.renderShort()
)]
)]
])
])