Skip to content

Commit

Permalink
Bug fix: cyphers and artifacts rendered on a PC sheet would generate …
Browse files Browse the repository at this point in the history
…errors
  • Loading branch information
SolarBear committed Jul 3, 2021
1 parent 8b2bbb4 commit 60f4d92
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 67 deletions.
34 changes: 21 additions & 13 deletions module/actor/sheets/NumeneraPCActorSheet.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,12 @@ function orderItems(a, b) {
let dataA = a.data;
let dataB = b.data;

// if (game.data.version.startsWith("0.8.")) {
// dataA = dataA.data;
// dataB = dataB.data;
// }
//TODO wat
if (dataA.data)
dataA = dataA.data;

if (dataB.data)
dataB = dataB.data;

if (dataA.order < dataB.order) return -1;
if (dataA.order > dataB.order) return 1;
Expand Down Expand Up @@ -198,7 +200,8 @@ export class NumeneraPCActorSheet extends ActorSheet {
// }

//TODO: fix this, this is TERRIBLE, but necessary
if (typeof sheetData.data.items === "object") {
//if (typeof sheetData.data.items === "object") {
if (sheetData.data.items.constructor.name !== "EmbeddedCollection") {
//"old style" PCs have an object as items property, whose properties are item types
// if (sheetData.data[val])
// sheetData.data[val] = Object.values(sheetData.data[val]);
Expand Down Expand Up @@ -431,34 +434,37 @@ export class NumeneraPCActorSheet extends ActorSheet {
* @memberof NumeneraPCActorSheet
*/
_setCyphersData(sheetData, useCypherType) {
const isEditable = game.user.hasRole(game.settings.get("numenera", "cypherArtifactEdition"));

sheetData.data.artifacts = sheetData.data.artifacts.map(artifact => {
// if (artifact.data)
// artifact = artifact.data;

artifact.editable = game.user.hasRole(game.settings.get("numenera", "cypherArtifactEdition"));

//TODO find some means to avoid repeating this code for artifacts and cyphers
//both here and inside their respective classes
const artifactData = game.data.version.startsWith("0.7.") ? artifact.data : artifact.data;
if (!artifactData.identified && !artifact.editable) {
let artifactData = game.data.version.startsWith("0.7.") ? artifact.data : artifact.data.data;
if (!artifactData.identified && !isEditable) {
//Make it so that unidentified artifacts appear as blank items
artifact = NumeneraArtifactItem.asUnidentified(artifact);
artifactData = game.data.version.startsWith("0.7.") ? artifact.data : artifact.data.data;
}
else {
artifactData.effect = removeHtmlTags(artifactData.effect);
}

artifact.editable = isEditable;
artifact.showIcon = artifact.img && sheetData.settings.icons.numenera;

return artifact;
});

sheetData.data.cyphers = sheetData.data.cyphers.map(cypher => {
cypher.editable = game.user.hasRole(game.settings.get("numenera", "cypherArtifactEdition"));

const cypherData = game.data.version.startsWith("0.7.") ? cypher.data : cypher.data;
if (!cypherData.identified && !cypher.editable) {
//TODO this is disgusting, really.
let cypherData = game.data.version.startsWith("0.7.") ? cypher.data : cypher.data.data;
if (!cypherData.identified && !isEditable) {
//Make it so that unidentified cyphers appear as blank items
cypher = NumeneraCypherItem.asUnidentified(cypher);
cypherData = game.data.version.startsWith("0.7.") ? cypher.data : cypher.data.data;
}
else {
cypherData.effect = removeHtmlTags(cypherData.effect);
Expand All @@ -469,7 +475,9 @@ export class NumeneraPCActorSheet extends ActorSheet {
cypherData.cypherType = Object.keys(NUMENERA.cypherTypes[NumeneraCypherItem.cypherTypeFlavor])[0];
}

cypher.editable = isEditable;
cypher.showIcon = cypher.img && sheetData.settings.icons.numenera;

return cypher;
});

Expand Down
64 changes: 38 additions & 26 deletions module/item/NumeneraCypherItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,17 @@ export class NumeneraCypherItem extends Item {
*
* @memberof NumeneraCypherItem
*/
static asUnidentified(cypher) {
if (cypher.constructor === Object)
cypher = NumeneraCypherItem.fromOwnedItem(cypher);
static asUnidentified(cypher) {
debugger;
if (cypher.constructor === Object)
cypher = NumeneraCypherItem.fromOwnedItem(cypher);

cypher.data.name = game.i18n.localize("NUMENERA.pc.numenera.cypher.unidentified");
cypher.data.data.level = game.i18n.localize("NUMENERA.unknown");
cypher.data.data.effect = game.i18n.localize("NUMENERA.unknown");
cypher.data.data.cypherType = null;
cypher.data.name = game.i18n.localize("NUMENERA.pc.numenera.cypher.unidentified");
cypher.data.data.level = game.i18n.localize("NUMENERA.unknown");
cypher.data.data.effect = game.i18n.localize("NUMENERA.unknown");
cypher.data.data.cypherType = null;

return cypher;
return cypher;
}

/**
Expand All @@ -29,31 +30,42 @@ export class NumeneraCypherItem extends Item {
* @returns
* @memberof NumeneraCypherItem
*/
static fromOwnedItem(ownedItem, actor) {
let cypherItem = new NumeneraCypherItem();
cypherItem.data._id = ownedItem._id;
cypherItem.data.name = ownedItem.name;
cypherItem.data.price = ownedItem.data.price;
cypherItem.data.notes = ownedItem.data.notes;
cypherItem.data.efffect = ownedItem.data.effect;
cypherItem.data.form = ownedItem.data.form;
cypherItem.data.level = ownedItem.data.level;
cypherItem.data.levelDie = ownedItem.data.levelDie;
cypherItem.data.range = ownedItem.data.range;

cypherItem.options.actor = actor;

cypherItem.prepareData();

return cypherItem;
static async fromOwnedItem(ownedItem, actor) {
let cypherItem;

if (game.data.version.startsWith("0.7.")) {
cypherItem = new NumeneraCypherItem();
}
else {
if (actor === null)
cypherItem = await actor.createEmbeddedDocuments("Item", [this.object]);
else
cypherItem = new Item(this.object);
}

cypherItem.data._id = ownedItem._id;
cypherItem.data.name = ownedItem.name;
cypherItem.data.price = ownedItem.data.price;
cypherItem.data.notes = ownedItem.data.notes;
cypherItem.data.efffect = ownedItem.data.effect;
cypherItem.data.form = ownedItem.data.form;
cypherItem.data.level = ownedItem.data.level;
cypherItem.data.levelDie = ownedItem.data.levelDie;
cypherItem.data.range = ownedItem.data.range;

cypherItem.options.actor = actor;

cypherItem.prepareData();

return cypherItem;
}

prepareData() {
super.prepareData();

// Override common default icon
if (!this.data.img || (game.data.version.startsWith("0.7.") || this.data.img === this.data.constructor.DEFAULT_ICON))
this.data.img = 'icons/svg/pill.svg';
this.data.img = 'icons/svg/pill.svg';

let itemData = this.data;
if (itemData.hasOwnProperty("data"))
Expand Down
15 changes: 13 additions & 2 deletions module/item/NumeneraPowerShiftItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,19 @@ export class NumeneraPowerShiftItem extends Item {
return "powerShift";
}

static fromOwnedItem(ownedItem, actor) {
let powerShiftItem = new NumeneraPowerShiftItem();
static async fromOwnedItem(ownedItem, actor) {
let powerShiftItem;

if (game.data.version.startsWith("0.7.")) {
powerShiftItem = new NumeneraPowerShiftItem();
}
else {
if (actor === null)
powerShiftItem = await actor.createEmbeddedDocuments("Item", [this.object]);
else
powerShiftItem = new Item(this.object);
}

powerShiftItem.data._id = ownedItem._id;
powerShiftItem.data.name = ownedItem.name;
powerShiftItem.data.data.version = parseInt(ownedItem.data.version);
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "numenera-foundryvtt",
"version": "1.5.3",
"version": "1.5.4",
"description": "Support for the Cypher System (including Numenera and The Strange role playing games) for the Foundry virtual tabletop",
"devDependencies": {
"ava": "^3.13.0",
Expand Down
6 changes: 3 additions & 3 deletions system.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "numenera",
"title": "Numenera (Cypher System)",
"description": "Featureful support for Cypher system games, including Numenera and The Strange for the Fountry Virtual TableTop.",
"version": "1.5.3",
"version": "1.5.4",
"author": "SolarBear (David Lacerte)",
"scripts": [],
"esmodules": ["numenera.js"],
Expand Down Expand Up @@ -45,8 +45,8 @@
],
"socket": true,
"minimumCoreVersion": "0.7.9",
"compatibleCoreVersion": "0.8.7",
"compatibleCoreVersion": "0.8.8",
"url": "https://github.com/SolarBear/Numenera-FoundryVTT",
"manifest": "https://raw.githubusercontent.com/SolarBear/Numenera-FoundryVTT/master/system.json",
"download": "https://github.com/SolarBear/Numenera-FoundryVTT/releases/download/1.5.3/numenera-foundryvtt-1.5.3.zip"
"download": "https://github.com/SolarBear/Numenera-FoundryVTT/releases/download/1.5.4/numenera-foundryvtt-1.5.4.zip"
}
31 changes: 16 additions & 15 deletions templates/actor/partials/artifacts.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ <h2>{{localize "NUMENERA.pc.numenera.artifact.name"}}</h2>

<ul class="artifacts row-container">
{{#each data.artifacts as |artifact|}}
<li class="artifact" data-item-id={{artifact._id}} data-order={{artifact.data.order}}>
{{log artifact}}
<li class="artifact" data-item-id={{artifact._id}} data-order={{artifact.data.data.order}}>
<table class="artifact-header-table">
<tbody>
<td>
Expand All @@ -21,16 +22,16 @@ <h4><strong>{{artifact.name}}</strong></h4>
<td class="artifact-level">
{{#if artifact.editable}}
<label>{{localize "NUMENERA.pc.numenera.artifact.identified"}}
<input type="checkbox" name="data.artifacts.{{artifact._id}}.data.identified"
data-dtype="Boolean" {{checked artifact.data.identified}}/>
<input type="checkbox" name="data.data.artifacts.{{artifact._id}}.data.identified"
data-dtype="Boolean" {{checked artifact.data.data.identified}}/>
</label>
<br />
<label>{{localize "NUMENERA.pc.numenera.artifact.level"}}
<input type="number" name="data.artifacts.{{artifact._id}}.data.level"
min="1" value="{{artifact.data.level}}" data-dtype="Number" />
<input type="number" name="data.data.artifacts.{{artifact._id}}.data.level"
min="1" value="{{artifact.data.data.level}}" data-dtype="Number" />
</label>
{{else}}
<span>Level</span> {{artifact.data.level}}
<span>Level</span> {{artifact.data.data.level}}
{{/if}}
</td>

Expand All @@ -39,32 +40,32 @@ <h4><strong>{{artifact.name}}</strong></h4>
{{#if ../isTheStrange}}
<label>
{{localize "NUMENERA.pc.numenera.artifact.laws"}}
<input type="text" name="data.artifacts.{{artifact._id}}.data.laws" value="{{artifact.data.laws}}" />
<input type="text" name="data.data.artifacts.{{artifact._id}}.data.laws" value="{{artifact.data.data.laws}}" />
</label>
{{/if}}
<label>
{{localize "NUMENERA.pc.numenera.artifact.form"}}
<input type="text" name="data.artifacts.{{artifact._id}}.data.form" value="{{artifact.data.form}}" />
<input type="text" name="data.data.artifacts.{{artifact._id}}.data.form" value="{{artifact.data.data.form}}" />
</label>
<label>
{{localize "NUMENERA.pc.numenera.artifact.effect"}}
<textarea name="data.artifacts.{{artifact._id}}.data.effect">{{artifact.data.effect}}</textarea>
<textarea name="data.data.artifacts.{{artifact._id}}.data.effect">{{artifact.data.data.effect}}</textarea>
</label>
{{else}}
{{#if ../isTheStrange}}
<span><strong>{{localize "NUMENERA.pc.numenera.artifact.laws"}}:</strong></span> {{artifact.data.laws}}
<span><strong>{{localize "NUMENERA.pc.numenera.artifact.laws"}}:</strong></span> {{artifact.data.data.laws}}
{{/if}}
<p>
<span><strong>{{localize "NUMENERA.pc.numenera.artifact.form"}}:</strong></span> {{artifact.data.form}}
<span><strong>{{localize "NUMENERA.pc.numenera.artifact.form"}}:</strong></span> {{artifact.data.data.form}}
</p>
<p>
<span><strong>{{localize "NUMENERA.pc.numenera.artifact.effect"}}:</strong></span> {{artifact.data.effect}}
<span><strong>{{localize "NUMENERA.pc.numenera.artifact.effect"}}:</strong></span> {{artifact.data.data.effect}}
</p>
{{/if}}
{{#if artifact.data.depletion.isDepleting}}
{{#if artifact.data.data.depletion.isDepleting}}
<p>
<span><strong>{{localize "NUMENERA.pc.numenera.artifact.depletion"}}: </strong></span> {{artifact.data.depletion.threshold}} {{localize "NUMENERA.pc.numenera.artifact.in"}}
{{artifact.data.depletion.die}}
<span><strong>{{localize "NUMENERA.pc.numenera.artifact.depletion"}}: </strong></span> {{artifact.data.data.depletion.threshold}} {{localize "NUMENERA.pc.numenera.artifact.in"}}
{{artifact.data.data.depletion.die}}
<button class="artifact-depletion-roll">{{localize "NUMENERA.pc.numenera.artifact.roll"}}</button>
</p>
{{/if}}
Expand Down
14 changes: 7 additions & 7 deletions templates/actor/partials/cyphers.html
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,20 @@ <h4><strong>{{cypher.name}}</strong></h4>
{{#if cypher.editable}}
<label>{{localize "NUMENERA.pc.numenera.cypher.identified"}}
<input type="checkbox" name="data.cyphers.{{cypher._id}}.data.identified"
data-dtype="Boolean" {{checked cypher.data.identified}} />
data-dtype="Boolean" {{checked cypher.data.data.identified}} />
</label>
<br />
<label>{{localize "NUMENERA.pc.numenera.cypher.level"}}
<input type="number" name="data.cyphers.{{cypher._id}}.data.level"
value="{{cypher.data.level}}" min="1" data-dtype="Number" />
value="{{cypher.data.data.level}}" min="1" data-dtype="Number" />
</label>

{{#if ../displayCypherType}}
<br />
<label>{{localize "NUMENERA.item.cypher.type.label"}}
<select name="data.cyphers.{{cypher._id}}.data.cypherType" data-dtype="String"
class="cypher-type">
{{#select cypher.data.cypherType}}
{{#select cypher.data.data.cypherType}}
{{#each ../cypherTypes}}
<option value="{{this}}">{{localize this}}</option>
{{/each}}
Expand All @@ -53,12 +53,12 @@ <h4><strong>{{cypher.name}}</strong></h4>
</label>
{{/if}}
{{else}}
<span>{{localize "NUMENERA.pc.numenera.cypher.level"}}</span> {{cypher.data.level}}
<span>{{localize "NUMENERA.pc.numenera.cypher.level"}}</span> {{cypher.data.data.level}}

{{#if ../displayCypherType}}
<br />
<span>{{localize "NUMENERA.item.cypher.type.label"}}</span>&nbsp;
{{#if cypher.data.identified}}
{{#if cypher.data.data.identified}}
{{localize cypher.data.cypherType}}
{{else}}
{{localize "NUMENERA.unknown"}}
Expand All @@ -71,11 +71,11 @@ <h4><strong>{{cypher.name}}</strong></h4>
{{#if cypher.editable}}
<label>
{{localize "NUMENERA.pc.numenera.cypher.form"}}
<input type="text" name="data.cyphers.{{cypher._id}}.data.form" value="{{cypher.data.form}}" />
<input type="text" name="data.cyphers.{{cypher._id}}.data.form" value="{{cypher.data.data.form}}" />
</label>
<label>
{{localize "NUMENERA.pc.numenera.cypher.effect"}}
<textarea name="data.cyphers.{{cypher._id}}.data.effect">{{cypher.data.effect}}</textarea>
<textarea name="data.cyphers.{{cypher._id}}.data.effect">{{cypher.data.data.effect}}</textarea>
</label>
{{else}}
<p>
Expand Down

0 comments on commit 60f4d92

Please sign in to comment.