favorite-spells-modal.component.html 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <div class="dimensions">
  2. <div class="shadow-box">
  3. <div class="title t-0">{{ "spells.favorite" | translate }}</div>
  4. <divider [appearance]="'gold-1'" style="margin: 1.5rem 2rem 0"></divider>
  5. <div class="heading-list">
  6. <div>{{ "spells.header.cost" | translate }}</div>
  7. <div>{{ "spells.header.name" | translate }}</div>
  8. <div>{{ "spells.header.level" | translate }}</div>
  9. <div>{{ "spells.header.bonus" | translate }}</div>
  10. <div>{{ "spells.header.effect" | translate }}</div>
  11. <div>{{ "spells.header.range" | translate }}</div>
  12. </div>
  13. </div>
  14. <div id="spells-table" class="item-list table-content">
  15. @for (spell of preparedSpells; let index = $index; track spell) {
  16. <div
  17. matRipple
  18. class="item"
  19. [ngClass]="{ selected: checkedSpells[index] }"
  20. (click)="checkedSpells[index] = !checkedSpells[index]"
  21. >
  22. <!-- Range Icon -->
  23. <ng-container
  24. [ngTemplateOutlet]="costTemplate"
  25. [ngTemplateOutletContext]="{ spell: spell }"
  26. ></ng-container>
  27. <div class="vertical-line"></div>
  28. <!-- Name -->
  29. <ng-container
  30. [ngTemplateOutlet]="spellNameTemplate"
  31. [ngTemplateOutletContext]="{ spell: spell }"
  32. ></ng-container>
  33. <div class="vertical-line"></div>
  34. <!-- Level -->
  35. <ng-container
  36. [ngTemplateOutlet]="spellLevelTemplate"
  37. [ngTemplateOutletContext]="{ spell: spell }"
  38. ></ng-container>
  39. <div class="vertical-line"></div>
  40. <!-- Attack -->
  41. <ng-container
  42. [ngTemplateOutlet]="spellAttackTemplate"
  43. [ngTemplateOutletContext]="{ spell: spell }"
  44. ></ng-container>
  45. <div class="vertical-line"></div>
  46. <!-- Damage/Heal -->
  47. <ng-container
  48. [ngTemplateOutlet]="spellDamageTemplate"
  49. [ngTemplateOutletContext]="{ spell: spell }"
  50. ></ng-container>
  51. <div class="vertical-line"></div>
  52. <!-- Range -->
  53. <ng-container
  54. [ngTemplateOutlet]="spellRangeTemplate"
  55. [ngTemplateOutletContext]="{ spell: spell }"
  56. ></ng-container>
  57. </div>
  58. } @empty {
  59. <div
  60. style="
  61. text-align: center;
  62. margin-top: 3rem;
  63. font-size: 1.25rem;
  64. font-weight: 500;
  65. "
  66. [innerHTML]="'spells.emptyFavorites' | translate"
  67. ></div>
  68. }
  69. </div>
  70. <div class="horizontal-buttons">
  71. <ui-button style="width: 40%" (click)="update()"
  72. >{{ "buttons.confirm" | translate }}
  73. </ui-button>
  74. <ui-button style="width: 40%" (click)="cancel()">
  75. {{ "buttons.cancel" | translate }}
  76. </ui-button>
  77. </div>
  78. </div>
  79. <!-- Templates -->
  80. <!-- COST -->
  81. <ng-template #costTemplate let-spell="spell">
  82. <div class="bold">
  83. @if (spell.cost === "action") {
  84. <span>A</span>
  85. }
  86. @if (spell.cost === "bonus") {
  87. <span>B</span>
  88. }
  89. @if (spell.cost === "reaction") {
  90. <span>R</span>
  91. }
  92. </div>
  93. </ng-template>
  94. <!-- NAME -->
  95. <ng-template #spellNameTemplate let-spell="spell">
  96. <div>
  97. <div class="bold">
  98. @if (translate.getDefaultLang() == "de") {
  99. {{ spell.german }}
  100. } @else {
  101. {{ spell.english }}
  102. }
  103. </div>
  104. <div class="bold small">
  105. @if (spell.needsConcentration) {
  106. <span>{{ "spells.concentrationAbbr" | translate }} | </span>
  107. }
  108. @if (spell.needsVerbal) {
  109. <span>{{ "spells.components.verbal" | translate }} </span>
  110. }
  111. @if (spell.needsSomatic) {
  112. <span>{{ "spells.components.somatic" | translate }} </span>
  113. }
  114. @if (spell.needsMaterial) {
  115. <span>{{ "spells.components.material" | translate }} </span>
  116. }
  117. <div></div>
  118. </div>
  119. </div>
  120. </ng-template>
  121. <!-- Level -->
  122. <ng-template #spellLevelTemplate let-spell="spell">
  123. @if (spell.level !== 0) {
  124. <div class="bold">{{ spell.level }}</div>
  125. }
  126. @if (spell.level === 0) {
  127. <div class="bold">
  128. {{ "spells.cantrip" | translate }}
  129. </div>
  130. }
  131. </ng-template>
  132. <!-- Attack -->
  133. <ng-template #spellAttackTemplate let-spell="spell">
  134. <div>
  135. @if (spell.needsSavingThrow) {
  136. <div>
  137. <div>
  138. {{
  139. "attributesAbbreviations." + spell.savingThrowAttribute | translate
  140. }}
  141. </div>
  142. <div>{{ utils.spellSaveDC }}</div>
  143. </div>
  144. } @else if (spell.needsAttackRoll) {
  145. <div>
  146. <div>{{ utils.spellAttackModifier }}</div>
  147. </div>
  148. } @else {
  149. <div>-</div>
  150. }
  151. </div>
  152. </ng-template>
  153. <!-- Damage/Heal -->
  154. <ng-template #spellDamageTemplate let-spell="spell">
  155. <div>
  156. @if (spell.doesDamage) {
  157. @for (damage of spell.damage; track damage; let index = $index) {
  158. <div>
  159. <span>
  160. {{ damage.diceNumber }}
  161. {{ "general.dice" | translate }}{{ damage.diceType }}
  162. </span>
  163. <span>
  164. <icon
  165. [size]="'xs'"
  166. [type]="'damage'"
  167. [icon]="damage.damageType"
  168. ></icon>
  169. </span>
  170. </div>
  171. }
  172. } @else if (spell.doesHeal) {
  173. <div class="heal">
  174. <span
  175. >{{ spell.heal.diceNumber }} {{ "general.dice" | translate
  176. }}{{ spell.heal.diceType }}
  177. </span>
  178. @if (spell.heal.additionalHeal) {
  179. <span>+{{ spell.heal.additionalHeal }} </span>
  180. }
  181. <span>
  182. <icon [size]="'xs'" [type]="'damage'" [icon]="'heal'"></icon>
  183. </span>
  184. </div>
  185. } @else {
  186. <div>-</div>
  187. }
  188. </div>
  189. </ng-template>
  190. <!-- Range -->
  191. <ng-template #spellRangeTemplate let-spell="spell">
  192. <div class="spell-range">
  193. @if (spell.isRanged) {
  194. <div>{{ spell.range }} ft.</div>
  195. }
  196. @if (!spell.isRanged && spell.range !== 0) {
  197. <div>
  198. {{ "spells.touch" | translate }}
  199. </div>
  200. }
  201. @if (spell.hasAreaOfEffect) {
  202. <div>
  203. <span
  204. >{{ spell.length }} ft.
  205. <img
  206. style="width: 1rem; height: 1rem; margin-left: 0.125rem"
  207. [src]="
  208. 'assets/icons/spellIcons/' + spell.areaOfEffectType + '.svg'
  209. "
  210. /></span>
  211. </div>
  212. }
  213. </div>
  214. </ng-template>