Compare commits
41 Commits
fvtt-dark-
...
9ad34b4672
| Author | SHA1 | Date | |
|---|---|---|---|
| 9ad34b4672 | |||
| ae36be975d | |||
| 69eaa8fc66 | |||
| b741cffd96 | |||
| e5296a4bcd | |||
| 9f93849a9d | |||
| 14c7e54b3d | |||
| ce3359b2f0 | |||
| 02bf6cc10a | |||
| dc5a1056b7 | |||
| c7ccc50db0 | |||
| 1f8275e153 | |||
| e19e6df228 | |||
| 714485b688 | |||
| ceed6efc0b | |||
| 06e265586b | |||
| 78edf6b80b | |||
| 60112d1a79 | |||
| 652f24b863 | |||
| 69322cccfe | |||
| 5d0c53f52b | |||
| 9557f18eb2 | |||
| c3758da16b | |||
| 7dbc5e44b7 | |||
| 880109f189 | |||
| 2dbf8fc336 | |||
| 9b7519afa7 | |||
| 285d095d91 | |||
| 79333f8b14 | |||
| 5477e2be4b | |||
| f98852c69f | |||
| 32b5868646 | |||
| 606271e725 | |||
| 2da3d19dbe | |||
| 7ceada98fb | |||
| 580b044c77 | |||
| 83119a2b82 | |||
| 04365a93d0 | |||
| 5f36a58805 | |||
| 55a2d3f4d4 | |||
| 4d6c0cdc4a |
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
.vscode/settings.json
|
||||||
|
.idea
|
||||||
|
.history
|
||||||
|
todo.md
|
||||||
|
/.vscode
|
||||||
|
/ignored/
|
||||||
|
/node_modules/
|
||||||
|
/jsconfig.json
|
||||||
|
/package.json
|
||||||
|
/package-lock.json
|
||||||
BIN
images/icons/magic.webp
Normal file
BIN
images/icons/magic.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.7 KiB |
BIN
images/icons/psychicpowers.webp
Normal file
BIN
images/icons/psychicpowers.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.2 KiB |
@@ -13,10 +13,10 @@ export class DarkStarsActorSheet extends ActorSheet {
|
|||||||
|
|
||||||
return mergeObject(super.defaultOptions, {
|
return mergeObject(super.defaultOptions, {
|
||||||
classes: ["fvtt-dark-stars", "sheet", "actor"],
|
classes: ["fvtt-dark-stars", "sheet", "actor"],
|
||||||
template: "systems/fvtt-dark-stars/templates/actor-sheet.hbs",
|
template: "systems/fvtt-dark-stars/templates/actors/actor-sheet.hbs",
|
||||||
width: 960,
|
width: 960,
|
||||||
height: 720,
|
height: 720,
|
||||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "skills" }],
|
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "main" }],
|
||||||
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
|
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
|
||||||
editScore: true
|
editScore: true
|
||||||
});
|
});
|
||||||
@@ -35,23 +35,24 @@ export class DarkStarsActorSheet extends ActorSheet {
|
|||||||
name: this.actor.name,
|
name: this.actor.name,
|
||||||
editable: this.isEditable,
|
editable: this.isEditable,
|
||||||
cssClass: this.isEditable ? "editable" : "locked",
|
cssClass: this.isEditable ? "editable" : "locked",
|
||||||
data: actorData,
|
system: actorData,
|
||||||
limited: this.object.limited,
|
limited: this.object.limited,
|
||||||
skills: this.actor.getSkills( ),
|
skills: this.actor.getSkills( ),
|
||||||
|
perks: this.actor.getPerks( ),
|
||||||
weapons: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getWeapons()) ),
|
weapons: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getWeapons()) ),
|
||||||
|
ammos: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getAmmos()) ),
|
||||||
|
spells: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getSpells()) ),
|
||||||
|
powers: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getPowers()) ),
|
||||||
armors: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getArmors())),
|
armors: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getArmors())),
|
||||||
shields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getShields())),
|
shields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getShields())),
|
||||||
spells: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getLore())),
|
|
||||||
equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipmentsOnly()) ),
|
equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipmentsOnly()) ),
|
||||||
equippedWeapons: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquippedWeapons()) ),
|
equippedWeapons: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquippedWeapons()) ),
|
||||||
|
cybers: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getCybers()) ),
|
||||||
|
genetics: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getGenetics()) ),
|
||||||
equippedArmor: this.actor.getEquippedArmor(),
|
equippedArmor: this.actor.getEquippedArmor(),
|
||||||
equippedShield: this.actor.getEquippedShield(),
|
equippedShield: this.actor.getEquippedShield(),
|
||||||
feats: duplicate(this.actor.getFeats()),
|
|
||||||
subActors: duplicate(this.actor.getSubActors()),
|
subActors: duplicate(this.actor.getSubActors()),
|
||||||
race: duplicate(this.actor.getRace()),
|
|
||||||
moneys: duplicate(this.actor.getMoneys()),
|
|
||||||
encCapacity: this.actor.getEncumbranceCapacity(),
|
encCapacity: this.actor.getEncumbranceCapacity(),
|
||||||
saveRolls: this.actor.getSaveRoll(),
|
|
||||||
conditions: this.actor.getConditions(),
|
conditions: this.actor.getConditions(),
|
||||||
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}),
|
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}),
|
||||||
notes: await TextEditor.enrichHTML(this.object.system.biodata.notes, {async: true}),
|
notes: await TextEditor.enrichHTML(this.object.system.biodata.notes, {async: true}),
|
||||||
@@ -98,17 +99,6 @@ export class DarkStarsActorSheet extends ActorSheet {
|
|||||||
this.actor.createEmbeddedDocuments('Item', [{ name: "NewItem", type: dataType }], { renderSheet: true })
|
this.actor.createEmbeddedDocuments('Item', [{ name: "NewItem", type: dataType }], { renderSheet: true })
|
||||||
})
|
})
|
||||||
|
|
||||||
html.find('.equip-activate').click(ev => {
|
|
||||||
const li = $(ev.currentTarget).parents(".item")
|
|
||||||
let itemId = li.data("item-id")
|
|
||||||
this.actor.equipActivate( itemId)
|
|
||||||
});
|
|
||||||
html.find('.equip-deactivate').click(ev => {
|
|
||||||
const li = $(ev.currentTarget).parents(".item")
|
|
||||||
let itemId = li.data("item-id")
|
|
||||||
this.actor.equipDeactivate( itemId)
|
|
||||||
});
|
|
||||||
|
|
||||||
html.find('.subactor-edit').click(ev => {
|
html.find('.subactor-edit').click(ev => {
|
||||||
const li = $(ev.currentTarget).parents(".item");
|
const li = $(ev.currentTarget).parents(".item");
|
||||||
let actorId = li.data("actor-id");
|
let actorId = li.data("actor-id");
|
||||||
@@ -121,6 +111,17 @@ export class DarkStarsActorSheet extends ActorSheet {
|
|||||||
let actorId = li.data("actor-id");
|
let actorId = li.data("actor-id");
|
||||||
this.actor.delSubActor(actorId);
|
this.actor.delSubActor(actorId);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
html.find('.edit-weapon-ammo').change(ev => {
|
||||||
|
const li = $(ev.currentTarget).parents(".item")
|
||||||
|
let weaponId = li.data("item-id")
|
||||||
|
this.actor.setWeaponAmmo( weaponId, ev.currentTarget.value )
|
||||||
|
})
|
||||||
|
html.find('.skill-used-id').change(event => {
|
||||||
|
const li = $(event.currentTarget).parents(".item");
|
||||||
|
this.actor.setSkillUsed( li.data("item-id"), event.currentTarget.checked );
|
||||||
|
} );
|
||||||
|
|
||||||
html.find('.quantity-minus').click(event => {
|
html.find('.quantity-minus').click(event => {
|
||||||
const li = $(event.currentTarget).parents(".item");
|
const li = $(event.currentTarget).parents(".item");
|
||||||
this.actor.incDecQuantity( li.data("item-id"), -1 );
|
this.actor.incDecQuantity( li.data("item-id"), -1 );
|
||||||
@@ -139,10 +140,6 @@ export class DarkStarsActorSheet extends ActorSheet {
|
|||||||
this.actor.incDecAmmo( li.data("item-id"), +1 )
|
this.actor.incDecAmmo( li.data("item-id"), +1 )
|
||||||
} );
|
} );
|
||||||
|
|
||||||
html.find('.roll-ability').click((event) => {
|
|
||||||
const abilityKey = $(event.currentTarget).data("ability-key");
|
|
||||||
this.actor.rollAbility(abilityKey);
|
|
||||||
});
|
|
||||||
html.find('.roll-skill').click((event) => {
|
html.find('.roll-skill').click((event) => {
|
||||||
const li = $(event.currentTarget).parents(".item")
|
const li = $(event.currentTarget).parents(".item")
|
||||||
const skillId = li.data("item-id")
|
const skillId = li.data("item-id")
|
||||||
@@ -154,20 +151,6 @@ export class DarkStarsActorSheet extends ActorSheet {
|
|||||||
const skillId = li.data("item-id")
|
const skillId = li.data("item-id")
|
||||||
this.actor.rollWeapon(skillId)
|
this.actor.rollWeapon(skillId)
|
||||||
});
|
});
|
||||||
html.find('.roll-armor-die').click((event) => {
|
|
||||||
this.actor.rollArmorDie()
|
|
||||||
});
|
|
||||||
html.find('.roll-shield-die').click((event) => {
|
|
||||||
this.actor.rollShieldDie()
|
|
||||||
});
|
|
||||||
html.find('.roll-target-die').click((event) => {
|
|
||||||
this.actor.rollDefenseRanged()
|
|
||||||
});
|
|
||||||
|
|
||||||
html.find('.roll-save').click((event) => {
|
|
||||||
const saveKey = $(event.currentTarget).data("save-key")
|
|
||||||
this.actor.rollSave(saveKey)
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
html.find('.lock-unlock-sheet').click((event) => {
|
html.find('.lock-unlock-sheet').click((event) => {
|
||||||
|
|||||||
@@ -64,26 +64,35 @@ export class DarkStarsActor extends Actor {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
computeHitPoints() {
|
computeHitPoints() {
|
||||||
if (this.type == "character") {
|
if (this.type == "character") {
|
||||||
let hp = duplicate(this.system.secondary.hp)
|
|
||||||
let max = (this.system.abilities.str.value + this.system.abilities.con.value) * 6
|
|
||||||
if (max != hp.max || hp.value > max) {
|
|
||||||
hp.max = max
|
|
||||||
hp.value = max // Init case
|
|
||||||
this.update({ 'system.secondary.hp': hp })
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
computeEffortPoints() {
|
computeDerivated() {
|
||||||
if (this.type == "character") {
|
let attr = this.system.attributes
|
||||||
let effort = duplicate(this.system.secondary.effort)
|
let deriv = this.system.derivated
|
||||||
let max = (this.system.abilities.con.value + this.system.abilities.int.value) * 6
|
let secondary = this.system.secondary
|
||||||
if (max != effort.max || effort.value > max) {
|
|
||||||
effort.max = max
|
deriv.csb.value = Math.round((attr.dex.value + attr.sel.value) / 2) + deriv.csb.bonus
|
||||||
effort.value = max // Init case
|
deriv.asb.value = Math.round((attr.int.value + attr.edu.value) / 2) + deriv.asb.bonus
|
||||||
this.update({ 'system.secondary.effort': effort })
|
deriv.ssb.value = Math.round((attr.cha.value + attr.emp.value + attr.att.value) / 3) + deriv.ssb.bonus
|
||||||
}
|
deriv.msb.value = Math.round((attr.con.value + attr.str.value ) / 2) + deriv.msb.bonus
|
||||||
|
deriv.psb.value = Math.round((attr.str.value + attr.dex.value + attr.con.value) / 3) + deriv.psb.bonus
|
||||||
|
|
||||||
|
deriv.ego.value = attr.str.value + attr.cha.value + attr.sel.value + attr.emp.value + deriv.ego.bonus
|
||||||
|
deriv.hup.value = (attr.emp.value * 10) + deriv.hup.bonus
|
||||||
|
deriv.ss.value = (attr.edu.value * 10) + (attr.int.value * 10) + 250 + deriv.ss.bonus
|
||||||
|
|
||||||
|
deriv.mcdb.value = Math.round( (attr.str.value + attr.siz.value) / 4) + deriv.mcdb.bonus
|
||||||
|
deriv.si.value = Math.round( ((attr.dex.value + attr.sel.value) / 5) + 0.5) + deriv.si.bonus
|
||||||
|
|
||||||
|
secondary.hp.max = ((attr.con.value + attr.siz.value ) * 2) + secondary.hp.bonus
|
||||||
|
for(let key in this.system.hitlocations) {
|
||||||
|
let loc = this.system.hitlocations[key]
|
||||||
|
loc.max = Math.floor(secondary.hp.max * loc.ratio)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
secondary.fp.max = 10 + attr.str.value + attr.con.value + secondary.fp.bonus
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -91,9 +100,9 @@ export class DarkStarsActor extends Actor {
|
|||||||
|
|
||||||
if (this.type == 'character' || game.user.isGM) {
|
if (this.type == 'character' || game.user.isGM) {
|
||||||
this.system.encCapacity = this.getEncumbranceCapacity()
|
this.system.encCapacity = this.getEncumbranceCapacity()
|
||||||
|
this.computeDerivated()
|
||||||
this.buildContainerTree()
|
this.buildContainerTree()
|
||||||
this.computeHitPoints()
|
this.computeHitPoints()
|
||||||
this.computeEffortPoints()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
super.prepareDerivedData();
|
super.prepareDerivedData();
|
||||||
@@ -110,35 +119,6 @@ export class DarkStarsActor extends Actor {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getMoneys() {
|
|
||||||
let comp = this.items.filter(item => item.type == 'money');
|
|
||||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
|
||||||
return comp;
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getFeats() {
|
|
||||||
let comp = duplicate(this.items.filter(item => item.type == 'feat') || []);
|
|
||||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
|
||||||
return comp;
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getFeatsWithDie() {
|
|
||||||
let comp = duplicate(this.items.filter(item => item.type == 'feat' && item.system.isfeatdie) || []);
|
|
||||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
|
||||||
return comp;
|
|
||||||
}
|
|
||||||
getFeatsWithSL() {
|
|
||||||
let comp = duplicate(this.items.filter(item => item.type == 'feat' && item.system.issl) || []);
|
|
||||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
|
||||||
return comp;
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getLore() {
|
|
||||||
let comp = duplicate(this.items.filter(item => item.type == 'spell') || []);
|
|
||||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
|
||||||
return comp;
|
|
||||||
}
|
|
||||||
getEquippedWeapons() {
|
getEquippedWeapons() {
|
||||||
let comp = duplicate(this.items.filter(item => item.type == 'weapon' && item.system.equipped) || []);
|
let comp = duplicate(this.items.filter(item => item.type == 'weapon' && item.system.equipped) || []);
|
||||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||||
@@ -150,6 +130,16 @@ export class DarkStarsActor extends Actor {
|
|||||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||||
return comp;
|
return comp;
|
||||||
}
|
}
|
||||||
|
getSpells() {
|
||||||
|
let comp = duplicate(this.items.filter(item => item.type == 'spell') || []);
|
||||||
|
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||||
|
return comp;
|
||||||
|
}
|
||||||
|
getPowers() {
|
||||||
|
let comp = duplicate(this.items.filter(item => item.type == 'psychic') || []);
|
||||||
|
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||||
|
return comp;
|
||||||
|
}
|
||||||
getEquippedArmor() {
|
getEquippedArmor() {
|
||||||
let comp = this.items.find(item => item.type == 'armor' && item.system.equipped)
|
let comp = this.items.find(item => item.type == 'armor' && item.system.equipped)
|
||||||
if (comp) {
|
if (comp) {
|
||||||
@@ -158,6 +148,17 @@ export class DarkStarsActor extends Actor {
|
|||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
getCybers() {
|
||||||
|
let comp = duplicate(this.items.filter(item => item.type == 'cyber') || []);
|
||||||
|
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||||
|
return comp;
|
||||||
|
}
|
||||||
|
getGenetics() {
|
||||||
|
let comp = duplicate(this.items.filter(item => item.type == 'genetic') || []);
|
||||||
|
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||||
|
return comp;
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
getShields() {
|
getShields() {
|
||||||
let comp = duplicate(this.items.filter(item => item.type == 'shield') || []);
|
let comp = duplicate(this.items.filter(item => item.type == 'shield') || []);
|
||||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||||
@@ -171,12 +172,14 @@ export class DarkStarsActor extends Actor {
|
|||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getRace() {
|
|
||||||
let race = this.items.filter(item => item.type == 'race')
|
|
||||||
return race[0] ?? [];
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
checkAndPrepareEquipment(item) {
|
checkAndPrepareEquipment(item) {
|
||||||
|
// Dynamic assign ammo for the weapon
|
||||||
|
if (item.type == "weapon" && item.system.needammo) {
|
||||||
|
let ammo = this.items.find(ammo => ammo.type == "ammo" && item.system.ammoid == ammo.id)
|
||||||
|
if (ammo) {
|
||||||
|
item.ammo = duplicate(ammo)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -196,6 +199,12 @@ export class DarkStarsActor extends Actor {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getWeapons() {
|
getWeapons() {
|
||||||
let comp = duplicate(this.items.filter(item => item.type == 'weapon') || []);
|
let comp = duplicate(this.items.filter(item => item.type == 'weapon') || []);
|
||||||
|
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||||
|
return comp;
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getAmmos() {
|
||||||
|
let comp = duplicate(this.items.filter(item => item.type == 'ammo') || []);
|
||||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||||
return comp;
|
return comp;
|
||||||
}
|
}
|
||||||
@@ -207,24 +216,45 @@ export class DarkStarsActor extends Actor {
|
|||||||
}
|
}
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
setWeaponAmmo(weaponId, ammoId) {
|
||||||
|
let weapon = this.items.get(weaponId)
|
||||||
|
if(weapon) {
|
||||||
|
this.updateEmbeddedDocuments('Item', [ {_id: weapon.id, 'system.ammoid': ammoId} ])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
setSkillUsed( skillId, checked) {
|
||||||
|
let skill = this.items.get(skillId)
|
||||||
|
if(skill) {
|
||||||
|
this.updateEmbeddedDocuments('Item', [ {_id: skill.id, 'system.used': checked} ])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
updateSkill(skill) {
|
||||||
|
skill.derivated = duplicate(this.system.derivated[skill.system.base])
|
||||||
|
skill.total = skill.system.value + skill.derivated.value + skill.system.bonus
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getSkills() {
|
getSkills() {
|
||||||
|
this.computeDerivated()
|
||||||
let comp = duplicate(this.items.filter(item => item.type == 'skill') || [])
|
let comp = duplicate(this.items.filter(item => item.type == 'skill') || [])
|
||||||
for (let skill of comp) {
|
for (let skill of comp) {
|
||||||
DarkStarsUtility.updateSkill(skill)
|
this.updateSkill(skill)
|
||||||
}
|
}
|
||||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||||
return comp
|
return comp
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getRelevantAbility(statKey) {
|
getPerks() {
|
||||||
let comp = duplicate(this.items.filter(item => item.type == 'skill' && item.system.ability == ability) || []);
|
let comp = duplicate(this.items.filter(item => item.type == 'perk') || [])
|
||||||
return comp;
|
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||||
|
return comp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async equipItem(itemId) {
|
async equipItem(itemId) {
|
||||||
let item = this.items.find(item => item.id == itemId)
|
let item = this.items.find(item => item.id == itemId)
|
||||||
@@ -343,7 +373,7 @@ export class DarkStarsActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async incDecHP(formula) {
|
async incDecHP(formula) {
|
||||||
let dmgRoll = new Roll(formula+"[dark-starsorange]").roll({ async: false })
|
let dmgRoll = new Roll(formula + "[dark-starsorange]").roll({ async: false })
|
||||||
await DarkStarsUtility.showDiceSoNice(dmgRoll, game.settings.get("core", "rollMode"))
|
await DarkStarsUtility.showDiceSoNice(dmgRoll, game.settings.get("core", "rollMode"))
|
||||||
let hp = duplicate(this.system.secondary.hp)
|
let hp = duplicate(this.system.secondary.hp)
|
||||||
hp.value = Number(hp.value) + Number(dmgRoll.total)
|
hp.value = Number(hp.value) + Number(dmgRoll.total)
|
||||||
@@ -372,7 +402,7 @@ export class DarkStarsActor extends Actor {
|
|||||||
} else {
|
} else {
|
||||||
await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': containerId }])
|
await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': containerId }])
|
||||||
}
|
}
|
||||||
} else if (object && object.system.containerid) { // remove from container
|
} else if (object?.system.containerid) { // remove from container
|
||||||
console.log("Removeing: ", object)
|
console.log("Removeing: ", object)
|
||||||
await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': "" }]);
|
await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': "" }]);
|
||||||
}
|
}
|
||||||
@@ -389,18 +419,20 @@ export class DarkStarsActor extends Actor {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async equipGear(equipmentId) {
|
async equipGear(equipmentId) {
|
||||||
let item = this.items.find(item => item.id == equipmentId);
|
let item = this.items.find(item => item.id == equipmentId);
|
||||||
if (item && item.system) {
|
if (item?.system) {
|
||||||
let update = { _id: item.id, "system.equipped": !item.system.equipped };
|
let update = { _id: item.id, "system.equipped": !item.system.equipped };
|
||||||
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
|
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getInitiativeScore(combatId, combatantId) {
|
hasLastWord() {
|
||||||
if (this.type == 'character') {
|
return this.items.find(i => i.type == "perk" && i.name.toLowerCase() === "last word")
|
||||||
this.rollMR(true, combatId, combatantId)
|
}
|
||||||
}
|
/* -------------------------------------------- */
|
||||||
console.log("Init required !!!!")
|
getInitiativeScore() {
|
||||||
return -1;
|
let initFormula = (this.system.derivated.si.value + this.system.derivated.si.bonus) + "d6"
|
||||||
|
let initRoll = new Roll(initFormula).roll({ async: false })
|
||||||
|
return initRoll.total
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -428,12 +460,6 @@ export class DarkStarsActor extends Actor {
|
|||||||
await this.update({ 'system.subactors': newArray });
|
await this.update({ 'system.subactors': newArray });
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
syncRoll(rollData) {
|
|
||||||
this.lastRollId = rollData.rollId;
|
|
||||||
DarkStarsUtility.saveRollData(rollData);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getOneSkill(skillId) {
|
getOneSkill(skillId) {
|
||||||
let skill = this.items.find(item => item.type == 'skill' && item.id == skillId)
|
let skill = this.items.find(item => item.type == 'skill' && item.id == skillId)
|
||||||
@@ -488,7 +514,7 @@ export class DarkStarsActor extends Actor {
|
|||||||
if (objetQ) {
|
if (objetQ) {
|
||||||
let newQ = objetQ.system.quantity + incDec
|
let newQ = objetQ.system.quantity + incDec
|
||||||
if (newQ >= 0) {
|
if (newQ >= 0) {
|
||||||
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantity': newQ }]) // pdates one EmbeddedEntity
|
await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantity': newQ }]) // pdates one EmbeddedEntity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -498,7 +524,7 @@ export class DarkStarsActor extends Actor {
|
|||||||
if (objetQ) {
|
if (objetQ) {
|
||||||
let newQ = objetQ.system.ammocurrent + incDec;
|
let newQ = objetQ.system.ammocurrent + incDec;
|
||||||
if (newQ >= 0 && newQ <= objetQ.system.ammomax) {
|
if (newQ >= 0 && newQ <= objetQ.system.ammomax) {
|
||||||
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.ammocurrent': newQ }]); // pdates one EmbeddedEntity
|
await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.ammocurrent': newQ }]); // pdates one EmbeddedEntity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -532,6 +558,13 @@ export class DarkStarsActor extends Actor {
|
|||||||
return this.items.find(cond => cond.type == "condition" && cond.system.targetadvantage)
|
return this.items.find(cond => cond.type == "condition" && cond.system.targetadvantage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
modifyRerolls( value) {
|
||||||
|
let rerolls = duplicate(this.system.various.rerolls)
|
||||||
|
rerolls.value += value
|
||||||
|
this.update({ 'system.various.rerolls': rerolls })
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getCommonRollData(abilityKey = undefined) {
|
getCommonRollData(abilityKey = undefined) {
|
||||||
let noAction = this.isNoAction()
|
let noAction = this.isNoAction()
|
||||||
@@ -545,20 +578,10 @@ export class DarkStarsActor extends Actor {
|
|||||||
rollData.actorImg = this.img
|
rollData.actorImg = this.img
|
||||||
rollData.actorId = this.id
|
rollData.actorId = this.id
|
||||||
rollData.img = this.img
|
rollData.img = this.img
|
||||||
rollData.featsDie = this.getFeatsWithDie()
|
|
||||||
rollData.featsSL = this.getFeatsWithSL()
|
|
||||||
rollData.armors = this.getArmors()
|
rollData.armors = this.getArmors()
|
||||||
rollData.conditions = this.getConditions()
|
rollData.conditions = this.getConditions()
|
||||||
rollData.featDieName = "none"
|
rollData.rerolls = this.system.various.rerolls.value
|
||||||
rollData.featSLName = "none"
|
|
||||||
rollData.rollAdvantage = "none"
|
|
||||||
rollData.advantage = "none"
|
|
||||||
rollData.disadvantage = "none"
|
|
||||||
rollData.forceAdvantage = this.isForcedAdvantage()
|
|
||||||
rollData.forceDisadvantage = this.isForcedDisadvantage()
|
|
||||||
rollData.forceRollAdvantage = this.isForcedRollAdvantage()
|
|
||||||
rollData.forceRollDisadvantage = this.isForcedRollDisadvantage()
|
|
||||||
rollData.noAdvantage = this.isNoAdvantage()
|
|
||||||
if (rollData.defenderTokenId) {
|
if (rollData.defenderTokenId) {
|
||||||
let defenderToken = game.canvas.tokens.get(rollData.defenderTokenId)
|
let defenderToken = game.canvas.tokens.get(rollData.defenderTokenId)
|
||||||
let defender = defenderToken.actor
|
let defender = defenderToken.actor
|
||||||
@@ -607,15 +630,11 @@ export class DarkStarsActor extends Actor {
|
|||||||
rollSkill(skillId) {
|
rollSkill(skillId) {
|
||||||
let skill = this.items.get(skillId)
|
let skill = this.items.get(skillId)
|
||||||
if (skill) {
|
if (skill) {
|
||||||
if (skill.system.islore && skill.system.level == 0) {
|
|
||||||
ui.notifications.warn("You can't use Lore Skills with a SL of 0.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
skill = duplicate(skill)
|
skill = duplicate(skill)
|
||||||
DarkStarsUtility.updateSkill(skill)
|
this.updateSkill(skill)
|
||||||
let abilityKey = skill.system.ability
|
let rollData = this.getCommonRollData()
|
||||||
let rollData = this.getCommonRollData(abilityKey)
|
|
||||||
rollData.mode = "skill"
|
rollData.mode = "skill"
|
||||||
|
rollData.title = "Skill " + skill.name
|
||||||
rollData.skill = skill
|
rollData.skill = skill
|
||||||
rollData.img = skill.img
|
rollData.img = skill.img
|
||||||
if (rollData.target) {
|
if (rollData.target) {
|
||||||
@@ -634,20 +653,13 @@ export class DarkStarsActor extends Actor {
|
|||||||
let skill = this.items.find(item => item.name.toLowerCase() == weapon.system.skill.toLowerCase())
|
let skill = this.items.find(item => item.name.toLowerCase() == weapon.system.skill.toLowerCase())
|
||||||
if (skill) {
|
if (skill) {
|
||||||
skill = duplicate(skill)
|
skill = duplicate(skill)
|
||||||
DarkStarsUtility.updateSkill(skill)
|
this.updateSkill(skill)
|
||||||
let abilityKey = skill.system.ability
|
let rollData = this.getCommonRollData()
|
||||||
let rollData = this.getCommonRollData(abilityKey)
|
|
||||||
rollData.mode = "weapon"
|
rollData.mode = "weapon"
|
||||||
rollData.skill = skill
|
rollData.skill = skill
|
||||||
rollData.weapon = weapon
|
rollData.weapon = weapon
|
||||||
|
this.checkAndPrepareEquipment(weapon)
|
||||||
rollData.img = weapon.img
|
rollData.img = weapon.img
|
||||||
if (!rollData.forceDisadvantage) { // This is an attack, check if disadvantaged
|
|
||||||
rollData.forceDisadvantage = this.isAttackDisadvantage()
|
|
||||||
}
|
|
||||||
/*if (rollData.weapon.system.isranged && rollData.tokensDistance > DarkStarsUtility.getWeaponMaxRange(rollData.weapon) ) {
|
|
||||||
ui.notifications.warn(`Your target is out of range of your weapon (max: ${DarkStarsUtility.getWeaponMaxRange(rollData.weapon)} - current : ${rollData.tokensDistance})` )
|
|
||||||
return
|
|
||||||
}*/
|
|
||||||
this.startRoll(rollData)
|
this.startRoll(rollData)
|
||||||
} else {
|
} else {
|
||||||
ui.notifications.warn("Unable to find the relevant skill for weapon " + weapon.name)
|
ui.notifications.warn("Unable to find the relevant skill for weapon " + weapon.name)
|
||||||
@@ -655,152 +667,8 @@ export class DarkStarsActor extends Actor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
rollDefenseMelee(attackRollData) {
|
|
||||||
let weapon = this.items.get(attackRollData.defenseWeaponId)
|
|
||||||
if (weapon) {
|
|
||||||
weapon = duplicate(weapon)
|
|
||||||
let skill = this.items.find(item => item.name.toLowerCase() == weapon.system.skill.toLowerCase())
|
|
||||||
if (skill) {
|
|
||||||
skill = duplicate(skill)
|
|
||||||
DarkStarsUtility.updateSkill(skill)
|
|
||||||
let abilityKey = skill.system.ability
|
|
||||||
let rollData = this.getCommonRollData(abilityKey)
|
|
||||||
rollData.defenderTokenId = undefined // Cleanup
|
|
||||||
rollData.mode = "weapondefense"
|
|
||||||
rollData.shield = this.getEquippedShield()
|
|
||||||
rollData.attackRollData = duplicate(attackRollData)
|
|
||||||
rollData.skill = skill
|
|
||||||
rollData.weapon = weapon
|
|
||||||
rollData.img = weapon.img
|
|
||||||
if (!rollData.forceDisadvantage) { // This is an attack, check if disadvantaged
|
|
||||||
rollData.forceDisadvantage = this.isDefenseDisadvantage()
|
|
||||||
}
|
|
||||||
|
|
||||||
this.startRoll(rollData)
|
|
||||||
} else {
|
|
||||||
ui.notifications.warn("Unable to find the relevant skill for weapon " + weapon.name)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ui.notifications.warn("Weapon not found ! ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
rollDefenseRanged(attackRollData) {
|
|
||||||
let rollData = this.getCommonRollData()
|
|
||||||
rollData.defenderTokenId = undefined // Cleanup
|
|
||||||
rollData.mode = "rangeddefense"
|
|
||||||
if ( attackRollData) {
|
|
||||||
rollData.attackRollData = duplicate(attackRollData)
|
|
||||||
rollData.effectiveRange = DarkStarsUtility.getWeaponRange(attackRollData.weapon)
|
|
||||||
rollData.tokensDistance = attackRollData.tokensDistance // QoL copy
|
|
||||||
}
|
|
||||||
rollData.sizeDice = DarkStarsUtility.getSizeDice(this.system.biodata.size)
|
|
||||||
rollData.distanceBonusDice = 0 //Math.max(0, Math.floor((rollData.tokensDistance - rollData.effectiveRange) + 0.5))
|
|
||||||
rollData.hasCover = "none"
|
|
||||||
rollData.situational = "none"
|
|
||||||
rollData.useshield = false
|
|
||||||
rollData.shield = this.getEquippedShield()
|
|
||||||
this.startRoll(rollData)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
rollShieldDie() {
|
|
||||||
let shield = this.getEquippedShield()
|
|
||||||
if (shield) {
|
|
||||||
shield = duplicate(shield)
|
|
||||||
let rollData = this.getCommonRollData()
|
|
||||||
rollData.mode = "shield"
|
|
||||||
rollData.shield = shield
|
|
||||||
rollData.useshield = true
|
|
||||||
rollData.img = shield.img
|
|
||||||
this.startRoll(rollData)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async rollArmorDie(rollData = undefined) {
|
|
||||||
let armor = this.getEquippedArmor()
|
|
||||||
if (armor) {
|
|
||||||
armor = duplicate(armor)
|
|
||||||
let reduce = 0
|
|
||||||
let multiply = 1
|
|
||||||
let disadvantage = false
|
|
||||||
let advantage = false
|
|
||||||
let messages = ["Armor applied"]
|
|
||||||
|
|
||||||
if (rollData) {
|
|
||||||
if (DarkStarsUtility.isArmorLight(armor) && DarkStarsUtility.isWeaponPenetrating(rollData.attackRollData.weapon)) {
|
|
||||||
return { armorIgnored: true, nbSuccess: 0, messages: ["Armor ignored : Penetrating weapons ignore Light Armors."] }
|
|
||||||
}
|
|
||||||
if (DarkStarsUtility.isWeaponPenetrating(rollData.attackRollData.weapon)) {
|
|
||||||
messages.push("Armor reduced by 1 (Penetrating weapon)")
|
|
||||||
reduce = 1
|
|
||||||
}
|
|
||||||
if (DarkStarsUtility.isWeaponLight(rollData.attackRollData.weapon)) {
|
|
||||||
messages.push("Armor with advantage (Light weapon)")
|
|
||||||
advantage = true
|
|
||||||
}
|
|
||||||
if (DarkStarsUtility.isWeaponHeavy(rollData.attackRollData.weapon)) {
|
|
||||||
messages.push("Armor with disadvantage (Heavy weapon)")
|
|
||||||
disadvantage = true
|
|
||||||
}
|
|
||||||
if (DarkStarsUtility.isWeaponHack(rollData.attackRollData.weapon)) {
|
|
||||||
messages.push("Armor reduced by 1 (Hack weapon)")
|
|
||||||
reduce = 1
|
|
||||||
}
|
|
||||||
if (DarkStarsUtility.isWeaponUndamaging(rollData.attackRollData.weapon)) {
|
|
||||||
messages.push("Armor multiplied by 2 (Undamaging weapon)")
|
|
||||||
multiply = 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let diceColor = armor.system.absorprionroll
|
|
||||||
let armorResult = await DarkStarsUtility.getRollTableFromDiceColor(diceColor, false)
|
|
||||||
console.log("Armor log", armorResult)
|
|
||||||
let armorValue = Math.max(0, (Number(armorResult.text) + reduce) * multiply)
|
|
||||||
if (advantage || disadvantage) {
|
|
||||||
let armorResult2 = await DarkStarsUtility.getRollTableFromDiceColor(diceColor, false)
|
|
||||||
let armorValue2 = Math.max(0, (Number(armorResult2.text) + reduce) * multiply)
|
|
||||||
if (advantage) {
|
|
||||||
armorValue = (armorValue2 > armorValue) ? armorValue2 : armorValue
|
|
||||||
messages.push(`Armor advantage - Roll 1 = ${armorValue} - Roll 2 = ${armorValue2}`)
|
|
||||||
}
|
|
||||||
if (disadvantage) {
|
|
||||||
armorValue = (armorValue2 < armorValue) ? armorValue2 : armorValue
|
|
||||||
messages.push(`Armor disadvantage - Roll 1 = ${armorValue} - Roll 2 = ${armorValue2}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
armorResult.armorValue = armorValue
|
|
||||||
if (!rollData) {
|
|
||||||
ChatMessage.create({ content: "Armor result : " + armorValue })
|
|
||||||
}
|
|
||||||
messages.push("Armor result : " + armorValue)
|
|
||||||
return { armorIgnored: false, nbSuccess: armorValue, rawArmor: armorResult.text, messages: messages }
|
|
||||||
}
|
|
||||||
return { armorIgnored: true, nbSuccess: 0, messages: ["No armor equipped."] }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
rollSave(saveKey) {
|
|
||||||
let saves = this.getSaveRoll()
|
|
||||||
let save = saves[saveKey]
|
|
||||||
if (save) {
|
|
||||||
save = duplicate(save)
|
|
||||||
let rollData = this.getCommonRollData()
|
|
||||||
rollData.mode = "save"
|
|
||||||
rollData.save = save
|
|
||||||
if (rollData.target) {
|
|
||||||
ui.notifications.warn("You are targetting a token with a save roll - Not authorized.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.startRoll(rollData)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async startRoll(rollData) {
|
async startRoll(rollData) {
|
||||||
this.syncRoll(rollData)
|
|
||||||
let rollDialog = await DarkStarsRollDialog.create(this, rollData)
|
let rollDialog = await DarkStarsRollDialog.create(this, rollData)
|
||||||
rollDialog.render(true)
|
rollDialog.render(true)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,29 +2,46 @@ import { DarkStarsUtility } from "./dark-stars-utility.js";
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class DarkStarsCombat extends Combat {
|
export class DarkStarsCombat extends Combat {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async rollInitiative(ids, formula = undefined, messageOptions = {} ) {
|
|
||||||
ids = typeof ids === "string" ? [ids] : ids;
|
|
||||||
for (let cId = 0; cId < ids.length; cId++) {
|
|
||||||
const c = this.combatants.get(ids[cId]);
|
|
||||||
let id = c._id || c.id;
|
|
||||||
let initBonus = c.actor ? c.actor.getInitiativeScore( this.id, id ) : -1;
|
|
||||||
await this.updateEmbeddedDocuments("Combatant", [ { _id: id, initiative: initBonus } ]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
processOtherTurns(c, initScore) {
|
||||||
|
let toCreate = []
|
||||||
|
let token = canvas.tokens.get(c.tokenId)
|
||||||
|
let hasLastWord = token.actor.hasLastWord()
|
||||||
|
while ( (initScore > 5) || (hasLastWord && initScore >= 5)) {
|
||||||
|
initScore -= 5;
|
||||||
|
toCreate.push({tokenId: c.tokenId, sceneId: c.sceneId, actorId: c.actorId, hidden: c.hidden, initiative: initScore, flags: { world: { isDuplicated: true} } } );
|
||||||
|
}
|
||||||
|
this.createEmbeddedDocuments("Combatant", toCreate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async rollInitiative(ids, formula = undefined, messageOptions = {}) {
|
||||||
|
ids = typeof ids === "string" ? [ids] : ids;
|
||||||
|
for (let cId of ids) {
|
||||||
|
const c = this.combatants.get(cId);
|
||||||
|
let id = c._id || c.id;
|
||||||
|
let initScore = c.actor ? c.actor.getInitiativeScore(this.id, id) : -1;
|
||||||
|
await this.updateEmbeddedDocuments("Combatant", [{ _id: id, initiative: initScore }]);
|
||||||
|
setTimeout(() => this.processOtherTurns(c, initScore), 400)
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
nextRound() {
|
||||||
|
super.nextRound()
|
||||||
|
let toDelete = []
|
||||||
|
for (let c of this.combatants) {
|
||||||
|
if (c.flags?.world?.isDuplicated) {
|
||||||
|
toDelete.push(c._id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.deleteEmbeddedDocuments("Combatant", toDelete);
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_onUpdate(changed, options, userId) {
|
_onUpdate(changed, options, userId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static async checkTurnPosition() {
|
|
||||||
while (game.combat.turn > 0) {
|
|
||||||
await game.combat.previousTurn()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ export const DARKSTARS_CONFIG = {
|
|||||||
|
|
||||||
basebonus : {
|
basebonus : {
|
||||||
"csb": "CSB",
|
"csb": "CSB",
|
||||||
"asb": "SSB",
|
|
||||||
"ssb": "SSB",
|
"ssb": "SSB",
|
||||||
"msb": "MSB",
|
"msb": "MSB",
|
||||||
"psb": "PSB",
|
"psb": "PSB",
|
||||||
@@ -30,6 +29,26 @@ export const DARKSTARS_CONFIG = {
|
|||||||
"slug": "Slug throwers",
|
"slug": "Slug throwers",
|
||||||
"energy": "Energy"
|
"energy": "Energy"
|
||||||
},
|
},
|
||||||
|
perktypes: {
|
||||||
|
"normal": "Normal",
|
||||||
|
"advanced": "Advanced",
|
||||||
|
"role": "Role",
|
||||||
|
"job": "Job"
|
||||||
|
},
|
||||||
|
magicTypes: {
|
||||||
|
"lemurian": "Lemurian",
|
||||||
|
"bloodmagic": "Blood Magic Ritual",
|
||||||
|
"ritual": "Ritual",
|
||||||
|
"miracle": "Miracle"
|
||||||
|
},
|
||||||
|
cyberTypes: {
|
||||||
|
"I": "I",
|
||||||
|
"P": "P",
|
||||||
|
"U": "U",
|
||||||
|
"W": "W",
|
||||||
|
"E": "E",
|
||||||
|
"GS": "GS"
|
||||||
|
},
|
||||||
range: {
|
range: {
|
||||||
"1": "Close",
|
"1": "Close",
|
||||||
"2": "Short",
|
"2": "Short",
|
||||||
|
|||||||
@@ -132,21 +132,9 @@ export class DarkStarsItemSheet extends ItemSheet {
|
|||||||
this.deleteSubitem(ev);
|
this.deleteSubitem(ev);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Update Inventory Item
|
|
||||||
html.find('.item-delete').click(ev => {
|
|
||||||
const li = $(ev.currentTarget).parents(".item");
|
|
||||||
let itemId = li.data("item-id");
|
|
||||||
let itemType = li.data("item-type");
|
|
||||||
});
|
|
||||||
|
|
||||||
html.find('.view-subitem').click(ev => {
|
html.find('.view-subitem').click(ev => {
|
||||||
this.viewSubitem(ev);
|
this.viewSubitem(ev);
|
||||||
});
|
});
|
||||||
|
|
||||||
html.find('.view-spec').click(ev => {
|
|
||||||
this.manageSpec();
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ export const defaultItemImg = {
|
|||||||
perk: "systems/fvtt-dark-stars/images/icons/perk.webp",
|
perk: "systems/fvtt-dark-stars/images/icons/perk.webp",
|
||||||
ability: "systems/fvtt-dark-stars/images/icons/ability.webp",
|
ability: "systems/fvtt-dark-stars/images/icons/ability.webp",
|
||||||
genetic: "systems/fvtt-dark-stars/images/icons/genetic.webp",
|
genetic: "systems/fvtt-dark-stars/images/icons/genetic.webp",
|
||||||
cyber: "systems/fvtt-dark-stars/images/icons/cyber.webp"
|
cyber: "systems/fvtt-dark-stars/images/icons/cyber.webp",
|
||||||
|
spell: "systems/fvtt-dark-stars/images/icons/magic.webp",
|
||||||
|
psychic: "systems/fvtt-dark-stars/images/icons/psychicpowers.webp",
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import { DarkStarsItem } from "./dark-stars-item.js";
|
|||||||
import { DarkStarsHotbar } from "./dark-stars-hotbar.js"
|
import { DarkStarsHotbar } from "./dark-stars-hotbar.js"
|
||||||
import { DarkStarsCommands } from "./dark-stars-commands.js"
|
import { DarkStarsCommands } from "./dark-stars-commands.js"
|
||||||
import { DARKSTARS_CONFIG } from "./dark-stars-config.js";
|
import { DARKSTARS_CONFIG } from "./dark-stars-config.js";
|
||||||
|
import { ClassCounter} from "https://www.uberwald.me/fvtt_appcount/count-class-ready.js"
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* Foundry VTT Initialization */
|
/* Foundry VTT Initialization */
|
||||||
@@ -91,15 +92,11 @@ Hooks.once("ready", function () {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// CSS patch for v9
|
|
||||||
if (game.version) {
|
|
||||||
let sidebar = document.getElementById("sidebar");
|
|
||||||
sidebar.style.width = "min-content";
|
|
||||||
}
|
|
||||||
|
|
||||||
welcomeMessage();
|
welcomeMessage();
|
||||||
DarkStarsUtility.ready()
|
DarkStarsUtility.ready()
|
||||||
DarkStarsCommands.init()
|
DarkStarsCommands.init()
|
||||||
|
ClassCounter.registerUsageCount()
|
||||||
})
|
})
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ export class DarkStarsRollDialog extends Dialog {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async create(actor, rollData) {
|
static async create(actor, rollData) {
|
||||||
|
|
||||||
let options = { classes: ["DarkStarsDialog"], width: 540, height: 340, 'z-index': 99999 };
|
let options = { classes: ["DarkStarsDialog"], width: 420, height: 'fit-content', 'z-index': 99999 };
|
||||||
let html = await renderTemplate('systems/fvtt-dark-stars/templates/roll-dialog-generic.hbs', rollData);
|
let html = await renderTemplate('systems/fvtt-dark-stars/templates/apps/roll-dialog-generic.hbs', rollData);
|
||||||
|
|
||||||
return new DarkStarsRollDialog(actor, rollData, html, options);
|
return new DarkStarsRollDialog(actor, rollData, html, options);
|
||||||
}
|
}
|
||||||
@@ -58,27 +58,17 @@ export class DarkStarsRollDialog extends Dialog {
|
|||||||
}
|
}
|
||||||
$(function () { onLoad(); });
|
$(function () { onLoad(); });
|
||||||
|
|
||||||
html.find('#advantage').change((event) => {
|
html.find('#bonusMalus').change((event) => {
|
||||||
this.rollData.advantage = event.currentTarget.value
|
this.rollData.bonusMalus = Number(event.currentTarget.value)
|
||||||
})
|
})
|
||||||
html.find('#disadvantage').change((event) => {
|
html.find('#above-effective-range').change((event) => {
|
||||||
this.rollData.disadvantage = event.currentTarget.value
|
this.rollData.isAboveEffectiveRange = event.currentTarget.checked
|
||||||
})
|
})
|
||||||
html.find('#rollAdvantage').change((event) => {
|
html.find('#weapon-aiming').change((event) => {
|
||||||
this.rollData.rollAdvantage = event.currentTarget.value
|
this.rollData.weaponAiming = String(event.currentTarget.value)
|
||||||
})
|
|
||||||
html.find('#useshield').change((event) => {
|
|
||||||
this.rollData.useshield = event.currentTarget.checked
|
|
||||||
})
|
|
||||||
html.find('#hasCover').change((event) => {
|
|
||||||
this.rollData.hasCover = event.currentTarget.value
|
|
||||||
})
|
|
||||||
html.find('#situational').change((event) => {
|
|
||||||
this.rollData.situational = event.currentTarget.value
|
|
||||||
})
|
|
||||||
html.find('#distanceBonusDice').change((event) => {
|
|
||||||
this.rollData.distanceBonusDice = Number(event.currentTarget.value)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,7 +42,7 @@ export class DarkStarsUtility {
|
|||||||
Handlebars.registerHelper('locationLabel', function (key) {
|
Handlebars.registerHelper('locationLabel', function (key) {
|
||||||
return __locationNames[key]
|
return __locationNames[key]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
this.gameSettings()
|
this.gameSettings()
|
||||||
|
|
||||||
@@ -50,22 +50,6 @@ export class DarkStarsUtility {
|
|||||||
|
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
static gameSettings() {
|
static gameSettings() {
|
||||||
/*game.settings.register("fvtt-dark-stars", "dice-color-skill", {
|
|
||||||
name: "Dice color for skills",
|
|
||||||
hint: "Set the dice color for skills",
|
|
||||||
scope: "world",
|
|
||||||
config: true,
|
|
||||||
requiresReload: true ,
|
|
||||||
default: "#101010",
|
|
||||||
type: String
|
|
||||||
})
|
|
||||||
|
|
||||||
Hooks.on('renderSettingsConfig', (event) => {
|
|
||||||
const element = event.element[0].querySelector(`[name='fvtt-dark-stars.dice-color-skill']`)
|
|
||||||
if (!element) return
|
|
||||||
// Replace placeholder element
|
|
||||||
console.log("Element Found !!!!")
|
|
||||||
}) */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
@@ -103,26 +87,16 @@ export class DarkStarsUtility {
|
|||||||
static async chatListeners(html) {
|
static async chatListeners(html) {
|
||||||
|
|
||||||
html.on("click", '.view-item-from-chat', event => {
|
html.on("click", '.view-item-from-chat', event => {
|
||||||
game.system.crucible.creator.openItemView(event)
|
game.system.darkstars.creator.openItemView(event)
|
||||||
})
|
})
|
||||||
html.on("click", '.roll-defense-melee', event => {
|
html.on("click", '.chat-reroll', event => {
|
||||||
let rollId = $(event.currentTarget).data("roll-id")
|
let messageId = this.findChatMessageId(event.currentTarget)
|
||||||
let rollData = DarkStarsUtility.getRollData(rollId)
|
let message = game.messages.get(messageId)
|
||||||
rollData.defenseWeaponId = $(event.currentTarget).data("defense-weapon-id")
|
let rollData = message.getFlag("world", "darkstars-roll-data")
|
||||||
let actor = game.canvas.tokens.get(rollData.defenderTokenId).actor
|
rollData.reroll = true
|
||||||
if (actor && (game.user.isGM || actor.isOwner)) {
|
rollData.roll = undefined
|
||||||
actor.rollDefenseMelee(rollData)
|
this.rollDarkStars(rollData)
|
||||||
}
|
|
||||||
})
|
})
|
||||||
html.on("click", '.roll-defense-ranged', event => {
|
|
||||||
let rollId = $(event.currentTarget).data("roll-id")
|
|
||||||
let rollData = DarkStarsUtility.getRollData(rollId)
|
|
||||||
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
|
|
||||||
if (defender && (game.user.isGM || defender.isOwner)) {
|
|
||||||
defender.rollDefenseRanged(rollData)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -265,176 +239,97 @@ export class DarkStarsUtility {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getAimingMalus(location) {
|
||||||
|
if (location == "arm" || location == "head") {
|
||||||
|
return -50
|
||||||
|
}
|
||||||
|
if (location == "torso" || location == "leg") {
|
||||||
|
return -30
|
||||||
|
}
|
||||||
|
if (location == "hand") {
|
||||||
|
return -70
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getAimingLocation(roll) {
|
||||||
|
if (roll == 1) return "head"
|
||||||
|
if (roll >= 2 && roll <= 4) return "chest"
|
||||||
|
if (roll >= 5 && roll <= 6) return "abdomen"
|
||||||
|
if (roll == 7) return "leftarm"
|
||||||
|
if (roll == 8) return "rightarm"
|
||||||
|
if (roll == 9) return "rightleg"
|
||||||
|
if (roll == 10) return "leftleg"
|
||||||
|
return "abdomen"
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static locationMultiplier(location) {
|
||||||
|
if (location == "head") return 0.3
|
||||||
|
if (location.includes("arm")) return 0.2
|
||||||
|
if (location.includes("leg")) return 0.4
|
||||||
|
if (location == "chest") return 0.5
|
||||||
|
return 0.3 // Abdomen case
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async rollDarkStars(rollData) {
|
static async rollDarkStars(rollData) {
|
||||||
|
|
||||||
let actor = game.actors.get(rollData.actorId)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
|
|
||||||
// ability/save/size => 0
|
// ability/save/size => 0
|
||||||
let diceFormula
|
rollData.percentValue = 0
|
||||||
let startFormula = "0d6cs>=5[blue]"
|
|
||||||
if (rollData.ability) {
|
|
||||||
startFormula = String(rollData.ability.value) + "d6cs>=5[blue]"
|
|
||||||
}
|
|
||||||
if (rollData.save) {
|
|
||||||
startFormula = String(rollData.save.value) + "d6cs>=5[blue]"
|
|
||||||
}
|
|
||||||
if (rollData.sizeDice) {
|
|
||||||
let nb = rollData.sizeDice.nb + rollData.distanceBonusDice + this.getDiceFromCover(rollData.hasCover) + this.getDiceFromSituational(rollData.situational)
|
|
||||||
startFormula = String(nb) + String(rollData.sizeDice.dice) + "cs>=5[blue]"
|
|
||||||
}
|
|
||||||
diceFormula = startFormula
|
|
||||||
|
|
||||||
// skill => 2
|
|
||||||
// feat => 4
|
|
||||||
// bonus => 6
|
|
||||||
if (rollData.skill) {
|
if (rollData.skill) {
|
||||||
let level = rollData.skill.system.level
|
rollData.percentValue = rollData.skill.total
|
||||||
if (rollData.skill.system.issl2) {
|
}
|
||||||
rollData.hasSLBonus = true
|
rollData.percentValue += rollData.bonusMalus
|
||||||
level += 2
|
rollData.diceFormula = "1d100"
|
||||||
if (level > 7) { level = 7 }
|
|
||||||
}
|
|
||||||
rollData.skill.system.skilldice = __skillLevel2Dice[level]
|
|
||||||
diceFormula += "+" + String(rollData.skill.system.skilldice) + "cs>=5[black]"
|
|
||||||
|
|
||||||
if (rollData.skill.system.skilltype == "complex" && rollData.skill.system.level == 0) {
|
if (rollData.isAboveEffectiveRange) {
|
||||||
rollData.complexSkillDisadvantage = true
|
rollData.percentValue -= 30
|
||||||
rollData.rollAdvantage = "roll-disadvantage"
|
rollData.percentValue = Math.max(0, rollData.percentValue)
|
||||||
}
|
|
||||||
|
|
||||||
if (rollData.skill.system.isfeatdie) {
|
|
||||||
rollData.hasFeatDie = true
|
|
||||||
diceFormula += "+ 1d10cs>=5[dark-stars-purple]"
|
|
||||||
} else {
|
|
||||||
diceFormula += `+ 0d10cs>=5[dark-stars-purple]`
|
|
||||||
}
|
|
||||||
if (rollData.skill.system.bonusdice != "none") {
|
|
||||||
rollData.hasBonusDice = rollData.skill.system.bonusdice
|
|
||||||
diceFormula += `+ ${rollData.hasBonusDice}cs>=5[black]`
|
|
||||||
} else {
|
|
||||||
diceFormula += `+ 0d6cs>=5[black]`
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
diceFormula += `+ 0d8cs=>5 + 0d10cs>=5 + 0d6cs>=5`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// advantage => 8
|
if (rollData.mode == "weapon") {
|
||||||
let advFormula = "+ 0d8cs>=5"
|
rollData.locationMalus = this.getAimingMalus(rollData.weaponAiming)
|
||||||
if (rollData.advantage == "advantage1" || rollData.forceAdvantage) {
|
rollData.percentValue += rollData.locationMalus
|
||||||
advFormula = "+ 1d8cs>=5[dark-stars-darkgreen]"
|
|
||||||
}
|
}
|
||||||
if (rollData.advantage == "advantage2") {
|
|
||||||
advFormula = "+ 2d8cs>=5[dark-stars-darkgreen]"
|
|
||||||
}
|
|
||||||
diceFormula += advFormula
|
|
||||||
|
|
||||||
// disadvantage => 10
|
|
||||||
let disFormula = "- 0d8cs>=5"
|
|
||||||
if (rollData.disadvantage == "disadvantage1" || rollData.forceDisadvantage) {
|
|
||||||
disFormula = "- 1d8cs>=5[red]"
|
|
||||||
}
|
|
||||||
if (rollData.disadvantage == "disadvantage2") {
|
|
||||||
disFormula = "- 2d8cs>=5[red]"
|
|
||||||
}
|
|
||||||
diceFormula += disFormula
|
|
||||||
|
|
||||||
// armor => 12
|
|
||||||
let skillArmorPenalty = 0
|
|
||||||
for (let armor of rollData.armors) {
|
|
||||||
if (armor.system.equipped) {
|
|
||||||
skillArmorPenalty += armor.system.skillpenalty
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (rollData.skill && rollData.skill.system.armorpenalty && skillArmorPenalty > 0) {
|
|
||||||
rollData.skillArmorPenalty = skillArmorPenalty
|
|
||||||
diceFormula += `- ${skillArmorPenalty}d8cs>=5`
|
|
||||||
} else {
|
|
||||||
diceFormula += `- 0d8cs>=5`
|
|
||||||
}
|
|
||||||
|
|
||||||
// shield => 14
|
|
||||||
if (rollData.useshield && rollData.shield) {
|
|
||||||
diceFormula += "+ 1" + String(rollData.shield.system.shielddie) + "cs>=5[yellow]"
|
|
||||||
} else {
|
|
||||||
diceFormula += " + 0d6cs>=5"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Performs roll
|
// Performs roll
|
||||||
console.log("Roll formula", diceFormula)
|
console.log("Roll formula", rollData.diceFormula)
|
||||||
let myRoll = rollData.roll
|
let myRoll = rollData.roll
|
||||||
if (!myRoll) { // New rolls only of no rerolls
|
if (!myRoll) { // New rolls only of no rerolls
|
||||||
myRoll = new Roll(diceFormula).roll({ async: false })
|
myRoll = new Roll(rollData.diceFormula).roll({ async: false })
|
||||||
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
|
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
|
||||||
}
|
}
|
||||||
rollData.rollOrder = 0
|
rollData.roll = duplicate(myRoll)
|
||||||
rollData.roll = myRoll
|
rollData.diceResult = myRoll.total
|
||||||
rollData.nbSuccess = myRoll.total
|
rollData.isCriticalSuccess = rollData.diceResult <= rollData.skill.derivated.value
|
||||||
|
rollData.isCriticalFailure = rollData.diceResult == 100
|
||||||
|
rollData.isSuccess = rollData.diceResult == 1 || rollData.diceResult <= rollData.percentValue
|
||||||
|
rollData.isFailure = rollData.diceResult == 100 || rollData.diceResult > rollData.percentValue
|
||||||
|
rollData.degrees = Math.floor(rollData.percentValue / 10) - Math.floor(rollData.diceResult / 10)
|
||||||
|
rollData.damageMultiplier = rollData.isCriticalSuccess ? 2 : 1
|
||||||
|
|
||||||
if (rollData.rollAdvantage == "none" && rollData.forceRollAdvantage) {
|
if (rollData.reroll) {
|
||||||
rollData.rollAdvantage = "roll-advantage"
|
actor.modifyRerolls(-1)
|
||||||
|
rollData.rerolls = 0 // DIsable rerolls
|
||||||
}
|
}
|
||||||
if (rollData.rollAdvantage == "none" && rollData.forceRollDisadvantage) {
|
|
||||||
rollData.rollAdvantage = "roll-disadvantage"
|
|
||||||
}
|
|
||||||
if (rollData.rollAdvantage != "none") {
|
|
||||||
|
|
||||||
rollData.rollOrder = 1
|
if (rollData.mode == "weapon") {
|
||||||
rollData.rollType = (rollData.rollAdvantage == "roll-advantage") ? "Advantage" : "Disadvantage"
|
if (rollData.weaponAiming == "none") {
|
||||||
this.createChatWithRollMode(rollData.alias, {
|
let rollLoc = new Roll("1d10").roll({ async: false })
|
||||||
content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat-generic-result.hbs`, rollData)
|
rollData.weaponAiming = this.getAimingLocation(rollLoc.total)
|
||||||
})
|
|
||||||
|
|
||||||
rollData.rollOrder = 2
|
|
||||||
let myRoll2 = new Roll(diceFormula).roll({ async: false })
|
|
||||||
await this.showDiceSoNice(myRoll2, game.settings.get("core", "rollMode"))
|
|
||||||
|
|
||||||
rollData.roll = myRoll2 // Tmp switch to display the proper results
|
|
||||||
rollData.nbSuccess = myRoll2.total
|
|
||||||
this.createChatWithRollMode(rollData.alias, {
|
|
||||||
content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat-generic-result.hbs`, rollData)
|
|
||||||
})
|
|
||||||
rollData.roll = myRoll // Revert the tmp switch
|
|
||||||
rollData.nbSuccess = myRoll.total
|
|
||||||
|
|
||||||
if (rollData.rollAdvantage == "roll-advantage") {
|
|
||||||
if (myRoll2.total > rollData.nbSuccess) {
|
|
||||||
hasChanged = true
|
|
||||||
rollData.roll = myRoll2
|
|
||||||
rollData.nbSuccess = myRoll2.total
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (myRoll2.total < rollData.nbSuccess) {
|
|
||||||
rollData.roll = myRoll2
|
|
||||||
rollData.nbSuccess = myRoll2.total
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
rollData.rollOrder = 3
|
// Compute
|
||||||
|
rollData.locationMultiplier = this.locationMultiplier(rollData.weaponAiming)
|
||||||
}
|
}
|
||||||
rollData.nbSuccess = Math.max(0, rollData.nbSuccess)
|
|
||||||
|
let msg = await this.createChatWithRollMode(rollData.alias, {
|
||||||
rollData.isFirstRollAdvantage = false
|
content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat/chat-generic-result.hbs`, rollData)
|
||||||
// Manage exp
|
|
||||||
if (rollData.skill && rollData.skill.system.level > 0) {
|
|
||||||
let nbSkillSuccess = rollData.roll.terms[2].total
|
|
||||||
if (nbSkillSuccess == 0 || nbSkillSuccess == rollData.skill.system.level) {
|
|
||||||
actor.incrementSkillExp(rollData.skill.id, 1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.saveRollData(rollData)
|
|
||||||
actor.lastRoll = rollData
|
|
||||||
|
|
||||||
this.createChatWithRollMode(rollData.alias, {
|
|
||||||
content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat-generic-result.hbs`, rollData)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log("Rolldata result", rollData)
|
console.log("Rolldata result", rollData)
|
||||||
|
msg.setFlag("world", "darkstars-roll-data", rollData)
|
||||||
// Message response
|
|
||||||
this.displayDefenseMessage(rollData)
|
|
||||||
|
|
||||||
// Manage defense result
|
|
||||||
this.processAttackDefense(rollData)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -528,7 +423,7 @@ export class DarkStarsUtility {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
chatOptions.alias = chatOptions.alias || name;
|
chatOptions.alias = chatOptions.alias || name;
|
||||||
ChatMessage.create(chatOptions);
|
return ChatMessage.create(chatOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -536,7 +431,9 @@ export class DarkStarsUtility {
|
|||||||
let rollData = {
|
let rollData = {
|
||||||
rollId: randomID(16),
|
rollId: randomID(16),
|
||||||
rollMode: game.settings.get("core", "rollMode"),
|
rollMode: game.settings.get("core", "rollMode"),
|
||||||
advantage: "none"
|
bonusMalus: 0,
|
||||||
|
isAboveEffectiveRange: false,
|
||||||
|
weaponAiming: "none"
|
||||||
}
|
}
|
||||||
DarkStarsUtility.updateWithTarget(rollData)
|
DarkStarsUtility.updateWithTarget(rollData)
|
||||||
return rollData
|
return rollData
|
||||||
@@ -552,7 +449,7 @@ export class DarkStarsUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static createChatWithRollMode(name, chatOptions) {
|
static createChatWithRollMode(name, chatOptions) {
|
||||||
this.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions)
|
return this.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|||||||
6
packs/.directory
Normal file
6
packs/.directory
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[Dolphin]
|
||||||
|
HeaderColumnWidths=301,118,148,122
|
||||||
|
Timestamp=2024,1,26,8,35,29.906
|
||||||
|
Version=4
|
||||||
|
ViewMode=1
|
||||||
|
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails
|
||||||
BIN
packs/aldebaran/000119.ldb
Normal file
BIN
packs/aldebaran/000119.ldb
Normal file
Binary file not shown.
1
packs/aldebaran/CURRENT
Normal file
1
packs/aldebaran/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000144
|
||||||
7
packs/aldebaran/LOG
Normal file
7
packs/aldebaran/LOG
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
2024/01/26-16:45:12.312299 7ff6b6ffd6c0 Recovering log #142
|
||||||
|
2024/01/26-16:45:12.322762 7ff6b6ffd6c0 Delete type=3 #140
|
||||||
|
2024/01/26-16:45:12.322811 7ff6b6ffd6c0 Delete type=0 #142
|
||||||
|
2024/01/26-16:46:20.748825 7ff4363ff6c0 Level-0 table #147: started
|
||||||
|
2024/01/26-16:46:20.748854 7ff4363ff6c0 Level-0 table #147: 0 bytes OK
|
||||||
|
2024/01/26-16:46:20.756106 7ff4363ff6c0 Delete type=0 #145
|
||||||
|
2024/01/26-16:46:20.775694 7ff4363ff6c0 Manual compaction at level-0 from '!folders!MA6uFJMVebGeayIk' @ 72057594037927935 : 1 .. '!items!zhjdppKgrON7wJn7' @ 0 : 0; will stop at (end)
|
||||||
7
packs/aldebaran/LOG.old
Normal file
7
packs/aldebaran/LOG.old
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
2024/01/26-16:44:01.373547 7ff6b77fe6c0 Recovering log #138
|
||||||
|
2024/01/26-16:44:01.382908 7ff6b77fe6c0 Delete type=3 #136
|
||||||
|
2024/01/26-16:44:01.382992 7ff6b77fe6c0 Delete type=0 #138
|
||||||
|
2024/01/26-16:44:52.254620 7ff4363ff6c0 Level-0 table #143: started
|
||||||
|
2024/01/26-16:44:52.254645 7ff4363ff6c0 Level-0 table #143: 0 bytes OK
|
||||||
|
2024/01/26-16:44:52.261346 7ff4363ff6c0 Delete type=0 #141
|
||||||
|
2024/01/26-16:44:52.280720 7ff4363ff6c0 Manual compaction at level-0 from '!folders!MA6uFJMVebGeayIk' @ 72057594037927935 : 1 .. '!items!zhjdppKgrON7wJn7' @ 0 : 0; will stop at (end)
|
||||||
BIN
packs/aldebaran/MANIFEST-000144
Normal file
BIN
packs/aldebaran/MANIFEST-000144
Normal file
Binary file not shown.
@@ -1,15 +0,0 @@
|
|||||||
{"name":"Neo Soviet Hard Shell","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Cermetal 2","locations":{"head":{"protected":true,"max":30,"value":0},"abdomen":{"protected":true,"max":30,"value":0},"chest":{"protected":true,"max":30,"value":0},"leftleg":{"protected":true,"max":30,"value":0},"rightleg":{"protected":true,"max":30,"value":0},"leftarm":{"protected":true,"max":30,"value":0},"rightarm":{"protected":false,"max":0,"value":0}},"si":2,"skillbonus":"","availability":"P","equipped":false,"bulk":0,"cost":null,"description":"<p>Blocks 12 sieverts per hour. If it receives more than 12 sieverts per hour, after use must be destroyed.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.DndZ0pCGyR8y8SJK"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672108403022,"modifiedTime":1672108686724,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"3O3MjRkrmX4HeaPY"}
|
|
||||||
{"name":"Marine Armour","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Cermetal","locations":{"head":{"protected":true,"max":20,"value":0},"abdomen":{"protected":true,"max":20,"value":0},"chest":{"protected":true,"max":20,"value":0},"leftleg":{"protected":true,"max":16,"value":0},"rightleg":{"protected":true,"max":16,"value":0},"leftarm":{"protected":true,"max":16,"value":0},"rightarm":{"protected":true,"max":16,"value":0}},"si":1,"skillbonus":"","availability":"P","equipped":false,"bulk":0,"cost":null,"description":"<p>Marine Armour Includes comm and integral PCM, quick repair.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.gCMeXdaHyaNcfHHl"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672092447361,"modifiedTime":1672108683847,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"3YqWrfVwifB9S1Gm"}
|
|
||||||
{"name":"Security Helmet","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Ridgy Plast","locations":{"head":{"protected":true,"max":8,"value":0},"abdomen":{"protected":false,"max":0,"value":0},"chest":{"protected":false,"max":0,"value":0},"leftleg":{"protected":false,"max":0,"value":0},"rightleg":{"protected":false,"max":0,"value":0},"leftarm":{"protected":false,"max":0,"value":0},"rightarm":{"protected":false,"max":0,"value":0}},"si":0,"skillbonus":"","availability":"C","equipped":false,"bulk":0,"cost":null,"description":"<p>A high protection security helmet</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.iFryJgG9edVdkhG6"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672091636317,"modifiedTime":1672108691719,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"5FuYpmCKk28QGqwR"}
|
|
||||||
{"name":"Heavy Jacket","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Flexi Plast","locations":{"head":{"protected":false,"max":0,"value":0},"abdomen":{"protected":true,"max":1,"value":0},"chest":{"protected":true,"max":1,"value":0},"leftleg":{"protected":false,"max":0,"value":0},"rightleg":{"protected":false,"max":0,"value":0},"leftarm":{"protected":true,"max":1,"value":0},"rightarm":{"protected":true,"max":1,"value":0}},"si":0,"skillbonus":"","availability":"C","equipped":false,"bulk":0,"cost":null,"description":"<p>Heavy Jacket flexi plast jacket, provides some protection small arms and knives.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.Lq6vGsSbxP5B5ZRu"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672091382680,"modifiedTime":1672108681860,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"8MZj41jbtAfDh6qU"}
|
|
||||||
{"name":"Yokohama Security Armour","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Cermetal 2","locations":{"head":{"protected":true,"max":30,"value":0},"abdomen":{"protected":true,"max":30,"value":0},"chest":{"protected":true,"max":30,"value":0},"leftleg":{"protected":true,"max":30,"value":0},"rightleg":{"protected":true,"max":30,"value":0},"leftarm":{"protected":true,"max":30,"value":0},"rightarm":{"protected":true,"max":30,"value":0}},"si":0,"skillbonus":"","availability":"R","equipped":false,"bulk":0,"cost":120000,"description":"<p>Yokohama Security Armour Blocks 14 sieverts per hour. If it receives more than 14 sieverts per hour, after use must be destroyed. </p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.UbZt9a1OXk9s5MMM"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672092872594,"modifiedTime":1672108709989,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"9MXqrbGCmj4wReOW"}
|
|
||||||
{"name":"Tycon Arms Defender","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Cermetal 2","locations":{"head":{"protected":true,"max":30,"value":0},"abdomen":{"protected":false,"max":0,"value":0},"chest":{"protected":false,"max":0,"value":0},"leftleg":{"protected":false,"max":0,"value":0},"rightleg":{"protected":false,"max":0,"value":0},"leftarm":{"protected":false,"max":0,"value":0},"rightarm":{"protected":false,"max":0,"value":0}},"si":0,"skillbonus":"","availability":"R","equipped":false,"bulk":0,"cost":35000,"description":"<p>Tycon Arms Defender helmet Comm, PCM, self sealing, space worthy. Blocks 8 sieverts per hour. If it receives more than 8 sieverts per hour, after use must be destroyed. 2 hours of life support. </p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.VhRHbN3AtY8Pwqdo"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672092595651,"modifiedTime":1672108701910,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"G2AnAOPyeQlWghN5"}
|
|
||||||
{"name":"Thebus Armoured Work Wear","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Flexi Plast","locations":{"head":{"protected":true,"max":5,"value":0},"abdomen":{"protected":true,"max":5,"value":0},"chest":{"protected":true,"max":5,"value":0},"leftleg":{"protected":true,"max":5,"value":0},"rightleg":{"protected":true,"max":5,"value":0},"leftarm":{"protected":true,"max":5,"value":0},"rightarm":{"protected":true,"max":5,"value":0}},"si":0,"skillbonus":"","availability":"C","equipped":false,"bulk":0,"cost":3000,"description":"<p>Thebus Armoured Work Wear provides +10% to all technical tests.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.8tfxeZcBJfxBsmIM"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672091984261,"modifiedTime":1672108699813,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"IHxpPrGqdl56dMpt"}
|
|
||||||
{"name":"YiggRiff Hard Shell","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Cermetal 2","locations":{"head":{"protected":true,"max":17,"value":0},"abdomen":{"protected":true,"max":17,"value":0},"chest":{"protected":true,"max":17,"value":0},"leftleg":{"protected":true,"max":17,"value":0},"rightleg":{"protected":true,"max":17,"value":0},"leftarm":{"protected":true,"max":17,"value":0},"rightarm":{"protected":true,"max":17,"value":0}},"si":2,"skillbonus":"","availability":"P","equipped":false,"bulk":0,"cost":15000,"description":"<p>Blocks 8 sieverts per hour. If it receives more than 8 sieverts per hour, after use must be destroyed.</p>\n<p> </p>\n<p> </p>\n<p> </p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.qTQIYUntdBFU1KLd"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672108514253,"modifiedTime":1672108705709,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"IQ7sj2hD5yh73TRx"}
|
|
||||||
{"name":"Skin Suit (environmentally sealed)","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Flexi Plast","locations":{"head":{"protected":true,"max":1,"value":0},"abdomen":{"protected":true,"max":1,"value":0},"chest":{"protected":true,"max":1,"value":0},"leftleg":{"protected":true,"max":1,"value":0},"rightleg":{"protected":true,"max":1,"value":0},"leftarm":{"protected":true,"max":1,"value":0},"rightarm":{"protected":true,"max":1,"value":0}},"si":0,"skillbonus":"","availability":"C","equipped":false,"bulk":0,"cost":500,"description":"<p>A thin layer of sealed armour primarly for environmental protection from toxins, low level radiation, and acid rain. Provides 10 hours of independant oxygen supply and lifesupport often worn under heavier armour. </p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.lUSc6c6D1tqSqojK"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672091705245,"modifiedTime":1672108693300,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"NJIXgxTSU3xTolyQ"}
|
|
||||||
{"name":"Raider Armour (scrounged together)","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Flexi Plast","locations":{"head":{"protected":true,"max":3,"value":0},"abdomen":{"protected":true,"max":3,"value":0},"chest":{"protected":true,"max":3,"value":0},"leftleg":{"protected":true,"max":2,"value":0},"rightleg":{"protected":true,"max":2,"value":0},"leftarm":{"protected":true,"max":2,"value":0},"rightarm":{"protected":true,"max":2,"value":0}},"si":0,"skillbonus":"","availability":"C","equipped":false,"bulk":0,"cost":800,"description":"<p>Raider armour is scrounged and contains off cuts and scrips from armour or tires, bits of plastic or metal. Can also be purchased as a gang suit manufactured by gangs in the mega cities. </p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.ZZK3R7s7NhuxjmUP"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672091485957,"modifiedTime":1672108688229,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"OnVLyi5Tz2Of7LCP"}
|
|
||||||
{"name":"Military Hard Shell","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Cermetal 2","locations":{"head":{"protected":true,"max":25,"value":0},"abdomen":{"protected":true,"max":25,"value":0},"chest":{"protected":true,"max":25,"value":0},"leftleg":{"protected":true,"max":25,"value":0},"rightleg":{"protected":true,"max":25,"value":0},"leftarm":{"protected":true,"max":25,"value":0},"rightarm":{"protected":true,"max":25,"value":0}},"si":2,"skillbonus":"","availability":"P","equipped":false,"bulk":0,"cost":null,"description":"<p>Military Hard Shell Blocks 10 sieverts per hour. If it receives more than 10 sieverts per hour, after use must be destroyed.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.UZ2CjvWmbIkFIj23"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672092706892,"modifiedTime":1672108685294,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"YXFJ4D4pJDoZWSw5"}
|
|
||||||
{"name":"Yokohama Mobile Security Suit","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"","locations":{"head":{"protected":true,"max":15,"value":0},"abdomen":{"protected":true,"max":15,"value":0},"chest":{"protected":true,"max":15,"value":0},"leftleg":{"protected":true,"max":15,"value":0},"rightleg":{"protected":true,"max":15,"value":0},"leftarm":{"protected":true,"max":15,"value":0},"rightarm":{"protected":true,"max":15,"value":0}},"si":0,"skillbonus":"","availability":"C","equipped":false,"bulk":0,"cost":null,"description":"<p>Yokohama Mobile Security Suit provides +10% intimidation.<br><br></p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.dKcY7rwZY3XewoAW"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672092155187,"modifiedTime":1672108708302,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"eNEC6AHRYrwGgS6I"}
|
|
||||||
{"name":"Ridgy Security Armour","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Ridgy Plast","locations":{"head":{"protected":true,"max":12,"value":0},"abdomen":{"protected":true,"max":12,"value":0},"chest":{"protected":true,"max":12,"value":0},"leftleg":{"protected":true,"max":12,"value":0},"rightleg":{"protected":true,"max":12,"value":0},"leftarm":{"protected":true,"max":12,"value":0},"rightarm":{"protected":true,"max":12,"value":0}},"si":0,"skillbonus":"","availability":"C","equipped":false,"bulk":0,"cost":7000,"description":"<p>Ridgy Security Armour</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.DUcIIRnBywEYtE3c"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672092084700,"modifiedTime":1672108689908,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"pOhc7ydvFhJ29gvE"}
|
|
||||||
{"name":"Tycon Mobile Security Suit","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"Ridgy Plast","locations":{"head":{"protected":true,"max":15,"value":0},"abdomen":{"protected":true,"max":15,"value":0},"chest":{"protected":true,"max":15,"value":0},"leftleg":{"protected":true,"max":12,"value":0},"rightleg":{"protected":true,"max":12,"value":0},"leftarm":{"protected":true,"max":12,"value":0},"rightarm":{"protected":true,"max":12,"value":0}},"si":1,"skillbonus":"","availability":"C","equipped":false,"bulk":0,"cost":22000,"description":""},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.fDmEK9nfCtV3AVR2"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672092242012,"modifiedTime":1672108703462,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"pU3vlWEAWRamT58h"}
|
|
||||||
{"name":"Skin Suit Rad Proof (environmentally sealed)","type":"armor","img":"systems/fvtt-dark-stars/images/icons/armor.webp","system":{"armortype":"","locations":{"head":{"protected":true,"max":2,"value":0},"abdomen":{"protected":true,"max":2,"value":0},"chest":{"protected":true,"max":2,"value":0},"leftleg":{"protected":true,"max":2,"value":0},"rightleg":{"protected":true,"max":2,"value":0},"leftarm":{"protected":true,"max":2,"value":0},"rightarm":{"protected":true,"max":2,"value":0}},"si":0,"skillbonus":"","availability":"C","equipped":false,"bulk":0,"cost":null,"description":"<p>Skin Suit Rad Proof (environmentally sealed)</p>\n<p>10 hours life support, often worn under armour. Blocks 5 sieverts per hour. If it receives more than 5 sieverts per hour, after use must be destroyed.</p>"},"effects":[],"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3},"flags":{"core":{"sourceId":"Item.Q156jztUqVkicxaF"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672091868386,"modifiedTime":1672108697085,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"folder":null,"sort":0,"_id":"q9JGWL4y4udYrzvD"}
|
|
||||||
BIN
packs/armor/000186.ldb
Normal file
BIN
packs/armor/000186.ldb
Normal file
Binary file not shown.
1
packs/armor/CURRENT
Normal file
1
packs/armor/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000191
|
||||||
8
packs/armor/LOG
Normal file
8
packs/armor/LOG
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2024/01/26-16:45:12.176273 7ff6b7fff6c0 Recovering log #189
|
||||||
|
2024/01/26-16:45:12.186033 7ff6b7fff6c0 Delete type=3 #187
|
||||||
|
2024/01/26-16:45:12.186075 7ff6b7fff6c0 Delete type=0 #189
|
||||||
|
2024/01/26-16:46:20.675233 7ff4363ff6c0 Level-0 table #194: started
|
||||||
|
2024/01/26-16:46:20.675253 7ff4363ff6c0 Level-0 table #194: 0 bytes OK
|
||||||
|
2024/01/26-16:46:20.681449 7ff4363ff6c0 Delete type=0 #192
|
||||||
|
2024/01/26-16:46:20.687750 7ff4363ff6c0 Manual compaction at level-0 from '!items!0JWjCJaD6OOouqTj' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
|
||||||
|
2024/01/26-16:46:20.687788 7ff4363ff6c0 Manual compaction at level-1 from '!items!0JWjCJaD6OOouqTj' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
|
||||||
8
packs/armor/LOG.old
Normal file
8
packs/armor/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2024/01/26-16:44:01.246989 7ff6ccbfa6c0 Recovering log #184
|
||||||
|
2024/01/26-16:44:01.256586 7ff6ccbfa6c0 Delete type=3 #182
|
||||||
|
2024/01/26-16:44:01.256664 7ff6ccbfa6c0 Delete type=0 #184
|
||||||
|
2024/01/26-16:44:52.188290 7ff4363ff6c0 Level-0 table #190: started
|
||||||
|
2024/01/26-16:44:52.188318 7ff4363ff6c0 Level-0 table #190: 0 bytes OK
|
||||||
|
2024/01/26-16:44:52.195202 7ff4363ff6c0 Delete type=0 #188
|
||||||
|
2024/01/26-16:44:52.201491 7ff4363ff6c0 Manual compaction at level-0 from '!items!0JWjCJaD6OOouqTj' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
|
||||||
|
2024/01/26-16:44:52.201541 7ff4363ff6c0 Manual compaction at level-1 from '!items!0JWjCJaD6OOouqTj' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
|
||||||
BIN
packs/armor/MANIFEST-000191
Normal file
BIN
packs/armor/MANIFEST-000191
Normal file
Binary file not shown.
BIN
packs/beyondtheblacksea/000124.ldb
Normal file
BIN
packs/beyondtheblacksea/000124.ldb
Normal file
Binary file not shown.
1
packs/beyondtheblacksea/CURRENT
Normal file
1
packs/beyondtheblacksea/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000137
|
||||||
0
packs/beyondtheblacksea/LOCK
Normal file
0
packs/beyondtheblacksea/LOCK
Normal file
7
packs/beyondtheblacksea/LOG
Normal file
7
packs/beyondtheblacksea/LOG
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
2024/01/26-16:45:12.325158 7ff6b7fff6c0 Recovering log #135
|
||||||
|
2024/01/26-16:45:12.335499 7ff6b7fff6c0 Delete type=3 #133
|
||||||
|
2024/01/26-16:45:12.335563 7ff6b7fff6c0 Delete type=0 #135
|
||||||
|
2024/01/26-16:46:20.756265 7ff4363ff6c0 Level-0 table #140: started
|
||||||
|
2024/01/26-16:46:20.756302 7ff4363ff6c0 Level-0 table #140: 0 bytes OK
|
||||||
|
2024/01/26-16:46:20.762494 7ff4363ff6c0 Delete type=0 #138
|
||||||
|
2024/01/26-16:46:20.775705 7ff4363ff6c0 Manual compaction at level-0 from '!folders!47aGmBuk1mHtbFFU' @ 72057594037927935 : 1 .. '!items!zwMpjsE84sk26eej' @ 0 : 0; will stop at (end)
|
||||||
7
packs/beyondtheblacksea/LOG.old
Normal file
7
packs/beyondtheblacksea/LOG.old
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
2024/01/26-16:44:01.386535 7ff6b6ffd6c0 Recovering log #131
|
||||||
|
2024/01/26-16:44:01.397538 7ff6b6ffd6c0 Delete type=3 #129
|
||||||
|
2024/01/26-16:44:01.397640 7ff6b6ffd6c0 Delete type=0 #131
|
||||||
|
2024/01/26-16:44:52.261471 7ff4363ff6c0 Level-0 table #136: started
|
||||||
|
2024/01/26-16:44:52.261497 7ff4363ff6c0 Level-0 table #136: 0 bytes OK
|
||||||
|
2024/01/26-16:44:52.267579 7ff4363ff6c0 Delete type=0 #134
|
||||||
|
2024/01/26-16:44:52.280736 7ff4363ff6c0 Manual compaction at level-0 from '!folders!47aGmBuk1mHtbFFU' @ 72057594037927935 : 1 .. '!items!zwMpjsE84sk26eej' @ 0 : 0; will stop at (end)
|
||||||
BIN
packs/beyondtheblacksea/MANIFEST-000137
Normal file
BIN
packs/beyondtheblacksea/MANIFEST-000137
Normal file
Binary file not shown.
0
packs/conditions/000192.log
Normal file
0
packs/conditions/000192.log
Normal file
1
packs/conditions/CURRENT
Normal file
1
packs/conditions/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000190
|
||||||
0
packs/conditions/LOCK
Normal file
0
packs/conditions/LOCK
Normal file
7
packs/conditions/LOG
Normal file
7
packs/conditions/LOG
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
2024/01/26-16:45:12.225313 7ff6b7fff6c0 Recovering log #188
|
||||||
|
2024/01/26-16:45:12.234683 7ff6b7fff6c0 Delete type=3 #186
|
||||||
|
2024/01/26-16:45:12.234894 7ff6b7fff6c0 Delete type=0 #188
|
||||||
|
2024/01/26-16:46:20.695766 7ff4363ff6c0 Level-0 table #193: started
|
||||||
|
2024/01/26-16:46:20.695812 7ff4363ff6c0 Level-0 table #193: 0 bytes OK
|
||||||
|
2024/01/26-16:46:20.702115 7ff4363ff6c0 Delete type=0 #191
|
||||||
|
2024/01/26-16:46:20.715382 7ff4363ff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
7
packs/conditions/LOG.old
Normal file
7
packs/conditions/LOG.old
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
2024/01/26-16:44:01.298464 7ff6ccbfa6c0 Recovering log #184
|
||||||
|
2024/01/26-16:44:01.307852 7ff6ccbfa6c0 Delete type=3 #182
|
||||||
|
2024/01/26-16:44:01.307891 7ff6ccbfa6c0 Delete type=0 #184
|
||||||
|
2024/01/26-16:44:52.214766 7ff4363ff6c0 Level-0 table #189: started
|
||||||
|
2024/01/26-16:44:52.214786 7ff4363ff6c0 Level-0 table #189: 0 bytes OK
|
||||||
|
2024/01/26-16:44:52.221197 7ff4363ff6c0 Delete type=0 #187
|
||||||
|
2024/01/26-16:44:52.227824 7ff4363ff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
BIN
packs/conditions/MANIFEST-000190
Normal file
BIN
packs/conditions/MANIFEST-000190
Normal file
Binary file not shown.
0
packs/currency/000192.log
Normal file
0
packs/currency/000192.log
Normal file
1
packs/currency/CURRENT
Normal file
1
packs/currency/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000190
|
||||||
0
packs/currency/LOCK
Normal file
0
packs/currency/LOCK
Normal file
7
packs/currency/LOG
Normal file
7
packs/currency/LOG
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
2024/01/26-16:45:12.236796 7ff6ccbfa6c0 Recovering log #188
|
||||||
|
2024/01/26-16:45:12.247179 7ff6ccbfa6c0 Delete type=3 #186
|
||||||
|
2024/01/26-16:45:12.247261 7ff6ccbfa6c0 Delete type=0 #188
|
||||||
|
2024/01/26-16:46:20.708975 7ff4363ff6c0 Level-0 table #193: started
|
||||||
|
2024/01/26-16:46:20.709012 7ff4363ff6c0 Level-0 table #193: 0 bytes OK
|
||||||
|
2024/01/26-16:46:20.715289 7ff4363ff6c0 Delete type=0 #191
|
||||||
|
2024/01/26-16:46:20.715398 7ff4363ff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
7
packs/currency/LOG.old
Normal file
7
packs/currency/LOG.old
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
2024/01/26-16:44:01.309674 7ff6b7fff6c0 Recovering log #184
|
||||||
|
2024/01/26-16:44:01.320294 7ff6b7fff6c0 Delete type=3 #182
|
||||||
|
2024/01/26-16:44:01.320644 7ff6b7fff6c0 Delete type=0 #184
|
||||||
|
2024/01/26-16:44:52.221291 7ff4363ff6c0 Level-0 table #189: started
|
||||||
|
2024/01/26-16:44:52.221313 7ff4363ff6c0 Level-0 table #189: 0 bytes OK
|
||||||
|
2024/01/26-16:44:52.227729 7ff4363ff6c0 Delete type=0 #187
|
||||||
|
2024/01/26-16:44:52.227832 7ff4363ff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
BIN
packs/currency/MANIFEST-000190
Normal file
BIN
packs/currency/MANIFEST-000190
Normal file
Binary file not shown.
BIN
packs/cybernetics/000115.ldb
Normal file
BIN
packs/cybernetics/000115.ldb
Normal file
Binary file not shown.
0
packs/cybernetics/000122.log
Normal file
0
packs/cybernetics/000122.log
Normal file
1
packs/cybernetics/CURRENT
Normal file
1
packs/cybernetics/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000120
|
||||||
0
packs/cybernetics/LOCK
Normal file
0
packs/cybernetics/LOCK
Normal file
8
packs/cybernetics/LOG
Normal file
8
packs/cybernetics/LOG
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2024/01/26-16:45:12.272968 7ff6b7fff6c0 Recovering log #118
|
||||||
|
2024/01/26-16:45:12.283470 7ff6b7fff6c0 Delete type=3 #116
|
||||||
|
2024/01/26-16:45:12.283523 7ff6b7fff6c0 Delete type=0 #118
|
||||||
|
2024/01/26-16:46:20.735545 7ff4363ff6c0 Level-0 table #123: started
|
||||||
|
2024/01/26-16:46:20.735569 7ff4363ff6c0 Level-0 table #123: 0 bytes OK
|
||||||
|
2024/01/26-16:46:20.742205 7ff4363ff6c0 Delete type=0 #121
|
||||||
|
2024/01/26-16:46:20.748616 7ff4363ff6c0 Manual compaction at level-0 from '!items!0SbSmYdxJSlcNr6x' @ 72057594037927935 : 1 .. '!items!yyCPVVl8vmMOfPcN' @ 0 : 0; will stop at (end)
|
||||||
|
2024/01/26-16:46:20.748653 7ff4363ff6c0 Manual compaction at level-1 from '!items!0SbSmYdxJSlcNr6x' @ 72057594037927935 : 1 .. '!items!yyCPVVl8vmMOfPcN' @ 0 : 0; will stop at (end)
|
||||||
8
packs/cybernetics/LOG.old
Normal file
8
packs/cybernetics/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2024/01/26-16:44:01.346924 7ff6ccbfa6c0 Recovering log #113
|
||||||
|
2024/01/26-16:44:01.357987 7ff6ccbfa6c0 Delete type=3 #111
|
||||||
|
2024/01/26-16:44:01.358062 7ff6ccbfa6c0 Delete type=0 #113
|
||||||
|
2024/01/26-16:44:52.227918 7ff4363ff6c0 Level-0 table #119: started
|
||||||
|
2024/01/26-16:44:52.227939 7ff4363ff6c0 Level-0 table #119: 0 bytes OK
|
||||||
|
2024/01/26-16:44:52.233957 7ff4363ff6c0 Delete type=0 #117
|
||||||
|
2024/01/26-16:44:52.254451 7ff4363ff6c0 Manual compaction at level-0 from '!items!0SbSmYdxJSlcNr6x' @ 72057594037927935 : 1 .. '!items!yyCPVVl8vmMOfPcN' @ 0 : 0; will stop at (end)
|
||||||
|
2024/01/26-16:44:52.254483 7ff4363ff6c0 Manual compaction at level-1 from '!items!0SbSmYdxJSlcNr6x' @ 72057594037927935 : 1 .. '!items!yyCPVVl8vmMOfPcN' @ 0 : 0; will stop at (end)
|
||||||
BIN
packs/cybernetics/MANIFEST-000120
Normal file
BIN
packs/cybernetics/MANIFEST-000120
Normal file
Binary file not shown.
0
packs/darkstars-sf/000004.log
Normal file
0
packs/darkstars-sf/000004.log
Normal file
BIN
packs/darkstars-sf/000005.ldb
Normal file
BIN
packs/darkstars-sf/000005.ldb
Normal file
Binary file not shown.
1
packs/darkstars-sf/CURRENT
Normal file
1
packs/darkstars-sf/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000002
|
||||||
0
packs/darkstars-sf/LOCK
Normal file
0
packs/darkstars-sf/LOCK
Normal file
5
packs/darkstars-sf/LOG
Normal file
5
packs/darkstars-sf/LOG
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
2024/01/26-16:45:12.310498 7ff6b77fe6c0 Delete type=3 #1
|
||||||
|
2024/01/26-16:46:20.715565 7ff4363ff6c0 Level-0 table #5: started
|
||||||
|
2024/01/26-16:46:20.722812 7ff4363ff6c0 Level-0 table #5: 332133 bytes OK
|
||||||
|
2024/01/26-16:46:20.729100 7ff4363ff6c0 Delete type=0 #3
|
||||||
|
2024/01/26-16:46:20.748593 7ff4363ff6c0 Manual compaction at level-0 from '!folders!La3YsNYFddQnmsba' @ 72057594037927935 : 1 .. '!items!zzDfuUJpQzzz262R' @ 0 : 0; will stop at (end)
|
||||||
BIN
packs/darkstars-sf/MANIFEST-000002
Normal file
BIN
packs/darkstars-sf/MANIFEST-000002
Normal file
Binary file not shown.
BIN
packs/equipment/000186.ldb
Normal file
BIN
packs/equipment/000186.ldb
Normal file
Binary file not shown.
0
packs/equipment/000193.log
Normal file
0
packs/equipment/000193.log
Normal file
1
packs/equipment/CURRENT
Normal file
1
packs/equipment/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000191
|
||||||
0
packs/equipment/LOCK
Normal file
0
packs/equipment/LOCK
Normal file
8
packs/equipment/LOG
Normal file
8
packs/equipment/LOG
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2024/01/26-16:45:12.187737 7ff6ccbfa6c0 Recovering log #189
|
||||||
|
2024/01/26-16:45:12.198131 7ff6ccbfa6c0 Delete type=3 #187
|
||||||
|
2024/01/26-16:45:12.198196 7ff6ccbfa6c0 Delete type=0 #189
|
||||||
|
2024/01/26-16:46:20.662928 7ff4363ff6c0 Level-0 table #194: started
|
||||||
|
2024/01/26-16:46:20.662962 7ff4363ff6c0 Level-0 table #194: 0 bytes OK
|
||||||
|
2024/01/26-16:46:20.668889 7ff4363ff6c0 Delete type=0 #192
|
||||||
|
2024/01/26-16:46:20.675221 7ff4363ff6c0 Manual compaction at level-0 from '!items!05RVU3UcRabogEvL' @ 72057594037927935 : 1 .. '!items!zaxcUsWUZ1vvl0p8' @ 0 : 0; will stop at (end)
|
||||||
|
2024/01/26-16:46:20.687735 7ff4363ff6c0 Manual compaction at level-1 from '!items!05RVU3UcRabogEvL' @ 72057594037927935 : 1 .. '!items!zaxcUsWUZ1vvl0p8' @ 0 : 0; will stop at (end)
|
||||||
8
packs/equipment/LOG.old
Normal file
8
packs/equipment/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2024/01/26-16:44:01.259602 7ff6b7fff6c0 Recovering log #184
|
||||||
|
2024/01/26-16:44:01.270578 7ff6b7fff6c0 Delete type=3 #182
|
||||||
|
2024/01/26-16:44:01.270617 7ff6b7fff6c0 Delete type=0 #184
|
||||||
|
2024/01/26-16:44:52.195296 7ff4363ff6c0 Level-0 table #190: started
|
||||||
|
2024/01/26-16:44:52.195319 7ff4363ff6c0 Level-0 table #190: 0 bytes OK
|
||||||
|
2024/01/26-16:44:52.201363 7ff4363ff6c0 Delete type=0 #188
|
||||||
|
2024/01/26-16:44:52.201512 7ff4363ff6c0 Manual compaction at level-0 from '!items!05RVU3UcRabogEvL' @ 72057594037927935 : 1 .. '!items!zaxcUsWUZ1vvl0p8' @ 0 : 0; will stop at (end)
|
||||||
|
2024/01/26-16:44:52.201534 7ff4363ff6c0 Manual compaction at level-1 from '!items!05RVU3UcRabogEvL' @ 72057594037927935 : 1 .. '!items!zaxcUsWUZ1vvl0p8' @ 0 : 0; will stop at (end)
|
||||||
BIN
packs/equipment/MANIFEST-000191
Normal file
BIN
packs/equipment/MANIFEST-000191
Normal file
Binary file not shown.
BIN
packs/genetics/000014.ldb
Normal file
BIN
packs/genetics/000014.ldb
Normal file
Binary file not shown.
0
packs/genetics/000069.log
Normal file
0
packs/genetics/000069.log
Normal file
1
packs/genetics/CURRENT
Normal file
1
packs/genetics/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000067
|
||||||
0
packs/genetics/LOCK
Normal file
0
packs/genetics/LOCK
Normal file
8
packs/genetics/LOG
Normal file
8
packs/genetics/LOG
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2024/01/26-16:45:12.285582 7ff6ccbfa6c0 Recovering log #65
|
||||||
|
2024/01/26-16:45:12.295357 7ff6ccbfa6c0 Delete type=3 #63
|
||||||
|
2024/01/26-16:45:12.295414 7ff6ccbfa6c0 Delete type=0 #65
|
||||||
|
2024/01/26-16:46:20.742312 7ff4363ff6c0 Level-0 table #70: started
|
||||||
|
2024/01/26-16:46:20.742337 7ff4363ff6c0 Level-0 table #70: 0 bytes OK
|
||||||
|
2024/01/26-16:46:20.748489 7ff4363ff6c0 Delete type=0 #68
|
||||||
|
2024/01/26-16:46:20.748624 7ff4363ff6c0 Manual compaction at level-0 from '!items!56A3sVsiN7KI6a45' @ 72057594037927935 : 1 .. '!items!zJiASbV3QqH2oHb1' @ 0 : 0; will stop at (end)
|
||||||
|
2024/01/26-16:46:20.748645 7ff4363ff6c0 Manual compaction at level-1 from '!items!56A3sVsiN7KI6a45' @ 72057594037927935 : 1 .. '!items!zJiASbV3QqH2oHb1' @ 0 : 0; will stop at (end)
|
||||||
8
packs/genetics/LOG.old
Normal file
8
packs/genetics/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2024/01/26-16:44:01.360668 7ff6b7fff6c0 Recovering log #61
|
||||||
|
2024/01/26-16:44:01.371203 7ff6b7fff6c0 Delete type=3 #59
|
||||||
|
2024/01/26-16:44:01.371247 7ff6b7fff6c0 Delete type=0 #61
|
||||||
|
2024/01/26-16:44:52.248033 7ff4363ff6c0 Level-0 table #66: started
|
||||||
|
2024/01/26-16:44:52.248057 7ff4363ff6c0 Level-0 table #66: 0 bytes OK
|
||||||
|
2024/01/26-16:44:52.254324 7ff4363ff6c0 Delete type=0 #64
|
||||||
|
2024/01/26-16:44:52.254491 7ff4363ff6c0 Manual compaction at level-0 from '!items!56A3sVsiN7KI6a45' @ 72057594037927935 : 1 .. '!items!zJiASbV3QqH2oHb1' @ 0 : 0; will stop at (end)
|
||||||
|
2024/01/26-16:44:52.254513 7ff4363ff6c0 Manual compaction at level-1 from '!items!56A3sVsiN7KI6a45' @ 72057594037927935 : 1 .. '!items!zJiASbV3QqH2oHb1' @ 0 : 0; will stop at (end)
|
||||||
BIN
packs/genetics/MANIFEST-000067
Normal file
BIN
packs/genetics/MANIFEST-000067
Normal file
Binary file not shown.
BIN
packs/nightborough/000132.ldb
Normal file
BIN
packs/nightborough/000132.ldb
Normal file
Binary file not shown.
0
packs/nightborough/000159.log
Normal file
0
packs/nightborough/000159.log
Normal file
1
packs/nightborough/CURRENT
Normal file
1
packs/nightborough/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000157
|
||||||
0
packs/nightborough/LOCK
Normal file
0
packs/nightborough/LOCK
Normal file
7
packs/nightborough/LOG
Normal file
7
packs/nightborough/LOG
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
2024/01/26-16:45:12.339363 7ff6ccbfa6c0 Recovering log #155
|
||||||
|
2024/01/26-16:45:12.349148 7ff6ccbfa6c0 Delete type=3 #153
|
||||||
|
2024/01/26-16:45:12.349198 7ff6ccbfa6c0 Delete type=0 #155
|
||||||
|
2024/01/26-16:46:20.762584 7ff4363ff6c0 Level-0 table #160: started
|
||||||
|
2024/01/26-16:46:20.762605 7ff4363ff6c0 Level-0 table #160: 0 bytes OK
|
||||||
|
2024/01/26-16:46:20.769086 7ff4363ff6c0 Delete type=0 #158
|
||||||
|
2024/01/26-16:46:20.775714 7ff4363ff6c0 Manual compaction at level-0 from '!folders!2iZtDz80npHPIwkS' @ 72057594037927935 : 1 .. '!items!zyFR9C1jBTeFzbxg' @ 0 : 0; will stop at (end)
|
||||||
7
packs/nightborough/LOG.old
Normal file
7
packs/nightborough/LOG.old
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
2024/01/26-16:44:01.402829 7ff6ccbfa6c0 Recovering log #151
|
||||||
|
2024/01/26-16:44:01.413124 7ff6ccbfa6c0 Delete type=3 #149
|
||||||
|
2024/01/26-16:44:01.413220 7ff6ccbfa6c0 Delete type=0 #151
|
||||||
|
2024/01/26-16:44:52.267682 7ff4363ff6c0 Level-0 table #156: started
|
||||||
|
2024/01/26-16:44:52.267705 7ff4363ff6c0 Level-0 table #156: 0 bytes OK
|
||||||
|
2024/01/26-16:44:52.274231 7ff4363ff6c0 Delete type=0 #154
|
||||||
|
2024/01/26-16:44:52.280751 7ff4363ff6c0 Manual compaction at level-0 from '!folders!2iZtDz80npHPIwkS' @ 72057594037927935 : 1 .. '!items!zyFR9C1jBTeFzbxg' @ 0 : 0; will stop at (end)
|
||||||
BIN
packs/nightborough/MANIFEST-000157
Normal file
BIN
packs/nightborough/MANIFEST-000157
Normal file
Binary file not shown.
BIN
packs/perks/000186.ldb
Normal file
BIN
packs/perks/000186.ldb
Normal file
Binary file not shown.
0
packs/perks/000193.log
Normal file
0
packs/perks/000193.log
Normal file
1
packs/perks/CURRENT
Normal file
1
packs/perks/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000191
|
||||||
0
packs/perks/LOCK
Normal file
0
packs/perks/LOCK
Normal file
8
packs/perks/LOG
Normal file
8
packs/perks/LOG
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2024/01/26-16:45:12.261417 7ff6b6ffd6c0 Recovering log #189
|
||||||
|
2024/01/26-16:45:12.271000 7ff6b6ffd6c0 Delete type=3 #187
|
||||||
|
2024/01/26-16:45:12.271059 7ff6b6ffd6c0 Delete type=0 #189
|
||||||
|
2024/01/26-16:46:20.729362 7ff4363ff6c0 Level-0 table #194: started
|
||||||
|
2024/01/26-16:46:20.729409 7ff4363ff6c0 Level-0 table #194: 0 bytes OK
|
||||||
|
2024/01/26-16:46:20.735440 7ff4363ff6c0 Delete type=0 #192
|
||||||
|
2024/01/26-16:46:20.748607 7ff4363ff6c0 Manual compaction at level-0 from '!items!0K3CVEKsq67oKiYE' @ 72057594037927935 : 1 .. '!items!zwZoHMkWYtMCNx9f' @ 0 : 0; will stop at (end)
|
||||||
|
2024/01/26-16:46:20.748659 7ff4363ff6c0 Manual compaction at level-1 from '!items!0K3CVEKsq67oKiYE' @ 72057594037927935 : 1 .. '!items!zwZoHMkWYtMCNx9f' @ 0 : 0; will stop at (end)
|
||||||
8
packs/perks/LOG.old
Normal file
8
packs/perks/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2024/01/26-16:44:01.335406 7ff6b6ffd6c0 Recovering log #184
|
||||||
|
2024/01/26-16:44:01.344619 7ff6b6ffd6c0 Delete type=3 #182
|
||||||
|
2024/01/26-16:44:01.344656 7ff6b6ffd6c0 Delete type=0 #184
|
||||||
|
2024/01/26-16:44:52.241636 7ff4363ff6c0 Level-0 table #190: started
|
||||||
|
2024/01/26-16:44:52.241673 7ff4363ff6c0 Level-0 table #190: 0 bytes OK
|
||||||
|
2024/01/26-16:44:52.247808 7ff4363ff6c0 Delete type=0 #188
|
||||||
|
2024/01/26-16:44:52.254473 7ff4363ff6c0 Manual compaction at level-0 from '!items!0K3CVEKsq67oKiYE' @ 72057594037927935 : 1 .. '!items!zwZoHMkWYtMCNx9f' @ 0 : 0; will stop at (end)
|
||||||
|
2024/01/26-16:44:52.254505 7ff4363ff6c0 Manual compaction at level-1 from '!items!0K3CVEKsq67oKiYE' @ 72057594037927935 : 1 .. '!items!zwZoHMkWYtMCNx9f' @ 0 : 0; will stop at (end)
|
||||||
BIN
packs/perks/MANIFEST-000191
Normal file
BIN
packs/perks/MANIFEST-000191
Normal file
Binary file not shown.
0
packs/shields/000192.log
Normal file
0
packs/shields/000192.log
Normal file
1
packs/shields/CURRENT
Normal file
1
packs/shields/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000190
|
||||||
0
packs/shields/LOCK
Normal file
0
packs/shields/LOCK
Normal file
7
packs/shields/LOG
Normal file
7
packs/shields/LOG
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
2024/01/26-16:45:12.200180 7ff6b77fe6c0 Recovering log #188
|
||||||
|
2024/01/26-16:45:12.209905 7ff6b77fe6c0 Delete type=3 #186
|
||||||
|
2024/01/26-16:45:12.209960 7ff6b77fe6c0 Delete type=0 #188
|
||||||
|
2024/01/26-16:46:20.681529 7ff4363ff6c0 Level-0 table #193: started
|
||||||
|
2024/01/26-16:46:20.681551 7ff4363ff6c0 Level-0 table #193: 0 bytes OK
|
||||||
|
2024/01/26-16:46:20.687599 7ff4363ff6c0 Delete type=0 #191
|
||||||
|
2024/01/26-16:46:20.687763 7ff4363ff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
7
packs/shields/LOG.old
Normal file
7
packs/shields/LOG.old
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
2024/01/26-16:44:01.272823 7ff6b77fe6c0 Recovering log #184
|
||||||
|
2024/01/26-16:44:01.282074 7ff6b77fe6c0 Delete type=3 #182
|
||||||
|
2024/01/26-16:44:01.282112 7ff6b77fe6c0 Delete type=0 #184
|
||||||
|
2024/01/26-16:44:52.208441 7ff4363ff6c0 Level-0 table #189: started
|
||||||
|
2024/01/26-16:44:52.208462 7ff4363ff6c0 Level-0 table #189: 0 bytes OK
|
||||||
|
2024/01/26-16:44:52.214624 7ff4363ff6c0 Delete type=0 #187
|
||||||
|
2024/01/26-16:44:52.227817 7ff4363ff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
BIN
packs/shields/MANIFEST-000190
Normal file
BIN
packs/shields/MANIFEST-000190
Normal file
Binary file not shown.
@@ -1,23 +0,0 @@
|
|||||||
{"name":"Vehicle Weapons","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"csb","bonus":0,"used":false,"description":"<p>The character is skilled in the use of indirect and direct artillery including missiles, howitzers<br>and auto cannons, any vehicle weapons.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672086342604,"modifiedTime":1672086575155,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"5YJWuGaagmi1dgbv","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Engineering (Name of Field)","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"asb","bonus":0,"used":false,"description":"<p>The character has a university-level education in an Engineering skill chosen from the list<br>below. The character can design and direct construction in the field. For example, Sam has Engineering (Computer Systems) 60%. He decides to make a supercomputer out of several<br>desktop PCs – he can do this. Furthermore, he can direct people who can help him.</p>\n<p><br>Civil, Electrical and Power, Computer Systems, Naval and Life Support, Mechanical, Propulsion Systems, Architecture, Robotics & Mechatronics, Genetics, Cybernetic Design, Nanomachines, Weapons Systems, Personal Weapons and Armour Design.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672085548127,"modifiedTime":1672086575152,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"9a1riW3iSabgr4sH","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Basic Ground Navigation","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"asb","bonus":0,"used":false,"description":"<p>The character can navigate by map and compass, by land or sea. Navigation can be by the sun, stars or compass.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672085470278,"modifiedTime":1672086575152,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"ESvBNzSQ6UVa2Hdj","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Persuasion & Manipulation","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"ssb","bonus":0,"used":false,"description":"<p>The character can persuade others to do what he or she wants or to provide information. This<br>is non-violent persuasion. The game master may oppose the skill check using the NPC persuasion<br>skill. Role-playing well may provide a bonus to the use of this skill; however, not roleplaying may attract a penalty. This skill must be carefully refereed by the game master. Typical Persuasion checks may be used to ask someone for information or help in some way. It is not possible to persuade someone to knowingly harm themselves; however, it could be used to trick a person into doing something against their best interests. This skill is not mind control; it is careful persuasion. When a character chooses to manipulate a person, it is similar to persuasion; however, rather than truthful reasoning, manipulation is deceitful.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672085115239,"modifiedTime":1672086575153,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"EZV7SCG4WbkervUv","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Projectile Weapons","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"csb","bonus":0,"used":false,"description":"<p>The character is trained in the use and maintenance of projectile weapons like rifles, pistols and dart launchers. The character is trained in the use and maintenance of rail weapons like rail rifles, rail SMGs and rail assault weapons.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672086276980,"modifiedTime":1672086575154,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"I8HWWCwhF7R19u6x","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Speak & Read (Language)","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"ssb","bonus":0,"used":false,"description":"<p>Speak Language is used whenever a character is not very good at the dialect he or she is trying to communicate in. If the language skills of both participants total 50%, then communication is assured, and no Language roll is necessary.</p>\n<p>Reading a language allows the character to read and understand the written word. Characters may need to roll at the GM’s suggestion on their Speak and Read Language skill. Otherwise, understanding is assured. The following list of languages and scripts can be used, although there are of course more languages.<br><br>Spoken and Written Languages Examples<br>English, Spanish, Portuguese, Mandarin, Hindi, Chinese, German, Russian, Italian, Korean, Japanese.</p>"},"effects":[],"flags":{"core":{"sheetClass":"fvtt-dark-stars.DarkStarsItemSheet"}},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671852339032,"modifiedTime":1672086575154,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"IW0nw7bk83QQItjF","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Stealth","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"psb","bonus":0,"used":false,"description":"<p>The Stealth skill involves hiding, sneaking and generally moving without being detected by sound or sight. A roll is always required for this skill whenever it is attempted.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672085657806,"modifiedTime":1672086575154,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"JB8ItSbIQ4nnQk9U","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Heavy Weapons","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"csb","bonus":0,"used":false,"description":"<p>The character is skilled in the use of RPGs, grenade launchers and machine guns, and artillery pieces.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672086320348,"modifiedTime":1672086575154,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"JGtOg9mUP0pZievc","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Science (Name of Science)","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"asb","bonus":0,"used":false,"description":"<p>The character has a university-level education in a Science skill chosen from the list below.<br>Science skills are theoretical in nature. A Science skill can be used for an Engineering skill at half the value.</p>\n<p><br>Mathematics, Computer Science, Economics, Physics, Biology, Chemistry, Biochemistry, Medicine, Genetics, Archaeology, Astronomy, Geology, Psychology, Cybernetics, Pharmacology.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672085504870,"modifiedTime":1672086575153,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"O6Gxntfqt0hGXvYW","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Energy Weapons","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"csb","bonus":0,"used":false,"description":"<p>The character is trained in the use and maintenance of personal lasers, ion guns, neural stunners and plasma weapons.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672086249716,"modifiedTime":1672086575154,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"OB4khIPwWYlRXt6t","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Professional Skill (Name of Field/Role)","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"asb","bonus":0,"used":false,"description":"<p>A variety of professions, usually learned through apprenticeship. Professions are usually<br>skills that involve acquiring the resource or crafting items from resources.<br><br>Includes <br>Medicine, Surgery*, Pharmaceuticals, Psychiatry+, Horticulture, Animal Husbandry, Forensic Examiner, Politics, Computer Security, Communications Specialist, Business, Military Tactics, Logistics, Manufacturing, Robot Brains, Armourer. <br><br>* requires Medicine + requires Psychology</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672085414469,"modifiedTime":1672086575153,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"Sf4375GLeaEdXjz0","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Empathy","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"ssb","bonus":0,"used":false,"description":"<p>The character can perceive other people’s motives and motivations. This skill is useful when gathering information about likely actions and motivational options.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672085187959,"modifiedTime":1672086575152,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"TAgwGCqdB61eBDJ3","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Recon","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"psb","bonus":0,"used":false,"description":"<p>Recon is basically observation. Characters have a basic level in this skill, and trained characters should have a higher rating in the skill. This skill is used whenever a character wishes to find something out or whenever the GM wishes to roll to see if the character spots or hears something.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672085691670,"modifiedTime":1672086575153,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"Wiy2P34tbpFLpK7e","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Pilot (Vehicle Type)","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"msb","bonus":0,"used":false,"description":"<p>The character is skilled in the use of vehicles. They can operate and perform basic maintenance and repairs. Examples of vehicles are wheeled vehicle, watercraft, spaceship, airplane, tracked vehicle, gravcraft, power armour and drones.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672086377747,"modifiedTime":1672086575155,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"XmyIaZ07ngWvnIAD","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Social & Style","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"ssb","bonus":0,"used":false,"description":"<p>This skill is designed to enable a character to know what is fashionable in any given social<br>group. It also enables the character to behave with the correct etiquette for the social group<br>they are in at the time. This skill is used to determine advance actions. This is not a pursued<br>skill, however, if a role is played well it can provide a bonus in such situations.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1671852578894,"modifiedTime":1672086575153,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"dDzdnXRcwZRQZ5RG","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Drive Ground Car and Ride Motorcycle","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"msb","bonus":0,"used":false,"description":"<p>The character can drive cars and motorcycles. This is not a professional level of driving, just<br>everyday driving.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672086514348,"modifiedTime":1672086575155,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"gQ7bFMrV47R02z3i","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Melee Combat","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"csb","bonus":0,"used":false,"description":"<p>The character is skilled at using riot shields, melee weapons and bladed weapons. If the game master chooses, this can be broken up into multiple skills; however, for simplicity we refer to this skill as melee combat.</p>\n<p>The character can use shields to block attacks. The character is skilled at knife and sword fighting. The character is also skilled in the use of mass weapons such as axes, two-handed swords, maces, hammers, batons, truncheons, clubs and polearms. Styles are: Kendo, Single Stick, Fencing etc.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672086188534,"modifiedTime":1672086575154,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"hdOSBK7SwELJMzZb","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Demolitions","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"msb","bonus":0,"used":false,"description":"<p>The character is skilled in the art of laying explosives, creatively setting fuses and generally blowing stuff up.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672086436924,"modifiedTime":1672086575155,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"kNVEnbgz68l5H6F7","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Basic Education","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"asb","bonus":0,"used":false,"description":"<p>This skill includes a variety of catch-all skills from simple mathematics to geography, history, literacy and general knowhow. This skill is also special in that it starts as the character’s Education x 2, and then points may be spent to increase it. All characters start with this skill just as they have their native language. Spending points on this skill means the character has more depth to their knowledge. More educated characters know more about a variety of subjects. Game masters must decide if this skill can be used for any given task.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672085276422,"modifiedTime":1672086575152,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"lCcvKGDWbmNqZmM4","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Unarmed Combat","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"csb","bonus":0,"used":false,"description":"<p>The character is skilled in the use of unarmed combat. They are practised and professional, and know how to use their body, fists and feet to devastating effect.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672085777245,"modifiedTime":1672086575154,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"ouxLcHbuWWKhJQg9","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Athletics","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"psb","bonus":0,"used":false,"description":"<p>The Athletics skill is used for any form of physical activity. Jumping, dodging, climbing, abseiling, running, throwing, swimming and others can be chosen. This skill is very broad and represents the education characters received in school and while they were growing up. Rolls are required at the GM’s discretion. Athletics can be substituted for Unarmed Combat, but at half value.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672085605799,"modifiedTime":1672086575152,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"wPq70BdgDHP6H4lD","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"Graft (Type)","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"ssb","bonus":0,"used":false,"description":"<p>Graft refers to all forms of illegal activities. This skill includes bribery, streetwise, gambling,<br>racketeering, sales, bureaucracy, fencing and pimping.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672085235048,"modifiedTime":1672086575153,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"xVquq7UFdm1S4FdJ","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
{"name":"First Aid","type":"skill","img":"systems/fvtt-dark-stars/images/icons/skill.webp","system":{"base":"msb","bonus":0,"used":false,"description":"<p>The character can perform basic first aid, stop bleeding and perform CPR. This skill enables the character to dress wounds and apply bandages.</p>"},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-dark-stars","systemVersion":"10.0.4","coreVersion":"10.291","createdTime":1672086482524,"modifiedTime":1672086575155,"lastModifiedBy":"LUaXSjYdxSzrwCtU"},"_id":"yo7mOkfbbOogx8na","folder":null,"sort":0,"ownership":{"default":0,"LUaXSjYdxSzrwCtU":3}}
|
|
||||||
BIN
packs/skills/000186.ldb
Normal file
BIN
packs/skills/000186.ldb
Normal file
Binary file not shown.
0
packs/skills/000193.log
Normal file
0
packs/skills/000193.log
Normal file
1
packs/skills/CURRENT
Normal file
1
packs/skills/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000191
|
||||||
0
packs/skills/LOCK
Normal file
0
packs/skills/LOCK
Normal file
8
packs/skills/LOG
Normal file
8
packs/skills/LOG
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2024/01/26-16:45:12.248991 7ff6b77fe6c0 Recovering log #189
|
||||||
|
2024/01/26-16:45:12.258851 7ff6b77fe6c0 Delete type=3 #187
|
||||||
|
2024/01/26-16:45:12.259070 7ff6b77fe6c0 Delete type=0 #189
|
||||||
|
2024/01/26-16:46:20.702205 7ff4363ff6c0 Level-0 table #194: started
|
||||||
|
2024/01/26-16:46:20.702227 7ff4363ff6c0 Level-0 table #194: 0 bytes OK
|
||||||
|
2024/01/26-16:46:20.708847 7ff4363ff6c0 Delete type=0 #192
|
||||||
|
2024/01/26-16:46:20.715391 7ff4363ff6c0 Manual compaction at level-0 from '!items!5YJWuGaagmi1dgbv' @ 72057594037927935 : 1 .. '!items!z3j0TW0hqigz6UP5' @ 0 : 0; will stop at (end)
|
||||||
|
2024/01/26-16:46:20.715425 7ff4363ff6c0 Manual compaction at level-1 from '!items!5YJWuGaagmi1dgbv' @ 72057594037927935 : 1 .. '!items!z3j0TW0hqigz6UP5' @ 0 : 0; will stop at (end)
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user