ENH: Treasure tables !
parent
e7b5919e40
commit
cb9226e764
Binary file not shown.
After Width: | Height: | Size: 57 KiB |
|
@ -0,0 +1,83 @@
|
||||||
|
export const augmentTable = (table, html, data) => {
|
||||||
|
// Treasure Toggle
|
||||||
|
let head = html.find(".sheet-header");
|
||||||
|
const flag = table.object.getFlag("ose", "treasure");
|
||||||
|
const treasure = flag
|
||||||
|
? "<div class='toggle-treasure'><a><i class='fas fa-gem'></i></a></div>"
|
||||||
|
: "<div class='toggle-treasure'><a><i class='far fa-gem'></i></a></div>";
|
||||||
|
head.append(treasure);
|
||||||
|
|
||||||
|
html.find(".toggle-treasure").click((ev) => {
|
||||||
|
let isTreasure = table.object.getFlag("ose", "treasure");
|
||||||
|
table.object.setFlag("ose", "treasure", !isTreasure);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Treasure table formatting
|
||||||
|
if (flag) {
|
||||||
|
// Remove Interval
|
||||||
|
html.find(".result-range").remove();
|
||||||
|
html.find(".normalize-results").remove();
|
||||||
|
|
||||||
|
html.find(".result-weight").first().text("Chance");
|
||||||
|
|
||||||
|
// Replace Roll button
|
||||||
|
const roll = `<button class="roll-treasure" type="button"><i class="fas fa-gem"></i> Roll Treasure</button>`;
|
||||||
|
html.find(".sheet-footer .roll").replaceWith(roll);
|
||||||
|
}
|
||||||
|
|
||||||
|
html.find(".roll-treasure").click((ev) => {
|
||||||
|
rollTreasure(table.object, { event: ev });
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
async function rollTreasure(table, options = {}) {
|
||||||
|
let percent = (chance) => {
|
||||||
|
let roll = new Roll("1d100").roll();
|
||||||
|
return roll.total <= chance;
|
||||||
|
};
|
||||||
|
let templateData = {
|
||||||
|
treasure: [],
|
||||||
|
table: table,
|
||||||
|
};
|
||||||
|
let ids = [];
|
||||||
|
table.results.forEach((r) => {
|
||||||
|
if (percent(r.weight)) {
|
||||||
|
let text = "";
|
||||||
|
switch (r.type) {
|
||||||
|
case 0:
|
||||||
|
text = r.text;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
text = `@${r.collection}[${r.resultId}]{${r.text}}`;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
text = `@Compendium[${r.collection}.${r.resultId}]{${r.text}}`;
|
||||||
|
}
|
||||||
|
templateData.treasure.push({
|
||||||
|
id: r._id,
|
||||||
|
img: r.img,
|
||||||
|
text: TextEditor.enrichHTML(text),
|
||||||
|
});
|
||||||
|
ids.push(r._id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Animation
|
||||||
|
if (options.event) {
|
||||||
|
let results = $(event.currentTarget.parentElement)
|
||||||
|
.prev()
|
||||||
|
.find(".table-result");
|
||||||
|
results.each((_, item) => {
|
||||||
|
item.classList.remove("active");
|
||||||
|
if (ids.includes(item.dataset.resultId)) {
|
||||||
|
item.classList.add("active");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let html = await renderTemplate(
|
||||||
|
"systems/ose/templates/chat/roll-treasure.html",
|
||||||
|
templateData
|
||||||
|
);
|
||||||
|
ChatMessage.create({ content: html });
|
||||||
|
}
|
|
@ -9,6 +9,7 @@ import { OSE } from "./module/config.js";
|
||||||
import { registerSettings } from "./module/settings.js";
|
import { registerSettings } from "./module/settings.js";
|
||||||
import { registerHelpers } from "./module/helpers.js";
|
import { registerHelpers } from "./module/helpers.js";
|
||||||
import * as chat from "./module/chat.js";
|
import * as chat from "./module/chat.js";
|
||||||
|
import * as treasure from "./module/treasure.js";
|
||||||
import * as macros from "./module/macros.js";
|
import * as macros from "./module/macros.js";
|
||||||
import { OseCombat } from "./module/combat.js";
|
import { OseCombat } from "./module/combat.js";
|
||||||
|
|
||||||
|
@ -119,3 +120,5 @@ Hooks.on("preUpdateCombat", async (combat, data, diff, id) => {
|
||||||
Hooks.on("renderChatLog", (app, html, data) => OseItem.chatListeners(html));
|
Hooks.on("renderChatLog", (app, html, data) => OseItem.chatListeners(html));
|
||||||
Hooks.on("getChatLogEntryContext", chat.addChatMessageContextOptions);
|
Hooks.on("getChatLogEntryContext", chat.addChatMessageContextOptions);
|
||||||
Hooks.on("renderChatMessage", chat.addChatMessageButtons);
|
Hooks.on("renderChatMessage", chat.addChatMessageButtons);
|
||||||
|
|
||||||
|
Hooks.on("renderRollTableConfig", treasure.augmentTable);
|
|
@ -16,6 +16,30 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sheet.roll-table-config {
|
||||||
|
.sheet-header {
|
||||||
|
.toggle-treasure {
|
||||||
|
flex: 0 0 30px;
|
||||||
|
font-size: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
margin: 0 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes notify {
|
||||||
|
from {
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
background: rgba(0, 0, 0, 0.12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.results {
|
||||||
|
.table-result.active {
|
||||||
|
animation: 0.7s infinite alternate notify;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#settings .ose.game-license {
|
#settings .ose.game-license {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
.button {
|
.button {
|
||||||
|
@ -107,6 +131,7 @@
|
||||||
img {
|
img {
|
||||||
flex: 0 0 36px;
|
flex: 0 0 36px;
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
|
@ -122,7 +147,22 @@
|
||||||
|
|
||||||
.card-content {
|
.card-content {
|
||||||
margin: 5px 0;
|
margin: 5px 0;
|
||||||
|
.treasure-list {
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
.treasure {
|
||||||
|
img {
|
||||||
|
flex: 0 0 36px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
div {
|
||||||
|
text-indent: 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
line-height: 36px;
|
||||||
|
}
|
||||||
|
}
|
||||||
h3 {
|
h3 {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
<div class="ose chat-card treasure-card">
|
||||||
|
<header class="card-header flexrow">
|
||||||
|
<img src="/systems/ose/assets/chest.png" title="{{table.name}}" width="36" height="36" />
|
||||||
|
<h3>{{table.name}}</h3>
|
||||||
|
</header>
|
||||||
|
<div class="card-content">
|
||||||
|
<ol class="treasure-list">
|
||||||
|
{{#each treasure as |t|}}
|
||||||
|
<li class="treasure flexrow">
|
||||||
|
<img src="{{t.img}}" width="36" height="36" />
|
||||||
|
<div>{{{t.text}}}</div>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
Loading…
Reference in New Issue