|  | import { TextLike, Verb, Noun, ProperNoun } from '@/game/language'
import { Creature } from '@/game/creature'
import moment, { Moment, Duration } from 'moment'
import { LogEntry, LogLines } from '@/game/interface'
import { Encounter } from '@/game/combat'
export enum Direction {
  Northwest = "Northwest",
  North = "North",
  Northeast = "Northeast",
  West = "West",
  East = "East",
  Southwest = "Southwest",
  South = "South",
  Southeast = "Southeast"
}
export function reverse (dir: Direction): Direction {
  switch (dir) {
    case Direction.Northwest: return Direction.Southeast
    case Direction.North: return Direction.South
    case Direction.Northeast: return Direction.Southwest
    case Direction.West: return Direction.East
    case Direction.East: return Direction.West
    case Direction.Southwest: return Direction.Northeast
    case Direction.South: return Direction.North
    case Direction.Southeast: return Direction.Northwest
  }
}
export class Choice {
  constructor (public name: TextLike, public desc: TextLike, public execute: (world: World, executor: Creature) => LogEntry) {
  }
  visible (): boolean {
    return true
  }
  accessible (): boolean {
    return true
  }
}
export class Connection {
  constructor (public src: Place, public dst: Place, public name: TextLike = "Travel", public desc: TextLike = "Go there lol") {
  }
  visible (): boolean {
    return true
  }
  accessible (): boolean {
    return true
  }
  travel (world: World, traveler: Creature): LogEntry {
    const advanceLogs = world.advance(moment.duration(5, "minutes"))
    traveler.location = this.dst
    return new LogLines(
      advanceLogs,
      `${traveler.name.capital} ${traveler.name.conjugate(new Verb('travel'))} to ${this.dst.name}.`
    )
  }
}
export class Place {
  connections: {[key in Direction]?: Connection} = {}
  choices: Choice[] = []
  constructor (public name: Noun, public desc: TextLike) {
  }
  connect (dir: Direction, dst: Place) {
    this.connections[dir] = new Connection(this, dst)
  }
  biconnect (dir: Direction, dst: Place) {
    this.connect(dir, dst)
    dst.connect(reverse(dir), this)
  }
}
export const Nowhere = new Place(
  new ProperNoun("Nowhere"),
  "This isn't anywhere!"
)
export class World {
  time: Moment
  creatures: Creature[] = []
  encounter: Encounter|null = null
  party: Creature[] = []
  constructor (public player: Creature) {
    this.time = moment.utc([500, 1, 1, 9, 0, 0, 0])
    this.creatures.push(player)
  }
  advance (dt: Duration): LogEntry {
    this.time.add(dt)
    return new LogLines(
      ...this.player.containers.map(
        container => container.tick(dt.asSeconds())
      )
    )
  }
}
 |