Feast 2.0!
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 

128 строки
2.8 KiB

  1. <template>
  2. <div class="equipment-view">
  3. <button @click="unequip(slot)" :class="equipmentClass(slot)" :style="equipmentCss(slot)" v-for="slot in Object.keys(EquipmentSlot)" :key="slot">{{ subject.equipment[slot] === undefined ? slot : subject.equipment[slot].name.capital.all }}</button>
  4. </div>
  5. </template>
  6. <script lang="ts">
  7. import { Component, Prop, Vue, Watch, Emit } from 'vue-property-decorator'
  8. import { Creature } from '@/game/creature'
  9. import { POV } from '@/game/language'
  10. import { Stats, Stat } from '@/game/combat'
  11. import { Item, ItemKindIcons, ItemKind, EquipmentSlot } from '@/game/items'
  12. import { World } from '@/game/world'
  13. @Component({
  14. data () {
  15. return {
  16. ItemKindIcons: ItemKindIcons,
  17. EquipmentSlot: EquipmentSlot
  18. }
  19. }
  20. })
  21. export default class ItemView extends Vue {
  22. @Prop()
  23. world!: World
  24. @Prop({ required: true })
  25. subject!: Creature
  26. unequip (slot: EquipmentSlot) {
  27. if (this.subject.side === this.world.player.side) {
  28. this.subject.unequip(slot)
  29. }
  30. }
  31. equipmentClass (slot: EquipmentSlot) {
  32. const classes: string[] = []
  33. classes.push("equipment-slot")
  34. if (this.subject.equipment[slot] !== undefined) {
  35. classes.push("equipment-slot-active")
  36. } else {
  37. classes.push("equipment-slot-empty")
  38. }
  39. return classes.reduce((info: any, cls: string) => { info[cls] = true; return info }, {})
  40. }
  41. equipmentCss (slot: EquipmentSlot) {
  42. const css = {
  43. top: "",
  44. left: ""
  45. }
  46. switch (slot) {
  47. case EquipmentSlot.Head:
  48. css.top = "10%"
  49. css.left = "50%"
  50. break
  51. case EquipmentSlot.Chest:
  52. css.top = "35%"
  53. css.left = "25%"
  54. break
  55. case EquipmentSlot.Arms:
  56. css.top = "35%"
  57. css.left = "75%"
  58. break
  59. case EquipmentSlot.MainHand:
  60. css.top = "60%"
  61. css.left = "15%"
  62. break
  63. case EquipmentSlot.OffHand:
  64. css.top = "60%"
  65. css.left = "85%"
  66. break
  67. case EquipmentSlot.Legs:
  68. css.top = "60%"
  69. css.left = "50%"
  70. break
  71. case EquipmentSlot.Feet:
  72. css.top = "90%"
  73. css.left = "50%"
  74. break
  75. }
  76. return css
  77. }
  78. }
  79. </script>
  80. <!-- Add "scoped" attribute to limit CSS to this component only -->
  81. <style scoped>
  82. .equipment-view {
  83. position: relative;
  84. border: 4px outset;
  85. border-radius: 4px;
  86. margin: 4px;
  87. }
  88. .equipment-slot {
  89. position: absolute;
  90. width: 3rem;
  91. height: 3rem;
  92. border-width: 5px;
  93. border-style: outset;
  94. transform: translate(-50%, -50%);
  95. background: #333;
  96. color: #eee;
  97. margin: 0px;
  98. padding: 0px;
  99. }
  100. .equipment-slot-active:hover {
  101. background: #555;
  102. }
  103. .equipment-slot-active:active {
  104. background: #555;
  105. border-style: inset;
  106. }
  107. .equipment-slot-empty {
  108. color: #666;
  109. }
  110. </style>