diff --git a/initialization.js b/initialization.js new file mode 100644 index 0000000..420282d --- /dev/null +++ b/initialization.js @@ -0,0 +1,223 @@ +Hooks.on("init", () => { + game.settings.register("wfrp4e-night-of-blood", "initialized", { + name: "Initialization", + scope: "world", + config: false, + default: false, + type: Boolean + }); + + game.settings.registerMenu("wfrp4e-night-of-blood", "init-dialog", { + name: "WFRP4e Night of Blood Initialization", + label : "Initialize", + hint : "This will import content for the WFRP4e adventure Night of Blood Module", + type : WFRP4eNightOfBloodWrapper, + restricted: true + }) +}) + +Hooks.on("ready", () => { + if (!game.settings.get("wfrp4e-night-of-blood", "initialized") && game.user.isGM) + { + new WFRP4eNightOfBloodInitialization().render(true) + } +}) + + +class WFRP4eNightOfBloodWrapper extends FormApplication { + render() { + new WFRP4eNightOfBloodInitialization().render(true); + } +} + +class WFRP4eNightOfBloodInitialization extends Dialog{ + constructor() + { + super({ + title: "WFRP4e Night of Blood Initialization", + content: `

Initialize WFRP4e Night of Blood Content Module?

This will import all Journals and Scenes into your world, sort them into folders, and place map pins

+ `, + + buttons: { + initialize: { + label : "Initialize", + callback : async () => { + game.settings.set("wfrp4e-night-of-blood", "initialized", true) + await new WFRP4eNightOfBloodInitialization().initialize() + ui.notifications.notify("Initialization Complete") + } + }, + no: { + label : "No", + callback : () => { + game.settings.set("wfrp4e-night-of-blood", "initialized", true) + ui.notifications.notify("Skipped Initialization.") + } + } + } + }) + + this.folders = { + "Scene" : {}, + "Item" : {}, + "Actor" : {}, + "JournalEntry" : {} + } + this.SceneFolders = {}; + this.ActorFolders = {}; + this.ItemFolders = {}; + this.JournalEntryFolders = {}; + this.journals = {}; + this.scenes = {}; + this.moduleKey = "wfrp4e-night-of-blood" + } + + async initialize() { + return new Promise((resolve) => { + fetch(`modules/${this.moduleKey}/initialization.json`).then(async r => r.json()).then(async json => { + let createdFolders = await Folder.create(json) + for (let folder of createdFolders) + this.folders[folder.data.type][folder.data.name] = folder; + + for (let folderType in this.folders) { + for (let folder in this.folders[folderType]) { + + let parent = this.folders[folderType][folder].getFlag(this.moduleKey, "initialization-parent") + if (parent) { + let parentId = this.folders[folderType][parent].data._id + await this.folders[folderType][folder].update({ parent: parentId }) + } + } + } + + await this.initializeEntities() + await this.initializeScenes() + resolve() + }) + }) + } + + async initializeEntities() { + + let packList= [ `${this.moduleKey}.night-of-blood-actors`, + `${this.moduleKey}.night-of-blood-scenes`, + `${this.moduleKey}.night-of-blood-journal`] + + for( let pack of packList) + { + let content = await game.packs.get(pack).getContent(); + for (let entity of content) + { + let folder = entity.getFlag(this.moduleKey, "initialization-folder") + if (folder) + entity.data.folder = this.folders[entity.entity][folder].data._id; + } + switch(content[0].entity) + { + case "Actor": + ui.notifications.notify("Initializing Actors") + await Actor.create(content.map(c => c.data)) + break; + case "Item": + ui.notifications.notify("Initializing Items") + await Item.create(content.map(c => c.data)) + break; + case "JournalEntry" : + ui.notifications.notify("Initializing Journals") + let createdEntries = await JournalEntry.create(content.map(c => c.data)) + if (!createdEntries.length) + break + for (let entry of createdEntries) + this.journals[entry.data.name] = entry + break; + } + } + } + + async initializeScenes() { + ui.notifications.notify("Initializing Scenes") + let m = game.packs.get(`${this.moduleKey}.night-of-blood-scenes`) + let maps = await m.getContent() + for (let map of maps) + { + let folder = map.getFlag(this.moduleKey, "initialization-folder") + if (folder) + map.data.folder = this.folders["Scene"][folder].data._id; + + let journalName = map.getFlag(this.moduleKey, "scene-note") + if (journalName) + map.data.journal = game.journal.getName(journalName).data._id; + + map.data.notes.forEach(n => { + try { + n.entryId = this.journals[getProperty(n, `flags.${this.moduleKey}.initialization-entryName`)].data._id + } + catch (e) { + console.log("wfrp4e | INITIALIZATION ERROR: " + e) + } + }) + } + await Scene.create(maps.map(m => m.data)).then(sceneArray => { + sceneArray.forEach(async s => { + let thumb = await s.createThumbnail(); + s.update({"thumb" : thumb.thumb}) + }) + }) + } +} + + +class WFRP4eNightOfBloodInitializationSetup { + + static async setup() + { + WFRP4eNightOfBloodInitializationSetup.displayFolders() + WFRP4eNightOfBloodInitializationSetup.setFolderFlags() + WFRP4eNightOfBloodInitializationSetup.setEmbeddedEntities() + } + + static async displayFolders() { + let array = []; + game.folders.entities.forEach(async f => { + if (f.data.parent) + await f.setFlag("wfrp4e-night-of-blood", "initialization-parent", game.folders.get(f.data.parent).data.name) + }) + game.folders.entities.forEach(f => { + array.push(f.data) + }) + console.log(JSON.stringify(array)) + } + + static async setFolderFlags() { + for (let scene of game.scenes.entities) + await scene.setFlag("wfrp4e-night-of-blood", "initialization-folder", game.folders.get(scene.data.folder).data.name) + for (let actor of game.actors.entities) + await actor.setFlag("wfrp4e-night-of-blood", "initialization-folder", game.folders.get(actor.data.folder).data.name) + for (let item of game.items.entities) + await item.setFlag("wfrp4e-night-of-blood", "initialization-folder", game.folders.get(item.data.folder).data.name) + for (let journal of game.journal.entities) + await journal.setFlag("wfrp4e-night-of-blood", "initialization-folder", game.folders.get(journal.data.folder).data.name) + + WFRP4eNightOfBloodInitializationSetup.setSceneNotes(); + } + + static async setSceneNotes() { + for (let scene of game.scenes.entities) + if (scene.data.journal) + await scene.setFlag("wfrp4e-night-of-blood", "scene-note", game.journal.get(scene.data.journal).data.name) + } + + static async setEmbeddedEntities() { + for (let scene of game.scenes.entities) + { + let notes = duplicate(scene.data.notes) + for (let note of notes) + { + setProperty(note, "flags.wfrp4e-night-of-blood.initialization-entryName", game.journal.get(note.entryId).data.name) + } + await scene.update({notes : notes}) + } + } + + +} \ No newline at end of file diff --git a/module.json b/module.json index 8290433..802f02e 100644 --- a/module.json +++ b/module.json @@ -2,12 +2,15 @@ "name": "wfrp4e-night-of-blood", "title": "Night of Blood (WFRP 4e)", "description": "The classic Warhammer Fantasy Roleplay adventure, perfect for introducing new players", - "version": "1.0", + "version": "1.0.1", "author": "Stu", "systems": ["wfrp4e"], "styles": [ "./styles.css" ], + "scripts": [ + "initialization.js" + ], "packs": [ { "name": "NightOfBloodActors",