mirror of
				https://github.com/em-squared/5e-drs.git
				synced 2025-10-30 21:24:18 +00:00 
			
		
		
		
	outils de création de sorts/monstres/objets
This commit is contained in:
		
							parent
							
								
									6237f0e6a2
								
							
						
					
					
						commit
						a6986c42c6
					
				
					 48 changed files with 2743 additions and 259 deletions
				
			
		|  | @ -2,133 +2,140 @@ | |||
|   <main class="page content"> | ||||
| 
 | ||||
|     <div class="theme-default-content"> | ||||
|       <h1>{{ $page.title }}</h1> | ||||
|       <div class="monster-type-size-alignment"> | ||||
|       <template v-if="!hideTitle"> | ||||
|         <h1 v-if="!isList">{{ monster.title }}</h1> | ||||
|         <h2 v-else>{{ monster.title }}</h2> | ||||
|       </template> | ||||
|       <div class="monster-type-size-alignment title"> | ||||
|         {{ displayMonsterTypeSizeAlignment() }} | ||||
|       </div> | ||||
|       <div class="monster-details"> | ||||
|         <!-- Statblock --> | ||||
|         <div class="monster-armor-class"> | ||||
|           <strong>Classe d'armure</strong> | ||||
|           <span>{{ displayAC() }}</span> | ||||
|         </div> | ||||
|         <div class="monster-hit-points"> | ||||
|           <strong>Points de vie</strong> | ||||
|           <span>{{ displayHP() }}</span> | ||||
|         </div> | ||||
|         <div class="monster-movement"> | ||||
|           <strong>Vitesse</strong> | ||||
|           <template>{{ displayMovement() }}</template> | ||||
|         </div> | ||||
|         <div class="monster-ability-scores d-flex"> | ||||
|           <div class="monster-ability-scores-physical d-flex"> | ||||
|             <div class="ability-str text-center"> | ||||
|               <div class="ability-label"> | ||||
|                 <strong>For</strong> | ||||
|               </div> | ||||
|               <div class="ability-score"> | ||||
|                 {{ displayAbilityScore(monster.abilityScores.for) }} | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="ability-dex text-center"> | ||||
|               <div class="ability-label"> | ||||
|                 <strong>Dex</strong> | ||||
|               </div> | ||||
|               <div class="ability-score"> | ||||
|                 {{ displayAbilityScore(monster.abilityScores.dex) }} | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="ability-con text-center"> | ||||
|               <div class="ability-label"> | ||||
|                 <strong>Con</strong> | ||||
|               </div> | ||||
|               <div class="ability-score"> | ||||
|                 {{ displayAbilityScore(monster.abilityScores.con) }} | ||||
|               </div> | ||||
|             </div> | ||||
|         <div class="break-avoid"> | ||||
|           <!-- Statblock --> | ||||
|           <div class="monster-armor-class"> | ||||
|             <strong>Classe d'armure</strong> | ||||
|             <span>{{ displayAC() }}</span> | ||||
|           </div> | ||||
|           <div class="monster-ability-scores-mental d-flex"> | ||||
|             <div class="ability-int text-center"> | ||||
|               <div class="ability-label"> | ||||
|                 <strong>Int</strong> | ||||
|           <div class="monster-hit-points"> | ||||
|             <strong>Points de vie</strong> | ||||
|             <span>{{ hp }}</span> | ||||
|           </div> | ||||
|           <div class="monster-movement"> | ||||
|             <strong>Vitesse</strong> | ||||
|             <template>{{ displayMovement() }}</template> | ||||
|           </div> | ||||
|           <div class="monster-ability-scores d-flex"> | ||||
|             <div class="monster-ability-scores-physical d-flex"> | ||||
|               <div class="ability-str text-center"> | ||||
|                 <div class="ability-label"> | ||||
|                   <strong>For</strong> | ||||
|                 </div> | ||||
|                 <div class="ability-score"> | ||||
|                   {{ displayAbilityScore(monsterStats.abilityScores.for) }} | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div class="ability-score"> | ||||
|                 {{ displayAbilityScore(monster.abilityScores.int) }} | ||||
|               <div class="ability-dex text-center"> | ||||
|                 <div class="ability-label"> | ||||
|                   <strong>Dex</strong> | ||||
|                 </div> | ||||
|                 <div class="ability-score"> | ||||
|                   {{ displayAbilityScore(monsterStats.abilityScores.dex) }} | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div class="ability-con text-center"> | ||||
|                 <div class="ability-label"> | ||||
|                   <strong>Con</strong> | ||||
|                 </div> | ||||
|                 <div class="ability-score"> | ||||
|                   {{ displayAbilityScore(monsterStats.abilityScores.con) }} | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="ability-wis text-center"> | ||||
|               <div class="ability-label"> | ||||
|                 <strong>Sag</strong> | ||||
|             <div class="monster-ability-scores-mental d-flex"> | ||||
|               <div class="ability-int text-center"> | ||||
|                 <div class="ability-label"> | ||||
|                   <strong>Int</strong> | ||||
|                 </div> | ||||
|                 <div class="ability-score"> | ||||
|                   {{ displayAbilityScore(monsterStats.abilityScores.int) }} | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div class="ability-score"> | ||||
|                 {{ displayAbilityScore(monster.abilityScores.sag) }} | ||||
|               <div class="ability-wis text-center"> | ||||
|                 <div class="ability-label"> | ||||
|                   <strong>Sag</strong> | ||||
|                 </div> | ||||
|                 <div class="ability-score"> | ||||
|                   {{ displayAbilityScore(monsterStats.abilityScores.sag) }} | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="ability-cha text-center"> | ||||
|               <div class="ability-label"> | ||||
|                 <strong>Cha</strong> | ||||
|               </div> | ||||
|               <div class="ability-score"> | ||||
|                 {{ displayAbilityScore(monster.abilityScores.cha) }} | ||||
|               <div class="ability-cha text-center"> | ||||
|                 <div class="ability-label"> | ||||
|                   <strong>Cha</strong> | ||||
|                 </div> | ||||
|                 <div class="ability-score"> | ||||
|                   {{ displayAbilityScore(monsterStats.abilityScores.cha) }} | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="monster-saving-throws" v-if="monster.savingThrows"> | ||||
|           <strong>Jets de sauvegarde</strong> | ||||
|           <span class="monster-saving-throw" v-for="(savingThrow, idx) in monster.savingThrows"> | ||||
|             <template>{{displaySavingThrowBonus(savingThrow)}}</template><template v-if="idx < monster.savingThrows.length - 1">, </template> | ||||
|           </span> | ||||
|         </div> | ||||
|         <div class="monster-skills" v-if="monster.skills"> | ||||
|           <strong>Compétences</strong> | ||||
|           <span class="monster-skill" v-for="(skill, idx) in monster.skills"> | ||||
|             <template>{{displaySkillBonus(skill)}}</template><template v-if="idx < monster.skills.length - 1">, </template> | ||||
|           </span> | ||||
|         </div> | ||||
|         <div class="monster-damage-type-vulnerabilities" v-if="monster.damageTypeVulnerabilities"> | ||||
|           <strong>Vulnérabilité aux dégâts</strong> | ||||
|           <span v-html="displayDamageTypes(monster.damageTypeVulnerabilities)"></span> | ||||
|         </div> | ||||
|         <div class="monster-damage-type-resistances" v-if="monster.damageTypeResistances"> | ||||
|           <strong>Résistance aux dégâts</strong> | ||||
|           <span v-html="displayDamageTypes(monster.damageTypeResistances)"></span> | ||||
|         </div> | ||||
|         <div class="monster-damage-type-immunities" v-if="monster.damageTypeImmunities"> | ||||
|           <strong>Immunité contre les dégâts</strong> | ||||
|           <span v-html="displayDamageTypes(monster.damageTypeImmunities)"></span> | ||||
|         </div> | ||||
|         <div class="monster-condition-immunities" v-if="monster.conditionImmunities"> | ||||
|           <strong>Immunité contre les états</strong> | ||||
|           <span v-html="displayConditionImmunities()"></span> | ||||
|         </div> | ||||
|         <div class="monster-senses"> | ||||
|           <strong>Sens</strong> | ||||
|           <template>{{ displaySenses() }}</template> | ||||
|         </div> | ||||
|         <div class="monster-languages"> | ||||
|           <strong>Langes</strong> | ||||
|           <template v-if="monster.languages">{{ displayLanguages() }}</template> | ||||
|           <template v-else>—</template> | ||||
|         </div> | ||||
|         <div class="monster-challenge"> | ||||
|           <strong>Dangerosité</strong> | ||||
|           <template>{{ displayChallenge() }}</template> | ||||
|         </div> | ||||
|         <div class="monster-environments" v-if="monster.environments"> | ||||
|           <strong>Environnements :</strong> | ||||
|           <span v-html="displayList(monster.environments)"></span> | ||||
|         </div> | ||||
|         <div class="monster-dungeon-types" v-if="monster.dungeonTypes"> | ||||
|           <strong>Types de donjons :</strong> | ||||
|           <span v-html="displayList(monster.dungeonTypes)"></span> | ||||
|         <div class="break-avoid"> | ||||
|           <div class="monster-saving-throws" v-if="monsterStats.savingThrows && monsterStats.savingThrows.length > 0"> | ||||
|             <strong>Jets de sauvegarde</strong> | ||||
|             <span class="monster-saving-throw" v-for="(savingThrow, idx) in monsterStats.savingThrows"> | ||||
|               <template>{{displaySavingThrowBonus(savingThrow)}}</template><template v-if="idx < monsterStats.savingThrows.length - 1">, </template> | ||||
|             </span> | ||||
|           </div> | ||||
|           <div class="monster-skills" v-if="monsterStats.skills && monsterStats.skills.length > 0"> | ||||
|             <strong>Compétences</strong> | ||||
|             <span class="monster-skill" v-for="(skill, idx) in monsterStats.skills"> | ||||
|               <template>{{displaySkillBonus(skill)}}</template><template v-if="idx < monsterStats.skills.length - 1">, </template> | ||||
|             </span> | ||||
|           </div> | ||||
|           <div class="monster-damage-type-vulnerabilities" v-if="monsterStats.damageTypeVulnerabilities && monsterStats.damageTypeVulnerabilities.length > 0"> | ||||
|             <strong>Vulnérabilité aux dégâts</strong> | ||||
|             <span v-html="displayDamageTypes(monsterStats.damageTypeVulnerabilities)"></span> | ||||
|           </div> | ||||
|           <div class="monster-damage-type-resistances" v-if="monsterStats.damageTypeResistances && monsterStats.damageTypeResistances.length > 0"> | ||||
|             <strong>Résistance aux dégâts</strong> | ||||
|             <span v-html="displayDamageTypes(monsterStats.damageTypeResistances)"></span> | ||||
|           </div> | ||||
|           <div class="monster-damage-type-immunities" v-if="monsterStats.damageTypeImmunities && monsterStats.damageTypeImmunities.length > 0"> | ||||
|             <strong>Immunité contre les dégâts</strong> | ||||
|             <span v-html="displayDamageTypes(monsterStats.damageTypeImmunities)"></span> | ||||
|           </div> | ||||
|           <div class="monster-condition-immunities" v-if="monsterStats.conditionImmunities && monsterStats.conditionImmunities.length > 0"> | ||||
|             <strong>Immunité contre les états</strong> | ||||
|             <span v-html="displayConditionImmunities()"></span> | ||||
|           </div> | ||||
|           <div class="monster-senses"> | ||||
|             <strong>Sens</strong> | ||||
|             <template>{{ displaySenses() }}</template> | ||||
|           </div> | ||||
|           <div class="monster-languages"> | ||||
|             <strong>Langes</strong> | ||||
|             <template>{{ languages }}</template> | ||||
|           </div> | ||||
|           <div class="monster-challenge"> | ||||
|             <strong>Dangerosité</strong> | ||||
|             <template>{{ displayChallenge() }}</template> | ||||
|           </div> | ||||
|           <div class="monster-environments" v-if="monsterStats.environments"> | ||||
|             <strong>Environnements :</strong> | ||||
|             <span v-html="displayList(monsterStats.environments)"></span> | ||||
|           </div> | ||||
|           <div class="monster-dungeon-types" v-if="monsterStats.dungeonTypes"> | ||||
|             <strong>Types de donjons :</strong> | ||||
|             <span v-html="displayList(monsterStats.dungeonTypes)"></span> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
| 
 | ||||
