Savesrolls + HP
0
images/icons/feats/.directory
Normal file → Executable file
0
images/icons/feats/Blessing Lore.webp
Normal file → Executable file
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 8.9 KiB |
0
images/icons/feats/Miracle Lore.webp
Normal file → Executable file
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
BIN
images/icons/iconic_characters/Jenette.webp
Executable file
After Width: | Height: | Size: 20 KiB |
BIN
images/icons/iconic_characters/Jonah.webp
Executable file
After Width: | Height: | Size: 11 KiB |
BIN
images/icons/iconic_characters/Nadgar.webp
Executable file
After Width: | Height: | Size: 12 KiB |
BIN
images/icons/iconic_characters/Nigel.webp
Executable file
After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 5.9 KiB |
0
images/icons/skills/Athletics.webp
Normal file → Executable file
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
0
images/icons/skills/Brawn.webp
Normal file → Executable file
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 8.1 KiB |
0
images/icons/skills/Charm.webp
Normal file → Executable file
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 3.1 KiB |
0
images/icons/skills/Haggle.webp
Normal file → Executable file
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
0
images/icons/skills/Intuition.webp
Normal file → Executable file
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.2 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 8.1 KiB |
BIN
images/icons/skills/Ride Mount.webp
Normal file → Executable file
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 8.7 KiB |
@ -50,7 +50,7 @@ export class CrucibleActorSheet extends ActorSheet {
|
||||
race: duplicate(this.actor.getRace()),
|
||||
moneys: duplicate(this.actor.getMoneys()),
|
||||
encCapacity: this.actor.getEncumbranceCapacity(),
|
||||
saveRoll: this.actor.getSaveRoll(),
|
||||
saveRolls: this.actor.getSaveRoll(),
|
||||
containersTree: this.actor.containersTree,
|
||||
encCurrent: this.actor.encCurrent,
|
||||
options: this.options,
|
||||
@ -94,17 +94,6 @@ export class CrucibleActorSheet extends ActorSheet {
|
||||
this.actor.createEmbeddedDocuments('Item', [{ name: "NewItem", type: dataType }], { renderSheet: true })
|
||||
})
|
||||
|
||||
html.find('.spec-group-activate').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
let itemId = li.data("item-id");
|
||||
this.actor.specPowerActivate( itemId)
|
||||
});
|
||||
html.find('.spec-group-deactivate').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
let itemId = li.data("item-id");
|
||||
this.actor.specPowerDeactivate( itemId)
|
||||
});
|
||||
|
||||
html.find('.equip-activate').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item")
|
||||
let itemId = li.data("item-id")
|
||||
@ -116,37 +105,6 @@ export class CrucibleActorSheet extends ActorSheet {
|
||||
this.actor.equipDeactivate( itemId)
|
||||
});
|
||||
|
||||
html.find('.effect-used').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
let itemId = li.data("item-id");
|
||||
this.actor.perkEffectUsed( itemId)
|
||||
});
|
||||
|
||||
html.find('.perk-status').change(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
let itemId = li.data("item-id");
|
||||
this.actor.updatePerkStatus( itemId, ev.currentTarget.value)
|
||||
});
|
||||
|
||||
html.find('.power-cost-spent').change(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
let itemId = li.data("item-id");
|
||||
this.actor.updatePowerSpentCost( itemId, ev.currentTarget.value)
|
||||
});
|
||||
|
||||
html.find('.power-dmg-roll').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item")
|
||||
let itemId = li.data("item-id")
|
||||
this.actor.powerDmgRoll( itemId )
|
||||
})
|
||||
|
||||
html.find('.perk-used').change(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item")
|
||||
let itemId = li.data("item-id")
|
||||
let index = Number($(ev.currentTarget).data("use-index") )
|
||||
this.actor.updatePerkUsed( itemId, index, ev.currentTarget.checked )
|
||||
});
|
||||
|
||||
html.find('.subactor-edit').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
let actorId = li.data("actor-id");
|
||||
@ -177,46 +135,6 @@ export class CrucibleActorSheet extends ActorSheet {
|
||||
const li = $(event.currentTarget).parents(".item")
|
||||
this.actor.incDecAmmo( li.data("item-id"), +1 )
|
||||
} );
|
||||
|
||||
html.find('.stun-minus').click(event => {
|
||||
this.actor.modifyStun( -1 )
|
||||
} )
|
||||
html.find('.stun-plus').click(event => {
|
||||
this.actor.modifyStun( 1 )
|
||||
} )
|
||||
|
||||
|
||||
html.find('.momentum-minus').click(event => {
|
||||
this.actor.modifyMomentum( -1 )
|
||||
} )
|
||||
html.find('.momentum-plus').click(event => {
|
||||
this.actor.modifyMomentum( 1 )
|
||||
} )
|
||||
|
||||
html.find('.unarmed-attack').click((event) => {
|
||||
this.actor.rollUnarmedAttack();
|
||||
});
|
||||
html.find('.generic-pool-roll').click((event) => {
|
||||
this.openGenericRoll()
|
||||
} );
|
||||
html.find('.attack-melee').click((event) => {
|
||||
this.actor.rollPool( 'com', false, "melee-atk");
|
||||
});
|
||||
html.find('.attack-ranged').click((event) => {
|
||||
this.actor.rollPool( 'agi', false, "ranged-atk");
|
||||
});
|
||||
html.find('.defense-roll').click((event) => {
|
||||
this.actor.rollPool( 'def', true);
|
||||
});
|
||||
html.find('.damage-melee').click((event) => {
|
||||
this.actor.rollPool( 'str', false, "melee-dmg");
|
||||
});
|
||||
html.find('.damage-ranged').click((event) => {
|
||||
this.actor.rollPool( 'per', false, "ranged-dmg");
|
||||
});
|
||||
html.find('.damage-resistance').click((event) => {
|
||||
this.actor.rollPool( 'phy', false, "dmg-res");
|
||||
});
|
||||
|
||||
html.find('.roll-ability').click((event) => {
|
||||
const abilityKey = $(event.currentTarget).data("ability-key");
|
||||
@ -232,28 +150,11 @@ export class CrucibleActorSheet extends ActorSheet {
|
||||
const skillId = li.data("item-id")
|
||||
this.actor.rollWeapon(skillId)
|
||||
});
|
||||
html.find('.weapon-roll').click((event) => {
|
||||
const li = $(event.currentTarget).parents(".item");
|
||||
const weaponId = li.data("item-id");
|
||||
this.actor.rollWeapon(weaponId);
|
||||
});
|
||||
html.find('.armor-roll').click((event) => {
|
||||
const li = $(event.currentTarget).parents(".item");
|
||||
const armorId = li.data("item-id");
|
||||
this.actor.rollArmor(armorId);
|
||||
html.find('.roll-save').click((event) => {
|
||||
const saveKey = $(event.currentTarget).data("save-key")
|
||||
this.actor.rollSave(saveKey)
|
||||
});
|
||||
|
||||
html.find('.weapon-damage-roll').click((event) => {
|
||||
const li = $(event.currentTarget).parents(".item");
|
||||
const weaponId = li.data("item-id");
|
||||
this.actor.rollWeapon(weaponId, true);
|
||||
});
|
||||
|
||||
html.find('.weapon-damage').click((event) => {
|
||||
const li = $(event.currentTarget).parents(".item");
|
||||
const weapon = this.actor.getOwnedItem(li.data("item-id"));
|
||||
this.actor.rollDamage(weapon, 'damage');
|
||||
});
|
||||
|
||||
html.find('.lock-unlock-sheet').click((event) => {
|
||||
this.options.editScore = !this.options.editScore;
|
||||
@ -269,35 +170,12 @@ export class CrucibleActorSheet extends ActorSheet {
|
||||
this.actor.equipItem( li.data("item-id") );
|
||||
this.render(true);
|
||||
});
|
||||
html.find('.power-activate').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
this.actor.activatePower( li.data("item-id") );
|
||||
this.render(true);
|
||||
});
|
||||
html.find('.vice-virtue-activate').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item")
|
||||
this.actor.activateViceOrVirtue( li.data("item-id") )
|
||||
this.render(true);
|
||||
})
|
||||
|
||||
html.find('.change-worstfear').change(ev => {
|
||||
this.actor.manageWorstFear( ev.currentTarget.checked )
|
||||
});
|
||||
html.find('.change-desires').change(ev => {
|
||||
this.actor.manageDesires( ev.currentTarget.checked )
|
||||
});
|
||||
|
||||
html.find('.update-field').change(ev => {
|
||||
const fieldName = $(ev.currentTarget).data("field-name");
|
||||
let value = Number(ev.currentTarget.value);
|
||||
this.actor.update( { [`${fieldName}`]: value } );
|
||||
});
|
||||
html.find('.perk-active').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
this.actor.activatePerk( li.data("item-id") );
|
||||
this.render(true);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
@ -61,12 +61,35 @@ export class CrucibleActor extends Actor {
|
||||
super.prepareData();
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
computeHitPoints( ) {
|
||||
let hp = duplicate(this.data.data.secondary.hp)
|
||||
let max = (this.data.data.abilities.str.value + this.data.data.abilities.con.value) * 6
|
||||
if ( max != hp.max || hp.value > max) {
|
||||
hp.max = max
|
||||
hp.value = max // Init case
|
||||
this.update({ 'data.secondary.hp': hp})
|
||||
}
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
computeEffortPoints( ) {
|
||||
let effort = duplicate(this.data.data.secondary.effort)
|
||||
let max = (this.data.data.abilities.con.value + this.data.data.abilities.int.value) * 6
|
||||
if ( max != effort.max || effort.value > max) {
|
||||
effort.max = max
|
||||
effort.value = max // Init case
|
||||
this.update({ 'data.secondary.effort': effort})
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
prepareDerivedData() {
|
||||
|
||||
if (this.type == 'character') {
|
||||
if (this.type == 'character' || game.user.isGM) {
|
||||
this.data.data.encCapacity = this.getEncumbranceCapacity()
|
||||
this.buildContainerTree()
|
||||
this.computeHitPoints()
|
||||
this.computeEffortPoints()
|
||||
}
|
||||
|
||||
super.prepareDerivedData();
|
||||
@ -515,7 +538,21 @@ export class CrucibleActor extends Actor {
|
||||
}
|
||||
}
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
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
|
||||
//rollData.img = skill.img
|
||||
|
||||
this.startRoll(rollData)
|
||||
}
|
||||
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async startRoll(rollData) {
|
||||
this.syncRoll(rollData)
|
||||
|
@ -271,15 +271,23 @@ export class CrucibleUtility {
|
||||
|
||||
let actor = game.actors.get(rollData.actorId)
|
||||
|
||||
// stat => 0
|
||||
let diceFormula = String(rollData.ability.value) + "d6cs>=5"
|
||||
// ability/save => 0
|
||||
let diceFormula
|
||||
let startFormula = "0d6cs>=5"
|
||||
if ( rollData.ability) {
|
||||
startFormula = String(rollData.ability.value) + "d6cs>=5"
|
||||
}
|
||||
if ( rollData.save) {
|
||||
startFormula = String(rollData.save.value) + "d6cs>=5"
|
||||
}
|
||||
diceFormula = startFormula
|
||||
|
||||
// skill => 2
|
||||
// feat => 4
|
||||
// bonus => 6
|
||||
if (rollData.skill) {
|
||||
let level = rollData.skill.data.level
|
||||
if (level == 0 && rollData.skill.data.isfeatdie ) {
|
||||
if (rollData.skill.data.issl2 ) {
|
||||
rollData.hasSLBonus = true
|
||||
level += 2
|
||||
if (level > 7) { level = 7}
|
||||
@ -292,7 +300,7 @@ export class CrucibleUtility {
|
||||
rollData.rollAdvantage = "roll-disadvantage"
|
||||
}
|
||||
|
||||
if (rollData.skill.data.level > 0 && rollData.skill.data.isfeatdie) {
|
||||
if (rollData.skill.data.isfeatdie) {
|
||||
rollData.hasFeatDie = true
|
||||
diceFormula += "+ 1d10cs>=5"
|
||||
} else {
|
||||
@ -341,6 +349,7 @@ export class CrucibleUtility {
|
||||
}
|
||||
|
||||
// Performs roll
|
||||
console.log("Roll formula", diceFormula)
|
||||
let myRoll = rollData.roll
|
||||
if (!myRoll) { // New rolls only of no rerolls
|
||||
myRoll = new Roll(diceFormula).roll({ async: false })
|
||||
|
@ -208,11 +208,11 @@
|
||||
"styles": [
|
||||
"styles/simple.css"
|
||||
],
|
||||
"templateVersion": 11,
|
||||
"templateVersion": 12,
|
||||
"title": "Crucible RPG",
|
||||
"manifest": "https://www.uberwald.me/gitea/public/fvtt-crucible-rpg/raw/master/system.json",
|
||||
"download": "https://www.uberwald.me/gitea/public/fvtt-crucible-rpg/archive/fvtt-crucible-rpg-v0.1.18.zip",
|
||||
"download": "https://www.uberwald.me/gitea/public/fvtt-crucible-rpg/archive/fvtt-crucible-rpg-v0.1.19.zip",
|
||||
"url": "https://www.uberwald.me/gitea/public/fvtt-crucible-rpg",
|
||||
"version": "0.1.18",
|
||||
"version": "0.1.19",
|
||||
"background" : "./images/ui/crucible_welcome_page.webp"
|
||||
}
|
||||
|
@ -66,13 +66,13 @@
|
||||
"hp": {
|
||||
"label": "Hitpoint",
|
||||
"abbrev": "hb",
|
||||
"value": 0,
|
||||
"value": -1,
|
||||
"max": 0
|
||||
},
|
||||
"effort": {
|
||||
"label": "Effort",
|
||||
"abbrev": "eff",
|
||||
"value": 0,
|
||||
"value": -1,
|
||||
"max": 0
|
||||
}
|
||||
},
|
||||
@ -122,6 +122,7 @@
|
||||
"isproficient": false,
|
||||
"isweaponskill": false,
|
||||
"isfeatdie": false,
|
||||
"issl2": false,
|
||||
"islore": false,
|
||||
"skilltype": "",
|
||||
"isinnate": false,
|
||||
|
@ -18,6 +18,14 @@
|
||||
|
||||
<div>
|
||||
<ul>
|
||||
{{#if save}}
|
||||
<li>Save : {{save.label}} - {{save.value}}d6
|
||||
({{#each roll.terms.0.results as |die idx|}}
|
||||
{{die.result}}
|
||||
{{/each}})
|
||||
</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if ability}}
|
||||
<li>Ability : {{ability.label}} - {{ability.value}}d6
|
||||
({{#each roll.terms.0.results as |die idx|}}
|
||||
@ -25,6 +33,7 @@
|
||||
{{/each}})
|
||||
</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if skill}}
|
||||
<li>Skill : {{skill.name}} - {{skill.data.level}}d8
|
||||
{{#if featSL}}
|
||||
@ -91,8 +100,8 @@
|
||||
<li>Roll with Disadvantage because of Complex Skill at SL 0 !</li>
|
||||
{{/if}}
|
||||
|
||||
{{#if (ne featDieName "none")}}
|
||||
<li>Feature Die : d10 ({{featDieName}})
|
||||
{{#if hasFeatDie}}
|
||||
<li>Feature Die : d10
|
||||
({{#each roll.terms.4.results as |die idx|}}
|
||||
{{die.result}}
|
||||
{{/each}})
|
||||
|
@ -23,9 +23,12 @@
|
||||
</select>
|
||||
</li>
|
||||
|
||||
<li class="flexrow"><label class="generic-label">Is Feat Die (or SL +2) ?</label>
|
||||
<li class="flexrow"><label class="generic-label">Is Feat Die ?</label>
|
||||
<label class="attribute-value checkbox"><input type="checkbox" name="data.isfeatdie" {{checked data.isfeatdie}}/></label>
|
||||
</li>
|
||||
<li class="flexrow"><label class="generic-label">Is SL +2 ?</label>
|
||||
<label class="attribute-value checkbox"><input type="checkbox" name="data.issl2" {{checked data.issl2}}/></label>
|
||||
</li>
|
||||
|
||||
<li class="flexrow"><label class="generic-label">Subject to Armor Penalty ?</label>
|
||||
<label class="attribute-value checkbox"><input type="checkbox" name="data.armorpenalty" {{checked data.armorpenalty}}/></label>
|
||||
|
@ -1,4 +1,27 @@
|
||||
<ul class="status-block">
|
||||
<li class="item flexrow list-item" data-attr-key="hp">
|
||||
<span class="ability-label " name="hp">
|
||||
<h4 class="ability-text-white ability-margin">HP</h4>
|
||||
</span>
|
||||
<span class="ability-label ability-margin"><input class="input-numeric-short" name="data.secondary.hp.value" value="{{data.secondary.hp.value}}"></span>
|
||||
<span class="ability-label ability-margin"> / {{data.secondary.hp.max}}</span>
|
||||
</li>
|
||||
<li class="item flexrow list-item" data-attr-key="hp">
|
||||
<span class="ability-label " name="hp">
|
||||
<h4 class="ability-text-white ability-margin">Effort</h4>
|
||||
</span>
|
||||
<span class="ability-label ability-margin"><input class="input-numeric-short" name="data.secondary.effort.value" value="{{data.secondary.effort.value}}"></span>
|
||||
<span class="ability-label ability-margin"> / {{data.secondary.effort.max}}</span>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<li> </li>
|
||||
|
||||
{{#each saveRolls as |save key|}}
|
||||
<li class="item flexrow list-item" data-attr-key="{{key}}">
|
||||
<span class="ability-label " name="{{key}}">
|
||||
<h4 class="ability-text-white ability-margin"><a class="roll-save ability-margin" data-save-key="{{key}}">{{save.label}} {{save.value}}</a></h4>
|
||||
</span>
|
||||
</li>
|
||||
{{/each}}
|
||||
<ul>
|
||||
|
||||
|
@ -8,10 +8,19 @@
|
||||
|
||||
<div class="flexcol">
|
||||
|
||||
{{#if save}}
|
||||
<div class="flexrow">
|
||||
<span class="roll-dialog-label">{{save.label}} : </span>
|
||||
<span class="roll-dialog-label">{{save.value}}d6</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if ability}}
|
||||
<div class="flexrow">
|
||||
<span class="roll-dialog-label">Ability : </span>
|
||||
<span class="roll-dialog-label">{{ability.value}}d6</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if weapon}}
|
||||
<div class="flexrow">
|
||||
|