Compare commits

...

8 Commits

Author SHA1 Message Date
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
0551d7812f Fix rolls 2023-07-21 18:57:41 +02:00
debd401d58 Fix equipment 2023-07-20 17:34:49 +02:00
02b69c8602 Fix costs 2023-07-18 22:10:53 +02:00
fedf7e608e Fix costs 2023-07-18 22:07:55 +02:00
2b32fa885d Update Ecryme 2023-06-30 15:49:53 +02:00
46 changed files with 1226 additions and 66 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",
@ -123,7 +137,15 @@
"type": "Type",
"applyimpact": "Apply impact",
"applybonus": "Apply bonus",
"bonuspool": "Available bonuses"
"bonuspool": "Available bonuses",
"cephaly": "Cephaly",
"elegy": "Elegy",
"entelechy": "Entelechy",
"mekany": "Mekany",
"psyche": "Psyche",
"scoria": "Scoria",
"cephalydifficulty": "Set Cephaly difficulty",
"maneuvers": "Maneuvers"
}
}
}

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"
},
@ -123,7 +138,15 @@
"type": "Type",
"applyimpact": "Appliquer l'impact",
"applybonus": "Appliquer le bonus",
"bonuspool": "Bonus disponibles"
"bonuspool": "Bonus disponibles",
"cephaly": "Cephalie",
"elegy": "Elégie",
"entelechy": "Entéléchie",
"mekany": "Mekanë",
"psyche": "Psyché",
"scoria": "Scorie",
"cephalydifficulty": "Difficulté de la Céphalie",
"maneuvers": "Manoeuvres"
}
}
}

View File

