mirror of
				https://github.com/em-squared/5e-drs.git
				synced 2025-10-31 05:24:20 +00:00 
			
		
		
		
	calculateur de rencontres
This commit is contained in:
		
							parent
							
								
									82fc936b2d
								
							
						
					
					
						commit
						07b671b99d
					
				
					 10 changed files with 391 additions and 41 deletions
				
			
		|  | @ -42,7 +42,7 @@ module.exports = { | ||||||
|           { |           { | ||||||
|             // Unique ID of current classification
 |             // Unique ID of current classification
 | ||||||
|             id: 'monster', |             id: 'monster', | ||||||
|             // Meta title for spell list page
 |             // Meta title for monster list page
 | ||||||
|             title: 'Bestiaire', |             title: 'Bestiaire', | ||||||
|             // Target directory
 |             // Target directory
 | ||||||
|             dirname: 'bestiaire', |             dirname: 'bestiaire', | ||||||
|  |  | ||||||
|  | @ -25,40 +25,40 @@ export const MONSTERSIZES = [ | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
| export const CHALLENGES = [ | export const CHALLENGES = [ | ||||||
|   { label: "0", value:'0', xp: "0 ou 10" }, |   { label: "0", value:'0', xp: "0 ou 10", pc: 1 }, | ||||||
|   { label: "1/8", value:'0.125', xp: 25 }, |   { label: "1/8", value:'0.125', xp: 25, pc: 5 }, | ||||||
|   { label: "1/4", value:'0.25', xp: 50 }, |   { label: "1/4", value:'0.25', xp: 50, pc: 9 }, | ||||||
|   { label: "1/2", value:'0.5', xp: 100 }, |   { label: "1/2", value:'0.5', xp: 100, pc: 15 }, | ||||||
|   { label: "1", value:'1', xp: 200 }, |   { label: "1", value:'1', xp: 200, pc: 25 }, | ||||||
|   { label: "2", value:'2', xp: 450 }, |   { label: "2", value:'2', xp: 450, pc: 40 }, | ||||||
|   { label: "3", value:'3', xp: 700 }, |   { label: "3", value:'3', xp: 700, pc: 60 }, | ||||||
|   { label: "4", value:'4', xp: 1100 }, |   { label: "4", value:'4', xp: 1100, pc: 85 }, | ||||||
|   { label: "5", value:'5', xp: 1800 }, |   { label: "5", value:'5', xp: 1800, pc: 110 }, | ||||||
|   { label: "6", value:'6', xp: 2300 }, |   { label: "6", value:'6', xp: 2300, pc: 135 }, | ||||||
|   { label: "7", value:'7', xp: 2900 }, |   { label: "7", value:'7', xp: 2900, pc: 160 }, | ||||||
|   { label: "8", value:'8', xp: 3900 }, |   { label: "8", value:'8', xp: 3900, pc: 185 }, | ||||||
|   { label: "9", value:'9', xp: 5000 }, |   { label: "9", value:'9', xp: 5000, pc: 210 }, | ||||||
|   { label: "10", value:'10', xp: 5900 }, |   { label: "10", value:'10', xp: 5900, pc: 230 }, | ||||||
|   { label: "11", value:'11', xp: 7200 }, |   { label: "11", value:'11', xp: 7200, pc: 265 }, | ||||||
|   { label: "12", value:'12', xp: 8400 }, |   { label: "12", value:'12', xp: 8400, pc: 300 }, | ||||||
|   { label: "13", value:'13', xp: 10000 }, |   { label: "13", value:'13', xp: 10000, pc: 330 }, | ||||||
|   { label: "14", value:'14', xp: 11500 }, |   { label: "14", value:'14', xp: 11500, pc: 370 }, | ||||||
|   { label: "15", value:'15', xp: 13000 }, |   { label: "15", value:'15', xp: 13000, pc: 420 }, | ||||||
|   { label: "16", value:'16', xp: 15000 }, |   { label: "16", value:'16', xp: 15000, pc: 475 }, | ||||||
|   { label: "17", value:'17', xp: 18000 }, |   { label: "17", value:'17', xp: 18000, pc: 525 }, | ||||||
|   { label: "18", value:'18', xp: 20000 }, |   { label: "18", value:'18', xp: 20000, pc: 620 }, | ||||||
|   { label: "19", value:'19', xp: 22000 }, |   { label: "19", value:'19', xp: 22000, pc: 675 }, | ||||||
|   { label: "20", value:'20', xp: 25000 }, |   { label: "20", value:'20', xp: 25000, pc: 770 }, | ||||||
|   { label: "21", value:'21', xp: 33000 }, |   { label: "21", value:'21', xp: 33000, pc: 870 }, | ||||||
|   { label: "22", value:'22', xp: 41000 }, |   { label: "22", value:'22', xp: 41000, pc: 995 }, | ||||||
|   { label: "23", value:'23', xp: 50000 }, |   { label: "23", value:'23', xp: 50000, pc: 1100 }, | ||||||
|   { label: "24", value:'24', xp: 62000 }, |   { label: "24", value:'24', xp: 62000, pc: 1240 }, | ||||||
|   { label: "25", value:'25', xp: 75000 }, |   { label: "25", value:'25', xp: 75000, pc: 1450 }, | ||||||
|   { label: "26", value:'26', xp: 90000 }, |   { label: "26", value:'26', xp: 90000, pc: 1700 }, | ||||||
|   { label: "27", value:'27', xp: 105000 }, |   { label: "27", value:'27', xp: 105000, pc: 1950 }, | ||||||
|   { label: "28", value:'28', xp: 120000 }, |   { label: "28", value:'28', xp: 120000, pc: 2200 }, | ||||||
|   { label: "29", value:'29', xp: 135000 }, |   { label: "29", value:'29', xp: 135000, pc: 2450 }, | ||||||
|   { label: "30", value:'30', xp: 155000 }, |   { label: "30", value:'30', xp: 155000, pc: 2700 }, | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
| export const ABILITIES = [ | export const ABILITIES = [ | ||||||
|  | @ -90,3 +90,26 @@ export const SKILLS = [ | ||||||
|   { label: "Supercherie", value:"supercherie", ability: "cha" }, |   { label: "Supercherie", value:"supercherie", ability: "cha" }, | ||||||
|   { label: "Survie", value:"survie", ability: "sag" }, |   { label: "Survie", value:"survie", ability: "sag" }, | ||||||
| ] | ] | ||||||
|  | 
 | ||||||
|  | export const ENCOUNTERLEVELS = [ | ||||||
|  |   { level: 1, easy: 15, normal: 25, hard: 33, deadly: 40}, | ||||||
|  |   { level: 2, easy: 25, normal: 40, hard: 55, deadly: 70}, | ||||||
|  |   { level: 3, easy: 32, normal: 60, hard: 80, deadly: 100}, | ||||||
|  |   { level: 4, easy: 45, normal: 80, hard: 100, deadly: 120}, | ||||||
|  |   { level: 5, easy: 70, normal: 120, hard: 160, deadly: 200}, | ||||||
|  |   { level: 6, easy: 90, normal: 140, hard: 185, deadly: 230}, | ||||||
|  |   { level: 7, easy: 105, normal: 160, hard: 210, deadly: 260}, | ||||||
|  |   { level: 8, easy: 130, normal: 180, hard: 240, deadly: 300}, | ||||||
|  |   { level: 9, easy: 135, normal: 200, hard: 265, deadly: 330}, | ||||||
|  |   { level: 10, easy: 140, normal: 210, hard: 280, deadly: 350}, | ||||||
|  |   { level: 11, easy: 160, normal: 240, hard: 350, deadly: 460}, | ||||||
|  |   { level: 12, easy: 180, normal: 270, hard: 395, deadly: 520}, | ||||||
|  |   { level: 13, easy: 200, normal: 310, hard: 465, deadly: 620}, | ||||||
|  |   { level: 14, easy: 210, normal: 330, hard: 515, deadly: 700}, | ||||||
|  |   { level: 15, easy: 225, normal: 360, hard: 565, deadly: 770}, | ||||||
|  |   { level: 16, easy: 240, normal: 400, hard: 610, deadly: 820}, | ||||||
|  |   { level: 17, easy: 285, normal: 480, hard: 695, deadly: 910}, | ||||||
|  |   { level: 18, easy: 300, normal: 510, hard: 730, deadly: 950}, | ||||||
|  |   { level: 19, easy: 330, normal: 600, hard: 800, deadly: 1000}, | ||||||
|  |   { level: 20, easy: 370, normal: 700, hard: 900, deadly: 1100}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | @ -9,6 +9,8 @@ import mySpells from './modules/mySpells' | ||||||
| import myMonsters from './modules/myMonsters' | import myMonsters from './modules/myMonsters' | ||||||
| import myMagicItems from './modules/myMagicItems' | import myMagicItems from './modules/myMagicItems' | ||||||
| 
 | 
 | ||||||
|  | import encounterCalculator from './modules/encounterCalculator' | ||||||
|  | 
 | ||||||
| Vue.use(Vuex) | Vue.use(Vuex) | ||||||
| 
 | 
 | ||||||
| import Cookies from 'js-cookie' | import Cookies from 'js-cookie' | ||||||
|  | @ -20,7 +22,8 @@ export default new Vuex.Store({ | ||||||
|     monsterFilters, |     monsterFilters, | ||||||
|     mySpells, |     mySpells, | ||||||
|     myMonsters, |     myMonsters, | ||||||
|     myMagicItems |     myMagicItems, | ||||||
|  |     encounterCalculator, | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|   state: { |   state: { | ||||||
|  |  | ||||||
							
								
								
									
										87
									
								
								docs/.vuepress/store/modules/encounterCalculator.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								docs/.vuepress/store/modules/encounterCalculator.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,87 @@ | ||||||
|  | import {sortByString} from '@theme/util/filterHelpers' | ||||||
|  | import { getResourceIndexInLibrary } from '@theme/util' | ||||||
|  | import { ENCOUNTERLEVELS } from '../../data/monsters' | ||||||
|  | import { getPCbyChallenge } from '@theme/util/monsterHelpers' | ||||||
|  | 
 | ||||||
|  | export default { | ||||||
|  |   namespaced: true, | ||||||
|  | 
 | ||||||
|  |   state: { | ||||||
|  |     creatures: [], | ||||||
|  |     pc: 4, | ||||||
|  |     level: ENCOUNTERLEVELS[0].level, | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   getters: { | ||||||
|  |     creatures: state => state.creatures, | ||||||
|  |     pc: state => state.pc, | ||||||
|  |     level: state => state.level, | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   actions: { | ||||||
|  |     reset: ({ commit }) => { | ||||||
|  |       commit('resetCreatures') | ||||||
|  |     }, | ||||||
|  |     updateCreatures: ({ commit }, payload) => { | ||||||
|  |       commit('setCreatures', payload) | ||||||
|  |     }, | ||||||
|  |     resetCreatures: ({ commit }) => { | ||||||
|  |       commit('resetCreatures') | ||||||
|  |     }, | ||||||
|  |     addCreature: ({ commit }, payload) => { | ||||||
|  |       commit('addCreature', payload) | ||||||
|  |     }, | ||||||
|  |     removeCreature: ({ commit }, payload) => { | ||||||
|  |       commit('removeCreature', payload) | ||||||
|  |     }, | ||||||
|  |     setCreatureQty: ({ commit }, payload) => { | ||||||
|  |       commit('setCreatureQty', payload) | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   mutations: { | ||||||
|  |     setCreatures: (state, payload) => { | ||||||
|  |       state.creatures = payload | ||||||
|  |     }, | ||||||
|  |     resetCreatures: (state) => { | ||||||
|  |       state.creatures = [] | ||||||
|  |     }, | ||||||
|  |     addCreature: (state, payload) => { | ||||||
|  |       payload.qty = 1 | ||||||
|  |       state.creatures.push(payload) | ||||||
|  |       state.creatures.sort((a, b) => { return sortByString(a.title, b.title) }) | ||||||
|  |     }, | ||||||
|  |     updateCreatures: (state, payload) => { | ||||||
|  |       let creatureIndex = getResourceIndexInLibrary(payload, state.creatures) | ||||||
|  |       if (creatureIndex >= 0) { | ||||||
|  |         state.creatures[creatureIndex] = payload | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     removeCreature: (state, payload) => { | ||||||
|  |       let creatureIndex = getResourceIndexInLibrary(payload, state.creatures) | ||||||
|  |       if (creatureIndex >= 0) { | ||||||
|  |         state.creatures.splice(creatureIndex, 1) | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     setCreatureQty: (state, payload) => { | ||||||
|  |       let creatureIndex = getResourceIndexInLibrary(payload.creature, state.creatures) | ||||||
|  |       if (creatureIndex >= 0) { | ||||||
|  |         if (Number(payload.qty) > 0) { | ||||||
|  |           state.creatures[creatureIndex].qty = Number(payload.qty) | ||||||
|  |         } else { | ||||||
|  |           let creatureIndex = getResourceIndexInLibrary(payload.creature, state.creatures) | ||||||
|  |           if (creatureIndex >= 0) { | ||||||
|  |             state.creatures.splice(creatureIndex, 1) | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     setPC: (state, payload) => { | ||||||
|  |       state.pc = payload | ||||||
|  |     }, | ||||||
|  |     setLevel: (state, payload) => { | ||||||
|  |       state.level = payload | ||||||
|  |     }, | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -57,6 +57,8 @@ | ||||||
|               crumbs.push({to: page.path, disabled: disabled, text: 'Création de monstre ou PNJ'}) |               crumbs.push({to: page.path, disabled: disabled, text: 'Création de monstre ou PNJ'}) | ||||||
|             } else if (page.path == '/calculateur-de-caracteristiques/') { |             } else if (page.path == '/calculateur-de-caracteristiques/') { | ||||||
|               crumbs.push({to: page.path, disabled: disabled, text: 'Calculateur de caractéristiques'}) |               crumbs.push({to: page.path, disabled: disabled, text: 'Calculateur de caractéristiques'}) | ||||||
|  |             } else if (page.path == '/calculateur-de-rencontres/') { | ||||||
|  |               crumbs.push({to: page.path, disabled: disabled, text: 'Calculateur de rencontres'}) | ||||||
|             } else { |             } else { | ||||||
|               crumbs.push({to: page.path, disabled: disabled, text: page.frontmatter.breadcrumb || page.title}) |               crumbs.push({to: page.path, disabled: disabled, text: page.frontmatter.breadcrumb || page.title}) | ||||||
|             } |             } | ||||||
|  |  | ||||||
							
								
								
									
										147
									
								
								docs/.vuepress/theme/components/EncounterCalculator.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								docs/.vuepress/theme/components/EncounterCalculator.vue
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,147 @@ | ||||||
|  | <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> | ||||||
|  |             </div> | ||||||
|  |             <v-row class="d-flex align-center my-0" v-for="c 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-btn dense icon small @click="removeCreatureInEncounter(c)"> | ||||||
|  |                   <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' | ||||||
|  | 
 | ||||||
|  | export default { | ||||||
|  |   name: 'EncounterCalculator', | ||||||
|  | 
 | ||||||
|  |   data () { | ||||||
|  |     return { | ||||||
|  |       panels: [0], | ||||||
|  |       challenges: CHALLENGES, | ||||||
|  |       encounterLevels: ENCOUNTERLEVELS, | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   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) { | ||||||
|  |         pc += getPCbyChallenge(Number(c.frontmatter.challenge)) | ||||||
|  |       } | ||||||
|  |       return pc | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     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 (creature) { | ||||||
|  |       this.$store.commit('encounterCalculator/removeCreature', creature) | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   mounted () { | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style lang="scss"> | ||||||
|  | </style> | ||||||
|  | @ -4,6 +4,7 @@ | ||||||
|     <SpellFilters v-if="hasSpellFilters" /> |     <SpellFilters v-if="hasSpellFilters" /> | ||||||
|     <MagicItemFilters v-if="hasMagicItemFilters" /> |     <MagicItemFilters v-if="hasMagicItemFilters" /> | ||||||
|     <MonsterFilters v-if="hasMonsterFilters" /> |     <MonsterFilters v-if="hasMonsterFilters" /> | ||||||
|  |     <EncounterCalculator v-if="hasMonsterFilters" /> | ||||||
|   </v-navigation-drawer> |   </v-navigation-drawer> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  | @ -12,6 +13,7 @@ import PageToc from '@theme/components/PageToc' | ||||||
| import SpellFilters from '@theme/components/SpellFilters' | import SpellFilters from '@theme/components/SpellFilters' | ||||||
| import MagicItemFilters from '@theme/components/MagicItemFilters' | import MagicItemFilters from '@theme/components/MagicItemFilters' | ||||||
| import MonsterFilters from '@theme/components/MonsterFilters' | import MonsterFilters from '@theme/components/MonsterFilters' | ||||||
|  | import EncounterCalculator from '@theme/components/EncounterCalculator' | ||||||
| 
 | 
 | ||||||
| export default { | export default { | ||||||
|   name: 'RightDrawer', |   name: 'RightDrawer', | ||||||
|  | @ -20,6 +22,7 @@ export default { | ||||||
|     SpellFilters, |     SpellFilters, | ||||||
|     MagicItemFilters, |     MagicItemFilters, | ||||||
|     MonsterFilters, |     MonsterFilters, | ||||||
|  |     EncounterCalculator, | ||||||
|     PageToc |     PageToc | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -39,11 +39,13 @@ export default ({ | ||||||
|           primary: '#4c6477', // Dragons (Bleu)
 |           primary: '#4c6477', // Dragons (Bleu)
 | ||||||
|           navbar: '#435a3f', // Héros (Vert)
 |           navbar: '#435a3f', // Héros (Vert)
 | ||||||
|           accent: '#435a3f', // Héros
 |           accent: '#435a3f', // Héros
 | ||||||
|  |           gold: "#bab468", | ||||||
|         }, |         }, | ||||||
|         dark: { |         dark: { | ||||||
|           primary: '#6c8599', // Dragons (Bleu)
 |           primary: '#6c8599', // Dragons (Bleu)
 | ||||||
|           navbar: '#435a3f', // Héros (Vert)
 |           navbar: '#435a3f', // Héros (Vert)
 | ||||||
|           accent: '#6c8599', // Dragons
 |           accent: '#6c8599', // Dragons
 | ||||||
|  |           gold: "#bab468", | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  | @ -12,6 +12,52 @@ | ||||||
| 
 | 
 | ||||||
|     <h1>Bestiaire</h1> |     <h1>Bestiaire</h1> | ||||||
| 
 | 
 | ||||||
|  |     <div class="columns-toggles d-md-flex d-none align-center mb-2"> | ||||||
|  |       <div><strong>Colonnes affichées :</strong></div> | ||||||
|  |       <v-checkbox | ||||||
|  |         class="mt-0 mr-4" | ||||||
|  |         v-model="showColumn.type" | ||||||
|  |         label="Type" | ||||||
|  |         hide-details | ||||||
|  |         @change="setShowColumn" | ||||||
|  |       ></v-checkbox> | ||||||
|  |       <v-checkbox | ||||||
|  |         class="mt-0 mr-4" | ||||||
|  |         v-model="showColumn.size" | ||||||
|  |         label="Taille" | ||||||
|  |         hide-details | ||||||
|  |         @change="setShowColumn" | ||||||
|  |       ></v-checkbox> | ||||||
|  |       <v-checkbox | ||||||
|  |         class="mt-0 mr-4" | ||||||
|  |         v-model="showColumn.subtype" | ||||||
|  |         label="Sous-type" | ||||||
|  |         hide-details | ||||||
|  |         @change="setShowColumn" | ||||||
|  |       ></v-checkbox> | ||||||
|  |       <v-checkbox | ||||||
|  |         class="mt-0 mr-4" | ||||||
|  |         v-model="showColumn.environments" | ||||||
|  |         label="Environnements" | ||||||
|  |         hide-details | ||||||
|  |         @change="setShowColumn" | ||||||
|  |       ></v-checkbox> | ||||||
|  |       <v-checkbox | ||||||
|  |         class="mt-0 mr-4" | ||||||
|  |         v-model="showColumn.dungeonTypes" | ||||||
|  |         label="Type de donjons" | ||||||
|  |         hide-details | ||||||
|  |         @change="setShowColumn" | ||||||
|  |       ></v-checkbox> | ||||||
|  |       <v-checkbox | ||||||
|  |         class="mt-0 mr-4" | ||||||
|  |         v-model="showColumn.encounter" | ||||||
|  |         label="Rencontre" | ||||||
|  |         hide-details | ||||||
|  |         @change="setShowColumn" | ||||||
|  |       ></v-checkbox> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|     <div class="active-filters mb-2"> |     <div class="active-filters mb-2"> | ||||||
|       <div class="challengeRange-filter" v-if="Number(challengeRange[0]) >= 0 && Number(challengeRange[1]) <= challenges.length-1"> |       <div class="challengeRange-filter" v-if="Number(challengeRange[0]) >= 0 && Number(challengeRange[1]) <= challenges.length-1"> | ||||||
|         <strong>Indice de dangerosité</strong> entre {{ challenges[challengeRange[0]].label }} et {{ challenges[challengeRange[1]].label }} |         <strong>Indice de dangerosité</strong> entre {{ challenges[challengeRange[0]].label }} et {{ challenges[challengeRange[1]].label }} | ||||||
|  | @ -74,6 +120,12 @@ | ||||||
|         <span v-if="item.frontmatter.dungeonTypes">{{ displayList(item.frontmatter.dungeonTypes) }}</span> |         <span v-if="item.frontmatter.dungeonTypes">{{ displayList(item.frontmatter.dungeonTypes) }}</span> | ||||||
|       </template> |       </template> | ||||||
| 
 | 
 | ||||||
|  |       <template v-slot:item.isInEncounter="{ item }"> | ||||||
|  |         <v-btn dense icon @click.stop="addCreatureInEncounter(item)"> | ||||||
|  |           <v-icon>mdi-sword-cross</v-icon> | ||||||
|  |         </v-btn> | ||||||
|  |       </template> | ||||||
|  | 
 | ||||||
|     </v-data-table> |     </v-data-table> | ||||||
| 
 | 
 | ||||||
|     <v-row class="align-center  mb-12 pb-6"> |     <v-row class="align-center  mb-12 pb-6"> | ||||||
|  | @ -96,6 +148,7 @@ import { isResourceInLibrary } from '@theme/util' | ||||||
| import Monster from '@theme/components/Monster' | import Monster from '@theme/components/Monster' | ||||||
| import MyMonstersButton from '@theme/global-components/MyMonstersButton' | import MyMonstersButton from '@theme/global-components/MyMonstersButton' | ||||||
| import { CHALLENGES } from '../../data/monsters' | import { CHALLENGES } from '../../data/monsters' | ||||||
|  | import Cookies from 'js-cookie' | ||||||
| 
 | 
 | ||||||
| export default { | export default { | ||||||
|   components: { Breadcrumb, Monster, MyMonstersButton }, |   components: { Breadcrumb, Monster, MyMonstersButton }, | ||||||
|  | @ -116,9 +169,10 @@ export default { | ||||||
|       showColumn: { |       showColumn: { | ||||||
|         type: true, |         type: true, | ||||||
|         size: true, |         size: true, | ||||||
|         subtype: true, |         subtype: false, | ||||||
|         environments: true, |         environments: false, | ||||||
|         dungeonTypes: true, |         dungeonTypes: false, | ||||||
|  |         encounter: true, | ||||||
|       }, |       }, | ||||||
|       challenges: CHALLENGES |       challenges: CHALLENGES | ||||||
|     } |     } | ||||||
|  | @ -138,7 +192,7 @@ export default { | ||||||
|       let headers = [ |       let headers = [ | ||||||
|         { text: "", align: 'center', sortable: false, value: 'isInBestiary' }, |         { text: "", align: 'center', sortable: false, value: 'isInBestiary' }, | ||||||
|         { text: "Nom", align: 'start', sortable: true, value: 'title' }, |         { text: "Nom", align: 'start', sortable: true, value: 'title' }, | ||||||
|         { text: "ID", align: 'center', sortable: true, value: 'frontmatter.challenge' } |         { text: "ID", align: 'center', sortable: true, value: 'frontmatter.challenge' }, | ||||||
|       ] |       ] | ||||||
|       if (this.showColumn.type && this.$vuetify.breakpoint.mdAndUp) { |       if (this.showColumn.type && this.$vuetify.breakpoint.mdAndUp) { | ||||||
|         headers.push({ text: "Type", align: 'start', sortable: false, value: 'frontmatter.type' }) |         headers.push({ text: "Type", align: 'start', sortable: false, value: 'frontmatter.type' }) | ||||||
|  | @ -155,6 +209,9 @@ export default { | ||||||
|       if (this.showColumn.dungeonTypes && this.$vuetify.breakpoint.mdAndUp) { |       if (this.showColumn.dungeonTypes && this.$vuetify.breakpoint.mdAndUp) { | ||||||
|         headers.push({ text: "Type de donjons", align: 'start', sortable: false, value: 'frontmatter.dungeonTypes' }) |         headers.push({ text: "Type de donjons", align: 'start', sortable: false, value: 'frontmatter.dungeonTypes' }) | ||||||
|       } |       } | ||||||
|  |       if (this.showColumn.encounter && this.$vuetify.breakpoint.mdAndUp) { | ||||||
|  |         headers.push({ text: "Rencontre", align: 'center', sortable: false, value: 'isInEncounter' }) | ||||||
|  |       } | ||||||
|       return headers |       return headers | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|  | @ -306,6 +363,13 @@ export default { | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|  |     isCreatureInEncounter (creature) { | ||||||
|  |       return isResourceInLibrary(creature, this.$store.state.encounterCalculator.creatures) | ||||||
|  |     }, | ||||||
|  |     addCreatureInEncounter (creature) { | ||||||
|  |       this.$store.commit('encounterCalculator/addCreature', creature) | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|     selectItemPerPage (value) { |     selectItemPerPage (value) { | ||||||
|       setUrlParams("lignes", [value]) |       setUrlParams("lignes", [value]) | ||||||
|     }, |     }, | ||||||
|  | @ -317,7 +381,11 @@ export default { | ||||||
| 
 | 
 | ||||||
|     onClickRow (row, item) { |     onClickRow (row, item) { | ||||||
|       item.expand(!item.isExpanded) |       item.expand(!item.isExpanded) | ||||||
|     } |     }, | ||||||
|  | 
 | ||||||
|  |     setShowColumn () { | ||||||
|  |       Cookies.set('5e-drs-bestiaire-colonnes', this.showColumn, { expires: 365 }) | ||||||
|  |     }, | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|   mounted () { |   mounted () { | ||||||
|  | @ -333,6 +401,11 @@ export default { | ||||||
|     if (page) { |     if (page) { | ||||||
|       this.page = page |       this.page = page | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     const showColumn = Cookies.get('5e-drs-bestiaire-colonnes') | ||||||
|  |     if (showColumn) { | ||||||
|  |       this.showColumn = JSON.parse(showColumn) | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| import {stats} from '../../data/stats' | import {stats} from '../../data/stats' | ||||||
|  | import {CHALLENGES} from '../../data/monsters' | ||||||
| 
 | 
 | ||||||
| // Calcul du modificateur de caractéristique
 | // Calcul du modificateur de caractéristique
 | ||||||
| export function getModifier (score) { | export function getModifier (score) { | ||||||
|  | @ -68,3 +69,12 @@ export function displayMonsterTypeSizeAlignment (monster, hideAlignment = false, | ||||||
|   } |   } | ||||||
|   return result |   return result | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // Retourne le nombre de points de combat pour un indice de dangerosité
 | ||||||
|  | export function getPCbyChallenge(challenge) { | ||||||
|  |   let challengeIndex = CHALLENGES.findIndex(item => item.value == challenge) | ||||||
|  |   if (challengeIndex > -1) { | ||||||
|  |     return CHALLENGES[challengeIndex].pc | ||||||
|  |   } | ||||||
|  |   return false | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Maxime Moraine
						Maxime Moraine