@optolith/entity-descriptions 0.2.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/lib/creator.d.ts +32 -0
  3. package/lib/creator.js +72 -0
  4. package/lib/entities/activatable.d.ts +52 -0
  5. package/lib/entities/activatable.js +609 -0
  6. package/lib/entities/alternativeRule.d.ts +7 -0
  7. package/lib/entities/alternativeRule.js +21 -0
  8. package/lib/entities/attribute.d.ts +6 -0
  9. package/lib/entities/attribute.js +15 -0
  10. package/lib/entities/combatTechnique.d.ts +5 -7
  11. package/lib/entities/combatTechnique.js +34 -24
  12. package/lib/entities/condition.d.ts +12 -0
  13. package/lib/entities/condition.js +63 -0
  14. package/lib/entities/culture.d.ts +8 -0
  15. package/lib/entities/culture.js +309 -0
  16. package/lib/entities/curriculum.d.ts +11 -0
  17. package/lib/entities/curriculum.js +266 -0
  18. package/lib/entities/derivedCharacteristic.d.ts +9 -0
  19. package/lib/entities/derivedCharacteristic.js +91 -0
  20. package/lib/entities/disease.d.ts +9 -0
  21. package/lib/entities/disease.js +88 -0
  22. package/lib/entities/elixir.d.ts +10 -0
  23. package/lib/entities/elixir.js +76 -0
  24. package/lib/entities/equipment.d.ts +24 -0
  25. package/lib/entities/equipment.js +605 -0
  26. package/lib/entities/equipmentPackage.d.ts +8 -0
  27. package/lib/entities/equipmentPackage.js +300 -0
  28. package/lib/entities/experienceLevel.d.ts +3 -2
  29. package/lib/entities/experienceLevel.js +33 -28
  30. package/lib/entities/focusRule.d.ts +3 -4
  31. package/lib/entities/focusRule.js +13 -5
  32. package/lib/entities/influence.d.ts +11 -0
  33. package/lib/entities/influence.js +43 -0
  34. package/lib/entities/liturgicalChant.d.ts +13 -23
  35. package/lib/entities/liturgicalChant.js +171 -131
  36. package/lib/entities/optionalRule.d.ts +3 -2
  37. package/lib/entities/optionalRule.js +4 -3
  38. package/lib/entities/partial/activatableNameChunks.d.ts +58 -0
  39. package/lib/entities/partial/activatableNameChunks.js +356 -0
  40. package/lib/entities/partial/adventurePointsValue.d.ts +9 -0
  41. package/lib/entities/partial/adventurePointsValue.js +243 -0
  42. package/lib/entities/partial/animalTypes.d.ts +11 -0
  43. package/lib/entities/partial/animalTypes.js +13 -0
  44. package/lib/entities/partial/commonnessRatedAdvantagesAndDisadvantages.d.ts +16 -0
  45. package/lib/entities/partial/commonnessRatedAdvantagesAndDisadvantages.js +40 -0
  46. package/lib/entities/partial/dice.d.ts +10 -0
  47. package/lib/entities/partial/dice.js +13 -0
  48. package/lib/entities/partial/enhancements.d.ts +7 -0
  49. package/lib/entities/partial/enhancements.js +26 -0
  50. package/lib/entities/partial/herbary.d.ts +28 -0
  51. package/lib/entities/partial/herbary.js +65 -0
  52. package/lib/entities/partial/map.d.ts +49 -0
  53. package/lib/entities/partial/map.js +43 -0
  54. package/lib/entities/partial/mathOperation.d.ts +36 -0
  55. package/lib/entities/partial/mathOperation.js +107 -0
  56. package/lib/entities/partial/prerequisites/displayOption.d.ts +7 -0
  57. package/lib/entities/partial/prerequisites/displayOption.js +19 -0
  58. package/lib/entities/partial/prerequisites/index.d.ts +67 -0
  59. package/lib/entities/partial/prerequisites/index.js +189 -0
  60. package/lib/entities/partial/prerequisites/part.d.ts +26 -0
  61. package/lib/entities/partial/prerequisites/part.js +88 -0
  62. package/lib/entities/partial/prerequisites/prerequisiteGroups.d.ts +65 -0
  63. package/lib/entities/partial/prerequisites/prerequisiteGroups.js +278 -0
  64. package/lib/entities/partial/prerequisites/single/activatable.d.ts +18 -0
  65. package/lib/entities/partial/prerequisites/single/activatable.js +40 -0
  66. package/lib/entities/partial/prerequisites/single/animistPower.d.ts +8 -0
  67. package/lib/entities/partial/prerequisites/single/animistPower.js +23 -0
  68. package/lib/entities/partial/prerequisites/single/blessedTradition.d.ts +7 -0
  69. package/lib/entities/partial/prerequisites/single/blessedTradition.js +32 -0
  70. package/lib/entities/partial/prerequisites/single/commonSuggestedByRCP.d.ts +6 -0
  71. package/lib/entities/partial/prerequisites/single/commonSuggestedByRCP.js +19 -0
  72. package/lib/entities/partial/prerequisites/single/culture.d.ts +8 -0
  73. package/lib/entities/partial/prerequisites/single/culture.js +20 -0
  74. package/lib/entities/partial/prerequisites/single/enhancement.d.ts +8 -0
  75. package/lib/entities/partial/prerequisites/single/enhancement.js +41 -0
  76. package/lib/entities/partial/prerequisites/single/influence.d.ts +8 -0
  77. package/lib/entities/partial/prerequisites/single/influence.js +17 -0
  78. package/lib/entities/partial/prerequisites/single/magicalTradition.d.ts +7 -0
  79. package/lib/entities/partial/prerequisites/single/magicalTradition.js +27 -0
  80. package/lib/entities/partial/prerequisites/single/noOtherAncestorBloodAdvantage.d.ts +6 -0
  81. package/lib/entities/partial/prerequisites/single/noOtherAncestorBloodAdvantage.js +8 -0
  82. package/lib/entities/partial/prerequisites/single/pact.d.ts +8 -0
  83. package/lib/entities/partial/prerequisites/single/pact.js +30 -0
  84. package/lib/entities/partial/prerequisites/single/personalityTrait.d.ts +8 -0
  85. package/lib/entities/partial/prerequisites/single/personalityTrait.js +28 -0
  86. package/lib/entities/partial/prerequisites/single/primaryAttribute.d.ts +7 -0
  87. package/lib/entities/partial/prerequisites/single/primaryAttribute.js +15 -0
  88. package/lib/entities/partial/prerequisites/single/profession.d.ts +8 -0
  89. package/lib/entities/partial/prerequisites/single/profession.js +19 -0
  90. package/lib/entities/partial/prerequisites/single/publication.d.ts +8 -0
  91. package/lib/entities/partial/prerequisites/single/publication.js +19 -0
  92. package/lib/entities/partial/prerequisites/single/race.d.ts +8 -0
  93. package/lib/entities/partial/prerequisites/single/race.js +20 -0
  94. package/lib/entities/partial/prerequisites/single/rated.d.ts +8 -0
  95. package/lib/entities/partial/prerequisites/single/rated.js +41 -0
  96. package/lib/entities/partial/prerequisites/single/ratedMinimumNumber.d.ts +8 -0
  97. package/lib/entities/partial/prerequisites/single/ratedMinimumNumber.js +89 -0
  98. package/lib/entities/partial/prerequisites/single/ratedSum.d.ts +8 -0
  99. package/lib/entities/partial/prerequisites/single/ratedSum.js +21 -0
  100. package/lib/entities/partial/prerequisites/single/rule.d.ts +7 -0
  101. package/lib/entities/partial/prerequisites/single/rule.js +4 -0
  102. package/lib/entities/partial/prerequisites/single/sex.d.ts +7 -0
  103. package/lib/entities/partial/prerequisites/single/sex.js +19 -0
  104. package/lib/entities/partial/prerequisites/single/sexualCharacteristic.d.ts +7 -0
  105. package/lib/entities/partial/prerequisites/single/sexualCharacteristic.js +21 -0
  106. package/lib/entities/partial/prerequisites/single/socialStatus.d.ts +8 -0
  107. package/lib/entities/partial/prerequisites/single/socialStatus.js +21 -0
  108. package/lib/entities/partial/prerequisites/single/state.d.ts +8 -0
  109. package/lib/entities/partial/prerequisites/single/state.js +20 -0
  110. package/lib/entities/partial/prerequisites/single/text.d.ts +7 -0
  111. package/lib/entities/partial/prerequisites/single/text.js +9 -0
  112. package/lib/entities/partial/professions.d.ts +15 -0
  113. package/lib/entities/partial/professions.js +19 -0
  114. package/lib/entities/partial/rated/activatable/castingTime.d.ts +16 -7
  115. package/lib/entities/partial/rated/activatable/castingTime.js +35 -20
  116. package/lib/entities/partial/rated/activatable/checkResultBased.d.ts +18 -3
  117. package/lib/entities/partial/rated/activatable/checkResultBased.js +18 -10
  118. package/lib/entities/partial/rated/activatable/cost.d.ts +88 -8
  119. package/lib/entities/partial/rated/activatable/cost.js +183 -115
  120. package/lib/entities/partial/rated/activatable/duration.d.ts +36 -13
  121. package/lib/entities/partial/rated/activatable/duration.js +72 -61
  122. package/lib/entities/partial/rated/activatable/effect.d.ts +4 -4
  123. package/lib/entities/partial/rated/activatable/effect.js +32 -25
  124. package/lib/entities/partial/rated/activatable/index.d.ts +31 -27
  125. package/lib/entities/partial/rated/activatable/index.js +63 -28
  126. package/lib/entities/partial/rated/activatable/isMinimumMaximum.d.ts +5 -6
  127. package/lib/entities/partial/rated/activatable/isMinimumMaximum.js +8 -5
  128. package/lib/entities/partial/rated/activatable/nonModifiableSuffix.d.ts +2 -4
  129. package/lib/entities/partial/rated/activatable/nonModifiableSuffix.js +7 -42
  130. package/lib/entities/partial/rated/activatable/range.d.ts +22 -14
  131. package/lib/entities/partial/rated/activatable/range.js +54 -54
  132. package/lib/entities/partial/rated/activatable/speed.d.ts +11 -2
  133. package/lib/entities/partial/rated/activatable/speed.js +14 -1
  134. package/lib/entities/partial/rated/activatable/targetCategory.d.ts +4 -5
  135. package/lib/entities/partial/rated/activatable/targetCategory.js +19 -24
  136. package/lib/entities/partial/rated/improvementCost.d.ts +8 -4
  137. package/lib/entities/partial/rated/improvementCost.js +9 -4
  138. package/lib/entities/partial/rated/skillCheck.d.ts +20 -17
  139. package/lib/entities/partial/rated/skillCheck.js +56 -54
  140. package/lib/entities/partial/reader.d.ts +266 -0
  141. package/lib/entities/partial/reader.js +175 -0
  142. package/lib/entities/partial/responsiveText.d.ts +10 -5
  143. package/lib/entities/partial/responsiveText.js +19 -3
  144. package/lib/entities/partial/units/energy.d.ts +5 -8
  145. package/lib/entities/partial/units/energy.js +5 -23
  146. package/lib/entities/partial/units/length.d.ts +20 -2
  147. package/lib/entities/partial/units/length.js +24 -5
  148. package/lib/entities/partial/units/timeSpan.d.ts +25 -4
  149. package/lib/entities/partial/units/timeSpan.js +27 -15
  150. package/lib/entities/partial/unknown.d.ts +5 -1
  151. package/lib/entities/partial/unknown.js +5 -1
  152. package/lib/entities/personalityTrait.d.ts +7 -0
  153. package/lib/entities/personalityTrait.js +56 -0
  154. package/lib/entities/poison.d.ts +12 -0
  155. package/lib/entities/poison.js +368 -0
  156. package/lib/entities/profession.d.ts +12 -0
  157. package/lib/entities/profession.js +585 -0
  158. package/lib/entities/race.d.ts +9 -0
  159. package/lib/entities/race.js +146 -0
  160. package/lib/entities/sexPractice.d.ts +6 -0
  161. package/lib/entities/sexPractice.js +33 -0
  162. package/lib/entities/skill.d.ts +9 -9
  163. package/lib/entities/skill.js +124 -91
  164. package/lib/entities/spell.d.ts +86 -26
  165. package/lib/entities/spell.js +842 -147
  166. package/lib/entities/state.d.ts +6 -0
  167. package/lib/entities/state.js +17 -0
  168. package/lib/helpers/enums.d.ts +11 -0
  169. package/lib/helpers/enums.js +6 -0
  170. package/lib/helpers/getTypes.d.ts +12 -482
  171. package/lib/helpers/getTypes.js +1 -0
  172. package/lib/helpers/identifiers.d.ts +314 -0
  173. package/lib/helpers/identifiers.js +333 -0
  174. package/lib/helpers/locale.d.ts +21 -2
  175. package/lib/helpers/translate.d.ts +47 -5
  176. package/lib/helpers/translate.js +13 -6
  177. package/lib/index.d.ts +854 -21
  178. package/lib/index.js +182 -17
  179. package/lib/references/index.d.ts +6 -3
  180. package/lib/references/index.js +25 -33
  181. package/lib/references/page.d.ts +1 -1
  182. package/lib/references/page.js +14 -14
  183. package/lib/references/pageRange.d.ts +1 -5
  184. package/lib/references/pageRange.js +7 -16
  185. package/lib/tsconfig.tsbuildinfo +1 -0
  186. package/package.json +31 -10
  187. package/.prettierrc.yml +0 -1
  188. package/lib/entities/partial/rated/activatable/entity.d.ts +0 -11
  189. package/lib/entities/partial/rated/activatable/entity.js +0 -12
  190. package/lib/references/occurrence.d.ts +0 -4
  191. package/lib/references/occurrence.js +0 -3
