full-spellcard.component.html 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <div class="card-container">
  2. <div
  3. class="card-background"
  4. [style.background-color]="
  5. 'var(--' + spell.school.toLowerCase() + '-background)'
  6. "
  7. ></div>
  8. <div
  9. class="title"
  10. [style.box-shadow]="
  11. 'var(--' + spell.school.toLowerCase() + '-border-large)'
  12. "
  13. >
  14. @if (translate.getDefaultLang() == "de") {
  15. {{ spell.german }}
  16. } @else {
  17. {{ spell.english }}
  18. }
  19. @if (spell.isRitual) {
  20. (Ritual)
  21. }
  22. </div>
  23. <div
  24. class="data"
  25. [style.box-shadow]="
  26. 'var(--' + spell.school.toLowerCase() + '-border-large)'
  27. "
  28. >
  29. <img
  30. class="spell-image"
  31. [src]="'assets/images/spells/' + spell.image + '.jpg'"
  32. (error)="setBackupImage($event)"
  33. [style.box-shadow]="
  34. 'var(--' + spell.school.toLowerCase() + '-border-large)'
  35. "
  36. alt="spell image"
  37. />
  38. <div class="stats">
  39. <!-- CASTING TIME -->
  40. <div
  41. class="stats-row"
  42. style="margin-top: 0.5rem"
  43. [style.box-shadow]="
  44. 'var(--' + spell.school.toLowerCase() + '-border-small)'
  45. "
  46. >
  47. <div class="stat" style="width: 7rem">
  48. {{ "fullSpellcards.castingTime" | translate }}
  49. </div>
  50. <div class="value" style="width: 8rem">
  51. {{ spell.timeToCast }} {{ "time." + spell.cost | translate }}
  52. </div>
  53. </div>
  54. <!-- DURATION -->
  55. <div
  56. class="stats-row"
  57. [style.height]="spell.needsConcentration ? '3rem' : '2.5rem'"
  58. [style.box-shadow]="
  59. 'var(--' + spell.school.toLowerCase() + '-border-small)'
  60. "
  61. >
  62. <div class="stat">{{ "fullSpellcards.duration" | translate }}</div>
  63. <div class="value">
  64. @if (
  65. spell.durationType != "instant" && spell.durationType != "permanent"
  66. ) {
  67. @if (spell.needsConcentration) {
  68. {{ "fullSpellcards.concentration" | translate }}
  69. }
  70. {{ spell.duration }}
  71. }
  72. {{ "time." + spell.durationType | translate }}
  73. </div>
  74. </div>
  75. <!-- COMPONENTS -->
  76. <div
  77. class="stats-row"
  78. [style.box-shadow]="
  79. 'var(--' + spell.school.toLowerCase() + '-border-small)'
  80. "
  81. >
  82. <div class="stat">{{ "fullSpellcards.components" | translate }}</div>
  83. <div class="value">
  84. @if (spell.needsVerbal) {
  85. {{ "spells.components.verbal" | translate }}
  86. }
  87. @if (spell.needsSomatic) {
  88. {{ "spells.components.somatic" | translate }}
  89. }
  90. @if (spell.needsMaterial) {
  91. {{ "spells.components.material" | translate }}
  92. }
  93. </div>
  94. </div>
  95. <!-- MODIFIER -->
  96. <div
  97. class="stats-row"
  98. [style.box-shadow]="
  99. 'var(--' + spell.school.toLowerCase() + '-border-small)'
  100. "
  101. >
  102. <div class="stat">
  103. @if (spell.needsSavingThrow) {
  104. <div class="name">{{ "fullSpellcards.saveDC" | translate }}</div>
  105. } @else if (spell.needsAttackRoll) {
  106. <div class="name">{{ "fullSpellcards.attack" | translate }}</div>
  107. } @else {
  108. <div class="name">
  109. {{ "fullSpellcards.modifier" | translate }}
  110. </div>
  111. }
  112. </div>
  113. <div class="value">
  114. @if (spell.needsSavingThrow) {
  115. {{
  116. "attributesAbbreviations." + spell.savingThrowAttribute
  117. | translate
  118. }}
  119. {{ utils.spellSaveDC }}
  120. } @else if (spell.needsAttackRoll) {
  121. {{ utils.spellAttackModifier }}
  122. } @else {
  123. <div style="padding-right: 1rem">-</div>
  124. }
  125. </div>
  126. </div>
  127. <!-- SCHOOL -->
  128. <div
  129. class="stats-row"
  130. style="margin-bottom: 0.5rem"
  131. [style.box-shadow]="
  132. 'var(--' + spell.school.toLowerCase() + '-border-small)'
  133. "
  134. >
  135. <div class="stat" style="width: 6rem">
  136. {{ "fullSpellcards.school" | translate }}
  137. </div>
  138. <div class="value" style="width: 9rem">
  139. {{ "schools." + spell.school | translate }}
  140. </div>
  141. </div>
  142. </div>
  143. </div>
  144. <!-- INFO ROW -->
  145. <div
  146. class="info"
  147. [style.box-shadow]="
  148. 'var(--' + spell.school.toLowerCase() + '-border-large)'
  149. "
  150. >
  151. <div class="effect">
  152. <div class="value">
  153. @if (spell.doesDamage) {
  154. @for (damage of spell.damage; track damage; let index = $index) {
  155. <div>
  156. <span>
  157. {{ damage.diceNumber }}
  158. {{ "general.dice" | translate }}{{ damage.diceType }}
  159. </span>
  160. <span>
  161. <icon
  162. [size]="'xs'"
  163. [type]="'damage'"
  164. [icon]="damage.damageType"
  165. ></icon>
  166. </span>
  167. </div>
  168. }
  169. } @else if (spell.doesHeal) {
  170. <div class="heal">
  171. <span
  172. >{{ spell.heal?.diceNumber }} {{ "general.dice" | translate
  173. }}{{ spell.heal?.diceType }}
  174. </span>
  175. @if (spell.heal?.additionalHeal) {
  176. <span>+{{ spell.heal?.additionalHeal }} </span>
  177. }
  178. <span>
  179. <icon [size]="'xs'" [type]="'damage'" [icon]="'heal'"></icon>
  180. </span>
  181. </div>
  182. } @else {
  183. -
  184. }
  185. </div>
  186. <div>
  187. @if (spell.doesDamage) {
  188. <div class="name">{{ "fullSpellcards.damage" | translate }}</div>
  189. } @else if (spell.doesHeal) {
  190. <div class="name">{{ "fullSpellcards.heal" | translate }}</div>
  191. } @else {
  192. <div class="name">{{ "fullSpellcards.effect" | translate }}</div>
  193. }
  194. </div>
  195. </div>
  196. <!-- RANGE -->
  197. <div class="range">
  198. <div class="value">
  199. @if (spell.isRanged) {
  200. <span>{{ spell.range }} ft.</span>
  201. } @else if (spell.range === 0) {
  202. <span>{{ "fullSpellcards.self" | translate }}</span>
  203. } @else if (spell.range === 5) {
  204. <span>{{ "fullSpellcards.touch" | translate }}</span>
  205. }
  206. @if (spell.hasAreaOfEffect) {
  207. <span>
  208. ({{ spell.length }} ft.
  209. <img
  210. style="width: 1rem; height: 1rem; margin-left: 0.125rem"
  211. [src]="
  212. 'assets/icons/spellIcons/' + spell.areaOfEffectType + '.svg'
  213. "
  214. />)
  215. </span>
  216. }
  217. </div>
  218. <div class="stat">
  219. {{ "fullSpellcards.range" | translate }}
  220. </div>
  221. </div>
  222. <!-- LEVEL -->
  223. <div
  224. class="level"
  225. [style.box-shadow]="
  226. 'var(--' + spell.school.toLowerCase() + '-border-large)'
  227. "
  228. >
  229. {{ spell.level }}
  230. </div>
  231. </div>
  232. <!-- DESCRIPTION -->
  233. <div
  234. class="description"
  235. [innerHTML]="
  236. translate.getDefaultLang() == 'de'
  237. ? spell.description_de
  238. : spell.description_en
  239. "
  240. [style.box-shadow]="
  241. 'var(--' + spell.school.toLowerCase() + '-border-large)'
  242. "
  243. ></div>
  244. <div class="button-container">
  245. @if (spell.isCustom) {
  246. <button class="green" (click)="update()">Bearbeiten</button>
  247. }
  248. <button
  249. [class]="alreadyInFavorites ? 'red' : 'green'"
  250. style="height: 4rem"
  251. (click)="alreadyInFavorites ? removeFromFavorites() : addToFavorites()"
  252. >
  253. @if (alreadyInFavorites) {
  254. Aus Favoriten entfernen
  255. } @else {
  256. Zu Favoriten hinzufügen
  257. }
  258. </button>
  259. @if (!isFromDashboard) {
  260. @if (spell.isCustom) {
  261. <button class="red" style="height: 4rem" (click)="delete()">
  262. Endgültig löschen
  263. </button>
  264. }
  265. <button class="red" (click)="remove()">Entfernen</button>
  266. }
  267. </div>
  268. </div>