|     <Content class="mt-4"/> | ||||
|     <Content v-if="!monster.custom" :pageKey="monster.key" class="mt-4" /> | ||||
|     <div v-else v-html="md.render(monster.content)" class="mt-4"></div> | ||||
| 
 | ||||
|     <p v-if="$page.frontmatter.source" class="source">Source : <em>{{ monster.source }}</em></p> | ||||
|     <p v-if="$page.frontmatter.source" class="source">Source : <em>{{ monsterStats.source }}</em><template v-if="monsterStats.source_page">, page {{ monsterStats.source_page }}</template></p> | ||||
| 
 | ||||
|   </main> | ||||
| </template> | ||||
|  | @ -145,26 +152,29 @@ import { | |||
| 
 | ||||
| import {stats} from '../../data/stats.js' | ||||
| import {armorTypes} from '../../data/armorTypes.js' | ||||
| import MarkdownIt from 'markdown-it' | ||||
| 
 | ||||
| export default { | ||||
| 
 | ||||
|   props: ['monster', 'isList', 'hideTitle'], | ||||
| 
 | ||||
|   data () { | ||||
|     return { | ||||
| 
 | ||||
|       md: new MarkdownIt() | ||||
|     } | ||||
|   }, | ||||
| 
 | ||||
|   computed: { | ||||
|     monster () { | ||||
|       return this.$page.frontmatter | ||||
|     monsterStats () { | ||||
|       return this.monster.frontmatter | ||||
|     }, | ||||
|     proficiencyBonus () { | ||||
|       return this.getProficiencyBonus() | ||||
|     }, | ||||
|     passivePerception () { | ||||
|       let result = 10 + getModifier(this.monster.abilityScores.sag) | ||||
|       if (this.monster.skills) { | ||||
|         this.monster.skills.forEach((skill, idx) => { | ||||
|       let result = 10 + getModifier(this.monsterStats.abilityScores.sag) | ||||
|       if (this.monsterStats.skills) { | ||||
|         this.monsterStats.skills.forEach((skill, idx) => { | ||||
|           if (skill.name == 'perception') { | ||||
|             if (skill.isExpert) { | ||||
|               result += this.proficiencyBonus * 2 | ||||
|  | @ -176,35 +186,73 @@ export default { | |||
|       } | ||||
|       return result | ||||
|     }, | ||||
| 
 | ||||
|     hp () { | ||||
|       if (this.monsterStats.customHP) { | ||||
|         return this.monsterStats.customHP | ||||
|       } else if (this.monsterStats.hitDiceCount) { | ||||
|         let hitDieSize = 8 // Dé de vie moyen par défaut | ||||
|         if (this.monsterStats.hitDieSize) { | ||||
|           hitDieSize = this.monsterStats.hitDieSize | ||||
|         } else if (this.monsterStats.size) { | ||||
|           hitDieSize = stats.sizes[this.monsterStats.size].hitDie | ||||
|         } | ||||
|         let hitPointsBonus = 1 | ||||
|         if (this.monsterStats.hitDiceCount > 1) { | ||||
|           hitPointsBonus = Math.floor(this.monsterStats.hitDiceCount / 2) | ||||
|         } | ||||
|         let averageHP = this.monsterStats.hitDiceCount * (hitDieSize / 2) + this.monsterStats.hitDiceCount * getModifier(this.monsterStats.abilityScores.con) + hitPointsBonus | ||||
|         let conMod = "" | ||||
|         if (getModifier(this.monsterStats.abilityScores.con) != 0) { | ||||
|           conMod = this.monsterStats.hitDiceCount * getModifier(this.monsterStats.abilityScores.con) | ||||
|           conMod = displayBonus(conMod) | ||||
|         } | ||||
|         return averageHP + ' (' + this.monsterStats.hitDiceCount + "d" + hitDieSize + conMod + ')' | ||||
|       } | ||||
|       return "" | ||||
|     }, | ||||
| 
 | ||||
|     languages () { | ||||
|       let result = this.monsterStats.languages.join(', ') | ||||
|       if (this.monsterStats.customLanguage) { | ||||
|         if (result != '') { | ||||
|           result += ', ' | ||||
|         } | ||||
|         result += this.monsterStats.customLanguage | ||||
|       } | ||||
|       if (this.monsterStats.telepathy) { | ||||
|         if (result != '') { | ||||
|           result += ', ' | ||||
|         } | ||||
|         result += 'télépathie ' + this.monsterStats.telepathy + ' m' | ||||
|       } | ||||
|       if (result == '') { | ||||
|         return '—' | ||||
|       } | ||||
|       return result | ||||
|     }, | ||||
|   }, | ||||
| 
 | ||||
|   methods: { | ||||
|     displayList (list) { return list.join(', ') }, | ||||
|     displayAbilityScore (value) { return displayAbilityScore(value) }, | ||||
|     getModifier (value) { return getModifier(value) }, | ||||
|     getProficiencyBonus () { return getProficiencyBonus(this.monster.challenge) }, | ||||
|     getProficiencyBonus () { return getProficiencyBonus(this.monsterStats.challenge) }, | ||||
| 
 | ||||
|     displayMonsterTypeSizeAlignment () { | ||||
|       return displayMonsterTypeSizeAlignment(this.monster) | ||||
|       return displayMonsterTypeSizeAlignment(this.monsterStats) | ||||
|     }, | ||||
| 
 | ||||
|     displaySavingThrowBonus (ability) { | ||||
|       let result = stats.abilities[ability].abbr | ||||
|       let bonus = displayBonus(getModifier(this.monster.abilityScores[ability]) + this.proficiencyBonus) | ||||
|       let bonus = displayBonus(getModifier(this.monsterStats.abilityScores[ability]) + this.proficiencyBonus) | ||||
|       result += ' ' + bonus | ||||
|       return result | ||||
|     }, | ||||
| 
 | ||||
|     displaySkillBonus (skill) { | ||||
|       if (skill.name == 'Perception') { | ||||
|         if (skill.isExpert) { | ||||
|           this.monster.perceptionProficiency == 'expert' | ||||
|         } else { | ||||
|           this.monster.perceptionProficiency == 'proficient' | ||||
|         } | ||||
|       } | ||||
|       let result = stats.skills[skill.name].label | ||||
|       let bonus = getModifier(this.monster.abilityScores[stats.skills[skill.name].ability]) + this.proficiencyBonus | ||||
|       let bonus = getModifier(this.monsterStats.abilityScores[stats.skills[skill.name].ability]) + this.proficiencyBonus | ||||
|       if (skill.isExpert) { | ||||
|         bonus += this.proficiencyBonus // Bonus de maître doublé pour les experts | ||||
|       } | ||||
|  | @ -213,66 +261,41 @@ export default { | |||
|       return result | ||||
|     }, | ||||
| 
 | ||||
|     displayHP () { | ||||
|       if (this.monster.customHP) { | ||||
|         return this.monster.customHP | ||||
|       } else if (this.monster.hitDiceCount) { | ||||
|         let hitDieSize = 8 // Dé de vie moyen par défaut | ||||
|         if (this.monster.hitDieSize) { | ||||
|           hitDieSize = this.monster.hitDieSize | ||||
|         } else if (this.monster.size) { | ||||
|           hitDieSize = stats.sizes[this.monster.size].hitDie | ||||
|         } | ||||
|         let hitPointsBonus = 1 | ||||
|         if (this.monster.hitDiceCount > 1) { | ||||
|           hitPointsBonus = Math.floor(this.monster.hitDiceCount / 2) | ||||
|         } | ||||
|         let averageHP = this.monster.hitDiceCount * (hitDieSize / 2) + this.monster.hitDiceCount * getModifier(this.monster.abilityScores.con) + hitPointsBonus | ||||
|         let conMod = "" | ||||
|         if (getModifier(this.monster.abilityScores.con) != 0) { | ||||
|           conMod = this.monster.hitDiceCount * getModifier(this.monster.abilityScores.con) | ||||
|           conMod = displayBonus(conMod) | ||||
|         } | ||||
|         return averageHP + ' (' + this.monster.hitDiceCount + "d" + hitDieSize + conMod + ')' | ||||
|       } | ||||
|       return "" | ||||
|     }, | ||||
| 
 | ||||
|     displayChallenge () { | ||||
|       return displayChallenge(this.monster.challenge, true) | ||||
|       return displayChallenge(this.monsterStats.challenge, true) | ||||
|     }, | ||||
| 
 | ||||
|     displayMovement () { | ||||
|       let result = '' | ||||
|       if (this.monster.movement.walk) { | ||||
|         result += this.monster.movement.walk + ' m' | ||||
|       if (this.monsterStats.movement.walk) { | ||||
|         result += this.monsterStats.movement.walk + ' m' | ||||
|       } else { | ||||
|         result += '0 m' | ||||
|       } | ||||
|       if (this.monster.movement.climb) { | ||||
|       if (this.monsterStats.movement.climb) { | ||||
|         if (result != '') { | ||||
|           result += ', ' | ||||
|         } | ||||
|         result += 'escalade ' + this.monster.movement.climb + ' m' | ||||
|         result += 'escalade ' + this.monsterStats.movement.climb + ' m' | ||||
|       } | ||||
|       if (this.monster.movement.burrow) { | ||||
|       if (this.monsterStats.movement.burrow) { | ||||
|         if (result != '') { | ||||
|           result += ', ' | ||||
|         } | ||||
|         result += 'fouissement ' + this.monster.movement.burrow + ' m' | ||||
|         result += 'fouissement ' + this.monsterStats.movement.burrow + ' m' | ||||
|       } | ||||
|       if (this.monster.movement.swim) { | ||||
|       if (this.monsterStats.movement.swim) { | ||||
|         if (result != '') { | ||||
|           result += ', ' | ||||
|         } | ||||
|         result += 'nage ' + this.monster.movement.swim + ' m' | ||||
|         result += 'nage ' + this.monsterStats.movement.swim + ' m' | ||||
|       } | ||||
|       if (this.monster.movement.fly) { | ||||
|       if (this.monsterStats.movement.fly) { | ||||
|         if (result != '') { | ||||
|           result += ', ' | ||||
|         } | ||||
|         result += 'vol ' + this.monster.movement.fly + ' m' | ||||
|         if (this.monster.movement.hover) { | ||||
|         result += 'vol ' + this.monsterStats.movement.fly + ' m' | ||||
|         if (this.monsterStats.movement.hover) { | ||||
|           result += ' (vol stationnaire)' | ||||
|         } | ||||
|       } | ||||
|  | @ -287,44 +310,48 @@ export default { | |||
|       let armor = '' | ||||
|       // Le monstre n'a pas d'armure. | ||||
|       // CA = 10 + Dex | ||||
|       if (!this.monster.ac.armorType) { | ||||
|         ac = 10 + getModifier(this.monster.abilityScores.dex) | ||||
|       if (!this.monsterStats.ac.armorType) { | ||||
|         ac = 10 + getModifier(this.monsterStats.abilityScores.dex) | ||||
|       } else { | ||||
|         // Le type d'armure n'est pas formalisé. On prend la valeur brute | ||||
|         if (this.monster.ac.armorType == 'custom') { | ||||
|           return this.monster.ac.value | ||||
|         if (this.monsterStats.ac.armorType == 'custom') { | ||||
|           return this.monsterStats.ac.value | ||||
|         } | ||||
| 
 | ||||
|         // Le monstre a une armure naturelle. | ||||
|         // CA =  10 + Armure naturelle + Dex | ||||
|         if (this.monster.ac.armorType == 'armure naturelle') { | ||||
|           armor = this.monster.ac.armorType | ||||
|           ac = ac + this.monster.ac.value + getModifier(this.monster.abilityScores.dex) | ||||
|         } else if (this.monster.ac.armorType == 'armure du mage') { | ||||
|         if (this.monsterStats.ac.armorType == 'armure naturelle') { | ||||
|           armor = this.monsterStats.ac.armorType | ||||
|           if (parseInt(this.monsterStats.ac.value)) { | ||||
|             ac = ac + parseInt(this.monsterStats.ac.value) + getModifier(this.monsterStats.abilityScores.dex) | ||||
|           } else { | ||||
|             ac = ac + getModifier(this.monsterStats.abilityScores.dex) | ||||
|           } | ||||
|         } else if (this.monsterStats.ac.armorType == 'armure du mage') { | ||||
|           hasMageArmor = true | ||||
|           ac = ac + getModifier(this.monster.abilityScores.dex) | ||||
|           mageArmorAc = mageArmorAc + getModifier(this.monster.abilityScores.dex) | ||||
|           ac = ac + getModifier(this.monsterStats.abilityScores.dex) | ||||
|           mageArmorAc = mageArmorAc + getModifier(this.monsterStats.abilityScores.dex) | ||||
|           armor = mageArmorAc + ' avec armure du mage' | ||||
|         } else { | ||||
|           // Le monstre a un type d'armure défini. | ||||
|           // On calcule sa CA selon le type | ||||
|           let armorType = armorTypes[this.monster.ac.armorType] | ||||
|           let armorType = armorTypes[this.monsterStats.ac.armorType] | ||||
| 
 | ||||
|           // Le type d'armure n'existe pas. On l'ignore. | ||||
|           // CA = 10 + Dex | ||||
|           if (!armorType) { | ||||
|             ac = ac + getModifier(this.monster.abilityScores.dex) | ||||
|             ac = ac + getModifier(this.monsterStats.abilityScores.dex) | ||||
|           } else { | ||||
|             // L'armure n'impose pas de limite de Dex | ||||
|             armor = this.monster.ac.armorType | ||||
|             armor = this.monsterStats.ac.armorType | ||||
|             if (armorType.maxDex === false) { | ||||
|               ac = armorType.value + getModifier(this.monster.abilityScores.dex) | ||||
|               ac = armorType.value + getModifier(this.monsterStats.abilityScores.dex) | ||||
|             } else { | ||||
|               // La limite de Dex de l'armure est inférieure à la Dex du monstre | ||||
|               if (armorType.maxDex <= getModifier(this.monster.abilityScores.dex)) { | ||||
|               if (armorType.maxDex <= getModifier(this.monsterStats.abilityScores.dex)) { | ||||
|                 ac = armorType.value + armorType.maxDex | ||||
|               } else { | ||||
|                 ac = armorType.value + getModifier(this.monster.abilityScores.dex) | ||||
|                 ac = armorType.value + getModifier(this.monsterStats.abilityScores.dex) | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|  | @ -333,7 +360,7 @@ export default { | |||
| 
 | ||||
| 
 | ||||
|       // Le monstre a un bouclier. Sa CA augmente de 2. | ||||
|       if (this.monster.ac.hasShield) { | ||||
|       if (this.monsterStats.ac.hasShield) { | ||||
|         ac = ac + 2 | ||||
|         mageArmorAc = mageArmorAc + 2 | ||||
|         if (armor != '') { | ||||
|  | @ -353,33 +380,29 @@ export default { | |||
|       return ac | ||||
|     }, | ||||
| 
 | ||||
|     displayLanguages () { | ||||
|       return this.monster.languages.join(', ') | ||||
|     }, | ||||
| 
 | ||||
|     displaySenses () { | ||||
|       let result = '' | ||||
|       if (this.monster.senses) { | ||||
|         if (this.monster.senses.tremorsense) { | ||||
|           result += 'perception des vibrations ' + this.monster.senses.tremorsense + ' m' | ||||
|       if (this.monsterStats.senses) { | ||||
|         if (this.monsterStats.senses.tremorsense) { | ||||
|           result += 'perception des vibrations ' + this.monsterStats.senses.tremorsense + ' m' | ||||
|         } | ||||
|         if (this.monster.senses.blindsight) { | ||||
|         if (this.monsterStats.senses.blindsight) { | ||||
|           if (result != '') { | ||||
|             result += ', ' | ||||
|           } | ||||
|           result += 'vision aveugle ' + this.monster.senses.blindsight + ' m' | ||||
|           result += 'vision aveugle ' + this.monsterStats.senses.blindsight + ' m' | ||||
|         } | ||||
|         if (this.monster.senses.darkvision) { | ||||
|         if (this.monsterStats.senses.darkvision) { | ||||
|           if (result != '') { | ||||
|             result += ', ' | ||||
|           } | ||||
|           result += 'vision dans le noir ' + this.monster.senses.darkvision + ' m' | ||||
|           result += 'vision dans le noir ' + this.monsterStats.senses.darkvision + ' m' | ||||
|         } | ||||
|         if (this.monster.senses.truesight) { | ||||
|         if (this.monsterStats.senses.truesight) { | ||||
|           if (result != '') { | ||||
|             result += ', ' | ||||
|           } | ||||
|           result += 'vision parfaite ' + this.monster.senses.truesight + ' m' | ||||
|           result += 'vision parfaite ' + this.monsterStats.senses.truesight + ' m' | ||||
|         } | ||||
|         if (result != '') { | ||||
|           result += ', ' | ||||
|  | @ -392,9 +415,9 @@ export default { | |||
| 
 | ||||
|     displayConditionImmunities () { | ||||
|       let result = '' | ||||
|       this.monster.conditionImmunities.forEach((condition, idx) => { | ||||
|       this.monsterStats.conditionImmunities.forEach((condition, idx) => { | ||||
|         if (result != '') { | ||||
|           if (idx == this.monster.conditionImmunities.length - 1) { | ||||
|           if (idx == this.monsterStats.conditionImmunities.length - 1) { | ||||
|             result += ' et ' | ||||
|           } else { | ||||
|             result += ', ' | ||||
|  | @ -432,7 +455,7 @@ export default { | |||
| 
 | ||||
| .monster-ability-scores { | ||||
|   margin: 12px 0; | ||||
|    | ||||
| 
 | ||||
|   .ability-label, .ability-score { | ||||
|     padding: 0 8px; | ||||
|   } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Maxime Moraine
						Maxime Moraine