Compare commits

...

5 Commits

Author SHA1 Message Date
b2219c0f81 Annence/Boheme 2023-08-08 14:54:39 +02:00
61a1a4a904 Annence/Boheme 2023-08-08 09:08:11 +02:00
06ef98bed9 Manage compendiusm 2023-07-29 09:44:29 +02:00
b0834469a1 Ajout maneuver 2023-07-27 15:36:14 +02:00
166f3367fb Fix rolls 2023-07-21 21:21:17 +02:00
46 changed files with 1969 additions and 36 deletions

View File

@ -4,9 +4,11 @@
"Personnage": "PC"
},
"Item": {
"Trait": "Trait",
"Weapon": "Weapon",
"Equipment": "Equipment"
"trait": "Trait",
"weapon": "Weapon",
"equipment": "Equipment",
"maneuver": "Maneuver",
"specialization": "Specialization"
}
},
"ECRY": {
@ -30,6 +32,18 @@
"bonusmalustraits": "Traits Bonus/Malus",
"spectranscend": "Self-Transcend : "
},
"rule": {
"cephaly-success-2": "Duration : 1 scene - Impact : Superficial - Bonus : 1 - Elegy : 1",
"cephaly-success-4": "Duration : 1 week - Impact : Light - Bonus : 2 - Elegy : 2",
"cephaly-success-6": "Duration : 1 month - Impact : Serious - Bonus : 3 - Elegy : 3",
"cephaly-success-8": "Duration : 1 year - Impact : Major - Bonus : 4 - Elegy : 4",
"cephaly-success-10": "Duration : Permanent - Impact : Dead - Bonus : 5 - Elegy : 5",
"cephaly-failure-2": "Duration : 1 scene - Impact : Superficial - Malus : 1",
"cephaly-failure-4": "Duration : 1 week - Impact : Light - Malus : 2",
"cephaly-failure-6": "Duration : 1 month - Impact : Serious - Malus : 3",
"cephaly-failure-8": "Duration : 1 year - Impact : Major - Malus : 4",
"cephaly-failure-10": "Duration : Permanent - Impact : Death/Madness - Malus : 5"
},
"warn": {
"notenoughdice": "Execution and Preservation must have 2 dices allocated"
},
@ -45,7 +59,7 @@
"goldcoin": "Gold coin",
"lige": "Lige",
"hurle": "Howl",
"coin": "Coin",
"coin": "Penny",
"notes": "Notes",
"bio": "Bio",
"bionotes": "Bio&Notes",
@ -129,7 +143,20 @@
"entelechy": "Entelechy",
"mekany": "Mekany",
"psyche": "Psyche",
"scoria": "Scoria"
"scoria": "Scoria",
"cephalydifficulty": "Set Cephaly difficulty",
"maneuvers": "Maneuvers",
"annency": "Annency",
"iscollective": "Collective",
"ismultiple": "Multiple",
"description": "Description",
"location": "Location",
"characters": "Characters",
"enhancements": "Enhancements",
"oniricform": "Oniric shape (Boheme)",
"ideals": "Ideals",
"politic": "Political ideal",
"boheme": "Boheme"
}
}
}

View File

@ -4,9 +4,11 @@
"Personnage": "PJ"
},
"Item": {
"Trait": "Trait",
"Weapon": "Arme",
"Equipment": "Equipement"
"trait": "Trait",
"weapon": "Arme",
"equipment": "Equipement",
"maneuver": "Manoeuvre",
"specialization": "Spécialisation"
}
},
"ECRY": {
@ -30,6 +32,19 @@
"bonusmalustraits": "Bonus/Malus des Traits",
"spectranscend": "Dépassement de soi : "
},
"rule": {
"cephaly-success-12": "Durée : 1 scène - Impact : Superficiel - Bonus : 1 - Elegie : 1",
"cephaly-success-34": "Durée : 1 semaine - Impact : Léger - Bonus : 2 - Elegie : 2",
"cephaly-success-56": "Durée : 1 mois - Impact : Grave - Bonus : 3 - Elegie : 3",
"cephaly-success-78": "Durée : 1 année - Impact : Majeur - Bonus : 4 - Elegie : 4",
"cephaly-success-910": "Durée : Permanent - Impact : Mort - Bonus : 5 - Elegie : 5",
"cephaly-failure-2": "Durée : 1 scène - Impact : Superficiel - Malus : 1 - Symptôme non visible et sans gravité - Altération bégigne difficilement repérable",
"cephaly-failure-4": "Durée : 1 semaine - Impact : Léger - Malus : 2 - Symptôme visible non incapacitant - Altération repérable",
"cephaly-failure-6": "Durée : 1 mois - Impact : Grave - Malus : 3 - Symptôme incapacitant - Altération repérable et fâcheuse",
"cephaly-failure-8": "Durée : 1 année - Impact : Majeur - Malus : 4 - Symptôme très incapacitant - Altération dangereuse",
"cephaly-failure-10": "Durée : Permanent - Impact : Mort/Folie - Malus : 5 - Symptôme spectaculaire et repoussant - Altération dangereuse globalement"
},
"warn": {
"notenoughdice": "L'Accomplissement et la Préservation doivent avoir 2 dés chacun"
},
@ -129,7 +144,20 @@
"entelechy": "Entéléchie",
"mekany": "Mekanë",
"psyche": "Psyché",
"scoria": "Scorie"
"scoria": "Scorie",
"cephalydifficulty": "Difficulté de la Céphalie",
"maneuvers": "Manoeuvres",
"annency": "Anence",
"iscollective": "Collective",
"ismultiple": "Multiple",
"description": "Description",
"location": "Lieu",
"characters": "Personnages",
"enhancements": "Améliorations",
"oniricform": "Forme Onorique (Bohême)",
"ideals": "Idéaux",
"politic": "Idéaux politiques",
"boheme": "Bohême"
}
}
}

View File

@ -43,12 +43,16 @@ export class EcrymeActorSheet extends ActorSheet {
impacts: this.object.getImpacts(),
config: duplicate(game.system.ecryme.config),
weapons: this.actor.getWeapons(),
maneuvers: this.actor.getManeuvers(),
impactsMalus: this.actor.getImpactsMalus(),
archetype: duplicate(this.actor.getArchetype()),
equipements: this.actor.getEquipments(),
hasCephaly: EcrymeUtility.hasCephaly(),
hasBoheme: EcrymeUtility.hasBoheme(),
hasAmertume: EcrymeUtility.hasAmertume(),
cephalySkills: this.actor.getCephalySkills(),
subActors: duplicate(this.actor.getSubActors()),
annency: this.actor.getAnnency(),
description: await TextEditor.enrichHTML(this.object.system.description, { async: true }),
notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }),
equipementlibre: await TextEditor.enrichHTML(this.object.system.equipementlibre, { async: true }),
@ -76,6 +80,12 @@ export class EcrymeActorSheet extends ActorSheet {
if (e.keyCode === 13) return false;
});
html.find('.open-annency').click(ev => {
let actorId = $(ev.currentTarget).data("annency-id")
const actor = game.actors.get(actorId)
actor.sheet.render(true)
})
// Update Inventory Item
html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item")

View File

