Rename loot and equipment
This commit is contained in:
parent
dacce1b29d
commit
343a888b68
13 changed files with 267 additions and 128 deletions
|
@ -134,8 +134,8 @@ export class DS4Actor extends Actor<DS4ActorData, DS4Item> {
|
|||
"weapon",
|
||||
"armor",
|
||||
"shield",
|
||||
"trinket",
|
||||
"equipment",
|
||||
"loot",
|
||||
"spell",
|
||||
"talent",
|
||||
"racialAbility",
|
||||
|
@ -143,7 +143,7 @@ export class DS4Actor extends Actor<DS4ActorData, DS4Item> {
|
|||
"alphabet",
|
||||
];
|
||||
case "creature":
|
||||
return ["weapon", "armor", "shield", "trinket", "equipment", "spell", "specialCreatureAbility"];
|
||||
return ["weapon", "armor", "shield", "equipment", "loot", "spell", "specialCreatureAbility"];
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
|
|
|
@ -44,8 +44,8 @@ export const DS4 = {
|
|||
armor: "DS4.ItemTypeArmor",
|
||||
shield: "DS4.ItemTypeShield",
|
||||
spell: "DS4.ItemTypeSpell",
|
||||
trinket: "DS4.ItemTypeTrinket",
|
||||
equipment: "DS4.ItemTypeEquipment",
|
||||
loot: "DS4.ItemTypeLoot",
|
||||
talent: "DS4.ItemTypeTalent",
|
||||
racialAbility: "DS4.ItemTypeRacialAbility",
|
||||
language: "DS4.ItemTypeLanguage",
|
||||
|
|
|
@ -8,8 +8,8 @@ export type DS4ItemData =
|
|||
| DS4ArmorData
|
||||
| DS4ShieldData
|
||||
| DS4SpellData
|
||||
| DS4TrinketData
|
||||
| DS4EquipmentData
|
||||
| DS4LootData
|
||||
| DS4TalentData
|
||||
| DS4RacialAbilityData
|
||||
| DS4LanguageData
|
||||
|
@ -24,8 +24,8 @@ type DS4WeaponData = DS4ItemDataHelper<DS4WeaponDataData, "weapon">;
|
|||
type DS4ArmorData = DS4ItemDataHelper<DS4ArmorDataData, "armor">;
|
||||
type DS4ShieldData = DS4ItemDataHelper<DS4ShieldDataData, "shield">;
|
||||
type DS4SpellData = DS4ItemDataHelper<DS4SpellDataData, "spell">;
|
||||
type DS4TrinketData = DS4ItemDataHelper<DS4TrinketDataData, "trinket">;
|
||||
type DS4EquipmentData = DS4ItemDataHelper<DS4EquipmentDataData, "equipment">;
|
||||
type DS4LootData = DS4ItemDataHelper<DS4LootDataData, "loot">;
|
||||
type DS4TalentData = DS4ItemDataHelper<DS4TalentDataData, "talent">;
|
||||
type DS4RacialAbilityData = DS4ItemDataHelper<DS4RacialAbilityDataData, "racialAbility">;
|
||||
type DS4LanguageData = DS4ItemDataHelper<DS4LanguageDataData, "language">;
|
||||
|
@ -80,8 +80,8 @@ interface DS4ShieldDataData
|
|||
DS4ItemDataDataPhysical,
|
||||
DS4ItemDataDataEquipable,
|
||||
DS4ItemDataDataProtective {}
|
||||
interface DS4TrinketDataData extends DS4ItemDataDataBase, DS4ItemDataDataPhysical, DS4ItemDataDataEquipable {}
|
||||
interface DS4EquipmentDataData extends DS4ItemDataDataBase, DS4ItemDataDataPhysical {}
|
||||
interface DS4EquipmentDataData extends DS4ItemDataDataBase, DS4ItemDataDataPhysical, DS4ItemDataDataEquipable {}
|
||||
interface DS4LootDataData extends DS4ItemDataDataBase, DS4ItemDataDataPhysical {}
|
||||
type DS4RacialAbilityDataData = DS4ItemDataDataBase;
|
||||
type DS4LanguageDataData = DS4ItemDataDataBase;
|
||||
type DS4AlphabetDataData = DS4ItemDataDataBase;
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
import { migrate as migrate001 } from "./migrations/001";
|
||||
import { migrate as migrate002 } from "./migrations/002";
|
||||
import notifications from "./ui/notifications";
|
||||
|
||||
async function migrate(): Promise<void> {
|
||||
if (!game.user?.isGM) {
|
||||
|
@ -25,7 +27,7 @@ async function migrateFromTo(oldMigrationVersion: number, targetMigrationVersion
|
|||
const migrationsToExecute = migrations.slice(oldMigrationVersion, targetMigrationVersion);
|
||||
|
||||
if (migrationsToExecute.length > 0) {
|
||||
ui.notifications?.info(
|
||||
notifications.info(
|
||||
game.i18n.format("DS4.InfoSystemUpdateStart", {
|
||||
currentVersion: oldMigrationVersion,
|
||||
targetVersion: targetMigrationVersion,
|
||||
|
@ -40,7 +42,7 @@ async function migrateFromTo(oldMigrationVersion: number, targetMigrationVersion
|
|||
await migration();
|
||||
game.settings.set("ds4", "systemMigrationVersion", currentMigrationVersion);
|
||||
} catch (err) {
|
||||
ui.notifications?.error(
|
||||
notifications.error(
|
||||
game.i18n.format("DS4.ErrorDuringMigration", {
|
||||
currentVersion: oldMigrationVersion,
|
||||
targetVersion: targetMigrationVersion,
|
||||
|
@ -54,7 +56,7 @@ async function migrateFromTo(oldMigrationVersion: number, targetMigrationVersion
|
|||
}
|
||||
}
|
||||
|
||||
ui.notifications?.info(
|
||||
notifications.info(
|
||||
game.i18n.format("DS4.InfoSystemUpdateCompleted", {
|
||||
currentVersion: oldMigrationVersion,
|
||||
targetVersion: targetMigrationVersion,
|
||||
|
@ -68,7 +70,7 @@ function getTargetMigrationVersion(): number {
|
|||
return migrations.length;
|
||||
}
|
||||
|
||||
const migrations: Array<() => Promise<void>> = [migrate001];
|
||||
const migrations: Array<() => Promise<void>> = [migrate001, migrate002];
|
||||
|
||||
function isFirstWorldStart(migrationVersion: number): boolean {
|
||||
return migrationVersion < 0;
|
||||
|
|
137
src/module/migrations/002.ts
Normal file
137
src/module/migrations/002.ts
Normal file
|
@ -0,0 +1,137 @@
|
|||
export async function migrate(): Promise<void> {
|
||||
await migrateItems();
|
||||
await migrateActors();
|
||||
await migrateScenes();
|
||||
await migrateCompendiums();
|
||||
}
|
||||
|
||||
async function migrateItems() {
|
||||
for (const item of game.items?.entities ?? []) {
|
||||
try {
|
||||
const updateData = getItemUpdateData(item._data);
|
||||
if (updateData) {
|
||||
console.log(`Migrating Item entity ${item.name} (${item.id})`);
|
||||
await item.update(updateData), { enforceTypes: false };
|
||||
}
|
||||
} catch (err) {
|
||||
err.message = `Error during migration of Item entity ${item.name} (${item.id}), continuing anyways.`;
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getItemUpdateData(itemData: DeepPartial<Item.Data>) {
|
||||
if (!["equipment", "trinket"].includes(itemData.type ?? "")) return undefined;
|
||||
return { type: itemData.type === "equipment" ? "loot" : "equipment" };
|
||||
}
|
||||
|
||||
async function migrateActors() {
|
||||
for (const actor of game.actors?.entities ?? []) {
|
||||
try {
|
||||
const updateData = getActorUpdateData(actor._data);
|
||||
if (updateData) {
|
||||
console.log(`Migrating Actor entity ${actor.name} (${actor.id})`);
|
||||
await actor.update(updateData, { enforceTypes: false });
|
||||
}
|
||||
} catch (err) {
|
||||
err.message = `Error during migration of Actor entity ${actor.name} (${actor.id}), continuing anyways.`;
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getActorUpdateData(actorData: DeepPartial<Actor.Data>) {
|
||||
let hasItemUpdates = false;
|
||||
const items = actorData.items?.map((itemData) => {
|
||||
const update = itemData ? getItemUpdateData(itemData) : undefined;
|
||||
if (update) {
|
||||
hasItemUpdates = true;
|
||||
return { ...itemData, ...update };
|
||||
} else {
|
||||
return itemData;
|
||||
}
|
||||
});
|
||||
return hasItemUpdates ? { items } : undefined;
|
||||
}
|
||||
|
||||
async function migrateScenes() {
|
||||
for (const scene of game.scenes?.entities ?? []) {
|
||||
try {
|
||||
const updateData = getSceneUpdateData(scene._data);
|
||||
if (updateData) {
|
||||
console.log(`Migrating Scene entity ${scene.name} (${scene.id})`);
|
||||
await scene.update(updateData, { enforceTypes: false });
|
||||
}
|
||||
} catch (err) {
|
||||
err.message = `Error during migration of Scene entity ${scene.name} (${scene.id}), continuing anyways.`;
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getSceneUpdateData(sceneData: Scene.Data) {
|
||||
let hasTokenUpdates = false;
|
||||
const tokens = sceneData.tokens.map((tokenData) => {
|
||||
if (!tokenData.actorId || tokenData.actorLink || tokenData.actorData.data) {
|
||||
tokenData.actorData = {};
|
||||
hasTokenUpdates = true;
|
||||
return tokenData;
|
||||
}
|
||||
const token = new Token(tokenData);
|
||||
if (!token.actor) {
|
||||
tokenData.actorId = (null as unknown) as string;
|
||||
tokenData.actorData = {};
|
||||
hasTokenUpdates = true;
|
||||
} else if (!tokenData.actorLink) {
|
||||
const actorUpdateData = getActorUpdateData(token.data.actorData);
|
||||
tokenData.actorData = mergeObject(token.data.actorData, actorUpdateData);
|
||||
hasTokenUpdates = true;
|
||||
}
|
||||
return tokenData;
|
||||
});
|
||||
if (!hasTokenUpdates) return undefined;
|
||||
return hasTokenUpdates ? { tokens } : undefined;
|
||||
}
|
||||
|
||||
async function migrateCompendiums() {
|
||||
for (const compendium of game.packs ?? []) {
|
||||
if (compendium.metadata.package !== "world") continue;
|
||||
if (!["Actor", "Item", "Scene"].includes(compendium.metadata.entity)) continue;
|
||||
await migrateCompendium(compendium);
|
||||
}
|
||||
}
|
||||
|
||||
async function migrateCompendium(compendium: Compendium) {
|
||||
const entityName = compendium.metadata.entity;
|
||||
if (!["Actor", "Item", "Scene"].includes(entityName)) return;
|
||||
const wasLocked = compendium.locked;
|
||||
await compendium.configure({ locked: false });
|
||||
|
||||
await compendium.migrate({});
|
||||
const content = await compendium.getContent();
|
||||
|
||||
for (const entity of content) {
|
||||
try {
|
||||
const getUpdateData = (entity: Entity) => {
|
||||
switch (entityName) {
|
||||
case "Item":
|
||||
return getItemUpdateData(entity._data);
|
||||
case "Actor":
|
||||
return getActorUpdateData(entity._data);
|
||||
case "Scene":
|
||||
return getSceneUpdateData(entity._data as Scene.Data);
|
||||
}
|
||||
};
|
||||
const updateData = getUpdateData(entity);
|
||||
if (updateData) {
|
||||
console.log(`Migrating entity ${entity.name} (${entity.id}) in compendium ${compendium.collection}`);
|
||||
await compendium.updateEntity({ ...updateData, _id: entity._id });
|
||||
}
|
||||
} catch (err) {
|
||||
err.message = `Error during migration of entity ${entity.name} (${entity.id}) in compendium ${compendium.collection}, continuing anyways.`;
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
|
||||
await compendium.configure({ locked: wasLocked });
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue