Skip to content

Commit

Permalink
Merge pull request #11 from diabeatz96/agenda-bugs-party-overview
Browse files Browse the repository at this point in the history
Agenda bugs party overview
  • Loading branch information
diabeatz96 authored Aug 25, 2024
2 parents a8a9a83 + ff8b2dc commit 014e102
Show file tree
Hide file tree
Showing 34 changed files with 945 additions and 188 deletions.
Binary file added assets/player-overview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 4 additions & 4 deletions css/cain.css
Original file line number Diff line number Diff line change
Expand Up @@ -1245,7 +1245,7 @@
position: relative;
}

.talisman-button, .risk-roll-button, .fate-roll-button {
.talisman-button, .risk-roll-button, .fate-roll-button, .player-overview-button {
background: none;
border: none;
padding: 0;
Expand All @@ -1257,17 +1257,17 @@
vertical-align: middle;
}

.talisman-button img, .risk-roll-button img, .fate-roll-button img {
.talisman-button img, .risk-roll-button img, .fate-roll-button img, .player-overview-button img {
border: none;
width: 100%;
height: auto;
transition: filter 0.3s ease;
}

.talisman-button img:hover, .risk-roll-button img:hover, .fate-roll-button img:hover {
.talisman-button img:hover, .risk-roll-button img:hover, .fate-roll-button img:hover, .player-overview-button img:hover {
filter: brightness(1.2); /* Adjust the brightness to highlight the icon */
}

.talisman-button.clicked img, .risk-roll-button.clicked img, .fate-roll-button.clicked img {
.talisman-button.clicked img, .risk-roll-button.clicked img, .fate-roll-button.clicked img, .player-overview-button.clicked img {
filter: brightness(0.8); /* Adjust the brightness to indicate the button has been clicked */
}
29 changes: 27 additions & 2 deletions module/cain.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import { CainItemSheet } from './sheets/item-sheet.mjs';
// Import helper/utility classes and constants.
import { preloadHandlebarsTemplates } from './helpers/templates.mjs';
import { CAIN } from './helpers/config.mjs';
import { PlayerOverview } from './documents/player-overview.mjs';

// Import DataModel classes
import * as models from './data/_module.mjs';

Expand Down Expand Up @@ -84,7 +86,7 @@ Hooks.once('init', function () {
imagePath: 'systems/cain/assets/Talismans/Talisman-A-0.png',
currMarkAmount: 0,
minMarkAmount: 0,
maxMarkAmount: 6,
maxMarkAmount: 2,
isHidden: false,
},
],
Expand Down Expand Up @@ -124,12 +126,35 @@ Handlebars.registerHelper('set', function(context, key, value, options) {
context[key] = value;
});

Handlebars.registerHelper('calcPercentage', function(curr, max) {
return (curr / max) * 100;
});

/* -------------------------------------------- */
/* Ready Hook */
/* -------------------------------------------- */

Hooks.once('ready', function () {
// Function to create and insert the Talisman button

function addPlayerOverviewButton() {
if(!game.user.isGM) return;

const button = $('<button title="Player Overview" class="player-overview-button"><img src="systems/cain/assets/player-overview.png" alt="Player Overview"></button>');
button.on('click', () => {
new PlayerOverview().render(true);
});

const aside = $('<aside class="talisman-container"></aside>').append(button);
const actionBar = $('#action-bar');
if (actionBar.length) {
actionBar.append(aside);
console.log('Player Overview button inserted successfully.');
} else {
console.error('Action bar not found.');
}
}

function addTalismanButton() {
// Create the button element with the talisman icon
const button = $('<button title="Global Talismans" class="talisman-button"><img src="systems/cain/assets/talisman-icon.png" alt="Talisman Icon"></button>');
Expand Down Expand Up @@ -188,7 +213,7 @@ Hooks.once('ready', function () {

// Add the Talisman button when the action bar is first ready
addTalismanButton();

addPlayerOverviewButton();
// Add the Risk Roll and Fate Roll buttons when the action bar is first ready
addRiskRollButton();
addFateRollButton();
Expand Down
50 changes: 40 additions & 10 deletions module/data/actor-character.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,6 @@ export default class CainCharacter extends CainActorBase {
}),
});

// Iterate over ability names and create a new SchemaField for each.
schema.abilities = new fields.SchemaField(Object.keys(CONFIG.CAIN.abilities).reduce((obj, ability) => {
obj[ability] = new fields.SchemaField({
value: new fields.NumberField({ ...requiredInteger, initial: 10, min: 0 }),
});
return obj;
}, {}));

schema.skills = new fields.SchemaField(Object.keys(CONFIG.CAIN.skills).reduce((obj, skill) => {
obj[skill] = new fields.SchemaField({
Expand Down Expand Up @@ -47,7 +40,7 @@ export default class CainCharacter extends CainActorBase {

schema.advancements = new fields.SchemaField({
value: new fields.NumberField({ required: true, initial: 0, max: 4 }),
max: new fields.NumberField({ required: true, initial: 0, max: 4 }),
max: new fields.NumberField({ required: true, initial: 4, max: 4 }),
});

schema.scrip = new fields.NumberField({ required: true, initial: 0, min: 0, max: 1000 });
Expand Down Expand Up @@ -115,8 +108,15 @@ export default class CainCharacter extends CainActorBase {

schema.restDiceModifier = new fields.NumberField({ required: true, initial: 0, min: -3, max: 3 });

schema.currentAgendaItems = new fields.ArrayField(new fields.StringField({ required: true, initial: " " }), { required: true, initial: [] });
schema.currentAgendaAbilities = new fields.ArrayField(new fields.StringField({ required: true, initial: " " }), { required: true, initial: [] });
schema.currentAgendaItems = new fields.ArrayField(new fields.SchemaField({
text: new fields.StringField({ required: true, initial: " " }),
isBold: new fields.BooleanField({ required: true, initial: false })
}), { required: true, initial: [] });

schema.currentAgendaAbilities = new fields.ArrayField(new fields.SchemaField({
text: new fields.StringField({ required: true, initial: " " }),
isBold: new fields.BooleanField({ required: true, initial: false })
}), { required: true, initial: [] });

return schema;
}
Expand Down Expand Up @@ -157,4 +157,34 @@ export default class CainCharacter extends CainActorBase {
this.advancements += 1;
}
}

// Migration function to convert old schema items to new format
static async migrateOldSchema(actor) {
const updateData = {};

// Convert old agenda items to new format
if (actor.system.agendaItems && Array.isArray(actor.system.agendaItems)) {
updateData['system.currentAgendaItems'] = actor.system.agendaItems.map(item => ({
text: item,
isBold: false
}));
}

// Convert old agenda abilities to new format
if (actor.system.agendaAbilities && Array.isArray(actor.system.agendaAbilities)) {
updateData['system.currentAgendaAbilities'] = actor.system.agendaAbilities.map(ability => ({
text: ability,
isBold: false
}));
}

// Update the actor with the new data
await actor.update(updateData);
}

prepareData() {
super.prepareData();
CainCharacter.migrateOldSchema(this);
}

}
70 changes: 70 additions & 0 deletions module/documents/player-overview.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// player-overview.js
export class PlayerOverview extends Application {
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
id: "player-overview",
template: "systems/cain/templates/player-overview.hbs",
width: 800,
height: 700,
title: "Player Overview",
resizable: true,
});
}

getData() {
// Fetch all players
const players = game.users.filter(user => !user.isGM);
const playerData = players.map(player => {
const actor = player.character;
return {
name: player.name,
actor: actor ? actor : null,
message: actor ? null : "No actor assigned. Please assign an actor for player overview."
};
});
console.log(playerData);
return { playerData };
}

activateListeners(html) {
super.activateListeners(html);
// Add any event listeners if needed
}

// Add a method to re-render the application
static refresh() {
const app = Object.values(ui.windows).find(w => w instanceof PlayerOverview);
if (app) {
console.log("Found PlayerOverview instance:", app);

// Save current scroll position and active tab
const scrollPosition = app.element.scrollTop();
const activeTab = app.element.find('.tab.active').attr('data-tab');
console.log("Saved scroll position:", scrollPosition);
console.log("Saved active tab:", activeTab);

// Re-render the application
app.render(true);

// Restore scroll position and active tab after rendering
Hooks.once('renderPlayerOverview', () => {
console.log("Restoring scroll position and active tab...");
app.element.scrollTop(scrollPosition);
app.element.find('.tab').removeClass('active');
app.element.find('.item').removeClass('active');
app.element.find(`.tab[data-tab="${activeTab}"]`).addClass('active');
app.element.find(`.item[data-tab="${activeTab}"]`).addClass('active');
console.log("Restored scroll position:", app.element.scrollTop());
console.log("Restored active tab:", app.element.find('.tab.active').attr('data-tab'));
});
} else {
console.log("PlayerOverview instance not found.");
}
}
}

// Hook to listen for actor updates and refresh the PlayerOverview
Hooks.on("updateActor", () => {
console.log("updateActor hook triggered.");
PlayerOverview.refresh();
});
6 changes: 6 additions & 0 deletions module/helpers/templates.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ export const preloadHandlebarsTemplates = async function () {
return loadTemplates([
// Talismans
'systems/cain/templates/talisman-window.hbs',
// Player Overview
'systems/cain/templates/player-overview.hbs',
'systems/cain/templates/player-overview/overview.hbs',
'systems/cain/templates/player-overview/skills.hbs',
'systems/cain/templates/player-overview/xp.hbs',
'systems/cain/templates/player-overview/talismans.hbs',
// Actor partials.
'systems/cain/templates/actor/parts/actor-features.hbs',
'systems/cain/templates/actor/parts/actor-items.hbs',
Expand Down
Loading

0 comments on commit 014e102

Please sign in to comment.