mirror of
				https://github.com/em-squared/5e-drs.git
				synced 2025-10-31 13:34:21 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			218 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="encounter-calculator pa-1">
 | |
| 
 | |
|     <v-expansion-panels multiple flat hover v-model="panels">
 | |
| 
 | |
|       <v-expansion-panel>
 | |
|         <v-expansion-panel-header><strong>Calculateur de rencontre</strong></v-expansion-panel-header>
 | |
|         <v-expansion-panel-content class="pt-1">
 | |
|           <div>
 | |
|             <v-select :items="encounterLevels" item-text="level" item-value="level" label="Niveau moyen du groupe" outlined dense v-model="level"></v-select>
 | |
|           </div>
 | |
|           <div>
 | |
|             <v-text-field label="Nombre de PJ" type="number" min="1" outlined dense v-model="pc"></v-text-field>
 | |
|           </div>
 | |
|           <div v-if="creatures.length == 0" class="body-2 font-italic">
 | |
|             Aucune créature sélectionnée
 | |
|           </div>
 | |
|           <div v-else>
 | |
|             <div class="body-2 mb-4">
 | |
|               <span class="subtitle-2">Difficulté : </span>{{challenge.label}}
 | |
|               <v-progress-linear
 | |
|               :color="challenge.color"
 | |
|               :value="challengeRate"
 | |
|               ></v-progress-linear>
 | |
|               <span class="subtitle-2">PX : </span>{{ totalXP }} ({{ Math.floor(totalXP / pc) }} par PJ)
 | |
|             </div>
 | |
|             <v-row class="d-flex align-center my-0" v-for="(c, idx) in creatures">
 | |
|               <v-col class="px-0 py-1">
 | |
|                 <div class="subtitle-2">{{c.title}}</div>
 | |
|                 <!-- <div><span class="subtitle-2">ID : </span>{{c.frontmatter.challenge}}</div> -->
 | |
|               </v-col>
 | |
|               <v-col class="px-0 py-1">
 | |
|                 <v-switch :value="c.ally" label="Allié" dense class="ma-0 d-inline-block" @click="switchCampCreatureInEncounter(idx)" color="accent"></v-switch>
 | |
|                 <v-btn dense icon small @click="removeCreatureInEncounter(idx)">
 | |
|                   <v-icon color="red">mdi-delete</v-icon>
 | |
|                 </v-btn>
 | |
|               </v-col>
 | |
|             </v-row>
 | |
|           </div>
 | |
|         </v-expansion-panel-content>
 | |
|       </v-expansion-panel>
 | |
| 
 | |
|     </v-expansion-panels>
 | |
| 
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import { mapState, mapGetters } from 'vuex'
 | |
| import { CHALLENGES, ENCOUNTERLEVELS } from '../../data/monsters'
 | |
| import { getPCbyChallenge } from '@theme/util/monsterHelpers'
 | |
| import { stats } from '../../data/stats'
 | |
| 
 | |