@@ -1,29 +1,31 @@
1
1
  import { isNotNullish } from "@optolith/helpers/nullable";
2
2
  import { assertExhaustive } from "@optolith/helpers/typeSafety";
3
- import { createEntityDescriptionCreator, } from "../index.js";
4
- import { getDurationTranslationForBlessing } from "./partial/rated/activatable/duration.js";
5
- import { getTextForEffect } from "./partial/rated/activatable/effect.js";
6
- import { Entity } from "./partial/rated/activatable/entity.js";
7
- import { getFastOneTimePerformanceParametersTranslations, getFastSustainedPerformanceParametersTranslations, getSlowOneTimePerformanceParametersTranslations, getSlowSustainedPerformanceParametersTranslations, } from "./partial/rated/activatable/index.js";
8
- import { getTextForBlessingRange } from "./partial/rated/activatable/range.js";
9
- import { getTargetCategoryTranslation } from "./partial/rated/activatable/targetCategory.js";
10
- import { createImprovementCost } from "./partial/rated/improvementCost.js";
11
- import { getTextForCheck } from "./partial/rated/skillCheck.js";
3
+ import { Case } from "tsondb/schema/gen";
4
+ import { createEntityDescriptionCreator } from "../creator.js";
5
+ import { renderEnhancements } from "./partial/enhancements.js";
6
+ import { renderOneTimeDuration } from "./partial/rated/activatable/duration.js";
7
+ import { renderEffect } from "./partial/rated/activatable/effect.js";
8
+ import { renderFastPerformanceParameters, renderSlowPerformanceParameters, } from "./partial/rated/activatable/index.js";
9
+ import { ModifiableParameter } from "./partial/rated/activatable/nonModifiableSuffix.js";
10
+ import { renderNonModifiableRange } from "./partial/rated/activatable/range.js";
11
+ import { renderTargetCategory } from "./partial/rated/activatable/targetCategory.js";
12
+ import { renderImprovementCost } from "./partial/rated/improvementCost.js";
13
+ import { renderSkillCheckWithPenalty } from "./partial/rated/skillCheck.js";
12
14
  import { ResponsiveTextSize } from "./partial/responsiveText.js";
