import { Stat, Vigor } from './combat' export interface LogEntry { render: () => HTMLElement[]; } export class LogLines implements LogEntry { lines: string[] constructor (...lines: string[]) { this.lines = lines } render (): HTMLElement[] { return this.lines.map(line => { const div = document.createElement("div") div.innerText = line return div }) } } export enum FormatOpt { Damage = "log-damage", DamageInst = "damage-instance" } export class FormatEntry implements LogEntry { constructor (private entry: LogEntry, private opt: FormatOpt) { } render (): HTMLElement[] { const span = document.createElement("span") this.entry.render().forEach(elem => { span.appendChild(elem) }) span.classList.add(this.opt) return [span] } } export class FormatText implements LogEntry { constructor (private opt: FormatOpt, private line: string) { } render (): HTMLElement[] { const span = document.createElement("span") span.innerText = this.line span.classList.add(this.opt) return [span] } } export class LogLine implements LogEntry { private parts: Array constructor (...parts: Array) { this.parts = parts } render (): HTMLElement[] { const div = document.createElement("span") this.parts.forEach(part => { if (typeof part === "string") { const partSpan = document.createElement("span") partSpan.innerText = part div.appendChild(partSpan) } else { (part as LogEntry).render().forEach(logPart => { div.appendChild(logPart) }) } }) return [div] } } export class FAElem implements LogEntry { constructor (private name: string) { } render (): HTMLElement[] { const i = document.createElement("i") this.name.split(" ").map(cls => i.classList.add(cls)) return [i] } } export class PropElem implements LogEntry { constructor (private value: number, private prop: Stat | Vigor) { } render (): HTMLElement[] { let cls: string switch (this.prop) { case Vigor.Health: cls = "fas fa-heart"; break case Vigor.Stamina: cls = "fas fa-bolt"; break case Vigor.Resolve: cls = "fas fa-brain"; break case Stat.Toughness: cls = "fas fa-heartbeat"; break case Stat.Power: cls = "fas fa-fist-raised"; break case Stat.Speed: cls = "fas fa-weather"; break case Stat.Willpower: cls = "fas fa-book"; break case Stat.Charm: cls = "fas fa-comments"; break } const span = document.createElement("span") span.classList.add("stat-entry") span.textContent = this.value.toString() new FAElem(cls).render().forEach(elem => { span.appendChild(elem) }) span.dataset.tooltip = this.prop span.dataset["tooltip-full"] = this.prop return [span] } } export class ImgElem implements LogEntry { constructor (private url: string) { } render (): HTMLElement[] { const img = document.createElement("img") img.src = this.url return [img] } } export class CompositeLog implements LogEntry { entries: LogEntry[] constructor (...entries: LogEntry[]) { this.entries = entries } render (): HTMLElement[] { return this.entries.flatMap(e => e.render()) } }