Feast 2.0!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

190 lines
4.2 KiB

  1. <template>
  2. <div id="app">
  3. <Header :version="version" />
  4. <div id="main-area">
  5. <transition name="component-fade" mode='out-in'>
  6. <component
  7. @profile="profile"
  8. @exit="$data.profileSubject = null"
  9. @give-in="gameOver()"
  10. @leave-combat="$data.world.encounter = null"
  11. v-bind:is="mode"
  12. :world="$data.world"
  13. :subject="$data.profileSubject"
  14. :encounter="$data.world.encounter" />
  15. </transition>
  16. </div>
  17. </div>
  18. </template>
  19. <script lang="ts">
  20. import { Component, Vue, Prop, Emit } from 'vue-property-decorator'
  21. import Header from './components/Header.vue'
  22. import Combat from './components/Combat.vue'
  23. import Explore from './components/Explore.vue'
  24. import Profile from './components/Profile.vue'
  25. import * as Creatures from '@/game/creatures'
  26. import * as Items from '@/game/items'
  27. import { Creature } from '@/game/creature'
  28. import { ProperNoun, TheyPronouns, FemalePronouns, MalePronouns, ImproperNoun, POV } from '@/game/language'
  29. import { Place, Direction, World, Choice } from '@/game/world'
  30. import { Encounter, Side } from './game/combat'
  31. import { LogLine, nilLog } from './game/interface'
  32. import { InstantKillEffect } from './game/combat/effects'
  33. import moment from 'moment'
  34. import { Town } from './game/maps/town'
  35. @Component({
  36. components: {
  37. Combat, Header, Explore, Profile
  38. },
  39. data () {
  40. return {
  41. world: null,
  42. home: null,
  43. profileSubject: null,
  44. props: {
  45. Explore: {
  46. world: this
  47. }
  48. },
  49. version: "pre-alpha"
  50. }
  51. }
  52. })
  53. export default class App extends Vue {
  54. constructor () {
  55. super()
  56. }
  57. get mode () {
  58. if (this.$data.profileSubject !== null) {
  59. return "Profile"
  60. } else if (this.$data.world.encounter !== null) {
  61. return "Combat"
  62. } else {
  63. return "Explore"
  64. }
  65. }
  66. @Emit('startFight')
  67. startFight (encounter: Encounter) {
  68. this.$data.world.encounter = encounter
  69. }
  70. created () {
  71. const player = new Creatures.Player()
  72. player.perspective = POV.Second
  73. player.side = Side.Heroes
  74. player.equipment[Items.EquipmentSlot.MainHand] = new Items.Sword()
  75. player.equipment[Items.EquipmentSlot.Head] = new Items.Helmet()
  76. player.items.push(new Items.HealthPotion())
  77. player.items.push(new Items.Mace())
  78. player.items.push(new Items.Dagger())
  79. this.$data.world = new World(player)
  80. this.$data.home = Town()
  81. player.location = this.$data.home
  82. }
  83. gameOver () {
  84. this.$data.world.encounter = null
  85. this.$data.world.player.location = this.$data.home
  86. }
  87. profile (subject: Creature) {
  88. this.$data.profileSubject = subject
  89. }
  90. }
  91. </script>
  92. <style>
  93. body, html {
  94. background: #181818;
  95. width: 100%;
  96. height: 100%;
  97. overflow-x: hidden;
  98. }
  99. html {
  100. font-size: calc(0.75em + 1vmin);
  101. }
  102. #app {
  103. position: relative;
  104. font-family: Avenir, Helvetica, Arial, sans-serif;
  105. -webkit-font-smoothing: antialiased;
  106. -moz-osx-font-smoothing: grayscale;
  107. text-align: center;
  108. color: #ddd;
  109. background: #111;
  110. width: 100%;
  111. margin: auto;
  112. height: 100%;
  113. display: flex;
  114. flex-direction: column;
  115. }
  116. #main-area {
  117. position: relative;
  118. flex: 10;
  119. overflow-x: hidden;
  120. overflow-y: hidden;
  121. }
  122. .tippy-box {
  123. text-align: center;
  124. border-radius: 10px;
  125. }
  126. .tippy-box .tooltip-title {
  127. font-size: 18pt;
  128. font-family: sans-serif;
  129. }
  130. .tippy-box .tooltip-body {
  131. font-size: 12pt;
  132. font-family: sans-serif;
  133. }
  134. *::-webkit-scrollbar {
  135. height: 12px;
  136. }
  137. *::-webkit-scrollbar-button {
  138. width: 0px;
  139. height: 0px;
  140. }
  141. *::-webkit-scrollbar-thumb {
  142. background: #e1e1e1;
  143. border: 0px none #ffffff;
  144. border-radius: 50px;
  145. }
  146. *::-webkit-scrollbar-thumb:hover {
  147. background: #ffffff;
  148. }
  149. *::-webkit-scrollbar-thumb:active {
  150. background: #000000;
  151. }
  152. *::-webkit-scrollbar-track {
  153. background: #00000000;
  154. border: 0px none #ffffff;
  155. border-radius: 50px;
  156. }
  157. *::-webkit-scrollbar-track:hover {
  158. background: #666666;
  159. }
  160. *::-webkit-scrollbar-track:active {
  161. background: #333333;
  162. }
  163. *::-webkit-scrollbar-corner {
  164. background: transparent;
  165. }
  166. .component-fade-enter-active, .component-fade-leave-active {
  167. transition: opacity .3s ease;
  168. }
  169. .component-fade-enter, .component-fade-leave-to
  170. /* .component-fade-leave-active below version 2.1.8 */ {
  171. opacity: 0;
  172. }
  173. </style>