Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
# Vaarn

- **Author**: Omniczech with heavy reliance on Rabid Baboon's Knave system
- **Foundry VTT Compatibility**: v10
- **Foundry VTT Compatibility**: v12
- **Translation Support**: None

### Foundry VTT Compatibility v9

- Use this manifest <https://raw.githubusercontent.com/omniczech/vaarn-foundryvtt/main/system.json>

# Features

- Attack and damage rolls from character inventory, with target support
Expand Down
80 changes: 40 additions & 40 deletions module/actor/actor-sheet.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,32 @@ import { alternateRolls } from "../settings.js";
* Extend the basic ActorSheet with some very simple modifications
* @extends {ActorSheet}
*/
export class KnaveActorSheet extends ActorSheet {
export class VaarnActorSheet extends ActorSheet {
#_hitTargets = new Set();

/** @override */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
classes: ["knave", "sheet", "actor"],
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["vaarn", "sheet", "actor"],
template: "systems/vaultsofvaarn/templates/actor/actor-sheet.html",
width: 1000,
height: 620,
tabs: [
{
navSelector: ".description-tabs",
contentSelector: ".description-tabs-content",
initial: "description",
},
],
initial: "description"
}
]
});
}

/* -------------------------------------------- */

/** @override */

getData() {
let sheet = super.getData();
return sheet;
async getData() {
const context = super.getData();
return context;
}

/** @override */
Expand All @@ -41,46 +40,46 @@ export class KnaveActorSheet extends ActorSheet {
if (!this.options.editable) return;

// Add Inventory Item
html.find(".item-create").click(this._onItemCreate.bind(this));
html.on('click', '.item-create', this._onItemCreate.bind(this));

//ability button clicked
html.find(".knave-ability-button").click((ev) => {
html.on('click', ".vaarn-ability-button", (ev) => {
this._onAbility_Clicked($(ev.currentTarget)[0].id);
});
html.find(".knave-morale-button").click(this._onMoraleCheck.bind(this));
html.find(".knave-armor-button").click(this._onArmorCheck.bind(this));
html.find(".knave-short-rest-button").click(this._shortRest.bind(this));
html.find(".knave-long-rest-button").click(this._longRest.bind(this));
html.find(".knave-wounded-button").click(this._wounded.bind(this));
html.on('click', '.vaarn-morale-button', this._onMoraleCheck.bind(this));
html.on('click', ".vaarn-armor-button", this._onArmorCheck.bind(this));
html.on('click', ".vaarn-short-rest-button", this._shortRest.bind(this));
html.on('click', ".vaarn-long-rest-button", this._longRest.bind(this));
html.on('click', ".vaarn-wounded-button", this._wounded.bind(this));

// Update Inventory Item
html.find(".item-edit").click((ev) => {
html.on('click', ".item-edit", (ev) => {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.items.get(li.data("itemId"));
item.sheet.render(true);
});

// Delete Inventory Item
html.find(".item-delete").click((ev) => {
html.on('click', ".item-delete", (ev) => {
const button = ev.currentTarget;
const li = button.closest(".item");
const item = this.actor.items.get(li?.dataset.itemId);
return item.delete();
});

//inventory weapon rolls
html.find(".item-roll").click((ev) => {
html.on('click', ".item-roll", (ev) => {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.items.get(li.data("itemId"));
this._onItemRoll(item, ev.currentTarget);
});
html.find(".item-control.item-add").click((ev) => {
html.on('click', ".item-control.item-add", (ev) => {
const button = ev.currentTarget;
const li = button.closest(".item");
const item = this.actor.items.get(li?.dataset.itemId);
item.update({ ["data.quantity"]: item.system.quantity + 1 });
});
html.find(".item-control.item-remove").click((ev) => {
html.on('click', ".item-control.item-remove", (ev) => {
const button = ev.currentTarget;
const li = button.closest(".item");
const item = this.actor.items.get(li?.dataset.itemId);
Expand Down Expand Up @@ -108,7 +107,7 @@ export class KnaveActorSheet extends ActorSheet {
const itemData = {
name: name,
type: type,
data: data,
data: data
};
// Remove the type from the dataset since it's in the itemData.type prop.
delete itemData.data["type"];
Expand All @@ -117,7 +116,7 @@ export class KnaveActorSheet extends ActorSheet {
return cls.create(itemData, { parent: this.actor });
}

_onAbility_Clicked(ability, additional = null) {
async _onAbility_Clicked(ability, additional = null) {
let score = 0;
let name = "";
var diceToRoll = alternateRolls() ? "2d10" : "1d20";
Expand Down Expand Up @@ -160,17 +159,18 @@ export class KnaveActorSheet extends ActorSheet {
}

let formula = `${diceToRoll}+${score}`;
console.log(formula);
let r = new Roll(formula);
r.evaluate({ async: false });
await r.evaluate();

let returnCode = 0;
let messageHeader = "<b>" + name + "</b>";
if (r.dice[0].total <= critFail)
messageHeader +=
' - <span class="knave-ability-crit knave-ability-critFailure">CRITICAL FAILURE!</span>';
' - <span class="vaarn-ability-crit vaarn-ability-critFailure">CRITICAL FAILURE!</span>';
else if (r.dice[0].total >= critSuccess)
messageHeader +=
' - <span class="knave-ability-crit knave-ability-critSuccess">CRITICAL SUCCESS!</span>';
' - <span class="vaarn-ability-crit vaarn-ability-critSuccess">CRITICAL SUCCESS!</span>';

r.toMessage({
speaker: ChatMessage.getSpeaker({ actor: this.actor }),
Expand All @@ -186,39 +186,39 @@ export class KnaveActorSheet extends ActorSheet {
console.log(event);
}

_onMoraleCheck(event) {
async _onMoraleCheck(event) {
event.preventDefault();

let r = new Roll(`2d6`);
r.evaluate({ async: false });
await r.evaluate();

let messageHeader = "";
if (r.dice[0].total > this.object.system.morale.value)
messageHeader +=
'<span class="knave-ability-crit knave-ability-critFailure">Is fleeing</span>';
'<span class="vaarn-ability-crit vaarn-ability-critFailure">Is fleeing</span>';
else
messageHeader +=
'<span class="knave-ability-crit knave-ability-critSuccess">Is staying</span>';
'<span class="vaarn-ability-crit vaarn-ability-critSuccess">Is staying</span>';
r.toMessage({ flavor: messageHeader });
}

_onArmorCheck(event) {
async _onArmorCheck(event) {
let name = "ARMOR";
let score = this.object.system.armor.bonus;
event.preventDefault();

let formula = `1d20+${score}`;
let r = new Roll(formula);
r.evaluate({ async: false });
await r.evaluate();

let returnCode = 0;
let messageHeader = "<b>" + name + "</b>";
if (r.dice[0].total === 1)
messageHeader +=
' - <span class="knave-ability-crit knave-ability-critFailure">CRITICAL FAILURE!</span>';
' - <span class="vaarn-ability-crit vaarn-ability-critFailure">CRITICAL FAILURE!</span>';
else if (r.dice[0].total === 20)
messageHeader +=
' - <span class="knave-ability-crit knave-ability-critSuccess">CRITICAL SUCCESS!</span>';
' - <span class="vaarn-ability-crit vaarn-ability-critSuccess">CRITICAL SUCCESS!</span>';

r.toMessage({
speaker: ChatMessage.getSpeaker({ actor: this.actor }),
Expand All @@ -227,7 +227,7 @@ export class KnaveActorSheet extends ActorSheet {
return r;
}

_onItemRoll(item, eventTarget) {
async _onItemRoll(item, eventTarget) {
if (eventTarget.title === "attack") {
if (item.type === "weaponMelee") {
const roll = this._onAbility_Clicked(
Expand All @@ -241,7 +241,7 @@ export class KnaveActorSheet extends ActorSheet {
}
} else if (eventTarget.title === "damage") {
let r = new Roll(item.system.damageDice);
r.evaluate({ async: false });
await r.evaluate();
let messageHeader = "<b>" + item.name + "</b> damage";
r.toMessage({
speaker: ChatMessage.getSpeaker({ actor: this.actor }),
Expand Down Expand Up @@ -318,11 +318,11 @@ export class KnaveActorSheet extends ActorSheet {

token.actor.update({ "system.health.value": newHP });
}
_shortRest(event) {
async _shortRest(event) {
const conBonus = this.object.system.abilities.con.value;
let formula = `1d8+${conBonus}`;
let r = new Roll(formula);
r.evaluate({ async: false });
await r.evaluate();
this.object.update({
"system.health.value": r.total + this.object.system.health.value,
});
Expand Down Expand Up @@ -371,7 +371,7 @@ export class KnaveActorSheet extends ActorSheet {
const itemData = {
name: randomWound.name,
type: randomWound.type,
data: randomWound.data,
system: randomWound.system,
img: randomWound.img,
};
ChatMessage.create({
Expand Down
12 changes: 10 additions & 2 deletions module/actor/actor.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,23 @@
* Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system.
* @extends {Actor}
*/
export class KnaveActor extends Actor {
export class VaarnActor extends Actor {
/**
* Augment the basic actor data with additional dynamic data.
*/
prepareData() {
super.prepareData();

}

prepareBaseDate() {

}

prepareDerivedData() {

const data = this.system;
const flags = this.flags;
const flags = this.flags.vaarn || {};

// Make separate methods for each Actor type (character, npc, etc.) to keep
// things organized.
Expand Down
Loading