| export default {
 | |
|   name: 'EncounterCalculator',
 | |
| 
 | |
|   data () {
 | |
|     return {
 | |
|       panels: [0],
 | |
|       challenges: CHALLENGES,
 | |
|       encounterLevels: ENCOUNTERLEVELS,
 | |
|       totalPC: 0,
 | |
|       totalXP: 0,
 | |
|     }
 | |
|   },
 | |
| 
 | |
|   computed: {
 | |
|     ...mapState({
 | |
|       creatures: state => state.encounterCalculator.creatures,
 | |
|     }),
 | |
| 
 | |
|     // ...mapGetters({
 | |
|     //   totalPC: 'encounterCalculator/totalPC',
 | |
|     // }),
 | |
| 
 | |
|     pc: {
 | |
|       get () {
 | |
|         return this.$store.state.encounterCalculator.pc
 | |
|       },
 | |
|       set (newValue) {
 | |
|         this.$store.commit('encounterCalculator/setPC', newValue)
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     level: {
 | |
|       get () {
 | |
|         return this.$store.state.encounterCalculator.level
 | |
|       },
 | |
|       set (newValue) {
 | |
|         this.$store.commit('encounterCalculator/setLevel', Number(newValue))
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     challenge () {
 | |
|       let label = "Aisée"
 | |
|       let color = 'green'
 | |
|       if (this.totalPC > this.challengeForGroup.easy) {
 | |
|         label = "Ordinaire"
 | |
|         color = 'amber'
 | |
|       }
 | |
|       if (this.totalPC > this.challengeForGroup.normal) {
 | |
|         label = "Ardue"
 | |
|         color = 'orange'
 | |
|       }
 | |
|       if (this.totalPC > this.challengeForGroup.hard) {
 | |
|         label = "Abominable"
 | |
|         color = 'red'
 | |
|       }
 | |
|       if (this.totalPC > this.challengeForGroup.deadly) {
 | |
|         label = "Impossible"
 | |
|         color = 'purple'
 | |
|       }
 | |
|       return {label, color}
 | |
|     },
 | |
| 
 | |
|     // totalPC () {
 | |
|     //   let pc = 0
 | |
|     //   for (let c of this.creatures) {
 | |
|     //     if (c.ally) {
 | |
|     //       pc -= getPCbyChallenge(Number(c.frontmatter.challenge))
 | |
|     //     } else {
 | |
|     //       pc += getPCbyChallenge(Number(c.frontmatter.challenge))
 | |
|     //     }
 | |
|     //     console.log(c)
 | |
|     //   }
 | |
|     //   return pc
 | |
|     // },
 | |
| 
 | |
|     // totalXP () {
 | |
|     //   let xp = 0
 | |
|     //   for (let c of this.creatures) {
 | |
|     //     if (c.frontmatter.challenge == 0) {
 | |
|     //       xp += 10
 | |
|     //     } else {
 | |
|     //       xp += stats.challenges[c.frontmatter.challenge].xp
 | |
|     //     }
 | |
|     //   }
 | |
|     //   return xp
 | |
|     // },
 | |
| 
 | |
|     challengeForGroup () {
 | |
|       let level = this.encounterLevels[this.encounterLevels.findIndex((item) => { return item.level == this.level })]
 | |
|       return {
 | |
|         easy: (level.easy*this.pc)/4,
 | |
|         normal: (level.normal*this.pc)/4,
 | |
|         hard: (level.hard*this.pc)/4,
 | |
|         deadly: (level.deadly*this.pc)/4,
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     challengeRate () {
 | |
|       return (this.totalPC/this.challengeForGroup.deadly)*100
 | |
|     },
 | |
|   },
 | |
| 
 | |
|   methods: {
 | |
|     removeCreatureInEncounter (idx) {
 | |
|       this.$store.commit('encounterCalculator/removeCreature', idx)
 | |
|     },
 | |
| 
 | |
|     switchCampCreatureInEncounter (idx) {
 | |
|       this.$store.commit('encounterCalculator/switchCampCreature', idx)
 | |
|       this.setTotalPC()
 | |
|       this.setTotalXP()
 | |
|     },
 | |
| 
 | |
|     setTotalPC () {
 | |
|       let pc = 0
 | |
|       for (let c of this.creatures) {
 | |
|         if (c.ally) {
 | |
|           pc -= getPCbyChallenge(Number(c.frontmatter.challenge))
 | |
|         } else {
 | |
|           pc += getPCbyChallenge(Number(c.frontmatter.challenge))
 | |
|         }
 | |
|         // console.log(c)
 | |
|       }
 | |
|       this.totalPC = pc
 | |
|     },
 | |
| 
 | |
|     setTotalXP () {
 | |
|       let xp = 0
 | |
|       for (let c of this.creatures) {
 | |
|         if (c.frontmatter.challenge == 0) {
 | |
|           if (c.ally) {
 | |
|             xp -= 10
 | |
|           } else {
 | |
|             xp += 10
 | |
|           }
 | |
|         } else {
 | |
|           if (c.ally) {
 | |
|             xp -= stats.challenges[c.frontmatter.challenge].xp
 | |
|           } else {
 | |
|             xp += stats.challenges[c.frontmatter.challenge].xp
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       if (xp < 0) {
 | |
|         xp = 0
 | |
|       }
 | |
|       this.totalXP = xp
 | |
|     },
 | |
|   },
 | |
| 
 | |
|   mounted () {
 | |
| 
 | |
|   },
 | |
| 
 | |
|   watch: {
 | |
|     creatures () {
 | |
|       this.setTotalPC()
 | |
|       this.setTotalXP()
 | |
|     }
 | |
|   }
 | |
| }
 | |
| </script>
 | |
| 
 | |
| <style lang="scss">
 | |
| </style>
 | 
