Compare commits

..

8 Commits

220 changed files with 1416 additions and 2011 deletions

View File

@ -803,6 +803,18 @@ body.system-bol img#logo {
max-width: calc(250px - 10px); max-width: calc(250px - 10px);
margin-right: 10px; margin-right: 10px;
} }
.sheet-profile-img {
cursor: pointer;
border: none;
background-color: #EEE;
height: auto;
width: 96px;
height: 96px;
min-width: 96px;
min-height: 96px;
max-width: 96px;
margin-right: 10px;
}
.bol.sheet.actor .window-content form .main .sheet-body { .bol.sheet.actor .window-content form .main .sheet-body {
overflow: hidden; overflow: hidden;
} }
@ -937,6 +949,7 @@ body.system-bol img#logo {
min-height: 400px; min-height: 400px;
} }
.bol.sheet.item h1 input.itemname { .bol.sheet.item h1 input.itemname {
margin-top: 32px;
font-family: "Wolfsbane2Expanded", cursive; font-family: "Wolfsbane2Expanded", cursive;
} }
.bol.sheet.item .item-properties { .bol.sheet.item .item-properties {
@ -1051,9 +1064,10 @@ body.system-bol img#logo {
.tokenhudext.right2 { .tokenhudext.right2 {
justify-content: flex-start; justify-content: flex-start;
flex-direction: column; flex-direction: column;
transform: translate(0, -30%);
position: absolute; position: absolute;
top: -4rem; top: -4rem;
left: 12rem; left: -12rem;
} }
.control-icon.tokenhudicon { .control-icon.tokenhudicon {
width: fit-content; width: fit-content;

View File

@ -1,10 +1,18 @@
{ {
"ACTOR.TypeCharacter": "Character", "TYPES": {
"ACTOR.TypeEncounter": "Encounter", "Actor": {
"ITEM.TypeItem": "Item", "character": "PC",
"ITEM.TypeFeature": "Feature", "encounter": "NPC",
"ITEM.TypeWeapon": "Weapon", "npc": "NPC",
"ITEM.TypeArmor": "Armor", "vehicle": "Vehicle"
},
"Item": {
"item": "Object",
"feature": "Trait",
"weapon": "Weapon",
"armure": "Armor"
}
},
"BOL.attributes.vigor": "Strength", "BOL.attributes.vigor": "Strength",
"BOL.attributes.halfvigor" : "Half-Strength", "BOL.attributes.halfvigor" : "Half-Strength",
@ -46,6 +54,9 @@
"BOL.ui.horoscopesMalus": "Horoscopes (Malus)", "BOL.ui.horoscopesMalus": "Horoscopes (Malus)",
"BOL.ui.groupHoroscope": "Horoscrope de Groupe de ", "BOL.ui.groupHoroscope": "Horoscrope de Groupe de ",
"BOL.ui.rabble": "Rabble",
"BOL.ui.tough": "Tough",
"BOL.ui.villain": "Villain",
"BOL.ui.properties": "Properties", "BOL.ui.properties": "Properties",
"BOL.ui.description": "Description", "BOL.ui.description": "Description",
"BOL.ui.actions": "Actions", "BOL.ui.actions": "Actions",
@ -164,11 +175,52 @@
"BOL.ui.armorAgiMalus": "Armor+Shield Modifier (Agi)", "BOL.ui.armorAgiMalus": "Armor+Shield Modifier (Agi)",
"BOL.ui.armorInitMalus": "Armor Modifier (Init)", "BOL.ui.armorInitMalus": "Armor Modifier (Init)",
"BOL.ui.attackValue": "Attack Value", "BOL.ui.attackValue": "Attack Value",
"BOL.ui.attackModifier": "Attack Modifier",
"BOL.ui.weaponbonus": "Cette arme bénéficie déja d'un Dé de Bonus (Arme Favorite prise en compte, par exemple)", "BOL.ui.weaponbonus": "Cette arme bénéficie déja d'un Dé de Bonus (Arme Favorite prise en compte, par exemple)",
"BOL.ui.initMalus": "Init malus", "BOL.ui.initMalus": "Init malus",
"BOL.ui.isspecial": "Spécial ?", "BOL.ui.creature": "Creature",
"BOL.ui.createEquipment": "Create Equipment", "BOL.ui.undead": "Undead",
"BOL.ui.daemon": "Daemon",
"BOL.ui.attributaptitude": "Attribut ou Aptitude",
"BOL.ui.always": "Tout les jets (ie toujours)",
"BOL.ui.effectbonusmalus": "Bonus ou Malus à appliquer",
"BOL.ui.boleffects": "Effects (automatic)",
"BOL.ui.modifier": "Modifier",
"BOL.ui.effects": "Ongoing effects",
"BOL.ui.pcname": "PCs",
"BOL.ui.npcname": "NPCs",
"BOL.ui.pclistbutton": "Compact view",
"BOL.ui.noactorfound": "Unknown NPC. The NPC must be known in the world to be displayed here.",
"BOL.ui.deletetitle": "Delete",
"BOL.ui.confirmdelete": "Are you sure to delete this item ?",
"BOL.ui.nomorealchemypoints": "No more Creation Point !",
"BOL.ui.armornoformula": "The Armor {protect.name} has no protection formula !",
"BOL.ui.selectactor": "Select the actors to apply the macro",
"BOL.ui.itemnotfound": "Impossible to find the object of this macro",
"BOL.ui.noinit": "No initiative recorded. Roll initiative from the actor's sheet.",
"BOL.ui.warninitiative": "No available initiative. Roll Initiative for this combat.",
"BOL.ui.isspecial": "Special ?",
"BOL.ui.createEquipment": "Create an equipment",
"BOL.ui.astrology": "Astrology and Horoscope",
"BOL.ui.astrologyMinor": "Build a Minor Horoscope",
"BOL.ui.astrologyMajor": "Build a Major Horoscope",
"BOL.ui.astrologyMajorGroup": "Build a Major Group Horoscope",
"BOL.ui.makeHoroscope": "Build a Horoscope",
"BOL.ui.astrologerRank": "Astrologer Rank",
"BOL.ui.horoscopeCost": "Astrology Points cost",
"BOL.ui.minor": "Minor",
"BOL.ui.major": "Major",
"BOL.ui.majorgroup": "Group Major",
"BOL.ui.horoscopeGroup": "Group Horoscope",
"BOL.ui.horoscopeDiceRemaining": "Remaining Dice",
"BOL.ui.horoscopeDiceMax": "Max Dice",
"BOL.ui.astrologyNoPoints": "You do not have enough Astrology Points!",
"BOL.ui.newEquipment": "New equipment",
"BOL.ui.newNaturalWeapon": "Natural weapon",
"BOL.ui.newNaturalProtection": "Natural protection",
"BOL.ui.createNaturalWeapon": "Create a natural weapon",
"BOL.ui.createNaturalProtection": "Create a natural protection",
"BOL.featureCategory.origins": "Origins", "BOL.featureCategory.origins": "Origins",
"BOL.featureCategory.races": "Races", "BOL.featureCategory.races": "Races",
"BOL.featureCategory.careers": "Careers", "BOL.featureCategory.careers": "Careers",
@ -185,6 +237,11 @@
"BOL.featureSubtypes.language": "Language", "BOL.featureSubtypes.language": "Language",
"BOL.featureSubtypes.gods": "Faith & Gods", "BOL.featureSubtypes.gods": "Faith & Gods",
"BOL.featureSubtypes.fightOption": "Combat Option", "BOL.featureSubtypes.fightOption": "Combat Option",
"BOL.featureSubtypes.effect": "Effect",
"BOL.featureSubtypes.effects": "Effects",
"BOL.featureSubtypes.boleffect": "Effect",
"BOL.featureSubtypes.horoscope": "Horoscope",
"BOL.featureSubtypes.xplog": "XP Journal",
"BOL.bougette.nomoney": "Nothing", "BOL.bougette.nomoney": "Nothing",
"BOL.bougette.tolive": "To live", "BOL.bougette.tolive": "To live",
@ -209,6 +266,7 @@
"BOL.itemCategory.other": "Other", "BOL.itemCategory.other": "Other",
"BOL.itemCategory.capacity" : "Capacity", "BOL.itemCategory.capacity" : "Capacity",
"BOL.itemCategory.alchemy": "Alchemy", "BOL.itemCategory.alchemy": "Alchemy",
"BOL.itemCategory.vehicleweapon": "Vehicle weapon",
"BOL.combatCategory.protections": "Protections", "BOL.combatCategory.protections": "Protections",
"BOL.combatCategory.shields": "Shields", "BOL.combatCategory.shields": "Shields",
@ -413,6 +471,7 @@
"BOL.chat.applydamagetotarget": "Apply damages to the target", "BOL.chat.applydamagetotarget": "Apply damages to the target",
"BOL.chat.fightoption": "Combat options", "BOL.chat.fightoption": "Combat options",
"BOL.chat.reroll": "Reroll (1 HP)", "BOL.chat.reroll": "Reroll (1 HP)",
"BOL.chat.heroicreminder": "In addition of the actions below, you can : <ul><li>Carnage : Do a second free attack on the same opponent</li><li>Precise : 1 Malus Die on your opponent on a chosen location</li><li>Disarm</li><li>Rabble Massacre</li><li>Prone : Push your opponent on the ground (max +1 size)</li></ul>If you spent 1 Hero Point in addition, all these effects can be doubled.",
"BOL.chat.toheroic": "Convert to Mighty success (1 HP)", "BOL.chat.toheroic": "Convert to Mighty success (1 HP)",
"BOL.chat.tolegend": "Convert to Legendary succes (1 HP)", "BOL.chat.tolegend": "Convert to Legendary succes (1 HP)",
"BOL.chat.hurttitle": "{name} is going to receive {damageTotal} damages !", "BOL.chat.hurttitle": "{name} is going to receive {damageTotal} damages !",
@ -430,6 +489,48 @@
"BOL.chat.spell": "Spell", "BOL.chat.spell": "Spell",
"BOL.chat.spellcost": "Power Points cost", "BOL.chat.spellcost": "Power Points cost",
"BOL.chat.spellremaining": "Remaining Power Points", "BOL.chat.spellremaining": "Remaining Power Points",
"BOL.chat.nodamagesummary": "No damage ....",
"BOL.chat.damageresume": "{name} as taken wounds ...",
"BOL.chat.fumblemessage": "If you accept the consequences of a fumble (GM choice), you can get 1 additionnal Hero Point.",
"BOL.chat.rangeinfo": "Range/Throw of {attackerName} to {defenderName}",
"BOL.chat.rangeweaponinfo": "Weapon : {weaponName} - Base range {weaponRange}",
"BOL.chat.rangeout": "Modifier : Out of range",
"BOL.chat.range0": "Modifier : Point blank (+1)",
"BOL.chat.range1": "Modifier : Short Range (0)",
"BOL.chat.range2": "Modifier : Middle Range (-1)",
"BOL.chat.range3": "Modifier : Long Range (-2)",
"BOL.chat.range4": "Modifier : Very Long Range (-4)",
"BOL.chat.range5": "Modifier : Extrem Range (-6)",
"BOL.chat.range6": "Modifier : Max Range (-8)",
"BOL.chat.rangeprefix": "Evaluated distance : ",
"BOL.chat.rangevisible": "Line of sight is cleared between tokens.",
"BOL.chat.rangenotvisible": "Line of sight is blocked between tokens.",
"BOL.chat.rangetitle": "GM Information",
"BOL.chat.weaponreroll1": "As a reminder, this weapon re-roll 1 whend rolling for damage.",
"BOL.chat.rollbougette": "Budget roll",
"BOL.chat.bougettesuccess": "Your budget remains unchanged !",
"BOL.chat.bougettefailure": "You spent too much money, your budget is going down by one level...",
"BOL.chat.initiative": "Initiative rank (10 to 1)",
"BOL.chat.horoscope": "Horoscope",
"BOL.chat.horoscopepoints": "Cost : {points} Astrology Points",
"BOL.chat.horoscopeminorsuccess": "Your minor horoscope is a success : change the horoscope name in your sheet. You will benefit of 1 Bonus Die for the given situation.",
"BOL.chat.horoscopeminorfailure": "Your minor horoscope mineur isa failure : change the horoscope name in your sheet. Vous will suffer 1 Malus Die for the given situation.",
"BOL.chat.horoscopemajorsuccess": "Your major horoscope is a success : {horoscopeName} gets 1 new Hero Point for this adventure. This point has been automatically added.",
"BOL.chat.horoscopemajorfailure": "Your major horoscope is a failure : {horoscopeName} looses 1 Hero Point for this adventure. This point has been automatically substracted.",
"BOL.chat.horoscopemajorgroupsuccess": "Your major group horoscope majeur is a success. Your and your party gets {careerBonus} Bonus Dice during this adventure.",
"BOL.chat.horoscopemajorgroupfailure": "Your major group horoscope is a failure. You and your party suffers {careerBonus} Malus Dice durig this adventure.",
"BOL.chat.usedhoroscope": "Horoscope has been used",
"BOL.chat.horoscopedeleted": "The Horoscopes used are deleted automatically.",
"BOL.chat.criticaloptions": "Critical success !! You can (select 1 option) :",
"BOL.chat.criticalcarnage": "Dual attack : you gain 1 free attack. This second attack can't benefit from a Hero/Villain Point.",
"BOL.chat.criticalplus6": "Devastating : damage +6 aux dommages (cf button below).",
"BOL.chat.criticalprecise": "Precise : You hit to harm your opponent. Describe what your are doing, and if the GM agree, your opponent will suffer 1 Malus Die for the relevant actions.",
"BOL.chat.criticalunarm": "Disarm : Si your opponnent has a weapon in hand, you disarm him.",
"BOL.chat.criticalrabble": "Rabble Massacre : If you fight against rabble, damages results indicate the amount of rabble you kill.",
"BOL.chat.criticalpush": "Prone : If the size allow it, you push your opponent on the ground. He suffer 1 Malus Die for all his actions during the next round.",
"BOL.chat.criticalup": "Transform to Legendary : If you spent 1 Hero Point/Villain, you can transform this Heroic success into a Legendary success.You can the choose 2 options in this list above.",
"BOL.chat.criticalinfo": "This is a Legendary or Heroic succes ! Choose your options and effects !",
"BOL.chat.criticalbuttonjournal": "Legendary/Heroic Success",
"BOL.dialog.soeasy": "So easy (+4)", "BOL.dialog.soeasy": "So easy (+4)",
"BOL.dialog.veryeasy": "Very easy (+2)", "BOL.dialog.veryeasy": "Very easy (+2)",

View File

@ -2,6 +2,7 @@
"TYPES": { "TYPES": {
"Actor": { "Actor": {
"character": "Personnage", "character": "Personnage",
"encounter": "PNJ",
"npc": "PNJ", "npc": "PNJ",
"vehicle": "Véhicule" "vehicle": "Véhicule"
}, },
@ -139,6 +140,12 @@
"BOL.ui.registerInit": "Enregistrer comme Init. de combat", "BOL.ui.registerInit": "Enregistrer comme Init. de combat",
"BOL.ui.initMalus": "Malus d'initiative", "BOL.ui.initMalus": "Malus d'initiative",
"BOL.ui.magicnewrules": "Règles supplémentaires (cf. supplément fan-made Sorcellerie!)", "BOL.ui.magicnewrules": "Règles supplémentaires (cf. supplément fan-made Sorcellerie!)",
"BOL.ui.other":"Autre",
"BOL.ui.career":"Carrière",
"BOL.ui.boon":"Avantage",
"BOL.ui.flaw":"Désanvatage",
"BOL.ui.cost":"Cout XP",
"BOL.ui.date":"Date",
"BOL.ui.isSorcerer": "Carrière de Sorcier ?", "BOL.ui.isSorcerer": "Carrière de Sorcier ?",
"BOL.ui.isAlchemist": "Carrière d'Alchimiste ?", "BOL.ui.isAlchemist": "Carrière d'Alchimiste ?",
@ -196,12 +203,15 @@
"BOL.ui.armorAgiMalus": "Malus d'Armure+Bouclier (Agi)", "BOL.ui.armorAgiMalus": "Malus d'Armure+Bouclier (Agi)",
"BOL.ui.armorInitMalus": "Malus d'Armure (Init)", "BOL.ui.armorInitMalus": "Malus d'Armure (Init)",
"BOL.ui.attackValue": "Valeur d'attaque", "BOL.ui.attackValue": "Valeur d'attaque",
"BOL.ui.attackModifier": "Attaque",
"BOL.ui.vehicleWeapons": "Armes de véhicules", "BOL.ui.vehicleWeapons": "Armes de véhicules",
"BOL.ui.hullDamage": "D.coque", "BOL.ui.hullDamage": "D.coque",
"BOL.ui.crewDamage": "D.équipage", "BOL.ui.crewDamage": "D.équipage",
"BOL.ui.fireDamage": "Feu ?", "BOL.ui.fireDamage": "Feu ?",
"BOL.ui.weaponbonus": "Cette arme bénéficie déja d'un Dé de Bonus (Arme Favorite prise en compte, par exemple)", "BOL.ui.weaponbonus": "Cette arme bénéficie déja d'un Dé de Bonus (Arme Favorite prise en compte, par exemple)",
"BOL.ui.creature": "Creature", "BOL.ui.creature": "Créature",
"BOL.ui.undead": "Mort vivant",
"BOL.ui.daemon": "Démon",
"BOL.ui.rabble": "Piétaille", "BOL.ui.rabble": "Piétaille",
"BOL.ui.tough": "Coriace", "BOL.ui.tough": "Coriace",
"BOL.ui.villain": "Rival", "BOL.ui.villain": "Rival",
@ -225,7 +235,12 @@
"BOL.ui.warninitiative": "Votre initiative n'est pas disponible. Effectuez un jet d'Initiative pour ce combat.", "BOL.ui.warninitiative": "Votre initiative n'est pas disponible. Effectuez un jet d'Initiative pour ce combat.",
"BOL.ui.isspecial": "Spéciale ?", "BOL.ui.isspecial": "Spéciale ?",
"BOL.ui.createEquipment": "Créer un Equipement", "BOL.ui.createEquipment": "Créer un Equipement",
"BOL.ui.newEquipment": "Nouvel équipement",
"BOL.ui.newNaturalWeapon": "Arme naturelle",
"BOL.ui.newNaturalProtection": "Protection naturelle",
"BOL.ui.createNaturalWeapon": "Créer une arme naturelle",
"BOL.ui.createNaturalProtection": "Créer une protection naturelle",
"BOL.featureCategory.origins": "Origines", "BOL.featureCategory.origins": "Origines",
"BOL.featureCategory.races": "Races", "BOL.featureCategory.races": "Races",
"BOL.featureCategory.careers": "Carrières", "BOL.featureCategory.careers": "Carrières",
@ -251,6 +266,7 @@
"BOL.featureSubtypes.effects": "Effets", "BOL.featureSubtypes.effects": "Effets",
"BOL.featureSubtypes.boleffect": "Effet", "BOL.featureSubtypes.boleffect": "Effet",
"BOL.featureSubtypes.horoscope": "Horoscope", "BOL.featureSubtypes.horoscope": "Horoscope",
"BOL.featureSubtypes.xplog": "Log d'XP",
"BOL.fightOptionTypes.armor": "Attaque au défaut d'armure", "BOL.fightOptionTypes.armor": "Attaque au défaut d'armure",
"BOL.fightOptionTypes.intrepid": "Attaque intrépide", "BOL.fightOptionTypes.intrepid": "Attaque intrépide",
@ -581,6 +597,8 @@
"BOL.ui.biosigns": "Signes distinctifs", "BOL.ui.biosigns": "Signes distinctifs",
"BOL.ui.biodescription": "Description", "BOL.ui.biodescription": "Description",
"BOL.ui.bionotes": "Notes", "BOL.ui.bionotes": "Notes",
"BOL.ui.xplog":"Journal d'XP",
"BOL.ui.value":"Valeur",
"BOL.chat.welcome1": "Bienvenue dans Barbarians of Lemuria (Ludospherik version)", "BOL.chat.welcome1": "Bienvenue dans Barbarians of Lemuria (Ludospherik version)",
"BOL.chat.welcome2": "Les livres nécessaires pour jouer sont disponibles sur le site de <a href='http://www.ludospherik.fr/content/14-barbarians-of-lemuria'>l'éditeur Ludospherik.</a>", "BOL.chat.welcome2": "Les livres nécessaires pour jouer sont disponibles sur le site de <a href='http://www.ludospherik.fr/content/14-barbarians-of-lemuria'>l'éditeur Ludospherik.</a>",
@ -589,6 +607,10 @@
"BOL.chat.welcome5": "Consulter l'aide en ligne pour plus d'informations : @UUID[Compendium.bol.aides-de-jeu.97rugQOtiwt8zPfQ]{Aide du Jeu}.", "BOL.chat.welcome5": "Consulter l'aide en ligne pour plus d'informations : @UUID[Compendium.bol.aides-de-jeu.97rugQOtiwt8zPfQ]{Aide du Jeu}.",
"BOL.chat.welcome6": "Bon jeu en Lemurie !", "BOL.chat.welcome6": "Bon jeu en Lemurie !",
"BOL.chat.nodamage": "Ne pas appliquer les dommages", "BOL.chat.nodamage": "Ne pas appliquer les dommages",
"BOL.chat.pcwarning": "Attention ! Aucun personnage n'est relié au joueur !",
"BOL.chat.pcwarningmsg": "<b>ATTENTION</b> Le joueur n'est relié à aucun personnage !",
"BOL.chat.pcnotlinked": "Le token du personnage joueur n'est pas relié à l'acteur",
"BOL.chat.pcnotlinkedmsg": "<b>ATTENTION</b> Le token du personnage joueur n'est pas relié à l'acteur !",
"BOL.settings.rollArmor": "Effectuer des jets pour les armures", "BOL.settings.rollArmor": "Effectuer des jets pour les armures",
"BOL.settings.rollArmorTooltip": "Effectue un jet de dés pour les armures (valeur fixe si désactivé)", "BOL.settings.rollArmorTooltip": "Effectue un jet de dés pour les armures (valeur fixe si désactivé)",
@ -607,5 +629,8 @@
"BOL.settings.defaultLogoActorSheetPath" : "Chemin du logo des fiches de perso", "BOL.settings.defaultLogoActorSheetPath" : "Chemin du logo des fiches de perso",
"BOL.settings.defaultLogoPathActorSheetTooltip": "Vous pouvez changer le logo BoL des fiches de perso, pour jouer dans un autre univers (idéalement 346 x 200, défaut : /systems/bol/ui/logo.webp)", "BOL.settings.defaultLogoPathActorSheetTooltip": "Vous pouvez changer le logo BoL des fiches de perso, pour jouer dans un autre univers (idéalement 346 x 200, défaut : /systems/bol/ui/logo.webp)",
"BOL.settings.defaultLogoTopLeftPath" : "Chemin du logo haut gauche", "BOL.settings.defaultLogoTopLeftPath" : "Chemin du logo haut gauche",
"BOL.settings.defaultLogoTopLeftPathTooltip": "Vous pouvez changer le logo BoL en haut à gauche de chaque écran (idéalement 718 x 416, défaut : /systems/bol/ui/logo2.webp)" "BOL.settings.defaultLogoTopLeftPathTooltip": "Vous pouvez changer le logo BoL en haut à gauche de chaque écran (idéalement 718 x 416, défaut : /systems/bol/ui/logo2.webp)",
"EFFECT.StatusProne": "A terre",
"EFFECT.StatusDead": "Mort"
} }

View File

@ -9,7 +9,7 @@ export class BoLActorSheet extends ActorSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
return mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["bol", "sheet", "actor"], classes: ["bol", "sheet", "actor"],
template: "systems/bol/templates/actor/actor-sheet.hbs", template: "systems/bol/templates/actor/actor-sheet.hbs",
width: 860, width: 860,
@ -27,7 +27,7 @@ export class BoLActorSheet extends ActorSheet {
function onLoad() { function onLoad() {
let logoSheet = BoLUtility.getLogoActorSheet() let logoSheet = BoLUtility.getLogoActorSheet()
$(".bol-actor-form").css("backgroundImage",`url(${logoSheet})`) $(".bol-actor-form").css("backgroundImage", `url(${logoSheet})`)
} }
// Setup everything onload // Setup everything onload
$(function () { onLoad(); }); $(function () { onLoad(); });
@ -47,10 +47,19 @@ export class BoLActorSheet extends ActorSheet {
// Equip/Unequip item // Equip/Unequip item
html.find('.item-equip').click(this._onToggleEquip.bind(this)); html.find('.item-equip').click(this._onToggleEquip.bind(this));
html.find('.create_item').click(ev => { html.find('.create-item').click(ev => {
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvel Equipement", type: "item" }], { renderSheet: true }); this.actor.createEmbeddedDocuments('Item', [{ name: game.i18n.localize("BOL.ui.newEquipment"), type: "item" }], { renderSheet: true });
}); });
html.find('.create-natural-weapon').click(ev => {
let system = foundry.utils.duplicate(game.bol.config.defaultNaturalWeapon)
this.actor.createEmbeddedDocuments('Item', [{ name: game.i18n.localize("BOL.ui.newNaturalWeapon"), type: "item", system }], { renderSheet: true });
});
html.find('.create-natural-protection').click(ev => {
let system = foundry.utils.duplicate(game.bol.config.defaultNaturalProtection)
this.actor.createEmbeddedDocuments('Item', [{ name: game.i18n.localize("BOL.ui.newNaturalProtection"), type: "item", system }], { renderSheet: true });
});
html.find(".toggle-fight-option").click((ev) => { html.find(".toggle-fight-option").click((ev) => {
const li = $(ev.currentTarget).parents(".item") const li = $(ev.currentTarget).parents(".item")
this.actor.toggleFightOption(li.data("itemId")) this.actor.toggleFightOption(li.data("itemId"))
@ -122,8 +131,8 @@ export class BoLActorSheet extends ActorSheet {
/** @override */ /** @override */
async getData(options) { async getData(options) {
const data = super.getData(options) const data = super.getData(options)
const actorData = duplicate(data) const actorData = foundry.utils.duplicate(data)
let formData = duplicate(data) let formData = foundry.utils.duplicate(data)
formData.config = game.bol.config formData.config = game.bol.config
formData.data = actorData formData.data = actorData
@ -147,6 +156,7 @@ export class BoLActorSheet extends ActorSheet {
formData.fightoptions = this.actor.fightoptions formData.fightoptions = this.actor.fightoptions
formData.ammos = this.actor.ammos formData.ammos = this.actor.ammos
formData.misc = this.actor.misc formData.misc = this.actor.misc
formData.xplog = this.actor.xplog
formData.combat = this.actor.buildCombat() formData.combat = this.actor.buildCombat()
formData.initiativeRank = this.actor.getInitiativeRank() formData.initiativeRank = this.actor.getInitiativeRank()
//formData.combatCreature = this.actor.buildCombatCreature() //formData.combatCreature = this.actor.buildCombatCreature()
@ -155,12 +165,13 @@ export class BoLActorSheet extends ActorSheet {
formData.options = this.options formData.options = this.options
formData.owner = this.document.isOwner formData.owner = this.document.isOwner
formData.editScore = this.options.editScore formData.editScore = this.options.editScore
formData.useBougette = (this.actor.type == "character" && BoLUtility.getUseBougette()) || false formData.useBougette = (this.actor.type == "character" && BoLUtility.getUseBougette()) || false
formData.bougette = this.actor.getBougette() formData.bougette = this.actor.getBougette()
formData.charType = this.actor.getCharType() formData.charType = this.actor.getCharType()
formData.villainy = this.actor.getVillainy() formData.villainy = this.actor.getVillainy()
formData.biography = await TextEditor.enrichHTML(this.object.system.details?.biography || "", {async: true}) formData.isUndead = this.actor.isUndead()
formData.notes = await TextEditor.enrichHTML(this.object.system.details.notes || "", {async: true}) formData.biography = await TextEditor.enrichHTML(this.object.system.details?.biography || "", { async: true })
formData.notes = await TextEditor.enrichHTML(this.object.system.details.notes || "", { async: true })
formData.isSorcerer = this.actor.isSorcerer() formData.isSorcerer = this.actor.isSorcerer()
formData.isAlchemist = this.actor.isAlchemist() formData.isAlchemist = this.actor.isAlchemist()
formData.isAstrologer = this.actor.isAstrologer() formData.isAstrologer = this.actor.isAstrologer()
@ -186,7 +197,7 @@ export class BoLActorSheet extends ActorSheet {
// Get the type of item to create. // Get the type of item to create.
const type = header.dataset.type; const type = header.dataset.type;
// Grab any data associated with this control. // Grab any data associated with this control.
const data = duplicate(header.dataset); const data = foundry.utils.duplicate(header.dataset);
// Initialize a default name. // Initialize a default name.
const name = `New ${type.capitalize()}`; const name = `New ${type.capitalize()}`;
// Prepare the item object. // Prepare the item object.
@ -248,22 +259,22 @@ export class BoLActorSheet extends ActorSheet {
case "attributexp": case "attributexp":
this.actor.incAttributeXP(dataset.key) this.actor.incAttributeXP(dataset.key)
break; break;
case "bougette":
this.actor.rollBougette()
break;
case "careerxp": case "careerxp":
this.actor.incCareerXP( li.data("item-id")) this.actor.incCareerXP(li.data("item-id"))
break; break;
case "horoscope-minor": case "horoscope-minor":
BoLRoll.horoscopeCheck(this.actor, event, "minor") BoLRoll.horoscopeCheck(this.actor, event, "minor")
break break
case "horoscope-major": case "horoscope-major":
BoLRoll.horoscopeCheck(this.actor, event, "major") BoLRoll.horoscopeCheck(this.actor, event, "major")
break break
case "horoscope-major-group": case "horoscope-major-group":
BoLRoll.horoscopeCheck(this.actor, event, "majorgroup") BoLRoll.horoscopeCheck(this.actor, event, "majorgroup")
break break
case "bougette":
this.actor.rollBougette()
break;
default: break; default: break;
} }
} }

View File

@ -20,6 +20,7 @@ export class BoLActor extends Actor {
} }
super.prepareData() super.prepareData()
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async _preCreate(data, options, user) { async _preCreate(data, options, user) {
@ -38,10 +39,7 @@ export class BoLActor extends Actor {
if (this.type === 'character') { if (this.type === 'character') {
return true return true
} }
if (this.type === 'encounter' && this.chartype == "adversary") { return (this.type === 'encounter' && this.chartype == "adversary")
return true
}
return false
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -54,10 +52,10 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getVillainy() { getVillainy() {
if (this.type === 'encounter' && this.chartype == "adversary") { return (this.type === 'encounter' && this.chartype == "adversary")
return true }
} isUndead() {
return false return (this.type == "encounter" && this.system.isundead)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getInitiativeMalus() { getInitiativeMalus() {
@ -69,7 +67,7 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getBougette() { getBougette() {
if (this.type == "character") { if (this.type == "character") {
let b = duplicate(this.system.bougette) let b = foundry.utils.duplicate(this.system.bougette)
b.label = game.i18n.localize(game.bol.config.bougetteState[String(this.system.bougette.value)]) b.label = game.i18n.localize(game.bol.config.bougetteState[String(this.system.bougette.value)])
b.diceImg = "icons/dice/" + game.bol.config.bougetteDice[String(this.system.bougette.value)] + "black.svg" b.diceImg = "icons/dice/" + game.bol.config.bougetteDice[String(this.system.bougette.value)] + "black.svg"
return b return b
@ -80,7 +78,7 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollBougette() { async rollBougette() {
if (this.type == "character") { if (this.type == "character") {
let attribute = duplicate(this.system.attributes.vigor) let attribute = foundry.utils.duplicate(this.system.attributes.vigor)
let rollData = BoLRoll.getCommonRollData(this, "bougette", attribute, undefined) let rollData = BoLRoll.getCommonRollData(this, "bougette", attribute, undefined)
rollData.formula = game.bol.config.bougetteDice[String(this.system.bougette.value)] rollData.formula = game.bol.config.bougetteDice[String(this.system.bougette.value)]
let r = new BoLDefaultRoll(rollData) let r = new BoLDefaultRoll(rollData)
@ -91,7 +89,7 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
decBougette() { decBougette() {
if (this.type == "character") { if (this.type == "character") {
let bougette = duplicate(this.system.bougette) let bougette = foundry.utils.duplicate(this.system.bougette)
bougette.value = Math.max(Number(bougette.value) - 1, 0) bougette.value = Math.max(Number(bougette.value) - 1, 0)
this.update({ 'system.bougette': bougette }) this.update({ 'system.bougette': bougette })
} }
@ -145,7 +143,7 @@ export class BoLActor extends Actor {
} }
} }
get attributes() { get attributes() {
let attrList = duplicate(Object.values(this.system.attributes)) let attrList = foundry.utils.duplicate(Object.values(this.system.attributes))
this.addEffectModifiers(attrList, "system.attributes.") this.addEffectModifiers(attrList, "system.attributes.")
return attrList return attrList
} }
@ -199,21 +197,40 @@ export class BoLActor extends Actor {
getActiveFightOption() { getActiveFightOption() {
let it = this.items.find(i => i.type === "feature" && i.system.subtype === "fightoption" && i.system.properties.activated) let it = this.items.find(i => i.type === "feature" && i.system.subtype === "fightoption" && i.system.properties.activated)
if (it) { if (it) {
return duplicate(it) return foundry.utils.duplicate(it)
} }
return undefined return undefined
} }
/* -------------------------------------------- */
addXPLog(type, name, cost, value) {
let xplog = {
name: "XP : "+game.i18n.localize(type), type: "feature",
img: "icons/magic/symbols/chevron-elipse-circle-blue.webp",
system: {
subtype: "xplog", properties: {
xptype: type,
xpdate: new Date().toLocaleDateString(),
xpname: name,
xpcost: cost,
xpvalue: value
}
}
}
this.createEmbeddedDocuments('Item', [xplog])
}
/* -------------------------------------------- */ /* -------------------------------------------- */
incAttributeXP(key) { incAttributeXP(key) {
let attr = duplicate(this.system.attributes[key]) let attr = foundry.utils.duplicate(this.system.attributes[key])
if (attr) { if (attr) {
let nextXP = (attr.value == -1) ? 2 : attr.value + (attr.value + 1) let nextXP = (attr.value == -1) ? 2 : attr.value + (attr.value + 1)
let xp = duplicate(this.system.xp) let xp = foundry.utils.duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) { if (xp.total - xp.spent >= nextXP) {
attr.value += 1 attr.value += 1
xp.spent += nextXP xp.spent += nextXP
this.update({ [`system.attributes.${key}`]: attr, [`system.xp`]: xp }) this.update({ [`system.attributes.${key}`]: attr, [`system.xp`]: xp })
this.addXPLog("attribute", key, nextXP, attr.value)
} else { } else {
ui.notifications.warn("Pas assez de points d'expérience !") ui.notifications.warn("Pas assez de points d'expérience !")
} }
@ -222,14 +239,15 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
incAptitudeXP(key) { incAptitudeXP(key) {
let apt = duplicate(this.system.aptitudes[key]) let apt = foundry.utils.duplicate(this.system.aptitudes[key])
if (apt) { if (apt) {
let nextXP = (apt.value == -1) ? 1 : apt.value + 2 let nextXP = (apt.value == -1) ? 1 : apt.value + 2
let xp = duplicate(this.system.xp) let xp = foundry.utils.duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) { if (xp.total - xp.spent >= nextXP) {
apt.value += 1 apt.value += 1
xp.spent += nextXP xp.spent += nextXP
this.update({ [`system.aptitudes.${key}`]: apt, [`system.xp`]: xp }) this.update({ [`system.aptitudes.${key}`]: apt, [`system.xp`]: xp })
this.addXPLog("aptitude", key, nextXP, apt.value)
} else { } else {
ui.notifications.warn("Pas assez de points d'expérience !") ui.notifications.warn("Pas assez de points d'expérience !")
} }
@ -239,13 +257,14 @@ export class BoLActor extends Actor {
incCareerXP(itemId) { incCareerXP(itemId) {
let career = this.items.get(itemId) let career = this.items.get(itemId)
if (career) { if (career) {
career = duplicate(career) career = foundry.utils.duplicate(career)
let nextXP = career.system.rank + 1 let nextXP = career.system.rank + 1
let xp = duplicate(this.system.xp) let xp = foundry.utils.duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) { if (xp.total - xp.spent >= nextXP) {
xp.spent += nextXP xp.spent += nextXP
this.update({ [`system.xp`]: xp }) this.update({ [`system.xp`]: xp })
this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'system.rank': career.system.rank + 1 }]) this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'system.rank': career.system.rank + 1 }])
this.addXPLog("career", career.name, nextXP, career.system.rank+1)
} else { } else {
ui.notifications.warn("Pas assez de points d'expérience !") ui.notifications.warn("Pas assez de points d'expérience !")
} }
@ -259,7 +278,7 @@ export class BoLActor extends Actor {
let updates = [] let updates = []
if (fightOption) { if (fightOption) {
fightOption = duplicate(fightOption) fightOption = foundry.utils.duplicate(fightOption)
if (fightOption.system.properties.activated) { if (fightOption.system.properties.activated) {
state = false state = false
} else { } else {
@ -298,17 +317,20 @@ export class BoLActor extends Actor {
get boleffects() { get boleffects() {
return this.items.filter(i => i.type === "feature" && i.system.subtype === "boleffect") return this.items.filter(i => i.type === "feature" && i.system.subtype === "boleffect")
} }
get xplog() {
return this.items.filter(i => i.type === "feature" && i.system.subtype === "xplog")
}
get horoscopes() { get horoscopes() {
return this.items.filter(i => i.type === "feature" && i.system.subtype === "horoscope") return this.items.filter(i => i.type === "feature" && i.system.subtype === "horoscope")
} }
get boons() { get boons() {
return duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "boon") || []); return foundry.utils.duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "boon") || []);
} }
get flaws() { get flaws() {
return duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw") || []); return foundry.utils.duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw") || []);
} }
get careers() { get careers() {
return duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "career") || []) return foundry.utils.duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "career") || [])
} }
get origins() { get origins() {
return this.items.filter(i => i.type === "feature" && i.system.subtype === "origin"); return this.items.filter(i => i.type === "feature" && i.system.subtype === "origin");
@ -390,31 +412,23 @@ export class BoLActor extends Actor {
get bonusBoons() { get bonusBoons() {
let boons = this.items.filter(i => i.type === "feature" && i.system.subtype === "boon" && i.system.properties.isbonusdice) let boons = this.items.filter(i => i.type === "feature" && i.system.subtype === "boon" && i.system.properties.isbonusdice)
return duplicate(boons || []) return foundry.utils.duplicate(boons || [])
} }
get malusFlaws() { get malusFlaws() {
return duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw" && i.system.properties.ismalusdice) || []); return foundry.utils.duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw" && i.system.properties.ismalusdice) || []);
} }
isSorcerer() { isSorcerer() {
if (this.careers.find(item => item.system.properties.sorcerer == true)) return (this.careers.find(item => item.system.properties.sorcerer ))
return true
return false
} }
isAlchemist() { isAlchemist() {
if (this.careers.find(item => item.system.properties.alchemist == true)) return (this.careers.find(item => item.system.properties.alchemist))
return true
return false
} }
isAstrologer() { isAstrologer() {
if (this.careers.find(item => item.system.properties.astrologer == true)) return (this.careers.find(item => item.system.properties.astrologer))
return true
return false
} }
isPriest() { isPriest() {
if (this.careers.find(item => item.system.properties.priest == true)) return (this.careers.find(item => item.system.properties.priest))
return true
return false
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
@ -484,7 +498,7 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */ /*-------------------------------------------- */
spentAstrologyPoints(points) { spentAstrologyPoints(points) {
let astrology = duplicate(this.system.resources.astrologypoints) let astrology = foundry.utils.duplicate(this.system.resources.astrologypoints)
astrology.value -= points astrology.value -= points
astrology.value = Math.max(astrology.value, 0) astrology.value = Math.max(astrology.value, 0)
this.update({ 'system.resources.astrologypoints': astrology }) this.update({ 'system.resources.astrologypoints': astrology })
@ -535,8 +549,8 @@ export class BoLActor extends Actor {
rollData.horoscopeName = actorHoroscope.name rollData.horoscopeName = actorHoroscope.name
} }
if (rollData.horoscopeType == "majorgroup") { if (rollData.horoscopeType == "majorgroup") {
let rID = randomID(16) let rID = foundry.utils.randomID(16)
let horoscopes = duplicate(game.settings.get("bol", "horoscope-group")) let horoscopes = foundry.utils.duplicate(game.settings.get("bol", "horoscope-group"))
horoscopes[rID] = { horoscopes[rID] = {
id: rID, id: rID,
name: game.i18n.localize("BOL.ui.groupHoroscope") + this.name, name: game.i18n.localize("BOL.ui.groupHoroscope") + this.name,
@ -568,7 +582,7 @@ export class BoLActor extends Actor {
async spendAlchemyPoint(alchemyId, pcCost) { async spendAlchemyPoint(alchemyId, pcCost) {
let alchemy = this.items.get(alchemyId) let alchemy = this.items.get(alchemyId)
if (alchemy) { if (alchemy) {
pcCost = Number(pcCost) ?? 0 pcCost = Number(pcCost) || 0
if (this.system.resources.alchemypoints.value >= pcCost) { if (this.system.resources.alchemypoints.value >= pcCost) {
let newPC = this.system.resources.alchemypoints.value - pcCost let newPC = this.system.resources.alchemypoints.value - pcCost
newPC = (newPC < 0) ? 0 : newPC newPC = (newPC < 0) ? 0 : newPC
@ -582,7 +596,7 @@ export class BoLActor extends Actor {
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
getAstrologerBonus() { getAstrologerBonus() {
let astrologer = this.careers.find(item => item.system.properties.astrologer == true) let astrologer = this.careers.find(item => item.system.properties.astrologer)
if (astrologer) { if (astrologer) {
return astrologer.system.rank return astrologer.system.rank
} }
@ -590,7 +604,7 @@ export class BoLActor extends Actor {
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
getAlchemistBonus() { getAlchemistBonus() {
let sorcerer = this.careers.find(item => item.system.properties.alchemist == true) let sorcerer = this.careers.find(item => item.system.properties.alchemist)
if (sorcerer) { if (sorcerer) {
return sorcerer.system.rank return sorcerer.system.rank
} }
@ -598,7 +612,7 @@ export class BoLActor extends Actor {
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
getSorcererBonus() { getSorcererBonus() {
let sorcerer = this.careers.find(item => item.system.properties.sorcerer == true) let sorcerer = this.careers.find(item => item.system.properties.sorcerer )
if (sorcerer) { if (sorcerer) {
return sorcerer.system.rank return sorcerer.system.rank
} }
@ -629,7 +643,7 @@ export class BoLActor extends Actor {
resources['power'] = this.system.resources.power resources['power'] = this.system.resources.power
} }
if (this.system.chartype == 'adversary') { if (this.system.chartype == 'adversary') {
resources['hero'] = duplicate(this.system.resources.hero) resources['hero'] = foundry.utils.duplicate(this.system.resources.hero)
resources['hero'].label = "BOL.resources.villainy" resources['hero'].label = "BOL.resources.villainy"
} }
} else { } else {
@ -775,17 +789,17 @@ export class BoLActor extends Actor {
let lastHP = await this.getFlag("world", hpID) let lastHP = await this.getFlag("world", hpID)
if (lastHP != this.system.resources.hp.value && game.user.isGM) { // Only GM sends this if (lastHP != this.system.resources.hp.value && game.user.isGM) { // Only GM sends this
await this.setFlag("world", hpID, this.system.resources.hp.value) await this.setFlag("world", hpID, this.system.resources.hp.value)
let prone = this.effects.find(ef => ef.label == "EFFECT.StatusProne") let prone = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusProne"))
let dead = this.effects.find(ef => ef.label == "EFFECT.StatusDead") let dead = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusDead"))
if (this.system.resources.hp.value <= 0) { if (this.system.resources.hp.value <= 0) {
if (!prone) { if (!prone) {
await this.createEmbeddedDocuments("ActiveEffect", [ await this.createEmbeddedDocuments("ActiveEffect", [
{ label: 'EFFECT.StatusProne', icon: 'icons/svg/falling.svg', flags: { core: { statusId: 'prone' } } } { name: game.i18n.localize('EFFECT.StatusProne'), icon: 'icons/svg/falling.svg', statuses: 'prone' }
]) ])
} }
if (this.system.resources.hp.value < -5 && !dead) { if (this.system.resources.hp.value < -5 && !dead) {
await this.createEmbeddedDocuments("ActiveEffect", [ await this.createEmbeddedDocuments("ActiveEffect", [
{ label: 'EFFECT.StatusDead', icon: 'icons/svg/skull.svg', flags: { core: { statusId: 'dead' } } } { name: game.i18n.localize('EFFECT.StatusDead'), icon: 'icons/svg/skull.svg', statuses: 'dead' }
]) ])
} }
ChatMessage.create({ ChatMessage.create({
@ -812,7 +826,7 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */ /*-------------------------------------------- */
storeVitaliteCombat() { storeVitaliteCombat() {
this.setFlag("world", "vitalite-before-combat", duplicate(this.system.resources.hp)) this.setFlag("world", "vitalite-before-combat", foundry.utils.duplicate(this.system.resources.hp))
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
async displayRecuperation() { async displayRecuperation() {
@ -836,7 +850,7 @@ export class BoLActor extends Actor {
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
async applyRecuperation(recupHP) { async applyRecuperation(recupHP) {
let hp = duplicate(this.system.resources.hp) let hp = foundry.utils.duplicate(this.system.resources.hp)
//console.log("RECUP !!!!", hp, recupHP) //console.log("RECUP !!!!", hp, recupHP)
hp.value += Number(recupHP) hp.value += Number(recupHP)
hp.value = Math.min(hp.value, hp.max) hp.value = Math.min(hp.value, hp.max)
@ -864,10 +878,7 @@ export class BoLActor extends Actor {
checkNumeric(myObject) { checkNumeric(myObject) {
if (myObject) { if (myObject) {
for (let key in myObject) { for (let key in myObject) {
if (myObject[key].value === null) { if (myObject[key].value === null || isNaN(myObject[key].value)) {
myObject[key].value = 0
}
if (myObject[key].value === NaN) {
myObject[key].value = 0 myObject[key].value = 0
} }
} }
@ -889,7 +900,7 @@ export class BoLActor extends Actor {
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
getInitiativeRank(rollData = undefined, isCombat = false, combatData) { getInitiativeRank(rollData = undefined, isCombat = false, combatData = undefined) {
let fvttInit = 4 // Pietaille par defaut let fvttInit = 4 // Pietaille par defaut
if (this.type == 'character') { if (this.type == 'character') {
fvttInit = 5 fvttInit = 5
@ -988,7 +999,7 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
rollProtection(itemId) { rollProtection(itemId) {
let armor = duplicate(this.items.get(itemId)) let armor = foundry.utils.duplicate(this.items.get(itemId))
if (armor) { if (armor) {
let armorFormula = "max(" + armor.system.properties.soak.formula + ", 0)" let armorFormula = "max(" + armor.system.properties.soak.formula + ", 0)"
let rollArmor = new Roll(armorFormula) let rollArmor = new Roll(armorFormula)
@ -998,9 +1009,9 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
rollWeaponDamage(itemId) { rollWeaponDamage(itemId) {
let weapon = duplicate(this.items.get(itemId)) let weapon = foundry.utils.duplicate(this.items.get(itemId))
if (weapon) { if (weapon) {
let r = new BoLDefaultRoll({ id: randomID(16), isSuccess: true, mode: "weapon", weapon: weapon, actorId: this.id, actor: this }) let r = new BoLDefaultRoll({ id: foundry.utils.randomID(16), isSuccess: true, mode: "weapon", weapon: weapon, actorId: this.id, actor: this })
r.setSuccess(true) r.setSuccess(true)
r.rollDamage() r.rollDamage()
} }
@ -1010,7 +1021,7 @@ export class BoLActor extends Actor {
toggleEquipItem(item) { toggleEquipItem(item) {
const equipable = item.system.properties.equipable; const equipable = item.system.properties.equipable;
if (equipable) { if (equipable) {
let itemData = duplicate(item); let itemData = foundry.utils.duplicate(item);
itemData.system.worn = !itemData.system.worn; itemData.system.worn = !itemData.system.worn;
return item.update(itemData); return item.update(itemData);
} }

View File

@ -9,7 +9,7 @@ export class BoLVehicleSheet extends ActorSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
return mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["bol", "sheet", "actor"], classes: ["bol", "sheet", "actor"],
template: "systems/bol/templates/actor/vehicle-sheet.hbs", template: "systems/bol/templates/actor/vehicle-sheet.hbs",
width: 860, width: 860,
@ -116,13 +116,12 @@ export class BoLVehicleSheet extends ActorSheet {
/** @override */ /** @override */
async getData(options) { async getData(options) {
const data = super.getData(options) const data = super.getData(options)
const actorData = duplicate(data) let formData = foundry.utils.duplicate(data)
let formData = duplicate(data)
formData.config = game.bol.config formData.config = game.bol.config
formData.name = this.actor.name formData.name = this.actor.name
formData.img = this.actor.img formData.img = this.actor.img
formData.system = duplicate(this.actor.system) formData.system = foundry.utils.duplicate(this.actor.system)
formData.weapons = this.actor.vehicleWeapons formData.weapons = this.actor.vehicleWeapons
formData.isGM = game.user.isGM formData.isGM = game.user.isGM
formData.options = this.options formData.options = this.options
@ -148,7 +147,7 @@ export class BoLVehicleSheet extends ActorSheet {
// Get the type of item to create. // Get the type of item to create.
const type = header.dataset.type; const type = header.dataset.type;
// Grab any data associated with this control. // Grab any data associated with this control.
const data = duplicate(header.dataset); const data = foundry.utils.duplicate(header.dataset);
// Initialize a default name. // Initialize a default name.
const name = `New ${type.capitalize()}`; const name = `New ${type.capitalize()}`;
// Prepare the item object. // Prepare the item object.

View File

@ -14,9 +14,8 @@ import { BoLUtility } from "./system/bol-utility.js"
import { BoLCombatManager } from "./system/bol-combat.js" import { BoLCombatManager } from "./system/bol-combat.js"
import { BoLTokenHud } from "./system/bol-action-hud.js" import { BoLTokenHud } from "./system/bol-action-hud.js"
import { BoLHotbar } from "./system/bol-hotbar.js" import { BoLHotbar } from "./system/bol-hotbar.js"
import { BoLAdventureGenerator } from "./system/bol-adventure-generator.js" import { BoLCommands } from "./system/bol-commands.js"
import { BoLCommands} from "./system/bol-commands.js" import { BoLRoll } from "./controllers/bol-rolls.js"
import { BoLCharacterSummary} from "./system/bol-character-summary.js"
/* -------------------------------------------- */ /* -------------------------------------------- */
Hooks.once('init', async function () { Hooks.once('init', async function () {
@ -25,10 +24,12 @@ Hooks.once('init', async function () {
BoLActor, BoLActor,
BoLItem, BoLItem,
BoLHotbar, BoLHotbar,
BoLRoll,
BoLUtility,
macros: Macros, macros: Macros,
config: BOL config: BOL
}; };
// Game socket // Game socket
game.socket.on("system.bol", sockmsg => { game.socket.on("system.bol", sockmsg => {
BoLUtility.onSocketMessage(sockmsg); BoLUtility.onSocketMessage(sockmsg);
@ -62,8 +63,7 @@ Hooks.once('init', async function () {
BoLTokenHud.init() BoLTokenHud.init()
BoLHotbar.init() BoLHotbar.init()
BoLCommands.init() BoLCommands.init()
BoLAdventureGenerator.init()
// Preload Handlebars Templates // Preload Handlebars Templates
await preloadHandlebarsTemplates(); await preloadHandlebarsTemplates();
@ -75,31 +75,6 @@ Hooks.once('init', async function () {
}); });
/* -------------------------------------------- */
// Register world usage statistics
function registerUsageCount( registerKey ) {
if ( game.user.isGM ) {
game.settings.register(registerKey, "world-key", {
name: "Unique world key",
scope: "world",
config: false,
default: "",
type: String
});
let worldKey = game.settings.get(registerKey, "world-key")
if ( worldKey == undefined || worldKey == "" ) {
worldKey = randomID(32)
game.settings.set(registerKey, "world-key", worldKey )
}
// Simple API counter
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
//$.ajaxSetup({
//headers: { 'Access-Control-Allow-Origin': '*' }
//})
$.ajax(regURL)
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
function welcomeMessage() { function welcomeMessage() {
@ -108,24 +83,44 @@ function welcomeMessage() {
whisper: [game.user.id], whisper: [game.user.id],
content: `<div id="welcome-message-pegasus"><span class="rdd-roll-part"> content: `<div id="welcome-message-pegasus"><span class="rdd-roll-part">
<strong>` + game.i18n.localize("BOL.chat.welcome1") + `</strong><p>` + <strong>` + game.i18n.localize("BOL.chat.welcome1") + `</strong><p>` +
game.i18n.localize("BOL.chat.welcome2") + "<p>" + game.i18n.localize("BOL.chat.welcome2") + "<p>" +
game.i18n.localize("BOL.chat.welcome3") + "<p>" + game.i18n.localize("BOL.chat.welcome3") + "<p>" +
game.i18n.localize("BOL.chat.welcome4") + "</p>" + game.i18n.localize("BOL.chat.welcome4") + "</p>" +
game.i18n.localize("BOL.chat.welcome5") + "<br>" + game.i18n.localize("BOL.chat.welcome5") + "<br>" +
game.i18n.localize("BOL.chat.welcome6") game.i18n.localize("BOL.chat.welcome6")
} ) })
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
Hooks.once('ready', async function () { Hooks.once('ready', async function () {
BoLUtility.ready() BoLUtility.ready()
BoLCharacterSummary.ready()
registerUsageCount(game.system.id)
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter=>{
console.log("ClassCounter loaded", moduleCounter)
moduleCounter.ClassCounter.registerUsageCount()
}).catch(err=>
console.log("No stats available, giving up.")
)
welcomeMessage() welcomeMessage()
// User warning
if (!game.user.isGM && game.user.character == undefined) {
ui.notifications.info(game.i18n.localize("BOL.chat.pcwarning"));
ChatMessage.create({
content: game.i18n.localize("BOL.chat.pcwarningmsg") + game.user.name,
user: game.user._id
});
}
if (!game.user.isGM && game.user.character && !game.user.character.prototypeToken.actorLink) {
ui.notifications.info(game.i18n.localize("BOL.chat.pcnotlinked"));
ChatMessage.create({
content: game.i18n.localize("BOL.chat.pcnotlinkedmsg") + game.user.name,
user: game.user._id
});
}
}) })

View File

@ -19,11 +19,9 @@ export class BoLRoll {
static updateApplicableEffects(rollData) { static updateApplicableEffects(rollData) {
let appEffects = [] let appEffects = []
for (let effect of rollData.bolEffects) { for (let effect of rollData.bolEffects) {
if (effect.system.properties.identifier == "always") { if ( (effect.system.properties.identifier == "always") ||
appEffects.push(effect) (effect.system.properties.identifier.includes(rollData.attribute.key)) ||
} else if (effect.system.properties.identifier.includes(rollData.attribute.key)) { (rollData.aptitude && effect.system.properties.identifier.includes(rollData.aptitude.key)) ){
appEffects.push(effect)
} else if (rollData.aptitude && effect.system.properties.identifier.includes(rollData.aptitude.key)) {
appEffects.push(effect) appEffects.push(effect)
} }
} }
@ -62,10 +60,10 @@ export class BoLRoll {
armorInitMalus: actor.getArmorInitMalus(), armorInitMalus: actor.getArmorInitMalus(),
horoscopeBonusList: actor.getHoroscopesBonus(), horoscopeBonusList: actor.getHoroscopesBonus(),
horoscopeMalusList: actor.getHoroscopesMalus(), horoscopeMalusList: actor.getHoroscopesMalus(),
config: game.bol.config,
adv: "0", adv: "0",
mod: 0, mod: 0,
modRanged: 0, modRanged: 0,
aptValue: 0,
bolEffects: actor.boleffects, bolEffects: actor.boleffects,
horoscopeGroupList: this.buildHoroscopeGroupList() horoscopeGroupList: this.buildHoroscopeGroupList()
} }
@ -78,7 +76,7 @@ export class BoLRoll {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static attributeCheck(actor, key, event, combatData) { static attributeCheck(actor, key="vigor", event=undefined, combatData=undefined) {
let attribute = eval(`actor.system.attributes.${key}`) let attribute = eval(`actor.system.attributes.${key}`)
@ -91,7 +89,7 @@ export class BoLRoll {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static aptitudeCheck(actor, key, event, combatData) { static aptitudeCheck(actor, key="init", event=undefined, combatData=undefined) {
let aptitude = eval(`actor.system.aptitudes.${key}`) let aptitude = eval(`actor.system.aptitudes.${key}`)
let attrKey = this.getDefaultAttribute(key) let attrKey = this.getDefaultAttribute(key)
@ -185,7 +183,7 @@ export class BoLRoll {
ui.notifications.warn("Unable to find weapon !") ui.notifications.warn("Unable to find weapon !")
return return
} }
weapon = duplicate(weapon) weapon = foundry.utils.duplicate(weapon)
return this.weaponCheckWithWeapon(actor, weapon) return this.weaponCheckWithWeapon(actor, weapon)
} }
@ -197,7 +195,7 @@ export class BoLRoll {
ui.notifications.warn("Unable to find Alchemy !"); ui.notifications.warn("Unable to find Alchemy !");
return; return;
} }
alchemy = duplicate(alchemy) alchemy = foundry.utils.duplicate(alchemy)
let alchemyData = alchemy.system let alchemyData = alchemy.system
if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) { if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) {
ui.notifications.warn("Pas assez de Points de Création investis dans la Préparation !") ui.notifications.warn("Pas assez de Points de Création investis dans la Préparation !")
@ -271,7 +269,7 @@ export class BoLRoll {
ui.notifications.warn("Impossible de trouver ce sort !") ui.notifications.warn("Impossible de trouver ce sort !")
return return
} }
spell = duplicate(spell) spell = foundry.utils.duplicate(spell)
return this.spellCheckWithSpell(actor, spell) return this.spellCheckWithSpell(actor, spell)
} }
@ -404,7 +402,7 @@ export class BoLRoll {
html.find('#attr').change((event) => { html.find('#attr').change((event) => {
let attrKey = event.currentTarget.value let attrKey = event.currentTarget.value
let actor = BoLUtility.getActorFromRollData(this.rollData) let actor = BoLUtility.getActorFromRollData(this.rollData)
this.rollData.attribute = duplicate(actor.system.attributes[attrKey]) this.rollData.attribute = foundry.utils.duplicate(actor.system.attributes[attrKey])
this.rollData.attrValue = actor.system.attributes[attrKey].value this.rollData.attrValue = actor.system.attributes[attrKey].value
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData) this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
this.updateTotalDice() this.updateTotalDice()
@ -412,7 +410,7 @@ export class BoLRoll {
html.find('#apt').change((event) => { html.find('#apt').change((event) => {
let aptKey = event.currentTarget.value let aptKey = event.currentTarget.value
let actor = BoLUtility.getActorFromRollData(this.rollData) let actor = BoLUtility.getActorFromRollData(this.rollData)
this.rollData.aptitude = duplicate(actor.system.aptitudes[aptKey]) this.rollData.aptitude = foundry.utils.duplicate(actor.system.aptitudes[aptKey])
this.rollData.aptValue = actor.system.aptitudes[aptKey].value this.rollData.aptValue = actor.system.aptitudes[aptKey].value
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData) this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
this.updateTotalDice() this.updateTotalDice()
@ -455,7 +453,7 @@ export class BoLRoll {
html.find('#horoscope-bonus-applied').change((event) => { html.find('#horoscope-bonus-applied').change((event) => {
this.rollData.selectedHoroscope = [] this.rollData.selectedHoroscope = []
for (let option of event.currentTarget.selectedOptions) { for (let option of event.currentTarget.selectedOptions) {
this.rollData.selectedHoroscope.push(duplicate(this.rollData.horoscopeBonusList[Number(option.index)])) this.rollData.selectedHoroscope.push(foundry.utils.duplicate(this.rollData.horoscopeBonusList[Number(option.index)]))
} }
let horoscopes = $('#horoscope-bonus-applied').val() let horoscopes = $('#horoscope-bonus-applied').val()
this.rollData.horoscopeBonus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length this.rollData.horoscopeBonus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length
@ -465,7 +463,7 @@ export class BoLRoll {
html.find('#horoscope-malus-applied').change((event) => { html.find('#horoscope-malus-applied').change((event) => {
this.rollData.selectedHoroscope = [] this.rollData.selectedHoroscope = []
for (let option of event.currentTarget.selectedOptions) { for (let option of event.currentTarget.selectedOptions) {
this.rollData.selectedHoroscope.push(duplicate(this.rollData.horoscopeBonusList[Number(option.index)])) this.rollData.selectedHoroscope.push(foundry.utils.duplicate(this.rollData.horoscopeBonusList[Number(option.index)]))
} }
let horoscopes = $('#horoscope-malus-applied').val() let horoscopes = $('#horoscope-malus-applied').val()
this.rollData.horoscopeMalus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length this.rollData.horoscopeMalus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length
@ -533,7 +531,7 @@ export class BoLRoll {
rollData.careerBonus = rollData.careerBonus ?? 0 rollData.careerBonus = rollData.careerBonus ?? 0
rollData.modRanged = rollData.modRanged ?? 0 rollData.modRanged = rollData.modRanged ?? 0
rollData.mod = rollData.mod ?? 0 rollData.mod = rollData.mod ?? 0
rollData.id = randomID(16) rollData.id = foundry.utils.randomID(16)
rollData.weaponModifier = 0 rollData.weaponModifier = 0
rollData.attackBonusDice = false rollData.attackBonusDice = false
rollData.armorMalus = 0 rollData.armorMalus = 0
@ -619,29 +617,40 @@ export class BoLDefaultRoll {
if (this.rollData.applyId) { if (this.rollData.applyId) {
BoLUtility.cleanupButtons(this.rollData.applyId) BoLUtility.cleanupButtons(this.rollData.applyId)
} }
this.rollData.optionsId = randomID(16) this.rollData.optionsId = foundry.utils.randomID(16)
this.rollData.applyId = randomID(16) this.rollData.applyId = foundry.utils.randomID(16)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async roll() { async roll() {
const r = new Roll(this.rollData.formula) const r = new Roll(this.rollData.formula)
//console.log("Roll formula", this.rollData.formula) await r.roll()
await r.roll({ "async": false })
let diceData = BoLUtility.getDiceData() let diceData = BoLUtility.getDiceData()
//console.log("DICEDATA", diceData) //console.log("DICEDATA", diceData)
const activeDice = r.terms[0].results.filter(r => r.active) const activeDice = r.terms[0].results.filter(r => r.active)
const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b) const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b)
this.rollData.roll = r this.rollData.roll = r
this.rollData.isSuccess = (r.total >= diceData.successValue)
this.rollData.isCritical = (diceTotal >= diceData.criticalSuccessValue)
this.rollData.isRealCritical = (diceTotal >= diceData.criticalSuccessValue)
this.rollData.isHeroic = (diceTotal >= diceData.criticalSuccessValue)
this.rollData.isLegendary = false
this.rollData.isFumble = (diceTotal <= diceData.criticalFailureValue) this.rollData.isFumble = (diceTotal <= diceData.criticalFailureValue)
this.rollData.isFailure = !this.rollData.isSuccess if ( this.rollData.isFumble ) {
this.rollData.isSuccess = false
this.rollData.isCritical = false
this.rollData.isRealCritical = false
this.rollData.isHeroic = false
this.rollData.isFailure = true
} else {
this.rollData.isCritical = (diceTotal >= diceData.criticalSuccessValue)
if ( this.rollData.isCritical) {
this.rollData.isSuccess = true
} else {
this.rollData.isSuccess = (r.total >= diceData.successValue)
}
this.rollData.isRealCritical = (diceTotal >= diceData.criticalSuccessValue)
this.rollData.isHeroic = (diceTotal >= diceData.criticalSuccessValue)
this.rollData.isFailure = !this.rollData.isSuccess
}
this.rollData.isLegendary = false
let actor = BoLUtility.getActorFromRollData(this.rollData) let actor = BoLUtility.getActorFromRollData(this.rollData)
if (this.rollData.reroll == undefined) { if (this.rollData.reroll == undefined) {
@ -691,7 +700,7 @@ export class BoLDefaultRoll {
flavor: msgFlavor, flavor: msgFlavor,
speaker: ChatMessage.getSpeaker({ actor: actor }), speaker: ChatMessage.getSpeaker({ actor: actor }),
}) })
this.rollData.roll = duplicate(this.rollData.roll) // Remove object, keep data (v111 ready) this.rollData.roll = foundry.utils.duplicate(this.rollData.roll) // Remove object, keep data (v111 ready)
msg.setFlag("world", "bol-roll-data", this.rollData) msg.setFlag("world", "bol-roll-data", this.rollData)
}) })
} }
@ -744,7 +753,7 @@ export class BoLDefaultRoll {
speaker: ChatMessage.getSpeaker({ actor: actor }), speaker: ChatMessage.getSpeaker({ actor: actor }),
flags: { msgType: "default" } flags: { msgType: "default" }
}) })
this.rollData.damageRoll = duplicate(this.rollData.damageRoll) this.rollData.damageRoll = foundry.utils.duplicate(this.rollData.damageRoll)
this.rollData.actor = undefined // Cleanup this.rollData.actor = undefined // Cleanup
msg.setFlag("world", "bol-roll-data", this.rollData) msg.setFlag("world", "bol-roll-data", this.rollData)
}) })
@ -779,7 +788,7 @@ export class BoLDefaultRoll {
//console.log("Formula", weaponFormula, damageFormula, this.rollData.weapon.data.data.properties.damage) //console.log("Formula", weaponFormula, damageFormula, this.rollData.weapon.data.data.properties.damage)
this.rollData.damageFormula = damageFormula this.rollData.damageFormula = damageFormula
this.rollData.damageRoll = new Roll(damageFormula) this.rollData.damageRoll = new Roll(damageFormula)
await this.rollData.damageRoll.roll({ "async": false }) await this.rollData.damageRoll.roll()
this.rollData.damageTotal = this.rollData.damageRoll.total this.rollData.damageTotal = this.rollData.damageRoll.total
console.log("DAMAGE !!!", damageFormula, attrDamageValue, this.rollData) console.log("DAMAGE !!!", damageFormula, attrDamageValue, this.rollData)
} }

View File

@ -8,7 +8,7 @@ export class BoLItemSheet extends ItemSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
return mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["bol", "sheet", "item"], classes: ["bol", "sheet", "item"],
template: "systems/bol/templates/item/item-sheet.hbs", template: "systems/bol/templates/item/item-sheet.hbs",
width: 650, width: 650,
@ -21,14 +21,16 @@ export class BoLItemSheet extends ItemSheet {
/** @override */ /** @override */
async getData(options) { async getData(options) {
const data = super.getData(options) const data = super.getData(options)
let itemData = duplicate(data.document) let itemData = foundry.utils.duplicate(data.document)
data.config = game.bol.config data.config = game.bol.config
data.item = itemData data.item = itemData
data.category = itemData.system.category data.category = itemData.system.category
data.isGM = game.user.isGM; data.isGM = game.user.isGM;
data.itemProperties = this.item.itemProperties; data.itemProperties = this.item.itemProperties;
data.description = await TextEditor.enrichHTML(this.object.system.description, { async: true }) data.description = await TextEditor.enrichHTML(this.object.system.description, { async: true })
if (data.document.actor) {
data.careers = data.document.actor.careers
}
// Dynamic default data fix/adapt // Dynamic default data fix/adapt
if (itemData.type == "item") { if (itemData.type == "item") {
if (!itemData.system.category) { if (!itemData.system.category) {
@ -76,7 +78,7 @@ export class BoLItemSheet extends ItemSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
postItem() { postItem() {
let chatData = duplicate(this.item) let chatData = foundry.utils.duplicate(this.item)
if (this.actor) { if (this.actor) {
chatData.actor = { id: this.actor.id }; chatData.actor = { id: this.actor.id };
} }

View File

@ -1,620 +0,0 @@
{
"titre1": [
{
"prefix": "la",
"name": "Prophétie"
},
{
"prefix": "les",
"name": "Grottes",
"isLieu": true
},
{
"prefix": "les",
"name": "Collines",
"isLieu": true
},
{
"prefix": "les",
"name": "Voleurs",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "les",
"name": "Sorcier(s)",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "la",
"name": "Bataille"
},
{
"prefix": "la",
"name": "Légende"
},
{
"prefix": "la",
"name": "Tour",
"isLieu": true
},
{
"prefix": "l'",
"name": "Ile",
"isLieu": true
},
{
"prefix": "les",
"name": "Pirates",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "les",
"name": "Druide(s)",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "le",
"name": "Navire",
"isCarriere": false
},
{
"prefix": "la",
"name": "Couronne",
"isObjet": true
},
{
"prefix": "la",
"name": "Cité",
"isLieu": true
},
{
"prefix": "le",
"name": "Désert",
"isLieu": true
},
{
"prefix": "les",
"name": "Bête(s)",
"isEnnemi": true,
"isLieu": false
},
{
"prefix": "les",
"name": "Démon(s)",
"isEnnemi": true,
"isLieu": false
},
{
"prefix": "le",
"name": "Trésor",
"isObjet": true
},
{
"prefix": "l'",
"name": "Epée",
"isObjet": true
},
{
"prefix": "l'",
"name": "Arène",
"isLieu": true
},
{
"prefix": "les",
"name": "Marais",
"isLieu": true
},
{
"prefix": "les",
"name": "Seigneur(s)",
"isEnnemi": true,
"isLieu": false
},
{
"prefix": "les",
"name": "Assassin(s)",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "le",
"name": "Culte",
"isEnnemi": true,
"isCarriere": false
},
{
"prefix": "le",
"name": "Secret",
"isCarriere": false
},
{
"prefix": "le",
"name": "Palais",
"isLieu": true
},
{
"prefix": "la",
"name": "Mer",
"isLieu": true
},
{
"prefix": "les",
"name": "Barbares",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "le",
"name": "Manuscrit",
"isObjet": true
},
{
"prefix": "les",
"name": "Plaines",
"isLieu": true
},
{
"prefix": "le",
"name": "Sang",
"isLieu": false
},
{
"prefix": "la",
"name": "Tombe",
"isLieu": true
},
{
"prefix": "la",
"name": "Forêt",
"isLieu": true
},
{
"prefix": "les",
"name": "Esclaves",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "les",
"name": "Mendiant(s)",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "les",
"name": "Montagnes",
"isCarriereLieu": true
}
],
"titre2": [
{
"prefix": "du",
"name": "mal"
},
{
"prefix": "et le",
"name": "Roi Maussade",
"isEnnemi": true
},
{
"prefix": "et la",
"name": "pestilence",
"isEnnemi": false
},
{
"prefix": "de",
"name": "Malakut",
"isLieu": true
},
{
"prefix": "d'",
"name": "Halakh",
"isLieu": true
},
{
"prefix": "d'",
"name": "Hyrdral",
"isLieu": true
},
{
"prefix": "des",
"name": "esprits abandonnés",
"isEnnemi": true
},
{
"prefix": "du",
"name": "chaos",
"isEnnemi": true
},
{
"prefix": "de la",
"name": "folie",
"isEnnemi": false
},
{
"prefix": "de",
"name": "Satarla",
"isLieu": true
},
{
"prefix": "d'",
"name": "Urceb",
"isLieu": true
},
{
"prefix": "des",
"name": "Terres Désolées",
"isLieu": true
},
{
"prefix": "de la",
"name": "mort",
"isLieu": false
},
{
"prefix": "des",
"name": "idoles impies",
"isObjet": true
},
{
"prefix": "des",
"name": "ténèbres",
"isObjet": false
},
{
"prefix": "de",
"name": "Parsool",
"isLieu": true
},
{
"prefix": "de",
"name": "Qiddesh",
"isLieu": true
},
{
"prefix": "de",
"name": "Kasht",
"isLieu": true
},
{
"prefix": "de la ",
"name": "falalité",
"isLieu": false
},
{
"prefix": "du",
"name": "Nécromant",
"isEnnemi": true
},
{
"prefix": "du",
"name": "Néant",
"isEnnemi": false
},
{
"prefix": "de",
"name": "Lysor",
"isLieu": true
},
{
"prefix": "d'",
"name": "Oosal",
"isLieu": true
},
{
"prefix": "de",
"name": "Thulé",
"isLieu": true
},
{
"prefix": "du",
"name": "désespoir",
"isLieu": false
},
{
"prefix": "du",
"name": "Dieu Bouffi",
"isEnnemi": true
},
{
"prefix": "du",
"name": "silence",
"isEnnemi": false
},
{
"prefix": "de",
"name": "Tyrus",
"isLieu": true
},
{
"prefix": "d'",
"name": "Ygddar",
"isLieu": true
},
{
"prefix": "de",
"name": "la Côte de Feu",
"isLieu": true
},
{
"prefix": "des",
"name": "ombres cruelles",
"isLieu": false
},
{
"prefix": "de la",
"name": "poussière écarlate",
"isLieu": false
},
{
"prefix": "du",
"name": "destin",
"isLieu": false
},
{
"prefix": "du",
"name": "Valgard",
"isLieu": true
},
{
"prefix": "de",
"name": "Qeb",
"isLieu": true
},
{
"prefix": "de",
"name": "la Mer Inconnue",
"isLieu": true
}
],
"mission": [
{
"name": "dattaquer un lieu."
},
{
"name": "de détruire un certain objet."
},
{
"name": "de kidnapper quelquun."
},
{
"name": "dobtenir une certaine chose."
},
{
"name": "dexplorer un lieu."
},
{
"name": "de sauver une personne."
},
{
"name": "déchapper à quelquun."
},
{
"name": "de fuir un lieu."
},
{
"name": "de trouver une personne."
},
{
"name": "de trouver un lieu."
},
{
"name": "de trouver chose."
},
{
"name": "de protéger une personne."
},
{
"name": "de protéger un lieu."
},
{
"name": "de protéger chose."
},
{
"name": "de dérober une certaine chose."
},
{
"name": "de tuer une personne."
},
{
"name": "de détruire une chose."
},
{
"name": "descorter une personne."
},
{
"name": "de transporter une chose."
}
],
"carriere": [
"Noble",
"Acrobate",
"Sorcier",
"Alchimiste",
"Esclave",
"Courtisane",
"Médecin",
"Marin",
"Érudit",
"Mendiant",
"Scribe",
"Poète",
"Forgeron",
"Prêtre",
"Danseur",
"Marchand",
"Pilote des airs",
"Fermier"
],
"lieux1": [
"Palais",
"Donjon",
"Ruines",
"Sanctuaire",
"Crypte",
"Forteresse",
"Tombeau",
"Grottes",
"Tour",
"Antre",
"Île",
"Montagne"
],
"lieux2": [
"de la mort.",
"de la destruction.",
"du désespoir.",
"des morts-vivants.",
"du sage.",
"de l'or.",
"de la tempête.",
"de la terreur.",
"descannibales.",
"du désespoir.",
"des Rois-Sorciers.",
"des âmes perdues."
],
"objets1": [
"Livre",
"Anneau",
"Coupe",
"Joyau",
"Casque",
"Parchemin",
"Couronne",
"Sceau",
"Cristal",
"Crâne",
"Épée",
"Bâton"
],
"objets2": [
"des sept sceaux.",
"de l'éternelle douleur.",
"du sang bouillonnant.",
"de la mort hideuse.",
"du pouvoir suprême.",
"du serpent sournois.",
"du plaisir infini.",
"de la richesse illusoire.",
"de la cruelle trahison.",
"du froid funeste.",
"des spectres inapaisés.",
"du mystère."
],
"motivation": [
"cest le genre de choses que fait Krongar.",
"sinon il finira en prison.",
"il est victime dun chantage.",
"il a trouvé une carte.",
"il a été maudit.",
"il a eu une vision (peut-être un soir de beuverie).",
"il a été engagé pour le faire.",
"il a surpris une conversation.",
"il a lu quelque chose dans un ancien manuscrit.",
"il est tombé accidentellement dans cette affaire.",
"il cherche à assouvir une vengeance.",
"il a ,été dupé."
],
"rival": [
"un poète obsédé.",
"un prince (esse) guerrier.",
"un ministre corrompu.",
"un sectateur fanatique.",
"un noble arrogant.",
"un étrange alchimiste.",
"un sorcier maléfique.",
"un druide cruel.",
"un marchand cupide.",
"un brigand sans foi ni loi.",
"un démon sanguinaire.",
"un fantôme errant."
],
"dieu": [
"Tharungozoth",
"Yrzlak",
"Dyr",
"Knothakon",
"Hadron",
"Shazzadion",
"Chiomalla",
"SaTel",
"Morgazzon",
"Hurm",
"Afyra",
"Grondil",
"Zaggath",
"Zalkyr",
"Fillana",
"Lilandra",
"Zylidith",
"Quathoomar",
"Iondal",
"Piandra",
"Nemmereth",
"Charkond",
"Karyzon",
"Zarymphyxos",
"Kryphondus"
],
"complique1": [
"cest toujours comme ça avec Krongar !",
"la situation réveille chez Krongar des peurs ancestrales.",
"un usurier et ses hommes de main veulent récupérer leur argent.",
"une grave épidémie ravage la région.",
"Krongar est traqué pour un crime passé.",
"les actions dun groupe de rebelles rendent la région peu sûre.",
"des hordes de guerriers envahissent la région pour la conquérir",
"un(e) ancien(ne) admirateur (trice) éconduit(e) cherche à se venger.",
"la loi locale est très sévère et interdit une chose nécessaire à laccomplissement de la mission.",
"un(e) admirateur (trice) inattendu(e) déclare son amour.",
"un rival qui fut défait autrefois réapparaît et met son grain de sel.",
"la folie de Morgazzon fait des ravages dans la région."
],
"obstacle": [
"dun ancien secret.",
"dun long voyage.",
"dune malédiction.",
"dun voleur rusé.",
"dune forte troupe de soldats.",
"dun énorme monstre.",
"dune horde de monstres.",
"dun manque de temps.",
"de gardes et de pièges magiques.",
"dune catastrophe naturelle sur le point de se produire.",
"dune énigme à résoudre.",
"dune bataille à gagner."
],
"retournement": [
"Lennemi est en fait Krongar lui-même, venu dune autre réalité !",
"Toute cette histoire était un piège machiavélique !",
"Lennemi est en fait un vieil ami ou un allié qui a comploté dans lombre !",
"Krongar est contraint de sassocier à un rival pour accomplir la mission !",
"Tout ce qui semblait ordinaire se révèle en fait surnaturel !",
"Lennemi est en fait le père, la mère, le frère ou la sœur de Krongar !",
"Une toute autre mission attend en fait notre héros !",
"Parfois, il ny a pas de retournement de situation !",
"i la mission est accomplie, cela entraînera de terribles répercussions !",
"Le destin offre à Krongar une chance daméliorer les choses, et il est renvoyé dans le temps au début de laventure. La saga recommence, mais cette fois sans retournement de situation !",
"Un ami ou un allié a trahi Krongar !",
"Les dieux sont furieux et lui imposent d'autres tâches"
],
"recompense": [
"Rien du tout ! On sest joué de lui !",
"Beaucoup moins quescompté.",
"Beaucoup moins quescompté, mais il gagne au moins la reconnaissance dune personne haut placée.",
"Beaucoup moins quescompté, mais il est marqué par les dieux (avantage).",
"La récompense escomptée.",
"La récompense escomptée, et il est marqué par les dieux (avantage).",
"La récompense escomptée, ainsi que la reconnaissance dune personne haut placée.",
"Plus quescompté.",
"Plus quescompté, ainsi que la reconnaissance dune personne haut placée.",
"Plus quescompté, et il est marqué par les dieux (avantage).",
"Plus quescompté, ainsi que la reconnaissance dune personne haut placée, et il est marqué par les dieux (avantage).",
"Une promotion... Longue vie au roi Krongar !"
]
}

View File

@ -33,9 +33,9 @@ export class BoLTokenHud {
let action = hudData.actionsList[actionIndex] let action = hudData.actionsList[actionIndex]
const actionItem = actor.items.get(action._id) const actionItem = actor.items.get(action._id)
if (actionItem.system.subtype == "weapon") { if (actionItem.system.subtype == "weapon") {
BoLRoll.weaponCheckWithWeapon(hudData.actor, duplicate(actionItem)) BoLRoll.weaponCheckWithWeapon(hudData.actor, foundry.utils.duplicate(actionItem))
} else if (actionItem.system.subtype == "fightoption") { } else if (actionItem.system.subtype == "fightoption") {
let chatData = duplicate(actionItem) let chatData = foundry.utils.duplicate(actionItem)
if (actionItem.actor) { if (actionItem.actor) {
chatData.actor = { id: actionItem.actor._id }; chatData.actor = { id: actionItem.actor._id };
} }

View File

@ -1,86 +0,0 @@
/* -------------------------------------------- */
import { BoLUtility } from "./bol-utility.js";
/* -------------------------------------------- */
export class BoLAdventureGenerator {
/* -------------------------------------------- */
static async init() {
this.adventureData = await fetchJsonWithTimeout("systems/bol/module/system/adventure_data.json")
}
/* -------------------------------------------- */
static async createAdventure() {
let roll1 = new Roll("1d" + this.adventureData.titre1.length).evaluate({ async: false })
let roll2 = new Roll("1d" + this.adventureData.titre2.length).evaluate({ async: false })
let p1 = this.adventureData.titre1[roll1.result - 1]
let p2 = this.adventureData.titre2[roll2.result - 1]
let story = {}
story.title = "Krongar et " + p1.prefix + " " + p1.name + " " + p2.prefix + " " + p2.name
let rollM = new Roll("1d" + this.adventureData.mission.length).evaluate({ async: false })
story.mission = "La mission de Krongar est de " + this.adventureData.mission[rollM.result - 1].name
if (!p1.isCarriere && !p2.isCarriere) {
let rollC = new Roll("1d" + this.adventureData.carriere.length).evaluate({ async: false })
story.carriere = "Une carrière : " + this.adventureData.carriere[rollC.result - 1]
}
if (!p1.isLieu && !p2.isLieu) {
let rollL1 = new Roll("1d" + this.adventureData.lieux1.length).evaluate({ async: false })
let rollL2 = new Roll("1d" + this.adventureData.lieux2.length).evaluate({ async: false })
story.lieu = "Un lieu : " + this.adventureData.lieux1[rollL1.result - 1] + " " + this.adventureData.lieux2[rollL2.result - 1]
}
if (!p1.isObjet && !p2.isObjet) {
let rollO1 = new Roll("1d" + this.adventureData.objets1.length).evaluate({ async: false })
let rollO2 = new Roll("1d" + this.adventureData.objets2.length).evaluate({ async: false })
story.objet = "Un objet : " + this.adventureData.objets1[rollO1.result - 1] + " " + this.adventureData.objets2[rollO2.result - 1]
}
let rollMOT = new Roll("1d" + this.adventureData.motivation.length).evaluate({ async: false })
story.motivation = "Krongar entreprend cette mission parce que " + this.adventureData.motivation[rollMOT.result - 1]
if (!p1.isEnnemi && !p2.isEnnemi) {
let rollE = new Roll("1d" + this.adventureData.rival.length).evaluate({ async: false })
story.rival = "Un rival : " + this.adventureData.rival[rollE.result - 1]
}
let rollDieu = new Roll("1d6").evaluate({ async: false })
if (rollDieu.result == 6) {
rollDieu = new Roll("1d" + this.adventureData.dieu.length).evaluate({ async: false })
story.dieu = "Un Dieu est impliqué : " + this.adventureData.dieu[rollDieu.result - 1]
}
let rollComp = new Roll("1d6").evaluate({ async: false })
if (rollComp.result >= 5) {
rollComp = new Roll("1d" + this.adventureData.complique1.length).evaluate({ async: false })
story.complication = "Une complication : " + this.adventureData.complique1[rollComp.result - 1]
}
let rollObs = new Roll("1d6").evaluate({ async: false })
if (rollObs.result >= 5) {
rollObs = new Roll("1d" + this.adventureData.obstacle.length).evaluate({ async: false })
story.obstacle = "Un obstacle : " + this.adventureData.obstacle[rollObs.result - 1]
}
let rollRet = new Roll("1d6").evaluate({ async: false })
if (rollRet.result == 6) {
rollRet = new Roll("1d" + this.adventureData.retournement.length).evaluate({ async: false })
story.retournement = "Un retournement : " + this.adventureData.retournement[rollRet.result - 1]
}
let rollRec = new Roll("1d" + this.adventureData.recompense.length).evaluate({ async: false })
story.recompense = "Pour sa peine, Krongar reçoit " + this.adventureData.recompense[rollRec.result - 1]
ChatMessage.create({
alias: this.name,
whisper: BoLUtility.getUsers(user => user.isGM),
content: await renderTemplate('systems/bol/templates/chat/chat-adventure-result.hbs',
{ name: "Aventure !", img: "icons/commodities/gems/gem-cluster-red.webp", story : story})
})
}
}

View File

@ -40,14 +40,14 @@ export class BoLCalendar extends Application {
constructor() { constructor() {
super(); super();
// position // position
this.calendarPos = duplicate(game.settings.get("bol", "calendar-pos")); this.calendarPos = foundry.utils.duplicate(game.settings.get("bol", "calendar-pos"));
if (this.calendarPos == undefined || this.calendarPos.top == undefined) { if (this.calendarPos == undefined || this.calendarPos.top == undefined) {
this.calendrierPos = BoLCalendar.createCalendarPos() this.calendrierPos = BoLCalendar.createCalendarPos()
game.settings.set("bol", "calendar-pos", this.calendarPos) game.settings.set("bol", "calendar-pos", this.calendarPos)
} }
// Calendar // Calendar
this.calendar = duplicate(game.settings.get("bol", "calendar") ?? BoLCalendar.getCalendar(0)); this.calendar = foundry.utils.duplicate(game.settings.get("bol", "calendar") ?? BoLCalendar.getCalendar(0));
this.calendar.year = this.calendar.year || 900 this.calendar.year = this.calendar.year || 900
this.calendar.month = 0 this.calendar.month = 0
@ -58,7 +58,7 @@ export class BoLCalendar extends Application {
/* -------------------------------------------- */ /* -------------------------------------------- */
static get defaultOptions() { static get defaultOptions() {
return mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
template: "systems/bol/templates/calendar-template.html", template: "systems/bol/templates/calendar-template.html",
popOut: false, popOut: false,
resizable: false resizable: false
@ -95,11 +95,11 @@ export class BoLCalendar extends Application {
this.calendar.hour -= 24 this.calendar.hour -= 24
await this.incrementDay() await this.incrementDay()
} }
game.settings.set("bol", "calendar", duplicate(this.calendar)); game.settings.set("bol", "calendar", foundry.utils.duplicate(this.calendar));
// Notification aux joueurs // TODO: replace with Hook on game settings update // Notification aux joueurs // TODO: replace with Hook on game settings update
game.socket.emit(SYSTEM_SOCKET_ID, { game.socket.emit(SYSTEM_SOCKET_ID, {
msg: "msg_sync_time", msg: "msg_sync_time",
data: duplicate(this.calendrier) data: foundry.utils.duplicate(this.calendrier)
}); });
} }
@ -112,7 +112,7 @@ export class BoLCalendar extends Application {
/* -------------------------------------------- */ /* -------------------------------------------- */
syncPlayerTime(calendrier) { syncPlayerTime(calendrier) {
this.calendrier = duplicate(calendrier); // Local copy update this.calendrier = foundry.utils.duplicate(calendrier); // Local copy update
this.updateDisplay(); this.updateDisplay();
} }
@ -123,7 +123,7 @@ export class BoLCalendar extends Application {
} }
this.calendrier.heureRdD = indexHeure; this.calendrier.heureRdD = indexHeure;
this.calendrier.minutesRelative = 0; this.calendrier.minutesRelative = 0;
game.settings.set(SYSTEM_RDD, "calendrier", duplicate(this.calendrier)); game.settings.set(SYSTEM_RDD, "calendrier", foundry.utils.duplicate(this.calendrier));
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -312,13 +312,13 @@ export class BoLCalendar extends Application {
this.calendrier.jour = Number(calendrierData.jourMois) - 1; this.calendrier.jour = Number(calendrierData.jourMois) - 1;
this.calendrier.moisRdD = RdDCalendrier.getChiffreFromSigne(calendrierData.moisKey); this.calendrier.moisRdD = RdDCalendrier.getChiffreFromSigne(calendrierData.moisKey);
this.calendrier.heureRdD = RdDCalendrier.getChiffreFromSigne(calendrierData.heureKey); this.calendrier.heureRdD = RdDCalendrier.getChiffreFromSigne(calendrierData.heureKey);
game.settings.set(SYSTEM_RDD, "calendrier", duplicate(this.calendrier)); game.settings.set(SYSTEM_RDD, "calendrier", foundry.utils.duplicate(this.calendrier));
await this.rebuildListeNombreAstral(); await this.rebuildListeNombreAstral();
game.socket.emit(SYSTEM_SOCKET_ID, { game.socket.emit(SYSTEM_SOCKET_ID, {
msg: "msg_sync_time", msg: "msg_sync_time",
data: duplicate(this.calendrier) data: foundry.utils.duplicate(this.calendrier)
}); });
this.updateDisplay(); this.updateDisplay();
@ -326,7 +326,7 @@ export class BoLCalendar extends Application {
/* -------------------------------------------- */ /* -------------------------------------------- */
async showCalendarEditor() { async showCalendarEditor() {
let calendrierData = duplicate(this.fillCalendrierData()); let calendrierData = foundry.utils.duplicate(this.fillCalendrierData());
if (this.editeur == undefined) { if (this.editeur == undefined) {
calendrierData.jourMoisOptions = RdDCalendrier.buildJoursMois(); calendrierData.jourMoisOptions = RdDCalendrier.buildJoursMois();
calendrierData.heuresOptions = [0, 1]; calendrierData.heuresOptions = [0, 1];
@ -344,7 +344,7 @@ export class BoLCalendar extends Application {
/* -------------------------------------------- */ /* -------------------------------------------- */
async showAstrologieEditor() { async showAstrologieEditor() {
let calendrierData = duplicate(this.fillCalendrierData()); let calendrierData = foundry.utils.duplicate(this.fillCalendrierData());
let astrologieArray = []; let astrologieArray = [];
this.listeNombreAstral = this.listeNombreAstral || []; this.listeNombreAstral = this.listeNombreAstral || [];
for (let astralData of this.listeNombreAstral) { for (let astralData of this.listeNombreAstral) {
@ -353,7 +353,7 @@ export class BoLCalendar extends Application {
let actor = game.actors.get(vf.actorId); let actor = game.actors.get(vf.actorId);
vf.actorName = (actor) ? actor.name : "Inconnu"; vf.actorName = (actor) ? actor.name : "Inconnu";
} }
astrologieArray.push(duplicate(astralData)); astrologieArray.push(foundry.utils.duplicate(astralData));
} }
let heuresParActeur = {}; let heuresParActeur = {};
for (let actor of game.actors) { for (let actor of game.actors) {
@ -448,7 +448,7 @@ export class BoLCalendar extends Application {
game.system.rdd.calendrier.calendrierPos.top = yPos; game.system.rdd.calendrier.calendrierPos.top = yPos;
game.system.rdd.calendrier.calendrierPos.left = xPos; game.system.rdd.calendrier.calendrierPos.left = xPos;
if (game.user.isGM) { if (game.user.isGM) {
game.settings.set(SYSTEM_RDD, "calendrier-pos", duplicate(game.system.rdd.calendrier.calendrierPos)); game.settings.set(SYSTEM_RDD, "calendrier-pos", foundry.utils.duplicate(game.system.rdd.calendrier.calendrierPos));
} }
} }
} }
@ -456,7 +456,7 @@ export class BoLCalendar extends Application {
game.system.rdd.calendrier.calendrierPos.top = 200; game.system.rdd.calendrier.calendrierPos.top = 200;
game.system.rdd.calendrier.calendrierPos.left = 200; game.system.rdd.calendrier.calendrierPos.left = 200;
if (game.user.isGM) { if (game.user.isGM) {
game.settings.set(SYSTEM_RDD, "calendrier-pos", duplicate(game.system.rdd.calendrier.calendrierPos)); game.settings.set(SYSTEM_RDD, "calendrier-pos", foundry.utils.duplicate(game.system.rdd.calendrier.calendrierPos));
} }
this.setPos(game.system.rdd.calendrier.calendrierPos); this.setPos(game.system.rdd.calendrier.calendrierPos);
} }

View File

@ -1,162 +0,0 @@
/* -------------------------------------------- */
import { BoLUtility } from "./bol-utility.js";
import { BoLRoll } from "../controllers/bol-rolls.js";
/* -------------------------------------------- */
export class BoLCharacterSummary extends Application {
/* -------------------------------------------- */
static displayPCSummary(){
game.bol.charSummary.render(true)
}
/* -------------------------------------------- */
updatePCSummary(){
if ( this.rendered) {
this.render(true)
}
}
/* -------------------------------------------- */
static createSummaryPos() {
return { top: 200, left: 200 };
}
/* -------------------------------------------- */
static ready() {
if ( !game.user.isGM ) { // Uniquement si GM
return
}
let charSummary = new BoLCharacterSummary()
game.bol.charSummary = charSummary
}
/* -------------------------------------------- */
constructor() {
super();
//game.settings.set("world", "character-summary-data", {npcList: [], x:0, y:0})
this.settings = game.settings.get("world", "character-summary-data")
}
/* -------------------------------------------- */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
template: "systems/bol/templates/apps/character-summary-template.html",
popOut: true,
resizable: true,
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
classes: ["bol", "dialog"], width: 820, height: 'fit-content'
})
}
/* -------------------------------------------- */
getData() {
let formData = super.getData();
formData.pcs = game.actors.filter( ac => ac.type == "character" && ac.hasPlayerOwner )
formData.npcs = []
let newList = []
let toUpdate = false
for( let actorId of this.settings.npcList ) {
let actor = game.actors.get(actorId)
if (actor) {
formData.npcs.push( actor )
newList.push(actorId)
} else {
toUpdate = true
}
}
formData.config = game.bol.config
formData.horoscopeGroupList = game.settings.get("bol", "horoscope-group")
if ( toUpdate ) {
this.settings.npcList = newList
//console.log("Going to update ...", this.settings)
game.settings.set("world", "character-summary-data", this.settings)
}
return formData
}
/* -------------------------------------------- */
updateNPC() {
game.settings.set("world", "character-summary-data", game.bol.charSummary.settings)
game.bol.charSummary.close()
setTimeout( function() { game.bol.charSummary.render(true)}, 500)
}
/* -------------------------------------------- */
async _onDrop(event) {
//console.log("Dragged data are : ", dragData)
let data = event.dataTransfer.getData('text/plain')
let dataItem = JSON.parse( data)
let actor = fromUuidSync(dataItem.uuid)
if (actor) {
game.bol.charSummary.settings.npcList.push( actor.id )
game.bol.charSummary.updateNPC()
} else {
ui.notifications.warn( game.i18n.localize("BOL.ui.noactorfound") )
}
}
/* -------------------------------------------- */
/** @override */
async activateListeners(html) {
super.activateListeners(html);
html.find('.actor-open').click((event) => {
const li = $(event.currentTarget).parents(".item")
const actor = game.actors.get(li.data("actor-id"))
actor.sheet.render(true)
})
html.find('.summary-roll').click((event) => {
const li = $(event.currentTarget).parents(".item")
const actor = game.actors.get(li.data("actor-id"))
let type = $(event.currentTarget).data("type")
let key = $(event.currentTarget).data("key")
if ( type == "attribute") {
BoLRoll.attributeCheck(actor, key, event)
} else if (type == "aptitude") {
BoLRoll.aptitudeCheck(actor, key, event)
}
})
html.find('.actor-delete').click(event => {
const li = $(event.currentTarget).parents(".item");
let actorId = li.data("actor-id")
let newList = game.bol.charSummary.settings.npcList.filter(id => id != actorId)
game.bol.charSummary.settings.npcList = newList
game.bol.charSummary.updateNPC()
})
html.find('#horoscope-group-edit-available').change(event => {
const horoId = $(event.currentTarget).data("horo-id")
let newValue = event.currentTarget.value
let horoscopes = duplicate(game.settings.get("bol", "horoscope-group"))
if ( horoId && horoscopes[horoId]) {
horoscopes[horoId].availableDice = Number(newValue)
if (newValue <= 0) {
horoscopes[horoId] = undefined
}
game.settings.set("bol", "horoscope-group", horoscopes)
setTimeout(function() { BoLUtility.updateSheets()}, 800 )
}
})
html.find('#horoscope-group-edit-max').change(event => {
const horoId = $(event.currentTarget).data("horo-id")
let newValue = event.currentTarget.value
let horoscopes = duplicate(game.settings.get("bol", "horoscope-group"))
if ( horoId && horoscopes[horoId]) {
horoscopes[horoId].maxDice = Number(newValue)
if (newValue <= 0) {
horoscopes[horoId] = undefined
}
game.settings.set("bol", "horoscope-group", horoscopes)
setTimeout(function() { BoLUtility.updateSheets()}, 800 )
}
})
}
}

View File

@ -1,6 +1,3 @@
/* -------------------------------------------- */
import { BoLAdventureGenerator } from "./bol-adventure-generator.js"
import { BoLCharacterSummary } from "./bol-character-summary.js"
/* -------------------------------------------- */ /* -------------------------------------------- */
export class BoLCommands { export class BoLCommands {
@ -8,8 +5,6 @@ export class BoLCommands {
static init() { static init() {
if (!game.bol.commands) { if (!game.bol.commands) {
const bolCommands = new BoLCommands() const bolCommands = new BoLCommands()
bolCommands.registerCommand({ path: ["/adventure"], func: (content, msg, params) => BoLAdventureGenerator.createAdventure(), descr: "Nouvelle idée d'aventure!" });
bolCommands.registerCommand({ path: ["/pcview"], func: (content, msg, params) => BoLCharacterSummary.displayPCSummary(), descr: "Affiche la liste des PJs!" });
game.bol.commands = bolCommands game.bol.commands = bolCommands
} }
@ -88,7 +83,7 @@ export class BoLCommands {
console.log("===> Processing command") console.log("===> Processing command")
let command = commandsTable[name]; let command = commandsTable[name];
path = path + name + " "; path = path + name + " ";
if (command && command.subTable) { if (command?.subTable) {
if (params[0]) { if (params[0]) {
return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path) return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path)
} }
@ -97,9 +92,9 @@ export class BoLCommands {
return true; return true;
} }
} }
if (command && command.func) { if (command?.func) {
const result = command.func(content, msg, params); const result = command.func(content, msg, params);
if (result == false) { if (!result) {
BoLCommands._chatAnswer(msg, command.descr); BoLCommands._chatAnswer(msg, command.descr);
} }
return true; return true;

View File

@ -136,6 +136,10 @@ export class BoLUtility {
this.successValue = Number(game.settings.get("bol", "dice-success-value")) this.successValue = Number(game.settings.get("bol", "dice-success-value"))
this.criticalSuccessValue = Number(game.settings.get("bol", "dice-critical-success-value")) this.criticalSuccessValue = Number(game.settings.get("bol", "dice-critical-success-value"))
this.criticalFailureValue = Number(game.settings.get("bol", "dice-critical-failure-value")) this.criticalFailureValue = Number(game.settings.get("bol", "dice-critical-failure-value"))
// Update the effect modifiers
game.bol.config.effectIdentifiers = foundry.utils.mergeObject(game.bol.config.effectIdentifiers, game.bol.config.attackAttributes)
game.bol.config.effectIdentifiers = foundry.utils.mergeObject(game.bol.config.effectIdentifiers, game.bol.config.aptitudes)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -196,7 +200,7 @@ export class BoLUtility {
//$("#logo").attr("src", this.getLogoTopLeft() ) //$("#logo").attr("src", this.getLogoTopLeft() )
$("#logo").css("content", `url(${this.getLogoTopLeft()})`) $("#logo").css("content", `url(${this.getLogoTopLeft()})`)
CONFIG.statusEffects = duplicate(game.bol.config.statusEffects) CONFIG.statusEffects = foundry.utils.duplicate(game.bol.config.statusEffects)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -311,7 +315,7 @@ export class BoLUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static blindMessageToGM(chatOptions) { static blindMessageToGM(chatOptions) {
let chatGM = duplicate(chatOptions); let chatGM = foundry.utils.duplicate(chatOptions);
chatGM.whisper = this.getUsers(user => user.isGM); chatGM.whisper = this.getUsers(user => user.isGM);
chatGM.content = "Blind message of " + game.user.name + "<br>" + chatOptions.content; chatGM.content = "Blind message of " + game.user.name + "<br>" + chatOptions.content;
console.log("blindMessageToGM", chatGM); console.log("blindMessageToGM", chatGM);
@ -323,7 +327,7 @@ export class BoLUtility {
if (rollData.targetId) { if (rollData.targetId) {
// Broadcast to GM or process it directly in case of GM defense // Broadcast to GM or process it directly in case of GM defense
if (!game.user.isGM) { if (!game.user.isGM) {
game.socket.emit("system.bol", { name: "msg_attack_success", data: duplicate(rollData) }) game.socket.emit("system.bol", { name: "msg_attack_success", data: foundry.utils.duplicate(rollData) })
} else { } else {
BoLUtility.processAttackSuccess(rollData) BoLUtility.processAttackSuccess(rollData)
} }
@ -337,7 +341,7 @@ export class BoLUtility {
// If the user is the message author or the actor owner, proceed // If the user is the message author or the actor owner, proceed
const actor = game.actors.get(data.message.speaker.actor) const actor = game.actors.get(data.message.speaker.actor)
//console.log("FOUND 1!!! ", actor) //console.log("FOUND 1!!! ", actor)
if (actor && actor.isOwner) return if (actor?.isOwner) return
else if (game.user.isGM || data.author.id === game.user.id) return else if (game.user.isGM || data.author.id === game.user.id) return
const divButtons = chatCard.find('.actions-section') const divButtons = chatCard.find('.actions-section')
@ -354,7 +358,7 @@ export class BoLUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static requestInitRoll(actorId, combatData) { static requestInitRoll(actorId, combatData) {
let actor = game.actors.get(actorId) let actor = game.actors.get(actorId)
if (actor && actor.isOwner) { if (actor?.isOwner) {
ui.notifications.info(game.i18n.localize("BOL.ui.warninitiative")) ui.notifications.info(game.i18n.localize("BOL.ui.warninitiative"))
BoLRoll.aptitudeCheck(actor, "init", undefined, combatData) BoLRoll.aptitudeCheck(actor, "init", undefined, combatData)
} }
@ -447,7 +451,7 @@ export class BoLUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async processDamageHandling(attackId, defenseMode, weaponId = -1, msgId) { static async processDamageHandling(attackId, defenseMode, weaponId, msgId) {
if (!game.user.isGM) { if (!game.user.isGM) {
return return
} }
@ -457,7 +461,7 @@ export class BoLUtility {
console.log("Damage Handling", attackId, defenseMode, weaponId) console.log("Damage Handling", attackId, defenseMode, weaponId)
// Only GM process this // Only GM process this
if (rollData && rollData.defenderId) { if (rollData?.defenderId) {
if (rollData.defenseDone || defenseMode == 'damage-not-applied') { if (rollData.defenseDone || defenseMode == 'damage-not-applied') {
return return
} // ?? Why ??? } // ?? Why ???
@ -469,7 +473,7 @@ export class BoLUtility {
if (defenseMode == 'damage-with-armor') { if (defenseMode == 'damage-with-armor') {
let armorFormula = defender.getArmorFormula() let armorFormula = defender.getArmorFormula()
rollData.rollArmor = new Roll(armorFormula) rollData.rollArmor = new Roll(armorFormula)
rollData.rollArmor.roll({ async: false }) await rollData.rollArmor.roll()
rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total
rollData.finalDamage = rollData.damageTotal - rollData.armorProtect rollData.finalDamage = rollData.damageTotal - rollData.armorProtect
rollData.finalDamage = (rollData.finalDamage < 0) ? 0 : rollData.finalDamage rollData.finalDamage = (rollData.finalDamage < 0) ? 0 : rollData.finalDamage
@ -483,10 +487,10 @@ export class BoLUtility {
if (defenseMode == 'hero-reduce-damage') { if (defenseMode == 'hero-reduce-damage') {
let armorFormula = defender.getArmorFormula() let armorFormula = defender.getArmorFormula()
rollData.rollArmor = new Roll(armorFormula) rollData.rollArmor = new Roll(armorFormula)
rollData.rollArmor.roll({ async: false }) await rollData.rollArmor.roll()
rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total
rollData.rollHero = new Roll("1d6") rollData.rollHero = new Roll("1d6")
rollData.rollHero.roll({ async: false }) await rollData.rollHero.roll()
rollData.finalDamage = rollData.damageTotal - rollData.rollHero.total - rollData.armorProtect rollData.finalDamage = rollData.damageTotal - rollData.rollHero.total - rollData.armorProtect
rollData.finalDamage = (rollData.finalDamage < 0) ? 0 : rollData.finalDamage rollData.finalDamage = (rollData.finalDamage < 0) ? 0 : rollData.finalDamage
defender.sufferDamage(rollData.finalDamage) defender.sufferDamage(rollData.finalDamage)
@ -668,7 +672,6 @@ export class BoLUtility {
let res = myReg.exec(damageString) let res = myReg.exec(damageString)
let nbDice = parseInt(res[1]) let nbDice = parseInt(res[1])
let postForm = 'kh' + nbDice let postForm = 'kh' + nbDice
let modIndex = 3
// Upgrade damage if needed // Upgrade damage if needed
if (upgradeDamage && (!res[3] || res[3] == "")) { if (upgradeDamage && (!res[3] || res[3] == "")) {
res[3] = "B" // Upgrade to bonus res[3] = "B" // Upgrade to bonus
@ -680,22 +683,18 @@ export class BoLUtility {
if (res[3] == 'M') { if (res[3] == 'M') {
postForm = 'kl' + nbDice postForm = 'kl' + nbDice
nbDice++ nbDice++
modIndex = 4
} }
if (res[3] == 'MM') { if (res[3] == 'MM') {
postForm = 'kl' + nbDice postForm = 'kl' + nbDice
nbDice += 2 nbDice += 2
modIndex = 4
} }
if (res[3] == 'B') { if (res[3] == 'B') {
postForm = 'kh' + nbDice postForm = 'kh' + nbDice
nbDice++ nbDice++
modIndex = 4
} }
if (res[3] == 'BB') { if (res[3] == 'BB') {
postForm = 'kh' + nbDice postForm = 'kh' + nbDice
nbDice += 2 nbDice += 2
modIndex = 4
} }
} }
formula = "(" + nbDice + "d" + res[2] + reroll + postForm + "+" + modifier + ") *" + multiplier formula = "(" + nbDice + "d" + res[2] + reroll + postForm + "+" + modifier + ") *" + multiplier
@ -742,8 +741,8 @@ export class BoLUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static removeGroupHoroscope(rollData) { static removeGroupHoroscope(rollData) {
let horo = rollData.horoscopeGroupList[rollData.selectedGroupHoroscopeIndex] let horo = rollData.horoscopeGroupList[rollData.selectedGroupHoroscopeIndex]
let horoscopes = duplicate(game.settings.get("bol", "horoscope-group")) let horoscopes = foundry.utils.duplicate(game.settings.get("bol", "horoscope-group"))
let toChange = duplicate(horoscopes[horo.id]) let toChange = foundry.utils.duplicate(horoscopes[horo.id])
toChange.availableDice -= horo.nbDice // Remove the dice toChange.availableDice -= horo.nbDice // Remove the dice
if (toChange.availableDice <= 0) { if (toChange.availableDice <= 0) {
horoscopes[horo.id] = undefined horoscopes[horo.id] = undefined

View File

@ -10,14 +10,14 @@ System.debugMode = true;
export const BOL = {}; export const BOL = {};
BOL.damageValues = { BOL.damageValues = {
"1": "1", "1": "1",
"2": "2", "2": "2",
"3": "3", "3": "3",
"d3" : "d3", "d3": "d3",
"d6M" : "d6M (Malus)", "d6M": "d6M (Malus)",
"d6" : "d6", "d6": "d6",
"d6B" : "d6B (Bonus)", "d6B": "d6B (Bonus)",
"d6BB" : "d6B + dé bonus", "d6BB": "d6B + dé bonus",
} }
BOL.damageMultiplier = { BOL.damageMultiplier = {
@ -31,6 +31,15 @@ BOL.damageMultiplier = {
"8": "x8" "8": "x8"
} }
BOL.listTypes = {
"attribute": "BOL.ui.attribute",
"aptitude": "BOL.ui.aptitude",
"career": "BOL.ui.career",
"boon": "BOL.ui.boon",
"flaw": "BOL.ui.flaw",
"other": "BOL.ui.other"
}
BOL.spellType = { BOL.spellType = {
"0": "BOL.spellItem.charm", "0": "BOL.spellItem.charm",
"1": "BOL.spellItem.circle1", "1": "BOL.spellItem.circle1",
@ -46,125 +55,125 @@ BOL.alchemyType = {
} }
BOL.equipmentSlots = { BOL.equipmentSlots = {
"none" : "BOL.equipmentSlots.none", "none": "BOL.equipmentSlots.none",
"head" : "BOL.equipmentSlots.head", "head": "BOL.equipmentSlots.head",
"neck" : "BOL.equipmentSlots.neck", "neck": "BOL.equipmentSlots.neck",
"shoulders" : "BOL.equipmentSlots.shoulders", "shoulders": "BOL.equipmentSlots.shoulders",
"body" : "BOL.equipmentSlots.body", "body": "BOL.equipmentSlots.body",
"rhand" : "BOL.equipmentSlots.rhand", "rhand": "BOL.equipmentSlots.rhand",
"lhand" : "BOL.equipmentSlots.lhand", "lhand": "BOL.equipmentSlots.lhand",
"2hands" : "BOL.equipmentSlots.2hands", "2hands": "BOL.equipmentSlots.2hands",
"rarm" : "BOL.equipmentSlots.rarm", "rarm": "BOL.equipmentSlots.rarm",
"larm" : "BOL.equipmentSlots.larm", "larm": "BOL.equipmentSlots.larm",
"chest" : "BOL.equipmentSlots.chest", "chest": "BOL.equipmentSlots.chest",
"belt" : "BOL.equipmentSlots.belt", "belt": "BOL.equipmentSlots.belt",
"legs" : "BOL.equipmentSlots.legs", "legs": "BOL.equipmentSlots.legs",
"feet" : "BOL.equipmentSlots.feet", "feet": "BOL.equipmentSlots.feet",
"finder" : "BOL.equipmentSlots.finder", "finder": "BOL.equipmentSlots.finder",
"ear" : "BOL.equipmentSlots.ear" "ear": "BOL.equipmentSlots.ear"
} }
BOL.armorQualities = { BOL.armorQualities = {
"none" : "BOL.armorQuality.none", "none": "BOL.armorQuality.none",
"light" : "BOL.armorQuality.light", "light": "BOL.armorQuality.light",
"lightQ" : "BOL.armorQuality.lightQ", "lightQ": "BOL.armorQuality.lightQ",
"lightSup" : "BOL.armorQuality.lightSup", "lightSup": "BOL.armorQuality.lightSup",
"lightLeg" : "BOL.armorQuality.lightLeg", "lightLeg": "BOL.armorQuality.lightLeg",
"medium" : "BOL.armorQuality.medium", "medium": "BOL.armorQuality.medium",
"mediumQ" : "BOL.armorQuality.mediumQ", "mediumQ": "BOL.armorQuality.mediumQ",
"mediumSup" : "BOL.armorQuality.mediumSup", "mediumSup": "BOL.armorQuality.mediumSup",
"mediumLeg" : "BOL.armorQuality.mediumLeg", "mediumLeg": "BOL.armorQuality.mediumLeg",
"heavy" : "BOL.armorQuality.heavy", "heavy": "BOL.armorQuality.heavy",
"heavyQ" : "BOL.armorQuality.heavyQ", "heavyQ": "BOL.armorQuality.heavyQ",
"heavySup" : "BOL.armorQuality.heavySup", "heavySup": "BOL.armorQuality.heavySup",
"heavyLeg" : "BOL.armorQuality.heavyLeg" "heavyLeg": "BOL.armorQuality.heavyLeg"
} }
BOL.soakFormulas = { BOL.soakFormulas = {
"none" : "0", "none": "0",
"light" : "1d6-3", "light": "1d6-3",
"lightQ" : "1d6r1-3", "lightQ": "1d6r1-3",
"lightSup" : "1d6-2", "lightSup": "1d6-2",
"lightLeg" : "2d6kh1-2", "lightLeg": "2d6kh1-2",
"medium" : "1d6-2", "medium": "1d6-2",
"mediumQ" : "1d6r1-2", "mediumQ": "1d6r1-2",
"mediumSup" : "1d6-1", "mediumSup": "1d6-1",
"mediumLeg" : "2d6kh1-1", "mediumLeg": "2d6kh1-1",
"heavy" : "1d6-1", "heavy": "1d6-1",
"heavyQ" : "1d6r1-1", "heavyQ": "1d6r1-1",
"heavySup" : "1d6", "heavySup": "1d6",
"heavyLeg" : "2d6kh1" "heavyLeg": "2d6kh1"
} }
BOL.attackAttributes = { BOL.attackAttributes = {
"vigor" : "BOL.attributes.vigor", "vigor": "BOL.attributes.vigor",
"agility" : "BOL.attributes.agility", "agility": "BOL.attributes.agility",
"mind" : "BOL.attributes.mind", "mind": "BOL.attributes.mind",
"appeal" : "BOL.attributes.appeal" "appeal": "BOL.attributes.appeal"
} }
BOL.attackAptitudes = { BOL.attackAptitudes = {
"melee" : "BOL.aptitudes.melee", "melee": "BOL.aptitudes.melee",
"ranged" : "BOL.aptitudes.ranged" "ranged": "BOL.aptitudes.ranged"
} }
BOL.aptitudes = { BOL.aptitudes = {
"melee" : "BOL.aptitudes.melee", "melee": "BOL.aptitudes.melee",
"ranged" : "BOL.aptitudes.ranged", "ranged": "BOL.aptitudes.ranged",
"init" : "BOL.aptitudes.init", "init": "BOL.aptitudes.init",
"def" : "BOL.aptitudes.def" "def": "BOL.aptitudes.def"
} }
BOL.resources = { BOL.resources = {
"hp" : "BOL.resources.hp", "hp": "BOL.resources.hp",
"hero" : "BOL.resources.hero", "hero": "BOL.resources.hero",
"faith" : "BOL.resources.faith", "faith": "BOL.resources.faith",
"power" : "BOL.resources.power", "power": "BOL.resources.power",
"alchemypoints" : "BOL.resources.alchemypoints" "alchemypoints": "BOL.resources.alchemypoints"
} }
BOL.weaponSizes = { BOL.weaponSizes = {
"unarmed" : "BOL.weaponSize.unarmed", "unarmed": "BOL.weaponSize.unarmed",
"improvised" : "BOL.weaponSize.improvised", "improvised": "BOL.weaponSize.improvised",
"light" : "BOL.weaponSize.light", "light": "BOL.weaponSize.light",
"medium" : "BOL.weaponSize.medium", "medium": "BOL.weaponSize.medium",
"heavy" : "BOL.weaponSize.heavy" "heavy": "BOL.weaponSize.heavy"
} }
BOL.damageAttributes = { BOL.damageAttributes = {
"zero" : "0", "zero": "0",
"vigor" : "BOL.attributes.vigor", "vigor": "BOL.attributes.vigor",
"half-vigor" : "BOL.attributes.halfvigor" "half-vigor": "BOL.attributes.halfvigor"
} }
BOL.itemCategories = { BOL.itemCategories = {
"equipment" : "BOL.itemCategory.equipment", "equipment": "BOL.itemCategory.equipment",
"capacity" : "BOL.itemCategory.capacity", "capacity": "BOL.itemCategory.capacity",
"spell" : "BOL.itemCategory.spell", "spell": "BOL.itemCategory.spell",
"alchemy" : "BOL.itemCategory.alchemy", "alchemy": "BOL.itemCategory.alchemy",
"vehicle" : "BOL.itemCategory.vehicle", "vehicle": "BOL.itemCategory.vehicle",
"vehicleweapon": "BOL.itemCategory.vehicleweapon", "vehicleweapon": "BOL.itemCategory.vehicleweapon",
"other" : "BOL.itemCategory.other" "other": "BOL.itemCategory.other"
} }
BOL.itemSubtypes = { BOL.itemSubtypes = {
"armor" : "BOL.equipmentCategory.armor", "armor": "BOL.equipmentCategory.armor",
"weapon" : "BOL.equipmentCategory.weapon", "weapon": "BOL.equipmentCategory.weapon",
"shield" : "BOL.equipmentCategory.shield", "shield": "BOL.equipmentCategory.shield",
"helm" : "BOL.equipmentCategory.helm", "helm": "BOL.equipmentCategory.helm",
"jewel" : "BOL.equipmentCategory.jewel", "jewel": "BOL.equipmentCategory.jewel",
"scroll" : "BOL.equipmentCategory.scroll", "scroll": "BOL.equipmentCategory.scroll",
"container" : "BOL.equipmentCategory.container", "container": "BOL.equipmentCategory.container",
"ammunition" : "BOL.equipmentCategory.ammunition", "ammunition": "BOL.equipmentCategory.ammunition",
"currency" : "BOL.equipmentCategory.currency", "currency": "BOL.equipmentCategory.currency",
"other" : "BOL.equipmentCategory.other" "other": "BOL.equipmentCategory.other"
} }
BOL.vehicleSubtypes = { BOL.vehicleSubtypes = {
"mount" : "BOL.vehicleCategory.mount", "mount": "BOL.vehicleCategory.mount",
"flying" : "BOL.vehicleCategory.flying", "flying": "BOL.vehicleCategory.flying",
"boat" : "BOL.vehicleCategory.boat", "boat": "BOL.vehicleCategory.boat",
"other" : "BOL.vehicleCategory.other" "other": "BOL.vehicleCategory.other"
} }
// BOL.equipmentCategories = { // BOL.equipmentCategories = {
@ -180,97 +189,153 @@ BOL.vehicleSubtypes = {
// "other" : "BOL.equipmentCategory.other" // "other" : "BOL.equipmentCategory.other"
// } // }
BOL.rangeModifiers = {
"1": "BOL.dialog.pointblank",
"0": "BOL.dialog.close",
"-1": "BOL.dialog.medium",
"-2": "BOL.dialog.long",
"-4": "BOL.dialog.distant",
"-6": "BOL.dialog.extreme",
"-8": "BOL.dialog.utmost"
}
BOL.difficultyModifiers = {
"4": "BOL.dialog.soeasy",
"2": "BOL.dialog.veryeasy",
"1": "BOL.dialog.easy",
"0": "BOL.dialog.moderate",
"-1": "BOL.dialog.hard",
"-2": "BOL.dialog.tough",
"-4": "BOL.dialog.demanding",
"-6": "BOL.dialog.formidable",
"-8": "BOL.dialog.heroic",
"-10": "BOL.dialog.mythic",
"-12": "BOL.dialog.divine"
}
BOL.alchemyModifiers = {
"2": "BOL.dialog.veryeasy",
"1": "BOL.dialog.easy",
"0": "BOL.dialog.moderate",
"-1": "BOL.dialog.hard",
"-2": "BOL.dialog.tough",
"-4": "BOL.dialog.demanding",
"-6": "BOL.dialog.formidable",
"-8": "BOL.dialog.heroic",
}
BOL.spellModifiers = BOL.alchemyModifiers
BOL.spellMandatoryConditions = {
"1": "1",
"2": "2",
"3": "3",
"4": "4"
}
BOL.spellOptionnalConditions = {
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8"
}
BOL.effectIdentifiers = {
"always": "BOL.ui.always",
}
BOL.protectionCategories = { BOL.protectionCategories = {
"armor" : "BOL.protectionCategory.armor", "armor": "BOL.protectionCategory.armor",
"shield" : "BOL.protectionCategory.shield", "shield": "BOL.protectionCategory.shield",
"helm" : "BOL.protectionCategory.helm", "helm": "BOL.protectionCategory.helm",
"other" : "BOL.protectionCategory.other" "other": "BOL.protectionCategory.other"
} }
BOL.weaponCategories = { BOL.weaponCategories = {
"melee" : "BOL.weaponCategory.melee", "melee": "BOL.weaponCategory.melee",
"ranged" : "BOL.weaponCategory.ranged", "ranged": "BOL.weaponCategory.ranged",
"other" : "BOL.weaponCategory.other" "other": "BOL.weaponCategory.other"
} }
BOL.itemProperties1 = { BOL.itemProperties1 = {
"equipable" : "BOL.itemProperty.equipable", "equipable": "BOL.itemProperty.equipable",
"protection" : "BOL.itemProperty.protection", "protection": "BOL.itemProperty.protection",
"magical" : "BOL.itemProperty.magical", "magical": "BOL.itemProperty.magical",
"worn" : "BOL.itemProperty.worn", "worn": "BOL.itemProperty.worn",
} }
BOL.itemProperties2 = { BOL.itemProperties2 = {
"equipable" : "BOL.itemProperty.equipable", "equipable": "BOL.itemProperty.equipable",
"protection" : "BOL.itemProperty.protection", "protection": "BOL.itemProperty.protection",
"blocking" : "BOL.itemProperty.blocking", "blocking": "BOL.itemProperty.blocking",
"magical" : "BOL.itemProperty.magical", "magical": "BOL.itemProperty.magical",
"concealable" : "BOL.itemProperty.concealable", "concealable": "BOL.itemProperty.concealable",
"2H" : "BOL.itemProperty.2H", "2H": "BOL.itemProperty.2H",
"helm" : "BOL.itemProperty.helm", "helm": "BOL.itemProperty.helm",
"improvised" : "BOL.itemProperty.improvised", "improvised": "BOL.itemProperty.improvised",
"shield" : "BOL.itemProperty.shield", "shield": "BOL.itemProperty.shield",
"melee" : "BOL.itemProperty.melee", "melee": "BOL.itemProperty.melee",
"throwable" : "BOL.itemProperty.throwable", "throwable": "BOL.itemProperty.throwable",
"ignoreshield" : "BOL.itemProperty.ignoreshield", "ignoreshield": "BOL.itemProperty.ignoreshield",
"bashing" : "BOL.itemProperty.bashing", "bashing": "BOL.itemProperty.bashing",
"stackable" : "BOL.itemProperty.stackable", "stackable": "BOL.itemProperty.stackable",
"ranged" : "BOL.itemProperty.ranged", "ranged": "BOL.itemProperty.ranged",
"weapon" : "BOL.itemProperty.weapon", "weapon": "BOL.itemProperty.weapon",
"reloadable" : "BOL.itemProperty.reloadable", "reloadable": "BOL.itemProperty.reloadable",
"worn" : "BOL.itemProperty.worn", "worn": "BOL.itemProperty.worn",
"spell" : "BOL.itemProperty.spell", "spell": "BOL.itemProperty.spell",
"armor" : "BOL.itemProperty.armor", "armor": "BOL.itemProperty.armor",
"consumable" : "BOL.itemProperty.consumable", "consumable": "BOL.itemProperty.consumable",
"bow" : "BOL.itemProperty.bow", "bow": "BOL.itemProperty.bow",
"crossbow" : "BOL.itemProperty.crossbow", "crossbow": "BOL.itemProperty.crossbow",
"throwing" : "BOL.itemProperty.throwing", "throwing": "BOL.itemProperty.throwing",
"activable" : "BOL.itemProperty.activable", "activable": "BOL.itemProperty.activable",
"powder" : "BOL.itemProperty.powder", "powder": "BOL.itemProperty.powder",
"damage" : "BOL.itemProperty.damage", "damage": "BOL.itemProperty.damage",
"difficulty": "BOL.itemProperty.difficulty" "difficulty": "BOL.itemProperty.difficulty"
} }
BOL.itemStats = { BOL.itemStats = {
"quantity" : "BOL.itemStat.quantity", "quantity": "BOL.itemStat.quantity",
"weight" : "BOL.itemStat.weight", "weight": "BOL.itemStat.weight",
"price" : "BOL.itemStat.price", "price": "BOL.itemStat.price",
"range" : "BOL.itemStat.range", "range": "BOL.itemStat.range",
"damage" : "BOL.itemStat.damage", "damage": "BOL.itemStat.damage",
"reload" : "BOL.itemStat.reload", "reload": "BOL.itemStat.reload",
"soak" : "BOL.itemStat.soak", "soak": "BOL.itemStat.soak",
"blocking" : "BOL.itemStat.blocking", "blocking": "BOL.itemStat.blocking",
"modifiers" : "BOL.itemStat.modifiers" "modifiers": "BOL.itemStat.modifiers"
} }
BOL.itemModifiers = { BOL.itemModifiers = {
"init" : "BOL.itemModifiers.init", "init": "BOL.itemModifiers.init",
"social" : "BOL.itemModifiers.social", "social": "BOL.itemModifiers.social",
"agility" : "BOL.itemModifiers.agility", "agility": "BOL.itemModifiers.agility",
"powercost" : "BOL.itemModifiers.powercost" "powercost": "BOL.itemModifiers.powercost"
} }
BOL.itemBlocking = { BOL.itemBlocking = {
"malus" : "BOL.itemBlocking.malus", "malus": "BOL.itemBlocking.malus",
"nbAttacksPerRound" : "BOL.itemBlocking.nbAttacksPerRound" "nbAttacksPerRound": "BOL.itemBlocking.nbAttacksPerRound"
} }
BOL.itemSoak = { BOL.itemSoak = {
"formula" : "BOL.itemSoak.formula", "formula": "BOL.itemSoak.formula",
"value" : "BOL.itemSoak.value" "value": "BOL.itemSoak.value"
} }
BOL.featureSubtypes = { BOL.featureSubtypes = {
"origin" : "BOL.featureSubtypes.origin", "origin": "BOL.featureSubtypes.origin",
"race" : "BOL.featureSubtypes.race", "race": "BOL.featureSubtypes.race",
"career" : "BOL.featureSubtypes.career", "career": "BOL.featureSubtypes.career",
"boon" : "BOL.featureSubtypes.boon", "boon": "BOL.featureSubtypes.boon",
"flaw" : "BOL.featureSubtypes.flaw", "flaw": "BOL.featureSubtypes.flaw",
"language" : "BOL.featureSubtypes.language", "language": "BOL.featureSubtypes.language",
"godsfaith" : "BOL.featureSubtypes.gods", "godsfaith": "BOL.featureSubtypes.gods",
"fightoption" : "BOL.featureSubtypes.fightOption", "fightoption": "BOL.featureSubtypes.fightOption",
"boleffect": "BOL.featureSubtypes.effect", "boleffect": "BOL.featureSubtypes.effect",
"horoscope": "BOL.featureSubtypes.horoscope", "horoscope": "BOL.featureSubtypes.horoscope",
"xplog": "BOL.featureSubtypes.xplog",
} }
BOL.fightOptionTypes = { BOL.fightOptionTypes = {
@ -285,17 +350,17 @@ BOL.fightOptionTypes = {
} }
BOL.itemIcons = { BOL.itemIcons = {
"item": "icons/containers/chest/chest-worn-oak-tan.webp", "item": "icons/containers/chest/chest-worn-oak-tan.webp",
"capacity": "icons/sundries/scrolls/scroll-plain-tan-red.webp", "feature": "icons/sundries/scrolls/scroll-plain-tan-red.webp",
"species": "icons/environment/people/group.webp", "species": "icons/environment/people/group.webp",
"profile": "icons/sundries/documents/blueprint-axe.webp", "profile": "icons/sundries/documents/blueprint-axe.webp",
"path": "icons/sundries/books/book-embossed-gold-red.webp" "path": "icons/sundries/books/book-embossed-gold-red.webp"
} }
BOL.actorIcons = { BOL.actorIcons = {
"npc": "icons/environment/people/commoner.webp", "npc": "icons/environment/people/commoner.webp",
"encounter": "icons/svg/mystery-man-black.svg", "encounter": "icons/svg/mystery-man-black.svg",
"loot": "icons/containers/bags/sack-simple-leather-brown.webp" "loot": "icons/containers/bags/sack-simple-leather-brown.webp"
} }
BOL.bougetteState = { BOL.bougetteState = {
@ -314,18 +379,18 @@ BOL.bougetteDice = {
} }
BOL.creatureSize = { BOL.creatureSize = {
"tiny": {order: 1, label: "BOL.size.tiny"}, "tiny": { order: 1, label: "BOL.size.tiny" },
"verysmall": {order: 2, label: "BOL.size.verysmall"}, "verysmall": { order: 2, label: "BOL.size.verysmall" },
"small": {order: 3, label: "BOL.size.small"}, "small": { order: 3, label: "BOL.size.small" },
"medium": {order: 4, label: "BOL.size.medium"}, "medium": { order: 4, label: "BOL.size.medium" },
"large": {order: 5, label: "BOL.size.large"}, "large": { order: 5, label: "BOL.size.large" },
"verylarge": {order: 6, label: "BOL.size.verylarge"}, "verylarge": { order: 6, label: "BOL.size.verylarge" },
"huge": {order: 7, label: "BOL.size.huge"}, "huge": { order: 7, label: "BOL.size.huge" },
"massive": {order: 8, label: "BOL.size.massive"}, "massive": { order: 8, label: "BOL.size.massive" },
"enormous": {order: 9, label: "BOL.size.enormous"}, "enormous": { order: 9, label: "BOL.size.enormous" },
"gigantic": {order: 10, label: "BOL.size.gigantic"}, "gigantic": { order: 10, label: "BOL.size.gigantic" },
"immense": {order: 11, label: "BOL.size.immense"}, "immense": { order: 11, label: "BOL.size.immense" },
"colossal": {order: 12, label: "BOL.size.colossal"} "colossal": { order: 12, label: "BOL.size.colossal" }
} }
BOL.horoscopeAnswer = { BOL.horoscopeAnswer = {
@ -352,110 +417,208 @@ BOL.bolEffectModifier = {
BOL.statusEffects = [ BOL.statusEffects = [
{ {
"id": "dead", "id": "dead",
"label": "EFFECT.StatusDead", "label": "EFFECT.StatusDead",
"icon": "icons/svg/skull.svg" "icon": "icons/svg/skull.svg"
}, },
{ {
"id": "unconscious", "id": "unconscious",
"label": "EFFECT.StatusUnconscious", "label": "EFFECT.StatusUnconscious",
"icon": "icons/svg/unconscious.svg" "icon": "icons/svg/unconscious.svg"
}, },
{ {
"id": "sleep", "id": "sleep",
"label": "EFFECT.StatusAsleep", "label": "EFFECT.StatusAsleep",
"icon": "icons/svg/sleep.svg" "icon": "icons/svg/sleep.svg"
}, },
{ {
"id": "stun", "id": "stun",
"label": "EFFECT.StatusStunned", "label": "EFFECT.StatusStunned",
"icon": "icons/svg/daze.svg" "icon": "icons/svg/daze.svg"
}, },
{ {
"id": "prone", "id": "prone",
"label": "EFFECT.StatusProne", "label": "EFFECT.StatusProne",
"icon": "icons/svg/falling.svg" "icon": "icons/svg/falling.svg"
}, },
{ {
"id": "restrain", "id": "restrain",
"label": "EFFECT.StatusRestrained", "label": "EFFECT.StatusRestrained",
"icon": "icons/svg/net.svg" "icon": "icons/svg/net.svg"
}, },
{ {
"id": "paralysis", "id": "paralysis",
"label": "EFFECT.StatusParalysis", "label": "EFFECT.StatusParalysis",
"icon": "icons/svg/paralysis.svg" "icon": "icons/svg/paralysis.svg"
}, },
{ {
"id": "fly", "id": "fly",
"label": "EFFECT.StatusFlying", "label": "EFFECT.StatusFlying",
"icon": "icons/svg/wing.svg" "icon": "icons/svg/wing.svg"
}, },
{ {
"id": "blind", "id": "blind",
"label": "EFFECT.StatusBlind", "label": "EFFECT.StatusBlind",
"icon": "icons/svg/blind.svg" "icon": "icons/svg/blind.svg"
}, },
{ {
"id": "deaf", "id": "deaf",
"label": "EFFECT.StatusDeaf", "label": "EFFECT.StatusDeaf",
"icon": "icons/svg/deaf.svg" "icon": "icons/svg/deaf.svg"
}, },
{ {
"id": "silence", "id": "silence",
"label": "EFFECT.StatusSilenced", "label": "EFFECT.StatusSilenced",
"icon": "icons/svg/silenced.svg" "icon": "icons/svg/silenced.svg"
}, },
{ {
"id": "fear", "id": "fear",
"label": "EFFECT.StatusFear", "label": "EFFECT.StatusFear",
"icon": "icons/svg/terror.svg" "icon": "icons/svg/terror.svg"
}, },
{ {
"id": "burning", "id": "burning",
"label": "EFFECT.StatusBurning", "label": "EFFECT.StatusBurning",
"icon": "icons/svg/fire.svg" "icon": "icons/svg/fire.svg"
}, },
{ {
"id": "frozen", "id": "frozen",
"label": "EFFECT.StatusFrozen", "label": "EFFECT.StatusFrozen",
"icon": "icons/svg/frozen.svg" "icon": "icons/svg/frozen.svg"
}, },
{ {
"id": "shock", "id": "shock",
"label": "EFFECT.StatusShocked", "label": "EFFECT.StatusShocked",
"icon": "icons/svg/lightning.svg" "icon": "icons/svg/lightning.svg"
}, },
{ {
"id": "disease", "id": "disease",
"label": "EFFECT.StatusDisease", "label": "EFFECT.StatusDisease",
"icon": "icons/svg/biohazard.svg" "icon": "icons/svg/biohazard.svg"
}, },
{ {
"id": "poison", "id": "poison",
"label": "EFFECT.StatusPoison", "label": "EFFECT.StatusPoison",
"icon": "icons/svg/poison.svg" "icon": "icons/svg/poison.svg"
}, },
{ {
"id": "curse", "id": "curse",
"label": "EFFECT.StatusCursed", "label": "EFFECT.StatusCursed",
"icon": "icons/svg/sun.svg" "icon": "icons/svg/sun.svg"
}, },
{ {
"id": "invisible", "id": "invisible",
"label": "EFFECT.StatusInvisible", "label": "EFFECT.StatusInvisible",
"icon": "icons/svg/invisible.svg" "icon": "icons/svg/invisible.svg"
}, },
{ {
"id": "target", "id": "target",
"label": "EFFECT.StatusTarget", "label": "EFFECT.StatusTarget",
"icon": "icons/svg/target.svg" "icon": "icons/svg/target.svg"
}, },
{ {
"id": "eye", "id": "eye",
"label": "EFFECT.StatusMarked", "label": "EFFECT.StatusMarked",
"icon": "icons/svg/eye.svg" "icon": "icons/svg/eye.svg"
} }
] ]
BOL.defaultNaturalWeapon = {
"category": "equipment",
"subtype": "weapon",
"description": "",
"properties": {
"ranged": false,
"melee": false,
"spell": false,
"protection": false,
"weapon": true,
"armor": false,
"helm": false,
"shield": false,
"equipable": false,
"consumable": false,
"magical": false,
"2H": false,
"reloadable": false,
"bow": false,
"crossbow": false,
"throwing": false,
"stackable": false,
"natural": true,
"concealable": false,
"ignoreshield": false,
"attackBonusDice": false,
"onlymodifier": true,
"attackAttribute": "vigor",
"attackAptitude": "melee",
"attackModifiers": 1,
"weaponSize": "unarmed",
"damage": "d6B",
"damageAttribute": "vigor",
"damageModifiers": null,
"damageMultiplier": "1",
"damageReroll1": false
},
"quantity": 1,
"weight": 0,
"price": 0,
"worn": false
}
BOL.defaultNaturalProtection = {
"category": "equipment",
"subtype": "armor",
"description": "",
"properties": {
"ranged": false,
"melee": false,
"spell": false,
"protection": true,
"weapon": false,
"armor": true,
"helm": false,
"shield": false,
"equipable": true,
"consumable": false,
"magical": false,
"2H": false,
"reloadable": false,
"bow": false,
"crossbow": false,
"throwing": false,
"stackable": false,
"natural": true,
"concealable": false,
"ignoreshield": false,
"attackBonusDice": false,
"onlymodifier": true,
"attackAttribute": "vigor",
"attackAptitude": "melee",
"attackModifiers": 1,
"weaponSize": "unarmed",
"damage": "d6B",
"damageAttribute": "vigor",
"damageModifiers": null,
"damageMultiplier": "1",
"damageReroll1": false,
"modifiers": {
"init": null,
"agility": null,
"powercost": null,
"social": false
},
"armorQuality": "none",
"soak": {
"formula": "",
"value": 1
},
"slot": "none"
},
"quantity": 1,
"weight": 0,
"price": 0,
"worn": true
}
BOL.debug = false; BOL.debug = false;

View File

@ -10,7 +10,7 @@ export const registerHandlebarsHelpers = function () {
Handlebars.registerHelper('isEmpty', function (list) { Handlebars.registerHelper('isEmpty', function (list) {
if (list) return list.length == 0; if (list) return list.length == 0;
else return 0; else return false;
}); });
Handlebars.registerHelper('notEmpty', function (list) { Handlebars.registerHelper('notEmpty', function (list) {
@ -64,8 +64,8 @@ export const registerHandlebarsHelpers = function () {
}) })
Handlebars.registerHelper('for', function (from, to, incr, block) { Handlebars.registerHelper('for', function (from, to, incr, block) {
var accum = ''; let accum = '';
for (var i = from; i < to; i += incr) for (let i = from; i < to; i += incr)
accum += block.fn(i); accum += block.fn(i);
return accum; return accum;
}) })
@ -79,7 +79,7 @@ export const registerHandlebarsHelpers = function () {
Handlebars.registerHelper('countKeys', function (obj) { Handlebars.registerHelper('countKeys', function (obj) {
return Object.keys(obj).length; return Object.keys(obj).length;
}) })
Handlebars.registerHelper('isEnabled', function (configKey) { Handlebars.registerHelper('isEnabled', function (configKey) {
return game.settings.get("bol", configKey); return game.settings.get("bol", configKey);
}) })
@ -89,8 +89,8 @@ export const registerHandlebarsHelpers = function () {
// If you need to add Handlebars helpers, here are a few useful examples: // If you need to add Handlebars helpers, here are a few useful examples:
Handlebars.registerHelper('concat', function () { Handlebars.registerHelper('concat', function () {
var outStr = ''; let outStr = '';
for (var arg in arguments) { for (let arg in arguments) {
if (typeof arguments[arg] != 'object') { if (typeof arguments[arg] != 'object') {
outStr += arguments[arg]; outStr += arguments[arg];
} }
@ -108,16 +108,15 @@ export const registerHandlebarsHelpers = function () {
return parseInt(a) - parseInt(b); return parseInt(a) - parseInt(b);
}) })
Handlebars.registerHelper('abbrev2', function (a) { Handlebars.registerHelper('abbrev2', function (a) {
return a.substring(0,2); return a.substring(0, 2);
}) })
Handlebars.registerHelper('abbrev3', function (a) { Handlebars.registerHelper('abbrev3', function (a) {
return a.substring(0,3); return a.substring(0, 3);
}) })
Handlebars.registerHelper('valueAtIndex', function (arr, idx) { Handlebars.registerHelper('valueAtIndex', function (arr, idx) {
return arr[idx]; return arr[idx];
}) })
Handlebars.registerHelper('includesKey', function (items, type, key) { Handlebars.registerHelper('includesKey', function (items, type, key) {
// console.log(items);
return items.filter(i => i.type === type).map(i => i.system.key).includes(key); return items.filter(i => i.type === type).map(i => i.system.key).includes(key);
}) })
Handlebars.registerHelper('includes', function (array, val) { Handlebars.registerHelper('includes', function (array, val) {
@ -128,10 +127,7 @@ export const registerHandlebarsHelpers = function () {
}) })
Handlebars.registerHelper('isOwnerOrGM', function (actor) { Handlebars.registerHelper('isOwnerOrGM', function (actor) {
console.log("Testing actor", actor.isOwner, game.userId) console.log("Testing actor", actor.isOwner, game.userId)
if (actor.isOwner || game.isGM) { return actor.isOwner || game.isGM;
return true
}
return false
}) })
Handlebars.registerHelper('upperFirst', function (text) { Handlebars.registerHelper('upperFirst', function (text) {
if (typeof text !== 'string') return text if (typeof text !== 'string') return text
@ -141,6 +137,16 @@ export const registerHandlebarsHelpers = function () {
if (typeof text !== 'string') return text if (typeof text !== 'string') return text
return text.charAt(0).toUpperCase() return text.charAt(0).toUpperCase()
}) })
Handlebars.registerHelper('isCreature', function (key) {
return key == "creature" || key == "daemon";
})
// Handle v12 removal of this helper
Handlebars.registerHelper('select', function (selected, options) {
const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected));
const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']');
const html = options.fn(this);
return html.replace(rgx, "$& selected");
});
} }

View File

@ -29,18 +29,6 @@ export default function registerHooks() {
if (data.type == "Item") { if (data.type == "Item") {
let item = data.data; let item = data.data;
console.log(item); console.log(item);
// let command = `let onlyDamage = false;\nlet customLabel = "";\nlet skillDescription = "";\nlet dmgDescription = "";\n\nif (event) {\n if (event.shiftKey) onlyDamage = true;\n}\n\ngame.cof.macros.rollItemMacro("${item._id}", "${item.name}", "${item.type}", 0, 0, 0, onlyDamage, customLabel, skillDescription, dmgDescription);`;
// let macro = game.macros.entities.find(m => (m.name === item.name) && (m.command === command));
// if (!macro) {
// macro = await Macro.create({
// name: item.name,
// type : "script",
// img: item.img,
// command : command
// }, {displaySheet: false})
// }
// game.user.assignHotbarMacro(macro, slot);
} }
// Create a macro to open the actor sheet of the actor dropped on the hotbar // Create a macro to open the actor sheet of the actor dropped on the hotbar
else if (data.type == "Actor") { else if (data.type == "Actor") {

View File

@ -43,6 +43,7 @@ export const preloadHandlebarsTemplates = async function () {
"systems/bol/templates/item/parts/properties/feature/fightoption-properties.hbs", "systems/bol/templates/item/parts/properties/feature/fightoption-properties.hbs",
"systems/bol/templates/item/parts/properties/item/weapon-vehicle-properties.hbs", "systems/bol/templates/item/parts/properties/item/weapon-vehicle-properties.hbs",
"systems/bol/templates/item/parts/properties/feature/horoscope-properties.hbs", "systems/bol/templates/item/parts/properties/feature/horoscope-properties.hbs",
"systems/bol/templates/item/parts/properties/feature/xplog-properties.hbs",
// DIALOGS // DIALOGS
"systems/bol/templates/chat/rolls/attack-damage-card.hbs", "systems/bol/templates/chat/rolls/attack-damage-card.hbs",

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000111 MANIFEST-000315

View File

@ -1,8 +1,8 @@
2023/12/05-10:19:09.412914 7f5b813fe6c0 Recovering log #109 2024/09/04-08:29:45.600289 7f80f3e006c0 Recovering log #313
2023/12/05-10:19:09.423992 7f5b813fe6c0 Delete type=3 #107 2024/09/04-08:29:45.624187 7f80f3e006c0 Delete type=3 #311
2023/12/05-10:19:09.424077 7f5b813fe6c0 Delete type=0 #109 2024/09/04-08:29:45.624335 7f80f3e006c0 Delete type=0 #313
2023/12/05-10:22:46.862878 7f58eb7fe6c0 Level-0 table #114: started 2024/09/04-08:55:35.075489 7f80f10006c0 Level-0 table #318: started
2023/12/05-10:22:46.862963 7f58eb7fe6c0 Level-0 table #114: 0 bytes OK 2024/09/04-08:55:35.075528 7f80f10006c0 Level-0 table #318: 0 bytes OK
2023/12/05-10:22:46.869980 7f58eb7fe6c0 Delete type=0 #112 2024/09/04-08:55:35.081858 7f80f10006c0 Delete type=0 #316
2023/12/05-10:22:46.891683 7f58eb7fe6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!Yl1RKQb0BjVUtilk.kNb9ZrMbgONi1mlE' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.082117 7f80f10006c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
2023/12/05-10:22:46.891779 7f58eb7fe6c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!Yl1RKQb0BjVUtilk.kNb9ZrMbgONi1mlE' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.082171 7f80f10006c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.430277 7f84f7fff6c0 Recovering log #105 2024/09/03-23:57:02.404112 7f80f3e006c0 Recovering log #309
2023/12/04-21:16:34.440834 7f84f7fff6c0 Delete type=3 #103 2024/09/03-23:57:02.504332 7f80f3e006c0 Delete type=3 #307
2023/12/04-21:16:34.440885 7f84f7fff6c0 Delete type=0 #105 2024/09/03-23:57:02.504411 7f80f3e006c0 Delete type=0 #309
2023/12/04-21:29:36.294789 7f84f5ffb6c0 Level-0 table #110: started 2024/09/04-00:02:12.553825 7f80f10006c0 Level-0 table #314: started
2023/12/04-21:29:36.294815 7f84f5ffb6c0 Level-0 table #110: 0 bytes OK 2024/09/04-00:02:12.553904 7f80f10006c0 Level-0 table #314: 0 bytes OK
2023/12/04-21:29:36.301173 7f84f5ffb6c0 Delete type=0 #108 2024/09/04-00:02:12.560122 7f80f10006c0 Delete type=0 #312
2023/12/04-21:29:36.301317 7f84f5ffb6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!Yl1RKQb0BjVUtilk.kNb9ZrMbgONi1mlE' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.566679 7f80f10006c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
2023/12/04-21:29:36.301343 7f84f5ffb6c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!Yl1RKQb0BjVUtilk.kNb9ZrMbgONi1mlE' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.566727 7f80f10006c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
packs/armors/000200.ldb Normal file

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000018 MANIFEST-000221

View File

@ -1,8 +1,8 @@
2023/12/05-10:19:09.388365 7f58ebfff6c0 Recovering log #16 2024/09/04-08:29:45.543967 7f80f2a006c0 Recovering log #219
2023/12/05-10:19:09.399094 7f58ebfff6c0 Delete type=3 #14 2024/09/04-08:29:45.568470 7f80f2a006c0 Delete type=3 #217
2023/12/05-10:19:09.399150 7f58ebfff6c0 Delete type=0 #16 2024/09/04-08:29:45.568609 7f80f2a006c0 Delete type=0 #219
2023/12/05-10:22:46.848470 7f58eb7fe6c0 Level-0 table #21: started 2024/09/04-08:55:35.053637 7f80f10006c0 Level-0 table #224: started
2023/12/05-10:22:46.848503 7f58eb7fe6c0 Level-0 table #21: 0 bytes OK 2024/09/04-08:55:35.053701 7f80f10006c0 Level-0 table #224: 0 bytes OK
2023/12/05-10:22:46.855871 7f58eb7fe6c0 Delete type=0 #19 2024/09/04-08:55:35.060581 7f80f10006c0 Delete type=0 #222
2023/12/05-10:22:46.862471 7f58eb7fe6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.082061 7f80f10006c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
2023/12/05-10:22:46.862599 7f58eb7fe6c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.082130 7f80f10006c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.402100 7f84f6ffd6c0 Recovering log #12 2024/09/03-23:57:02.191364 7f80f2a006c0 Recovering log #215
2023/12/04-21:16:34.413052 7f84f6ffd6c0 Delete type=3 #10 2024/09/03-23:57:02.292367 7f80f2a006c0 Delete type=3 #213
2023/12/04-21:16:34.413101 7f84f6ffd6c0 Delete type=0 #12 2024/09/03-23:57:02.292426 7f80f2a006c0 Delete type=0 #215
2023/12/04-21:29:36.274254 7f84f5ffb6c0 Level-0 table #17: started 2024/09/04-00:02:12.560295 7f80f10006c0 Level-0 table #220: started
2023/12/04-21:29:36.274306 7f84f5ffb6c0 Level-0 table #17: 0 bytes OK 2024/09/04-00:02:12.560338 7f80f10006c0 Level-0 table #220: 0 bytes OK
2023/12/04-21:29:36.281091 7f84f5ffb6c0 Delete type=0 #15 2024/09/04-00:02:12.566575 7f80f10006c0 Delete type=0 #218
2023/12/04-21:29:36.301284 7f84f5ffb6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.566717 7f80f10006c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
2023/12/04-21:29:36.301326 7f84f5ffb6c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.566746 7f80f10006c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
packs/boons/000294.ldb Normal file

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000110 MANIFEST-000315

View File

@ -1,8 +1,8 @@
2023/12/05-10:19:09.243453 7f58ebfff6c0 Recovering log #108 2024/09/04-08:29:45.183554 7f80f2a006c0 Recovering log #313
2023/12/05-10:19:09.254734 7f58ebfff6c0 Delete type=3 #106 2024/09/04-08:29:45.233441 7f80f2a006c0 Delete type=3 #311
2023/12/05-10:19:09.254855 7f58ebfff6c0 Delete type=0 #108 2024/09/04-08:29:45.233583 7f80f2a006c0 Delete type=0 #313
2023/12/05-10:22:46.807255 7f58eb7fe6c0 Level-0 table #113: started 2024/09/04-08:55:34.993899 7f80f10006c0 Level-0 table #318: started
2023/12/05-10:22:46.807291 7f58eb7fe6c0 Level-0 table #113: 0 bytes OK 2024/09/04-08:55:34.993962 7f80f10006c0 Level-0 table #318: 0 bytes OK
2023/12/05-10:22:46.813375 7f58eb7fe6c0 Delete type=0 #111 2024/09/04-08:55:35.001825 7f80f10006c0 Delete type=0 #316
2023/12/05-10:22:46.828324 7f58eb7fe6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.023994 7f80f10006c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
2023/12/05-10:22:46.835287 7f58eb7fe6c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.024130 7f80f10006c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.244782 7f84f6ffd6c0 Recovering log #104 2024/09/03-23:57:01.593096 7f80f2a006c0 Recovering log #309
2023/12/04-21:16:34.255803 7f84f6ffd6c0 Delete type=3 #102 2024/09/03-23:57:01.647346 7f80f2a006c0 Delete type=3 #307
2023/12/04-21:16:34.255859 7f84f6ffd6c0 Delete type=0 #104 2024/09/03-23:57:01.647452 7f80f2a006c0 Delete type=0 #309
2023/12/04-21:29:36.227120 7f84f5ffb6c0 Level-0 table #109: started 2024/09/04-00:02:12.502227 7f80f10006c0 Level-0 table #314: started
2023/12/04-21:29:36.227155 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK 2024/09/04-00:02:12.502249 7f80f10006c0 Level-0 table #314: 0 bytes OK
2023/12/04-21:29:36.233490 7f84f5ffb6c0 Delete type=0 #107 2024/09/04-00:02:12.508162 7f80f10006c0 Delete type=0 #312
2023/12/04-21:29:36.247612 7f84f5ffb6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.521455 7f80f10006c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
2023/12/04-21:29:36.247638 7f84f5ffb6c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.521494 7f80f10006c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/boons/MANIFEST-000315 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000110 MANIFEST-000315

View File

@ -1,8 +1,8 @@
2023/12/05-10:19:09.257627 7f5b80bfd6c0 Recovering log #108 2024/09/04-08:29:45.236757 7f80f34006c0 Recovering log #313
2023/12/05-10:19:09.267269 7f5b80bfd6c0 Delete type=3 #106 2024/09/04-08:29:45.285076 7f80f34006c0 Delete type=3 #311
2023/12/05-10:19:09.267320 7f5b80bfd6c0 Delete type=0 #108 2024/09/04-08:29:45.285171 7f80f34006c0 Delete type=0 #313
2023/12/05-10:22:46.813487 7f58eb7fe6c0 Level-0 table #113: started 2024/09/04-08:55:35.008961 7f80f10006c0 Level-0 table #318: started
2023/12/05-10:22:46.813513 7f58eb7fe6c0 Level-0 table #113: 0 bytes OK 2024/09/04-08:55:35.009000 7f80f10006c0 Level-0 table #318: 0 bytes OK
2023/12/05-10:22:46.821758 7f58eb7fe6c0 Delete type=0 #111 2024/09/04-08:55:35.015744 7f80f10006c0 Delete type=0 #316
2023/12/05-10:22:46.828335 7f58eb7fe6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.024074 7f80f10006c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
2023/12/05-10:22:46.835270 7f58eb7fe6c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.024182 7f80f10006c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.258787 7f84f77fe6c0 Recovering log #104 2024/09/03-23:57:01.659093 7f80f20006c0 Recovering log #309
2023/12/04-21:16:34.268652 7f84f77fe6c0 Delete type=3 #102 2024/09/03-23:57:01.714808 7f80f20006c0 Delete type=3 #307
2023/12/04-21:16:34.268705 7f84f77fe6c0 Delete type=0 #104 2024/09/03-23:57:01.714865 7f80f20006c0 Delete type=0 #309
2023/12/04-21:29:36.233597 7f84f5ffb6c0 Level-0 table #109: started 2024/09/04-00:02:12.496079 7f80f10006c0 Level-0 table #314: started
2023/12/04-21:29:36.233621 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK 2024/09/04-00:02:12.496122 7f80f10006c0 Level-0 table #314: 0 bytes OK
2023/12/04-21:29:36.239701 7f84f5ffb6c0 Delete type=0 #107 2024/09/04-00:02:12.502129 7f80f10006c0 Delete type=0 #312
2023/12/04-21:29:36.247623 7f84f5ffb6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.521438 7f80f10006c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
2023/12/04-21:29:36.247651 7f84f5ffb6c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.521486 7f80f10006c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

BIN
packs/careers/000294.ldb Normal file

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000110 MANIFEST-000315

View File

@ -1,8 +1,8 @@
2023/12/05-10:19:09.282801 7f5b81bff6c0 Recovering log #108 2024/09/04-08:29:45.337427 7f80f20006c0 Recovering log #313
2023/12/05-10:19:09.293479 7f5b81bff6c0 Delete type=3 #106 2024/09/04-08:29:45.385247 7f80f20006c0 Delete type=3 #311
2023/12/05-10:19:09.293574 7f5b81bff6c0 Delete type=0 #108 2024/09/04-08:29:45.385347 7f80f20006c0 Delete type=0 #313
2023/12/05-10:22:46.828345 7f58eb7fe6c0 Level-0 table #113: started 2024/09/04-08:55:35.015910 7f80f10006c0 Level-0 table #318: started
2023/12/05-10:22:46.828365 7f58eb7fe6c0 Level-0 table #113: 0 bytes OK 2024/09/04-08:55:35.015983 7f80f10006c0 Level-0 table #318: 0 bytes OK
2023/12/05-10:22:46.835090 7f58eb7fe6c0 Delete type=0 #111 2024/09/04-08:55:35.023688 7f80f10006c0 Delete type=0 #316
2023/12/05-10:22:46.835303 7f58eb7fe6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.024104 7f80f10006c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
2023/12/05-10:22:46.835334 7f58eb7fe6c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.024208 7f80f10006c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.285844 7f84f67fc6c0 Recovering log #104 2024/09/03-23:57:01.783330 7f80f3e006c0 Recovering log #309
2023/12/04-21:16:34.295915 7f84f67fc6c0 Delete type=3 #102 2024/09/03-23:57:01.838726 7f80f3e006c0 Delete type=3 #307
2023/12/04-21:16:34.295974 7f84f67fc6c0 Delete type=0 #104 2024/09/03-23:57:01.838785 7f80f3e006c0 Delete type=0 #309
2023/12/04-21:29:36.267733 7f84f5ffb6c0 Level-0 table #109: started 2024/09/04-00:02:12.508272 7f80f10006c0 Level-0 table #314: started
2023/12/04-21:29:36.267761 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK 2024/09/04-00:02:12.508294 7f80f10006c0 Level-0 table #314: 0 bytes OK
2023/12/04-21:29:36.273875 7f84f5ffb6c0 Delete type=0 #107 2024/09/04-00:02:12.514198 7f80f10006c0 Delete type=0 #312
2023/12/04-21:29:36.274078 7f84f5ffb6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.521467 7f80f10006c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
2023/12/04-21:29:36.274142 7f84f5ffb6c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.521503 7f80f10006c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
packs/cartes/000122.ldb Normal file

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000110 MANIFEST-000283

View File

@ -1,8 +1,8 @@
2023/12/05-10:19:09.427439 7f5b81bff6c0 Recovering log #108 2024/07/08-22:24:33.833224 7fb8320006c0 Recovering log #281
2023/12/05-10:19:09.437209 7f5b81bff6c0 Delete type=3 #106 2024/07/08-22:24:33.895807 7fb8320006c0 Delete type=3 #279
2023/12/05-10:19:09.437271 7f5b81bff6c0 Delete type=0 #108 2024/07/08-22:24:33.895934 7fb8320006c0 Delete type=0 #281
2023/12/05-10:22:46.876957 7f58eb7fe6c0 Level-0 table #113: started 2024/07/08-22:24:52.466387 7fb82be006c0 Level-0 table #286: started
2023/12/05-10:22:46.876983 7f58eb7fe6c0 Level-0 table #113: 0 bytes OK 2024/07/08-22:24:52.466440 7fb82be006c0 Level-0 table #286: 0 bytes OK
2023/12/05-10:22:46.884392 7f58eb7fe6c0 Delete type=0 #111 2024/07/08-22:24:52.472857 7fb82be006c0 Delete type=0 #284
2023/12/05-10:22:46.891737 7f58eb7fe6c0 Manual compaction at level-0 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end) 2024/07/08-22:24:52.480332 7fb82be006c0 Manual compaction at level-0 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end)
2023/12/05-10:22:46.891822 7f58eb7fe6c0 Manual compaction at level-1 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end) 2024/07/08-22:24:52.480427 7fb82be006c0 Manual compaction at level-1 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.444268 7f84f67fc6c0 Recovering log #104 2024/07/08-22:22:58.298438 7fb832a006c0 Recovering log #277
2023/12/04-21:16:34.454337 7f84f67fc6c0 Delete type=3 #102 2024/07/08-22:22:58.309146 7fb832a006c0 Delete type=3 #275
2023/12/04-21:16:34.454390 7f84f67fc6c0 Delete type=0 #104 2024/07/08-22:22:58.309315 7fb832a006c0 Delete type=0 #277
2023/12/04-21:29:36.307716 7f84f5ffb6c0 Level-0 table #109: started 2024/07/08-22:24:02.597516 7fb82be006c0 Level-0 table #282: started
2023/12/04-21:29:36.307782 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK 2024/07/08-22:24:02.597563 7fb82be006c0 Level-0 table #282: 0 bytes OK
2023/12/04-21:29:36.314556 7f84f5ffb6c0 Delete type=0 #107 2024/07/08-22:24:02.685456 7fb82be006c0 Delete type=0 #280
2023/12/04-21:29:36.327965 7f84f5ffb6c0 Manual compaction at level-0 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end) 2024/07/08-22:24:02.775806 7fb82be006c0 Manual compaction at level-0 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end)
2023/12/04-21:29:36.328032 7f84f5ffb6c0 Manual compaction at level-1 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end) 2024/07/08-22:24:02.775850 7fb82be006c0 Manual compaction at level-1 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
packs/creatures/000203.ldb Normal file

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000110 MANIFEST-000208

View File

@ -1,8 +1,8 @@
2023/12/05-10:19:09.537819 7f5b80bfd6c0 Recovering log #108 2024/02/23-23:05:36.345111 7fe93a0006c0 Recovering log #206
2023/12/05-10:19:09.548670 7f5b80bfd6c0 Delete type=3 #106 2024/02/23-23:05:36.355350 7fe93a0006c0 Delete type=3 #204
2023/12/05-10:19:09.548725 7f5b80bfd6c0 Delete type=0 #108 2024/02/23-23:05:36.355397 7fe93a0006c0 Delete type=0 #206
2023/12/05-10:22:46.934967 7f58eb7fe6c0 Level-0 table #113: started 2024/02/23-23:11:16.411887 7fe9336006c0 Level-0 table #211: started
2023/12/05-10:22:46.935007 7f58eb7fe6c0 Level-0 table #113: 0 bytes OK 2024/02/23-23:11:16.411923 7fe9336006c0 Level-0 table #211: 0 bytes OK
2023/12/05-10:22:46.942182 7f58eb7fe6c0 Delete type=0 #111 2024/02/23-23:11:16.418695 7fe9336006c0 Delete type=0 #209
2023/12/05-10:22:46.949024 7f58eb7fe6c0 Manual compaction at level-0 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end) 2024/02/23-23:11:16.419070 7fe9336006c0 Manual compaction at level-0 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end)
2023/12/05-10:22:46.949059 7f58eb7fe6c0 Manual compaction at level-1 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end) 2024/02/23-23:11:16.419088 7fe9336006c0 Manual compaction at level-1 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.555441 7f84f77fe6c0 Recovering log #104 2024/02/22-16:41:06.582756 7fe93be006c0 Recovering log #201
2023/12/04-21:16:34.566877 7f84f77fe6c0 Delete type=3 #102 2024/02/22-16:41:06.592273 7fe93be006c0 Delete type=3 #199
2023/12/04-21:16:34.566941 7f84f77fe6c0 Delete type=0 #104 2024/02/22-16:41:06.592326 7fe93be006c0 Delete type=0 #201
2023/12/04-21:29:36.355366 7f84f5ffb6c0 Level-0 table #109: started 2024/02/22-17:53:02.294923 7fe9336006c0 Level-0 table #207: started
2023/12/04-21:29:36.355392 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK 2024/02/22-17:53:02.294959 7fe9336006c0 Level-0 table #207: 0 bytes OK
2023/12/04-21:29:36.362705 7f84f5ffb6c0 Delete type=0 #107 2024/02/22-17:53:02.313594 7fe9336006c0 Delete type=0 #205
2023/12/04-21:29:36.362912 7f84f5ffb6c0 Manual compaction at level-0 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end) 2024/02/22-17:53:02.322132 7fe9336006c0 Manual compaction at level-0 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end)
2023/12/04-21:29:36.362955 7f84f5ffb6c0 Manual compaction at level-1 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end) 2024/02/22-17:53:02.322180 7fe9336006c0 Manual compaction at level-1 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000110 MANIFEST-000313

View File

@ -1,8 +1,8 @@
2023/12/05-10:19:09.524919 7f58ebfff6c0 Recovering log #108 2024/09/04-08:29:45.792446 7f80f34006c0 Recovering log #311
2023/12/05-10:19:09.535781 7f58ebfff6c0 Delete type=3 #106 2024/09/04-08:29:45.814564 7f80f34006c0 Delete type=3 #309
2023/12/05-10:19:09.535872 7f58ebfff6c0 Delete type=0 #108 2024/09/04-08:29:45.814808 7f80f34006c0 Delete type=0 #311
2023/12/05-10:22:46.927846 7f58eb7fe6c0 Level-0 table #113: started 2024/09/04-08:55:35.119784 7f80f10006c0 Level-0 table #316: started
2023/12/05-10:22:46.927875 7f58eb7fe6c0 Level-0 table #113: 0 bytes OK 2024/09/04-08:55:35.119834 7f80f10006c0 Level-0 table #316: 0 bytes OK
2023/12/05-10:22:46.934810 7f58eb7fe6c0 Delete type=0 #111 2024/09/04-08:55:35.127260 7f80f10006c0 Delete type=0 #314
2023/12/05-10:22:46.949014 7f58eb7fe6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.146545 7f80f10006c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
2023/12/05-10:22:46.949051 7f58eb7fe6c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.146620 7f80f10006c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.543411 7f84f6ffd6c0 Recovering log #104 2024/09/03-23:57:02.921085 7f80f34006c0 Recovering log #307
2023/12/04-21:16:34.553517 7f84f6ffd6c0 Delete type=3 #102 2024/09/03-23:57:02.974041 7f80f34006c0 Delete type=3 #305
2023/12/04-21:16:34.553574 7f84f6ffd6c0 Delete type=0 #104 2024/09/03-23:57:02.974104 7f80f34006c0 Delete type=0 #307
2023/12/04-21:29:36.348547 7f84f5ffb6c0 Level-0 table #109: started 2024/09/04-00:02:12.594370 7f80f10006c0 Level-0 table #312: started
2023/12/04-21:29:36.348582 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK 2024/09/04-00:02:12.594419 7f80f10006c0 Level-0 table #312: 0 bytes OK
2023/12/04-21:29:36.355093 7f84f5ffb6c0 Delete type=0 #107 2024/09/04-00:02:12.600538 7f80f10006c0 Delete type=0 #310
2023/12/04-21:29:36.355262 7f84f5ffb6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.625472 7f80f10006c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
2023/12/04-21:29:36.355296 7f84f5ffb6c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.625539 7f80f10006c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

BIN
packs/equipment/000295.ldb Normal file

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000112 MANIFEST-000316

View File

@ -1,8 +1,8 @@
2023/12/05-10:19:09.321953 7f5b813fe6c0 Recovering log #110 2024/09/04-08:29:45.493437 7f80f3e006c0 Recovering log #314
2023/12/05-10:19:09.331688 7f5b813fe6c0 Delete type=3 #108 2024/09/04-08:29:45.515415 7f80f3e006c0 Delete type=3 #312
2023/12/05-10:19:09.331799 7f5b813fe6c0 Delete type=0 #110 2024/09/04-08:29:45.515533 7f80f3e006c0 Delete type=0 #314
2023/12/05-10:22:46.856017 7f58eb7fe6c0 Level-0 table #115: started 2024/09/04-08:55:35.039308 7f80f10006c0 Level-0 table #319: started
2023/12/05-10:22:46.856048 7f58eb7fe6c0 Level-0 table #115: 0 bytes OK 2024/09/04-08:55:35.039346 7f80f10006c0 Level-0 table #319: 0 bytes OK
2023/12/05-10:22:46.862204 7f58eb7fe6c0 Delete type=0 #113 2024/09/04-08:55:35.045797 7f80f10006c0 Delete type=0 #317
2023/12/05-10:22:46.862520 7f58eb7fe6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.053432 7f80f10006c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
2023/12/05-10:22:46.862626 7f58eb7fe6c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.053506 7f80f10006c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.326886 7f84f7fff6c0 Recovering log #106 2024/09/03-23:57:01.978005 7f80f34006c0 Recovering log #310
2023/12/04-21:16:34.337231 7f84f7fff6c0 Delete type=3 #104 2024/09/03-23:57:02.062495 7f80f34006c0 Delete type=3 #308
2023/12/04-21:16:34.337341 7f84f7fff6c0 Delete type=0 #106 2024/09/03-23:57:02.062561 7f80f34006c0 Delete type=0 #310
2023/12/04-21:29:36.247774 7f84f5ffb6c0 Level-0 table #111: started 2024/09/04-00:02:12.540620 7f80f10006c0 Level-0 table #315: started
2023/12/04-21:29:36.247806 7f84f5ffb6c0 Level-0 table #111: 0 bytes OK 2024/09/04-00:02:12.540655 7f80f10006c0 Level-0 table #315: 0 bytes OK
2023/12/04-21:29:36.253805 7f84f5ffb6c0 Delete type=0 #109 2024/09/04-00:02:12.547462 7f80f10006c0 Delete type=0 #313
2023/12/04-21:29:36.274024 7f84f5ffb6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.547615 7f80f10006c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
2023/12/04-21:29:36.274096 7f84f5ffb6c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.547641 7f80f10006c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000110 MANIFEST-000314

View File

@ -1,8 +1,8 @@
2023/12/05-10:19:09.486474 7f5b80bfd6c0 Recovering log #108 2024/09/04-08:29:45.709007 7f80f3e006c0 Recovering log #312
2023/12/05-10:19:09.497087 7f5b80bfd6c0 Delete type=3 #106 2024/09/04-08:29:45.733181 7f80f3e006c0 Delete type=3 #310
2023/12/05-10:19:09.497144 7f5b80bfd6c0 Delete type=0 #108 2024/09/04-08:29:45.733331 7f80f3e006c0 Delete type=0 #312
2023/12/05-10:22:46.906415 7f58eb7fe6c0 Level-0 table #113: started 2024/09/04-08:55:35.089354 7f80f10006c0 Level-0 table #317: started
2023/12/05-10:22:46.906438 7f58eb7fe6c0 Level-0 table #113: 0 bytes OK 2024/09/04-08:55:35.089399 7f80f10006c0 Level-0 table #317: 0 bytes OK
2023/12/05-10:22:46.912712 7f58eb7fe6c0 Delete type=0 #111 2024/09/04-08:55:35.096826 7f80f10006c0 Delete type=0 #315
2023/12/05-10:22:46.921346 7f58eb7fe6c0 Manual compaction at level-0 from '!items!4EmWdK1cv7EX0X3E' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.112520 7f80f10006c0 Manual compaction at level-0 from '!items!4EmWdK1cv7EX0X3E' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
2023/12/05-10:22:46.921382 7f58eb7fe6c0 Manual compaction at level-1 from '!items!4EmWdK1cv7EX0X3E' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end) 2024/09/04-08:55:35.112626 7f80f10006c0 Manual compaction at level-1 from '!items!4EmWdK1cv7EX0X3E' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.503638 7f84f77fe6c0 Recovering log #104 2024/09/03-23:57:02.729641 7f80f3e006c0 Recovering log #308
2023/12/04-21:16:34.513495 7f84f77fe6c0 Delete type=3 #102 2024/09/03-23:57:02.791542 7f80f3e006c0 Delete type=3 #306
2023/12/04-21:16:34.513540 7f84f77fe6c0 Delete type=0 #104 2024/09/03-23:57:02.791637 7f80f3e006c0 Delete type=0 #308
2023/12/04-21:29:36.328177 7f84f5ffb6c0 Level-0 table #109: started 2024/09/04-00:02:12.587081 7f80f10006c0 Level-0 table #313: started
2023/12/04-21:29:36.328221 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK 2024/09/04-00:02:12.587145 7f80f10006c0 Level-0 table #313: 0 bytes OK
2023/12/04-21:29:36.334799 7f84f5ffb6c0 Delete type=0 #107 2024/09/04-00:02:12.593984 7f80f10006c0 Delete type=0 #311
2023/12/04-21:29:36.355226 7f84f5ffb6c0 Manual compaction at level-0 from '!items!4EmWdK1cv7EX0X3E' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.594221 7f80f10006c0 Manual compaction at level-0 from '!items!4EmWdK1cv7EX0X3E' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)
2023/12/04-21:29:36.355270 7f84f5ffb6c0 Manual compaction at level-1 from '!items!4EmWdK1cv7EX0X3E' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end) 2024/09/04-00:02:12.594283 7f80f10006c0 Manual compaction at level-1 from '!items!4EmWdK1cv7EX0X3E' @ 72057594037927935 : 1 .. '!items!vGydqADwTsHZ9B3j' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More