optolith-database-schema 0.16.3 → 0.16.4
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.
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [0.16.4](https://github.com/elyukai/optolith-database-schema/compare/v0.16.3...v0.16.4) (2024-01-21)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* magical and blessed advantages and disadvantages identifier cache ([4dc6e3d](https://github.com/elyukai/optolith-database-schema/commit/4dc6e3dec721019af728db6b68138498da4b1775))
|
|
11
|
+
|
|
5
12
|
### [0.16.3](https://github.com/elyukai/optolith-database-schema/compare/v0.16.2...v0.16.3) (2024-01-18)
|
|
6
13
|
|
|
7
14
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CacheConfig } from "../cacheConfig.js";
|
|
2
|
+
export type MagicalAndBlessedAdvantagesAndDisadvantagesCache = {
|
|
3
|
+
advantages: {
|
|
4
|
+
magical: {
|
|
5
|
+
ids: number[];
|
|
6
|
+
};
|
|
7
|
+
blessed: {
|
|
8
|
+
ids: number[];
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
disadvantages: {
|
|
12
|
+
magical: {
|
|
13
|
+
ids: number[];
|
|
14
|
+
};
|
|
15
|
+
blessed: {
|
|
16
|
+
ids: number[];
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export declare const config: CacheConfig<MagicalAndBlessedAdvantagesAndDisadvantagesCache>;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { assertExhaustive } from "../helpers/typeSafety.js";
|
|
2
|
+
const BLESSED_ID = 12;
|
|
3
|
+
const SPELLCASTER_ID = 47;
|
|
4
|
+
const getAdvantageId = (type) => {
|
|
5
|
+
switch (type) {
|
|
6
|
+
case "Magical":
|
|
7
|
+
return SPELLCASTER_ID;
|
|
8
|
+
case "Blessed":
|
|
9
|
+
return BLESSED_ID;
|
|
10
|
+
default:
|
|
11
|
+
return assertExhaustive(type);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
const isRatedFor = (type, ratedId) => {
|
|
15
|
+
switch (ratedId.tag) {
|
|
16
|
+
case "Spell":
|
|
17
|
+
case "Ritual":
|
|
18
|
+
return type === "Magical";
|
|
19
|
+
case "LiturgicalChant":
|
|
20
|
+
case "Ceremony":
|
|
21
|
+
return type === "Blessed";
|
|
22
|
+
case "Attribute":
|
|
23
|
+
case "Skill":
|
|
24
|
+
case "CloseCombatTechnique":
|
|
25
|
+
case "RangedCombatTechnique":
|
|
26
|
+
return false;
|
|
27
|
+
default:
|
|
28
|
+
return assertExhaustive(ratedId);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const isPrerequisiteFor = (type, prerequisite, getById, traversedIds) => {
|
|
32
|
+
switch (prerequisite.tag) {
|
|
33
|
+
case "Activatable": {
|
|
34
|
+
if (prerequisite.activatable.id.tag === "Advantage" &&
|
|
35
|
+
prerequisite.activatable.id.advantage === getAdvantageId(type) &&
|
|
36
|
+
prerequisite.activatable.active) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
const entry = getById(prerequisite.activatable.id);
|
|
40
|
+
return entry !== undefined && is(type, entry, getById, traversedIds);
|
|
41
|
+
}
|
|
42
|
+
case "Rated":
|
|
43
|
+
return isRatedFor(type, prerequisite.rated.id);
|
|
44
|
+
case "CommonSuggestedByRCP":
|
|
45
|
+
case "Sex":
|
|
46
|
+
case "Race":
|
|
47
|
+
case "Culture":
|
|
48
|
+
case "Pact":
|
|
49
|
+
case "SocialStatus":
|
|
50
|
+
case "State":
|
|
51
|
+
case "Rule":
|
|
52
|
+
case "PrimaryAttribute":
|
|
53
|
+
case "BlessedTradition":
|
|
54
|
+
case "MagicalTradition":
|
|
55
|
+
case "RatedMinimumNumber":
|
|
56
|
+
case "RatedSum":
|
|
57
|
+
case "ExternalEnhancement":
|
|
58
|
+
case "Text":
|
|
59
|
+
case "NoOtherAncestorBloodAdvantage":
|
|
60
|
+
case "SexualCharacteristic":
|
|
61
|
+
return false;
|
|
62
|
+
default:
|
|
63
|
+
return assertExhaustive(prerequisite);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const is = (type, entry, getById, traversedIds) => {
|
|
67
|
+
if (!entry.prerequisites || traversedIds.includes(entry.id)) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
const newTraversedIds = [...traversedIds, entry.id];
|
|
71
|
+
return (entry.prerequisites !== undefined &&
|
|
72
|
+
entry.prerequisites.some(prerequisite => {
|
|
73
|
+
switch (prerequisite.prerequisite.tag) {
|
|
74
|
+
case "Single":
|
|
75
|
+
return isPrerequisiteFor(type, prerequisite.prerequisite.single, getById, newTraversedIds);
|
|
76
|
+
case "Disjunction":
|
|
77
|
+
return prerequisite.prerequisite.disjunction.list.some(p => isPrerequisiteFor(type, p, getById, newTraversedIds));
|
|
78
|
+
case "Group":
|
|
79
|
+
return prerequisite.prerequisite.group.list.some(p => isPrerequisiteFor(type, p, getById, newTraversedIds));
|
|
80
|
+
default:
|
|
81
|
+
return assertExhaustive(prerequisite.prerequisite);
|
|
82
|
+
}
|
|
83
|
+
}));
|
|
84
|
+
};
|
|
85
|
+
export const config = {
|
|
86
|
+
builder(database) {
|
|
87
|
+
const getActivatableById = (id) => {
|
|
88
|
+
// prettier-ignore
|
|
89
|
+
switch (id.tag) {
|
|
90
|
+
case "AdvancedCombatSpecialAbility": return database.advancedCombatSpecialAbilities.find(([entryId]) => entryId === id.advanced_combat_special_ability)?.[1];
|
|
91
|
+
case "AdvancedKarmaSpecialAbility": return database.advancedKarmaSpecialAbilities.find(([entryId]) => entryId === id.advanced_karma_special_ability)?.[1];
|
|
92
|
+
case "AdvancedMagicalSpecialAbility": return database.advancedMagicalSpecialAbilities.find(([entryId]) => entryId === id.advanced_magical_special_ability)?.[1];
|
|
93
|
+
case "AdvancedSkillSpecialAbility": return database.advancedSkillSpecialAbilities.find(([entryId]) => entryId === id.advanced_skill_special_ability)?.[1];
|
|
94
|
+
case "Advantage": return database.advantages.find(([entryId]) => entryId === id.advantage)?.[1];
|
|
95
|
+
case "AncestorGlyph": return database.ancestorGlyphs.find(([entryId]) => entryId === id.ancestor_glyph)?.[1];
|
|
96
|
+
case "ArcaneOrbEnchantment": return database.arcaneOrbEnchantments.find(([entryId]) => entryId === id.arcane_orb_enchantment)?.[1];
|
|
97
|
+
case "AttireEnchantment": return database.attireEnchantments.find(([entryId]) => entryId === id.attire_enchantment)?.[1];
|
|
98
|
+
case "BlessedTradition": return database.blessedTraditions.find(([entryId]) => entryId === id.blessed_tradition)?.[1];
|
|
99
|
+
case "BowlEnchantment": return database.bowlEnchantments.find(([entryId]) => entryId === id.bowl_enchantment)?.[1];
|
|
100
|
+
case "BrawlingSpecialAbility": return database.brawlingSpecialAbilities.find(([entryId]) => entryId === id.brawling_special_ability)?.[1];
|
|
101
|
+
case "CauldronEnchantment": return database.cauldronEnchantments.find(([entryId]) => entryId === id.cauldron_enchantment)?.[1];
|
|
102
|
+
case "CeremonialItemSpecialAbility": return database.ceremonialItemSpecialAbilities.find(([entryId]) => entryId === id.ceremonial_item_special_ability)?.[1];
|
|
103
|
+
case "ChronicleEnchantment": return database.chronicleEnchantments.find(([entryId]) => entryId === id.chronicle_enchantment)?.[1];
|
|
104
|
+
case "CombatSpecialAbility": return database.combatSpecialAbilities.find(([entryId]) => entryId === id.combat_special_ability)?.[1];
|
|
105
|
+
case "CombatStyleSpecialAbility": return database.combatStyleSpecialAbilities.find(([entryId]) => entryId === id.combat_style_special_ability)?.[1];
|
|
106
|
+
case "CommandSpecialAbility": return database.commandSpecialAbilities.find(([entryId]) => entryId === id.command_special_ability)?.[1];
|
|
107
|
+
case "DaggerRitual": return database.daggerRituals.find(([entryId]) => entryId === id.dagger_ritual)?.[1];
|
|
108
|
+
case "Disadvantage": return database.disadvantages.find(([entryId]) => entryId === id.disadvantage)?.[1];
|
|
109
|
+
case "FamiliarSpecialAbility": return database.familiarSpecialAbilities.find(([entryId]) => entryId === id.familiar_special_ability)?.[1];
|
|
110
|
+
case "FatePointSexSpecialAbility": return database.fatePointSexSpecialAbilities.find(([entryId]) => entryId === id.fate_point_sex_special_ability)?.[1];
|
|
111
|
+
case "FatePointSpecialAbility": return database.fatePointSpecialAbilities.find(([entryId]) => entryId === id.fate_point_special_ability)?.[1];
|
|
112
|
+
case "FoolsHatEnchantment": return database.foolsHatEnchantments.find(([entryId]) => entryId === id.fools_hat_enchantment)?.[1];
|
|
113
|
+
case "GeneralSpecialAbility": return database.generalSpecialAbilities.find(([entryId]) => entryId === id.general_special_ability)?.[1];
|
|
114
|
+
case "InstrumentEnchantment": return database.instrumentEnchantments.find(([entryId]) => entryId === id.instrument_enchantment)?.[1];
|
|
115
|
+
case "KarmaSpecialAbility": return database.karmaSpecialAbilities.find(([entryId]) => entryId === id.karma_special_ability)?.[1];
|
|
116
|
+
case "Krallenkettenzauber": return database.krallenkettenzauber.find(([entryId]) => entryId === id.krallenkettenzauber)?.[1];
|
|
117
|
+
case "LiturgicalStyleSpecialAbility": return database.liturgicalStyleSpecialAbilities.find(([entryId]) => entryId === id.liturgical_style_special_ability)?.[1];
|
|
118
|
+
case "LycantropicGift": return database.lycantropicGifts.find(([entryId]) => entryId === id.lycantropic_gift)?.[1];
|
|
119
|
+
case "MagicalSpecialAbility": return database.magicalSpecialAbilities.find(([entryId]) => entryId === id.magical_special_ability)?.[1];
|
|
120
|
+
case "MagicalTradition": return database.magicalTraditions.find(([entryId]) => entryId === id.magical_tradition)?.[1];
|
|
121
|
+
case "MagicStyleSpecialAbility": return database.magicStyleSpecialAbilities.find(([entryId]) => entryId === id.magic_style_special_ability)?.[1];
|
|
122
|
+
case "OrbEnchantment": return database.orbEnchantments.find(([entryId]) => entryId === id.orb_enchantment)?.[1];
|
|
123
|
+
case "PactGift": return database.pactGifts.find(([entryId]) => entryId === id.pact_gift)?.[1];
|
|
124
|
+
case "ProtectiveWardingCircleSpecialAbility": return database.protectiveWardingCircleSpecialAbilities.find(([entryId]) => entryId === id.protective_warding_circle_special_ability)?.[1];
|
|
125
|
+
case "RingEnchantment": return database.ringEnchantments.find(([entryId]) => entryId === id.ring_enchantment)?.[1];
|
|
126
|
+
case "Sermon": return database.sermons.find(([entryId]) => entryId === id.sermon)?.[1];
|
|
127
|
+
case "SexSpecialAbility": return database.sexSpecialAbilities.find(([entryId]) => entryId === id.sex_special_ability)?.[1];
|
|
128
|
+
case "SickleRitual": return database.sickleRituals.find(([entryId]) => entryId === id.sickle_ritual)?.[1];
|
|
129
|
+
case "SikaryanDrainSpecialAbility": return database.sikaryanDrainSpecialAbilities.find(([entryId]) => entryId === id.sikaryan_drain_special_ability)?.[1];
|
|
130
|
+
case "SkillStyleSpecialAbility": return database.skillStyleSpecialAbilities.find(([entryId]) => entryId === id.skill_style_special_ability)?.[1];
|
|
131
|
+
case "SpellSwordEnchantment": return database.spellSwordEnchantments.find(([entryId]) => entryId === id.spell_sword_enchantment)?.[1];
|
|
132
|
+
case "StaffEnchantment": return database.staffEnchantments.find(([entryId]) => entryId === id.staff_enchantment)?.[1];
|
|
133
|
+
case "ToyEnchantment": return database.toyEnchantments.find(([entryId]) => entryId === id.toy_enchantment)?.[1];
|
|
134
|
+
case "Trinkhornzauber": return database.trinkhornzauber.find(([entryId]) => entryId === id.trinkhornzauber)?.[1];
|
|
135
|
+
case "VampiricGift": return database.vampiricGifts.find(([entryId]) => entryId === id.vampiric_gift)?.[1];
|
|
136
|
+
case "Vision": return database.visions.find(([entryId]) => entryId === id.vision)?.[1];
|
|
137
|
+
case "WandEnchantment": return database.wandEnchantments.find(([entryId]) => entryId === id.wand_enchantment)?.[1];
|
|
138
|
+
case "WeaponEnchantment": return database.weaponEnchantments.find(([entryId]) => entryId === id.weapon_enchantment)?.[1];
|
|
139
|
+
default:
|
|
140
|
+
return assertExhaustive(id);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
// prettier-ignore
|
|
144
|
+
return {
|
|
145
|
+
advantages: {
|
|
146
|
+
magical: {
|
|
147
|
+
ids: database.advantages.filter(([_, entry]) => is("Magical", entry, getActivatableById, [])).map(([id]) => id),
|
|
148
|
+
},
|
|
149
|
+
blessed: {
|
|
150
|
+
ids: database.advantages.filter(([_, entry]) => is("Blessed", entry, getActivatableById, [])).map(([id]) => id),
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
disadvantages: {
|
|
154
|
+
magical: {
|
|
155
|
+
ids: database.disadvantages.filter(([_, entry]) => is("Magical", entry, getActivatableById, [])).map(([id]) => id),
|
|
156
|
+
},
|
|
157
|
+
blessed: {
|
|
158
|
+
ids: database.disadvantages.filter(([_, entry]) => is("Blessed", entry, getActivatableById, [])).map(([id]) => id),
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
},
|
|
163
|
+
};
|
package/lib/config/cache.d.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import * as ActivatableSelectOptions from "../cache/activatableSelectOptions.js";
|
|
2
2
|
import * as AncestorBloodAdvantages from "../cache/ancestorBloodAdvantages.js";
|
|
3
|
+
import * as MagicalAndBlessedAdvantagesAndDisadvantages from "../cache/magicalAndBlessedAdvantagesAndDisadvantages.js";
|
|
3
4
|
import * as NewApplicationsAndUses from "../cache/newApplicationsAndUses.js";
|
|
4
5
|
export type CacheMap = {
|
|
5
6
|
activatableSelectOptions: ActivatableSelectOptions.ActivatableSelectOptionsCache;
|
|
6
7
|
ancestorBloodAdvantages: AncestorBloodAdvantages.AncestorBloodAdvantagesCache;
|
|
8
|
+
magicalAndBlessedAdvantagesAndDisadvantages: MagicalAndBlessedAdvantagesAndDisadvantages.MagicalAndBlessedAdvantagesAndDisadvantagesCache;
|
|
7
9
|
newApplicationsAndUses: NewApplicationsAndUses.NewApplicationsAndUsesCache;
|
|
8
10
|
};
|
|
9
11
|
export declare const cacheMap: {
|
|
10
12
|
activatableSelectOptions: import("../cacheConfig.js").CacheConfig<ActivatableSelectOptions.ActivatableSelectOptionsCache>;
|
|
11
13
|
ancestorBloodAdvantages: import("../cacheConfig.js").CacheConfig<AncestorBloodAdvantages.AncestorBloodAdvantagesCache>;
|
|
14
|
+
magicalAndBlessedAdvantagesAndDisadvantages: import("../cacheConfig.js").CacheConfig<MagicalAndBlessedAdvantagesAndDisadvantages.MagicalAndBlessedAdvantagesAndDisadvantagesCache>;
|
|
12
15
|
newApplicationsAndUses: import("../cacheConfig.js").CacheConfig<NewApplicationsAndUses.NewApplicationsAndUsesCache, [generatedSelectOptions: ActivatableSelectOptions.ActivatableSelectOptionsCache]>;
|
|
13
16
|
};
|
package/lib/config/cache.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import * as ActivatableSelectOptions from "../cache/activatableSelectOptions.js";
|
|
2
2
|
import * as AncestorBloodAdvantages from "../cache/ancestorBloodAdvantages.js";
|
|
3
|
+
import * as MagicalAndBlessedAdvantagesAndDisadvantages from "../cache/magicalAndBlessedAdvantagesAndDisadvantages.js";
|
|
3
4
|
import * as NewApplicationsAndUses from "../cache/newApplicationsAndUses.js";
|
|
4
5
|
export const cacheMap = {
|
|
5
6
|
activatableSelectOptions: ActivatableSelectOptions.config,
|
|
6
7
|
ancestorBloodAdvantages: AncestorBloodAdvantages.config,
|
|
8
|
+
magicalAndBlessedAdvantagesAndDisadvantages: MagicalAndBlessedAdvantagesAndDisadvantages.config,
|
|
7
9
|
newApplicationsAndUses: NewApplicationsAndUses.config,
|
|
8
10
|
};
|
package/lib/main.js
CHANGED
|
@@ -78,10 +78,12 @@ export const buildCache = async (cachePaths, validResults, options = {}) => {
|
|
|
78
78
|
const { pretty = false } = options;
|
|
79
79
|
const activatableSelectOptionsCache = cacheMap.activatableSelectOptions.builder(validResults);
|
|
80
80
|
const ancestorBloodAdvantagesCache = cacheMap.ancestorBloodAdvantages.builder(validResults);
|
|
81
|
+
const magicalAndBlessedAdvantagesAndDisadvantagesCache = cacheMap.magicalAndBlessedAdvantagesAndDisadvantages.builder(validResults);
|
|
81
82
|
const newApplicationsAndUsesCache = cacheMap.newApplicationsAndUses.builder(validResults, activatableSelectOptionsCache);
|
|
82
83
|
const cacheData = {
|
|
83
84
|
activatableSelectOptions: activatableSelectOptionsCache,
|
|
84
85
|
ancestorBloodAdvantages: ancestorBloodAdvantagesCache,
|
|
86
|
+
magicalAndBlessedAdvantagesAndDisadvantages: magicalAndBlessedAdvantagesAndDisadvantagesCache,
|
|
85
87
|
newApplicationsAndUses: newApplicationsAndUsesCache,
|
|
86
88
|
};
|
|
87
89
|
for (const [cacheName, cachePath] of Object.entries(cachePaths)) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "optolith-database-schema",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.4",
|
|
4
4
|
"description": "Definitions and utilities for the flat-file database of Optolith, a character creation tool for the Pen and Paper RPG “The Dark Eye 5”, and its external integrations into other software.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"tde",
|