@ -68,6 +68,31 @@ export class EcrymeActor extends Actor {
return comp;
}
/* -------------------------------------------- */
buildAnnencyActorList() {
let membersFull = {}
for(let id of this.system.base.characters) {
let actor = game.actors.get(id)
membersFull[id] = { name: actor.name, id: actor.id, img: actor.img }
}
return membersFull
}
/* ----------------------- --------------------- */
addAnnencyActor(actorId) {
let members = duplicate(this.system.base.characters)
members.push(actorId)
this.update({ 'system.base.characters': members })
}
async removeAnnencyActor(actorId) {
let members = this.system.base.characters.filter(id => id != actorId)
this.update({ 'system.base.characters': members })
}
/* -------------------------------------------- */
getAnnency() {
return game.actors.find(a => a.type == 'annency' && a.system.base.characters.includes(this.id))
}
/* -------------------------------------------- */
getConfrontations() {
return this.items.filter(it => it.type == "confrontation")
@ -124,6 +149,11 @@ export class EcrymeActor extends Actor {
EcrymeUtility.sortArrayObjectsByName(comp)
return comp;
}
getManeuvers() {
let comp = duplicate(this.items.filter(item => item.type == 'maneuver') || [])
EcrymeUtility.sortArrayObjectsByName(comp)
return comp;
}
/* -------------------------------------------- */
getItemById(id) {
let item = this.items.find(item => item.id == id);
@ -393,11 +423,13 @@ export class EcrymeActor extends Actor {
rollData.title = game.i18n.localize("ECRY.ui.cephaly") + " : " + game.i18n.localize(rollData.skill.name)
rollData.executionTotal = rollData.skill.value
rollData.preservationTotal = rollData.skill.value
rollData.traitsBonus = duplicate(rollData.traits)
rollData.traitsMalus = duplicate(rollData.traits)
rollData.applyTranscendence = "execution"
let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData)
confrontStartDialog.render(true)
}
/* -------------------------------------------- */
async rollWeaponConfront(weaponId) {
let weapon = this.items.get(weaponId)

View File

@ -0,0 +1,143 @@
/**
* Extend the basic ActorSheet with some very simple modifications
* @extends {ActorSheet}
*/
import { EcrymeUtility } from "../common/ecryme-utility.js";
/* -------------------------------------------- */
export class EcrymeAnnencySheet extends ActorSheet {
/** @override */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
classes: ["fvtt-ecryme", "sheet", "actor"],
template: "systems/fvtt-ecryme/templates/actors/annency-sheet.hbs",
width: 640,
height: 600,
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "annency" }],
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
editScore: true
});
}
/* -------------------------------------------- */
async getData() {
let formData = {
title: this.title,
id: this.actor.id,
type: this.actor.type,
img: this.actor.img,
name: this.actor.name,
editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked",
system: duplicate(this.object.system),
limited: this.object.limited,
config: duplicate(game.system.ecryme.config),
hasCephaly: EcrymeUtility.hasCephaly(),
hasBoheme: EcrymeUtility.hasBoheme(),
hasAmertume: EcrymeUtility.hasAmertume(),
characters: this.actor.buildAnnencyActorList(),
options: this.options,
owner: this.document.isOwner,
editScore: this.options.editScore,
isGM: game.user.isGM
}
this.formData = formData;
console.log("Annency : ", formData, this.object);
return formData;
}
/* -------------------------------------------- */
/** @override */
activateListeners(html) {
super.activateListeners(html);
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) return;
html.bind("keydown", function (e) { // Ignore Enter in actores sheet
if (e.keyCode === 13) return false;
});
html.find('.actor-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item")
let actorId = li.data("actor-id")
const actor = game.actors.get(actorId)
actor.sheet.render(true)
})
html.find('.actor-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item")
let actorId = li.data("actor-id")
this.actor.removeAnnencyActor(actorId)
})
// Update Inventory Item
html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item")
let itemId = li.data("item-id")
const item = this.actor.items.get(itemId);
item.sheet.render(true);
});
// Delete Inventory Item
html.find('.item-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item")
EcrymeUtility.confirmDelete(this, li).catch("Error : No deletion confirmed")
})
html.find('.item-add').click(ev => {
let dataType = $(ev.currentTarget).data("type")
this.actor.createEmbeddedDocuments('Item', [{ name: "NewItem", type: dataType }], { renderSheet: true })
})
html.find('.subactor-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item");
let actorId = li.data("actor-id");
let actor = game.actors.get(actorId);
actor.sheet.render(true);
});
html.find('.subactor-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item");
let actorId = li.data("actor-id");
this.actor.delSubActor(actorId);
});
html.find('.update-field').change(ev => {
const fieldName = $(ev.currentTarget).data("field-name");
let value = Number(ev.currentTarget.value);
this.actor.update({ [`${fieldName}`]: value });
});
}
/* -------------------------------------------- */
async _onDropActor(event, dragData) {
const actor = fromUuidSync(dragData.uuid)
if (actor) {
this.actor.addAnnencyActor(actor.id)
} else {
ui.notifications.warn("Actor not found")
}
super._onDropActor(event)
}
/* -------------------------------------------- */
/** @override */
setPosition(options = {}) {
const position = super.setPosition(options);
const sheetBody = this.element.find(".sheet-body");
const bodyHeight = position.height - 192;
sheetBody.css("height", bodyHeight);
return position;
}
/* -------------------------------------------- */
/** @override */
_updateObject(event, formData) {
// Update the Actor
return this.object.update(formData);
}
}

View File