@ -43,9 +43,12 @@ 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(),
cephalySkills: this.actor.getCephalySkills(),
subActors: duplicate(this.actor.getSubActors()),
description: await TextEditor.enrichHTML(this.object.system.description, { async: true }),
notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }),
@ -121,7 +124,11 @@ export class EcrymeActorSheet extends ActorSheet {
let categKey = $(event.currentTarget).data("category-key")
let skillKey = $(event.currentTarget).data("skill-key")
this.actor.rollSkillConfront(categKey, skillKey)
});
});
html.find('.roll-cephaly').click((event) => {
let skillKey = $(event.currentTarget).data("skill-key")
this.actor.rollCephalySkillConfront(skillKey)
});
html.find('.roll-weapon-confront').click((event) => {
const li = $(event.currentTarget).parents(".item")
let weaponId = li.data("item-id");

View File

@ -109,6 +109,11 @@ export class EcrymeActor extends Actor {
return skills
}
/* -------------------------------------------- */
getCephalySkills() {
let skills = duplicate(this.system.cephaly.skilllist)
return skills
}
/* -------------------------------------------- */
getImpacts() {
let comp = duplicate(this.items.filter(item => item.type == 'impact') || [])
return comp;
@ -119,6 +124,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);
@ -323,7 +333,7 @@ export class EcrymeActor extends Actor {
/* -------------------------------------------- */
getCommonRollData() {
this.system.internals.confrontbonus = 5 // TO BE REMOVED!!!!
//this.system.internals.confrontbonus = 5 // TO BE REMOVED!!!!
let rollData = EcrymeUtility.getBasicRollData()
rollData.alias = this.name
rollData.actorImg = this.img
@ -371,10 +381,30 @@ export class EcrymeActor extends Actor {
rollData.executionTotal = rollData.skill.value
rollData.preservationTotal = rollData.skill.value
rollData.applyTranscendence = "execution"
rollData.traitsBonus = duplicate(rollData.traits)
rollData.traitsMalus = duplicate(rollData.traits)
let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData)
confrontStartDialog.render(true)
}
/* -------------------------------------------- */
async rollCephalySkillConfront(skillKey) {
let rollData = this.getCommonRollData()
rollData.mode = "cephaly"
rollData.skill = duplicate(this.system.cephaly.skilllist[skillKey])
rollData.img = rollData.skill.img
rollData.skill.categKey = "cephaly"
rollData.skill.skillKey = skillKey
//rollData.impactMalus = this.getImpactMalus(categKey)
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

@ -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"),
@ -76,6 +104,12 @@ export class EcrymeUtility {
}
/*-------------------------------------------- */
static hasCephaly() {
let level = game.settings.get("fvtt-ecryme", "ecryme-game-level")
return level != "level_e"
}
/*-------------------------------------------- */
static buildSkillConfig() {
game.system.ecryme.config.skills = {}
@ -135,10 +169,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)
@ -147,7 +181,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)
@ -161,8 +195,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
@ -170,7 +204,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
}
@ -182,6 +216,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) {
@ -237,21 +292,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

@ -54,6 +54,25 @@ export class EcrymeConfrontDialog extends Dialog {
msg.setFlag("world", "ecryme-rolldata", this.rollData)
}
/* -------------------------------------------- */
async refreshDice() {
this.rollData.filter = "execution"
let content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs", this.rollData )
content += await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData )
$("#confront-execution").html(content)
this.rollData.filter = "preservation"
content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs", this.rollData )
content += await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData )
$("#confront-preservation").html(content)
this.rollData.filter = "mainpool"
content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs", this.rollData )
$("#confront-dice-pool").html(content)
content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData )
$("#confront-bonus-pool").html(content)
}
/* -------------------------------------------- */
async refreshDialog() {
const content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/confront-dialog.hbs", this.rollData)
@ -69,7 +88,7 @@ export class EcrymeConfrontDialog extends Dialog {
super._onDragStart(event)
let dragType = $(event.srcElement).data("drag-type")
let diceData = {}
console.log("DRAGTYPE", dragType)
//console.log("DRAGTYPE", dragType)
if (dragType == "dice") {
diceData = {
dragType: "dice",
@ -157,43 +176,45 @@ export class EcrymeConfrontDialog extends Dialog {
rollData.preservationTotal = rollData.confrontBonus.filter(d => d.location == "preservation").reduce((previous, current) => {
return previous + 1
}, rollData.preservationTotal)
this.processTranscendence()
if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) {
rollData.spec = duplicate(actor.getSpecialization(rollData.selectedSpecs[0]))
this.rollData.executionTotal += "+2"
this.rollData.preservationTotal += "+2"
rollData.spec = duplicate(actor.getSpecialization(rollData.selectedSpecs[0]))
rollData.specApplied = true
rollData.executionTotal += 2
rollData.preservationTotal += 2
}
if ( rollData.specApplied && rollData.selectedSpecs.length == 0) {
rollData.spec = undefined
rollData.specApplied = false
}
rollData.bonusMalusTraits = 0
for (let t of rollData.traits) {
t.isBonus = false
t.isMalus = false
for (let t of rollData.traitsBonus) {
t.activated = false
}
if (rollData.traitsBonus && rollData.traitsBonus.length > 0) {
rollData.traitsBonusList = []
for (let id of rollData.traitsBonus) {
let trait = rollData.traits.find(t => t._id == id)
trait.isBonus = true
rollData.traitsBonusList.push(trait)
for (let t of rollData.traitsMalus) {
t.activated = false
}
if (rollData.traitsBonusSelected && rollData.traitsBonusSelected.length > 0) {
for (let id of rollData.traitsBonusSelected) {
let trait = rollData.traitsBonus.find(t => t._id == id)
trait.activated = true
rollData.bonusMalusTraits += trait.system.level
}
}
if (rollData.traitsMalus && rollData.traitsMalus.length > 0) {
rollData.traitsMalusList = []
for (let id of rollData.traitsMalus) {
let trait = rollData.traits.find(t => t._id == id)
trait.isMalus = true
rollData.traitsMalusList.push(trait)
if (rollData.traitsMalusSelected && rollData.traitsMalusSelected.length > 0) {
for (let id of rollData.traitsMalusSelected) {
let trait = rollData.traitsMalus.find(t => t._id == id)
trait.activated = true
rollData.bonusMalusTraits -= trait.system.level
}
}
rollData.executionTotal += rollData.bonusMalusTraits
rollData.executionTotal += rollData.bonusMalusPerso
rollData.preservationTotal += rollData.bonusMalusTraits
rollData.preservationTotal += rollData.bonusMalusPerso
rollData.executionTotal += rollData.bonusMalusTraits + rollData.bonusMalusPerso
rollData.preservationTotal += rollData.bonusMalusTraits + rollData.bonusMalusPerso
this.refreshDialog().catch("Error on refresh confrontation dialog")
this.refreshDialog()
}
/* -------------------------------------------- */
@ -209,11 +230,11 @@ export class EcrymeConfrontDialog extends Dialog {
this.computeTotals()
})
html.find('#roll-trait-bonus').change((event) => {
this.rollData.traitsBonus = $('#roll-trait-bonus').val()
this.rollData.traitsBonusSelected = $('#roll-trait-bonus').val()
this.computeTotals()
})
html.find('#roll-trait-malus').change((event) => {
this.rollData.traitsMalus = $('#roll-trait-malus').val()
this.rollData.traitsMalusSelected = $('#roll-trait-malus').val()
this.computeTotals()
})
html.find('#roll-select-transcendence').change((event) => {

View File

@ -65,6 +65,9 @@ Hooks.once("init", async function () {
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-000010

0
packs/equipment/LOCK Normal file
View File

3
packs/equipment/LOG Normal file
View File

@ -0,0 +1,3 @@
2023/07/29-09:40:52.194999 7f95c2bff6c0 Recovering log #7
2023/07/29-09:40:52.214284 7f95c2bff6c0 Delete type=3 #4
2023/07/29-09:40:52.214320 7f95c2bff6c0 Delete type=0 #7

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

@ -0,0 +1,15 @@
2023/07/29-09:21:50.805512 7f95c13fc6c0 Recovering log #3
2023/07/29-09:21:50.805734 7f95c13fc6c0 Level-0 table #5: started
2023/07/29-09:21:50.827401 7f95c13fc6c0 Level-0 table #5: 26243 bytes OK
2023/07/29-09:21:50.938004 7f95c13fc6c0 Delete type=0 #3
2023/07/29-09:21:50.938074 7f95c13fc6c0 Delete type=3 #2
2023/07/29-09:40:48.262273 7f95c0bfb6c0 Level-0 table #8: started
2023/07/29-09:40:48.262287 7f95c0bfb6c0 Level-0 table #8: 0 bytes OK
2023/07/29-09:40:48.269214 7f95c0bfb6c0 Delete type=0 #6
2023/07/29-09:40:48.279470 7f95c0bfb6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at '!items!zs7krgXhDRndtqbl' @ 127 : 1
2023/07/29-09:40:48.279481 7f95c0bfb6c0 Compacting 1@0 + 0@1 files
2023/07/29-09:40:48.283626 7f95c0bfb6c0 Generated table #9@0: 174 keys, 26243 bytes
2023/07/29-09:40:48.283652 7f95c0bfb6c0 Compacted 1@0 + 0@1 files => 26243 bytes
2023/07/29-09:40:48.289868 7f95c0bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2023/07/29-09:40:48.289934 7f95c0bfb6c0 Delete type=2 #5
2023/07/29-09:40:48.296265 7f95c0bfb6c0 Manual compaction at level-0 from '!items!zs7krgXhDRndtqbl' @ 127 : 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-000010

0
packs/maneuvers/LOCK Normal file
View File

3
packs/maneuvers/LOG Normal file
View File

@ -0,0 +1,3 @@
2023/07/29-09:40:52.216200 7f95c2bff6c0 Recovering log #7
2023/07/29-09:40:52.237129 7f95c2bff6c0 Delete type=3 #4
2023/07/29-09:40:52.237181 7f95c2bff6c0 Delete type=0 #7

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

@ -0,0 +1,15 @@
2023/07/29-09:21:50.959485 7f95c2bff6c0 Recovering log #3
2023/07/29-09:21:50.959571 7f95c2bff6c0 Level-0 table #5: started
2023/07/29-09:21:50.995185 7f95c2bff6c0 Level-0 table #5: 9793 bytes OK
2023/07/29-09:21:51.096415 7f95c2bff6c0 Delete type=0 #3
2023/07/29-09:21:51.096494 7f95c2bff6c0 Delete type=3 #2
2023/07/29-09:40:48.296275 7f95c0bfb6c0 Level-0 table #8: started
2023/07/29-09:40:48.296293 7f95c0bfb6c0 Level-0 table #8: 0 bytes OK
2023/07/29-09:40:48.302965 7f95c0bfb6c0 Delete type=0 #6
2023/07/29-09:40:48.312703 7f95c0bfb6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at '!items!oSutlbe9wyBZccmf' @ 15 : 1
2023/07/29-09:40:48.312718 7f95c0bfb6c0 Compacting 1@0 + 0@1 files
2023/07/29-09:40:48.316507 7f95c0bfb6c0 Generated table #9@0: 15 keys, 6584 bytes
2023/07/29-09:40:48.316535 7f95c0bfb6c0 Compacted 1@0 + 0@1 files => 6584 bytes
2023/07/29-09:40:48.323224 7f95c0bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2023/07/29-09:40:48.323333 7f95c0bfb6c0 Delete type=2 #5
2023/07/29-09:40:48.323429 7f95c0bfb6c0 Manual compaction at level-0 from '!items!oSutlbe9wyBZccmf' @ 15 : 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-000010

View File

3
packs/specialisation/LOG Normal file
View File

@ -0,0 +1,3 @@
2023/07/29-09:40:52.194936 7f95c1bfd6c0 Recovering log #7
2023/07/29-09:40:52.211393 7f95c1bfd6c0 Delete type=3 #4
2023/07/29-09:40:52.211511 7f95c1bfd6c0 Delete type=0 #7

View File

@ -0,0 +1,15 @@
2023/07/29-09:21:50.805563 7f95c2bff6c0 Recovering log #3
2023/07/29-09:21:50.805808 7f95c2bff6c0 Level-0 table #5: started
2023/07/29-09:21:50.843484 7f95c2bff6c0 Level-0 table #5: 14920 bytes OK
2023/07/29-09:21:50.957433 7f95c2bff6c0 Delete type=0 #3
2023/07/29-09:21:50.957497 7f95c2bff6c0 Delete type=3 #2
2023/07/29-09:40:48.256475 7f95c0bfb6c0 Level-0 table #8: started
2023/07/29-09:40:48.256500 7f95c0bfb6c0 Level-0 table #8: 0 bytes OK
2023/07/29-09:40:48.262226 7f95c0bfb6c0 Delete type=0 #6
2023/07/29-09:40:48.269398 7f95c0bfb6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at '!items!yozTUjNuc2rEGjFK' @ 55 : 1
2023/07/29-09:40:48.269412 7f95c0bfb6c0 Compacting 1@0 + 0@1 files
2023/07/29-09:40:48.273371 7f95c0bfb6c0 Generated table #9@0: 113 keys, 14920 bytes
2023/07/29-09:40:48.273390 7f95c0bfb6c0 Compacted 1@0 + 0@1 files => 14920 bytes
2023/07/29-09:40:48.279249 7f95c0bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2023/07/29-09:40:48.279362 7f95c0bfb6c0 Delete type=2 #5
2023/07/29-09:40:48.296255 7f95c0bfb6c0 Manual compaction at level-0 from '!items!yozTUjNuc2rEGjFK' @ 55 : 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/000011.log Normal file
View File

1
packs/traits/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000010

0
packs/traits/LOCK Normal file
View File

3
packs/traits/LOG Normal file
View File

@ -0,0 +1,3 @@
2023/07/29-09:40:52.213843 7f95c1bfd6c0 Recovering log #7
2023/07/29-09:40:52.233833 7f95c1bfd6c0 Delete type=3 #4
2023/07/29-09:40:52.234058 7f95c1bfd6c0 Delete type=0 #7

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

@ -0,0 +1,15 @@
2023/07/29-09:21:50.940886 7f95c13fc6c0 Recovering log #3
2023/07/29-09:21:50.940981 7f95c13fc6c0 Level-0 table #5: started
2023/07/29-09:21:50.975963 7f95c13fc6c0 Level-0 table #5: 7833 bytes OK
2023/07/29-09:21:51.079915 7f95c13fc6c0 Delete type=0 #3
2023/07/29-09:21:51.079983 7f95c13fc6c0 Delete type=3 #2
2023/07/29-09:40:48.290005 7f95c0bfb6c0 Level-0 table #8: started
2023/07/29-09:40:48.290023 7f95c0bfb6c0 Level-0 table #8: 0 bytes OK
2023/07/29-09:40:48.296185 7f95c0bfb6c0 Delete type=0 #6
2023/07/29-09:40:48.303065 7f95c0bfb6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at '!items!zgNI2haxhBxBDBdl' @ 24 : 1
2023/07/29-09:40:48.303074 7f95c0bfb6c0 Compacting 1@0 + 0@1 files
2023/07/29-09:40:48.306318 7f95c0bfb6c0 Generated table #9@0: 25 keys, 3580 bytes
2023/07/29-09:40:48.306337 7f95c0bfb6c0 Compacted 1@0 + 0@1 files => 3580 bytes
2023/07/29-09:40:48.312428 7f95c0bfb6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2023/07/29-09:40:48.312551 7f95c0bfb6c0 Delete type=2 #5
2023/07/29-09:40:48.323419 7f95c0bfb6c0 Manual compaction at level-0 from '!items!zgNI2haxhBxBDBdl' @ 24 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -26,13 +26,60 @@
}
],
"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",
"compatibility": {
"minimum": "10",
"verified": "11",
"maximum": "11"
"verified": "11"
},
"id": "fvtt-ecryme",
"primaryTokenAttribute": "secondary.health",
@ -43,7 +90,7 @@
],
"title": "Ecryme, le Jeu de Rôles",
"url": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme",
"version": "11.0.3",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/archive/fvtt-ecryme-v10.0.0.zip",
"version": "11.0.9",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/archive/fvtt-ecryme-v11.0.9.zip",
"background": "systems/fvtt-ecryme/images/assets/ecryme_extract_panel_01.webp"
}

View File

@ -191,7 +191,7 @@
"annency",
"boheme",
"contact",
"confrontation"
"maneuver"
],
"templates": {
"common": {
@ -203,6 +203,11 @@
"costunit": ""
}
},
"maneuver": {
"templates": [
"common"
]
},
"confrontation": {
"templates": [
"common"

View File

@ -51,6 +51,9 @@
<a class="item" data-tab="competences">{{localize "ECRY.ui.skills"}}</a>
<a class="item" data-tab="traits">{{localize "ECRY.ui.traits"}}</a>
<a class="item" data-tab="combat">{{localize "ECRY.ui.healthcombat"}}</a>
{{#if hasCephaly}}
<a class="item" data-tab="cephaly">{{localize "ECRY.ui.cephaly"}}</a>
{{/if}}
<a class="item" data-tab="equipements">{{localize "ECRY.ui.equipment"}}</a>
<a class="item" data-tab="biodata">{{localize "ECRY.ui.bionotes"}}</a>
</nav>
@ -119,6 +122,34 @@
</div>
{{#if hasCephaly}}
{{!-- Cephaly Tab --}}
<div class="tab cephaly" data-group="primary" data-tab="cephaly">
<div>
<ul class="stat-list alternate-list item-list">
{{#each cephalySkills as |skill skillkey|}}
<li class="item flexrow list-item">
<span class="item-name-label-long">
<a class="roll-cephaly" data-category-key="cephaly" data-skill-key="{{skillkey}}">
<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 skill.value}}
{{#each @root.config.skillLevel as |level key| }}
<option value="{{level}}">{{level}}</option>
{{/each}}
{{/select}}
</select>
</li>
{{/each}}
</ul>
</div>
</div>
{{/if}}
<div class="tab traits" data-group="primary" data-tab="traits">
@ -195,6 +226,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,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

@ -11,10 +11,9 @@
<div class="flexrow">
<div>
<h3>{{localize "ECRY.ui.execution"}} : <span id="execution-total">{{executionTotal}}</span> </h3>
<h3>{{localize "ECRY.ui.execution"}} : <span id="execution-total">{{executionTotal}}</span> </h3>
<div id="confront-execution" class="flexrow confront-area confront-execution-area">
{{> systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs filter="execution"}}
<br>
{{> systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs filter="execution"}}
</div>
</div>
@ -73,20 +72,22 @@
</select>
</div>
{{#if skill.spec}}
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.spec"}} : </span>
<select class="" id="roll-specialization" data-type="String" multiple>
{{#each skill.spec as |spec idx|}}
<option value="{{spec.id}}">{{spec.name}}</option>
<option value="{{spec.id}}" {{#if (eq spec.name @root.spec.name)}}selected{{/if}}>{{spec.name}}</option>
{{/each}}
</select>
</div>
{{/if}}
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.traitbonus"}} : </span>
<select class="" id="roll-trait-bonus" data-type="String" multiple>
{{#each traits as | trait idx|}}
<option value="{{trait._id}}" {{#if trait.isBonus}}selected{{/if}}>{{trait.name}} ({{trait.system.level}})</option>
{{#each traitsBonus as |trait idx|}}
<option value="{{trait._id}}" {{#if trait.activated}}selected{{/if}}>{{trait.name}} ({{trait.system.level}})</option>
{{/each}}
</select>
</div>
@ -94,13 +95,12 @@
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.traitmalus"}} : </span>
<select class="" id="roll-trait-malus" data-type="String" multiple>
{{#each traits as | trait idx|}}
<option value="{{trait._id}}" {{#if trait.isMalus}}selected{{/if}}">{{trait.name}} ({{trait.system.level}})</option>
{{#each traitsMalus as |trait idx|}}
<option value="{{trait._id}}" {{#if trait.activated}}selected{{/if}}>{{trait.name}} ({{trait.system.level}})</option>
{{/each}}
</select>
</div>
<div class="flexrow">
<span class="roll-dialog-label">Bonus/Malus : </span>
<select id="bonusMalusPerso" name="bonusMalusPerso">

View File

@ -0,0 +1,25 @@
<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">
{{> systems/fvtt-ecryme/templates/items/partial-item-equipment.hbs}}
</div>
</div>
</section>
</form>

View File

@ -7,7 +7,7 @@
<li class="flexrow">
<label class="item-field-label-long">{{localize "ECRY.ui.cost"}}</label>
<input type="text" class="item-field-label-short" name="system.cost" value="{{system.cost}}" data-dtype="Number" />
<select class="item-field-label-medium" type="text" name="system.costunit" value="{{system.costunit}}" data-dtype="Number">
<select class="item-field-label-medium" type="text" name="system.costunit" value="{{system.costunit}}" data-dtype="String">
{{#select system.costunit}}
{{#each config.costUnits as |unit key| }}
<option value="{{key}}">{{localize unit.name}}</option>

View File

@ -0,0 +1,661 @@
{
"label": "Equipement",
"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": "Accordion",
"description": ""
},
"Airship": {
"name": "Airship",
"description": ""
},
"Animal skin parchment": {
"name": "Animal skin parchment",
"description": ""
},
"Automobile": {
"name": "Automobile",
"description": ""
},
"Axe": {
"name": "Axe",
"description": ""
},
"Bag": {
"name": "Bag",
"description": ""
},
"Ball of string": {
"name": "Ball of string",
"description": ""
},
"Bar of base metal (1 kg)": {
"name": "Bar of base metal (1 kg)",
"description": ""
},
"Bare hand": {
"name": "Bare hand",
"description": ""
},
"Barrel organ": {
"name": "Barrel organ",
"description": ""
},
"Battleaxe": {
"name": "Battleaxe",
"description": ""
},
"Beer (1 glass)": {
"name": "Beer (1 glass)",
"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": "Beet stein",
"description": ""
},
"Bicycle": {
"name": "Bicycle",
"description": ""
},
"Blacksmith's toolkit": {
"name": "Blacksmith's toolkit",
"description": ""
},
"Blanket": {
"name": "Blanket",
"description": ""
},
"Blowpipe": {
"name": "Blowpipe",
"description": ""
},
"Blunderbuss": {
"name": "Blunderbuss",
"description": ""
},
"Book (printed)": {
"name": "Book (printed)",
"description": ""
},
"Bow": {
"name": "Bow",
"description": ""
},
"Bower hat": {
"name": "Bower hat",
"description": ""
},
"Box camera": {
"name": "Box camera",
"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": "Brooch",
"description": ""
},
"Butter": {
"name": "Butter",
"description": ""
},
"Butterfly net": {
"name": "Butterfly net",
"description": ""
},
"Cake": {
"name": "Cake",
"description": ""
},
"Candle": {
"name": "Candle",
"description": ""
},
"Cane": {
"name": "Cane",
"description": ""
},
"Cape": {
"name": "Cape",
"description": ""
},
"Carriage": {
"name": "Carriage",
"description": ""
},
"Cestus": {
"name": "Cestus",
"description": ""
},
"Chain": {
"name": "Chain",
"description": ""
},
"Chain mail": {
"name": "Chain mail",
"description": ""
},
"Chestpplate": {
"name": "Chestpplate",
"description": ""
},
"Cigarettes": {
"name": "Cigarettes",
"description": ""
},
"Coffee, tea": {
"name": "Coffee, tea",
"description": ""
},
"Compass": {
"name": "Compass",
"description": ""
},
"Corset": {
"name": "Corset",
"description": ""
},
"Crowbar": {
"name": "Crowbar",
"description": ""
},
"Crude oil (1 l)": {
"name": "Crude oil (1 l)",
"description": ""
},
"Cudgel": {
"name": "Cudgel",
"description": ""
},
"Dagger": {
"name": "Dagger",
"description": ""
},
"Dirk": {
"name": "Dirk",
"description": ""
},
"Disk": {
"name": "Disk",
"description": ""
},
"Dissection kit": {
"name": "Dissection kit",
"description": ""
},
"Dress, skirt": {
"name": "Dress, skirt",
"description": ""
},
"Drum": {
"name": "Drum",
"description": ""
},
"Earrings (pair)": {
"name": "Earrings (pair)",
"description": ""
},
"Egg": {
"name": "Egg",
"description": ""
},
"Evening dress": {
"name": "Evening dress",
"description": ""
},
"Evening shirt": {
"name": "Evening shirt",
"description": ""
},
"Film": {
"name": "Film",
"description": ""
},
"Flail": {
"name": "Flail",
"description": ""
},
"Flat cap": {
"name": "Flat cap",
"description": ""
},
"Glasses": {
"name": "Glasses",
"description": ""
},
"Grappling hook": {
"name": "Grappling hook",
"description": ""
},
"Halberd": {
"name": "Halberd",
"description": ""
},
"Hammer and chisel": {
"name": "Hammer and chisel",
"description": ""
},
"Handbag": {
"name": "Handbag",
"description": ""
},
"Handheld crossbow": {
"name": "Handheld crossbow",
"description": ""
},
"Handheld lamp": {
"name": "Handheld lamp",
"description": ""
},
"Harpsichord": {
"name": "Harpsichord",
"description": ""
},
"High heels shoes": {
"name": "High heels shoes",
"description": ""
},
"Horse-drawn cart": {
"name": "Horse-drawn cart",
"description": ""
},
"Hot air balloon": {
"name": "Hot air balloon",
"description": ""
},
"Illustrated manuscript (cheap)": {
"name": "Illustrated manuscript (cheap)",
"description": ""
},
"Illustrated manuscript (rich)": {
"name": "Illustrated manuscript (rich)",
"description": ""
},
"Improvised weapon": {
"name": "Improvised weapon",
"description": ""
},
"Inkpot": {
"name": "Inkpot",
"description": ""
},
"Iron flask": {
"name": "Iron flask",
"description": ""
},
"Jar (glass)": {
"name": "Jar (glass)",
"description": ""
},
"Jaw harp": {
"name": "Jaw harp",
"description": ""
},
"Kettle": {
"name": "Kettle",
"description": ""
},
"Knife": {
"name": "Knife",
"description": ""
},
"Lamp oil": {
"name": "Lamp oil",
"description": ""
},
"Lantern": {
"name": "Lantern",
"description": ""
},
"Leather boots (pair)": {
"name": "Leather boots (pair)",
"description": ""
},
"Leather chest piece": {
"name": "Leather chest piece",
"description": ""
},
"Leather overcoat": {
"name": "Leather overcoat",
"description": ""
},
"Lighter": {
"name": "Lighter",
"description": ""
},
"Loaf of bread": {
"name": "Loaf of bread",
"description": ""
},
"Log": {
"name": "Log",
"description": ""
},
"Lute": {
"name": "Lute",
"description": ""
},
"Lyre": {
"name": "Lyre",
"description": ""
},
"Mace": {
"name": "Mace",
"description": ""
},
"Magnifying glass": {
"name": "Magnifying glass",
"description": ""
},
"Mander parchment": {
"name": "Mander parchment",
"description": ""
},
"Mandolin": {
"name": "Mandolin",
"description": ""
},
"Meat (beef, horse, chicken)": {
"name": "Meat (beef, horse, chicken)",
"description": ""
},
"Meat (fullige, snake, pigeon) (Copy)": {
"name": "Meat (fullige, snake, pigeon) (Copy)",
"description": ""
},
"Meat (rat)": {
"name": "Meat (rat)",
"description": ""
},
"Messenger bag": {
"name": "Messenger bag",
"description": ""
},
"Metal crossbow": {
"name": "Metal crossbow",
"description": ""
},
"Metal cutlery": {
"name": "Metal cutlery",
"description": ""
},
"Metal plaque": {
"name": "Metal plaque",
"description": "<p>+8 coins as deposit</p>"
},
"Mushroom bread": {
"name": "Mushroom bread",
"description": ""
},
"Mushroom spirit": {
"name": "Mushroom spirit",
"description": "<p>A 5 pence deposit is paid for bottles. This sum is paid back if the empty bottle is returned.</p>"
},
"Musical saw": {
"name": "Musical saw",
"description": ""
},
"Musket": {
"name": "Musket",
"description": ""
},
"Necklace": {
"name": "Necklace",
"description": ""
},
"Organ": {
"name": "Organ",
"description": ""
},
"Overcoat": {
"name": "Overcoat",
"description": ""
},
"Pack of cards": {
"name": "Pack of cards",
"description": ""
},
"Petticoat": {
"name": "Petticoat",
"description": ""
},
"Phonographic recorder": {
"name": "Phonographic recorder",
"description": ""
},
"Pike": {
"name": "Pike",
"description": ""
},
"Pistol": {
"name": "Pistol",
"description": ""
},
"Pocket watch": {
"name": "Pocket watch",
"description": ""
},
"Poor quality stilts": {
"name": "Poor quality stilts",
"description": ""
},
"Port, wine": {
"name": "Port, wine",
"description": "<p>A 5 pence deposit is paid for bottles. This sum is paid back if the empty bottle is returned.</p>"
},
"Portable first aid kit": {
"name": "Portable first aid kit",
"description": ""
},
"Portable phonographic recorder": {
"name": "Portable phonographic recorder",
"description": ""
},
"Portable stove": {
"name": "Portable stove",
"description": ""
},
"Pot of jam": {
"name": "Pot of jam",
"description": ""
},
"Quill": {
"name": "Quill",
"description": ""
},
"Rapier": {
"name": "Rapier",
"description": ""
},
"Razor blade": {
"name": "Razor blade",
"description": ""
},
"Recorder": {
"name": "Recorder",
"description": ""
},
"Revolver": {
"name": "Revolver",
"description": ""
},
"Riding boots (pair)": {
"name": "Riding boots (pair)",
"description": ""
},
"Ring": {
"name": "Ring",
"description": ""
},
"Rope (hemp)": {
"name": "Rope (hemp)",
"description": ""
},
"Rum": {
"name": "Rum",
"description": "<p>A 5 pence deposit is paid for bottles. This sum is paid back if the empty bottle is returned.</p>"
},
"Scarf, shawl": {
"name": "Scarf, shawl",
"description": ""
},
"Shoes": {
"name": "Shoes",
"description": ""
},
"Sighted rifle": {
"name": "Sighted rifle",
"description": ""
},
"Silk stockings": {
"name": "Silk stockings",
"description": ""
},
"Silver bar": {
"name": "Silver bar",
"description": ""
},
"Skis": {
"name": "Skis",
"description": ""
},
"Sleeping bag": {
"name": "Sleeping bag",
"description": ""
},
"Sling": {
"name": "Sling",
"description": ""
},
"Soft brimmed hat": {
"name": "Soft brimmed hat",
"description": ""
},
"Spear": {
"name": "Spear",
"description": ""
},
"Spirit": {
"name": "Spirit",
"description": "<p>A 5 pence deposit is paid for bottles. This sum is paid back if the empty bottle is returned.</p>"
},
"Staff": {
"name": "Staff",
"description": ""
},
"Stylus for wax plaque": {
"name": "Stylus for wax plaque",
"description": ""
},
"Sword": {
"name": "Sword",
"description": ""
},
"Tambourine": {
"name": "Tambourine",
"description": ""
},
"Telescope": {
"name": "Telescope",
"description": ""
},
"Telescopic stilts": {
"name": "Telescopic stilts",
"description": ""
},
"Thief's toolkit": {
"name": "Thief's toolkit",
"description": ""
},
"Top hat": {
"name": "Top hat",
"description": ""
},
"Torch": {
"name": "Torch",
"description": ""
},
"Train (locomotive)": {
"name": "Train (locomotive)",
"description": ""
},
"Train (wagons)": {
"name": "Train (wagons)",
"description": ""
},
"Trumpet": {
"name": "Trumpet",
"description": ""
},
"Truncheon": {
"name": "Truncheon",
"description": ""
},
"Underwear": {
"name": "Underwear",
"description": ""
},
"Uniform": {
"name": "Uniform",
"description": ""
},
"Viol": {
"name": "Viol",
"description": ""
},
"Violin": {
"name": "Violin",
"description": ""
},
"Walking stick": {
"name": "Walking stick",
"description": ""
},
"Watch": {
"name": "Watch",
"description": ""
},
"Wax plaque": {
"name": "Wax plaque",
"description": "<p>+3 coins as deposit</p>"
},
"Whiskey": {
"name": "Whiskey",
"description": "<p>A 5 pence deposit is paid for bottles. This sum is paid back if the empty bottle is returned.</p>"
},
"Whistle": {
"name": "Whistle",
"description": ""
},
"White shirt": {
"name": "White shirt",
"description": ""
},
"Wooden crossbow": {
"name": "Wooden crossbow",
"description": ""
},
"Wooden sedan chair": {
"name": "Wooden sedan chair",
"description": ""
},
"Wooden trunk": {
"name": "Wooden trunk",
"description": ""
},
"Writing material": {
"name": "Writing material",
"description": ""
}
}
}

View File

@ -0,0 +1,65 @@
{
"label": "Manoeuvres",
"entries": {
"Coup de Jarnac": {
"name": "Coup de Jarnac",
"description": "<p>Execution Margin of 4</p>\n<p>This is a violent, treacherous, and wicked blow made famous by Guy Chabot de Jarnac, who used it for the first time in a judiciary duel in Aeolus in 954. It involves wounding the opponent&rsquo;s leg or Achilles tendon, which prevents them from being able to move normally. As well as the Impact, the victim also receives the Trait: <em>Lame -1</em>.</p>"
},
"Doesnt even hurt": {
"name": "Doesnt even hurt",
"description": "<p>Through breathing control and unshakable willpower, the combatant learns to ignore their injuries. Not only do they not receive any penalty from Impacts inflicted upon them, but even better, those Impacts allow them to unlock their inner strength and become bonuses. Therefore, instead of suffering from a penalty of -4 for a major Impact, the character receives a bonus of +4. they may surpass the Margin limit set by their Skill level.</p>"
},
"Double impact": {
"name": "Double impact",
"description": "<p>Aggressive</p>\n<p>Two weapons needed</p>\n<p>This technique requires extreme speed on the user&rsquo;s part, increasing the number of attacks they can deliver. In a single exchange of blows, they can inflict an Impact twice (two serious Impacts rather than one for example). However, this can turn against them and be very dangerous, since due to their excessive aggressiveness, the character exposes themself. They also suffer from double Impacts.</p>"
},
"It's the winning, not the taking part that counts": {
"name": "It's the winning, not the taking part that counts",
"description": "<p>Impossible to use this technique in a duel</p>\n<p>The sword fighter has learned to take advantage of all situations, by prioritizing efficiency over style. They use whatever they have at hand to gain an advantage. Any improvised weapon they use has an Effect of +3, but breaks after use.</p>"
},
"Perforation": {
"name": "Perforation",
"description": "<p>This maneuver is particularly favored on stitch estates where it is still common to wear armor. The sword fighter uses a precise blow to target the weak point of their opponent&rsquo;s protection and runs through it, discarding any bonus granted by the armor.</p>"
},
"Point blank": {
"name": "Point blank",
"description": "<p>Requires <em>Musket</em> Specialization</p>\n<p>The combatant is a martial artist able to use their musket in close range combat. In a single exchange of blows, they can deliver a bayonet blow (Effect of a dagger) and fire with the musket (Effect of a firearm).</p>"
},
"Ribbon Dance": {
"name": "Ribbon Dance",
"description": "<p>Aggressive</p>\n<p>Requires a Specialization with a non rigid weapon (whip, chain, flail, ribbons lined with lead or metal blades), succeeding one&rsquo;s Preservation test, and enough space to fight&ndash;By spinning around with long, skilled movements, the combatant creates a deadly rotating sphere around themself. they can then add their Preservation Margin to their Execution Margin 2 points at a time. The Execution Margin then causes many superficial injuries (1 for each Margin of 2).</p>"
},
"The Chimeric Defense": {
"name": "The Chimeric Defense",
"description": "<p>&ldquo;Defensive moves only&rdquo;&ndash;by blocks of 2&ndash;</p>\n<p>To successfully carry out this maneuver, the character must obtain a Margin of at least 4 in both Execution and Preservation. If it succeeds, it allows the character to add all or part of their Preservation Margin to their Execution Margin in blocks of 2. while dodging or parrying the defender simultaneously lands a blow with a limb, an improvised weapon, or a shield etc. This requires tactical thinking, because using this technique weakens Preservation. The combattant may exceed the normal Margin limit set by Skill level.</p>"
},
"The Dead mans Hold": {
"name": "The Dead mans Hold",
"description": "<p>The sword fighter allows themself to take attacks by opting for a low Preservation score. By accepting these Impacts, they can take advantage of their opponent&rsquo;s lowered guard to inflict identical damage on them, in addition to normal damage inflicted during that turn, for a total which can surpass the normal Margin limit set by their Skill level.</p>"
},
"The jeering master": {
"name": "The jeering master",
"description": "<p>This technique can be used to provoke the opponent, and even humiliate them, before finishing them off. Using mockery, the combattant forces the opponent to use their highest score in Execution, which greatly reduces their Preservation (for minor characters, it becomes +4/-4 by default).</p>"
},
"The Madmans step": {
"name": "The Madmans step",
"description": "<p>Rojo style is not taught in judi-duelist schools, but in traverser caravans. The sword fighter employs a style made up of erratic and unpredictable movements that disorient the opponent and make the user difficult to touch. The swordfighter adds +4 to their Preservation and can surpass the normal Margin limit set by their Skill level.</p>"
},
"The Nevers Attack": {
"name": "The Nevers Attack",
"description": "<p>Execution Margin of 4 and the opponent&rsquo;s head must be unprotected</p>\n<p>Invented by Parisian swordfighter Philippe de Nevers, this attack requires extreme precision but is absolutely devastating. If it succeeds, the user eliminates their opponent instantly by inflicting an injury between their eyes (equivalent to a major Impact).</p>"
},
"The partner switch": {
"name": "The partner switch",
"description": "<p>This technique can be used by a sword fighter facing multiple opponents. The attacker can include an extra target at the last second (before Effects are calculated). They may ask the storyteller to direct the attack on a character within range of their blade or choose the opponent with the highest or lowest Preservation score. The swordfighter&rsquo;s own Preservation score applies to both of the targeted opponents.</p>"
},
"The Scarlet Dance": {
"name": "The Scarlet Dance",
"description": "<p>This move was invented by the duelist Bramon of Aeolus. The nemesis of Marcel Rubempr&eacute;, and fencing instructor for the old nobility before they were chased out onto the traverses, Bramon&rsquo;s technique became legendary during the industrial revolution. It is a combination of dance steps, thrusts, and slashes. The swordfighter lets themself be taken away by their own inner music, and enters into a trance like state which allows them to add their <em>Athletics </em>score to the Effect. They can exceed the normal Margin limit set by their Skill level.</p>"
},
"Two-handed attack": {
"name": "Two-handed attack",
"description": "<p>Blow delivered with both hands grasping the sword's hilt, Execution score higher than one&rsquo;s Preservation score required&ndash;The combatant &nbsp;strikes with all their strength to break through the opponent&rsquo;s defense. This move allows characters to replace the Effect with their <em>Athletics</em> score.</p>"
}
}
}