Compare commits
34 Commits
fvtt-dark-
...
fvtt-dark-
| Author | SHA1 | Date | |
|---|---|---|---|
| 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 |
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, {
|
||||
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,
|
||||
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 }],
|
||||
editScore: true
|
||||
});
|
||||
@@ -35,23 +35,24 @@ export class DarkStarsActorSheet extends ActorSheet {
|
||||
name: this.actor.name,
|
||||
editable: this.isEditable,
|
||||
cssClass: this.isEditable ? "editable" : "locked",
|
||||
data: actorData,
|
||||
system: actorData,
|
||||
limited: this.object.limited,
|
||||
skills: this.actor.getSkills( ),
|
||||
perks: this.actor.getPerks( ),
|
||||
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())),
|
||||
shields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getShields())),
|
||||
spells: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getLore())),
|
||||
equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipmentsOnly()) ),
|
||||
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(),
|
||||
equippedShield: this.actor.getEquippedShield(),
|
||||
feats: duplicate(this.actor.getFeats()),
|
||||
subActors: duplicate(this.actor.getSubActors()),
|
||||
race: duplicate(this.actor.getRace()),
|
||||
moneys: duplicate(this.actor.getMoneys()),
|
||||
encCapacity: this.actor.getEncumbranceCapacity(),
|
||||
saveRolls: this.actor.getSaveRoll(),
|
||||
conditions: this.actor.getConditions(),
|
||||
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {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 })
|
||||
})
|
||||
|
||||
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 => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
let actorId = li.data("actor-id");
|
||||
@@ -121,6 +111,17 @@ export class DarkStarsActorSheet extends ActorSheet {
|
||||
let actorId = li.data("actor-id");
|
||||
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 => {
|
||||
const li = $(event.currentTarget).parents(".item");
|
||||
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 )
|
||||
} );
|
||||
|
||||
html.find('.roll-ability').click((event) => {
|
||||
const abilityKey = $(event.currentTarget).data("ability-key");
|
||||
this.actor.rollAbility(abilityKey);
|
||||
});
|
||||
html.find('.roll-skill').click((event) => {
|
||||
const li = $(event.currentTarget).parents(".item")
|
||||
const skillId = li.data("item-id")
|
||||
@@ -154,20 +151,6 @@ export class DarkStarsActorSheet extends ActorSheet {
|
||||
const skillId = li.data("item-id")
|
||||
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) => {
|
||||
|
||||
@@ -64,26 +64,35 @@ export class DarkStarsActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
computeHitPoints() {
|
||||
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() {
|
||||
if (this.type == "character") {
|
||||
let effort = duplicate(this.system.secondary.effort)
|
||||
let max = (this.system.abilities.con.value + this.system.abilities.int.value) * 6
|
||||
if (max != effort.max || effort.value > max) {
|
||||
effort.max = max
|
||||
effort.value = max // Init case
|
||||
this.update({ 'system.secondary.effort': effort })
|
||||
}
|
||||
computeDerivated() {
|
||||
let attr = this.system.attributes
|
||||
let deriv = this.system.derivated
|
||||
let secondary = this.system.secondary
|
||||
|
||||
deriv.csb.value = Math.round((attr.dex.value + attr.sel.value) / 2) + deriv.csb.bonus
|
||||
deriv.asb.value = Math.round((attr.int.value + attr.edu.value) / 2) + deriv.asb.bonus
|
||||
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) {
|
||||
this.system.encCapacity = this.getEncumbranceCapacity()
|
||||
this.computeDerivated()
|
||||
this.buildContainerTree()
|
||||
this.computeHitPoints()
|
||||
this.computeEffortPoints()
|
||||
}
|
||||
|
||||
super.prepareDerivedData();
|
||||
@@ -110,35 +119,6 @@ export class DarkStarsActor extends Actor {
|
||||
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() {
|
||||
let comp = duplicate(this.items.filter(item => item.type == 'weapon' && item.system.equipped) || []);
|
||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||
@@ -150,6 +130,16 @@ export class DarkStarsActor extends Actor {
|
||||
DarkStarsUtility.sortArrayObjectsByName(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() {
|
||||
let comp = this.items.find(item => item.type == 'armor' && item.system.equipped)
|
||||
if (comp) {
|
||||
@@ -158,6 +148,17 @@ export class DarkStarsActor extends Actor {
|
||||
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() {
|
||||
let comp = duplicate(this.items.filter(item => item.type == 'shield') || []);
|
||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||
@@ -171,12 +172,14 @@ export class DarkStarsActor extends Actor {
|
||||
return undefined
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getRace() {
|
||||
let race = this.items.filter(item => item.type == 'race')
|
||||
return race[0] ?? [];
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
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() {
|
||||
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)
|
||||
return comp;
|
||||
}
|
||||
@@ -207,23 +216,50 @@ export class DarkStarsActor extends Actor {
|
||||
}
|
||||
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() {
|
||||
this.computeDerivated()
|
||||
let comp = duplicate(this.items.filter(item => item.type == 'skill') || [])
|
||||
for (let skill of comp) {
|
||||
DarkStarsUtility.updateSkill(skill)
|
||||
this.updateSkill(skill)
|
||||
}
|
||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||
return comp
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getRelevantAbility(statKey) {
|
||||
let comp = duplicate(this.items.filter(item => item.type == 'skill' && item.system.ability == ability) || []);
|
||||
return comp;
|
||||
getPerks() {
|
||||
let comp = duplicate(this.items.filter(item => item.type == 'perk') || [])
|
||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||
return comp
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getJobs() {
|
||||
let comp = duplicate(this.items.filter(item => item.type == 'job') || [])
|
||||
DarkStarsUtility.sortArrayObjectsByName(comp)
|
||||
return comp
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async equipItem(itemId) {
|
||||
@@ -343,7 +379,7 @@ export class DarkStarsActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
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"))
|
||||
let hp = duplicate(this.system.secondary.hp)
|
||||
hp.value = Number(hp.value) + Number(dmgRoll.total)
|
||||
@@ -372,7 +408,7 @@ export class DarkStarsActor extends Actor {
|
||||
} else {
|
||||
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)
|
||||
await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': "" }]);
|
||||
}
|
||||
@@ -389,18 +425,20 @@ export class DarkStarsActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
async equipGear(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 };
|
||||
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
|
||||
}
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getInitiativeScore(combatId, combatantId) {
|
||||
if (this.type == 'character') {
|
||||
this.rollMR(true, combatId, combatantId)
|
||||
}
|
||||
console.log("Init required !!!!")
|
||||
return -1;
|
||||
hasLastWord() {
|
||||
return this.items.find(i => i.type == "perk" && i.name.toLowerCase() === "last word")
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getInitiativeScore() {
|
||||
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 +466,6 @@ export class DarkStarsActor extends Actor {
|
||||
await this.update({ 'system.subactors': newArray });
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
syncRoll(rollData) {
|
||||
this.lastRollId = rollData.rollId;
|
||||
DarkStarsUtility.saveRollData(rollData);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getOneSkill(skillId) {
|
||||
let skill = this.items.find(item => item.type == 'skill' && item.id == skillId)
|
||||
@@ -488,7 +520,7 @@ export class DarkStarsActor extends Actor {
|
||||
if (objetQ) {
|
||||
let newQ = objetQ.system.quantity + incDec
|
||||
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 +530,7 @@ export class DarkStarsActor extends Actor {
|
||||
if (objetQ) {
|
||||
let newQ = objetQ.system.ammocurrent + incDec;
|
||||
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 +564,13 @@ export class DarkStarsActor extends Actor {
|
||||
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) {
|
||||
let noAction = this.isNoAction()
|
||||
@@ -545,20 +584,10 @@ export class DarkStarsActor extends Actor {
|
||||
rollData.actorImg = this.img
|
||||
rollData.actorId = this.id
|
||||
rollData.img = this.img
|
||||
rollData.featsDie = this.getFeatsWithDie()
|
||||
rollData.featsSL = this.getFeatsWithSL()
|
||||
rollData.armors = this.getArmors()
|
||||
rollData.conditions = this.getConditions()
|
||||
rollData.featDieName = "none"
|
||||
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()
|
||||
rollData.rerolls = this.system.various.rerolls.value
|
||||
|
||||
if (rollData.defenderTokenId) {
|
||||
let defenderToken = game.canvas.tokens.get(rollData.defenderTokenId)
|
||||
let defender = defenderToken.actor
|
||||
@@ -607,15 +636,11 @@ export class DarkStarsActor extends Actor {
|
||||
rollSkill(skillId) {
|
||||
let skill = this.items.get(skillId)
|
||||
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)
|
||||
DarkStarsUtility.updateSkill(skill)
|
||||
let abilityKey = skill.system.ability
|
||||
let rollData = this.getCommonRollData(abilityKey)
|
||||
this.updateSkill(skill)
|
||||
let rollData = this.getCommonRollData()
|
||||
rollData.mode = "skill"
|
||||
rollData.title = "Skill " + skill.name
|
||||
rollData.skill = skill
|
||||
rollData.img = skill.img
|
||||
if (rollData.target) {
|
||||
@@ -634,20 +659,13 @@ export class DarkStarsActor extends Actor {
|
||||
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)
|
||||
this.updateSkill(skill)
|
||||
let rollData = this.getCommonRollData()
|
||||
rollData.mode = "weapon"
|
||||
rollData.skill = skill
|
||||
rollData.weapon = weapon
|
||||
this.checkAndPrepareEquipment(weapon)
|
||||
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)
|
||||
} else {
|
||||
ui.notifications.warn("Unable to find the relevant skill for weapon " + weapon.name)
|
||||
@@ -655,152 +673,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) {
|
||||
this.syncRoll(rollData)
|
||||
let rollDialog = await DarkStarsRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
}
|
||||
|
||||
@@ -2,29 +2,46 @@ import { DarkStarsUtility } from "./dark-stars-utility.js";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
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;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
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) {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async checkTurnPosition() {
|
||||
while (game.combat.turn > 0) {
|
||||
await game.combat.previousTurn()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@ export const DARKSTARS_CONFIG = {
|
||||
|
||||
basebonus : {
|
||||
"csb": "CSB",
|
||||
"asb": "SSB",
|
||||
"ssb": "SSB",
|
||||
"msb": "MSB",
|
||||
"psb": "PSB",
|
||||
@@ -30,6 +29,25 @@ export const DARKSTARS_CONFIG = {
|
||||
"slug": "Slug throwers",
|
||||
"energy": "Energy"
|
||||
},
|
||||
perktypes: {
|
||||
"normal": "Normal",
|
||||
"advanced": "Advanced",
|
||||
"role": "Role"
|
||||
},
|
||||
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: {
|
||||
"1": "Close",
|
||||
"2": "Short",
|
||||
|
||||
@@ -132,21 +132,9 @@ export class DarkStarsItemSheet extends ItemSheet {
|
||||
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 => {
|
||||
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",
|
||||
ability: "systems/fvtt-dark-stars/images/icons/ability.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",
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -5,8 +5,8 @@ export class DarkStarsRollDialog extends Dialog {
|
||||
/* -------------------------------------------- */
|
||||
static async create(actor, rollData) {
|
||||
|
||||
let options = { classes: ["DarkStarsDialog"], width: 540, height: 340, 'z-index': 99999 };
|
||||
let html = await renderTemplate('systems/fvtt-dark-stars/templates/roll-dialog-generic.hbs', rollData);
|
||||
let options = { classes: ["DarkStarsDialog"], width: 420, height: 'fit-content', 'z-index': 99999 };
|
||||
let html = await renderTemplate('systems/fvtt-dark-stars/templates/apps/roll-dialog-generic.hbs', rollData);
|
||||
|
||||
return new DarkStarsRollDialog(actor, rollData, html, options);
|
||||
}
|
||||
@@ -58,27 +58,17 @@ export class DarkStarsRollDialog extends Dialog {
|
||||
}
|
||||
$(function () { onLoad(); });
|
||||
|
||||
html.find('#advantage').change((event) => {
|
||||
this.rollData.advantage = event.currentTarget.value
|
||||
html.find('#bonusMalus').change((event) => {
|
||||
this.rollData.bonusMalus = Number(event.currentTarget.value)
|
||||
})
|
||||
html.find('#disadvantage').change((event) => {
|
||||
this.rollData.disadvantage = event.currentTarget.value
|
||||
html.find('#above-effective-range').change((event) => {
|
||||
this.rollData.isAboveEffectiveRange = event.currentTarget.checked
|
||||
})
|
||||
html.find('#rollAdvantage').change((event) => {
|
||||
this.rollData.rollAdvantage = 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)
|
||||
html.find('#weapon-aiming').change((event) => {
|
||||
this.rollData.weaponAiming = String(event.currentTarget.value)
|
||||
})
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -42,7 +42,7 @@ export class DarkStarsUtility {
|
||||
Handlebars.registerHelper('locationLabel', function (key) {
|
||||
return __locationNames[key]
|
||||
})
|
||||
|
||||
|
||||
|
||||
this.gameSettings()
|
||||
|
||||
@@ -50,22 +50,6 @@ export class DarkStarsUtility {
|
||||
|
||||
/*-------------------------------------------- */
|
||||
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) {
|
||||
|
||||
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 => {
|
||||
let rollId = $(event.currentTarget).data("roll-id")
|
||||
let rollData = DarkStarsUtility.getRollData(rollId)
|
||||
rollData.defenseWeaponId = $(event.currentTarget).data("defense-weapon-id")
|
||||
let actor = game.canvas.tokens.get(rollData.defenderTokenId).actor
|
||||
if (actor && (game.user.isGM || actor.isOwner)) {
|
||||
actor.rollDefenseMelee(rollData)
|
||||
}
|
||||
html.on("click", '.chat-reroll', event => {
|
||||
let messageId = this.findChatMessageId(event.currentTarget)
|
||||
let message = game.messages.get(messageId)
|
||||
let rollData = message.getFlag("world", "darkstars-roll-data")
|
||||
rollData.reroll = true
|
||||
rollData.roll = undefined
|
||||
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) {
|
||||
|
||||
let actor = game.actors.get(rollData.actorId)
|
||||
|
||||
// ability/save/size => 0
|
||||
let diceFormula
|
||||
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
|
||||
rollData.percentValue = 0
|
||||
if (rollData.skill) {
|
||||
let level = rollData.skill.system.level
|
||||
if (rollData.skill.system.issl2) {
|
||||
rollData.hasSLBonus = true
|
||||
level += 2
|
||||
if (level > 7) { level = 7 }
|
||||
}
|
||||
rollData.skill.system.skilldice = __skillLevel2Dice[level]
|
||||
diceFormula += "+" + String(rollData.skill.system.skilldice) + "cs>=5[black]"
|
||||
rollData.percentValue = rollData.skill.total
|
||||
}
|
||||
rollData.percentValue += rollData.bonusMalus
|
||||
rollData.diceFormula = "1d100"
|
||||
|
||||
if (rollData.skill.system.skilltype == "complex" && rollData.skill.system.level == 0) {
|
||||
rollData.complexSkillDisadvantage = true
|
||||
rollData.rollAdvantage = "roll-disadvantage"
|
||||
}
|
||||
|
||||
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`
|
||||
if (rollData.isAboveEffectiveRange) {
|
||||
rollData.percentValue -= 30
|
||||
rollData.percentValue = Math.max(0, rollData.percentValue)
|
||||
}
|
||||
|
||||
// advantage => 8
|
||||
let advFormula = "+ 0d8cs>=5"
|
||||
if (rollData.advantage == "advantage1" || rollData.forceAdvantage) {
|
||||
advFormula = "+ 1d8cs>=5[dark-stars-darkgreen]"
|
||||
if (rollData.mode == "weapon") {
|
||||
rollData.locationMalus = this.getAimingMalus(rollData.weaponAiming)
|
||||
rollData.percentValue += rollData.locationMalus
|
||||
}
|
||||
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
|
||||
console.log("Roll formula", diceFormula)
|
||||
console.log("Roll formula", rollData.diceFormula)
|
||||
let myRoll = rollData.roll
|
||||
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"))
|
||||
}
|
||||
rollData.rollOrder = 0
|
||||
rollData.roll = myRoll
|
||||
rollData.nbSuccess = myRoll.total
|
||||
rollData.roll = duplicate(myRoll)
|
||||
rollData.diceResult = 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) {
|
||||
rollData.rollAdvantage = "roll-advantage"
|
||||
if (rollData.reroll) {
|
||||
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
|
||||
rollData.rollType = (rollData.rollAdvantage == "roll-advantage") ? "Advantage" : "Disadvantage"
|
||||
this.createChatWithRollMode(rollData.alias, {
|
||||
content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat-generic-result.hbs`, rollData)
|
||||
})
|
||||
|
||||
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
|
||||
}
|
||||
if (rollData.mode == "weapon") {
|
||||
if (rollData.weaponAiming == "none") {
|
||||
let rollLoc = new Roll("1d10").roll({ async: false })
|
||||
rollData.weaponAiming = this.getAimingLocation(rollLoc.total)
|
||||
}
|
||||
rollData.rollOrder = 3
|
||||
// Compute
|
||||
rollData.locationMultiplier = this.locationMultiplier(rollData.weaponAiming)
|
||||
}
|
||||
rollData.nbSuccess = Math.max(0, rollData.nbSuccess)
|
||||
|
||||
rollData.isFirstRollAdvantage = false
|
||||
// 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)
|
||||
|
||||
let msg = await this.createChatWithRollMode(rollData.alias, {
|
||||
content: await renderTemplate(`systems/fvtt-dark-stars/templates/chat/chat-generic-result.hbs`, rollData)
|
||||
})
|
||||
|
||||
console.log("Rolldata result", rollData)
|
||||
|
||||
// Message response
|
||||
this.displayDefenseMessage(rollData)
|
||||
|
||||
// Manage defense result
|
||||
this.processAttackDefense(rollData)
|
||||
msg.setFlag("world", "darkstars-roll-data", rollData)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -528,7 +423,7 @@ export class DarkStarsUtility {
|
||||
break;
|
||||
}
|
||||
chatOptions.alias = chatOptions.alias || name;
|
||||
ChatMessage.create(chatOptions);
|
||||
return ChatMessage.create(chatOptions);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -536,7 +431,9 @@ export class DarkStarsUtility {
|
||||
let rollData = {
|
||||
rollId: randomID(16),
|
||||
rollMode: game.settings.get("core", "rollMode"),
|
||||
advantage: "none"
|
||||
bonusMalus: 0,
|
||||
isAboveEffectiveRange: false,
|
||||
weaponAiming: "none"
|
||||
}
|
||||
DarkStarsUtility.updateWithTarget(rollData)
|
||||
return rollData
|
||||
@@ -552,7 +449,7 @@ export class DarkStarsUtility {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static createChatWithRollMode(name, chatOptions) {
|
||||
this.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions)
|
||||
return this.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
BIN
packs/aldebaran/000033.ldb
Normal file
BIN
packs/aldebaran/000033.ldb
Normal file
Binary file not shown.
1
packs/aldebaran/CURRENT
Normal file
1
packs/aldebaran/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000036
|
||||
7
packs/aldebaran/LOG
Normal file
7
packs/aldebaran/LOG
Normal file
@@ -0,0 +1,7 @@
|
||||
2023/11/25-11:53:56.148290 7fd092bff6c0 Recovering log #35
|
||||
2023/11/25-11:53:56.158572 7fd092bff6c0 Delete type=0 #35
|
||||
2023/11/25-11:53:56.158657 7fd092bff6c0 Delete type=3 #34
|
||||
2023/11/25-11:54:27.006917 7fd090bfb6c0 Level-0 table #39: started
|
||||
2023/11/25-11:54:27.006997 7fd090bfb6c0 Level-0 table #39: 0 bytes OK
|
||||
2023/11/25-11:54:27.015085 7fd090bfb6c0 Delete type=0 #37
|
||||
2023/11/25-11:54:27.015315 7fd090bfb6c0 Manual compaction at level-0 from '!folders!MA6uFJMVebGeayIk' @ 72057594037927935 : 1 .. '!items!zWXriFfWH4wiyUzv' @ 0 : 0; will stop at (end)
|
||||
3
packs/aldebaran/LOG.old
Normal file
3
packs/aldebaran/LOG.old
Normal file
@@ -0,0 +1,3 @@
|
||||
2023/11/25-09:41:59.042296 ffff7a7cf0a0 Recovering log #31
|
||||
2023/11/25-09:41:59.045670 ffff7a7cf0a0 Delete type=3 #29
|
||||
2023/11/25-09:41:59.045713 ffff7a7cf0a0 Delete type=0 #31
|
||||
BIN
packs/aldebaran/MANIFEST-000036
Normal file
BIN
packs/aldebaran/MANIFEST-000036
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/000005.ldb
Normal file
BIN
packs/armor/000005.ldb
Normal file
Binary file not shown.
1
packs/armor/CURRENT
Normal file
1
packs/armor/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000146
|
||||
8
packs/armor/LOG
Normal file
8
packs/armor/LOG
Normal file
@@ -0,0 +1,8 @@
|
||||
2023/11/25-11:53:55.987706 7fd091bfd6c0 Recovering log #144
|
||||
2023/11/25-11:53:55.997898 7fd091bfd6c0 Delete type=3 #142
|
||||
2023/11/25-11:53:55.997959 7fd091bfd6c0 Delete type=0 #144
|
||||
2023/11/25-11:54:26.939109 7fd090bfb6c0 Level-0 table #149: started
|
||||
2023/11/25-11:54:26.939141 7fd090bfb6c0 Level-0 table #149: 0 bytes OK
|
||||
2023/11/25-11:54:26.946683 7fd090bfb6c0 Delete type=0 #147
|
||||
2023/11/25-11:54:26.959662 7fd090bfb6c0 Manual compaction at level-0 from '!items!3O3MjRkrmX4HeaPY' @ 72057594037927935 : 1 .. '!items!q9JGWL4y4udYrzvD' @ 0 : 0; will stop at (end)
|
||||
2023/11/25-11:54:26.959698 7fd090bfb6c0 Manual compaction at level-1 from '!items!3O3MjRkrmX4HeaPY' @ 72057594037927935 : 1 .. '!items!q9JGWL4y4udYrzvD' @ 0 : 0; will stop at (end)
|
||||
8
packs/armor/LOG.old
Normal file
8
packs/armor/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
||||
2023/10/29-23:31:17.929984 7f56117fa6c0 Recovering log #140
|
||||
2023/10/29-23:31:17.982863 7f56117fa6c0 Delete type=3 #138
|
||||
2023/10/29-23:31:17.982953 7f56117fa6c0 Delete type=0 #140
|
||||
2023/10/29-23:37:49.276844 7f56037fe6c0 Level-0 table #145: started
|
||||
2023/10/29-23:37:49.276878 7f56037fe6c0 Level-0 table #145: 0 bytes OK
|
||||
2023/10/29-23:37:49.283239 7f56037fe6c0 Delete type=0 #143
|
||||
2023/10/29-23:37:49.283442 7f56037fe6c0 Manual compaction at level-0 from '!items!3O3MjRkrmX4HeaPY' @ 72057594037927935 : 1 .. '!items!q9JGWL4y4udYrzvD' @ 0 : 0; will stop at (end)
|
||||
2023/10/29-23:37:49.283477 7f56037fe6c0 Manual compaction at level-1 from '!items!3O3MjRkrmX4HeaPY' @ 72057594037927935 : 1 .. '!items!q9JGWL4y4udYrzvD' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/armor/MANIFEST-000146
Normal file
BIN
packs/armor/MANIFEST-000146
Normal file
Binary file not shown.
BIN
packs/beyondtheblacksea/000036.ldb
Normal file
BIN
packs/beyondtheblacksea/000036.ldb
Normal file
Binary file not shown.
1
packs/beyondtheblacksea/CURRENT
Normal file
1
packs/beyondtheblacksea/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000039
|
||||
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 @@
|
||||
2023/11/25-11:53:56.161415 7fd0913fc6c0 Recovering log #38
|
||||
2023/11/25-11:53:56.170729 7fd0913fc6c0 Delete type=0 #38
|
||||
2023/11/25-11:53:56.170780 7fd0913fc6c0 Delete type=3 #37
|
||||
2023/11/25-11:54:27.021721 7fd090bfb6c0 Level-0 table #42: started
|
||||
2023/11/25-11:54:27.021762 7fd090bfb6c0 Level-0 table #42: 0 bytes OK
|
||||
2023/11/25-11:54:27.028409 7fd090bfb6c0 Delete type=0 #40
|
||||
2023/11/25-11:54:27.028540 7fd090bfb6c0 Manual compaction at level-0 from '!folders!Gh3dOV5MWEUqOK83' @ 72057594037927935 : 1 .. '!items!zwMpjsE84sk26eej' @ 0 : 0; will stop at (end)
|
||||
3
packs/beyondtheblacksea/LOG.old
Normal file
3
packs/beyondtheblacksea/LOG.old
Normal file
@@ -0,0 +1,3 @@
|
||||
2023/11/25-09:41:59.034802 ffff79fbf0a0 Recovering log #34
|
||||
2023/11/25-09:41:59.038133 ffff79fbf0a0 Delete type=3 #32
|
||||
2023/11/25-09:41:59.038176 ffff79fbf0a0 Delete type=0 #34
|
||||
BIN
packs/beyondtheblacksea/MANIFEST-000039
Normal file
BIN
packs/beyondtheblacksea/MANIFEST-000039
Normal file
Binary file not shown.
0
packs/conditions/000148.log
Normal file
0
packs/conditions/000148.log
Normal file
1
packs/conditions/CURRENT
Normal file
1
packs/conditions/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000146
|
||||
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 @@
|
||||
2023/11/25-11:53:56.037176 7fd091bfd6c0 Recovering log #144
|
||||
2023/11/25-11:53:56.047186 7fd091bfd6c0 Delete type=3 #142
|
||||
2023/11/25-11:53:56.047263 7fd091bfd6c0 Delete type=0 #144
|
||||
2023/11/25-11:54:26.966421 7fd090bfb6c0 Level-0 table #149: started
|
||||
2023/11/25-11:54:26.966444 7fd090bfb6c0 Level-0 table #149: 0 bytes OK
|
||||
2023/11/25-11:54:26.972594 7fd090bfb6c0 Delete type=0 #147
|
||||
2023/11/25-11:54:26.986318 7fd090bfb6c0 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 @@
|
||||
2023/10/29-23:31:18.172067 7f56117fa6c0 Recovering log #140
|
||||
2023/10/29-23:31:18.222141 7f56117fa6c0 Delete type=3 #138
|
||||
2023/10/29-23:31:18.222239 7f56117fa6c0 Delete type=0 #140
|
||||
2023/10/29-23:37:49.304351 7f56037fe6c0 Level-0 table #145: started
|
||||
2023/10/29-23:37:49.304405 7f56037fe6c0 Level-0 table #145: 0 bytes OK
|
||||
2023/10/29-23:37:49.310587 7f56037fe6c0 Delete type=0 #143
|
||||
2023/10/29-23:37:49.310811 7f56037fe6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/conditions/MANIFEST-000146
Normal file
BIN
packs/conditions/MANIFEST-000146
Normal file
Binary file not shown.
0
packs/currency/000148.log
Normal file
0
packs/currency/000148.log
Normal file
1
packs/currency/CURRENT
Normal file
1
packs/currency/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000146
|
||||
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 @@
|
||||
2023/11/25-11:53:56.048914 7fd0923fe6c0 Recovering log #144
|
||||
2023/11/25-11:53:56.058887 7fd0923fe6c0 Delete type=3 #142
|
||||
2023/11/25-11:53:56.058947 7fd0923fe6c0 Delete type=0 #144
|
||||
2023/11/25-11:54:26.959805 7fd090bfb6c0 Level-0 table #149: started
|
||||
2023/11/25-11:54:26.959829 7fd090bfb6c0 Level-0 table #149: 0 bytes OK
|
||||
2023/11/25-11:54:26.966338 7fd090bfb6c0 Delete type=0 #147
|
||||
2023/11/25-11:54:26.986308 7fd090bfb6c0 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 @@
|
||||
2023/10/29-23:31:18.223966 7f5611ffb6c0 Recovering log #140
|
||||
2023/10/29-23:31:18.265607 7f5611ffb6c0 Delete type=3 #138
|
||||
2023/10/29-23:31:18.265707 7f5611ffb6c0 Delete type=0 #140
|
||||
2023/10/29-23:37:49.310911 7f56037fe6c0 Level-0 table #145: started
|
||||
2023/10/29-23:37:49.311047 7f56037fe6c0 Level-0 table #145: 0 bytes OK
|
||||
2023/10/29-23:37:49.317632 7f56037fe6c0 Delete type=0 #143
|
||||
2023/10/29-23:37:49.337853 7f56037fe6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/currency/MANIFEST-000146
Normal file
BIN
packs/currency/MANIFEST-000146
Normal file
Binary file not shown.
BIN
packs/cybernetics/000066.ldb
Normal file
BIN
packs/cybernetics/000066.ldb
Normal file
Binary file not shown.
0
packs/cybernetics/000077.log
Normal file
0
packs/cybernetics/000077.log
Normal file
1
packs/cybernetics/CURRENT
Normal file
1
packs/cybernetics/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000075
|
||||
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 @@
|
||||
2023/11/25-11:53:56.123402 7fd091bfd6c0 Recovering log #73
|
||||
2023/11/25-11:53:56.133061 7fd091bfd6c0 Delete type=3 #71
|
||||
2023/11/25-11:53:56.133163 7fd091bfd6c0 Delete type=0 #73
|
||||
2023/11/25-11:54:27.000544 7fd090bfb6c0 Level-0 table #78: started
|
||||
2023/11/25-11:54:27.000572 7fd090bfb6c0 Level-0 table #78: 0 bytes OK
|
||||
2023/11/25-11:54:27.006700 7fd090bfb6c0 Delete type=0 #76
|
||||
2023/11/25-11:54:27.015300 7fd090bfb6c0 Manual compaction at level-0 from '!items!0SbSmYdxJSlcNr6x' @ 72057594037927935 : 1 .. '!items!yyCPVVl8vmMOfPcN' @ 0 : 0; will stop at (end)
|
||||
2023/11/25-11:54:27.015342 7fd090bfb6c0 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 @@
|
||||
2023/10/29-23:31:18.438487 7f56117fa6c0 Recovering log #69
|
||||
2023/10/29-23:31:18.492811 7f56117fa6c0 Delete type=3 #67
|
||||
2023/10/29-23:31:18.492904 7f56117fa6c0 Delete type=0 #69
|
||||
2023/10/29-23:37:49.324508 7f56037fe6c0 Level-0 table #74: started
|
||||
2023/10/29-23:37:49.324550 7f56037fe6c0 Level-0 table #74: 0 bytes OK
|
||||
2023/10/29-23:37:49.330736 7f56037fe6c0 Delete type=0 #72
|
||||
2023/10/29-23:37:49.337897 7f56037fe6c0 Manual compaction at level-0 from '!items!0SbSmYdxJSlcNr6x' @ 72057594037927935 : 1 .. '!items!yyCPVVl8vmMOfPcN' @ 0 : 0; will stop at (end)
|
||||
2023/10/29-23:37:49.337946 7f56037fe6c0 Manual compaction at level-1 from '!items!0SbSmYdxJSlcNr6x' @ 72057594037927935 : 1 .. '!items!yyCPVVl8vmMOfPcN' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/cybernetics/MANIFEST-000075
Normal file
BIN
packs/cybernetics/MANIFEST-000075
Normal file
Binary file not shown.
BIN
packs/equipment/000137.ldb
Normal file
BIN
packs/equipment/000137.ldb
Normal file
Binary file not shown.
0
packs/equipment/000148.log
Normal file
0
packs/equipment/000148.log
Normal file
1
packs/equipment/CURRENT
Normal file
1
packs/equipment/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000146
|
||||
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 @@
|
||||
2023/11/25-11:53:56.000006 7fd0923fe6c0 Recovering log #144
|
||||
2023/11/25-11:53:56.009809 7fd0923fe6c0 Delete type=3 #142
|
||||
2023/11/25-11:53:56.009912 7fd0923fe6c0 Delete type=0 #144
|
||||
2023/11/25-11:54:26.946787 7fd090bfb6c0 Level-0 table #149: started
|
||||
2023/11/25-11:54:26.946809 7fd090bfb6c0 Level-0 table #149: 0 bytes OK
|
||||
2023/11/25-11:54:26.952758 7fd090bfb6c0 Delete type=0 #147
|
||||
2023/11/25-11:54:26.959673 7fd090bfb6c0 Manual compaction at level-0 from '!items!05RVU3UcRabogEvL' @ 72057594037927935 : 1 .. '!items!xNmOdMs4rQ0yiVzg' @ 0 : 0; will stop at (end)
|
||||
2023/11/25-11:54:26.959705 7fd090bfb6c0 Manual compaction at level-1 from '!items!05RVU3UcRabogEvL' @ 72057594037927935 : 1 .. '!items!xNmOdMs4rQ0yiVzg' @ 0 : 0; will stop at (end)
|
||||
8
packs/equipment/LOG.old
Normal file
8
packs/equipment/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
||||
2023/10/29-23:31:17.984959 7f5611ffb6c0 Recovering log #140
|
||||
2023/10/29-23:31:18.036613 7f5611ffb6c0 Delete type=3 #138
|
||||
2023/10/29-23:31:18.036664 7f5611ffb6c0 Delete type=0 #140
|
||||
2023/10/29-23:37:49.283537 7f56037fe6c0 Level-0 table #145: started
|
||||
2023/10/29-23:37:49.283589 7f56037fe6c0 Level-0 table #145: 0 bytes OK
|
||||
2023/10/29-23:37:49.290495 7f56037fe6c0 Delete type=0 #143
|
||||
2023/10/29-23:37:49.310755 7f56037fe6c0 Manual compaction at level-0 from '!items!05RVU3UcRabogEvL' @ 72057594037927935 : 1 .. '!items!xNmOdMs4rQ0yiVzg' @ 0 : 0; will stop at (end)
|
||||
2023/10/29-23:37:49.310826 7f56037fe6c0 Manual compaction at level-1 from '!items!05RVU3UcRabogEvL' @ 72057594037927935 : 1 .. '!items!xNmOdMs4rQ0yiVzg' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/equipment/MANIFEST-000146
Normal file
BIN
packs/equipment/MANIFEST-000146
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/000025.log
Normal file
0
packs/genetics/000025.log
Normal file
1
packs/genetics/CURRENT
Normal file
1
packs/genetics/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000023
|
||||
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 @@
|
||||
2023/11/25-11:53:56.135361 7fd0923fe6c0 Recovering log #21
|
||||
2023/11/25-11:53:56.145751 7fd0923fe6c0 Delete type=3 #19
|
||||
2023/11/25-11:53:56.145806 7fd0923fe6c0 Delete type=0 #21
|
||||
2023/11/25-11:54:26.993034 7fd090bfb6c0 Level-0 table #26: started
|
||||
2023/11/25-11:54:26.993055 7fd090bfb6c0 Level-0 table #26: 0 bytes OK
|
||||
2023/11/25-11:54:27.000358 7fd090bfb6c0 Delete type=0 #24
|
||||
2023/11/25-11:54:27.015280 7fd090bfb6c0 Manual compaction at level-0 from '!items!56A3sVsiN7KI6a45' @ 72057594037927935 : 1 .. '!items!zJiASbV3QqH2oHb1' @ 0 : 0; will stop at (end)
|
||||
2023/11/25-11:54:27.015355 7fd090bfb6c0 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 @@
|
||||
2023/10/29-23:31:18.494918 7f5611ffb6c0 Recovering log #17
|
||||
2023/10/29-23:31:18.543367 7f5611ffb6c0 Delete type=3 #15
|
||||
2023/10/29-23:31:18.543420 7f5611ffb6c0 Delete type=0 #17
|
||||
2023/10/29-23:37:49.338046 7f56037fe6c0 Level-0 table #22: started
|
||||
2023/10/29-23:37:49.338094 7f56037fe6c0 Level-0 table #22: 0 bytes OK
|
||||
2023/10/29-23:37:49.344365 7f56037fe6c0 Delete type=0 #20
|
||||
2023/10/29-23:37:49.344491 7f56037fe6c0 Manual compaction at level-0 from '!items!56A3sVsiN7KI6a45' @ 72057594037927935 : 1 .. '!items!zJiASbV3QqH2oHb1' @ 0 : 0; will stop at (end)
|
||||
2023/10/29-23:37:49.344516 7f56037fe6c0 Manual compaction at level-1 from '!items!56A3sVsiN7KI6a45' @ 72057594037927935 : 1 .. '!items!zJiASbV3QqH2oHb1' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/genetics/MANIFEST-000023
Normal file
BIN
packs/genetics/MANIFEST-000023
Normal file
Binary file not shown.
BIN
packs/nightborough/000036.ldb
Normal file
BIN
packs/nightborough/000036.ldb
Normal file
Binary file not shown.
0
packs/nightborough/000041.log
Normal file
0
packs/nightborough/000041.log
Normal file
1
packs/nightborough/CURRENT
Normal file
1
packs/nightborough/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000039
|
||||
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 @@
|
||||
2023/11/25-11:53:56.174133 7fd091bfd6c0 Recovering log #38
|
||||
2023/11/25-11:53:56.184063 7fd091bfd6c0 Delete type=0 #38
|
||||
2023/11/25-11:53:56.184110 7fd091bfd6c0 Delete type=3 #37
|
||||
2023/11/25-11:54:27.015463 7fd090bfb6c0 Level-0 table #42: started
|
||||
2023/11/25-11:54:27.015494 7fd090bfb6c0 Level-0 table #42: 0 bytes OK
|
||||
2023/11/25-11:54:27.021563 7fd090bfb6c0 Delete type=0 #40
|
||||
2023/11/25-11:54:27.028525 7fd090bfb6c0 Manual compaction at level-0 from '!folders!2iZtDz80npHPIwkS' @ 72057594037927935 : 1 .. '!items!zv07ZCqoczWKdT2b' @ 0 : 0; will stop at (end)
|
||||
3
packs/nightborough/LOG.old
Normal file
3
packs/nightborough/LOG.old
Normal file
@@ -0,0 +1,3 @@
|
||||
2023/11/25-09:41:59.048691 ffff79fbf0a0 Recovering log #34
|
||||
2023/11/25-09:41:59.051889 ffff79fbf0a0 Delete type=3 #31
|
||||
2023/11/25-09:41:59.051928 ffff79fbf0a0 Delete type=0 #34
|
||||
BIN
packs/nightborough/MANIFEST-000039
Normal file
BIN
packs/nightborough/MANIFEST-000039
Normal file
Binary file not shown.
BIN
packs/perks/000005.ldb
Normal file
BIN
packs/perks/000005.ldb
Normal file
Binary file not shown.
0
packs/perks/000148.log
Normal file
0
packs/perks/000148.log
Normal file
1
packs/perks/CURRENT
Normal file
1
packs/perks/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000146
|
||||
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 @@
|
||||
2023/11/25-11:53:56.109779 7fd0913fc6c0 Recovering log #144
|
||||
2023/11/25-11:53:56.120897 7fd0913fc6c0 Delete type=3 #142
|
||||
2023/11/25-11:53:56.120965 7fd0913fc6c0 Delete type=0 #144
|
||||
2023/11/25-11:54:26.986457 7fd090bfb6c0 Level-0 table #149: started
|
||||
2023/11/25-11:54:26.986489 7fd090bfb6c0 Level-0 table #149: 0 bytes OK
|
||||
2023/11/25-11:54:26.992967 7fd090bfb6c0 Delete type=0 #147
|
||||
2023/11/25-11:54:27.015253 7fd090bfb6c0 Manual compaction at level-0 from '!items!0LA7gMBDogO56AZK' @ 72057594037927935 : 1 .. '!items!zwZoHMkWYtMCNx9f' @ 0 : 0; will stop at (end)
|
||||
2023/11/25-11:54:27.015329 7fd090bfb6c0 Manual compaction at level-1 from '!items!0LA7gMBDogO56AZK' @ 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 @@
|
||||
2023/10/29-23:31:18.352208 7f5610ff96c0 Recovering log #140
|
||||
2023/10/29-23:31:18.436200 7f5610ff96c0 Delete type=3 #138
|
||||
2023/10/29-23:31:18.436263 7f5610ff96c0 Delete type=0 #140
|
||||
2023/10/29-23:37:49.330846 7f56037fe6c0 Level-0 table #145: started
|
||||
2023/10/29-23:37:49.330869 7f56037fe6c0 Level-0 table #145: 0 bytes OK
|
||||
2023/10/29-23:37:49.337661 7f56037fe6c0 Delete type=0 #143
|
||||
2023/10/29-23:37:49.337914 7f56037fe6c0 Manual compaction at level-0 from '!items!0LA7gMBDogO56AZK' @ 72057594037927935 : 1 .. '!items!zwZoHMkWYtMCNx9f' @ 0 : 0; will stop at (end)
|
||||
2023/10/29-23:37:49.337961 7f56037fe6c0 Manual compaction at level-1 from '!items!0LA7gMBDogO56AZK' @ 72057594037927935 : 1 .. '!items!zwZoHMkWYtMCNx9f' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/perks/MANIFEST-000146
Normal file
BIN
packs/perks/MANIFEST-000146
Normal file
Binary file not shown.
0
packs/shields/000148.log
Normal file
0
packs/shields/000148.log
Normal file
1
packs/shields/CURRENT
Normal file
1
packs/shields/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000146
|
||||
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 @@
|
||||
2023/11/25-11:53:56.013578 7fd092bff6c0 Recovering log #144
|
||||
2023/11/25-11:53:56.023494 7fd092bff6c0 Delete type=3 #142
|
||||
2023/11/25-11:53:56.023547 7fd092bff6c0 Delete type=0 #144
|
||||
2023/11/25-11:54:26.952877 7fd090bfb6c0 Level-0 table #149: started
|
||||
2023/11/25-11:54:26.952930 7fd090bfb6c0 Level-0 table #149: 0 bytes OK
|
||||
2023/11/25-11:54:26.959512 7fd090bfb6c0 Delete type=0 #147
|
||||
2023/11/25-11:54:26.959683 7fd090bfb6c0 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 @@
|
||||
2023/10/29-23:31:18.040442 7f5603fff6c0 Recovering log #140
|
||||
2023/10/29-23:31:18.100074 7f5603fff6c0 Delete type=3 #138
|
||||
2023/10/29-23:31:18.100170 7f5603fff6c0 Delete type=0 #140
|
||||
2023/10/29-23:37:49.290582 7f56037fe6c0 Level-0 table #145: started
|
||||
2023/10/29-23:37:49.290606 7f56037fe6c0 Level-0 table #145: 0 bytes OK
|
||||
2023/10/29-23:37:49.296703 7f56037fe6c0 Delete type=0 #143
|
||||
2023/10/29-23:37:49.310776 7f56037fe6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/shields/MANIFEST-000146
Normal file
BIN
packs/shields/MANIFEST-000146
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/000005.ldb
Normal file
BIN
packs/skills/000005.ldb
Normal file
Binary file not shown.
0
packs/skills/000148.log
Normal file
0
packs/skills/000148.log
Normal file
1
packs/skills/CURRENT
Normal file
1
packs/skills/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000146
|
||||
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 @@
|
||||
2023/11/25-11:53:56.060684 7fd092bff6c0 Recovering log #144
|
||||
2023/11/25-11:53:56.071237 7fd092bff6c0 Delete type=3 #142
|
||||
2023/11/25-11:53:56.071323 7fd092bff6c0 Delete type=0 #144
|
||||
2023/11/25-11:54:26.980220 7fd090bfb6c0 Level-0 table #149: started
|
||||
2023/11/25-11:54:26.980243 7fd090bfb6c0 Level-0 table #149: 0 bytes OK
|
||||
2023/11/25-11:54:26.986189 7fd090bfb6c0 Delete type=0 #147
|
||||
2023/11/25-11:54:26.986336 7fd090bfb6c0 Manual compaction at level-0 from '!items!5YJWuGaagmi1dgbv' @ 72057594037927935 : 1 .. '!items!yo7mOkfbbOogx8na' @ 0 : 0; will stop at (end)
|
||||
2023/11/25-11:54:26.986355 7fd090bfb6c0 Manual compaction at level-1 from '!items!5YJWuGaagmi1dgbv' @ 72057594037927935 : 1 .. '!items!yo7mOkfbbOogx8na' @ 0 : 0; will stop at (end)
|
||||
8
packs/skills/LOG.old
Normal file
8
packs/skills/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
||||
2023/10/29-23:31:18.266929 7f5603fff6c0 Recovering log #140
|
||||
2023/10/29-23:31:18.350204 7f5603fff6c0 Delete type=3 #138
|
||||
2023/10/29-23:31:18.350298 7f5603fff6c0 Delete type=0 #140
|
||||
2023/10/29-23:37:49.317738 7f56037fe6c0 Level-0 table #145: started
|
||||
2023/10/29-23:37:49.317765 7f56037fe6c0 Level-0 table #145: 0 bytes OK
|
||||
2023/10/29-23:37:49.324369 7f56037fe6c0 Delete type=0 #143
|
||||
2023/10/29-23:37:49.337878 7f56037fe6c0 Manual compaction at level-0 from '!items!5YJWuGaagmi1dgbv' @ 72057594037927935 : 1 .. '!items!yo7mOkfbbOogx8na' @ 0 : 0; will stop at (end)
|
||||
2023/10/29-23:37:49.337930 7f56037fe6c0 Manual compaction at level-1 from '!items!5YJWuGaagmi1dgbv' @ 72057594037927935 : 1 .. '!items!yo7mOkfbbOogx8na' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/skills/MANIFEST-000146
Normal file
BIN
packs/skills/MANIFEST-000146
Normal file
Binary file not shown.
BIN
packs/weapons/000018.ldb
Normal file
BIN
packs/weapons/000018.ldb
Normal file
Binary file not shown.
0
packs/weapons/000149.log
Normal file
0
packs/weapons/000149.log
Normal file
1
packs/weapons/CURRENT
Normal file
1
packs/weapons/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000147
|
||||
0
packs/weapons/LOCK
Normal file
0
packs/weapons/LOCK
Normal file
8
packs/weapons/LOG
Normal file
8
packs/weapons/LOG
Normal file
@@ -0,0 +1,8 @@
|
||||
2023/11/25-11:53:56.025155 7fd0913fc6c0 Recovering log #145
|
||||
2023/11/25-11:53:56.034729 7fd0913fc6c0 Delete type=3 #143
|
||||
2023/11/25-11:53:56.034992 7fd0913fc6c0 Delete type=0 #145
|
||||
2023/11/25-11:54:26.972747 7fd090bfb6c0 Level-0 table #150: started
|
||||
2023/11/25-11:54:26.972787 7fd090bfb6c0 Level-0 table #150: 0 bytes OK
|
||||
2023/11/25-11:54:26.980115 7fd090bfb6c0 Delete type=0 #148
|
||||
2023/11/25-11:54:26.986328 7fd090bfb6c0 Manual compaction at level-0 from '!items!265V8wzrrH3EEgtM' @ 72057594037927935 : 1 .. '!items!zx96NZdE3GrK999G' @ 0 : 0; will stop at (end)
|
||||
2023/11/25-11:54:26.986362 7fd090bfb6c0 Manual compaction at level-1 from '!items!265V8wzrrH3EEgtM' @ 72057594037927935 : 1 .. '!items!zx96NZdE3GrK999G' @ 0 : 0; will stop at (end)
|
||||
8
packs/weapons/LOG.old
Normal file
8
packs/weapons/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
||||
2023/10/29-23:31:18.101982 7f5610ff96c0 Recovering log #141
|
||||
2023/10/29-23:31:18.169683 7f5610ff96c0 Delete type=3 #139
|
||||
2023/10/29-23:31:18.169778 7f5610ff96c0 Delete type=0 #141
|
||||
2023/10/29-23:37:49.296947 7f56037fe6c0 Level-0 table #146: started
|
||||
2023/10/29-23:37:49.296972 7f56037fe6c0 Level-0 table #146: 0 bytes OK
|
||||
2023/10/29-23:37:49.304142 7f56037fe6c0 Delete type=0 #144
|
||||
2023/10/29-23:37:49.310795 7f56037fe6c0 Manual compaction at level-0 from '!items!265V8wzrrH3EEgtM' @ 72057594037927935 : 1 .. '!items!zx96NZdE3GrK999G' @ 0 : 0; will stop at (end)
|
||||
2023/10/29-23:37:49.310843 7f56037fe6c0 Manual compaction at level-1 from '!items!265V8wzrrH3EEgtM' @ 72057594037927935 : 1 .. '!items!zx96NZdE3GrK999G' @ 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