diff --git a/assets/icons/actors/character.webp b/assets/icons/actors/character.webp new file mode 100644 index 0000000..4a8ff2b Binary files /dev/null and b/assets/icons/actors/character.webp differ diff --git a/assets/icons/actors/npc.webp b/assets/icons/actors/npc.webp new file mode 100644 index 0000000..318a7a3 Binary files /dev/null and b/assets/icons/actors/npc.webp differ diff --git a/assets/icons/actors/zeppelin.webp b/assets/icons/actors/zeppelin.webp new file mode 100644 index 0000000..da993cc Binary files /dev/null and b/assets/icons/actors/zeppelin.webp differ diff --git a/assets/icons/border_token.webp b/assets/icons/border_token.webp new file mode 100644 index 0000000..7798d12 Binary files /dev/null and b/assets/icons/border_token.webp differ diff --git a/assets/icons/competence.webp b/assets/icons/competence.webp new file mode 100644 index 0000000..e9639b4 Binary files /dev/null and b/assets/icons/competence.webp differ diff --git a/assets/icons/contrecoup_cephalique2.webp b/assets/icons/contrecoup_cephalique2.webp new file mode 100644 index 0000000..51b14bc Binary files /dev/null and b/assets/icons/contrecoup_cephalique2.webp differ diff --git a/assets/icons/ecryme_title.png b/assets/icons/ecryme_title.png new file mode 100644 index 0000000..a78aaa1 Binary files /dev/null and b/assets/icons/ecryme_title.png differ diff --git a/assets/icons/ecryme_title2.webp b/assets/icons/ecryme_title2.webp new file mode 100644 index 0000000..1cd61c6 Binary files /dev/null and b/assets/icons/ecryme_title2.webp differ diff --git a/assets/icons/icon_ecryme.zip b/assets/icons/icon_ecryme.zip new file mode 100644 index 0000000..8f81c9b Binary files /dev/null and b/assets/icons/icon_ecryme.zip differ diff --git a/assets/icons/ideal.webp b/assets/icons/ideal.webp new file mode 100644 index 0000000..6ef6df9 Binary files /dev/null and b/assets/icons/ideal.webp differ diff --git a/assets/icons/impact.webp b/assets/icons/impact.webp new file mode 100644 index 0000000..81f860a Binary files /dev/null and b/assets/icons/impact.webp differ diff --git a/assets/icons/items/anence.webp b/assets/icons/items/anence.webp new file mode 100644 index 0000000..a8c6f28 Binary files /dev/null and b/assets/icons/items/anence.webp differ diff --git a/assets/icons/items/boheme.webp b/assets/icons/items/boheme.webp new file mode 100644 index 0000000..8983f34 Binary files /dev/null and b/assets/icons/items/boheme.webp differ diff --git a/assets/icons/items/contact.webp b/assets/icons/items/contact.webp new file mode 100644 index 0000000..21d0134 Binary files /dev/null and b/assets/icons/items/contact.webp differ diff --git a/assets/icons/items/impact.webp b/assets/icons/items/impact.webp new file mode 100644 index 0000000..dbafd35 Binary files /dev/null and b/assets/icons/items/impact.webp differ diff --git a/assets/icons/items/item.webp b/assets/icons/items/item.webp new file mode 100644 index 0000000..855e998 Binary files /dev/null and b/assets/icons/items/item.webp differ diff --git a/assets/icons/items/scar.webp b/assets/icons/items/scar.webp new file mode 100644 index 0000000..dbafd35 Binary files /dev/null and b/assets/icons/items/scar.webp differ diff --git a/assets/icons/items/specialization.webp b/assets/icons/items/specialization.webp new file mode 100644 index 0000000..d409f0e Binary files /dev/null and b/assets/icons/items/specialization.webp differ diff --git a/assets/icons/items/trait.webp b/assets/icons/items/trait.webp new file mode 100644 index 0000000..ad0e6d8 Binary files /dev/null and b/assets/icons/items/trait.webp differ diff --git a/assets/icons/items/weapon.webp b/assets/icons/items/weapon.webp new file mode 100644 index 0000000..d3fa2c7 Binary files /dev/null and b/assets/icons/items/weapon.webp differ diff --git a/assets/icons/protection.webp b/assets/icons/protection.webp new file mode 100644 index 0000000..c4f3eec Binary files /dev/null and b/assets/icons/protection.webp differ diff --git a/assets/icons/spleen.webp b/assets/icons/spleen.webp new file mode 100644 index 0000000..cdeebae Binary files /dev/null and b/assets/icons/spleen.webp differ diff --git a/lang/en.json b/lang/en.json index 619cf5b..ca2dd23 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1,4 +1,16 @@ { + "SETTINGS": { + "world": { + "game_mode": { + "name":"Choix du mode de jeu", + "hint":"À l’image de certains jeux vidéo proposant différents, Vermine 2047 permet aux joueurs de choisir leur Mode de jeu et de fixer eux-mêmes le degré de réalisme, de surnaturel et de dangerosité de l’univers." + }, + "first_run": { + "name":"Affichage du tour d'accueil", + "hint":"Pour aider les débutantEs à bien commencer avec le système Vermine 2047." + } + } + }, "VERMINE.WorldSettings.GameMode.Name":"Choix du mode de jeu", "VERMINE.WorldSettings.GameMode.Hint":"À l’image de certains jeux vidéo proposant différents, Vermine 2047 permet aux joueurs de choisir leur Mode de jeu et de fixer eux-mêmes le degré de réalisme, de surnaturel et de dangerosité de l’univers.", "GAME_MODES": { @@ -8,6 +20,26 @@ }, "VERMINE.roll_tool": "Lanceur de dés", "VERMINE.roll_dice": "Jeter les dés", + "TOURS": { + "ChatMessage": "
Si vous utilisez ce système pour la première fois, notre shaman va vous guider vers votre rite d'initiation
", + "Welcome": { + "Title": "Bienvenue dans Vermine", + "Description": "Aperçu du système Vermine", + "WelcomeTitle": "Bienvenue", + "WelcomeContent": "Bienvenue dans Vermine, survivantE ! Faire le tour de notre zone d'action te permettre de retrouver tes marques, même si c'est ton premier jour parmi nous.
En haut de la colonne de droite, tu as tout ce que tu as le droit de faire chez nous : parler, voir les autres tronches de ta commu, gérer ton matos et celui de tes potes, étudier les cartes, lire les journaux des clamsés, aller nous chercher de la bouffe à coups de surin. Entrons dans le vif du sujet.
", + "ActorTabTitle": "Peupler son univers", + "ActorTabContent": "Bien installéE, survivantE ? Tournons pas au tour du pot, si tu veux rester avec nous, va falloir nous dire qui tu es, d'où tu viens, et à qui tu fais confiance. Une fois que t'es prêtE pour ca, clique donc sur le bouton \"Créer un acteur\"
", + "CharacterCreateTitle": "Créer un groupe", + "CharacterCreateContent": "Ce bouton crée une fiche de groupe, parce que c'est par là qu'on commence, dans ce trou ! Ta tronche viendra ensuite, quand tu créeras ta fiche de personnage. Au fur et à mesure que tu progresses, tu voudras peut-être rajouter des infos sur ce que tu vois trainer autour du camp.
", + "CompendiumTitle": "Cartes", + "CompendiumContent": "Vous aurez probablement besoin d'une carte des Terres de Fer ou d'un secteur de la Forge. Vous pouvez créer votre propre scène pour cela, ou vous pouvez utiliser l'une des nôtres. Ouvrez l'un de ces compendiums et faites glisser une carte dans votre zone de scènes (l'onglet qui ressemble à une carte pliée).
", + "OracleToolTitle": "Totem", + "OracleToolContent": "Aucune partie d'Vermine ou Starforged ne serait complète sans oracles. Ce bouton fera apparaître une fenêtre avec tous les oracles du jeu choisi. Les oracles sont également disponibles depuis la fiche de personnage.
", + "ToursTitle": "Prochaines étapes", + "ToursContent": "Tu t'en sors pas si mal ! Moi je vais te laisser là, mais si tu as d'autres questions, tu peux venir me trouver. Si ca concerne la mécanique, inscris-toi dans notre groupe de parole, par là Totem Foundry Discord. Sinon, tu peux rejoindre la place centrale par ici Vermine Discord
Enjoy!
" + } + }, + "IDENTITY": { "name": "Nom", "height": "Taille", @@ -25,6 +57,7 @@ "notes": "Notes" }, "VERMINE": { + "name": "Vermine", "stats": "Statistiques", "level": "Niveau", "experience": "Expérience", @@ -73,7 +106,11 @@ "information": "Informations", "boost": "boost", "group_abilities": "Capacités de groupe", - "totem_abilities": "Capacités de totem" + "totem_abilities": "Capacités de totem", + "type_group": "Groupe", + "type_character": "Personnage", + "type_npc": "PNJ", + "type_creature": "Créature" }, "ITEMS": { "defense": "Protection", diff --git a/module/sheets/character-sheet.mjs b/module/sheets/character-sheet.mjs index 84f9f8c..759b1ff 100644 --- a/module/sheets/character-sheet.mjs +++ b/module/sheets/character-sheet.mjs @@ -156,9 +156,6 @@ export class VermineCharacterSheet extends VermineActorSheet { // Active Effect management html.find(".effect-control").click(ev => onManageActiveEffect(ev, this.actor)); - // test print dice - // html.find(".skill").change(ev => this.printSkillLevels(ev, this.actor)); - // Rollable abilities. html.find('.rollable').click(this._onRoll.bind(this)); @@ -173,17 +170,6 @@ export class VermineCharacterSheet extends VermineActorSheet { } } - /*printSkillLevels(event){ - const newLevel = event.target.value; - const levelData = CONFIG.VERMINE.SkillLevels[newLevel] || null; - if (levelData != null){ - console.log(/*levelData.dicePool, levelData.reroll, game.i18n.localize(levelData.label), * /$(event.target).parent().find('.die.pool').get(0), $(event.target).parent().find('.die.reroll').get(0)); - $(event.target).parent().find('.die.pool').text(levelData.dicePool); - $(event.target).parent().find('.die.reroll').text(levelData.reroll); - } - - } */ - /** * Handle creating a new Owned Item for the actor using initial data defined in the HTML dataset * @param {Event} event The originating click event diff --git a/module/system/hooks.mjs b/module/system/hooks.mjs index 28442e7..de31efa 100644 --- a/module/system/hooks.mjs +++ b/module/system/hooks.mjs @@ -1,3 +1,4 @@ +import { registerTours } from "./tour.mjs"; export const registerHooks = function () { /** @@ -6,6 +7,7 @@ export const registerHooks = function () { Hooks.once("ready", async () => { console.info("Vermine 2047 | System Initialized."); + await registerTours(); }); // changement de la pause @@ -58,7 +60,7 @@ export const registerHooks = function () { Hooks.on("preCreateItem", function (item) { if (item.img == "icons/svg/item-bag.svg") { - item.updateSource({"img": `systems/vermine2047/icons/items/${item.type}.webp`}); + item.updateSource({"img": `systems/vermine2047/assets/icons/items/${item.type}.webp`}); // item.updateSource({"img": `systems/vermine2047/icons/competence.webp`}); } }); diff --git a/module/system/settings.mjs b/module/system/settings.mjs index 2773fbd..dd781fd 100644 --- a/module/system/settings.mjs +++ b/module/system/settings.mjs @@ -1,7 +1,7 @@ export const registerSettings = function () { game.settings.register("vermine2047", "game-mode", { - name: game.i18n.localize("VERMINE.WorldSettings.GameMode.Name"), - hint: game.i18n.localize("VERMINE.WorldSettings.GameMode.Hint"), + name: game.i18n.localize("SETTINGS.world.game_mode.name"), + hint: game.i18n.localize("SETTINGS.world.game_mode.hint"), scope: "system", config: true, type: String, @@ -15,4 +15,13 @@ export const registerSettings = function () { // console.log(value); } }); + + game.settings.register("vermine2047", "first-run-tips-shown", { + name: game.i18n.localize("SETTINGS.world.first_run.name"), + hint: game.i18n.localize("SETTINGS.world.first_run.hint"), + scope: "system", + config: true, + type: Boolean, + default: false + }); } \ No newline at end of file diff --git a/module/system/tour.mjs b/module/system/tour.mjs new file mode 100644 index 0000000..af0f546 --- /dev/null +++ b/module/system/tour.mjs @@ -0,0 +1,157 @@ +function compact(array) { +var index2 = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; +while (++index2 < length) { + var value2 = array[index2]; + if (value2) { + result[resIndex++] = value2; + } +} +return result; +} +class CreateActorDialog extends FormApplication { + constructor() { + super({}); + } + async _updateObject() { + } + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + title: game.i18n.format("DOCUMENT.Create", { + type: game.i18n.localize("DOCUMENT.Actor") + }), + template: "systems/vermine2047/templates/actor/create.hbs", + id: "new-actor-dialog", + resizable: false, + classes: ["vermine2047", "sheet", "new-actor"], + width: 650, + height: 200 + }); + } + getData(_options) { + return { + // sfenabled: IronswornSettings.starforgedToolsEnabled + }; + } + activateListeners(html) { + super.activateListeners(html); + html.find(".vermine__character__create").on("click", async (ev) => { + await this._characterCreate.call(this, ev); + }); + html.find(".vermine__shared__create").on("click", async (ev) => { + await this._sharedCreate.call(this, ev); + }); + html.find(".vermine__site__create").on("click", async (ev) => { + await this._siteCreate.call(this, ev); + }); + html.find(".vermine__foe__create").on("click", async (ev) => { + await this._foeCreate.call(this, ev); + }); + } +} +class VermineTour extends Tour { + /** @override */ + async _preStep() { + var _a2, _b, _c, _d, _e; + await super._preStep(); + if ((_a2 = this.currentStep) == null ? void 0 : _a2.sidebarTab) { + await ((_b = ui.sidebar) == null ? void 0 : _b.activateTab(this.currentStep.sidebarTab)); + } + if ((_c = this.currentStep) == null ? void 0 : _c.layer) { + const layer = canvas == null ? void 0 : canvas[this.currentStep.layer]; + if (layer.active && this.currentStep.tool) + (_d = ui.controls) == null ? void 0 : _d.initialize({ tool: this.currentStep.tool }); + else + layer.activate({ tool: this.currentStep.tool }); + } + if (((_e = this.currentStep) == null ? void 0 : _e.hook) != null) { + await this.currentStep.hook(); + } + } +} + +class WelcomeTour extends VermineTour { + constructor() { + super({ + title: "TOURS.Welcome.Title", + description: "TOURS.Welcome.Description", + canBeResumed: false, + display: true, + steps: [] + }); + } + get steps() { + var _a2; + return compact([ + { + id: "welcome", + title: "TOURS.Welcome.WelcomeTitle", + content: "TOURS.Welcome.WelcomeContent" + }, + { + id: "character-tab", + title: "TOURS.Welcome.ActorTabTitle", + content: "TOURS.Welcome.ActorTabContent", + sidebarTab: "actors", + selector: "#actors .create-document" + }, + { + id: "character-create", + title: "TOURS.Welcome.CharacterCreateTitle", + content: "TOURS.Welcome.CharacterCreateContent", + hook: async () => { + this.createActorDialog = new CreateActorDialog(); + await this.createActorDialog.render(true); + await new Promise((r) => setTimeout(r, 100)); + }, + selector: "#new-actor-dialog #new-group" + }, + /*{ + id: "compendia", + title: "TOURS.Welcome.CompendiumTitle", + content: "TOURS.Welcome.CompendiumContent", + hook: async () => { + var _a3; + return await ((_a3 = this.createActorDialog) == null ? void 0 : _a3.close()); + }, + sidebarTab: "compendium", + selector: 'li[data-pack="vermine2047.verminescenes"]' + },*/ + /*((_a2 = game.user) == null ? void 0 : _a2.viewedScene) && { + id: "oracletool", + title: "TOURS.Welcome.OracleToolTitle", + content: "TOURS.Welcome.OracleToolContent", + layer: "tokens", + selector: '[data-tool="Oracles"]' + },*/ + { + id: "tours", + title: "TOURS.Welcome.ToursTitle", + content: "TOURS.Welcome.ToursContent", + hook: async () => { + var _a3; + return await ((_a3 = this.createActorDialog) == null ? void 0 : _a3.close()); + }, + sidebarTab: "settings", + selector: 'button[data-action="tours"]' + } + ]); + } + } + export async function registerTours() { + game.tours.register("vermine2047", "welcome", new WelcomeTour()); + $(document).on("click", "#chat-log #vermine-tour-chat-button", (el) => { + const tour = game.tours.get("vermine2047.welcome"); + tour == null ? void 0 : tour.start(); + }); + if (game.settings.get("vermine2047", "first-run-tips-shown")) + return; + console.log("Posting first-start messages..."); + const gms = ChatMessage.getWhisperRecipients("GM"); + ChatMessage.implementation; + ChatMessage.create({ + whisper: gms, + speaker: { alias: game.i18n.localize("VERMINE.name") }, + content: game.i18n.localize("TOURS.ChatMessage") + }); + game.settings.set("vermine2047", "first-run-tips-shown", true); + } \ No newline at end of file diff --git a/system.json b/system.json index 75bb2ee..0ecb056 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "vermine2047", "title": "Vermine 2047", "description": "The Vermine 2047 system for FoundryVTT!", - "version": "0.0.15", + "version": "0.0.16", "compatibility": { "minimum": 10, "verified": "10.287", diff --git a/templates/actor/create.hbs b/templates/actor/create.hbs new file mode 100644 index 0000000..ca11643 --- /dev/null +++ b/templates/actor/create.hbs @@ -0,0 +1,28 @@ +{{#*inline "createBox"}} +