13
15
  const getTextForTraditions = (deps, values) => {
14
- const getAspectName = (ref) => deps.translateMap(deps.getAspectById(ref.id.aspect)?.translations)?.name;
16
+ const getAspectName = (aspectId) => deps.translateMap(deps.getInstanceById("Aspect", aspectId)?.translations)?.name;
15
17
  const text = values
16
- .map((trad) => {
17
- switch (trad.tag) {
18
+ .map(trad => {
19
+ switch (trad.kind) {
18
20
  case "GeneralAspect":
19
- return getAspectName(trad.general_aspect);
21
+ return getAspectName(trad.GeneralAspect);
20
22
  case "Tradition": {
21
- const traditionTranslation = deps.translateMap(deps.getBlessedTraditionById(trad.tradition.tradition.id.blessed_tradition)?.translations);
23
+ const traditionTranslation = deps.translateMap(deps.getInstanceById("BlessedTradition", trad.Tradition.tradition)?.translations);
22
24
  const name = traditionTranslation?.name_compressed ?? traditionTranslation?.name;
23
25
  if (name === undefined) {
24
26
  return undefined;
25
27
  }
26
- const aspects = trad.tradition.aspects
28
+ const aspects = trad.Tradition.aspects
27
29
  ?.map(getAspectName)
28
30
  .filter(isNotNullish)
29
31
  .sort(deps.localeCompare) ?? [];
@@ -46,170 +48,208 @@ const getTextForTraditions = (deps, values) => {
46
48
  /**
47
49
  * Get a JSON representation of the rules text for a blessing.
48
50
  */
49
- export const getBlessingEntityDescription = createEntityDescriptionCreator(({ getTargetCategoryById }, locale, entry) => {
51
+ export const getBlessingEntityDescription = createEntityDescriptionCreator(({ getInstanceById }, locale, { content: entry }) => {
50
52
  const { translate, translateMap } = locale;
51
53
  const translation = translateMap(entry.translations);
52
54
  if (translation === undefined) {
53
55
  return undefined;
54
56
  }
55
- const range = getTextForBlessingRange(locale, ResponsiveTextSize.Full, entry.parameters.range);
56
- const duration = getDurationTranslationForBlessing(locale, ResponsiveTextSize.Full, entry.parameters.duration);
57
+ const env = {
58
+ translate,
59
+ translateMap,
60
+ getInstanceById,
61
+ responsiveTextSize: ResponsiveTextSize.Full,
62
+ };
63
+ const range = renderNonModifiableRange(entry.parameters.range, false).run(env);
64
+ const duration = renderOneTimeDuration(entry.parameters.duration).run(env);
57
65
  return {
58
66
  title: translation.name,
59
67
  className: "blessing",
60
68
  body: [
61
69
  {
62
- label: translate("Effect"),
63
- value: translation.effect,
64
- },
65
- {
66
- label: translate("Range"),
67
- value: range !== translation.range
68
- ? `***${range}*** (${translation.range})`
69
- : range,
70
+ type: "definitionList",
71
+ items: [
72
+ {
73
+ label: translate("Effect"),
74
+ value: translation.effect,
75
+ },
76
+ {
77
+ label: translate("Range"),
78
+ value: range !== translation.range ? `***${range}*** (${translation.range})` : range,
79
+ },
80
+ {
81
+ label: translate("Duration"),
82
+ value: duration !== translation.duration
83
+ ? `***${duration}*** (${translation.duration})`
84
+ : duration,
85
+ },
86
+ renderTargetCategory(entry.target).run(env),
87
+ ],
70
88
  },
71
- {
72
- label: translate("Duration"),
73
- value: duration !== translation.duration
74
- ? `***${duration}*** (${translation.duration})`
75
- : duration,
76
- },
77
- getTargetCategoryTranslation(getTargetCategoryById, locale, entry.target),
78
89
  ],
90
+ errata: translation.errata,
79
91
  references: entry.src,
80
92
  };
81
93
  });
82
94
  /**
83
95
  * Get a JSON representation of the rules text for a liturgical chant.
84
96
  */
85
- export const getLiturgicalChantEntityDescription = createEntityDescriptionCreator(({ getAttributeById, getSpirit, getToughness, getSkillModificationLevelById, getTargetCategoryById, getBlessedTraditionById, getAspectById, }, locale, entry) => {
97
+ export const getLiturgicalChantEntityDescription = createEntityDescriptionCreator(({ getInstanceById, getChildInstancesForInstanceId, idMap }, locale, { content: entry, entity, id }) => {
86
98
  const { translate, translateMap, compare: localeCompare } = locale;
87
99
  const translation = translateMap(entry.translations);
88
100
  if (translation === undefined) {
89
101
  return undefined;
90
102
  }
91
- const { castingTime, cost, range, duration } = (() => {
92
- switch (entry.parameters.tag) {
93
- case "OneTime":
94
- return getFastOneTimePerformanceParametersTranslations(getSkillModificationLevelById, locale, Entity.LiturgicalChant, ResponsiveTextSize.Full, entry.parameters.one_time);
95
- case "Sustained":
96
- return getFastSustainedPerformanceParametersTranslations(getSkillModificationLevelById, locale, Entity.LiturgicalChant, ResponsiveTextSize.Full, entry.parameters.sustained);
97
- default:
98
- return assertExhaustive(entry.parameters);
99
- }
100
- })();
103
+ const env = {
104
+ translate,
105
+ translateMap,
106
+ getInstanceById,
107
+ getChildInstancesForInstanceId,
108
+ localeJoin: locale.join,
109
+ localeCompare: locale.compare,
110
+ energyUnit: "KarmaPoints",
111
+ responsiveTextSize: ResponsiveTextSize.Full,
112
+ nonModifiableSuffix: (param) => {
113
+ switch (param) {
114
+ case ModifiableParameter.CastingTime:
115
+ return " (you cannot use a modification on this chant’s liturgical time)";
116
+ case ModifiableParameter.Cost:
117
+ return " (you cannot use a modification on this chant’s cost)";
118
+ case ModifiableParameter.Range:
119
+ return " (you cannot use a modification on this chant’s range)";
120
+ default:
121
+ return assertExhaustive(param);
122
+ }
123
+ },
124
+ };
125
+ const { castingTime, cost, range, duration } = renderFastPerformanceParameters(entry.parameters).run(env);
101
126
  return {
102
127
  title: translation.name,
103
128
  className: "liturgical-chant",
104
129
  body: [
105
- getTextForCheck({ translate, translateMap, getAttributeById }, entry.check, {
106
- value: entry.check_penalty,
107
- responsiveText: ResponsiveTextSize.Full,
108
- getSpirit,
109
- getToughness,
110
- }),
111
- ...getTextForEffect(locale, translation.effect),
112
- {
113
- label: translate("Liturgical Time"),
114
- value: castingTime !== translation.casting_time.full
115
- ? `***${castingTime}*** (${translation.casting_time.full})`
116
- : castingTime,
117
- },
118
- {
119
- label: translate("KP Cost"),
120
- value: cost !== translation.cost.full
121
- ? `***${cost}*** (${translation.cost.full})`
122
- : cost,
123
- },
124
130
  {
125
- label: translate("Range"),
126
- value: range !== translation.range.full
127
- ? `***${range}*** (${translation.range.full})`
128
- : range,
131
+ type: "definitionList",
132
+ items: [
133
+ renderSkillCheckWithPenalty(entry.check, entry.check_penalty, idMap).run(env),
134
+ renderEffect(translation.effect).run(env),
135
+ {
136
+ label: translate("Liturgical Time"),
137
+ value: translation.casting_time && castingTime !== translation.casting_time.full
138
+ ? `***${castingTime}*** (${translation.casting_time.full})`
139
+ : castingTime,
140
+ },
141
+ {
142
+ label: translate("KP Cost"),
143
+ value: translation.cost && cost !== translation.cost.full
144
+ ? `***${cost}*** (${translation.cost.full})`
145
+ : cost,
146
+ },
147
+ {
148
+ label: translate("Range"),
149
+ value: translation.range && range !== translation.range.full
150
+ ? `***${range}*** (${translation.range.full})`
151
+ : range,
152
+ },
153
+ {
154
+ label: translate("Duration"),
155
+ value: translation.duration && duration !== translation.duration.full
156
+ ? `***${duration}*** (${translation.duration.full})`
157
+ : duration,
158
+ },
159
+ renderTargetCategory(entry.target).run(env),
160
+ getTextForTraditions({
161
+ translate,
162
+ translateMap,
163
+ localeCompare,
164
+ getInstanceById,
165
+ }, entry.traditions),
166
+ renderImprovementCost(entry.improvement_cost).run(env),
167
+ ],
129
168
  },
130
- {
131
- label: translate("Duration"),
132
- value: duration !== translation.duration.full
133
- ? `***${duration}*** (${translation.duration.full})`
134
- : duration,
135
- },
136
- getTargetCategoryTranslation(getTargetCategoryById, locale, entry.target),
137
- getTextForTraditions({
138
- translate,
139
- translateMap,
140
- localeCompare,
141
- getBlessedTraditionById,
142
- getAspectById,
143
- }, entry.traditions),
144
- createImprovementCost(translate, entry.improvement_cost),
169
+ renderEnhancements(Case(entity, id), entry.improvement_cost).run(env),
145
170
  ],
171
+ errata: translation.errata,
146
172
  references: entry.src,
147
173
  };
148
174
  });
149
175
  /**
150
176
  * Get a JSON representation of the rules text for a ceremony.
151
177
  */
152
- export const getCeremonyEntityDescription = createEntityDescriptionCreator(({ getAttributeById, getSpirit, getToughness, getSkillModificationLevelById, getTargetCategoryById, getBlessedTraditionById, getAspectById, }, locale, entry) => {
178
+ export const getCeremonyEntityDescription = createEntityDescriptionCreator(({ getInstanceById, getChildInstancesForInstanceId, idMap }, locale, { content: entry, entity, id }) => {
153
179
  const { translate, translateMap, compare: localeCompare } = locale;
154
180
  const translation = translateMap(entry.translations);
155
181
  if (translation === undefined) {
156
182
  return undefined;
157
183
  }
158
- const { castingTime, cost, range, duration } = (() => {
159
- switch (entry.parameters.tag) {
160
- case "OneTime":
161
- return getSlowOneTimePerformanceParametersTranslations(getSkillModificationLevelById, locale, Entity.Ritual, ResponsiveTextSize.Full, entry.parameters.one_time);
162
- case "Sustained":
163
- return getSlowSustainedPerformanceParametersTranslations(getSkillModificationLevelById, locale, Entity.Ceremony, ResponsiveTextSize.Full, entry.parameters.sustained);
164
- default:
165
- return assertExhaustive(entry.parameters);
166
- }
167
- })();
184
+ const env = {
185
+ translate,
186
+ translateMap,
187
+ getInstanceById,
188
+ getChildInstancesForInstanceId,
189
+ localeJoin: locale.join,
190
+ localeCompare: locale.compare,
191
+ energyUnit: "KarmaPoints",
192
+ responsiveTextSize: ResponsiveTextSize.Full,
193
+ nonModifiableSuffix: (param) => {
194
+ switch (param) {
195
+ case ModifiableParameter.CastingTime:
196
+ return " (you cannot use a modification on this ceremony’s ceremonial time)";
197
+ case ModifiableParameter.Cost:
198
+ return " (you cannot use a modification on this ceremony’s cost)";
199
+ case ModifiableParameter.Range:
200
+ return " (you cannot use a modification on this ceremony’s range)";
201
+ default:
202
+ return assertExhaustive(param);
203
+ }
204
+ },
205
+ };
206
+ const { castingTime, cost, range, duration } = renderSlowPerformanceParameters(entry.parameters).run(env);
168
207
  return {
169
208
  title: translation.name,
170
209
  className: "ceremony",
171
210
  body: [
172
- getTextForCheck({ translate, translateMap, getAttributeById }, entry.check, {
173
- value: entry.check_penalty,
174
- responsiveText: ResponsiveTextSize.Full,
175
- getSpirit,
176
- getToughness,
177
- }),
178
- ...getTextForEffect(locale, translation.effect),
179
- {
180
- label: translate("Ceremonial Time"),
181
- value: castingTime !== translation.casting_time.full
182
- ? `***${castingTime}*** (${translation.casting_time.full})`
183
- : castingTime,
184
- },
185
- {
186
- label: translate("KP Cost"),
187
- value: cost !== translation.cost.full
188
- ? `***${cost}*** (${translation.cost.full})`
189
- : cost,
190
- },
191
- {
192
- label: translate("Range"),
193
- value: range !== translation.range.full
194
- ? `***${range}*** (${translation.range.full})`
195
- : range,
196
- },
197
211
  {
198
- label: translate("Duration"),
199
- value: duration !== translation.duration.full
200
- ? `***${duration}*** (${translation.duration.full})`
201
- : duration,
212
+ type: "definitionList",
213
+ items: [
214
+ renderSkillCheckWithPenalty(entry.check, entry.check_penalty, idMap).run(env),
215
+ renderEffect(translation.effect).run(env),
216
+ {
217
+ label: translate("Ceremonial Time"),
218
+ value: translation.casting_time && castingTime !== translation.casting_time.full
219
+ ? `***${castingTime}*** (${translation.casting_time.full})`
220
+ : castingTime,
221
+ },
222
+ {
223
+ label: translate("KP Cost"),
224
+ value: translation.cost && cost !== translation.cost.full
225
+ ? `***${cost}*** (${translation.cost.full})`
226
+ : cost,
227
+ },
228
+ {
229
+ label: translate("Range"),
230
+ value: translation.range && range !== translation.range.full
231
+ ? `***${range}*** (${translation.range.full})`
232
+ : range,
233
+ },
234
+ {
235
+ label: translate("Duration"),
236
+ value: translation.duration && duration !== translation.duration.full
237
+ ? `***${duration}*** (${translation.duration.full})`
238
+ : duration,
239
+ },
240
+ renderTargetCategory(entry.target).run(env),
241
+ getTextForTraditions({
242
+ translate,
243
+ translateMap,
244
+ localeCompare,
245
+ getInstanceById,
246
+ }, entry.traditions),
247
+ renderImprovementCost(entry.improvement_cost).run(env),
248
+ ],
202
249
  },
203
- getTargetCategoryTranslation(getTargetCategoryById, locale, entry.target),
204
- getTextForTraditions({
205
- translate,
206
- translateMap,
207
- localeCompare,
208
- getBlessedTraditionById,
209
- getAspectById,
210
- }, entry.traditions),
211
- createImprovementCost(translate, entry.improvement_cost),
250
+ renderEnhancements(Case(entity, id), entry.improvement_cost).run(env),
212
251
  ],
252
+ errata: translation.errata,
213
253
  references: entry.src,
214
254
  };
215
255
  });
@@ -1,5 +1,6 @@
1
- import { OptionalRule } from "optolith-database-schema/types/rule/OptionalRule";
2
1
  /**
3
2
  * Get a JSON representation of the rules text for an optional rule.
4
3
  */
5
- export declare const getOptionalRuleEntityDescription: import("../index.js").EntityDescriptionCreator<OptionalRule | undefined, object, import("../index.js").EntityDescription>;
4
+ export declare const getOptionalRuleEntityDescription: import("../creator.js").EntityDescriptionCreator<"OptionalRule", {
5
+ getInstanceById: import("../helpers/getTypes.js").GetInstanceById<"Publication">;
6
+ }, import("../index.js").EntityDescription>;
@@ -1,8 +1,8 @@
1
- import { createEntityDescriptionCreator } from "../index.js";
1
+ import { createEntityDescriptionCreator } from "../creator.js";
2
2
  /**
3
3
  * Get a JSON representation of the rules text for an optional rule.
4
4
  */
5
- export const getOptionalRuleEntityDescription = createEntityDescriptionCreator((_, { translateMap }, entry) => {
5
+ export const getOptionalRuleEntityDescription = createEntityDescriptionCreator((_, { translateMap }, { content: entry }) => {
6
6
  const translation = translateMap(entry.translations);
7
7
  if (translation === undefined) {
8
8
  return undefined;
@@ -10,7 +10,8 @@ export const getOptionalRuleEntityDescription = createEntityDescriptionCreator((
10
10
  return {
11
11
  title: translation.name,
12
12
  className: "optional-rule",
13
- body: [{ value: translation.description }],
13
+ body: [{ type: "plain", text: translation.description }],
14
+ errata: translation.errata,
14
15
  references: entry.src,
15
16
  };
16
17
  });
@@ -0,0 +1,58 @@
1
+ import type { ActivatableIdentifier, ActivatableNameBuilderRules, RequirableSelectOptionIdentifier } from "optolith-database-schema/gen";
2
+ import type { LocaleMap, Translate, TranslateMap } from "../../helpers/translate.js";
3
+ import type { GetResolvedSelectOptionById } from "./prerequisites/single/activatable.js";
4
+ /**
5
+ * Returns the full name of the activatable entry as well as its components.
6
+ */
7
+ export type ActivatableNameComponents = {
8
+ id: ActivatableIdentifier;
9
+ base: ActivatableNameChunk;
10
+ options: ActivatableNameChunk | [ActivatableNameChunk, ActivatableNameChunk] | undefined;
11
+ level: number | undefined;
12
+ nameBuilderRules: Required<ActivatableNameBuilderRules>;
13
+ };
14
+ /**
15
+ * Returns the full name of the activatable entry as well as its components.
16
+ */
17
+ export type CombinedActivatableNameComponents = {
18
+ id: ActivatableIdentifier;
19
+ base: ActivatableNameChunk;
20
+ options: (ActivatableNameChunk | [ActivatableNameChunk, ActivatableNameChunk])[];
21
+ level: number | undefined;
22
+ nameBuilderRules: Required<ActivatableNameBuilderRules>;
23
+ };
24
+ /**
25
+ * A part of the name, which can be a locale map, a string for all locales or a
26
+ * function returning a string.
27
+ */
28
+ export type ActivatableNameChunk = LocaleMap<string> | string | ((translateMap: TranslateMap) => string);
29
+ /**
30
+ * This can be used to render an activatable entry with a selectable level, as it splits the text where the level should be inserted.
31
+ */
32
+ export declare const renderActivatableNameComponentsWithoutLevel: (translateMap: TranslateMap, components: ActivatableNameComponents) => [beforeLevel: string, afterLevel?: string];
33
+ /**
34
+ * Renders the name components of an activatable entry.
35
+ */
36
+ export declare const renderActivatableNameComponents: (translateMap: TranslateMap, components: ActivatableNameComponents, formatAsPrerequisite: boolean) => string;
37
+ /**
38
+ * Combines multiple name components into a single one when all values except for options are the same, joining options according to the passed function.
39
+ *
40
+ * Returns `undefined` if the components cannot be combined.
41
+ */
42
+ export declare const combineNameComponents: (elements: ActivatableNameComponents[]) => CombinedActivatableNameComponents | undefined;
43
+ /**
44
+ * Renders the name components of an activatable entry, combining multiple options into one string.
45
+ */
46
+ export declare const renderCombinedActivatableNameComponents: (translateMap: TranslateMap, components: CombinedActivatableNameComponents, formatAsPrerequisite: boolean, join?: (list: string[]) => string) => string;
47
+ /**
48
+ * Renders the name components of multiple activatable entries.
49
+ */
50
+ export declare const renderMultipleStandaloneActivatableNameComponents: (translateMap: TranslateMap, components: ActivatableNameComponents[], formatAsPrerequisite: boolean, join?: (list: string[]) => string) => string;
51
+ /**
52
+ * Renders the name components of multiple activatable entries, combining parts if possible.
53
+ */
54
+ export declare const renderActivatableNameComponentsCombinedIfPossible: (translateMap: TranslateMap, components: ActivatableNameComponents[], formatAsPrerequisite: boolean, join?: (list: string[]) => string) => string;
55
+ /**
56
+ * Gets the name components for an activatable entry.
57
+ */
58
+ export declare const getNameComponents: <T>(translate: Translate, id: ActivatableIdentifier, options: RequirableSelectOptionIdentifier[] | undefined, level: number | undefined, nameBuilderRules: ActivatableNameBuilderRules | undefined, translations: LocaleMap<T>, getBaseName: (translation: T) => string, getResolvedSelectOptionById: GetResolvedSelectOptionById, displayedInProfession: boolean) => ActivatableNameComponents;