import { Place, Choice, Direction } from '../world' import { ProperNoun, ImproperNoun, MalePronouns, FemalePronouns, TheyPronouns } from '../language' import { Encounter } from '../combat' import * as Creatures from '../creatures' import * as Items from '../items' import { LogLine, nilLog } from '../interface' import { Creature } from '../creature' import { DevourAction } from '../combat/actions' import { SurrenderEffect } from '../combat/effects' import moment from 'moment' function makeParty (): Creature[] { const fighter = new Creatures.Human(new ProperNoun("Redgar"), MalePronouns, { stats: { Toughness: 20, Power: 20, Speed: 15, Willpower: 15, Charm: 10 } }) fighter.title = "Lv. 6 Fighter" fighter.equipment.set(Items.EquipmentSlot.MainHand, new Items.Sword()) const rogue = new Creatures.Human(new ProperNoun('Lidda'), FemalePronouns, { stats: { Toughness: 10, Power: 15, Speed: 20, Willpower: 15, Charm: 20 } }) rogue.title = "Lv. 5 Rogue" rogue.equipment.set(Items.EquipmentSlot.MainHand, new Items.Dagger()) const wizard = new Creatures.Human(new ProperNoun('Mialee'), FemalePronouns, { stats: { Toughness: 10, Power: 10, Speed: 15, Willpower: 20, Charm: 25 } }) wizard.title = "Lv. 6 Wizard" wizard.equipment.set(Items.EquipmentSlot.MainHand, new Items.Wand()) const cleric = new Creatures.Human(new ProperNoun('Jozan'), MalePronouns, { stats: { Toughness: 15, Power: 15, Speed: 10, Willpower: 20, Charm: 15 } }) cleric.title = "Lv. 5 Cleric" cleric.equipment.set(Items.EquipmentSlot.MainHand, new Items.Mace()) return [fighter, cleric, rogue, wizard] } export const Town = (): Place => { const home = new Place( new ProperNoun('Your home'), "A very home-y place" ) const westAve = new Place( new ImproperNoun('West Avenue'), "Streets of Sim City" ) const westRoad = new Place( new ImproperNoun('road'), "West of town" ) const woods = new Place( new ImproperNoun('woods'), "Scary woods" ) const bosses = new Place( new ProperNoun("BOSS ZONE"), "Extra scary" ) woods.choices.push( new Choice( "Fight a wolf", "yolo", (world, executor) => { world.encounter = new Encounter( { name: "You punched a wolf" }, [executor, new Creatures.Wolf()] ) return new LogLine(`FIGHT TIME`) } ) ) woods.choices.push( new Choice( "Fight a dragon", "yolo", (world, executor) => { world.encounter = new Encounter( { name: "You punched a dragon" }, [executor, new Creatures.Dragon()] ) return new LogLine(`FIGHT TIME`) } ) ) const bossEncounters = [ new Encounter( { name: "Withers & Kenzie" }, makeParty().concat([new Creatures.Withers(), new Creatures.Kenzie()]) ), new Encounter( { name: "Goldeneye" }, makeParty().concat([new Creatures.Goldeneye()]) ), new Encounter( { name: "Large Wah" }, makeParty().concat([new Creatures.Shingo()]) ) ] home.choices.push( new Choice( "Nap", "Zzzzzz", (world, executor) => { return world.advance(moment.duration(1, "hour")) } ) ) home.choices.push( new Choice( "Eat someone", "Slurp", (world, executor) => { const snack = new Creatures.Human(new ProperNoun("Snack"), TheyPronouns) snack.applyEffect(new SurrenderEffect()) const options = executor.validActions(snack).filter(action => action instanceof DevourAction) return options[Math.floor(options.length * Math.random())].execute(executor, snack) } ) ) bossEncounters.forEach(encounter => { bosses.choices.push( new Choice( encounter.desc.name, "Boss fight!", (world, executor) => { world.encounter = encounter return nilLog } ) ) }) home.biconnect(Direction.North, westAve) westAve.biconnect(Direction.West, westRoad) westRoad.biconnect(Direction.South, woods) westRoad.biconnect(Direction.North, bosses) return home }