@ -4,7 +4,32 @@ import { EcrymeCommands } from "../app/ecryme-commands.js";
/* -------------------------------------------- */
const __maxImpacts = { superficial: 4, light: 3, serious: 2, major: 1 }
const __nextImpacts = { superficial: "light", light: "serious", serious: "major", major: "major" }
const __effect2Impact= [ "none", "superficial", "superficial", "light", "light", "serious", "serious", "major", "major" ]
const __effect2Impact = ["none", "superficial", "superficial", "light", "light", "serious", "serious", "major", "major"]
const __cephalySuccess = {
1: "cephaly-success-2",
2: "cephaly-success-2",
3: "cephaly-success-4",
4: "cephaly-success-4",
5: "cephaly-success-6",
6: "cephaly-success-6",
7: "cephaly-success-8",
8: "cephaly-success-8",
9: "cephaly-success-9",
10: "cephaly-success-10"
}
const __cephalyFailure = {
1: "cephaly-failure-2",
2: "cephaly-failure-2",
3: "cephaly-failure-4",
4: "cephaly-failure-4",
5: "cephaly-failure-6",
6: "cephaly-failure-6",
7: "cephaly-failure-8",
8: "cephaly-failure-8",
9: "cephaly-failure-9",
10: "cephaly-failure-10"
}
/* -------------------------------------------- */
export class EcrymeUtility {
@ -56,6 +81,9 @@ export class EcrymeUtility {
accum += block.fn(i);
return accum;
})
Handlebars.registerHelper('isGM', function () {
return game.user.isGM
})
game.settings.register("fvtt-ecryme", "ecryme-game-level", {
name: game.i18n.localize("ECRY.settings.gamelevel"),
@ -81,6 +109,16 @@ export class EcrymeUtility {
let level = game.settings.get("fvtt-ecryme", "ecryme-game-level")
return level != "level_e"
}
/*-------------------------------------------- */
static hasBoheme() {
let level = game.settings.get("fvtt-ecryme", "ecryme-game-level")
return level == "level_b" || level == "level_a"
}
/*-------------------------------------------- */
static hasAmertume() {
let level = game.settings.get("fvtt-ecryme", "ecryme-game-level")
return level == "level_a"
}
/*-------------------------------------------- */
static buildSkillConfig() {
@ -141,10 +179,10 @@ export class EcrymeUtility {
// Compute margin
confront.marginExecution = this.confrontData1.executionTotal - this.confrontData2.preservationTotal
confront.marginPreservation = this.confrontData1.preservationTotal - this.confrontData2.executionTotal
console.log(confront.marginExecution, confront.marginPreservation)
console.log(confront.marginExecution, confront.marginPreservation)
// Filter margin
let maxMargin // Dummy max
if ( confront.marginExecution > 0) { // Successful hit
if (confront.marginExecution > 0) { // Successful hit
// Limit with skill+spec
maxMargin = confront.rollData1.skill.value + ((confront.rollData1.spec) ? 2 : 0)
confront.marginExecution = Math.min(confront.marginExecution, maxMargin)
@ -153,7 +191,7 @@ export class EcrymeUtility {
confront.marginExecution = -Math.min(Math.abs(confront.marginExecution), maxMargin)
}
if ( confront.marginPreservation > 0) { // Successful defense
if (confront.marginPreservation > 0) { // Successful defense
// Limit with skill+spec
maxMargin = confront.rollData1.skill.value + ((confront.rollData1.spec) ? 2 : 0)
confront.marginPreservation = Math.min(confront.marginPreservation, maxMargin)
@ -167,8 +205,8 @@ export class EcrymeUtility {
if (confront.rollData1.weapon && confront.marginExecution > 0) {
confront.effectExecution += confront.rollData1.weapon.system.effect
confront.impactExecution = this.getImpactFromEffect(confront.effectExecution)
}
if ( confront.marginExecution < 0) {
}
if (confront.marginExecution < 0) {
confront.bonus2 = -confront.marginExecution
}
confront.effectPreservation = confront.marginPreservation
@ -176,7 +214,7 @@ export class EcrymeUtility {
confront.effectPreservation = - (Math.abs(confront.marginPreservation) + confront.rollData2.weapon.system.effect)
confront.impactPreservation = this.getImpactFromEffect(Math.abs(confront.effectPreservation))
}
if ( confront.marginPreservation > 0) {
if (confront.marginPreservation > 0) {
confront.bonus1 = -confront.marginPreservation
}
@ -188,6 +226,27 @@ export class EcrymeUtility {
this.lastConfront = confront
}
/* -------------------------------------------- */
static async manageCephalyDifficulty(rollData, difficulty) {
rollData.difficulty = Number(difficulty)
if (rollData.executionTotal > difficulty) {
rollData.marginExecution = rollData.executionTotal - difficulty
rollData.cephalySuccess = "ECRY.rule." + __cephalySuccess[(rollData.marginExecution > 10) ? 10 : rollData.marginExecution]
} else {
rollData.marginExecution = -1
}
if (rollData.preservationTotal < difficulty) {
rollData.marginPreservation = difficulty - rollData.preservationTotal
rollData.cephalyFailure = "ECRY.rule." + __cephalyFailure[(rollData.marginPreservation > 10) ? 10 : rollData.marginPreservation]
} else {
rollData.marginPreservation = -1
}
let msg = await this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-cephaly-result.hbs`, rollData)
})
msg.setFlag("world", "ecryme-rolldata", rollData)
console.log("Cephaly result", rollData)
}
/* -------------------------------------------- */
static manageConfrontation(rollData) {
@ -243,21 +302,24 @@ export class EcrymeUtility {
let rollData = message.getFlag("world", "ecryme-rolldata")
EcrymeUtility.manageConfrontation(rollData)
})
html.on("click", '.button-apply-cephaly-difficulty', event => {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "ecryme-rolldata")
let difficulty = $("#" + rollData.rollId + "-cephaly-difficulty").val()
EcrymeUtility.manageCephalyDifficulty(rollData, difficulty)
})
html.on("click", '.button-apply-impact', event => {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let actor = game.actors.get($(event.currentTarget).data("actor-id"))
actor.modifyImpact($(event.currentTarget).data("impact-type"), $(event.currentTarget).data("impact"), 1)
})
})
html.on("click", '.button-apply-bonus', event => {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let actor = game.actors.get($(event.currentTarget).data("actor-id"))
actor.modifyConfrontBonus( $(event.currentTarget).data("bonus") )
})
html.on("click", '.draw-tarot-card', event => {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
this.drawDeckCard(messageId)
actor.modifyConfrontBonus($(event.currentTarget).data("bonus"))
})
}

View File

@ -11,6 +11,7 @@
import { EcrymeActor } from "./actors/ecryme-actor.js";
import { EcrymeItemSheet } from "./items/ecryme-item-sheet.js";
import { EcrymeActorSheet } from "./actors/ecryme-actor-sheet.js";
import { EcrymeAnnencySheet } from "./actors/ecryme-annency-sheet.js";
import { EcrymeUtility } from "./common/ecryme-utility.js";
import { EcrymeCombat } from "./app/ecryme-combat.js";
import { EcrymeItem } from "./items/ecryme-item.js";
@ -58,13 +59,16 @@ Hooks.once("init", async function () {
// Register sheet application classes
Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet("fvtt-ecryme", EcrymeActorSheet, { types: ["pc"], makeDefault: true });
//Actors.registerSheet("fvtt-ecryme", EcrymeNPCSheet, { types: ["pnj"], makeDefault: false });
Actors.registerSheet("fvtt-ecryme", EcrymeAnnencySheet, { types: ["annency"], makeDefault: false });
Items.unregisterSheet("core", ItemSheet);
Items.registerSheet("fvtt-ecryme", EcrymeItemSheet, { makeDefault: true });
EcrymeUtility.init()
console.log("Babele INIT!")
Babele.get().setSystemTranslationsDir("translated");
});
/* -------------------------------------------- */

BIN
packs/equipment/000009.ldb Normal file

Binary file not shown.

View File

1
packs/equipment/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000046

0
packs/equipment/LOCK Normal file
View File

7
packs/equipment/LOG Normal file
View File

@ -0,0 +1,7 @@
2023/08/08-14:38:49.036882 7f5afcdf86c0 Recovering log #44
2023/08/08-14:38:49.124780 7f5afcdf86c0 Delete type=3 #42
2023/08/08-14:38:49.124893 7f5afcdf86c0 Delete type=0 #44
2023/08/08-14:54:21.588098 7f58677fe6c0 Level-0 table #49: started
2023/08/08-14:54:21.588122 7f58677fe6c0 Level-0 table #49: 0 bytes OK
2023/08/08-14:54:21.594444 7f58677fe6c0 Delete type=0 #47
2023/08/08-14:54:21.607310 7f58677fe6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)

7
packs/equipment/LOG.old Normal file
View File

@ -0,0 +1,7 @@
2023/08/08-14:36:00.338439 7f5867fff6c0 Recovering log #40
2023/08/08-14:36:00.347950 7f5867fff6c0 Delete type=3 #38
2023/08/08-14:36:00.348021 7f5867fff6c0 Delete type=0 #40
2023/08/08-14:38:45.882749 7f58677fe6c0 Level-0 table #45: started
2023/08/08-14:38:45.882812 7f58677fe6c0 Level-0 table #45: 0 bytes OK
2023/08/08-14:38:45.920058 7f58677fe6c0 Delete type=0 #43
2023/08/08-14:38:45.981054 7f58677fe6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/maneuvers/000009.ldb Normal file

Binary file not shown.

View File

1
packs/maneuvers/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000046

0
packs/maneuvers/LOCK Normal file
View File

7
packs/maneuvers/LOG Normal file
View File

@ -0,0 +1,7 @@
2023/08/08-14:38:49.155473 7f5867fff6c0 Recovering log #44
2023/08/08-14:38:49.260893 7f5867fff6c0 Delete type=3 #42
2023/08/08-14:38:49.260950 7f5867fff6c0 Delete type=0 #44
2023/08/08-14:54:21.600756 7f58677fe6c0 Level-0 table #49: started
2023/08/08-14:54:21.600776 7f58677fe6c0 Level-0 table #49: 0 bytes OK
2023/08/08-14:54:21.607211 7f58677fe6c0 Delete type=0 #47
2023/08/08-14:54:21.607330 7f58677fe6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)

7
packs/maneuvers/LOG.old Normal file
View File

@ -0,0 +1,7 @@
2023/08/08-14:36:00.351163 7f5867fff6c0 Recovering log #40
2023/08/08-14:36:00.363535 7f5867fff6c0 Delete type=3 #38
2023/08/08-14:36:00.363690 7f5867fff6c0 Delete type=0 #40
2023/08/08-14:38:46.072007 7f58677fe6c0 Level-0 table #45: started
2023/08/08-14:38:46.072050 7f58677fe6c0 Level-0 table #45: 0 bytes OK
2023/08/08-14:38:46.103317 7f58677fe6c0 Delete type=0 #43
2023/08/08-14:38:46.137931 7f58677fe6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

View File

@ -0,0 +1 @@
MANIFEST-000046

View File

7
packs/specialisation/LOG Normal file
View File

@ -0,0 +1,7 @@
2023/08/08-14:38:49.036954 7f5867fff6c0 Recovering log #44
2023/08/08-14:38:49.153034 7f5867fff6c0 Delete type=3 #42
2023/08/08-14:38:49.153108 7f5867fff6c0 Delete type=0 #44
2023/08/08-14:54:21.558302 7f58677fe6c0 Level-0 table #49: started
2023/08/08-14:54:21.558341 7f58677fe6c0 Level-0 table #49: 0 bytes OK
2023/08/08-14:54:21.572779 7f58677fe6c0 Delete type=0 #47
2023/08/08-14:54:21.573011 7f58677fe6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)

View File

@ -0,0 +1,7 @@
2023/08/08-14:36:00.338438 7f5afd5f96c0 Recovering log #40
2023/08/08-14:36:00.347864 7f5afd5f96c0 Delete type=3 #38
2023/08/08-14:36:00.347905 7f5afd5f96c0 Delete type=0 #40
2023/08/08-14:38:46.031269 7f58677fe6c0 Level-0 table #45: started
2023/08/08-14:38:46.031315 7f58677fe6c0 Level-0 table #45: 0 bytes OK
2023/08/08-14:38:46.071808 7f58677fe6c0 Delete type=0 #43
2023/08/08-14:38:46.137889 7f58677fe6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/traits/000009.ldb Normal file

Binary file not shown.

0
packs/traits/000048.log Normal file
View File

1
packs/traits/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000046

0
packs/traits/LOCK Normal file
View File

7
packs/traits/LOG Normal file
View File

@ -0,0 +1,7 @@
2023/08/08-14:38:49.127661 7f5afcdf86c0 Recovering log #44
2023/08/08-14:38:49.237408 7f5afcdf86c0 Delete type=3 #42
2023/08/08-14:38:49.237452 7f5afcdf86c0 Delete type=0 #44
2023/08/08-14:54:21.594546 7f58677fe6c0 Level-0 table #49: started
2023/08/08-14:54:21.594573 7f58677fe6c0 Level-0 table #49: 0 bytes OK
2023/08/08-14:54:21.600659 7f58677fe6c0 Delete type=0 #47
2023/08/08-14:54:21.607322 7f58677fe6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)

7
packs/traits/LOG.old Normal file
View File

@ -0,0 +1,7 @@
2023/08/08-14:36:00.351163 7f5afd5f96c0 Recovering log #40
2023/08/08-14:36:00.360537 7f5afd5f96c0 Delete type=3 #38
2023/08/08-14:36:00.360576 7f5afd5f96c0 Delete type=0 #40
2023/08/08-14:38:46.103419 7f58677fe6c0 Level-0 table #45: started
2023/08/08-14:38:46.103439 7f58677fe6c0 Level-0 table #45: 0 bytes OK
2023/08/08-14:38:46.137624 7f58677fe6c0 Delete type=0 #43
2023/08/08-14:38:46.137971 7f58677fe6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -26,6 +26,54 @@
}
],
"packs": [
{
"label": "Spécialisation",
"type": "Item",
"name": "specialisation",
"path": "packs/specialisation",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
},
{
"label": "Equipment",
"type": "Item",
"name": "equipment",
"path": "packs/equipment",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
},
{
"label": "Traits",
"type": "Item",
"name": "traits",
"path": "packs/traits",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
},
{
"label": "Maneuvers",
"type": "Item",
"name": "maneuvers",
"path": "packs/maneuvers",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
}
],
"license": "LICENSE.txt",
"manifest": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/raw/branch/master/system.json",
@ -42,7 +90,7 @@
],
"title": "Ecryme, le Jeu de Rôles",
"url": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme",
"version": "11.0.7",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/archive/fvtt-ecryme-v11.0.7.zip",
"version": "11.0.16",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/archive/fvtt-ecryme-v11.0.16.zip",
"background": "systems/fvtt-ecryme/images/assets/ecryme_extract_panel_01.webp"
}

View File

@ -1,7 +1,7 @@
{
"Actor": {
"types": [
"pc"
"pc","annency"
],
"templates": {
"biodata": {
@ -173,8 +173,29 @@
"npccore": {
"npctype": "",
"description": ""
},
"annency": {
"base": {
"iscollective": false,
"ismultiple": false,
"characters": [],
"location": {"1": "", "2": "", "3":"", "4":"", "5":"" },
"description": "",
"enhancements": ""
},
"boheme": {
"name": "",
"ideals": "",
"politic": "",
"description": ""
}
}
},
"annency": {
"templates": [
"annency"
]
},
"pc": {
"templates": [
"biodata",
@ -188,10 +209,7 @@
"trait",
"weapon",
"specialization",
"annency",
"boheme",
"contact",
"confrontation"
"maneuver"
],
"templates": {
"common": {
@ -203,6 +221,11 @@
"costunit": ""
}
},
"maneuver": {
"templates": [
"common"
]
},
"confrontation": {
"templates": [
"common"

View File

@ -125,8 +125,12 @@
{{#if hasCephaly}}
{{!-- Cephaly Tab --}}
<div class="tab cephaly" data-group="primary" data-tab="cephaly">
<div class="grid grid-2col">
<div>
<h3>{{localize "ECRY.ui.cephaly"}}</h3>
<ul class="stat-list alternate-list item-list">
{{#each cephalySkills as |skill skillkey|}}
<li class="item flexrow list-item">
@ -135,9 +139,8 @@
<i class="fa-solid fa-dice-d6"></i>
{{localize skill.name}}
</a></span>
<select class="item-field-label-short" type="text"
name="system.cephaly.skilllist.{{skillkey}}.value" value="{{skill.value}}"
data-dtype="Number">
<select class="item-field-label-short" type="text" name="system.cephaly.skilllist.{{skillkey}}.value"
value="{{skill.value}}" data-dtype="Number">
{{#select skill.value}}
{{#each @root.config.skillLevel as |level key| }}
<option value="{{level}}">{{level}}</option>
@ -147,7 +150,25 @@
</li>
{{/each}}
</ul>
</div>
<div>
{{#if annency}}
<h3>{{localize "ECRY.ui.annency"}} : <a class="open-annency" data-annency-id="{{annency.id}}">{{annency.name}}<i class="fas fa-edit"></i></a></h3>
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item">
<span class="item-name-label-long">
{{annency.system.base.description}}
</span>
</li>
</ul>
{{/if}}
</div>
</div>
</div>
{{/if}}
@ -226,6 +247,28 @@
{{/each}}
</ul>
<ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header-long2">
<h3><label class="item-name-label-header-long2">{{localize "ECRY.ui.maneuvers"}}</label></h3>
</span>
</li>
{{#each maneuvers as |maneuver key|}}
<li class="item flexrow list-item list-item-shadow" data-item-id="{{maneuver._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{maneuver.img}}" /></a>
<span class="item-name-label-long2">
{{maneuver.name}}
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete maneuver"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</div>

View File

@ -0,0 +1,138 @@
<form class="{{cssClass}}" autocomplete="off">
{{!-- Sheet Header --}}
<header class="sheet-header">
<div class="header-fields">
<div class="flexrow">
<div class="profile-img-container">
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" />
</div>
<div class="flexcol">
<h1 class="charname margin-right"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
<div class="flexrow">
<ul>
<li class="flexrow item" data-item-id="{{spleen.id}}">
<label class="item-name-label-medium">Description :</label>
<textarea class="textarea-default" rows="3" name="system.base.description">{{system.base.description}}</textarea>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</header>
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary">
{{#if hasCephaly}}
<a class="item" data-tab="annency">{{localize "ECRY.ui.annency"}}</a>
{{/if}}
{{#if hasBoheme}}
<a class="item" data-tab="boheme">{{localize "ECRY.ui.boheme"}}</a>
{{/if}}
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body">
{{#if hasCephaly}}
{{!-- Cephaly Tab --}}
<div class="tab annency" data-group="primary" data-tab="annency">
<div class="grid grid-2col">
<div>
<h3>{{localize "ECRY.ui.annency"}}</h3>
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item">
<span class="item-name-label-short">
{{localize "ECRY.ui.iscollective"}}
</span>
<input type="checkbox" class="item-field-label-short" name="system.base.iscollective"
value="{{system.base.iscollective}}" {{checked system.base.iscollective}} />
<span class="item-name-label-short">
{{localize "ECRY.ui.ismultiple"}}
</span>
<input type="checkbox" class="item-field-label-short" name="system.base.ismultiple"
value="{{system.base.ismultiple}}" {{checked system.base.ismultiple}} />
</li>
</ul>
<h3>{{localize "ECRY.ui.characters"}}</h3>
<ul class="stat-list alternate-list item-list">
{{#each characters as |character id|}}
<li class="item flexrow " data-actor-id="{{character.id}}" >
<img class="item-name-img" src="{{character.img}}" />
<span class="item-name-label competence-name">{{character.name}}</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control actor-edit" title="Edit Actor"><i class="fas fa-edit"></i></a>
<a class="item-control actor-delete" title="Delete Actor"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</div>
<div>
<h3>{{localize "ECRY.ui.location"}}</h3>
<ul class="stat-list alternate-list item-list">
{{#each system.base.location as |location index|}}
<li class="item flexrow list-item">
<span class="item-name-label-medium">
{{localize "ECRY.ui.location"}} {{index}}
</span>
<textarea class="textarea-default" rows="3" name="system.base.location.{{index}}">{{location}}</textarea>
</li>
{{/each}}
<li class="item flexrow list-item">
<span class="item-name-label-medium">
{{localize "ECRY.ui.enhancements"}}
</span>
<textarea class="textarea-default" rows="3" name="system.base.enhancements">{{system.base.enhancements}}</textarea>
</li>
</ul>
</div>
</div>
</div>
{{/if}}
{{#if hasBoheme}}
<div class="tab boheme" data-group="primary" data-tab="boheme">
<h3>{{localize "ECRY.ui.oniricform"}}</h3>
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item">
<span class="item-name-label-medium">{{localize "ECRY.ui.name"}}</span>
<input type="text" class="item-field-label-long" name="system.boheme.name" value="{{system.boheme.name}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<span class="item-name-label-medium">{{localize "ECRY.ui.ideals"}}</span>
<input type="text" class="item-field-label-long" name="system.boheme.ideals" value="{{system.boheme.ideals}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<span class="item-name-label-medium">{{localize "ECRY.ui.politic"}}</span>
<input type="text" class="item-field-label-long" name="system.boheme.politic" value="{{system.boheme.politic}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<span class="item-name-label-medium">{{localize "ECRY.ui.description"}}</span>
<textarea class="textarea-default" rows="3" name="system.boheme.description">{{system.boheme.description}}</textarea>
</li>
</ul>
</div>
{{/if}}
</section>
</form>

View File

@ -0,0 +1,30 @@
<div class="chat-message-header">
{{#if actorImg}}
<img class="actor-icon" src="{{actorImg}}" alt="{{alias}}" />
{{/if}}
<h4 class="chat-actor-name">{{alias}}</h4>
</div>
<hr>
{{#if img}}
<div>
<img class="chat-icon" src="{{img}}" alt="{{alias}}" />
</div>
{{/if}}
<div>
<ul>
<li>{{localize "ECRY.ui.cephaly"}} : {{localize skill.name}}</li>
{{#if (gt marginExecution 0)}}
<li>{{localize "ECRY.ui.execution"}} {{executionTotal}} vs {{difficulty}} : {{marginExecution}}</li>
<li>{{localize cephalySuccess}}</li>
{{/if}}
{{#if (gt marginPreservation 0)}}
<li>{{localize "ECRY.ui.preservation"}} {{preservationTotal}} vs {{difficulty}} : {{marginPreservation}}</li>
<li>{{localize cephalyFailure}}</li>
{{/if}}
</ul>
</div>
</div>

View File

@ -15,13 +15,47 @@
<div>
<ul>
{{#if (eq mode "cephaly")}}
<li>{{localize "ECRY.ui.cephaly"}} : {{localize skill.name}} </li>
{{else}}
<li>Confrontation : {{alias}} </li>
{{/if}}
<li>{{localize skill.name}}: {{skill.value}} </li>
{{#if spec}}
<li>{{localize "ECRY.chat.specialization"}} {{spec.name}} (+2) </li>
{{/if}}
{{#each traitsBonus as |trait idx|}}
{{#if trait.activated}}
<li>{{localize "ECRY.chat.traitbonus"}}: {{trait.name}} ({{trait.system.level}}) </li>
{{/if}}
{{/each}}
{{#each traitsMalus as |trait idx|}}
{{#if trait.activated}}
<li>{{localize "ECRY.chat.traitmalus"}}: {{trait.name}} ({{trait.system.level}}) </li>
{{/if}}
{{/each}}
{{#if bonusMalusTraits}}
<li>{{localize "ECRY.chat.bonusmalustraits"}}: {{bonusMalusTraits}} </li>
{{/if}}
</ul>
<button class="button-select-confront">{{localize "ECRY.ui.selectconfront"}}</button>
{{#if (isGM)}}
{{#if (eq mode "cephaly")}}
<div>
<span>{{localize "ECRY.chat.difficulty"}}</span>
<select id="{{rollId}}-cephaly-difficulty" name="cephaly-difficulty">
{{#for 1 20 1}}
<option value="{{this}}">{{this}}</option>
{{/for}}
</select>
</div>
<button class="button-apply-cephaly-difficulty">{{localize "ECRY.ui.cephalydifficulty"}}</button>
{{else}}
<button class="button-select-confront">{{localize "ECRY.ui.selectconfront"}}</button>
{{/if}}
{{/if}}
</div>
</div>

View File

@ -0,0 +1,27 @@
<form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-sheet-img" src="{{img}}" data-edit="img" title="{{name}}"/>
<div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
</div>
</header>
{{> systems/fvtt-ecryme/templates/items/partial-item-nav.hbs}}
{{!-- Sheet Body --}}
<section class="sheet-body">
{{> systems/fvtt-ecryme/templates/items/partial-item-description.hbs}}
<div class="tab details" data-group="primary" data-tab="details">
<div class="tab" data-group="primary">
<ul>
</ul>
</div>
</div>
</section>
</form>

View File

@ -0,0 +1,664 @@
{
"label": "Equipement",
"mapping": {
"description": "system.description"
},
"entries": {
"Absinthe": {
"name": "Absinthe",
"description": "<p>A 5 pence deposit is paid for bottles. This sum is paid back if the empty bottle is returned.</p>"
},
"Accordion": {
"name": "Accordéon",
"description": ""
},
"Airship": {
"name": "Dirigeable",
"description": ""
},
"Animal skin parchment": {
"name": "Parchemin de peau",
"description": ""
},
"Automobile": {
"name": "Automobile",
"description": ""
},
"Axe": {
"name": "Hache",
"description": ""
},
"Bag": {
"name": "Sac",
"description": ""
},
"Ball of string": {
"name": "Pelote de ficelle",
"description": ""
},
"Bar of base metal (1 kg)": {
"name": "Lingot de vil métal (1 kg)",
"description": ""
},
"Bare hand": {
"name": "Mains nues",
"description": ""
},
"Barrel organ": {
"name": "Orgue",
"description": ""
},
"Battleaxe": {
"name": "Hache de bataille",
"description": ""
},
"Beer (1 glass)": {
"name": "Bière (1 verre)",
"description": "<p>A 5 pence deposit is paid for bottles. This sum is paid back if the empty bottle is returned.</p>"
},
"Beet stein": {
"name": "Chope (étain)",
"description": ""
},
"Bicycle": {
"name": "Vélo",
"description": ""
},
"Blacksmith's toolkit": {
"name": "Outils de forgeron",
"description": ""
},
"Blanket": {
"name": "Couverture",
"description": ""
},
"Blowpipe": {
"name": "Sarbacane",
"description": ""
},
"Blunderbuss": {
"name": "Tromblon",
"description": ""
},
"Book (printed)": {
"name": "Livre (imprimé)",
"description": ""
},
"Bow": {
"name": "Arc",
"description": ""
},
"Bower hat": {
"name": "Chapeau melon",
"description": ""
},
"Box camera": {
"name": "Appareil photographique (boîtier)",
"description": ""
},
"Bracelet": {
"name": "Bracelet",
"description": ""
},
"Brandy": {
"name": "Brandy",
"description": "<p>A 5 pence deposit is paid for bottles. This sum is paid back if the empty bottle is returned.</p>"
},
"Brooch": {
"name": "Broche",
"description": ""
},
"Butter": {
"name": "Beurre",
"description": ""
},
"Butterfly net": {
"name": "Filet à papillons",
"description": ""
},
"Cake": {
"name": "Gâteau",
"description": ""
},
"Candle": {
"name": "Bougie",
"description": ""
},
"Cane": {
"name": "Canne",
"description": ""
},
"Cape": {
"name": "Cape",
"description": ""
},
"Carriage": {
"name": "Carriole",
"description": ""
},
"Cestus": {
"name": "Ceste",
"description": ""
},
"Chain": {
"name": "Chaîne",
"description": ""
},
"Chain mail": {
"name": "Chemise de maille",
"description": ""
},
"Chestpplate": {
"name": "Cuirasse",
"description": ""
},
"Cigarettes": {
"name": "Cigarettes",
"description": ""
},
"Coffee, tea": {
"name": "Café, thé",
"description": ""
},
"Compass": {
"name": "Boussole",
"description": ""
},
"Corset": {
"name": "Corset",
"description": ""
},
"Crowbar": {
"name": "Pied de biche",
"description": ""
},
"Crude oil (1 l)": {
"name": "Huile lourde (1 l)",
"description": ""
},
"Cudgel": {
"name": "Gourdin",
"description": ""
},
"Dagger": {
"name": "Dague",
"description": ""
},
"Dirk": {
"name": "Poignard",
"description": ""
},
"Disk": {
"name": "Disque",
"description": ""
},
"Dissection kit": {
"name": "Nécessaire de dissection ",
"description": ""
},
"Dress, skirt": {
"name": "Robe, jupe",
"description": ""
},
"Drum": {
"name": "Tambour",
"description": ""
},
"Earrings (pair)": {
"name": "Boucles d'oreille (paire)",
"description": ""
},
"Egg": {
"name": "Oeuf",
"description": ""
},
"Evening dress": {
"name": "Robe de soirée",
"description": ""
},
"Evening shirt": {
"name": "Chemise de soirée",
"description": ""
},
"Film": {
"name": "Pellicule, développement et tirage",
"description": ""
},
"Flail": {
"name": "Fléau",
"description": ""
},
"Flat cap": {
"name": "Casquette gavroche",
"description": ""
},
"Glasses": {
"name": "Lunettes",
"description": ""
},
"Grappling hook": {
"name": "Grapin",
"description": ""
},
"Halberd": {
"name": "Hallebarde",
"description": ""
},
"Hammer and chisel": {
"name": "Marteau et burin",
"description": ""
},
"Handbag": {
"name": "Sac à main",
"description": ""
},
"Handheld crossbow": {
"name": "Arbalète de poing",
"description": ""
},
"Handheld lamp": {
"name": "Lampe tempête",
"description": ""
},
"Harpsichord": {
"name": "Clavecin",
"description": ""
},
"High heels shoes": {
"name": "Escarpins",
"description": ""
},
"Horse-drawn cart": {
"name": "Chariot",
"description": ""
},
"Hot air balloon": {
"name": "Ballon",
"description": ""
},
"Illustrated manuscript (cheap)": {
"name": "Manuscrit enluminé (bon marché) ",
"description": ""
},
"Illustrated manuscript (rich)": {
"name": "Manuscrit enluminé (cher)",
"description": ""
},
"Improvised weapon": {
"name": "Armes improvisées",
"description": ""
},
"Inkpot": {
"name": "Encrier",
"description": ""
},
"Iron flask": {
"name": "Flasque de fer",
"description": ""
},
"Jar (glass)": {
"name": "Conserve (verre)",
"description": ""
},
"Jaw harp": {
"name": "Guimbarde",
"description": ""
},
"Kettle": {
"name": "Bouilloire",
"description": ""
},
"Knife": {
"name": "Couteau",
"description": ""
},
"Lamp oil": {
"name": "Huile (lamp)",
"description": ""
},
"Lantern": {
"name": "Lanterne",
"description": ""
},
"Leather boots (pair)": {
"name": "Leather boots (pair)",
"description": ""
},
"Leather chest piece": {
"name": "Gilet de cuir",
"description": ""
},
"Leather overcoat": {
"name": "Manteau de conduite en cuir ",
"description": ""
},
"Lighter": {
"name": "Briquet",
"description": ""
},
"Loaf of bread": {
"name": "Miche de pain",
"description": ""
},
"Log": {
"name": "Bûche",
"description": ""
},
"Lute": {
"name": "Luth",
"description": ""
},
"Lyre": {
"name": "Lyre",
"description": ""
},
"Mace": {
"name": "Masse d'armes",
"description": ""
},
"Magnifying glass": {
"name": "Lunette, télescope",
"description": ""
},
"Mander parchment": {
"name": "Parchemin de mandre",
"description": ""
},
"Mandolin": {
"name": "Mandoline",
"description": ""
},
"Meat (beef, horse, chicken)": {
"name": "Viande (boeuf, cheval, poulet)",
"description": ""
},
"Meat (fullige, snake, pigeon) (Copy)": {
"name": "Viande (fulige, serpent, pigeon)",
"description": ""
},
"Meat (rat)": {
"name": "Viande (rat)",
"description": ""
},
"Messenger bag": {
"name": "Besace",
"description": ""
},
"Metal crossbow": {
"name": "Arbalète métallique",
"description": ""
},
"Metal cutlery": {
"name": "Couverts en métal",
"description": ""
},
"Metal plaque": {
"name": "Plaque de métal",
"description": "<p>(+8 de caution)</p>"
},
"Mushroom bread": {
"name": "Pain de champignons",
"description": ""
},
"Mushroom spirit": {
"name": "Eau-de-vie de champignons",
"description": "<p>Les bouteilles vides sont consignées, 5 sous par bouteille</p>"
},
"Musical saw": {
"name": "Scie musicale",
"description": ""
},
"Musket": {
"name": "Mousquet",
"description": ""
},
"Necklace": {
"name": "Collier",
"description": ""
},
"Organ": {
"name": "Orgue",
"description": ""
},
"Overcoat": {
"name": "Manteau",
"description": ""
},
"Pack of cards": {
"name": "Jeu de cartes",
"description": ""
},
"Petticoat": {
"name": "Jupon",
"description": ""
},
"Phonographic recorder": {
"name": "phonoéditeur",
"description": ""
},
"Pike": {
"name": "Pique",
"description": ""
},
"Pistol": {
"name": "Pistolet",
"description": ""
},
"Pocket watch": {
"name": "Montre à gousset",
"description": ""
},
"Poor quality stilts": {
"name": "Chaussures à talons-aiguille de basse qualité",
"description": ""
},
"Port, wine": {
"name": "Porto, vin",
"description": "<p>Les bouteilles vides sont consignées, 5 sous par bouteille</p>"
},
"Portable first aid kit": {
"name": "Trousse médicale de voyage ",
"description": ""
},
"Portable phonographic recorder": {
"name": "Phonoenregistreur de voyage",
"description": ""
},
"Portable stove": {
"name": "Réchaud à alcool",
"description": ""
},
"Pot of jam": {
"name": "Pot de confiture",
"description": ""
},
"Quill": {
"name": "Plume",
"description": ""
},
"Rapier": {
"name": "Rapière",
"description": ""
},
"Razor blade": {
"name": "Lame de rasoir",
"description": ""
},
"Recorder": {
"name": "Flûte à bec",
"description": ""
},
"Revolver": {
"name": "Révolver",
"description": ""
},
"Riding boots (pair)": {
"name": "Botte de cavalier (paire)",
"description": ""
},
"Ring": {
"name": "Anneau",
"description": ""
},
"Rope (hemp)": {
"name": "Corde (chanvre)",
"description": ""
},
"Rum": {
"name": "Rhum",
"description": "<p>Les bouteilles vides sont consignées, 5 sous par bouteille</p>"
},
"Scarf, shawl": {
"name": "Echarpe, châle",
"description": ""
},
"Shoes": {
"name": "Chaussures",
"description": ""
},
"Sighted rifle": {
"name": "Fusil à lunette",
"description": ""
},
"Silk stockings": {
"name": "Bas de soie",
"description": ""
},
"Silver bar": {
"name": "Lingot dargent ",
"description": ""
},
"Skis": {
"name": "Skis",
"description": ""
},
"Sleeping bag": {
"name": "Sac de couchage",
"description": ""
},
"Sling": {
"name": "Fronde",
"description": ""
},
"Soft brimmed hat": {
"name": "Chapeau mou",
"description": ""
},
"Spear": {
"name": "Lance",
"description": ""
},
"Spirit": {
"name": "Liqueur",
"description": "<p>Les bouteilles vides sont consignées, 5 sous par bouteille</p>"
},
"Staff": {
"name": "Bâton",
"description": ""
},
"Stylus for wax plaque": {
"name": "Stylet pour plaque de cire",
"description": ""
},
"Sword": {
"name": "Epée",
"description": ""
},
"Tambourine": {
"name": "Tambourin",
"description": ""
},
"Telescope": {
"name": "Télescope",
"description": ""
},
"Telescopic stilts": {
"name": "Échasses télescopiques",
"description": ""
},
"Thief's toolkit": {
"name": "Outils de voleur",
"description": ""
},
"Top hat": {
"name": "Haut-de-forme",
"description": ""
},
"Torch": {
"name": "Torche",
"description": ""
},
"Train (locomotive)": {
"name": "Train (locomotive)",
"description": ""
},
"Train (wagons)": {
"name": "Train (wagons)",
"description": ""
},
"Trumpet": {
"name": "Trompette",
"description": ""
},
"Truncheon": {
"name": "Matraque",
"description": ""
},
"Underwear": {
"name": "Sous-vêtements",
"description": ""
},
"Uniform": {
"name": "Uniforme",
"description": ""
},
"Viol": {
"name": "Viole",
"description": ""
},
"Violin": {
"name": "Violon",
"description": ""
},
"Walking stick": {
"name": "Bâton de marche",
"description": ""
},
"Watch": {
"name": "Montre",
"description": ""
},
"Wax plaque": {
"name": "Plaque de cire",
"description": "<p>+3 de caution</p>"
},
"Whiskey": {
"name": "Whisky",
"description": "<p>Les bouteilles vides sont consignées, 5 sous par bouteille</p>"
},
"Whistle": {
"name": "Sifflet",
"description": ""
},
"White shirt": {
"name": "Chemise blanche",
"description": ""
},
"Wooden crossbow": {
"name": "Arbalète en bois",
"description": ""
},
"Wooden sedan chair": {
"name": "Chaise à porteurs (bois)",
"description": ""
},
"Wooden trunk": {
"name": "Malle de bois",
"description": ""
},
"Writing material": {
"name": "Matériel décriture",
"description": ""
}
}
}

View File

@ -0,0 +1,68 @@
{
"label": "Manoeuvres",
"mapping": {
"description": "system.description"
},
"entries": {
"Coup de Jarnac": {
"name": "Coup de Jarnac",
"description": "<p>Marge de 4 en Accomplissement </p>\n<p>Ce coup violent, déloyal et pernicieux, a été rendu célèbre par Guy Chabot de Jarnac, qui la porté pour la première fois lors dun duel judiciaire, à Éole, en 954. Il consiste à blesser la jambe ou le tendon dAchille de ladversaire, lempêchant de se déplacer normalement. En plus de lImpact, la victime se voit affublée du Trait <em>Estropié -1</em>.</p>"
},
"Doesnt even hurt": {
"name": "Même pas mal",
"description": "<p>Par le contrôle de sa respiration et une volonté inébranlable, le combattant apprend à faire fi de ses blessures. Non seulement il ne souffre daucun malus dû aux Impacts subis mais, mieux encore, ces derniers lui permettent de se surpasser et deviennent des bonus proportionnels. Ainsi, au lieu de subir un malus de -4 pour un Impact majeur, le personnage bénéficiera dun bonus de +4. Il peut dépasser la Marge autorisée par sa Compétence.</p>"
},
"Double impact": {
"name": "Double impact",
"description": "<p>Aggressif</p>\n<p>deux armes sont nécessaires</p>\n<p>Cette botte demande une extrême célérité au maître darmes qui augmente sa cadence de frappe. Durant un même échange de coups, il est ainsi capable dinfliger son Impact deux fois (deux Impacts graves au lieu dun par exemple). Le retour de flamme est cependant périlleux, car, par son agressivité, le maître darmes se découvre. Lui aussi subit des Impacts doublés.</p>"
},
"It's the winning, not the taking part that counts": {
"name": "Limportant nest pas de participer mais de gagner",
"description": "<p>impossibilité dutiliser cette botte en duel</p>\n<p>Lescrimeur a appris à tirer profit de toutes les occasions, privilégiant lefficacité au style. Il se sert de tout ce qui lui tombe sous la main pour en tirer avantage. Entre ses mains, un élément improvisé utilisé pour se battre est doté dune Incidence de +3, mais il se brise après usage.</p>"
},
"Perforation": {
"name": "Perforation",
"description": "<p>Cette manœuvre est particulièrement usitée au sein des seigneuries traversières, où les armures demeurent courantes. Dun coup précis, le maître darmes cible le point faible de la protection de son opposant et sy engouffre, faisant fi du bonus de cette dernière.</p>"
},
"Point blank": {
"name": "À bout portant",
"description": "<p>nécessite Spécialization <em>Mousquet</em></p>\n<p>Le maître darmes est un artiste martial, capable de faire feu avec son mousquet lors dun combat au corps à corps. Durant un même échange de coups, il peut porter un coup de baïonnette (Incidence du poignard) et faire feu avec le mousquet (Incidence darme à feu).</p>"
},
"Ribbon Dance": {
"name": "Danse des rubans",
"description": "<p>Agressif</p>\n<p>Par tranche de 2, nécessite une Spécialisation en arme articulée (fouet, chaînes, fléaux, rubans lestés de plomb ou lames métalliques), de réussir son test de Préservation et davoir suffisamment de place pour se battre En effectuant de longues et complexes arabesques, le maître darmes produit une sphère mortelle tournoyante autour de lui. Il peut alors ajouter sa Marge de Préservation, par tranche de 2, à sa Marge dAccomplissement. La Marge dAccomplissement produit alors de nombreuses blessures superficielles (1 par Marge de 2).</p>"
},
"The Chimeric Defense": {
"name": "Défense chimérique",
"description": "<p>&ldquo;Défensif uniquement&rdquo;&ndash;par tranches de 2&ndash;</p>\n<p>Pour réussir cette manœuvre, le personnage doit obtenir une Marge dau moins 4 en Accomplissement ET en Préservation. En cas de réussite, elle permet dajouter tout ou partie de sa Marge de Préservation, par tranches de 2, à sa Marge dAccomplissement. Alors quil esquive ou pare, le défenseur en profite pour porter un coup à laide dun membre, dun élément improvisé, dun bouclier, etc. Cela demande une réflexion tactique, car augmenter son Accomplissement en recourant à cette botte affaiblit sa Préservation. Le combattant peut dépasser la Marge autorisée par sa Compétence.</p>"
},
"The Dead mans Hold": {
"name": "Létreinte de lhomme mort",
"description": "<p>Lescrimeur choisit de subir des blessures en optant pour un score de Préservation bas. En acceptant ces Impacts, il est en retour capable de déjouer la garde de son adversaire et lui fait subir en retour des dégâts identiques, en plus de ceux quil a infligés normalement durant cette passe darmes, pour un total pouvant dépasser sa Marge autorisée de Compétence.</p>"
},
"The jeering master": {
"name": "Maître persifleur",
"description": "<p>Cette technique permet de provoquer son adversaire, voire de lhumilier, avant de lachever. Par ses piques et ses railleries, le maître darmes impose à son adversaire de placer son plus haut score possible en Accomplissement, ce qui dégarnit grandement sa Préservation (pour les seconds rôles, faites +4/-4 par défaut). </p>"
},
"The Madmans step": {
"name": "Le pas de lhomme fou",
"description": "<p>Le style Rojo nest pas enseigné par dans les écoles davocats-duellistes, mais dans les caravanes traversières. Lescrimeur adopte un style fait de mouvements erratiques et imprévisibles, désorientant son adversaire et le rendant plus difficile à toucher. Le bretteur ajoute +4 à sa Préservation et peut dépasser la Marge autorisée par sa Compétence.</p>"
},
"The Nevers Attack": {
"name": "La botte de Nevers",
"description": "<p>Marge de 4 en Accomplissement et ladversaire ne doit pas posséder de protection à la tête</p>\n<p>Inventée par Philippe de Nevers, un sabreur parisien, cette botte exige une extrême précision mais se révèle dévastatrice. En cas de réussite, lépéiste élimine son adversaire sur le coup en lui infligeant une blessure entre les deux yeux (équivalent dun Impact majeur).</p>"
},
"The partner switch": {
"name": "Changement de partenaire",
"description": "<p>Cette botte peut être employée par un escrimeur confronté à plusieurs adversaires. Ce dernier a la possibilité dengager une cible supplémentaire au dernier moment (avant le calcul des Incidences). Il peut demander au conteur de lorienter vers un personnage à portée de fleuret ou de désigner son opposant avec le plus faible ou le plus fort score en Préservation. Le score de Préservation de lescrimeur sapplique aux deux adversaires désignés.</p>"
},
"The Scarlet Dance": {
"name": "La danse écarlate",
"description": "<p>Cette botte est linvention de la duelliste Bramon dÉole. Véritable némésis de Marcel Rubempré, maître darmes des anciens nobles avant quils ne soient chassés sur les traverses, sa technique entra dans la légende lors de la révolution industrielle. Elle combine un mélange de pas de danse et de coups destoc et de taille. Se laissant aller au rythme de sa musique intérieure, lépéiste finit dans un état de transe lui permettant dajouter son score dAthlétisme à son Incidence. Il peut dépasser la Marge autorisée par sa Compétence.</p>"
},
"Two-handed attack": {
"name": "À deux mains",
"description": "<p>Porter le coup avec les deux mains sur le pommeau de larme, avoir un score dAccomplissement supérieur à celui de Préservation Le combattant frappe de toutes ses forces afin de percer la défense de son adversaire. Il peut remplacer lIncidence de son arme par son score en <em>Athlétisme</em>.</p>"
}
}
}

View File

@ -0,0 +1,388 @@
{
"label": "Spécialisation",
"mapping": {
"description": "system.description"
},
"entries": {
"Aircraft": {
"name": "brûleur daérostat",
"description": ""
},
"Airplane": {
"name": "Aéroplane",
"description": ""
},
"Airship": {
"name": "Dirigeable",
"description": ""
},
"Amputation": {
"name": "Amputation",
"description": ""
},
"Architecture": {
"name": "Architecture",
"description": ""
},
"Armlock": {
"name": "Clef de bras",
"description": ""
},
"Automobile": {
"name": "Automobile",
"description": ""
},
"Axe": {
"name": "Hache",
"description": ""
},
"Bartering": {
"name": "Marchander",
"description": ""
},
"Blowpipe": {
"name": "Sarbacane",
"description": ""
},
"Bow": {
"name": "Arc",
"description": ""
},
"Boxing": {
"name": "Boxe",
"description": ""
},
"Camouflage": {
"name": "Camouflage",
"description": ""
},
"Carriage": {
"name": "Calèche",
"description": ""
},
"Carrying": {
"name": "Porter",
"description": "<p>Le personnage a la force et l'habitude de porter des charges lourdes.</p>"
},
"Cavalry saber": {
"name": "Sabre de cavalerie",
"description": ""
},
"Charm": {
"name": "Charmer",
"description": ""
},
"Chemystry": {
"name": "Chimie",
"description": ""
},
"Clarinet": {
"name": "Clarinette",
"description": ""
},
"Climbing": {
"name": "Escalader",
"description": "<p>Le personnage a appris à escalader différents types de surfaces.</p>"
},
"Clocks": {
"name": "Horloges",
"description": ""
},
"Collecting gossip": {
"name": "Collecter des ragots",
"description": ""
},
"Communication": {
"name": "Communication",
"description": ""
},
"Dagger": {
"name": "Dague",
"description": ""
},
"Decoction": {
"name": "Décoction",
"description": ""
},
"Dosage of medicine": {
"name": "Posologie",
"description": ""
},
"Electric": {
"name": "Electric",
"description": ""
},
"Environment (Alley)": {
"name": "Environnement (ruelle)",
"description": ""
},
"Environment (traverse)": {
"name": "Environnement (traverse)",
"description": ""
},
"Escape": {
"name": "Filer",
"description": ""
},
"Foil": {
"name": "Fleuret",
"description": ""
},
"Giving commands": {
"name": "Commander",
"description": ""
},
"Glider": {
"name": "Cerf-volant",
"description": ""
},
"Halberd": {
"name": "Hallebarde",
"description": ""
},
"Herbalism": {
"name": "Herbalisme",
"description": ""
},
"History": {
"name": "Histoire",
"description": ""
},
"Horse": {
"name": "Cheval",
"description": ""
},
"Hot air balloon": {
"name": "Ballon",
"description": ""
},
"Hydrocryme production": {
"name": "Production d'hydrocryme",
"description": ""
},
"Hydropower": {
"name": "Hydraulique",
"description": ""
},
"Impressing people": {
"name": "Impressionner",
"description": ""
},
"Improvised combat": {
"name": "Combat improvisé",
"description": ""
},
"Interrogation": {
"name": "Interrogation",
"description": ""
},
"Intervention": {
"name": "Intervention",
"description": ""
},
"Intimidation": {
"name": "Intimidation",
"description": ""
},
"Investigation": {
"name": "Investigation",
"description": ""
},
"Iron work": {
"name": "Ferronnerie",
"description": ""
},
"Jumping": {
"name": "sauter",
"description": "<p>Le personnage a la dextérité et la coordination pour sauter loin, haut, et atterrir sur ses pieds.</p>"
},
"Kickboxing": {
"name": "Savate",
"description": ""
},
"Lock picking": {
"name": "Crocheter",
"description": ""
},
"Lock systems": {
"name": "Serrures",
"description": ""
},
"Locomotive": {
"name": "Locomotive",
"description": ""
},
"Locomotives": {
"name": "Locomotives",
"description": ""
},
"Lying": {
"name": "Mentir",
"description": ""
},
"Making a good impression": {
"name": "Faire une bonne impression",
"description": ""
},
"Making mushroom paper": {
"name": "Fabriquer du papier à base de champignons",
"description": ""
},
"Milieu knowledge": {
"name": "Connaissance du milieu (...)",
"description": ""
},
"Music": {
"name": "Musique",
"description": ""
},
"Musical composition": {
"name": "Composition musicale",
"description": ""
},
"Musket": {
"name": "Mousquet",
"description": ""
},
"Neighborhood knowledge": {
"name": "Connaissance du quartier",
"description": ""
},
"Opera": {
"name": "Opéra",
"description": ""
},
"Organ": {
"name": "Orgue",
"description": ""
},
"Painting": {
"name": "Peinture",
"description": ""
},
"Pharmacology": {
"name": "Pharmacologie",
"description": ""
},
"Playwriting": {
"name": "Ecriture théâtrale",
"description": ""
},
"Pottery": {
"name": "Poterie",
"description": ""
},
"Rapier": {
"name": "Rapière",
"description": ""
},
"Religion": {
"name": "Religion",
"description": ""
},
"Rhetoric": {
"name": "Rhétorique",
"description": ""
},
"Running": {
"name": "Courir",
"description": "<p>Le personnage peut courir vite et longtemps.</p>"
},
"Sculpture": {
"name": "Sculpture",
"description": ""
},
"Sleight of hand": {
"name": "Escamoter",
"description": ""
},
"Sling": {
"name": "Fronde",
"description": ""
},
"Spear": {
"name": "Lance",
"description": ""
},
"Spreading false information": {
"name": "Propager de fausses informations",
"description": ""
},
"Strangling": {
"name": "Etrangler",
"description": ""
},
"Streetcar": {
"name": "Tramway",
"description": ""
},
"Surgery": {
"name": "Chirurgie",
"description": ""
},
"Swordstick": {
"name": "Canne-épée",
"description": ""
},
"Theater": {
"name": "Théâtre",
"description": ""
},
"Thermal": {
"name": "Thermique",
"description": ""
},
"Threatening": {
"name": "Menacer",
"description": ""
},
"Throwing knife": {
"name": "Couteau de lancer",
"description": ""
},
"Traverse architecture": {
"name": "Architecture des traverses",
"description": ""
},
"Traverse geography": {
"name": "Géographie des traverses",
"description": ""
},
"Traverse History": {
"name": "Histoire des traverses",
"description": ""
},
"Traverse mapmaking": {
"name": "Cartographie des traverses",
"description": ""
},
"Traverse mythology": {
"name": "Mythologie des traverses",
"description": ""
},
"Traverse sociology": {
"name": "Socilogie des traverses",
"description": ""
},
"Traverser flute": {
"name": "Flute des traverses",
"description": ""
},
"Tripping": {
"name": "Croc-en-jambe",
"description": ""
},
"Wind power": {
"name": "Eolien",
"description": ""
},
"Wrestling": {
"name": "Lutte",
"description": ""
},
"Writing": {
"name": "Ecriture",
"description": ""
}
}
}

View File

@ -0,0 +1,104 @@
{
"label": "Traits",
"mapping": {
"description": "system.description"
},
"entries": {
"Ability to stay calm": {
"name": "Facilité à rester calme",
"description": ""
},
"Comfortable on airships": {
"name": "A l'aise en dirigeable",
"description": ""
},
"Comfortable using a mapmaker's helmet": {
"name": "Virtuose du casque de cartographe",
"description": ""
},
"Comfortable walking on stilts": {
"name": "A l'aise en échasses",
"description": ""
},
"Cultured": {
"name": "Cultivé",
"description": ""
},
"Deaf": {
"name": "Sourd",
"description": "<p>Le personnage a grandi dans une usine, et le vacarme permanent des machines l'a rendu sourd. (-3).</p>"
},
"Disregard for death": {
"name": "Ne craint pas la mort",
"description": ""
},
"Excellent glider pilot": {
"name": "Excellent pilote de cerf-volant",
"description": ""
},
"Extremely good eyesight": {
"name": "Excellente vue",
"description": "<p>La vue de ce personnage est si développée qu'elle lui permet de &ldquo;lire&rdquo; les disques&nbsp;</p>"
},
"Famous with (...)": {
"name": "Connu dans le milieu des (...)",
"description": ""
},
"Foremimes language": {
"name": "Connait le langage des contremimes",
"description": ""
},
"Guild member": {
"name": "Membre de la guilde (...)",
"description": ""
},
"Guild member (high rank)": {
"name": "Membre de haut rang de la guilde (...)",
"description": ""
},
"Intuitively feels the damage on their vehicle": {
"name": "Sent intuitivement les dommages sur son véhicule",
"description": ""
},
"Keen intellect": {
"name": "Intellect affûté",
"description": ""
},
"Knowledge of upper classes of their city": {
"name": "Connaissance des classes huppées de la ville (...)",
"description": ""
},
"Knows how to encircle a target": {
"name": "Sait encercler une cible",
"description": ""
},
"Lipreading": {
"name": "Lit sur les lèvres",
"description": ""
},
"Preacher": {
"name": "Prêcheur",
"description": ""
},
"Preacher (great)": {
"name": "Prêcheur (excellent)",
"description": ""
},
"Rational mind": {
"name": "Rationnel",
"description": ""
},
"Rich": {
"name": "Riche",
"description": ""
},
"Sharpshooter": {
"name": "Tireur d'élite",
"description": "<p>Le personnage sait tirer partie d'un fusil à lunette.</p>"
},
"Skilled with explosives": {
"name": "Manieur d'explosifs",
"description": ""
}
}
}