Added basic cards implementation
This commit is contained in:
parent
9d07ec2ce0
commit
9904c3dcd3
14
hench.mjs
14
hench.mjs
@ -1,3 +1,5 @@
|
|||||||
|
import { HenchCard, HenchCardDataModel } from "./module/cards/hench-card.mjs";
|
||||||
|
import { HenchCards, HenchCardsDataModel } from "./module/cards/hench-cards.mjs";
|
||||||
import { BossDataModel, HenchDataModel } from "./module/data-models.mjs";
|
import { BossDataModel, HenchDataModel } from "./module/data-models.mjs";
|
||||||
|
|
||||||
import { HenchActorSheet } from "./module/sheets/hench-actor-sheet.mjs";
|
import { HenchActorSheet } from "./module/sheets/hench-actor-sheet.mjs";
|
||||||
@ -40,6 +42,18 @@ Hooks.once("init", () => {
|
|||||||
boss: BossDataModel,
|
boss: BossDataModel,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CONFIG.Card.dataModels = {
|
||||||
|
base: HenchCardDataModel,
|
||||||
|
};
|
||||||
|
CONFIG.Card.documentClass = HenchCard;
|
||||||
|
|
||||||
|
CONFIG.Cards.dataModels = {
|
||||||
|
base: HenchCardsDataModel,
|
||||||
|
};
|
||||||
|
CONFIG.Cards.documentClass = HenchCards;
|
||||||
|
|
||||||
|
console.log(CONFIG);
|
||||||
|
|
||||||
Actors.unregisterSheet('core', ActorSheet);
|
Actors.unregisterSheet('core', ActorSheet);
|
||||||
Actors.registerSheet('hench', HenchActorSheet, {
|
Actors.registerSheet('hench', HenchActorSheet, {
|
||||||
makeDefault: true,
|
makeDefault: true,
|
||||||
|
29
module/cards/hench-card.mjs
Normal file
29
module/cards/hench-card.mjs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
const { HTMLField, SchemaField, NumberField, StringField, BooleanField, FilePathField, ArrayField } = foundry.data.fields;
|
||||||
|
|
||||||
|
export const CARD_ZONES = {
|
||||||
|
DECK: 'DECK',
|
||||||
|
DISCARD: 'DISCARD',
|
||||||
|
SPREAD: 'SPREAD',
|
||||||
|
HELD: 'HELD',
|
||||||
|
};
|
||||||
|
|
||||||
|
// Data Model
|
||||||
|
export class HenchCardDataModel extends foundry.abstract.TypeDataModel {
|
||||||
|
static defineSchema() {
|
||||||
|
return {
|
||||||
|
cue: new StringField({required: true, blank: true, initial: ""}),
|
||||||
|
zone: new StringField({required: true, blank: false, initial: CARD_ZONES.DECK, options: CARD_ZONES}),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Document Class
|
||||||
|
export class HenchCard extends Card {
|
||||||
|
get numericalValue() {
|
||||||
|
if(this.value < 7) {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
135
module/cards/hench-cards.mjs
Normal file
135
module/cards/hench-cards.mjs
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
import { CARD_ZONES } from "./hench-card.mjs";
|
||||||
|
|
||||||
|
const { StringField } = foundry.data.fields;
|
||||||
|
|
||||||
|
// Data Model
|
||||||
|
export class HenchCardsDataModel extends foundry.abstract.TypeDataModel {
|
||||||
|
static defineSchema() {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Document Class
|
||||||
|
export class HenchCards extends Cards {
|
||||||
|
// Getters
|
||||||
|
get allCards() {
|
||||||
|
return this.cards.contents;
|
||||||
|
}
|
||||||
|
|
||||||
|
get deck() {
|
||||||
|
return this.cardsInZone(CARD_ZONES.DECK);
|
||||||
|
}
|
||||||
|
|
||||||
|
get discard() {
|
||||||
|
return this.allCards.filter(
|
||||||
|
c => c.system.zone === CARD_ZONES.DISCARD
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
get spread() {
|
||||||
|
return this.allCards.filter(
|
||||||
|
c => c.system.zone === CARD_ZONES.SPREAD
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
get held() {
|
||||||
|
return this.allCards.filter(
|
||||||
|
c => c.system.zone === CARD_ZONES.HELD
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
cardsInZone(zone) {
|
||||||
|
return this.allCards.filter(
|
||||||
|
c => c.system.zone === zone
|
||||||
|
).sort((a, b) => a.sort - b.sort);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mutations
|
||||||
|
|
||||||
|
async updateCards(mutation) {
|
||||||
|
await this.update({
|
||||||
|
cards: mutation,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// After moving cards, re-assign sorting to minimal required values
|
||||||
|
async realignSorting() {
|
||||||
|
await this.realignSubstackSorting(CARD_ZONES.DECK);
|
||||||
|
await this.realignSubstackSorting(CARD_ZONES.SPREAD);
|
||||||
|
await this.realignSubstackSorting(CARD_ZONES.HELD);
|
||||||
|
await this.realignSubstackSorting(CARD_ZONES.DISCARD);
|
||||||
|
}
|
||||||
|
|
||||||
|
async realignSubstackSorting(zone) {
|
||||||
|
const cards = this.cardsInZone(zone);
|
||||||
|
|
||||||
|
const sortedCards = cards.sort((a, b) => a.sort - b.sort);
|
||||||
|
|
||||||
|
const mutation = sortedCards.map(
|
||||||
|
(c, i) => ({
|
||||||
|
_id: c._id,
|
||||||
|
sort: i
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
await this.updateCards(mutation);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Randomize sorting of cards, only in deck.
|
||||||
|
async shuffleDeck() {
|
||||||
|
const cards = this.cardsInZone(CARD_ZONES.DECK);
|
||||||
|
|
||||||
|
const shuffleMutation = cards.map(
|
||||||
|
c => ({
|
||||||
|
_id: c._id,
|
||||||
|
sort: Math.floor(Math.random() * cards.length)
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
await this.updateCards(shuffleMutation);
|
||||||
|
|
||||||
|
await this.realignSorting();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send all cards back to the deck, and shuffle.
|
||||||
|
async resetDeck() {
|
||||||
|
await this.sendCards(this.discard, CARD_ZONES.DECK);
|
||||||
|
await this.sendCards(this.held, CARD_ZONES.DECK);
|
||||||
|
await this.sendCards(this.spread, CARD_ZONES.DECK);
|
||||||
|
|
||||||
|
await this.shuffleDeck();
|
||||||
|
}
|
||||||
|
|
||||||
|
async sendCards(cards, zone, dest = CONST.CARD_DRAW_MODES.BOTTOM) {
|
||||||
|
const existingZone = this.cardsInZone(zone);
|
||||||
|
|
||||||
|
const mutation = cards.map(
|
||||||
|
(c, i) => {
|
||||||
|
let destIndex;
|
||||||
|
|
||||||
|
switch(dest) {
|
||||||
|
case CONST.CARD_DRAW_MODES.BOTTOM:
|
||||||
|
case CONST.CARD_DRAW_MODES.LAST:
|
||||||
|
destIndex = existingZone.length + i;
|
||||||
|
break;
|
||||||
|
case CONST.CARD_DRAW_MODES.TOP:
|
||||||
|
case CONST.CARD_DRAW_MODES.FIRST:
|
||||||
|
destIndex = (-1 * cards.length) + i;
|
||||||
|
break;
|
||||||
|
default: // Random
|
||||||
|
destIndex = Math.floor(Math.random() * existingZone.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
_id: c._id,
|
||||||
|
['system.zone']: zone,
|
||||||
|
sort: destIndex
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
await this.updateCards(mutation);
|
||||||
|
|
||||||
|
await this.realignSorting();
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user