|
- 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<string|LogEntry>
-
- constructor (...parts: Array<string|LogEntry>) {
- 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())
- }
- }
|