Compare commits

..

13 Commits

233 changed files with 2571 additions and 2046 deletions

View File

@ -24,6 +24,7 @@ Les livres du jeu sont nécessaires pour jouer, et sont disponibles ici : http:/
Barbarians of Lemuria, Mythic edition, est un jeu de Simon Washbourne
Auteur : Simon Washbourne.
## Crédits de la version française
Barbarians of Lemuria, le jeu de rôle de Sword & Sorcery, est une publication des éditions Ludospherik, tous droits réservés.

View File

@ -1,5 +1,12 @@
Changes :
# v12.1.0
- Gestion des Hordes
- Ajout de la traduction Espagnole
- Nouvelles clés de traduction
- Petites amélioration diverses
# v11.1.2
- Ajout des traductions manquantes en anglais
@ -17,11 +24,11 @@ Changes :
- Correction sur l'encaissement sans armure
- Ajout d'une note d'explication sur l'initiative
# v11.0.8
- Correction sur les malus de bouclier (blocage)
- Corrrection sur le malus d'init des boucliers qui était mal affiché dans la fiche d'item
# v10.4.0
- Ajout de la gestion d'effets

View File

@ -803,6 +803,18 @@ body.system-bol img#logo {
max-width: calc(250px - 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 {
overflow: hidden;
}
@ -937,6 +949,7 @@ body.system-bol img#logo {
min-height: 400px;
}
.bol.sheet.item h1 input.itemname {
margin-top: 32px;
font-family: "Wolfsbane2Expanded", cursive;
}
.bol.sheet.item .item-properties {
@ -1037,7 +1050,7 @@ body.system-bol img#logo {
flex-direction: column;
position: absolute;
top: 2.75rem;
right: 4rem;
right: 16rem;
}
.tokenhudext.right {
justify-content: flex-start;
@ -1051,9 +1064,10 @@ body.system-bol img#logo {
.tokenhudext.right2 {
justify-content: flex-start;
flex-direction: column;
/*transform: translate(0, -30%);*/
position: absolute;
top: -4rem;
left: 12rem;
left: 11rem;
}
.control-icon.tokenhudicon {
width: fit-content;
@ -1083,3 +1097,6 @@ body.system-bol img#logo {
.character-summary-rollable {
text-decoration: underline;
}
.activated-green {
color: darkgreen;
}

View File

@ -1,10 +1,19 @@
{
"ACTOR.TypeCharacter": "Character",
"ACTOR.TypeEncounter": "Encounter",
"ITEM.TypeItem": "Item",
"ITEM.TypeFeature": "Feature",
"ITEM.TypeWeapon": "Weapon",
"ITEM.TypeArmor": "Armor",
"TYPES": {
"Actor": {
"character": "PC",
"encounter": "NPC",
"npc": "NPC",
"vehicle": "Vehicle",
"horde": "Horde"
},
"Item": {
"item": "Object",
"feature": "Trait",
"weapon": "Weapon",
"armure": "Armor"
}
},
"BOL.attributes.vigor": "Strength",
"BOL.attributes.halfvigor" : "Half-Strength",
@ -46,6 +55,9 @@
"BOL.ui.horoscopesMalus": "Horoscopes (Malus)",
"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.description": "Description",
"BOL.ui.actions": "Actions",
@ -164,10 +176,57 @@
"BOL.ui.armorAgiMalus": "Armor+Shield Modifier (Agi)",
"BOL.ui.armorInitMalus": "Armor Modifier (Init)",
"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.initMalus": "Init malus",
"BOL.ui.isspecial": "Spécial ?",
"BOL.ui.createEquipment": "Create Equipment",
"BOL.ui.creature": "Creature",
"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.ui.hordeSize": "Horde size",
"BOL.ui.hordeAttack": "Horde attack",
"BOL.ui.hordeName": "Name of the Horde",
"BOL.ui.criticallegend": "Legendary Success",
"BOL.ui.hordeHP": "Horde Vitality (1 member)",
"BOL.ui.hordehp": "Horde Vitality (total)",
"BOL.featureCategory.origins": "Origins",
"BOL.featureCategory.races": "Races",
@ -185,6 +244,11 @@
"BOL.featureSubtypes.language": "Language",
"BOL.featureSubtypes.gods": "Faith & Gods",
"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.tolive": "To live",
@ -209,6 +273,7 @@
"BOL.itemCategory.other": "Other",
"BOL.itemCategory.capacity" : "Capacity",
"BOL.itemCategory.alchemy": "Alchemy",
"BOL.itemCategory.vehicleweapon": "Vehicle weapon",
"BOL.combatCategory.protections": "Protections",
"BOL.combatCategory.shields": "Shields",
@ -408,11 +473,14 @@
"BOL.chat.rolldamage": "Roll for damages",
"BOL.chat.rolldamage6": "Roll for damages +6",
"BOL.chat.rolldamage12": "Roll for damages +12 (1 HP)",
"BOL.chat.rolldamage12Legend": "Roll for damages +12",
"BOL.chat.damageresult": "Damages of {name} : {total}",
"BOL.chat.damagetarget": "Target : {target}",
"BOL.chat.applydamagetotarget": "Apply damages to the target",
"BOL.chat.fightoption": "Combat options",
"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.legendaryreminder": "In addition of the actions below, you can twice the following actions: <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>",
"BOL.chat.toheroic": "Convert to Mighty success (1 HP)",
"BOL.chat.tolegend": "Convert to Legendary succes (1 HP)",
"BOL.chat.hurttitle": "{name} is going to receive {damageTotal} damages !",
@ -430,6 +498,51 @@
"BOL.chat.spell": "Spell",
"BOL.chat.spellcost": "Power Points cost",
"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 an Heroic success ! Choose your options and effects !",
"BOL.chat.criticallegendaryinfo": "This is a Legendary succes ! Choisissez vos options et effets !",
"BOL.chat.criticalbuttonjournal": "Legendary/Heroic Success",
"BOL.chat.nodamage": "Do not apply damages",
"BOL.chat.armorRoll": "Armor roll",
"BOL.dialog.soeasy": "So easy (+4)",
"BOL.dialog.veryeasy": "Very easy (+2)",

596
lang/es.json Normal file
View File

@ -0,0 +1,596 @@
{
"TYPES": {
"Actor": {
"character": "PJ",
"encounter": "PNJ",
"npc": "PNJ",
"vehicle": "Vehículo"
},
"Item": {
"item": "Objeto",
"feature": "Rasgo",
"weapon": "Arma",
"armure": "Armadura"
}
},
"BOL.attributes.vigor": "Fuerza",
"BOL.attributes.halfvigor" : "Media-Fuerza",
"BOL.attributes.agility": "Agilidad",
"BOL.attributes.mind": "Mente",
"BOL.attributes.appeal": "Atractivo",
"BOL.aptitudes.init": "Iniciativa",
"BOL.aptitudes.melee": "Melé",
"BOL.aptitudes.ranged": "Distancia",
"BOL.aptitudes.def": "Defensa",
"BOL.aptitudes.prot": "Protección",
"BOL.resources.hp": "Vitalidad",
"BOL.resources.hero": "Héroe",
"BOL.resources.faith": "Fe",
"BOL.resources.creation": "Creación",
"BOL.resources.power": "Poder",
"BOL.resources.villainy": "Villano",
"BOL.resources.alchemypoints": "Puntos Alquimia",
"BOL.traits.xp": "Experiencia",
"BOL.ui.tab.stats": "Atributos",
"BOL.ui.tab.combat": "Combate",
"BOL.ui.tab.actions": "Acciones",
"BOL.ui.tab.features": "Rasgos",
"BOL.ui.tab.equipment": "Equipo",
"BOL.ui.tab.description": "Descripción",
"BOL.ui.tab.details": "Detalles",
"BOL.ui.tab.spellalchemy": "Alquimia",
"BOL.ui.tab.astrologer": "Astrólogo",
"BOL.ui.astrologerPoints": "Puntos Astrología",
"BOL.ui.astrologerPointsLabel": "Puntos Astrología actuales",
"BOL.ui.ishoroscopemajor": "¿Horóscopo Mayor (ej del grupo)?",
"BOL.ui.answer": "Respuesta",
"BOL.ui.horoscopefavorable": "Favorable (1dB)",
"BOL.ui.horoscopeunfavorable": "Desfavorable (1dM)",
"BOL.ui.horoscopes": "Horóscopos",
"BOL.ui.horoscopesBonus": "Horóscopos (Ventaja)",
"BOL.ui.horoscopesMalus": "Horóscopos (Desventaja)",
"BOL.ui.groupHoroscope": "Horóscropo de Grupo de ",
"BOL.ui.rabble": "Chusma",
"BOL.ui.tough": "Matones",
"BOL.ui.villain": "Villanos",
"BOL.ui.properties": "Propiedades",
"BOL.ui.description": "Descripción",
"BOL.ui.actions": "Acciones",
"BOL.ui.capacities": "Capacidad",
"BOL.ui.damages": "Daño",
"BOL.ui.details": "Detalles",
"BOL.ui.category": "Categoría",
"BOL.ui.subcategory": "Sub-Categoría",
"BOL.ui.type": "Tipo",
"BOL.ui.subtype": "Subtipo",
"BOL.ui.attribute" : "Atributo",
"BOL.ui.aptitude" : "Habilidad",
"BOL.ui.advantages" : "Ventaja/Desventaja",
"BOL.ui.modifiers": "Modificador",
"BOL.ui.item": "Objeto",
"BOL.ui.edit": "Editar",
"BOL.ui.unequip": "Quitar",
"BOL.ui.equip": "Equipar",
"BOL.ui.delete": "Borrar",
"BOL.ui.roll" : "Tirar",
"BOL.ui.equipment" : "Equipo",
"BOL.ui.equipmentProperties" : "Propiedades Equipo",
"BOL.ui.weaponAttack" : "Ataque Arma",
"BOL.ui.weaponProperties" : "Propiedades Arma",
"BOL.ui.protectionProperties" : "Propiedades Protección",
"BOL.ui.magicalProperties" : "Propiedades Mágicas",
"BOL.ui.alchemyProperties": "Propiedades Alquimia",
"BOL.ui.armor" : "Armadura",
"BOL.ui.reach" : "Alcance",
"BOL.ui.weapon" : "Arma",
"BOL.ui.melee" : "Melé",
"BOL.ui.ranged" : "Distancia",
"BOL.ui.protection" : "Protección",
"BOL.ui.shield" : "Escudo",
"BOL.ui.blocking" : "Bloqueo",
"BOL.ui.range" : "Alcance",
"BOL.ui.quantity" : "Cantidad",
"BOL.ui.qty" : "Cant.",
"BOL.ui.slot" : "Hueco",
"BOL.ui.weight" : "Peso",
"BOL.ui.price": "Precio",
"BOL.ui.cancel": "Cancelar",
"BOL.ui.submit": "OK",
"BOL.ui.attributeCheck" : "Tirada Atributo",
"BOL.ui.aptitudeCheck" : "Tirada Habilidad",
"BOL.ui.weaponCheck" : "Tirada Arma",
"BOL.ui.spellCheck" : "Tirada Conjuro",
"BOL.ui.careers" : "Oficios",
"BOL.ui.boons" : "Ventaja",
"BOL.ui.flaws" : "Desventaja",
"BOL.ui.rank" : "Rango",
"BOL.ui.success" : "Éxito",
"BOL.ui.failure" : "Fallo",
"BOL.ui.fumble" : "Pifia",
"BOL.ui.critical" : "Éxito Asombroso",
"BOL.ui.criticallegend" : "Éxito Legendario",
"BOL.ui.maneuvers" : "Maniobras",
"BOL.ui.stacksize" : "Tamaño Pila (máx)",
"BOL.ui.weapons" : "Armas",
"BOL.ui.protections" : "Protección",
"BOL.ui.ammos" : "Munición",
"BOL.ui.containers" : "Contenedor",
"BOL.ui.treasure" : "Tesoro",
"BOL.ui.vehicles" : "Vehículo/Montura",
"BOL.ui.misc" : "Varios",
"BOL.ui.vehicleProperties" : "Propiedades Vehículo",
"BOL.ui.speed" : "Velocidad",
"BOL.ui.noWeaponName" : "Nombre Arma",
"BOL.ui.targetDefence": "Defensa",
"BOL.ui.applyShieldMalus": "Aplicar Mod. Escudo",
"BOL.ui.shieldMalus": "Mod. Escudo",
"BOL.ui.defenseScore": "Valor Defensa",
"BOL.ui.defender": "Defensor",
"BOL.ui.difficulty": "Dificultad",
"BOL.ui.spellProperties": "Propiedades Conjuro",
"BOL.ui.duration": "Duración",
"BOL.ui.spellkeep": "Mantenimiento",
"BOL.ui.concentrate": "Concentración",
"BOL.ui.registerInit": "Registrar Inic.",
"BOL.ui.isSorcerer": "¿Es Hechicero?",
"BOL.ui.isAlchemist": "¿Es Alquimista?",
"BOL.ui.isPriest": "¿Es Clérigo/Druida?",
"BOL.ui.isAstrologer": "¿Es Astrólogo?",
"BOL.ui.circle": "Círculo",
"BOL.ui.spells": "Conjuros",
"BOL.ui.focusSpell": "Lanzar conjuro",
"BOL.ui.sorcererRank" : "Rango Hechicero",
"BOL.ui.alchemistRank": "Rango Alquimista",
"BOL.ui.mandatoryconditions": "Condiciones obligatorias",
"BOL.ui.optionnalconditions": "Condiciones opcionales",
"BOL.ui.ppcost": "Coste Puntos Poder",
"BOL.ui.ppAvailable": "Puntos Poder Disponibles",
"BOL.ui.pccost": "Coste Puntos Creación",
"BOL.ui.pcnow": "Puntos Creación Actuales",
"BOL.ui.alchemyType": "Tipo",
"BOL.ui.alchemy": "Alquimia",
"BOL.ui.makeAlchemy": "Realizar Alquimia",
"BOL.ui.alchemyCostTotal": "Coste Total Puntos Alquimia",
"BOL.ui.alchemyInvest": "Invertir Puntos Alquimia",
"BOL.ui.alchemyCurrent": "Puntos Alquimia actuales en Objeto",
"BOL.ui.advance": "Estado",
"BOL.ui.isadvantage": "¿Da un dado ventaja?",
"BOL.ui.bonusmalus": "Ventaja/desventaja adicional",
"BOL.ui.nbdices": "Número Dados",
"BOL.ui.totalmod": "Mod. Total",
"BOL.ui.rangeModifiers": "Mod. distancia",
"BOL.ui.money": "Dinero",
"BOL.ui.moneyTitle": "Tesoro",
"BOL.ui.fightOption": "Opciones Combate",
"BOL.ui.none": "Ninguno",
"BOL.ui.fightOptionType": "Tipo Opción Combate",
"BOL.ui.activated": "Activado",
"BOL.ui.deactivated": "Desactivado",
"BOL.ui.status": "Estado",
"BOL.ui.toactivated": "Activo",
"BOL.ui.todeactivated": "Inactivo",
"BOL.ui.armorAgiMalus": "Mod. Armadura+Escudo (Agi)",
"BOL.ui.armorInitMalus": "Mod. Armadura (Inic)",
"BOL.ui.attackValue": "Valor Ataque",
"BOL.ui.attackModifier": "Mod. Ataque",
"BOL.ui.weaponbonus": "Esta arma se beneficia de un Dado de ventaja (ej Arma Personal)",
"BOL.ui.initMalus": "Desventaja Inic.",
"BOL.ui.creature": "Criatura",
"BOL.ui.undead": "No-muerto",
"BOL.ui.daemon": "Demonio",
"BOL.ui.attributaptitude": "Atributo o Habilidad",
"BOL.ui.always": "Todos (ej siempre)",
"BOL.ui.effectbonusmalus": "Ventaja o Desventaja a aplicar",
"BOL.ui.boleffects": "Efectos (automático)",
"BOL.ui.modifier": "Modificador",
"BOL.ui.effects": "Efectos Activos",
"BOL.ui.pcname": "PCs",
"BOL.ui.npcname": "NPCs",
"BOL.ui.pclistbutton": "Vista compacta",
"BOL.ui.noactorfound": "PNJ Desconocido. El PNJ debe ser conocido en el mundo de juego para poder mostrase.",
"BOL.ui.deletetitle": "Borrar",
"BOL.ui.confirmdelete": "¿Seguro que quieres borrar este objeto?",
"BOL.ui.nomorealchemypoints": "¡Sin Puntos de Creación!",
"BOL.ui.armornoformula": "La Armadura {protect.name} no dispone de fórmula de protección!",
"BOL.ui.selectactor": "Selecciona un actora para aplicar la macro",
"BOL.ui.itemnotfound": "Imposible encontrar el objeto de esta macro",
"BOL.ui.noinit": "Sin iniciativa. Tira por iniciativa desde la hoja del actor.",
"BOL.ui.warninitiative": "Iniciativa no disponible. Tira Iniciativa para este combate.",
"BOL.ui.isspecial": "¿Especial?",
"BOL.ui.createEquipment": "Crear equipo",
"BOL.ui.astrology": "Astrología",
"BOL.ui.astrologyMinor": "Crear Horóscopo Menor",
"BOL.ui.astrologyMajor": "Crear Horóscopo Mayor",
"BOL.ui.astrologyMajorGroup": "Crear Grupo Horóscopo Mayor",
"BOL.ui.makeHoroscope": "Crear Horóscopo",
"BOL.ui.astrologerRank": "Rango Astrólogo",
"BOL.ui.horoscopeCost": "Coste Puntos Astrología",
"BOL.ui.minor": "Menor",
"BOL.ui.major": "Mayor",
"BOL.ui.majorgroup": "Grupo Mayor",
"BOL.ui.horoscopeGroup": "Grupo Horóscopo",
"BOL.ui.horoscopeDiceRemaining": "Dados Restantes",
"BOL.ui.horoscopeDiceMax": "Dado Máx",
"BOL.ui.astrologyNoPoints": "¡No dispones de suficientes Puntos Astrología!",
"BOL.ui.newEquipment": "Nuevo equipo",
"BOL.ui.newNaturalWeapon": "Arma natural",
"BOL.ui.newNaturalProtection": "Protección natural",
"BOL.ui.createNaturalWeapon": "Crear un arma natural",
"BOL.ui.createNaturalProtection": "Crear una protección natural",
"BOL.featureCategory.origins": "Origen",
"BOL.featureCategory.races": "Raza",
"BOL.featureCategory.careers": "Oficios",
"BOL.featureCategory.boons": "Ventajas",
"BOL.featureCategory.flaws": "Desventajas",
"BOL.featureCategory.languages": "Idiomas",
"BOL.featureCategory.fightoptions": "Opciones Combate",
"BOL.featureSubtypes.origin": "Origen",
"BOL.featureSubtypes.race": "Raza",
"BOL.featureSubtypes.career": "Oficio",
"BOL.featureSubtypes.boon": "Ventaja",
"BOL.featureSubtypes.flaw": "Desventaja",
"BOL.featureSubtypes.language": "Idioma",
"BOL.featureSubtypes.gods": "Dioses",
"BOL.featureSubtypes.fightOption": "Opción Combate",
"BOL.featureSubtypes.effect": "Efecto",
"BOL.featureSubtypes.effects": "Efectos",
"BOL.featureSubtypes.boleffect": "Efecto",
"BOL.featureSubtypes.horoscope": "Horóscopo",
"BOL.featureSubtypes.xplog": "Diario PX",
"BOL.bougette.nomoney": "Nada",
"BOL.bougette.tolive": "Vivir justo",
"BOL.bougette.easylife": "Vida simple",
"BOL.bougette.luxury" : "Vida lujosa",
"BOL.bougette.rich": "¡Rico!",
"BOL.fightOptionTypes.armor": "Ataque Armadura",
"BOL.fightOptionTypes.intrepid": "Ataque Total",
"BOL.fightOptionTypes.twoweaponsdef": "Dos Armas (Defensa)",
"BOL.fightOptionTypes.twoweaponsatt": "Dos Armas (Ataque)",
"BOL.fightOptionTypes.fulldefense": "Defensa Total",
"BOL.fightOptionTypes.defense": "Posición Defensiva",
"BOL.fightOptionTypes.attack": "Posición Ofensiva",
"BOL.fightOptionTypes.other": "Otro",
"BOL.itemCategory.object": "Objeto",
"BOL.itemCategory.equipment": "Equipo",
"BOL.itemCategory.consumable": "Consumible",
"BOL.itemCategory.spell": "Conjuro",
"BOL.itemCategory.vehicle": "Montura/Vehículo",
"BOL.itemCategory.other": "Otro",
"BOL.itemCategory.capacity" : "Capacidad",
"BOL.itemCategory.alchemy": "Alquimia",
"BOL.itemCategory.vehicleweapon": "Arma Vehicular",
"BOL.combatCategory.protections": "Protecciones",
"BOL.combatCategory.shields": "Escudos",
"BOL.combatCategory.melee": "Melé",
"BOL.combatCategory.ranged": "Distancia",
"BOL.combatCategory.fightOptions": "Opciones combate",
"BOL.combatCategory.natural": "Armas Naturales",
"BOL.equipmentCategory.weapon": "Arma",
"BOL.equipmentCategory.armor": "Armadura",
"BOL.equipmentCategory.protection": "Protección",
"BOL.equipmentCategory.shield": "Escudo",
"BOL.equipmentCategory.helm": "Casco",
"BOL.equipmentCategory.jewel": "Joya",
"BOL.equipmentCategory.scroll": "Pergamino",
"BOL.equipmentCategory.ammunition": "Munición",
"BOL.equipmentCategory.container": "Contenedor",
"BOL.equipmentCategory.currency": "Moneda",
"BOL.equipmentCategory.other": "Otro",
"BOL.protectionCategory.armor": "Armadura",
"BOL.protectionCategory.shield": "Escudo",
"BOL.protectionCategory.helm": "Casco",
"BOL.protectionCategory.other": "Otro",
"BOL.spellItem.charm": "Truco",
"BOL.spellItem.circle1": "Primer Círculo",
"BOL.spellItem.circle2": "Segundo Círculo",
"BOL.spellItem.circle3": "Tercer Círculo",
"BOL.alchemyItem.common": "Común",
"BOL.alchemyItem.scarce": "Escaso",
"BOL.alchemyItem.legend": "Legendario",
"BOL.alchemyItem.mythic": "Mítico",
"BOL.weaponCategory.melee": "Melé",
"BOL.weaponCategory.ranged": "Distancia",
"BOL.weaponCategory.other": "Otro",
"BOL.itemProperty.damageMultiplier": "Multiplicador Daño",
"BOL.itemProperty.attackBonusDice": "Dado Ventaja Ataque",
"BOL.itemProperty.equipable": "Equipable",
"BOL.itemProperty.protection": "Protección",
"BOL.itemProperty.blocking": "Bloqueo",
"BOL.itemProperty.magical": "Mágico",
"BOL.itemProperty.concealable": "Ocultable",
"BOL.itemProperty.2H": "Arma 2M",
"BOL.itemProperty.helm": "Casco",
"BOL.itemProperty.improvised": "Improvisada",
"BOL.itemProperty.shield": "Escudo",
"BOL.itemProperty.melee": "Melé",
"BOL.itemProperty.throwable": "Arrojadiza",
"BOL.itemProperty.ignoreshield": "Ignora Escudo",
"BOL.itemProperty.bashing": "Golpea",
"BOL.itemProperty.stackable": "Apilable",
"BOL.itemProperty.ranged": "Distancia",
"BOL.itemProperty.weapon": "Arma",
"BOL.itemProperty.reloadable": "Recargable",
"BOL.itemProperty.worn": "Equipada",
"BOL.itemProperty.spell" : "Conjuro",
"BOL.itemProperty.armor" : "Armadura",
"BOL.itemProperty.consumable" : "Consumible",
"BOL.itemProperty.bow" : "Arco",
"BOL.itemProperty.crossbow" : "Ballesta",
"BOL.itemProperty.throwing" : "Arrojadiza",
"BOL.itemProperty.activable" : "Activable",
"BOL.itemProperty.powder" : "Polvo",
"BOL.itemProperty.attackAttribute" : "Ataque (Atributo)",
"BOL.itemProperty.attackAptitude" : "Ataque (Habilidad)",
"BOL.itemProperty.attackModifiers" : "Ataque (Modificadores)",
"BOL.itemProperty.attackReroll1" : "Ataque (Relanzar 1s)",
"BOL.itemProperty.damage" : "Daño",
"BOL.itemProperty.damageModifiers" : "Daño (Modificador)",
"BOL.itemProperty.damageAttribute" : "Daño (Atributo)",
"BOL.itemProperty.damageSpecial" : "Damage (Especial)",
"BOL.itemProperty.damageReroll1" : "Relanzar 1s",
"BOL.itemProperty.range" : "Alcance (en m)",
"BOL.itemProperty.soakFormula": "Absorver (Fórmula)",
"BOL.itemProperty.soakModifiers": "Absorver (Modificador)",
"BOL.itemProperty.soakValue": "Absorver (Valor Defecto)",
"BOL.itemProperty.armorQuality": "Calidad Armadura",
"BOL.itemProperty.blockingMalus" : "Mod. Bloqueo",
"BOL.itemProperty.blockingAttacksBlocked" : "Ataques bloqueados",
"BOL.itemProperty.blocking1Attack" : "Bloquea 1 ataque",
"BOL.itemProperty.blockingAllAttacks" : "Bloquea todos ataques",
"BOL.itemProperty.slot" : "Hueco",
"BOL.itemProperty.reload": "Recarga (Acción)",
"BOL.itemProperty.weaponSize" : "Tamaño Arma",
"BOL.itemProperty.difficulty": "Dificultad",
"BOL.itemProperty.natural": "Arma natural",
"BOL.itemProperty.onlymodifier": "Sólo modificador (ej criatura)",
"BOL.itemStat.quantity": "Cantidad",
"BOL.itemStat.weight": "Peso",
"BOL.itemStat.price": "Precio",
"BOL.itemStat.range": "Alcance",
"BOL.itemStat.damage": "Daño",
"BOL.itemStat.reload": "Recargar (Acción)",
"BOL.itemStat.soak": "Absorver",
"BOL.itemStat.blocking": "Bloqueo",
"BOL.itemStat.modifiers": "Modificadores",
"BOL.weaponSize.unarmed" : "Desarmado",
"BOL.weaponSize.improvised" : "Improvisada",
"BOL.weaponSize.light" : "Ligera",
"BOL.weaponSize.medium" : "Mediana",
"BOL.weaponSize.heavy" : "Pesada",
"BOL.itemModifiers.init": "Mod. (Iniciativa)",
"BOL.itemModifiers.social": "Mod. (Social)",
"BOL.itemModifiers.agility": "Mod. (Agilidad)",
"BOL.itemModifiers.powercost": "Mod. (Coste adicional en PP)",
"BOL.itemBlocking.malus": "Modificador",
"BOL.itemBlocking.nbAttacksPerRound": "Agilidad",
"BOL.soakFormula.none" : "-",
"BOL.soakFormula.light" : "Ligero (Cancela d6-3 daño)",
"BOL.soakFormula.medium" : "Mediano (Cancela d6-2 daño)",
"BOL.soakFormula.heavy" : "Pesado (Cancela d6-1 daño)",
"BOL.armorQuality.none" : "-",
"BOL.armorQuality.light" : "Ligera",
"BOL.armorQuality.lightQ" : "Ligera Calidad",
"BOL.armorQuality.lightSup" : "Ligera Superior",
"BOL.armorQuality.lightLeg" : "Ligera Legendaria",
"BOL.armorQuality.medium" : "Mediana",
"BOL.armorQuality.mediumQ" : "Mediana Calidad",
"BOL.armorQuality.mediumSup" : "Mediana Superior",
"BOL.armorQuality.mediumLeg" : "Mediana Legendaria",
"BOL.armorQuality.heavy" : "Pesada",
"BOL.armorQuality.heavyQ" : "Pesada Calidad",
"BOL.armorQuality.heavySup" : "Pesada Superior",
"BOL.armorQuality.heavyLeg" : "Pesada Legendaria",
"BOL.equipmentSlots.none" : "-",
"BOL.equipmentSlots.head" : "Cabeza",
"BOL.equipmentSlots.neck" : "Cuello",
"BOL.equipmentSlots.shoulders" : "Ombros",
"BOL.equipmentSlots.body" : "Cuerpo",
"BOL.equipmentSlots.rhand" : "Mano derecha",
"BOL.equipmentSlots.lhand" : "Mano izquierda",
"BOL.equipmentSlots.2hands" : "2 manos",
"BOL.equipmentSlots.rarm" : "Brazo derecho",
"BOL.equipmentSlots.larm" : "Brazo izquierdo",
"BOL.equipmentSlots.chest" : "Pecho",
"BOL.equipmentSlots.belt" : "Cintura",
"BOL.equipmentSlots.legs" : "Piernas",
"BOL.equipmentSlots.feet" : "Pies",
"BOL.equipmentSlots.finder" : "Dedo",
"BOL.equipmentSlots.ear" : "Oreja",
"BOL.vehicleCategory.mount" : "Montura terrestre",
"BOL.vehicleCategory.flying" : "Montura voladora",
"BOL.vehicleCategory.boat" : "Bote",
"BOL.vehicleCategory.other" : "Otro",
"BOL.range.PointBlank": "Quemarropa",
"BOL.range.Short": "Corta",
"BOL.range.Medium": "Media",
"BOL.range.Long": "Larga",
"BOL.range.VeryLong": "Distante",
"BOL.range.Extreme": "Extrema",
"BOL.range.Maximum": "Límite",
"BOL.notification.MacroMultipleTokensSelected": "¡Has seleccionado varios tokens!",
"BOL.notification.MacroNoActorAvailable": "¡No se pudo marcar el actor como objetivo!",
"BOL.notification.MacroNoTokenSelected": "¡Debes seleccionar un token!",
"BOL.size.tiny": "Minúsculo",
"BOL.size.verysmall": "Muy pequeño",
"BOL.size.small" : "Pequeño",
"BOL.size.medium" : "Mediano",
"BOL.size.large" : "Grande",
"BOL.size.verylarge": "Muy Grande",
"BOL.size.huge" : "Monstruoso",
"BOL.size.massive" : "Monumental",
"BOL.size.enormous": "Enorme",
"BOL.size.gigantic": "Gigante",
"BOL.size.immense": "Inmenso",
"BOL.size.colossal": "Colosal",
"BOL.chat.fightactive": "¡Activa la opción de combate {foName} este asalto!",
"BOL.chat.fightunactive": "¡Desactiva la opción de combate {foName} este asalto!",
"BOL.chat.isdead": "¡{name} esta muerto!",
"BOL.chat.epitaph": "¡Guardar el honor de su nombre y su memoria!",
"BOL.chat.vitalityzero": "Vitalidad de {name} es {hp}: ¡va a caer inconsciente!",
"BOL.chat.vitalityheroism": "Puedes gastar 1 Punto Héroe para levantarte en 1 asalto.",
"BOL.chat.vitalityheroismhint": "En este caso, tu vitalidad se incrementa a su máximo dividido por 2.",
"BOL.chat.vitalitydying": "Vitalidad de {name} es {hp}! Se esta muriendo...",
"BOL.chat.vitalitydyingheroism": "Puedes gastar 1 Punto Héroe para Desafiar la Muerte.",
"BOL.chat.alchemytitle": "Receta alquímica: {name}",
"BOL.chat.alchemypoints": "Coste Puntos Creación: {pcCostCurrent}",
"BOL.chat.alchemysuccess": "¡La receta alquímica es un éxito!<br>Crea el objeto/efecto relevante en el inventario.<br>El estadio se reinicia.",
"BOL.chat.alchemyfailure": "¡La receta alquímica ha fallado!<br>El estadio se reinicia.",
"BOL.chat.rolldamage": "Tirada de daño",
"BOL.chat.rolldamage6": "Tirada de daño +6",
"BOL.chat.rolldamage12": "Tirada de daño +12 (1 PH)",
"BOL.chat.damageresult": "Daño {name}: {total}",
"BOL.chat.damagetarget": "Objetivo: {target}",
"BOL.chat.applydamagetotarget": "Aplicar daño al objetivo",
"BOL.chat.fightoption": "Opciones de combate",
"BOL.chat.reroll": "Relanzar (1 PH)",
"BOL.chat.heroicreminder": "Adicionalmente a las acciones abajo puedes: <ul><li>Carnicería: 1 ataque adicional al mismo oponente</li><li>Golpe Preciso: 1 Dado desventaja para oponente en localización</li><li>Desarme</li><li>Asesino de Chusma</li><li>Derribado: empujas oponente al suelo (máx +1 tamaño)</li></ul>Si gastas 1 Punto Heroe adicional, todos estos efectos pueden doblarse.",
"BOL.chat.toheroic": "Convertir en éxito Asombroso (1 PH)",
"BOL.chat.tolegend": "Convertir en éxito Legendario (1 PH)",
"BOL.chat.hurttitle": "¡{name} va a recibir {damageTotal} daño!",
"BOL.chat.armordefault": "Este ataque atraviesa armadura: la armadura no se utiliza para reducir daño.",
"BOL.chat.witharmor": "Impacto con armadura",
"BOL.chat.withoutarmor": "Impacto sin armadura",
"BOL.chat.shakeoff": "Sacudirse las Heridas (1 PH)",
"BOL.chat.splinteredshield": "Sacrificar Escudo/Arma {name} (1 PH)",
"BOL.chat.nodamage": "Sin daño",
"BOL.chat.damagesummary": "{name} recibe daño",
"BOL.chat.protectvalue": "Protección armadura",
"BOL.chat.noprotectvalue": "¡Sin armadura!",
"BOL.chat.heroreducedamage": "Un Punto de Héroe se ha gastado, para reducir el daño en {total}.",
"BOL.chat.herosplintered": "No recibes daño gracias a sacrificar el escudo/arma {weaponHero.name}. ¡El escudo/arma se ha destruido! y un PH se ha gastado.",
"BOL.chat.finaldamage": "Daño Final: ¡{finalDamage} de daño!",
"BOL.chat.spell": "Conjuro",
"BOL.chat.spellcost": "Coste Puntos Poder",
"BOL.chat.spellremaining": "Puntos Poder restantes",
"BOL.chat.nodamagesummary": "Sin daño ....",
"BOL.chat.damageresume": "{name} recibe heridas ...",
"BOL.chat.fumblemessage": "Si aceptas un fallo calamitoso (DJ escoje consecuencia), puedes ganar 1 Punto Héroe adicional.",
"BOL.chat.rangeinfo": "Disparo de {attackerName} a {defenderName}",
"BOL.chat.rangeweaponinfo": "Arma: {weaponName} - Alcance base {weaponRange}",
"BOL.chat.rangeout": "Mod: Fuera de alcance",
"BOL.chat.range0": "Mod: Quemarropa (+1)",
"BOL.chat.range1": "Mod: Alcance Corto (0)",
"BOL.chat.range2": "Mod: Alcance Medio (-1)",
"BOL.chat.range3": "Mod: Alcance Largo (-2)",
"BOL.chat.range4": "Mod: Alcance Distante (-4)",
"BOL.chat.range5": "Mod: Alcance Extremo (-6)",
"BOL.chat.range6": "Mod: Alcance Límite (-8)",
"BOL.chat.rangeprefix": "Distancia calculada: ",
"BOL.chat.rangevisible": "Linea de visión limpia entre tokens.",
"BOL.chat.rangenotvisible": "Linea de visión bloqueada entre tokens.",
"BOL.chat.rangetitle": "Información DJ",
"BOL.chat.weaponreroll1": "Recordatorio, este arma vuelve a tirar los 1s en daño.",
"BOL.chat.rollbougette": "Tirada moneda",
"BOL.chat.bougettesuccess": "¡Tus fondos monetarios no varían!",
"BOL.chat.bougettefailure": "Has gastado demasiado dinero, tu balance se decrementa un nivel...",
"BOL.chat.initiative": "Rango iniciativa (10 a 1)",
"BOL.chat.horoscope": "Horóscopo",
"BOL.chat.horoscopepoints": "Coste: {points} Puntos Astrología",
"BOL.chat.horoscopeminorsuccess": "Éxito horóscopo menor: cambia el nombre del horóscopo en la hoja. Te beneficias de 1 Dado Ventaja en la situación.",
"BOL.chat.horoscopeminorfailure": "Fallo horóscopo menor: cambia el nombre del horóscopo en la hoja. Sufres 1 Dado Desventaja en la situación.",
"BOL.chat.horoscopemajorsuccess": "Éxito horóscopo mayor: {horoscopeName} consigue 1 Punto Héroe en esta aventura. El punto ha sido añadido automáticamente.",
"BOL.chat.horoscopemajorfailure": "Fallo horóscopo mayor: {horoscopeName} pierde 1 Punto Héroe en esta aventura. El punto ha sido reducido automáticamente.",
"BOL.chat.horoscopemajorgroupsuccess": "Éxito en tu grupo de horóscopo mayor. Tu y tus compañeros ganáis {careerBonus} Dado Ventaja durante esta aventura.",
"BOL.chat.horoscopemajorgroupfailure": "Fallo en tu grupo de horóscopo mayor. Tu y tus compañeros sufrís {careerBonus} Dado Desventaja durante esta aventura.",
"BOL.chat.usedhoroscope": "Se ha utilizado Horóscopo",
"BOL.chat.horoscopedeleted": "Los horóscopos utilizados son borrados automáticamente.",
"BOL.chat.criticaloptions": "¡Éxito Asombroso! Selecciona 1 opción:",
"BOL.chat.criticalcarnage": "Carnicería: ganas 1 ataque adicional. Este segundo ataque no se puede beneficiar de Puntos Héroe/Villano.",
"BOL.chat.criticalplus6": "Golpe Devastador: añade +6 al daño causado (botón abajo).",
"BOL.chat.criticalprecise": "Golpe Preciso: impactas y dañas a tu oponente. Describe lo que haces (DJ de acuerdo), tu oponente sufre 1 Dado Desventaja en acciones relevantes.",
"BOL.chat.criticalunarm": "Desarme: si su oponente lleva algún arma, puede decidir desarmarlo en lugar de hacerle daño.",
"BOL.chat.criticalrabble": "Asesino de Chusma: si luchas contra Chusma, el daño resultante se convierte en el número de enemigos que derrotas.",
"BOL.chat.criticalpush": "Derribado: si el tamaño lo permite, empujas oponente al suelo. Sufre un 1 Dado Desventaja en todas sus acciones el siguiente asalto.",
"BOL.chat.criticalup": "Transforma en Legendario: si gastas 1 Punto Héroe/Villano transformas el éxito Asombroso en Legendario. Selecciona 2 opciones de la lista.",
"BOL.chat.criticalinfo": "¡Esto es un éxito Asombroso o Legendario! Escoge tus opciones y efectos",
"BOL.chat.criticalbuttonjournal": "Éxito Asombroso/Legendario",
"BOL.chat.armorRoll": "Tirada de Armadura",
"BOL.dialog.soeasy": "Demasiado fácil (+4)",
"BOL.dialog.veryeasy": "Muy fácil (+2)",
"BOL.dialog.easy": "Fácil (+1)",
"BOL.dialog.moderate": "Moderado (0)",
"BOL.dialog.hard": "Difícil (-1)",
"BOL.dialog.tough": "Duro (-2)",
"BOL.dialog.demanding": "Exigente (-4)",
"BOL.dialog.formidable": "Formidable (-6)",
"BOL.dialog.heroic": "Heroica (-8)",
"BOL.dialog.mythic": "Mítica (-10)",
"BOL.dialog.divine": "Divina (-12)",
"BOL.dialog.pointblank": "Quemarropa (+1)",
"BOL.dialog.close": "Corta (0)",
"BOL.dialog.medium": "Media (-1))",
"BOL.dialog.long": "Larga (-2)",
"BOL.dialog.distant": "Distante (-4)",
"BOL.dialog.extreme": "Extrema (-6)",
"BOL.dialog.utmost": "Límite (-8)",
"BOL.ui.name": "Nombre",
"BOL.ui.xp": "Experiencia",
"BOL.ui.xpspent": "Consumida",
"BOL.ui.xptotal": "Total",
"BOL.ui.biosize": "Tamaño",
"BOL.ui.bioweight": "Peso",
"BOL.ui.bioage": "Edad",
"BOL.ui.biohair": "Pelo",
"BOL.ui.bioeyes": "Ojos",
"BOL.ui.biosigns": "Marcas",
"BOL.ui.biodescription": "Descripción",
"BOL.ui.bionotes": "Notas",
"BOL.chat.welcome1": "Bienvenidos a Bárbaros de Lemuria (Ludospherik)",
"BOL.chat.welcome2": "Para jugar es necesario usar el manual, que lo podéis conseguir aquí: https://www.ludospherik-editions.com/en_gb/",
"BOL.chat.welcome3": "Los mapas incluidos tienen autorización de Guillaume Tavernier y Ludospherik. ¡Nuestro agradecimiento!",
"BOL.chat.welcome4": "Todo el soporte para el sistema es a través del servidor Discord: https://discord.gg/pPSDNJk",
"BOL.chat.welcome5": "¡Buena partida en Lemuria!",
"BOL.chat.welcome6": "",
"BOL.settings.rollArmor": "Tiradas de armadura",
"BOL.settings.rollArmorTooltip": "Tiradas de armadura, si no esta activo usará el valor fijo",
"BOL.settings.useBougette": "Utilizar Bougette (regla casera francesa)",
"BOL.settings.useBougetteTooltip": "Utilizar valor Bougette (Monedero), descrito en Annales Lemurienne de LeRatierBretonnien (https://www.lahiette.com/leratierbretonnien/)",
"BOL.settings.removeDead": "Automáticamente eliminar PNJs muertos al final del asalto",
"BOL.settings.removeDeadTooltip": "Automáticamente eliminar PNJs, cuando la Vitalidad es menor de 0 al final de cada asalto",
"BOL.settings.diceFormula": "Fórmula de Dados",
"BOL.settings.diceFormulaTooltip": "Fórmula general de dados (2d6 por defecto)",
"BOL.settings.diceSuccessValue" : "Valor éxito",
"BOL.settings.diceSuccessValueTooltip": "Valor del umbral para el éxito (9 por defecto en 2d6)",
"BOL.settings.diceCriticalValue" : "Valor éxito crítico",
"BOL.settings.diceCriticalValueTooltip": "Valor del umbral mínimo para el éxito crítico (12 por defecto en 2d6)",
"BOL.settings.diceCriticalFailure" : "Valor fallo crítico",
"BOL.settings.diceCriticalFailureTooltip": "Valor del umbral máximo para el fallo crítico (2 por defecto en 2d6)",
"BOL.settings.defaultLogoActorSheetPath" : "Logo para la Hoja",
"BOL.settings.defaultLogoPathActorSheetTooltip": "Hubicación del logo para la hoja del Actor (346x200, por defecto: /systems/bol/ui/logo.webp)",
"BOL.settings.defaultLogoTopLeftPath" : "Logo esquina superior izquierda",
"BOL.settings.defaultLogoTopLeftPathTooltip": "Hubicación logo ventana principal superior izquierda (718x416, por defecto: /systems/bol/ui/logo2.webp)"
}

View File

@ -2,8 +2,10 @@
"TYPES": {
"Actor": {
"character": "Personnage",
"encounter": "PNJ",
"npc": "PNJ",
"vehicle": "Véhicule"
"vehicle": "Véhicule",
"horde": "Horde"
},
"Item": {
"item": "Objet",
@ -139,6 +141,12 @@
"BOL.ui.registerInit": "Enregistrer comme Init. de combat",
"BOL.ui.initMalus": "Malus d'initiative",
"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.isAlchemist": "Carrière d'Alchimiste ?",
@ -196,12 +204,15 @@
"BOL.ui.armorAgiMalus": "Malus d'Armure+Bouclier (Agi)",
"BOL.ui.armorInitMalus": "Malus d'Armure (Init)",
"BOL.ui.attackValue": "Valeur d'attaque",
"BOL.ui.attackModifier": "Attaque",
"BOL.ui.vehicleWeapons": "Armes de véhicules",
"BOL.ui.hullDamage": "D.coque",
"BOL.ui.crewDamage": "D.équipage",
"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.creature": "Creature",
"BOL.ui.creature": "Créature",
"BOL.ui.undead": "Mort vivant",
"BOL.ui.daemon": "Démon",
"BOL.ui.rabble": "Piétaille",
"BOL.ui.tough": "Coriace",
"BOL.ui.villain": "Rival",
@ -225,7 +236,17 @@
"BOL.ui.warninitiative": "Votre initiative n'est pas disponible. Effectuez un jet d'Initiative pour ce combat.",
"BOL.ui.isspecial": "Spéciale ?",
"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.ui.hordeSize": "Taille de la horde",
"BOL.ui.hordeAttack": "Attaque de Horde",
"BOL.ui.hordeName": "Nom de la Horde",
"BOL.ui.hordeHP": "Vitalité (1 membre)",
"BOL.ui.hordehp": "Vitalité (total)",
"BOL.featureCategory.origins": "Origines",
"BOL.featureCategory.races": "Races",
"BOL.featureCategory.careers": "Carrières",
@ -251,6 +272,7 @@
"BOL.featureSubtypes.effects": "Effets",
"BOL.featureSubtypes.boleffect": "Effet",
"BOL.featureSubtypes.horoscope": "Horoscope",
"BOL.featureSubtypes.xplog": "Log d'XP",
"BOL.fightOptionTypes.armor": "Attaque au défaut d'armure",
"BOL.fightOptionTypes.intrepid": "Attaque intrépide",
@ -479,12 +501,14 @@
"BOL.chat.rolldamage": "Lancer les dommages",
"BOL.chat.rolldamage6": "Lancer les dommages +6",
"BOL.chat.rolldamage12": "Dommages +12 (1 Pt. d'Heroisme)",
"BOL.chat.rolldamage12Legend": "Dommages +12",
"BOL.chat.damageresult": "Dommages de {name} : {total}",
"BOL.chat.damagetarget": "Cible : {target}",
"BOL.chat.applydamagetotarget": "Appliquer les dommages à la cible",
"BOL.chat.fightoption": "Option de combat",
"BOL.chat.reroll": "Relancer (1 P. Heroisme)",
"BOL.chat.heroicreminder": "En plus des actions indiquées sur les boutons ci-dessous, vous pouvez : <ul><li>Carnage : Attaquer une seconde fois le même adversaire</li><li>Coup précis : Un dé de malus à votre adversaire sur une localisation choisie</li><li>Désarmement</li><li>Massacrer la piétaille</li><li>Renversement : Renversez votre adversaire (1 taille de plus max)</li></ul>Si vous dépensez un Point d'Héroisme en plus, tout ces effets peuvent être doublés",
"BOL.chat.legendaryreminder": "En plus des actions indiquées sur les boutons ci-dessous, vous pouvez effectuer 2 actions parmis: <ul><li>Carnage : Attaquer une seconde fois le même adversaire</li><li>Coup précis : Un dé de malus à votre adversaire sur une localisation choisie</li><li>Désarmement</li><li>Massacrer la piétaille</li><li>Renversement : Renversez votre adversaire (1 taille de plus max)</li></ul>",
"BOL.chat.toheroic": "Transformer en succés Héroïque (1 P. Héroisme/Vilainie)",
"BOL.chat.tolegend": "Transformer en succes Légendaire (1 P. Heroisme/Vilainie)",
"BOL.chat.hurttitle": "{name} va encaisser {damageTotal} dégats !",
@ -542,9 +566,10 @@
"BOL.chat.criticalrabble": "Massacrer la piétaille : Si vous combattez de la Piétaille, les résultats des dommages indiquent le nombre d'adversaires mis hors de combat.",
"BOL.chat.criticalpush": "Renversement : Si la taille le permet, vous poussez votre adversaire au sol, il souffrira d'1 Dé de Malus pour toutes ses actions au round suivant.",
"BOL.chat.criticalup": "Transformer en Légendaire : En dépensant 1 point d'Héroisme/Vilainie, vous pouvez transformer ce Succès Héroïque en Légendaire, qui vous permet de prendre 2 options dans la liste ci-dessus (cf. bouton pour un +12 aux dommages par exemple).",
"BOL.chat.criticalinfo": "C'est un succès Héroïque ou Légendaire ! Choisissez vos options et effets !",
"BOL.chat.criticalinfo": "C'est un succès Héroïque ! Choisissez vos options et effets !",
"BOL.chat.criticallegendaryinfo": "C'est un succès Légendaire ! Choisissez vos options et effets !",
"BOL.chat.criticalbuttonjournal": "Succès Héroïque/Légendaire",
"BOL.chat.losshp": "{name} a perdu {lossHP} points de Vitalité. Si il se repose quelques minutes, il peut récupérer {recupHP} points de Vitalité.",
"BOL.chat.applyrecup": "Récupérer pendant quelques minutes (+{recupHP} Vitalité)",
"BOL.chat.inforecup": "{name} vient de récupérer {recupHP} points de Vitalité après quelques minutes de repos.",
@ -581,6 +606,8 @@
"BOL.ui.biosigns": "Signes distinctifs",
"BOL.ui.biodescription": "Description",
"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.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 +616,11 @@
"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.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.chat.armorRoll": "Jet d'armure",
"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é)",
@ -607,5 +639,8 @@
"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.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 */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["bol", "sheet", "actor"],
template: "systems/bol/templates/actor/actor-sheet.hbs",
width: 860,
@ -27,7 +27,7 @@ export class BoLActorSheet extends ActorSheet {
function onLoad() {
let logoSheet = BoLUtility.getLogoActorSheet()
$(".bol-actor-form").css("backgroundImage",`url(${logoSheet})`)
$(".bol-actor-form").css("backgroundImage", `url(${logoSheet})`)
}
// Setup everything onload
$(function () { onLoad(); });
@ -47,10 +47,19 @@ export class BoLActorSheet extends ActorSheet {
// Equip/Unequip item
html.find('.item-equip').click(this._onToggleEquip.bind(this));
html.find('.create_item').click(ev => {
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvel Equipement", type: "item" }], { renderSheet: true });
html.find('.create-item').click(ev => {
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) => {
const li = $(ev.currentTarget).parents(".item")
this.actor.toggleFightOption(li.data("itemId"))
@ -122,8 +131,8 @@ export class BoLActorSheet extends ActorSheet {
/** @override */
async getData(options) {
const data = super.getData(options)
const actorData = duplicate(data)
let formData = duplicate(data)
const actorData = foundry.utils.duplicate(data)
let formData = foundry.utils.duplicate(data)
formData.config = game.bol.config
formData.data = actorData
@ -147,6 +156,7 @@ export class BoLActorSheet extends ActorSheet {
formData.fightoptions = this.actor.fightoptions
formData.ammos = this.actor.ammos
formData.misc = this.actor.misc
formData.xplog = this.actor.xplog
formData.combat = this.actor.buildCombat()
formData.initiativeRank = this.actor.getInitiativeRank()
//formData.combatCreature = this.actor.buildCombatCreature()
@ -155,12 +165,13 @@ export class BoLActorSheet extends ActorSheet {
formData.options = this.options
formData.owner = this.document.isOwner
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.charType = this.actor.getCharType()
formData.villainy = this.actor.getVillainy()
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.villainy = this.actor.getVillainy()
formData.isUndead = this.actor.isUndead()
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.isAlchemist = this.actor.isAlchemist()
formData.isAstrologer = this.actor.isAstrologer()
@ -186,7 +197,7 @@ export class BoLActorSheet extends ActorSheet {
// Get the type of item to create.
const type = header.dataset.type;
// Grab any data associated with this control.
const data = duplicate(header.dataset);
const data = foundry.utils.duplicate(header.dataset);
// Initialize a default name.
const name = `New ${type.capitalize()}`;
// Prepare the item object.
@ -248,22 +259,22 @@ export class BoLActorSheet extends ActorSheet {
case "attributexp":
this.actor.incAttributeXP(dataset.key)
break;
case "bougette":
this.actor.rollBougette()
break;
case "careerxp":
this.actor.incCareerXP( li.data("item-id"))
this.actor.incCareerXP(li.data("item-id"))
break;
case "horoscope-minor":
BoLRoll.horoscopeCheck(this.actor, event, "minor")
break
case "horoscope-major":
BoLRoll.horoscopeCheck(this.actor, event, "major")
break
break
case "horoscope-major-group":
BoLRoll.horoscopeCheck(this.actor, event, "majorgroup")
break
break
case "bougette":
this.actor.rollBougette()
break;
default: break;
}
}

View File

@ -7,6 +7,35 @@ import { BoLUtility } from "../system/bol-utility.js";
*/
export class BoLActor extends Actor {
static async create(data, options) {
// Case of compendium global import
if (data instanceof Array) {
return super.create(data, options);
}
// If the created actor has items (only applicable to duplicated actors) bypass the new actor creation logic
if (data.items) {
let actor = super.create(data, options);
return actor;
}
if (data.type == 'horde') {
let weapon = {
name: game.i18n.localize("BOL.ui.hordeAttack"), type: "item",
img: "ui/icons/attaque_melee.webp",
system: foundry.utils.duplicate(game.bol.config.defaultNaturalWeapon)
}
weapon.system.properties.attackModifiers = 1
weapon.system.properties.damage = "1d6M"
data.items = [weapon]
data.img = "systems/bol/ui/icons/icon-horde-token.webp"
data.prototypeToken = { texture: "systems/bol/ui/icons/icon-horde-token.webp" }
}
return super.create(data, options);
}
/** @override */
prepareData() {
@ -18,19 +47,44 @@ export class BoLActor extends Actor {
this.chartype = 'tough'
this.villainy = true
}
if (this.type == "horde") {
let weapon = this.items.find(i => i.type === "item" && i.system.subtype === "weapon")
// Check if the horde attack is inline with the hordesize
if (weapon?.system?.properties?.attackModifiers != this.system.hordesize) {
this.updateEmbeddedDocuments('Item', [{ _id: weapon.id, 'system.properties.attackModifiers': this.system.hordesize }])
}
}
super.prepareData()
}
/* -------------------------------------------- */
async _onCreateOperation(documents, operation, user) {
await super._onCreateOperation(documents, operation, user);
}
/* -------------------------------------------- */
getTokenSizeFromHordeSize(hordeSize) {
hordeSize = hordeSize || this.system.hordesize
// If size > 50 then max is 50
let size = Math.min(hordeSize, 20)
// Compute the size of the token from 1 to 5
let tokenSize = Math.max((size / 4), 1) // Never below 1
return tokenSize
}
/* -------------------------------------------- */
async _preCreate(data, options, user) {
await super._preCreate(data, options, user);
// Configure prototype token settings
const prototypeToken = {};
if (this.type === "character") Object.assign(prototypeToken, {
sight: { enabled: true }, actorLink: true, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
});
this.updateSource({ prototypeToken });
if (this.type === "character") {
Object.assign(prototypeToken, {
sight: { enabled: true }, actorLink: true, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
});
this.updateSource({ prototypeToken });
}
}
/* -------------------------------------------- */
@ -38,10 +92,7 @@ export class BoLActor extends Actor {
if (this.type === 'character') {
return true
}
if (this.type === 'encounter' && this.chartype == "adversary") {
return true
}
return false
return (this.type === 'encounter' && this.chartype == "adversary")
}
/* -------------------------------------------- */
@ -54,10 +105,10 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
getVillainy() {
if (this.type === 'encounter' && this.chartype == "adversary") {
return true
}
return false
return (this.type === 'encounter' && this.chartype == "adversary")
}
isUndead() {
return (this.type == "encounter" && this.system.isundead)
}
/* -------------------------------------------- */
getInitiativeMalus() {
@ -69,7 +120,7 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
getBougette() {
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.diceImg = "icons/dice/" + game.bol.config.bougetteDice[String(this.system.bougette.value)] + "black.svg"
return b
@ -80,7 +131,7 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
async rollBougette() {
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)
rollData.formula = game.bol.config.bougetteDice[String(this.system.bougette.value)]
let r = new BoLDefaultRoll(rollData)
@ -91,7 +142,7 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
decBougette() {
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)
this.update({ 'system.bougette': bougette })
}
@ -145,7 +196,7 @@ export class BoLActor extends Actor {
}
}
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.")
return attrList
}
@ -199,21 +250,40 @@ export class BoLActor extends Actor {
getActiveFightOption() {
let it = this.items.find(i => i.type === "feature" && i.system.subtype === "fightoption" && i.system.properties.activated)
if (it) {
return duplicate(it)
return foundry.utils.duplicate(it)
}
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) {
let attr = duplicate(this.system.attributes[key])
let attr = foundry.utils.duplicate(this.system.attributes[key])
if (attr) {
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) {
attr.value += 1
xp.spent += nextXP
this.update({ [`system.attributes.${key}`]: attr, [`system.xp`]: xp })
this.addXPLog("attribute", key, nextXP, attr.value)
} else {
ui.notifications.warn("Pas assez de points d'expérience !")
}
@ -222,14 +292,15 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
incAptitudeXP(key) {
let apt = duplicate(this.system.aptitudes[key])
let apt = foundry.utils.duplicate(this.system.aptitudes[key])
if (apt) {
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) {
apt.value += 1
xp.spent += nextXP
this.update({ [`system.aptitudes.${key}`]: apt, [`system.xp`]: xp })
this.addXPLog("aptitude", key, nextXP, apt.value)
} else {
ui.notifications.warn("Pas assez de points d'expérience !")
}
@ -239,13 +310,14 @@ export class BoLActor extends Actor {
incCareerXP(itemId) {
let career = this.items.get(itemId)
if (career) {
career = duplicate(career)
career = foundry.utils.duplicate(career)
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) {
xp.spent += nextXP
this.update({ [`system.xp`]: xp })
this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'system.rank': career.system.rank + 1 }])
this.addXPLog("career", career.name, nextXP, career.system.rank + 1)
} else {
ui.notifications.warn("Pas assez de points d'expérience !")
}
@ -259,7 +331,7 @@ export class BoLActor extends Actor {
let updates = []
if (fightOption) {
fightOption = duplicate(fightOption)
fightOption = foundry.utils.duplicate(fightOption)
if (fightOption.system.properties.activated) {
state = false
} else {
@ -298,17 +370,20 @@ export class BoLActor extends Actor {
get boleffects() {
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() {
return this.items.filter(i => i.type === "feature" && i.system.subtype === "horoscope")
}
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() {
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() {
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() {
return this.items.filter(i => i.type === "feature" && i.system.subtype === "origin");
@ -390,31 +465,23 @@ export class BoLActor extends Actor {
get bonusBoons() {
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() {
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() {
if (this.careers.find(item => item.system.properties.sorcerer == true))
return true
return false
return (this.careers.find(item => item.system.properties.sorcerer))
}
isAlchemist() {
if (this.careers.find(item => item.system.properties.alchemist == true))
return true
return false
return (this.careers.find(item => item.system.properties.alchemist))
}
isAstrologer() {
if (this.careers.find(item => item.system.properties.astrologer == true))
return true
return false
return (this.careers.find(item => item.system.properties.astrologer))
}
isPriest() {
if (this.careers.find(item => item.system.properties.priest == true))
return true
return false
return (this.careers.find(item => item.system.properties.priest))
}
/*-------------------------------------------- */
@ -484,7 +551,7 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
spentAstrologyPoints(points) {
let astrology = duplicate(this.system.resources.astrologypoints)
let astrology = foundry.utils.duplicate(this.system.resources.astrologypoints)
astrology.value -= points
astrology.value = Math.max(astrology.value, 0)
this.update({ 'system.resources.astrologypoints': astrology })
@ -535,8 +602,8 @@ export class BoLActor extends Actor {
rollData.horoscopeName = actorHoroscope.name
}
if (rollData.horoscopeType == "majorgroup") {
let rID = randomID(16)
let horoscopes = duplicate(game.settings.get("bol", "horoscope-group"))
let rID = foundry.utils.randomID(16)
let horoscopes = foundry.utils.duplicate(game.settings.get("bol", "horoscope-group"))
horoscopes[rID] = {
id: rID,
name: game.i18n.localize("BOL.ui.groupHoroscope") + this.name,
@ -568,7 +635,7 @@ export class BoLActor extends Actor {
async spendAlchemyPoint(alchemyId, pcCost) {
let alchemy = this.items.get(alchemyId)
if (alchemy) {
pcCost = Number(pcCost) ?? 0
pcCost = Number(pcCost) || 0
if (this.system.resources.alchemypoints.value >= pcCost) {
let newPC = this.system.resources.alchemypoints.value - pcCost
newPC = (newPC < 0) ? 0 : newPC
@ -582,7 +649,7 @@ export class BoLActor extends Actor {
}
/*-------------------------------------------- */
getAstrologerBonus() {
let astrologer = this.careers.find(item => item.system.properties.astrologer == true)
let astrologer = this.careers.find(item => item.system.properties.astrologer)
if (astrologer) {
return astrologer.system.rank
}
@ -590,7 +657,7 @@ export class BoLActor extends Actor {
}
/*-------------------------------------------- */
getAlchemistBonus() {
let sorcerer = this.careers.find(item => item.system.properties.alchemist == true)
let sorcerer = this.careers.find(item => item.system.properties.alchemist)
if (sorcerer) {
return sorcerer.system.rank
}
@ -598,7 +665,7 @@ export class BoLActor extends Actor {
}
/*-------------------------------------------- */
getSorcererBonus() {
let sorcerer = this.careers.find(item => item.system.properties.sorcerer == true)
let sorcerer = this.careers.find(item => item.system.properties.sorcerer)
if (sorcerer) {
return sorcerer.system.rank
}
@ -629,7 +696,7 @@ export class BoLActor extends Actor {
resources['power'] = this.system.resources.power
}
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"
}
} else {
@ -775,17 +842,17 @@ export class BoLActor extends Actor {
let lastHP = await this.getFlag("world", hpID)
if (lastHP != this.system.resources.hp.value && game.user.isGM) { // Only GM sends this
await this.setFlag("world", hpID, this.system.resources.hp.value)
let prone = this.effects.find(ef => ef.label == "EFFECT.StatusProne")
let dead = this.effects.find(ef => ef.label == "EFFECT.StatusDead")
let prone = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusProne"))
let dead = this.effects.find(ef => ef.name == game.i18n.localize("EFFECT.StatusDead"))
if (this.system.resources.hp.value <= 0) {
if (!prone) {
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) {
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({
@ -812,7 +879,7 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
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() {
@ -836,7 +903,7 @@ export class BoLActor extends Actor {
}
/*-------------------------------------------- */
async applyRecuperation(recupHP) {
let hp = duplicate(this.system.resources.hp)
let hp = foundry.utils.duplicate(this.system.resources.hp)
//console.log("RECUP !!!!", hp, recupHP)
hp.value += Number(recupHP)
hp.value = Math.min(hp.value, hp.max)
@ -864,10 +931,7 @@ export class BoLActor extends Actor {
checkNumeric(myObject) {
if (myObject) {
for (let key in myObject) {
if (myObject[key].value === null) {
myObject[key].value = 0
}
if (myObject[key].value === NaN) {
if (myObject[key].value === null || isNaN(myObject[key].value)) {
myObject[key].value = 0
}
}
@ -885,11 +949,39 @@ export class BoLActor extends Actor {
if (data.system?.resources) {
this.checkNumeric(data.system.resources)
}
// Apply changes in Horde size to Token width/height
if (this.type == "horde") {
if (data?.system?.hordesize) { // If horde size is changed}
let newHP = data.system.hordesize * this.system.hordebasehp
if (newHP != this.system.resources.hp.value) {
data.system.resources = { hp: { value: newHP, max: newHP } } // Update HP
}
let tokenSize = this.getTokenSizeFromHordeSize(data?.system?.hordesize)
if (this.isToken && (tokenSize !== this.token.width)) {
this.token.update({ width: tokenSize, height: tokenSize })
} else {
if (tokenSize && (tokenSize !== this.prototypeToken.width)) {
if (!foundry.utils.hasProperty(data, "prototypeToken.width")) {
data.prototypeToken ||= {};
data.prototypeToken.height = tokenSize;
data.prototypeToken.width = tokenSize;
}
}
}
}
if (data?.system?.hordebasehp) {
let newHP = this.system.hordesize * data.system.hordebasehp
if (newHP != this.system.resources.hp.value) {
data.system.resources = { hp: { value: newHP, max: newHP } }
}
}
}
super._preUpdate(data, options, userId)
}
/*-------------------------------------------- */
getInitiativeRank(rollData = undefined, isCombat = false, combatData) {
getInitiativeRank(rollData = undefined, isCombat = false, combatData = undefined) {
let fvttInit = 4 // Pietaille par defaut
if (this.type == 'character') {
fvttInit = 5
@ -955,8 +1047,15 @@ export class BoLActor extends Actor {
}
/*-------------------------------------------- */
async sufferDamage(damage) {
let updates = {}
let newHP = this.system.resources.hp.value - damage
await this.update({ 'system.resources.hp.value': newHP })
updates['system.resources.hp.value'] = newHP
if (this.type == "horde") {
let newSize = Math.ceil(newHP / this.system.hordebasehp)
updates['system.hordesize'] = newSize
}
await this.update(updates)
}
/* -------------------------------------------- */
@ -987,20 +1086,21 @@ export class BoLActor extends Actor {
}
/* -------------------------------------------- */
rollProtection(itemId) {
let armor = duplicate(this.items.get(itemId))
async rollProtection(itemId) {
let armor = foundry.utils.duplicate(this.items.get(itemId))
if (armor) {
let armorFormula = "max(" + armor.system.properties.soak.formula + ", 0)"
let rollArmor = new Roll(armorFormula)
rollArmor.roll({ async: false }).toMessage()
await rollArmor.roll()
rollArmor.toMessage()
}
}
/* -------------------------------------------- */
rollWeaponDamage(itemId) {
let weapon = duplicate(this.items.get(itemId))
let weapon = foundry.utils.duplicate(this.items.get(itemId))
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.rollDamage()
}
@ -1010,7 +1110,7 @@ export class BoLActor extends Actor {
toggleEquipItem(item) {
const equipable = item.system.properties.equipable;
if (equipable) {
let itemData = duplicate(item);
let itemData = foundry.utils.duplicate(item);
itemData.system.worn = !itemData.system.worn;
return item.update(itemData);
}

217
module/actor/horde-sheet.js Normal file
View File

@ -0,0 +1,217 @@
/**
* Extend the basic ActorSheet with some very simple modifications
* @extends {ActorSheet}
*/
import { BoLRoll } from "../controllers/bol-rolls.js";
import { BoLUtility } from "../system/bol-utility.js";
export class BoLHordeSheet extends ActorSheet {
/** @override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["bol", "sheet", "actor"],
template: "systems/bol/templates/actor/horde-sheet.hbs",
width: 860,
height: 600,
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }]
});
}
/* -------------------------------------------- */
/** @override */
activateListeners(html) {
super.activateListeners(html);
function onLoad() {
let logoSheet = BoLUtility.getLogoActorSheet()
$(".bol-actor-form").css("backgroundImage",`url(${logoSheet})`)
}
// Setup everything onload
$(function () { onLoad(); });
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) return;
// Add Inventory Item
html.find('.item-create').click(this._onItemCreate.bind(this));
// Update Inventory Item
html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.items.get(li.data("itemId"));
item.sheet.render(true);
})
// Equip/Unequip item
html.find('.item-equip').click(this._onToggleEquip.bind(this));
html.find('.create_item').click(ev => {
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvel Equipement", type: "item" }], { renderSheet: true });
});
// Incr./Decr. career ranks
html.find(".inc-dec-btns").click((ev) => {
const li = $(ev.currentTarget).parents(".item");
if (li) {
const item = this.actor.items.get(li.data("itemId"));
if (item) {
const dataset = ev.currentTarget.dataset;
const operator = dataset.operator;
const target = dataset.target;
const incr = parseInt(dataset.incr)
const min = parseInt(dataset.min)
const max = parseInt(dataset.max) || 10000
let value = eval("item." + target)
value = value || 0
//console.log("IncDec", item, target, value, operator, min, max)
if (operator === "minus") {
if (value >= min + incr) value -= incr;
else value = min;
}
if (operator === "plus") {
if (value <= max - incr) value += incr;
else value = max;
}
let update = { [`${target}`]: value };
item.update(update);
}
}
});
// Delete Inventory Item
html.find('.item-delete').click(ev => {
Dialog.confirm({
title: "Suppression",
content: `Vous êtes sûr de vouloir supprimer cet item ?`,
yes: () => {
const li = $(ev.currentTarget).parents(".item");
this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")])
li.slideUp(200, () => this.render(false));
},
no: () => { },
defaultYes: false,
});
});
// Rollable abilities.
html.find('.rollable').click(this._onRoll.bind(this));
}
/* -------------------------------------------- */
/** @override */
async getData(options) {
const data = super.getData(options)
let formData = foundry.utils.duplicate(data)
formData.config = game.bol.config
formData.name = this.actor.name
formData.img = this.actor.img
formData.system = foundry.utils.duplicate(this.actor.system)
formData.isGM = game.user.isGM
formData.options = this.options
formData.owner = this.document.isOwner
formData.editScore = this.options.editScore
formData.description = await TextEditor.enrichHTML(this.actor.system.description, {async: true})
formData.isGM = game.user.isGM
console.log("HORDE", formData)
return formData;
}
/* -------------------------------------------- */
/**
* Handle creating a new Owned Item for the actor using initial data defined in the HTML dataset
* @param {Event} event The originating click event
* @private
*/
_onItemCreate(event) {
event.preventDefault();
const header = event.currentTarget;
// Get the type of item to create.
const type = header.dataset.type;
// Grab any data associated with this control.
const data = foundry.utils.duplicate(header.dataset);
// Initialize a default name.
const name = `New ${type.capitalize()}`;
// Prepare the item object.
const itemData = {
name: name,
type: type,
data: data
};
// Remove the type from the dataset since it's in the itemData.type prop.
delete itemData.data["type"];
// Finally, create the item!
return this.actor.createEmbeddedDocuments("Item", [itemData]);
}
_onToggleEquip(event) {
event.preventDefault();
const li = $(event.currentTarget).closest(".item");
const item = this.actor.items.get(li.data("itemId"));
return this.actor.toggleEquipItem(item);
}
/**
* Handle clickable rolls.
* @param {Event} event The originating click event
* @private
*/
_onRoll(event) {
event.preventDefault();
const element = event.currentTarget
const dataset = element.dataset
const rollType = dataset.rollType
const li = $(event.currentTarget).closest(".item")
switch (rollType) {
case "attribute":
BoLRoll.attributeCheck(this.actor, dataset.key, event)
break;
case "aptitude":
BoLRoll.aptitudeCheck(this.actor, dataset.key, event)
break;
case "weapon":
BoLRoll.weaponCheck(this.actor, event)
break;
case "spell":
BoLRoll.spellCheck(this.actor, event)
break;
case "alchemy":
BoLRoll.alchemyCheck(this.actor, event)
break;
case "protection":
this.actor.rollProtection(li.data("item-id"))
break;
case "damage":
this.actor.rollWeaponDamage(li.data("item-id"))
break;
case "aptitudexp":
this.actor.incAptitudeXP(dataset.key)
break;
case "attributexp":
this.actor.incAttributeXP(dataset.key)
break;
case "careerxp":
this.actor.incCareerXP( li.data("item-id"))
break;
default: break;
}
}
/** @override */
setPosition(options = {}) {
const position = super.setPosition(options);
const sheetBody = this.element.find(".sheet-body");
const bodyHeight = position.height - 192;
sheetBody.css("height", bodyHeight);
return position;
}
}

View File

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

View File

@ -3,6 +3,7 @@
import { BoLActor } from "./actor/actor.js"
import { BoLActorSheet } from "./actor/actor-sheet.js"
import { BoLVehicleSheet } from "./actor/vehicle-sheet.js"
import { BoLHordeSheet } from "./actor/horde-sheet.js"
import { BoLItem } from "./item/item.js"
import { BoLItemSheet } from "./item/item-sheet.js"
import { System, BOL } from "./system/config.js"
@ -14,9 +15,8 @@ import { BoLUtility } from "./system/bol-utility.js"
import { BoLCombatManager } from "./system/bol-combat.js"
import { BoLTokenHud } from "./system/bol-action-hud.js"
import { BoLHotbar } from "./system/bol-hotbar.js"
import { BoLAdventureGenerator } from "./system/bol-adventure-generator.js"
import { BoLCommands} from "./system/bol-commands.js"
import { BoLCharacterSummary} from "./system/bol-character-summary.js"
import { BoLCommands } from "./system/bol-commands.js"
import { BoLRoll } from "./controllers/bol-rolls.js"
/* -------------------------------------------- */
Hooks.once('init', async function () {
@ -25,10 +25,12 @@ Hooks.once('init', async function () {
BoLActor,
BoLItem,
BoLHotbar,
BoLRoll,
BoLUtility,
macros: Macros,
config: BOL
};
// Game socket
game.socket.on("system.bol", sockmsg => {
BoLUtility.onSocketMessage(sockmsg);
@ -53,6 +55,7 @@ Hooks.once('init', async function () {
Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet("bol", BoLActorSheet, { types: ["character", "encounter"], makeDefault: true })
Actors.registerSheet("bol", BoLVehicleSheet, { types: ["vehicle"], makeDefault: true })
Actors.registerSheet("bol", BoLHordeSheet, { types: ["horde"], makeDefault: true })
Items.unregisterSheet("core", ItemSheet);
Items.registerSheet("bol", BoLItemSheet, { makeDefault: true });
@ -62,8 +65,7 @@ Hooks.once('init', async function () {
BoLTokenHud.init()
BoLHotbar.init()
BoLCommands.init()
BoLAdventureGenerator.init()
// Preload Handlebars Templates
await preloadHandlebarsTemplates();
@ -75,57 +77,52 @@ 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() {
ChatMessage.create({
user: game.user.id,
whisper: [game.user.id],
content: `<div id="welcome-message-pegasus"><span class="rdd-roll-part">
content: `<div id="welcome-message-bol"><span class="rdd-roll-part">
<strong>` + game.i18n.localize("BOL.chat.welcome1") + `</strong><p>` +
game.i18n.localize("BOL.chat.welcome2") + "<p>" +
game.i18n.localize("BOL.chat.welcome3") + "<p>" +
game.i18n.localize("BOL.chat.welcome4") + "</p>" +
game.i18n.localize("BOL.chat.welcome5") + "<br>" +
game.i18n.localize("BOL.chat.welcome6")
} )
game.i18n.localize("BOL.chat.welcome2") + "<p>" +
game.i18n.localize("BOL.chat.welcome3") + "<p>" +
game.i18n.localize("BOL.chat.welcome4") + "</p>" +
game.i18n.localize("BOL.chat.welcome5") + "<br>" +
game.i18n.localize("BOL.chat.welcome6")
})
}
/* -------------------------------------------- */
Hooks.once('ready', async function () {
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()
// 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) {
let appEffects = []
for (let effect of rollData.bolEffects) {
if (effect.system.properties.identifier == "always") {
appEffects.push(effect)
} else if (effect.system.properties.identifier.includes(rollData.attribute.key)) {
appEffects.push(effect)
} else if (rollData.aptitude && effect.system.properties.identifier.includes(rollData.aptitude.key)) {
if ( (effect.system.properties.identifier == "always") ||
(effect.system.properties.identifier.includes(rollData.attribute.key)) ||
(rollData.aptitude && effect.system.properties.identifier.includes(rollData.aptitude.key)) ){
appEffects.push(effect)
}
}
@ -62,10 +60,10 @@ export class BoLRoll {
armorInitMalus: actor.getArmorInitMalus(),
horoscopeBonusList: actor.getHoroscopesBonus(),
horoscopeMalusList: actor.getHoroscopesMalus(),
config: game.bol.config,
adv: "0",
mod: 0,
modRanged: 0,
aptValue: 0,
bolEffects: actor.boleffects,
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}`)
@ -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 attrKey = this.getDefaultAttribute(key)
@ -185,7 +183,7 @@ export class BoLRoll {
ui.notifications.warn("Unable to find weapon !")
return
}
weapon = duplicate(weapon)
weapon = foundry.utils.duplicate(weapon)
return this.weaponCheckWithWeapon(actor, weapon)
}
@ -197,7 +195,7 @@ export class BoLRoll {
ui.notifications.warn("Unable to find Alchemy !");
return;
}
alchemy = duplicate(alchemy)
alchemy = foundry.utils.duplicate(alchemy)
let alchemyData = alchemy.system
if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) {
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 !")
return
}
spell = duplicate(spell)
spell = foundry.utils.duplicate(spell)
return this.spellCheckWithSpell(actor, spell)
}
@ -404,7 +402,7 @@ export class BoLRoll {
html.find('#attr').change((event) => {
let attrKey = event.currentTarget.value
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.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
this.updateTotalDice()
@ -412,7 +410,7 @@ export class BoLRoll {
html.find('#apt').change((event) => {
let aptKey = event.currentTarget.value
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.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
this.updateTotalDice()
@ -455,7 +453,7 @@ export class BoLRoll {
html.find('#horoscope-bonus-applied').change((event) => {
this.rollData.selectedHoroscope = []
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()
this.rollData.horoscopeBonus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length
@ -465,7 +463,7 @@ export class BoLRoll {
html.find('#horoscope-malus-applied').change((event) => {
this.rollData.selectedHoroscope = []
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()
this.rollData.horoscopeMalus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length
@ -533,7 +531,7 @@ export class BoLRoll {
rollData.careerBonus = rollData.careerBonus ?? 0
rollData.modRanged = rollData.modRanged ?? 0
rollData.mod = rollData.mod ?? 0
rollData.id = randomID(16)
rollData.id = foundry.utils.randomID(16)
rollData.weaponModifier = 0
rollData.attackBonusDice = false
rollData.armorMalus = 0
@ -570,6 +568,7 @@ export class BoLRoll {
icon: '<i class="fas fa-check"></i>',
label: game.i18n.localize("BOL.ui.submit"),
callback: (html) => {
console.log("Submit Roll!!!!");
if (rollData.mode == 'spell' && rollData.ppCurrent < rollData.ppCost) { // Check PP available
ui.notifications.warn("Pas assez de Points de Pouvoir !")
return
@ -619,29 +618,40 @@ export class BoLDefaultRoll {
if (this.rollData.applyId) {
BoLUtility.cleanupButtons(this.rollData.applyId)
}
this.rollData.optionsId = randomID(16)
this.rollData.applyId = randomID(16)
this.rollData.optionsId = foundry.utils.randomID(16)
this.rollData.applyId = foundry.utils.randomID(16)
}
/* -------------------------------------------- */
async roll() {
const r = new Roll(this.rollData.formula)
//console.log("Roll formula", this.rollData.formula)
await r.roll({ "async": false })
await r.roll()
let diceData = BoLUtility.getDiceData()
//console.log("DICEDATA", diceData)
const activeDice = r.terms[0].results.filter(r => r.active)
const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b)
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.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)
if (this.rollData.reroll == undefined) {
@ -652,7 +662,7 @@ export class BoLDefaultRoll {
this.rollData.initiativeRank = actor.getInitiativeRank(this.rollData)
if (this.rollData.combatData) { // If combatData present
let combat = game.combats.get(this.rollData.combatData.combatId)
console.log("SET INIT!!!!!", this.rollData.initiativeRank)
//console.log("SET INIT!!!!!", this.rollData.initiativeRank)
combat.setInitiative(this.rollData.combatData.combatantId, this.rollData.initiativeRank)
}
}
@ -691,7 +701,7 @@ export class BoLDefaultRoll {
flavor: msgFlavor,
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)
})
}
@ -744,7 +754,7 @@ export class BoLDefaultRoll {
speaker: ChatMessage.getSpeaker({ actor: actor }),
flags: { msgType: "default" }
})
this.rollData.damageRoll = duplicate(this.rollData.damageRoll)
this.rollData.damageRoll = foundry.utils.duplicate(this.rollData.damageRoll)
this.rollData.actor = undefined // Cleanup
msg.setFlag("world", "bol-roll-data", this.rollData)
})
@ -768,8 +778,12 @@ export class BoLDefaultRoll {
if (this.rollData.damageMode == 'damage-plus-6') {
bonusDmg = 6
}
if (this.rollData.damageMode == 'damage-plus-12') {
if (this.rollData.damageMode == 'damage-plus-12' || this.rollData.damageMode == 'damage-plus-12-legend') {
bonusDmg = 12
if (this.rollData.damageMode == 'damage-plus-12') { // In this case, the hero point is used (ie shortcut)
let actor = BoLUtility.getActorFromRollData(this.rollData)
actor.subHeroPoints(1)
}
}
let attrDamageValue = this.getDamageAttributeValue(this.rollData.weapon.system.properties.damageAttribute)
let weaponFormula = BoLUtility.getDamageFormula(this.rollData.weapon.system, this.rollData.fightOption)
@ -779,7 +793,7 @@ export class BoLDefaultRoll {
//console.log("Formula", weaponFormula, damageFormula, this.rollData.weapon.data.data.properties.damage)
this.rollData.damageFormula = 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
console.log("DAMAGE !!!", damageFormula, attrDamageValue, this.rollData)
}

View File

@ -8,7 +8,7 @@ export class BoLItemSheet extends ItemSheet {
/** @override */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["bol", "sheet", "item"],
template: "systems/bol/templates/item/item-sheet.hbs",
width: 650,
@ -21,14 +21,16 @@ export class BoLItemSheet extends ItemSheet {
/** @override */
async 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.item = itemData
data.category = itemData.system.category
data.isGM = game.user.isGM;
data.itemProperties = this.item.itemProperties;
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
if (itemData.type == "item") {
if (!itemData.system.category) {
@ -76,7 +78,7 @@ export class BoLItemSheet extends ItemSheet {
/* -------------------------------------------- */
postItem() {
let chatData = duplicate(this.item)
let chatData = foundry.utils.duplicate(this.item)
if (this.actor) {
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]
const actionItem = actor.items.get(action._id)
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") {
let chatData = duplicate(actionItem)
let chatData = foundry.utils.duplicate(actionItem)
if (actionItem.actor) {
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() {
super();
// 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) {
this.calendrierPos = BoLCalendar.createCalendarPos()
game.settings.set("bol", "calendar-pos", this.calendarPos)
}
// 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.month = 0
@ -58,7 +58,7 @@ export class BoLCalendar extends Application {
/* -------------------------------------------- */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
return foundry.utils.mergeObject(super.defaultOptions, {
template: "systems/bol/templates/calendar-template.html",
popOut: false,
resizable: false
@ -95,11 +95,11 @@ export class BoLCalendar extends Application {
this.calendar.hour -= 24
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
game.socket.emit(SYSTEM_SOCKET_ID, {
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) {
this.calendrier = duplicate(calendrier); // Local copy update
this.calendrier = foundry.utils.duplicate(calendrier); // Local copy update
this.updateDisplay();
}
@ -123,7 +123,7 @@ export class BoLCalendar extends Application {
}
this.calendrier.heureRdD = indexHeure;
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.moisRdD = RdDCalendrier.getChiffreFromSigne(calendrierData.moisKey);
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();
game.socket.emit(SYSTEM_SOCKET_ID, {
msg: "msg_sync_time",
data: duplicate(this.calendrier)
data: foundry.utils.duplicate(this.calendrier)
});
this.updateDisplay();
@ -326,7 +326,7 @@ export class BoLCalendar extends Application {
/* -------------------------------------------- */
async showCalendarEditor() {
let calendrierData = duplicate(this.fillCalendrierData());
let calendrierData = foundry.utils.duplicate(this.fillCalendrierData());
if (this.editeur == undefined) {
calendrierData.jourMoisOptions = RdDCalendrier.buildJoursMois();
calendrierData.heuresOptions = [0, 1];
@ -344,7 +344,7 @@ export class BoLCalendar extends Application {
/* -------------------------------------------- */
async showAstrologieEditor() {
let calendrierData = duplicate(this.fillCalendrierData());
let calendrierData = foundry.utils.duplicate(this.fillCalendrierData());
let astrologieArray = [];
this.listeNombreAstral = this.listeNombreAstral || [];
for (let astralData of this.listeNombreAstral) {
@ -353,7 +353,7 @@ export class BoLCalendar extends Application {
let actor = game.actors.get(vf.actorId);
vf.actorName = (actor) ? actor.name : "Inconnu";
}
astrologieArray.push(duplicate(astralData));
astrologieArray.push(foundry.utils.duplicate(astralData));
}
let heuresParActeur = {};
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.left = xPos;
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.left = 200;
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);
}

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

@ -21,12 +21,12 @@ export class BoLCombatManager extends Combat {
// Structure input data
ids = typeof ids === "string" ? [ids] : ids;
// Get initiative malus from tough/adversary
let malusInit = 0
let malusInit = 0
for (let combatant of this.combatants) {
malusInit = Math.max(malusInit, combatant.actor.getInitiativeMalus())
}
// calculate initiative
for (let cId = 0; cId < ids.length; cId++) {
for (let cId = 0; cId < ids.length; cId++) {
const combatant = this.combatants.get(ids[cId])
let fvttInit = combatant.actor.getInitiativeRank(false, true, { combatId: this.id, combatantId: combatant.id, malusInit })
fvttInit += (cId / 100)
@ -39,17 +39,25 @@ export class BoLCombatManager extends Combat {
if (game.user.isGM) {
let combatants = this.combatants.contents
let autoRemoveDead = game.settings.get("bol", "auto-remove-dead") // Optionnal auto-removal of dead char.
let updates = []
for (let c of combatants) {
//let actor = game.actors.get(c.actorId)
if (c.actor.type == "horde") {
let actor = game.actors.get(c.actorId)
updates.push({ _id: c.id, name: actor.name + " (" + actor.system.hordesize + ")" })
}
c.actor.clearRoundModifiers()
let toRemove = []
if (autoRemoveDead && c.actor.type == "encounter" && (c.actor.system.chartype == "tough" || c.actor.system.chartype == "creature" || c.actor.system.chartype == "base") && c.actor.system.resources.hp.value <= 0) {
if (autoRemoveDead && c.actor.type == "encounter" &&
(c.actor.system.chartype == "tough" || c.actor.system.chartype == "creature" || c.actor.system.chartype == "base") && c.actor.system.resources.hp.value <= 0) {
toRemove.push(c.id || c._id)
}
//console.log("REM", autoRemoveDead, toRemove, c.actor)
if (toRemove.length > 0) {
this.deleteEmbeddedDocuments('Combatant', toRemove)
}
if (updates.length > 0) {
this.updateEmbeddedDocuments('Combatant', updates)
}
}
}
super.nextRound()
@ -58,11 +66,19 @@ export class BoLCombatManager extends Combat {
/************************************************************************************/
startCombat() {
if (game.user.isGM) {
let updates = []
let combatants = this.combatants.contents
for (let c of combatants) {
let actor = game.actors.get(c.actorId)
actor.storeVitaliteCombat()
if (c.actor.type == "horde") {
let actor = game.actors.get(c.actorId)
updates.push({ _id: c.id, name: actor.name + " (" + actor.system.hordesize + ")" })
}
}
if (updates.length > 0) {
this.updateEmbeddedDocuments('Combatant', updates)
}
}
return super.startCombat()
}

View File

@ -1,6 +1,3 @@
/* -------------------------------------------- */
import { BoLAdventureGenerator } from "./bol-adventure-generator.js"
import { BoLCharacterSummary } from "./bol-character-summary.js"
/* -------------------------------------------- */
export class BoLCommands {
@ -8,8 +5,6 @@ export class BoLCommands {
static init() {
if (!game.bol.commands) {
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
}
@ -88,7 +83,7 @@ export class BoLCommands {
console.log("===> Processing command")
let command = commandsTable[name];
path = path + name + " ";
if (command && command.subTable) {
if (command?.subTable) {
if (params[0]) {
return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path)
}
@ -97,9 +92,9 @@ export class BoLCommands {
return true;
}
}
if (command && command.func) {
if (command?.func) {
const result = command.func(content, msg, params);
if (result == false) {
if (!result) {
BoLCommands._chatAnswer(msg, command.descr);
}
return true;

View File

@ -136,6 +136,10 @@ export class BoLUtility {
this.successValue = Number(game.settings.get("bol", "dice-success-value"))
this.criticalSuccessValue = Number(game.settings.get("bol", "dice-critical-success-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").css("content", `url(${this.getLogoTopLeft()})`)
CONFIG.statusEffects = duplicate(game.bol.config.statusEffects)
CONFIG.statusEffects = foundry.utils.duplicate(game.bol.config.statusEffects)
}
/* -------------------------------------------- */
@ -234,7 +238,7 @@ export class BoLUtility {
renderTemplate('systems/bol/templates/item/post-item.hbs', chatData).then(html => {
let chatOptions = BoLUtility.chatDataSetup(html);
ChatMessage.create(chatOptions, "selfroll")
ChatMessage.create(chatOptions)
});
}
/* -------------------------------------------- */
@ -311,7 +315,7 @@ export class BoLUtility {
/* -------------------------------------------- */
static blindMessageToGM(chatOptions) {
let chatGM = duplicate(chatOptions);
let chatGM = foundry.utils.duplicate(chatOptions);
chatGM.whisper = this.getUsers(user => user.isGM);
chatGM.content = "Blind message of " + game.user.name + "<br>" + chatOptions.content;
console.log("blindMessageToGM", chatGM);
@ -323,7 +327,7 @@ export class BoLUtility {
if (rollData.targetId) {
// Broadcast to GM or process it directly in case of GM defense
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 {
BoLUtility.processAttackSuccess(rollData)
}
@ -337,7 +341,7 @@ export class BoLUtility {
// If the user is the message author or the actor owner, proceed
const actor = game.actors.get(data.message.speaker.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
const divButtons = chatCard.find('.actions-section')
@ -354,7 +358,7 @@ export class BoLUtility {
/* -------------------------------------------- */
static requestInitRoll(actorId, combatData) {
let actor = game.actors.get(actorId)
if (actor && actor.isOwner) {
if (actor?.isOwner) {
ui.notifications.info(game.i18n.localize("BOL.ui.warninitiative"))
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) {
return
}
@ -457,7 +461,7 @@ export class BoLUtility {
console.log("Damage Handling", attackId, defenseMode, weaponId)
// Only GM process this
if (rollData && rollData.defenderId) {
if (rollData?.defenderId) {
if (rollData.defenseDone || defenseMode == 'damage-not-applied') {
return
} // ?? Why ???
@ -469,11 +473,15 @@ export class BoLUtility {
if (defenseMode == 'damage-with-armor') {
let armorFormula = defender.getArmorFormula()
rollData.rollArmor = new Roll(armorFormula)
rollData.rollArmor.roll({ async: false })
await rollData.rollArmor.roll()
let msg = await rollData.rollArmor.toMessage({ flavor: "BOL.chat.armorRoll : " + armorFormula });
if ( game.dice3d) { // wait animation end when DsN is there
await game.dice3d.waitFor3DAnimationByMessageID(msg.id);
}
rollData.armorProtect = (rollData.rollArmor.total < 0) ? 0 : rollData.rollArmor.total
rollData.finalDamage = rollData.damageTotal - rollData.armorProtect
rollData.finalDamage = (rollData.finalDamage < 0) ? 0 : rollData.finalDamage
defender.sufferDamage(rollData.finalDamage)
await defender.sufferDamage(rollData.finalDamage)
console.log("Armor roll -> result ", rollData)
}
if (defenseMode == 'damage-without-armor') {
@ -483,19 +491,19 @@ export class BoLUtility {
if (defenseMode == 'hero-reduce-damage') {
let armorFormula = defender.getArmorFormula()
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.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.finalDamage < 0) ? 0 : rollData.finalDamage
defender.sufferDamage(rollData.finalDamage)
await defender.sufferDamage(rollData.finalDamage)
defender.subHeroPoints(1)
}
if (defenseMode == 'hero-in-extremis') {
rollData.finalDamage = 0;
rollData.weaponHero = defender.weapons.find(item => item._id == weaponId);
defender.deleteEmbeddedDocuments("Item", [weaponId]);
await defender.deleteEmbeddedDocuments("Item", [weaponId]);
}
let defenderUser
@ -668,7 +676,6 @@ export class BoLUtility {
let res = myReg.exec(damageString)
let nbDice = parseInt(res[1])
let postForm = 'kh' + nbDice
let modIndex = 3
// Upgrade damage if needed
if (upgradeDamage && (!res[3] || res[3] == "")) {
res[3] = "B" // Upgrade to bonus
@ -680,22 +687,18 @@ export class BoLUtility {
if (res[3] == 'M') {
postForm = 'kl' + nbDice
nbDice++
modIndex = 4
}
if (res[3] == 'MM') {
postForm = 'kl' + nbDice
nbDice += 2
modIndex = 4
}
if (res[3] == 'B') {
postForm = 'kh' + nbDice
nbDice++
modIndex = 4
}
if (res[3] == 'BB') {
postForm = 'kh' + nbDice
nbDice += 2
modIndex = 4
}
}
formula = "(" + nbDice + "d" + res[2] + reroll + postForm + "+" + modifier + ") *" + multiplier
@ -742,8 +745,8 @@ export class BoLUtility {
/* -------------------------------------------- */
static removeGroupHoroscope(rollData) {
let horo = rollData.horoscopeGroupList[rollData.selectedGroupHoroscopeIndex]
let horoscopes = duplicate(game.settings.get("bol", "horoscope-group"))
let toChange = duplicate(horoscopes[horo.id])
let horoscopes = foundry.utils.duplicate(game.settings.get("bol", "horoscope-group"))
let toChange = foundry.utils.duplicate(horoscopes[horo.id])
toChange.availableDice -= horo.nbDice // Remove the dice
if (toChange.availableDice <= 0) {
horoscopes[horo.id] = undefined

View File

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

View File

@ -10,7 +10,7 @@ export const registerHandlebarsHelpers = function () {
Handlebars.registerHelper('isEmpty', function (list) {
if (list) return list.length == 0;
else return 0;
else return false;
});
Handlebars.registerHelper('notEmpty', function (list) {
@ -64,8 +64,8 @@ export const registerHandlebarsHelpers = function () {
})
Handlebars.registerHelper('for', function (from, to, incr, block) {
var accum = '';
for (var i = from; i < to; i += incr)
let accum = '';
for (let i = from; i < to; i += incr)
accum += block.fn(i);
return accum;
})
@ -79,7 +79,7 @@ export const registerHandlebarsHelpers = function () {
Handlebars.registerHelper('countKeys', function (obj) {
return Object.keys(obj).length;
})
Handlebars.registerHelper('isEnabled', function (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:
Handlebars.registerHelper('concat', function () {
var outStr = '';
for (var arg in arguments) {
let outStr = '';
for (let arg in arguments) {
if (typeof arguments[arg] != 'object') {
outStr += arguments[arg];
}
@ -108,16 +108,15 @@ export const registerHandlebarsHelpers = function () {
return parseInt(a) - parseInt(b);
})
Handlebars.registerHelper('abbrev2', function (a) {
return a.substring(0,2);
return a.substring(0, 2);
})
Handlebars.registerHelper('abbrev3', function (a) {
return a.substring(0,3);
return a.substring(0, 3);
})
Handlebars.registerHelper('valueAtIndex', function (arr, idx) {
return arr[idx];
})
Handlebars.registerHelper('includesKey', function (items, type, key) {
// console.log(items);
return items.filter(i => i.type === type).map(i => i.system.key).includes(key);
})
Handlebars.registerHelper('includes', function (array, val) {
@ -128,10 +127,7 @@ export const registerHandlebarsHelpers = function () {
})
Handlebars.registerHelper('isOwnerOrGM', function (actor) {
console.log("Testing actor", actor.isOwner, game.userId)
if (actor.isOwner || game.isGM) {
return true
}
return false
return actor.isOwner || game.isGM;
})
Handlebars.registerHelper('upperFirst', function (text) {
if (typeof text !== 'string') return text
@ -141,6 +137,16 @@ export const registerHandlebarsHelpers = function () {
if (typeof text !== 'string') return text
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") {
let item = data.data;
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
else if (data.type == "Actor") {

View File

@ -22,6 +22,7 @@ export const preloadHandlebarsTemplates = async function () {
"systems/bol/templates/actor/parts/tabs/vehicle-stats.hbs",
"systems/bol/templates/actor/parts/tabs/vehicle-description.hbs",
"systems/bol/templates/actor/parts/tabs/vehicle-weapons.hbs",
"systems/bol/templates/actor/parts/tabs/horde-description.hbs",
// ITEMS
"systems/bol/templates/item/parts/item-header.hbs",
"systems/bol/templates/item/parts/properties/feature-properties.hbs",
@ -43,6 +44,7 @@ export const preloadHandlebarsTemplates = async function () {
"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/feature/horoscope-properties.hbs",
"systems/bol/templates/item/parts/properties/feature/xplog-properties.hbs",
// DIALOGS
"systems/bol/templates/chat/rolls/attack-damage-card.hbs",

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000107
MANIFEST-000407

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.430277 7f84f7fff6c0 Recovering log #105
2023/12/04-21:16:34.440834 7f84f7fff6c0 Delete type=3 #103
2023/12/04-21:16:34.440885 7f84f7fff6c0 Delete type=0 #105
2023/12/04-21:29:36.294789 7f84f5ffb6c0 Level-0 table #110: started
2023/12/04-21:29:36.294815 7f84f5ffb6c0 Level-0 table #110: 0 bytes OK
2023/12/04-21:29:36.301173 7f84f5ffb6c0 Delete type=0 #108
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)
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/12-22:38:53.970077 7f25eea006c0 Recovering log #405
2024/09/12-22:38:53.982296 7f25eea006c0 Delete type=3 #403
2024/09/12-22:38:53.982396 7f25eea006c0 Delete type=0 #405
2024/09/12-22:42:42.719126 7f25eda006c0 Level-0 table #410: started
2024/09/12-22:42:42.719171 7f25eda006c0 Level-0 table #410: 0 bytes OK
2024/09/12-22:42:42.725570 7f25eda006c0 Delete type=0 #408
2024/09/12-22:42:42.725738 7f25eda006c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
2024/09/12-22:42:42.725784 7f25eda006c0 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/10/28-18:46:58.144165 7f5610ff96c0 Recovering log #101
2023/10/28-18:46:58.154293 7f5610ff96c0 Delete type=3 #99
2023/10/28-18:46:58.154395 7f5610ff96c0 Delete type=0 #101
2023/10/28-18:47:32.356263 7f56037fe6c0 Level-0 table #106: started
2023/10/28-18:47:32.356293 7f56037fe6c0 Level-0 table #106: 0 bytes OK
2023/10/28-18:47:32.362824 7f56037fe6c0 Delete type=0 #104
2023/10/28-18:47:32.375967 7f56037fe6c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!Yl1RKQb0BjVUtilk.kNb9ZrMbgONi1mlE' @ 0 : 0; will stop at (end)
2023/10/28-18:47:32.376034 7f56037fe6c0 Manual compaction at level-1 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!Yl1RKQb0BjVUtilk.kNb9ZrMbgONi1mlE' @ 0 : 0; will stop at (end)
2024/09/12-09:45:32.427852 7f25eea006c0 Recovering log #401
2024/09/12-09:45:32.437849 7f25eea006c0 Delete type=3 #399
2024/09/12-09:45:32.437908 7f25eea006c0 Delete type=0 #401
2024/09/12-09:50:36.103159 7f25eda006c0 Level-0 table #406: started
2024/09/12-09:50:36.103188 7f25eda006c0 Level-0 table #406: 0 bytes OK
2024/09/12-09:50:36.110495 7f25eda006c0 Delete type=0 #404
2024/09/12-09:50:36.110872 7f25eda006c0 Manual compaction at level-0 from '!journal!3xJg1rCxnWvEmoxS' @ 72057594037927935 : 1 .. '!journal.pages!veAAxCtCKcFIsnln.0kUgZspxXO7VS8bd' @ 0 : 0; will stop at (end)
2024/09/12-09:50:36.110976 7f25eda006c0 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-000014
MANIFEST-000313

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.402100 7f84f6ffd6c0 Recovering log #12
2023/12/04-21:16:34.413052 7f84f6ffd6c0 Delete type=3 #10
2023/12/04-21:16:34.413101 7f84f6ffd6c0 Delete type=0 #12
2023/12/04-21:29:36.274254 7f84f5ffb6c0 Level-0 table #17: started
2023/12/04-21:29:36.274306 7f84f5ffb6c0 Level-0 table #17: 0 bytes OK
2023/12/04-21:29:36.281091 7f84f5ffb6c0 Delete type=0 #15
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)
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/12-22:38:53.934728 7f25f4c006c0 Recovering log #311
2024/09/12-22:38:53.947433 7f25f4c006c0 Delete type=3 #309
2024/09/12-22:38:53.947544 7f25f4c006c0 Delete type=0 #311
2024/09/12-22:42:42.699365 7f25eda006c0 Level-0 table #316: started
2024/09/12-22:42:42.699403 7f25eda006c0 Level-0 table #316: 0 bytes OK
2024/09/12-22:42:42.705522 7f25eda006c0 Delete type=0 #314
2024/09/12-22:42:42.725703 7f25eda006c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
2024/09/12-22:42:42.725745 7f25eda006c0 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/10/28-18:46:58.118619 7f5603fff6c0 Recovering log #8
2023/10/28-18:46:58.129553 7f5603fff6c0 Delete type=3 #6
2023/10/28-18:46:58.129618 7f5603fff6c0 Delete type=0 #8
2023/10/28-18:47:32.323904 7f56037fe6c0 Level-0 table #13: started
2023/10/28-18:47:32.323933 7f56037fe6c0 Level-0 table #13: 0 bytes OK
2023/10/28-18:47:32.329984 7f56037fe6c0 Delete type=0 #11
2023/10/28-18:47:32.349515 7f56037fe6c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
2023/10/28-18:47:32.349581 7f56037fe6c0 Manual compaction at level-1 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
2024/09/12-09:45:32.401300 7f25efe006c0 Recovering log #307
2024/09/12-09:45:32.411529 7f25efe006c0 Delete type=3 #305
2024/09/12-09:45:32.411608 7f25efe006c0 Delete type=0 #307
2024/09/12-09:50:36.082865 7f25eda006c0 Level-0 table #312: started
2024/09/12-09:50:36.082893 7f25eda006c0 Level-0 table #312: 0 bytes OK
2024/09/12-09:50:36.090233 7f25eda006c0 Delete type=0 #310
2024/09/12-09:50:36.110780 7f25eda006c0 Manual compaction at level-0 from '!items!G3dZTHIabA3LA1hY' @ 72057594037927935 : 1 .. '!items!xhEcsi3WHjbt2ro9' @ 0 : 0; will stop at (end)
2024/09/12-09:50:36.110897 7f25eda006c0 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-000106
MANIFEST-000407

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.244782 7f84f6ffd6c0 Recovering log #104
2023/12/04-21:16:34.255803 7f84f6ffd6c0 Delete type=3 #102
2023/12/04-21:16:34.255859 7f84f6ffd6c0 Delete type=0 #104
2023/12/04-21:29:36.227120 7f84f5ffb6c0 Level-0 table #109: started
2023/12/04-21:29:36.227155 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK
2023/12/04-21:29:36.233490 7f84f5ffb6c0 Delete type=0 #107
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)
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/12-22:38:53.788249 7f25f4c006c0 Recovering log #405
2024/09/12-22:38:53.800311 7f25f4c006c0 Delete type=3 #403
2024/09/12-22:38:53.800582 7f25f4c006c0 Delete type=0 #405
2024/09/12-22:42:42.640434 7f25eda006c0 Level-0 table #410: started
2024/09/12-22:42:42.640516 7f25eda006c0 Level-0 table #410: 0 bytes OK
2024/09/12-22:42:42.647688 7f25eda006c0 Delete type=0 #408
2024/09/12-22:42:42.668731 7f25eda006c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
2024/09/12-22:42:42.668779 7f25eda006c0 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/10/28-18:46:58.021346 7f5603fff6c0 Recovering log #100
2023/10/28-18:46:58.032316 7f5603fff6c0 Delete type=3 #98
2023/10/28-18:46:58.032370 7f5603fff6c0 Delete type=0 #100
2023/10/28-18:47:32.275625 7f56037fe6c0 Level-0 table #105: started
2023/10/28-18:47:32.275699 7f56037fe6c0 Level-0 table #105: 0 bytes OK
2023/10/28-18:47:32.281755 7f56037fe6c0 Delete type=0 #103
2023/10/28-18:47:32.288117 7f56037fe6c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
2023/10/28-18:47:32.298397 7f56037fe6c0 Manual compaction at level-1 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
2024/09/12-09:45:32.295259 7f25efe006c0 Recovering log #401
2024/09/12-09:45:32.306146 7f25efe006c0 Delete type=3 #399
2024/09/12-09:45:32.306221 7f25efe006c0 Delete type=0 #401
2024/09/12-09:50:36.045097 7f25eda006c0 Level-0 table #406: started
2024/09/12-09:50:36.045124 7f25eda006c0 Level-0 table #406: 0 bytes OK
2024/09/12-09:50:36.051371 7f25eda006c0 Delete type=0 #404
2024/09/12-09:50:36.057645 7f25eda006c0 Manual compaction at level-0 from '!items!039ZF3E3MtAGwbiX' @ 72057594037927935 : 1 .. '!items!zgspy1QKaxdEetEw' @ 0 : 0; will stop at (end)
2024/09/12-09:50:36.057725 7f25eda006c0 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-000407 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000106
MANIFEST-000407

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.258787 7f84f77fe6c0 Recovering log #104
2023/12/04-21:16:34.268652 7f84f77fe6c0 Delete type=3 #102
2023/12/04-21:16:34.268705 7f84f77fe6c0 Delete type=0 #104
2023/12/04-21:29:36.233597 7f84f5ffb6c0 Level-0 table #109: started
2023/12/04-21:29:36.233621 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK
2023/12/04-21:29:36.239701 7f84f5ffb6c0 Delete type=0 #107
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)
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/12-22:38:53.805528 7f25ef4006c0 Recovering log #405
2024/09/12-22:38:53.816302 7f25ef4006c0 Delete type=3 #403
2024/09/12-22:38:53.816406 7f25ef4006c0 Delete type=0 #405
2024/09/12-22:42:42.654478 7f25eda006c0 Level-0 table #410: started
2024/09/12-22:42:42.654519 7f25eda006c0 Level-0 table #410: 0 bytes OK
2024/09/12-22:42:42.660807 7f25eda006c0 Delete type=0 #408
2024/09/12-22:42:42.668759 7f25eda006c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
2024/09/12-22:42:42.668796 7f25eda006c0 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/10/28-18:46:58.033991 7f5611ffb6c0 Recovering log #100
2023/10/28-18:46:58.043491 7f5611ffb6c0 Delete type=3 #98
2023/10/28-18:46:58.043553 7f5611ffb6c0 Delete type=0 #100
2023/10/28-18:47:32.281934 7f56037fe6c0 Level-0 table #105: started
2023/10/28-18:47:32.281973 7f56037fe6c0 Level-0 table #105: 0 bytes OK
2023/10/28-18:47:32.287993 7f56037fe6c0 Delete type=0 #103
2023/10/28-18:47:32.298372 7f56037fe6c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
2023/10/28-18:47:32.298448 7f56037fe6c0 Manual compaction at level-1 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
2024/09/12-09:45:32.310129 7f25f4c006c0 Recovering log #401
2024/09/12-09:45:32.320731 7f25f4c006c0 Delete type=3 #399
2024/09/12-09:45:32.320830 7f25f4c006c0 Delete type=0 #401
2024/09/12-09:50:36.033550 7f25eda006c0 Level-0 table #406: started
2024/09/12-09:50:36.033588 7f25eda006c0 Level-0 table #406: 0 bytes OK
2024/09/12-09:50:36.039266 7f25eda006c0 Delete type=0 #404
2024/09/12-09:50:36.057599 7f25eda006c0 Manual compaction at level-0 from '!items!CoqlfsDV1gL5swbK' @ 72057594037927935 : 1 .. '!items!yofwG0YrsL902G77' @ 0 : 0; will stop at (end)
2024/09/12-09:50:36.057695 7f25eda006c0 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-000106
MANIFEST-000407

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.285844 7f84f67fc6c0 Recovering log #104
2023/12/04-21:16:34.295915 7f84f67fc6c0 Delete type=3 #102
2023/12/04-21:16:34.295974 7f84f67fc6c0 Delete type=0 #104
2023/12/04-21:29:36.267733 7f84f5ffb6c0 Level-0 table #109: started
2023/12/04-21:29:36.267761 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK
2023/12/04-21:29:36.273875 7f84f5ffb6c0 Delete type=0 #107
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)
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/12-22:38:53.840310 7f25efe006c0 Recovering log #405
2024/09/12-22:38:53.852677 7f25efe006c0 Delete type=3 #403
2024/09/12-22:38:53.852769 7f25efe006c0 Delete type=0 #405
2024/09/12-22:42:42.660981 7f25eda006c0 Level-0 table #410: started
2024/09/12-22:42:42.661021 7f25eda006c0 Level-0 table #410: 0 bytes OK
2024/09/12-22:42:42.668582 7f25eda006c0 Delete type=0 #408
2024/09/12-22:42:42.668771 7f25eda006c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
2024/09/12-22:42:42.668804 7f25eda006c0 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/10/28-18:46:58.057967 7f56117fa6c0 Recovering log #100
2023/10/28-18:46:58.068576 7f56117fa6c0 Delete type=3 #98
2023/10/28-18:46:58.068630 7f56117fa6c0 Delete type=0 #100
2023/10/28-18:47:32.298557 7f56037fe6c0 Level-0 table #105: started
2023/10/28-18:47:32.298612 7f56037fe6c0 Level-0 table #105: 0 bytes OK
2023/10/28-18:47:32.304559 7f56037fe6c0 Delete type=0 #103
2023/10/28-18:47:32.323741 7f56037fe6c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
2023/10/28-18:47:32.323783 7f56037fe6c0 Manual compaction at level-1 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
2024/09/12-09:45:32.336593 7f25ef4006c0 Recovering log #401
2024/09/12-09:45:32.347205 7f25ef4006c0 Delete type=3 #399
2024/09/12-09:45:32.347263 7f25ef4006c0 Delete type=0 #401
2024/09/12-09:50:36.039384 7f25eda006c0 Level-0 table #406: started
2024/09/12-09:50:36.039412 7f25eda006c0 Level-0 table #406: 0 bytes OK
2024/09/12-09:50:36.044990 7f25eda006c0 Delete type=0 #404
2024/09/12-09:50:36.057626 7f25eda006c0 Manual compaction at level-0 from '!items!4S4xAfMXGnuU0O1a' @ 72057594037927935 : 1 .. '!items!zxY3sW0iCJBvwjOS' @ 0 : 0; will stop at (end)
2024/09/12-09:50:36.057710 7f25eda006c0 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-000106
MANIFEST-000283

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.444268 7f84f67fc6c0 Recovering log #104
2023/12/04-21:16:34.454337 7f84f67fc6c0 Delete type=3 #102
2023/12/04-21:16:34.454390 7f84f67fc6c0 Delete type=0 #104
2023/12/04-21:29:36.307716 7f84f5ffb6c0 Level-0 table #109: started
2023/12/04-21:29:36.307782 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK
2023/12/04-21:29:36.314556 7f84f5ffb6c0 Delete type=0 #107
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)
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:33.833224 7fb8320006c0 Recovering log #281
2024/07/08-22:24:33.895807 7fb8320006c0 Delete type=3 #279
2024/07/08-22:24:33.895934 7fb8320006c0 Delete type=0 #281
2024/07/08-22:24:52.466387 7fb82be006c0 Level-0 table #286: started
2024/07/08-22:24:52.466440 7fb82be006c0 Level-0 table #286: 0 bytes OK
2024/07/08-22:24:52.472857 7fb82be006c0 Delete type=0 #284
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)
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/10/28-18:46:58.157567 7f56117fa6c0 Recovering log #100
2023/10/28-18:46:58.168362 7f56117fa6c0 Delete type=3 #98
2023/10/28-18:46:58.168445 7f56117fa6c0 Delete type=0 #100
2023/10/28-18:47:32.362933 7f56037fe6c0 Level-0 table #105: started
2023/10/28-18:47:32.362962 7f56037fe6c0 Level-0 table #105: 0 bytes OK
2023/10/28-18:47:32.369115 7f56037fe6c0 Delete type=0 #103
2023/10/28-18:47:32.375986 7f56037fe6c0 Manual compaction at level-0 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end)
2023/10/28-18:47:32.376049 7f56037fe6c0 Manual compaction at level-1 from '!scenes!1ZDXKpKixS12xzW3' @ 72057594037927935 : 1 .. '!scenes.tiles!78gEyXvSfBJi9iL1.rJglQmZXB0eRIL8y' @ 0 : 0; will stop at (end)
2024/07/08-22:22:58.298438 7fb832a006c0 Recovering log #277
2024/07/08-22:22:58.309146 7fb832a006c0 Delete type=3 #275
2024/07/08-22:22:58.309315 7fb832a006c0 Delete type=0 #277
2024/07/08-22:24:02.597516 7fb82be006c0 Level-0 table #282: started
2024/07/08-22:24:02.597563 7fb82be006c0 Level-0 table #282: 0 bytes OK
2024/07/08-22:24:02.685456 7fb82be006c0 Delete type=0 #280
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)
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-000106
MANIFEST-000208

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.555441 7f84f77fe6c0 Recovering log #104
2023/12/04-21:16:34.566877 7f84f77fe6c0 Delete type=3 #102
2023/12/04-21:16:34.566941 7f84f77fe6c0 Delete type=0 #104
2023/12/04-21:29:36.355366 7f84f5ffb6c0 Level-0 table #109: started
2023/12/04-21:29:36.355392 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK
2023/12/04-21:29:36.362705 7f84f5ffb6c0 Delete type=0 #107
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)
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/23-23:05:36.345111 7fe93a0006c0 Recovering log #206
2024/02/23-23:05:36.355350 7fe93a0006c0 Delete type=3 #204
2024/02/23-23:05:36.355397 7fe93a0006c0 Delete type=0 #206
2024/02/23-23:11:16.411887 7fe9336006c0 Level-0 table #211: started
2024/02/23-23:11:16.411923 7fe9336006c0 Level-0 table #211: 0 bytes OK
2024/02/23-23:11:16.418695 7fe9336006c0 Delete type=0 #209
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)
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/10/28-18:46:58.256101 7f5611ffb6c0 Recovering log #100
2023/10/28-18:46:58.266925 7f5611ffb6c0 Delete type=3 #98
2023/10/28-18:46:58.267031 7f5611ffb6c0 Delete type=0 #100
2023/10/28-18:47:32.403078 7f56037fe6c0 Level-0 table #105: started
2023/10/28-18:47:32.403107 7f56037fe6c0 Level-0 table #105: 0 bytes OK
2023/10/28-18:47:32.410392 7f56037fe6c0 Delete type=0 #103
2023/10/28-18:47:32.416800 7f56037fe6c0 Manual compaction at level-0 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end)
2023/10/28-18:47:32.416838 7f56037fe6c0 Manual compaction at level-1 from '!actors!1QGaindSWLCT4QXD' @ 72057594037927935 : 1 .. '!actors.items!yGlDTCiMiaH4vJTH.mvXGkWoCcRGjUpYV' @ 0 : 0; will stop at (end)
2024/02/22-16:41:06.582756 7fe93be006c0 Recovering log #201
2024/02/22-16:41:06.592273 7fe93be006c0 Delete type=3 #199
2024/02/22-16:41:06.592326 7fe93be006c0 Delete type=0 #201
2024/02/22-17:53:02.294923 7fe9336006c0 Level-0 table #207: started
2024/02/22-17:53:02.294959 7fe9336006c0 Level-0 table #207: 0 bytes OK
2024/02/22-17:53:02.313594 7fe9336006c0 Delete type=0 #205
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)
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-000106
MANIFEST-000405

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.543411 7f84f6ffd6c0 Recovering log #104
2023/12/04-21:16:34.553517 7f84f6ffd6c0 Delete type=3 #102
2023/12/04-21:16:34.553574 7f84f6ffd6c0 Delete type=0 #104
2023/12/04-21:29:36.348547 7f84f5ffb6c0 Level-0 table #109: started
2023/12/04-21:29:36.348582 7f84f5ffb6c0 Level-0 table #109: 0 bytes OK
2023/12/04-21:29:36.355093 7f84f5ffb6c0 Delete type=0 #107
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)
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/12-22:38:54.083170 7f25ef4006c0 Recovering log #403
2024/09/12-22:38:54.094709 7f25ef4006c0 Delete type=3 #401
2024/09/12-22:38:54.094800 7f25ef4006c0 Delete type=0 #403
2024/09/12-22:42:42.762852 7f25eda006c0 Level-0 table #408: started
2024/09/12-22:42:42.762884 7f25eda006c0 Level-0 table #408: 0 bytes OK
2024/09/12-22:42:42.770096 7f25eda006c0 Delete type=0 #406
2024/09/12-22:42:42.787677 7f25eda006c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
2024/09/12-22:42:42.787711 7f25eda006c0 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/10/28-18:46:58.244978 7f5603fff6c0 Recovering log #100
2023/10/28-18:46:58.254318 7f5603fff6c0 Delete type=3 #98
2023/10/28-18:46:58.254370 7f5603fff6c0 Delete type=0 #100
2023/10/28-18:47:32.410495 7f56037fe6c0 Level-0 table #105: started
2023/10/28-18:47:32.410517 7f56037fe6c0 Level-0 table #105: 0 bytes OK
2023/10/28-18:47:32.416657 7f56037fe6c0 Delete type=0 #103
2023/10/28-18:47:32.416814 7f56037fe6c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
2023/10/28-18:47:32.416846 7f56037fe6c0 Manual compaction at level-1 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
2024/09/12-09:45:32.520585 7f25f4c006c0 Recovering log #399
2024/09/12-09:45:32.540463 7f25f4c006c0 Delete type=3 #397
2024/09/12-09:45:32.540543 7f25f4c006c0 Delete type=0 #399
2024/09/12-09:50:36.138195 7f25eda006c0 Level-0 table #404: started
2024/09/12-09:50:36.138235 7f25eda006c0 Level-0 table #404: 0 bytes OK
2024/09/12-09:50:36.145251 7f25eda006c0 Delete type=0 #402
2024/09/12-09:50:36.168914 7f25eda006c0 Manual compaction at level-0 from '!items!6fTZ6hOKR4pWbWOe' @ 72057594037927935 : 1 .. '!items!zwSNMO9HpiqUCMt8' @ 0 : 0; will stop at (end)
2024/09/12-09:50:36.168987 7f25eda006c0 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-000108
MANIFEST-000408

View File

@ -1,8 +1,8 @@
2023/12/04-21:16:34.326886 7f84f7fff6c0 Recovering log #106
2023/12/04-21:16:34.337231 7f84f7fff6c0 Delete type=3 #104
2023/12/04-21:16:34.337341 7f84f7fff6c0 Delete type=0 #106
2023/12/04-21:29:36.247774 7f84f5ffb6c0 Level-0 table #111: started
2023/12/04-21:29:36.247806 7f84f5ffb6c0 Level-0 table #111: 0 bytes OK
2023/12/04-21:29:36.253805 7f84f5ffb6c0 Delete type=0 #109
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)
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/12-22:38:53.895694 7f25eea006c0 Recovering log #406
2024/09/12-22:38:53.908795 7f25eea006c0 Delete type=3 #404
2024/09/12-22:38:53.908936 7f25eea006c0 Delete type=0 #406
2024/09/12-22:42:42.683293 7f25eda006c0 Level-0 table #411: started
2024/09/12-22:42:42.683318 7f25eda006c0 Level-0 table #411: 0 bytes OK
2024/09/12-22:42:42.690892 7f25eda006c0 Delete type=0 #409
2024/09/12-22:42:42.699091 7f25eda006c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
2024/09/12-22:42:42.699149 7f25eda006c0 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/10/28-18:46:58.094686 7f5610ff96c0 Recovering log #102
2023/10/28-18:46:58.104878 7f5610ff96c0 Delete type=3 #100
2023/10/28-18:46:58.104944 7f5610ff96c0 Delete type=0 #102
2023/10/28-18:47:32.336166 7f56037fe6c0 Level-0 table #107: started
2023/10/28-18:47:32.336197 7f56037fe6c0 Level-0 table #107: 0 bytes OK
2023/10/28-18:47:32.342982 7f56037fe6c0 Delete type=0 #105
2023/10/28-18:47:32.349554 7f56037fe6c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
2023/10/28-18:47:32.349606 7f56037fe6c0 Manual compaction at level-1 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
2024/09/12-09:45:32.374751 7f25eea006c0 Recovering log #402
2024/09/12-09:45:32.385764 7f25eea006c0 Delete type=3 #400
2024/09/12-09:45:32.385832 7f25eea006c0 Delete type=0 #402
2024/09/12-09:50:36.070382 7f25eda006c0 Level-0 table #407: started
2024/09/12-09:50:36.070408 7f25eda006c0 Level-0 table #407: 0 bytes OK
2024/09/12-09:50:36.076675 7f25eda006c0 Delete type=0 #405
2024/09/12-09:50:36.082735 7f25eda006c0 Manual compaction at level-0 from '!items!0ErhyqifZLDCmMfT' @ 72057594037927935 : 1 .. '!items!yE8UH6YAgNGjKDEu' @ 0 : 0; will stop at (end)
2024/09/12-09:50:36.082778 7f25eda006c0 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.

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