| @@ -1,7 +1,8 @@ | |||||
| <template> | <template> | ||||
| <div id="app"> | <div id="app"> | ||||
| <Header version="pre-alpha" @selectEncounter="selectEncounter" :encounters="encounters" /> | <Header version="pre-alpha" @selectEncounter="selectEncounter" :encounters="encounters" /> | ||||
| <Combat v-show="$data.encounter === encounter" v-for="(encounter, index) in encounters" :key="'encounter-' + index" :encounter="encounter" /> | |||||
| <Explore :world="world" /> | |||||
| <!-- <Combat v-show="$data.encounter === encounter" v-for="(encounter, index) in encounters" :key="'encounter-' + index" :encounter="encounter" /> --> | |||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| @@ -9,20 +10,23 @@ | |||||
| import { Component, Vue, Prop, Emit } from 'vue-property-decorator' | import { Component, Vue, Prop, Emit } from 'vue-property-decorator' | ||||
| import Combat from './components/Combat.vue' | import Combat from './components/Combat.vue' | ||||
| import Header from './components/Header.vue' | import Header from './components/Header.vue' | ||||
| import Explore from './components/Explore.vue' | |||||
| import * as Creatures from '@/game/creatures' | import * as Creatures from '@/game/creatures' | ||||
| import * as Items from '@/game/items' | import * as Items from '@/game/items' | ||||
| import { Creature } from '@/game/creature' | import { Creature } from '@/game/creature' | ||||
| import { ProperNoun, TheyPronouns, FemalePronouns, MalePronouns, ImproperNoun } from '@/game/language' | |||||
| import { ProperNoun, TheyPronouns, FemalePronouns, MalePronouns, ImproperNoun, POV } from '@/game/language' | |||||
| import { Place, Direction, World } from '@/game/world' | |||||
| import { Encounter } from './game/combat' | import { Encounter } from './game/combat' | ||||
| @Component({ | @Component({ | ||||
| components: { | components: { | ||||
| Combat, Header | |||||
| Combat, Header, Explore | |||||
| }, | }, | ||||
| data () { | data () { | ||||
| return { | return { | ||||
| encounter: null, | encounter: null, | ||||
| encounters: null | |||||
| encounters: null, | |||||
| world: null | |||||
| } | } | ||||
| } | } | ||||
| }) | }) | ||||
| @@ -46,6 +50,18 @@ export default class App extends Vue { | |||||
| this.$data.encounters.push(new Encounter({ name: 'Large Wah' }, this.makeParty().concat([new Creatures.Shingo()]))) | this.$data.encounters.push(new Encounter({ name: 'Large Wah' }, this.makeParty().concat([new Creatures.Shingo()]))) | ||||
| this.$data.encounter = this.$data.encounters[0] | this.$data.encounter = this.$data.encounters[0] | ||||
| const foo = new Place('Foo', 'A very foo-y place') | |||||
| const other = new Place('Bar', 'The bar') | |||||
| foo.biconnect(Direction.North, other) | |||||
| const something = new Place('Baz', 'BAZZZZZZZZZZ') | |||||
| foo.biconnect(Direction.East, something) | |||||
| const player = new Creatures.Wolf() | |||||
| player.perspective = POV.Second | |||||
| player.location = foo | |||||
| this.$data.world = new World(player) | |||||
| } | } | ||||
| makeParty (): Creature[] { | makeParty (): Creature[] { | ||||
| @@ -0,0 +1,137 @@ | |||||
| <template> | |||||
| <div class="explore-layout"> | |||||
| <div class="explore-log"> | |||||
| </div> | |||||
| <div class="explore-worldinfo"> | |||||
| <p>Time: {{ world.time }}</p> | |||||
| </div> | |||||
| <div class="explore-info"> | |||||
| <h2 class="location-name">{{ location.name }}</h2> | |||||
| <p class="location-desc">{{ location.desc }}</p> | |||||
| </div> | |||||
| <div class="explore-nav"> | |||||
| <button @click="location=location.connections[direction]" v-for="direction in Object.keys(location.connections)" :key="direction" class="nav-direction" :style="navBtnCss(direction)"> | |||||
| {{location.connections[direction].name}} | |||||
| </button> | |||||
| </div> | |||||
| <div class="explore-actions"> | |||||
| </div> | |||||
| </div> | |||||
| </template> | |||||
| <script lang="ts"> | |||||
| import { Component, Prop, Vue } from 'vue-property-decorator' | |||||
| import { Direction, World, Place } from '@/game/world' | |||||
| @Component({}) | |||||
| export default class Explore extends Vue { | |||||
| get location () { | |||||
| return this.world.player.location | |||||
| } | |||||
| set location (loc: Place) { | |||||
| this.world.player.location = loc | |||||
| } | |||||
| @Prop() | |||||
| world!: World | |||||
| navBtnCss (dir: Direction) { | |||||
| return { | |||||
| '--nav-direction': dir | |||||
| } | |||||
| } | |||||
| } | |||||
| </script> | |||||
| <style scoped> | |||||
| .explore-layout { | |||||
| position: relative; | |||||
| display: grid; | |||||
| grid-template-areas: "log worldinfo" | |||||
| "log info " | |||||
| "log actions " | |||||
| "nav actions "; | |||||
| grid-template-rows: 0.5fr 2fr 1fr 1fr; | |||||
| grid-template-columns: 2fr 1fr; | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| } | |||||
| .explore-log { | |||||
| grid-area: log; | |||||
| background: #222; | |||||
| } | |||||
| .explore-worldinfo { | |||||
| grid-area: worldinfo; | |||||
| background: #111; | |||||
| } | |||||
| .explore-info { | |||||
| grid-area: info; | |||||
| background: #333; | |||||
| display: flex; | |||||
| flex-direction: column; | |||||
| flex-wrap: none; | |||||
| justify-content: start; | |||||
| align-items: center; | |||||
| } | |||||
| .location-name { | |||||
| font-size: 200%; | |||||
| } | |||||
| .location-desc { | |||||
| font-size: 150%; | |||||
| } | |||||
| .explore-nav { | |||||
| grid-area: nav; | |||||
| background: #444; | |||||
| display: grid; | |||||
| justify-content: center; | |||||
| align-content: center; | |||||
| grid-template-areas: "Northwest North Northeast" | |||||
| "West Center East " | |||||
| "Southwest South Southeast"; | |||||
| grid-template-rows: 1fr 1fr 1fr; | |||||
| grid-template-columns: 1fr 1fr 1fr; | |||||
| } | |||||
| .nav-direction { | |||||
| grid-area: var(--nav-direction); | |||||
| margin: 5%; | |||||
| background: #555; | |||||
| color: #ccc; | |||||
| font-size: 200%; | |||||
| border-color: #ccc; | |||||
| border-width: 3px; | |||||
| border-radius: 8px; | |||||
| border-style: outset; | |||||
| outline: none; | |||||
| } | |||||
| .nav-direction:hover { | |||||
| background: #666; | |||||
| } | |||||
| .nav-direction:active { | |||||
| background: #777; | |||||
| border-style: inset; | |||||
| } | |||||
| .nav-direction:focus { | |||||
| background: #666; | |||||
| } | |||||
| .explore-actions { | |||||
| grid-area: actions; | |||||
| background: #555; | |||||
| } | |||||
| </style> | |||||
| @@ -477,12 +477,10 @@ export class Encounter { | |||||
| // still not undefined... | // still not undefined... | ||||
| const currentProgress = this.initiatives.get(combatant) ?? 0 | const currentProgress = this.initiatives.get(combatant) ?? 0 | ||||
| this.initiatives.set(combatant, currentProgress + closestRemaining * Math.max(combatant.stats.Speed, 1)) | this.initiatives.set(combatant, currentProgress + closestRemaining * Math.max(combatant.stats.Speed, 1)) | ||||
| console.log(combatant.name.toString(), currentProgress, closestRemaining) | |||||
| }) | }) | ||||
| // TODO: still let the creature use drained-vigor moves | // TODO: still let the creature use drained-vigor moves | ||||
| console.log(this.currentMove.name.toString()) | |||||
| if (this.currentMove.disabled) { | if (this.currentMove.disabled) { | ||||
| this.nextMove() | this.nextMove() | ||||
| } | } | ||||
| @@ -1,7 +1,7 @@ | |||||
| import { DamageType, Damage, Stats, Vigor, VoreStats, VoreStat, Stat, Vigors } from './combat' | import { DamageType, Damage, Stats, Vigor, VoreStats, VoreStat, Stat, Vigors } from './combat' | ||||
| import { Noun, Pronoun, TextLike, POV, PronounAsNoun, FirstPersonPronouns, SecondPersonPronouns } from './language' | import { Noun, Pronoun, TextLike, POV, PronounAsNoun, FirstPersonPronouns, SecondPersonPronouns } from './language' | ||||
| import { LogEntry, LogLine } from './interface' | import { LogEntry, LogLine } from './interface' | ||||
| import { Container } from './vore' | |||||
| import { Place, Nowhere } from './world' | |||||
| export abstract class Entity { | export abstract class Entity { | ||||
| get name (): Noun { | get name (): Noun { | ||||
| @@ -27,9 +27,10 @@ export abstract class Entity { | |||||
| desc: TextLike = "It's a ting." | desc: TextLike = "It's a ting." | ||||
| perspective: POV = POV.Third | perspective: POV = POV.Third | ||||
| title: TextLike = "Some thing." | title: TextLike = "Some thing." | ||||
| location: Place | |||||
| constructor (public baseName: Noun, public kind: Noun, public basePronouns: Pronoun) { | constructor (public baseName: Noun, public kind: Noun, public basePronouns: Pronoun) { | ||||
| this.location = Nowhere | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,64 @@ | |||||
| import { TextLike } from './language' | |||||
| import { Entity } from './entity' | |||||
| import { Creature } from './creature' | |||||
| 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 Connection { | |||||
| constructor (public src: Place, public dst: Place) { | |||||
| } | |||||
| } | |||||
| export class Place { | |||||
| connections: {[key in Direction]?: Place} = {} | |||||
| constructor (public name: TextLike, public desc: TextLike) { | |||||
| } | |||||
| connect (dir: Direction, dst: Place) { | |||||
| this.connections[dir] = dst | |||||
| } | |||||
| biconnect (dir: Direction, dst: Place) { | |||||
| this.connections[dir] = dst | |||||
| dst.connections[reverse(dir)] = this | |||||
| } | |||||
| } | |||||
| export const Nowhere = new Place( | |||||
| "Nowhere", | |||||
| "This isn't anywhere!" | |||||
| ) | |||||
| export class World { | |||||
| time = "It's time!" | |||||
| creatures: Creature[] = [] | |||||
| constructor (public player: Creature) { | |||||
| this.creatures.push(player) | |||||
| } | |||||
| } | |||||