valtech-components 4.0.937 → 4.0.939
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/molecules/group-picker/group-picker.component.mjs +97 -0
- package/esm2022/lib/components/organisms/group-members/group-members.component.mjs +178 -0
- package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +1 -381
- package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
- package/esm2022/lib/services/groups/groups.service.mjs +92 -0
- package/esm2022/lib/services/groups/types.mjs +2 -0
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +4 -3
- package/fesm2022/valtech-components.mjs +641 -7612
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/molecules/group-picker/group-picker.component.d.ts +28 -0
- package/lib/components/organisms/group-members/group-members.component.d.ts +43 -0
- package/lib/components/organisms/mini-games/types.d.ts +0 -182
- package/lib/services/groups/groups.service.d.ts +39 -0
- package/lib/services/groups/types.d.ts +69 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +4 -2
- package/src/lib/assets/games/README.md +8 -0
- package/esm2022/lib/components/organisms/mini-games/christianity-bot.mjs +0 -94
- package/esm2022/lib/components/organisms/mini-games/christianity-card.component.mjs +0 -503
- package/esm2022/lib/components/organisms/mini-games/christianity-catalog.mjs +0 -247
- package/esm2022/lib/components/organisms/mini-games/christianity-game.component.mjs +0 -4580
- package/esm2022/lib/components/organisms/mini-games/christianity-rules.mjs +0 -1383
- package/esm2022/lib/components/organisms/mini-games/christianity-tutorial.mjs +0 -152
- package/lib/components/organisms/mini-games/christianity-bot.d.ts +0 -15
- package/lib/components/organisms/mini-games/christianity-card.component.d.ts +0 -55
- package/lib/components/organisms/mini-games/christianity-catalog.d.ts +0 -18
- package/lib/components/organisms/mini-games/christianity-game.component.d.ts +0 -395
- package/lib/components/organisms/mini-games/christianity-rules.d.ts +0 -57
- package/lib/components/organisms/mini-games/christianity-tutorial.d.ts +0 -38
- package/src/lib/assets/games/christianity/card-symbol.svg +0 -51
- package/src/lib/assets/games/christianity/card-template-reference/front.html +0 -114
- package/src/lib/assets/games/christianity/card-template-reference/front.style.css +0 -352
- package/src/lib/assets/games/christianity/data/01-genesis.bible-reference-suggestions.csv +0 -191
- package/src/lib/assets/games/christianity/data/01-genesis.bible-verses.nbv-open.csv +0 -170
- package/src/lib/assets/games/christianity/data/01-genesis.cards.csv +0 -281
- package/src/lib/assets/games/christianity/data/01-genesis.cards.i18n.csv +0 -281
- package/src/lib/assets/games/christianity/data/01-genesis.cards.json +0 -16453
- package/src/lib/assets/games/christianity/data/01-genesis.unassigned-effects.csv +0 -49
- package/src/lib/assets/games/christianity/data/README.md +0 -40
- package/src/lib/assets/games/christianity/data/data-con-habilides.csv +0 -273
- package/src/lib/assets/games/christianity/data/habilidades-por-tipo.xlsx +0 -0
- package/src/lib/assets/games/christianity/data/listado-edicion.csv +0 -281
- package/src/lib/assets/games/christianity/editions/1/cards/.gitkeep +0 -1
- package/src/lib/assets/games/christianity/editions/1/cards/PLACEHOLDER.png +0 -0
- package/src/lib/assets/games/christianity/editions/README.md +0 -34
- package/src/lib/assets/games/christianity/icons/1-icon.png +0 -0
- package/src/lib/assets/games/christianity/icons/action.png +0 -0
- package/src/lib/assets/games/christianity/icons/character.png +0 -0
- package/src/lib/assets/games/christianity/icons/event.png +0 -0
- package/src/lib/assets/games/christianity/icons/leader.png +0 -0
- package/src/lib/assets/games/christianity/icons/offering.png +0 -0
- package/src/lib/assets/games/christianity/icons/place.png +0 -0
- package/src/lib/assets/games/christianity/icons/tool.png +0 -0
- package/src/lib/assets/games/christianity/icons/wisdom.png +0 -0
- package/src/lib/assets/games/christianity/sources/README.md +0 -16
- package/src/lib/assets/games/christianity/sources/spaonbv_vpl.txt +0 -29102
- package/src/lib/assets/games/christianity/sources/spaonbv_vpl.xml +0 -29104
- package/src/lib/assets/games/christianity/spaonbv.txt +0 -52
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { STARTING_GAME } from './christianity-catalog';
|
|
2
|
-
export const TUTORIAL_CHARACTER_LIMIT = 12;
|
|
3
|
-
export const TUTORIAL_OFFERING_LIMIT = 6;
|
|
4
|
-
export const TUTORIAL_OPENING_HAND_SIZE = 5;
|
|
5
|
-
export const TUTORIAL_LEADER_CHOICE_COUNT = 2;
|
|
6
|
-
export const TUTORIAL_LEADER_CHOICE_SECONDS = 15;
|
|
7
|
-
export const TUTORIAL_SEED = 20260728;
|
|
8
|
-
export function isClassicGalleryCard(card) {
|
|
9
|
-
return (card.frontTemplate ?? 'genesis-classic') === 'genesis-classic';
|
|
10
|
-
}
|
|
11
|
-
export function cardSortKey(card, nameResolver = c => c.name) {
|
|
12
|
-
const collector = card.collectorNumber ?? card.id;
|
|
13
|
-
return `${card.edition ?? ''}-${collector.padStart(8, '0')}-${nameResolver(card)}`;
|
|
14
|
-
}
|
|
15
|
-
export function tutorialLeaderCards(cards, nameResolver = c => c.name) {
|
|
16
|
-
const leaders = cards
|
|
17
|
-
.filter(card => card.type === 'leader' && isClassicGalleryCard(card))
|
|
18
|
-
.sort((a, b) => cardSortKey(a, nameResolver).localeCompare(cardSortKey(b, nameResolver), 'es'));
|
|
19
|
-
if (leaders.length >= 2)
|
|
20
|
-
return leaders.slice(0, 4);
|
|
21
|
-
return cards.filter(card => card.type === 'leader').slice(0, 4);
|
|
22
|
-
}
|
|
23
|
-
export function findCardByName(cards, namePart, nameResolver = c => c.name) {
|
|
24
|
-
return cards.find(card => nameResolver(card).toLowerCase().includes(namePart.toLowerCase()));
|
|
25
|
-
}
|
|
26
|
-
export function shuffleCards(cards, seed) {
|
|
27
|
-
const result = [...cards];
|
|
28
|
-
let state = seed >>> 0;
|
|
29
|
-
for (let i = result.length - 1; i > 0; i--) {
|
|
30
|
-
state = (state * 1664525 + 1013904223) >>> 0;
|
|
31
|
-
const j = state % (i + 1);
|
|
32
|
-
[result[i], result[j]] = [result[j], result[i]];
|
|
33
|
-
}
|
|
34
|
-
return result;
|
|
35
|
-
}
|
|
36
|
-
function ensureOpeningOffering(cards, start, size) {
|
|
37
|
-
const hand = cards.slice(start, start + size);
|
|
38
|
-
if (hand.some(card => card.type === 'offering'))
|
|
39
|
-
return;
|
|
40
|
-
const offeringIndex = cards.findIndex((card, i) => i >= start + size && card.type === 'offering');
|
|
41
|
-
if (offeringIndex < 0)
|
|
42
|
-
return;
|
|
43
|
-
[cards[start], cards[offeringIndex]] = [cards[offeringIndex], cards[start]];
|
|
44
|
-
}
|
|
45
|
-
export function prepareTutorialOpeningDeck(cards) {
|
|
46
|
-
const result = [...cards];
|
|
47
|
-
ensureOpeningOffering(result, 0, TUTORIAL_OPENING_HAND_SIZE);
|
|
48
|
-
ensureOpeningOffering(result, TUTORIAL_OPENING_HAND_SIZE, TUTORIAL_OPENING_HAND_SIZE);
|
|
49
|
-
return result;
|
|
50
|
-
}
|
|
51
|
-
export function createTutorialPlayer(seat, leader, hand, battleZone, nameResolver = c => c.name, startingOffering) {
|
|
52
|
-
const base = STARTING_GAME.players[seat];
|
|
53
|
-
const leaderLife = leader?.leaderLife ?? leader?.life ?? base.leaderMaxHp;
|
|
54
|
-
const offerings = startingOffering
|
|
55
|
-
? [
|
|
56
|
-
{
|
|
57
|
-
instanceId: `${seat.toLowerCase()}_offering_start`,
|
|
58
|
-
cardId: startingOffering.id,
|
|
59
|
-
name: nameResolver(startingOffering),
|
|
60
|
-
owner: seat,
|
|
61
|
-
ready: true,
|
|
62
|
-
value: startingOffering.offeringValue ?? startingOffering.life ?? 1,
|
|
63
|
-
abilityName: startingOffering.abilityName,
|
|
64
|
-
abilityText: startingOffering.abilityText,
|
|
65
|
-
abilityCost: startingOffering.abilityCost,
|
|
66
|
-
},
|
|
67
|
-
]
|
|
68
|
-
: [];
|
|
69
|
-
return {
|
|
70
|
-
...structuredClone(base),
|
|
71
|
-
leaderCardId: leader?.id,
|
|
72
|
-
leaderName: leader ? nameResolver(leader) : base.leaderName,
|
|
73
|
-
leaderHp: leaderLife,
|
|
74
|
-
leaderMaxHp: leaderLife,
|
|
75
|
-
offerings,
|
|
76
|
-
offeringPlayedThisTurn: false,
|
|
77
|
-
hand,
|
|
78
|
-
handCount: hand ? undefined : 4,
|
|
79
|
-
battleZone,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
export function createTutorialGame(cards, options = {}, context = {}) {
|
|
83
|
-
const nameResolver = context.nameResolver ?? (c => c.name);
|
|
84
|
-
const cardById = context.cardById;
|
|
85
|
-
const leaders = tutorialLeaderCards(cards, nameResolver);
|
|
86
|
-
const playerLeader = (cardById && options.playerLeaderId ? cardById(options.playerLeaderId) : undefined) ??
|
|
87
|
-
findCardByName(leaders, 'Adán', nameResolver) ??
|
|
88
|
-
findCardByName(leaders, 'Adan', nameResolver) ??
|
|
89
|
-
leaders[0];
|
|
90
|
-
const opponentLeader = (cardById && options.opponentLeaderId ? cardById(options.opponentLeaderId) : undefined) ??
|
|
91
|
-
findCardByName(leaders, 'Noé', nameResolver) ??
|
|
92
|
-
findCardByName(leaders, 'Noe', nameResolver) ??
|
|
93
|
-
leaders.find(c => c.id !== playerLeader?.id) ??
|
|
94
|
-
leaders[0];
|
|
95
|
-
const offerings = cards
|
|
96
|
-
.filter(c => c.type === 'offering' && isClassicGalleryCard(c))
|
|
97
|
-
.slice(0, TUTORIAL_OFFERING_LIMIT);
|
|
98
|
-
const startingOffering = offerings
|
|
99
|
-
.slice()
|
|
100
|
-
.sort((a, b) => (a.offeringValue ?? a.life ?? 1) - (b.offeringValue ?? b.life ?? 1))[0];
|
|
101
|
-
const places = cards.filter(c => c.type === 'place');
|
|
102
|
-
const characters = cards
|
|
103
|
-
.filter(c => c.type === 'character' &&
|
|
104
|
-
isClassicGalleryCard(c) &&
|
|
105
|
-
(c.cost ?? 0) <= 4 &&
|
|
106
|
-
(c.attack ?? 0) >= 0 &&
|
|
107
|
-
(c.life ?? 0) > 0)
|
|
108
|
-
.slice(0, TUTORIAL_CHARACTER_LIMIT);
|
|
109
|
-
const tutorialDeck = [...offerings, ...characters, ...offerings, ...characters.slice(0, 6)].slice(0, 28);
|
|
110
|
-
// Mazo compartido barajado: reparto puro aleatorio, nada de manos fijas.
|
|
111
|
-
// Cada jugador ya arranca con 1 líder + 1 ofrenda en juego (startingOffering); el resto sale del mazo.
|
|
112
|
-
const shuffledDeck = shuffleCards(tutorialDeck, options.seed ?? TUTORIAL_SEED);
|
|
113
|
-
const playerHand = shuffledDeck.slice(0, TUTORIAL_OPENING_HAND_SIZE).map(c => c.id);
|
|
114
|
-
const opponentHand = shuffledDeck
|
|
115
|
-
.slice(TUTORIAL_OPENING_HAND_SIZE, TUTORIAL_OPENING_HAND_SIZE * 2)
|
|
116
|
-
.map(c => c.id);
|
|
117
|
-
const sharedDeck = shuffledDeck.slice(TUTORIAL_OPENING_HAND_SIZE * 2).map(c => c.id);
|
|
118
|
-
const firstPlayer = options.firstPlayer ?? 'P1';
|
|
119
|
-
const firstPlayerName = firstPlayer === 'P1'
|
|
120
|
-
? STARTING_GAME.players.P1.displayName
|
|
121
|
-
: STARTING_GAME.players.P2.displayName;
|
|
122
|
-
const messages = context.messages;
|
|
123
|
-
const log = messages
|
|
124
|
-
? [`${messages.turnOf} ${firstPlayerName}.`, messages.tutorialLoaded]
|
|
125
|
-
: [`Turno de ${firstPlayerName}.`, 'Tutorial cargado.'];
|
|
126
|
-
return {
|
|
127
|
-
...structuredClone(STARTING_GAME),
|
|
128
|
-
status: 'in_progress',
|
|
129
|
-
turnOwner: firstPlayer,
|
|
130
|
-
turnCount: 1,
|
|
131
|
-
matchScore: { P1: 0, P2: 0 },
|
|
132
|
-
sharedDeck,
|
|
133
|
-
placeZone: places[0] ? [places[0].id] : [],
|
|
134
|
-
historyZone: [],
|
|
135
|
-
players: {
|
|
136
|
-
P1: createTutorialPlayer('P1', playerLeader, playerHand, [], nameResolver, startingOffering),
|
|
137
|
-
P2: createTutorialPlayer('P2', opponentLeader, opponentHand, [], nameResolver, startingOffering),
|
|
138
|
-
},
|
|
139
|
-
log,
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
export function createTutorialSetup(leaders, seed = TUTORIAL_SEED) {
|
|
143
|
-
const coinWinner = seed % 2 === 0 ? 'P1' : 'P2';
|
|
144
|
-
const firstPlayer = coinWinner === 'P1' ? 'P2' : 'P1';
|
|
145
|
-
return {
|
|
146
|
-
coinWinner,
|
|
147
|
-
leaderPicker: coinWinner,
|
|
148
|
-
firstPlayer,
|
|
149
|
-
availableLeaders: leaders.slice(0, TUTORIAL_LEADER_CHOICE_COUNT).map(c => c.id),
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hyaXN0aWFuaXR5LXR1dG9yaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9taW5pLWdhbWVzL2NocmlzdGlhbml0eS10dXRvcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUF1QnZELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUMzQyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7QUFDekMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO0FBQzVDLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLENBQUMsQ0FBQztBQUM5QyxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxFQUFFLENBQUM7QUFDakQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFBZ0M7SUFDbkUsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksaUJBQWlCLENBQUMsS0FBSyxpQkFBaUIsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FDekIsSUFBZ0MsRUFDaEMsZUFBNkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtJQUV4RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbEQsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3JGLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLEtBQW1D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LE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsT0FBcUMsRUFDckMsT0FBZSxhQUFhO0lBRTVCLE1BQU0sVUFBVSxHQUFxQixJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbEUsTUFBTSxXQUFXLEdBQXFCLFVBQVUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hFLE9BQU87UUFDTCxVQUFVO1FBQ1YsWUFBWSxFQUFFLFVBQVU7UUFDeEIsV0FBVztRQUNYLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLDRCQUE0QixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNoRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSxcbiAgQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBDaHJpc3RpYW5pdHlQbGF5ZXJTdGF0ZSxcbiAgQ2hyaXN0aWFuaXR5U2VhdCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBTVEFSVElOR19HQU1FIH0gZnJvbSAnLi9jaHJpc3RpYW5pdHktY2F0YWxvZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hyaXN0aWFuaXR5VHV0b3JpYWxTZXR1cCB7XG4gIGNvaW5XaW5uZXI6IENocmlzdGlhbml0eVNlYXQ7XG4gIGxlYWRlclBpY2tlcjogQ2hyaXN0aWFuaXR5U2VhdDtcbiAgZmlyc3RQbGF5ZXI6IENocmlzdGlhbml0eVNlYXQ7XG4gIGF2YWlsYWJsZUxlYWRlcnM6IHN0cmluZ1tdO1xuICBwbGF5ZXJMZWFkZXJJZD86IHN0cmluZztcbiAgb3Bwb25lbnRMZWFkZXJJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXRvcmlhbEdhbWVNZXNzYWdlcyB7XG4gIHR1cm5PZjogc3RyaW5nO1xuICB0dXRvcmlhbExvYWRlZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1dG9yaWFsR2FtZU9wdGlvbnMge1xuICBwbGF5ZXJMZWFkZXJJZD86IHN0cmluZztcbiAgb3Bwb25lbnRMZWFkZXJJZD86IHN0cmluZztcbiAgZmlyc3RQbGF5ZXI/OiBDaHJpc3RpYW5pdHlTZWF0O1xuICBzZWVkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgVFVUT1JJQUxfQ0hBUkFDVEVSX0xJTUlUID0gMTI7XG5leHBvcnQgY29uc3QgVFVUT1JJQUxfT0ZGRVJJTkdfTElNSVQgPSA2O1xuZXhwb3J0IGNvbnN0IFRVVE9SSUFMX09QRU5JTkdfSEFORF9TSVpFID0gNTtcbmV4cG9ydCBjb25zdCBUVVRPUklBTF9MRUFERVJfQ0hPSUNFX0NPVU5UID0gMjtcbmV4cG9ydCBjb25zdCBUVVRPUklBTF9MRUFERVJfQ0hPSUNFX1NFQ09ORFMgPSAxNTtcbmV4cG9ydCBjb25zdCBUVVRPUklBTF9TRUVEID0gMjAyNjA3Mjg7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NsYXNzaWNHYWxsZXJ5Q2FyZChjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gKGNhcmQuZnJvbnRUZW1wbGF0ZSA/PyAnZ2VuZXNpcy1jbGFzc2ljJykgPT09ICdnZW5lc2lzLWNsYXNzaWMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FyZFNvcnRLZXkoXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICBuYW1lUmVzb2x2ZXI6IChjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbikgPT4gc3RyaW5nID0gYyA9PiBjLm5hbWVcbik6IHN0cmluZyB7XG4gIGNvbnN0IGNvbGxlY3RvciA9IGNhcmQuY29sbGVjdG9yTnVtYmVyID8/IGNhcmQuaWQ7XG4gIHJldHVybiBgJHtjYXJkLmVkaXRpb24gPz8gJyd9LSR7Y29sbGVjdG9yLnBhZFN0YXJ0KDgsICcwJyl9LSR7bmFtZVJlc29sdmVyKGNhcmQpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0dXRvcmlhbExlYWRlckNhcmRzKFxuICBjYXJkczogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25bXSxcbiAgbmFtZVJlc29sdmVyOiAoY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24pID0+IHN0cmluZyA9IGMgPT4gYy5uYW1lXG4pOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbltdIHtcbiAgY29uc3QgbGVhZGVycyA9IGNhcmRzXG4gICAgLmZpbHRlcihjYXJkID0+IGNhcmQudHlwZSA9PT0gJ2xlYWRlcicgJiYgaXNDbGFzc2ljR2FsbGVyeUNhcmQoY2FyZCkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGNhcmRTb3J0S2V5KGEsIG5hbWVSZXNvbHZlcikubG9jYWxlQ29tcGFyZShjYXJkU29ydEtleShiLCBuYW1lUmVzb2x2ZXIpLCAnZXMnKSk7XG4gIGlmIChsZWFkZXJzLmxlbmd0aCA+PSAyKSByZXR1cm4gbGVhZGVycy5zbGljZSgwLCA0KTtcbiAgcmV0dXJuIGNhcmRzLmZpbHRlcihjYXJkID0+IGNhcmQudHlwZSA9PT0gJ2xlYWRlcicpLnNsaWNlKDAsIDQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENhcmRCeU5hbWUoXG4gIGNhcmRzOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbltdLFxuICBuYW1lUGFydDogc3RyaW5nLFxuICBuYW1lUmVzb2x2ZXI6IChjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbikgPT4gc3RyaW5nID0gYyA9PiBjLm5hbWVcbik6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNhcmRzLmZpbmQoY2FyZCA9PiBuYW1lUmVzb2x2ZXIoY2FyZCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuYW1lUGFydC50b0xvd2VyQ2FzZSgpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaHVmZmxlQ2FyZHMoXG4gIGNhcmRzOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbltdLFxuICBzZWVkOiBudW1iZXJcbik6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uW10ge1xuICBjb25zdCByZXN1bHQgPSBbLi4uY2FyZHNdO1xuICBsZXQgc3RhdGUgPSBzZWVkID4+PiAwO1xuICBmb3IgKGxldCBpID0gcmVzdWx0Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICBzdGF0ZSA9IChzdGF0ZSAqIDE2NjQ1MjUgKyAxMDEzOTA0MjIzKSA+Pj4gMDtcbiAgICBjb25zdCBqID0gc3RhdGUgJSAoaSArIDEpO1xuICAgIFtyZXN1bHRbaV0sIHJlc3VsdFtqXV0gPSBbcmVzdWx0W2pdLCByZXN1bHRbaV1dO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZU9wZW5pbmdPZmZlcmluZyhcbiAgY2FyZHM6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uW10sXG4gIHN0YXJ0OiBudW1iZXIsXG4gIHNpemU6IG51bWJlclxuKTogdm9pZCB7XG4gIGNvbnN0IGhhbmQgPSBjYXJkcy5zbGljZShzdGFydCwgc3RhcnQgKyBzaXplKTtcbiAgaWYgKGhhbmQuc29tZShjYXJkID0+IGNhcmQudHlwZSA9PT0gJ29mZmVyaW5nJykpIHJldHVybjtcbiAgY29uc3Qgb2ZmZXJpbmdJbmRleCA9IGNhcmRzLmZpbmRJbmRleCgoY2FyZCwgaSkgPT4gaSA+PSBzdGFydCArIHNpemUgJiYgY2FyZC50eXBlID09PSAnb2ZmZXJpbmcnKTtcbiAgaWYgKG9mZmVyaW5nSW5kZXggPCAwKSByZXR1cm47XG4gIFtjYXJkc1tzdGFydF0sIGNhcmRzW29mZmVyaW5nSW5kZXhdXSA9IFtjYXJkc1tvZmZlcmluZ0luZGV4XSwgY2FyZHNbc3RhcnRdXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVUdXRvcmlhbE9wZW5pbmdEZWNrKFxuICBjYXJkczogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25bXVxuKTogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25bXSB7XG4gIGNvbnN0IHJlc3VsdCA9IFsuLi5jYXJkc107XG4gIGVuc3VyZU9wZW5pbmdPZmZlcmluZyhyZXN1bHQsIDAsIFRVVE9SSUFMX09QRU5JTkdfSEFORF9TSVpFKTtcbiAgZW5zdXJlT3BlbmluZ09mZmVyaW5nKHJlc3VsdCwgVFVUT1JJQUxfT1BFTklOR19IQU5EX1NJWkUsIFRVVE9SSUFMX09QRU5JTkdfSEFORF9TSVpFKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR1dG9yaWFsUGxheWVyKFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0LFxuICBsZWFkZXI6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uIHwgdW5kZWZpbmVkLFxuICBoYW5kOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgYmF0dGxlWm9uZTogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2VbXSxcbiAgbmFtZVJlc29sdmVyOiAoY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24pID0+IHN0cmluZyA9IGMgPT4gYy5uYW1lLFxuICBzdGFydGluZ09mZmVyaW5nPzogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25cbik6IENocmlzdGlhbml0eVBsYXllclN0YXRlIHtcbiAgY29uc3QgYmFzZSA9IFNUQVJUSU5HX0dBTUUucGxheWVyc1tzZWF0XTtcbiAgY29uc3QgbGVhZGVyTGlmZSA9IGxlYWRlcj8ubGVhZGVyTGlmZSA/PyBsZWFkZXI/LmxpZmUgPz8gYmFzZS5sZWFkZXJNYXhIcDtcbiAgY29uc3Qgb2ZmZXJpbmdzID0gc3RhcnRpbmdPZmZlcmluZ1xuICAgID8gW1xuICAgICAgICB7XG4gICAgICAgICAgaW5zdGFuY2VJZDogYCR7c2VhdC50b0xvd2VyQ2FzZSgpfV9vZmZlcmluZ19zdGFydGAsXG4gICAgICAgICAgY2FyZElkOiBzdGFydGluZ09mZmVyaW5nLmlkLFxuICAgICAgICAgIG5hbWU6IG5hbWVSZXNvbHZlcihzdGFydGluZ09mZmVyaW5nKSxcbiAgICAgICAgICBvd25lcjogc2VhdCxcbiAgICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogc3RhcnRpbmdPZmZlcmluZy5vZmZlcmluZ1ZhbHVlID8/IHN0YXJ0aW5nT2ZmZXJpbmcubGlmZSA/PyAxLFxuICAgICAgICAgIGFiaWxpdHlOYW1lOiBzdGFydGluZ09mZmVyaW5nLmFiaWxpdHlOYW1lLFxuICAgICAgICAgIGFiaWxpdHlUZXh0OiBzdGFydGluZ09mZmVyaW5nLmFiaWxpdHlUZXh0LFxuICAgICAgICAgIGFiaWxpdHlDb3N0OiBzdGFydGluZ09mZmVyaW5nLmFiaWxpdHlDb3N0LFxuICAgICAgICB9LFxuICAgICAgXVxuICAgIDogW107XG4gIHJldHVybiB7XG4gICAgLi4uc3RydWN0dXJlZENsb25lKGJhc2UpLFxuICAgIGxlYWRlckNhcmRJZDogbGVhZGVyPy5pZCxcbiAgICBsZWFkZXJOYW1lOiBsZWFkZXIgPyBuYW1lUmVzb2x2ZXIobGVhZGVyKSA6IGJhc2UubGVhZGVyTmFtZSxcbiAgICBsZWFkZXJIcDogbGVhZGVyTGlmZSxcbiAgICBsZWFkZXJNYXhIcDogbGVhZGVyTGlmZSxcbiAgICBvZmZlcmluZ3MsXG4gICAgb2ZmZXJpbmdQbGF5ZWRUaGlzVHVybjogZmFsc2UsXG4gICAgaGFuZCxcbiAgICBoYW5kQ291bnQ6IGhhbmQgPyB1bmRlZmluZWQgOiA0LFxuICAgIGJhdHRsZVpvbmUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUdXRvcmlhbEdhbWUoXG4gIGNhcmRzOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbltdLFxuICBvcHRpb25zOiBUdXRvcmlhbEdhbWVPcHRpb25zID0ge30sXG4gIGNvbnRleHQ6IHtcbiAgICBtZXNzYWdlcz86IFR1dG9yaWFsR2FtZU1lc3NhZ2VzO1xuICAgIG5hbWVSZXNvbHZlcj86IChjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbikgPT4gc3RyaW5nO1xuICAgIGNhcmRCeUlkPzogKGlkOiBzdHJpbmcpID0+IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uIHwgdW5kZWZpbmVkO1xuICB9ID0ge31cbik6IENocmlzdGlhbml0eUdhbWVTdGF0ZSB7XG4gIGNvbnN0IG5hbWVSZXNvbHZlciA9IGNvbnRleHQubmFtZVJlc29sdmVyID8/IChjID0+IGMubmFtZSk7XG4gIGNvbnN0IGNhcmRCeUlkID0gY29udGV4dC5jYXJkQnlJZDtcbiAgY29uc3QgbGVhZGVycyA9IHR1dG9yaWFsTGVhZGVyQ2FyZHMoY2FyZHMsIG5hbWVSZXNvbHZlcik7XG5cbiAgY29uc3QgcGxheWVyTGVhZGVyID1cbiAgICAoY2FyZEJ5SWQgJiYgb3B0aW9ucy5wbGF5ZXJMZWFkZXJJZCA/IGNhcmRCeUlkKG9wdGlvbnMucGxheWVyTGVhZGVySWQpIDogdW5kZWZpbmVkKSA/P1xuICAgIGZpbmRDYXJkQnlOYW1lKGxlYWRlcnMsICdBZMOhbicsIG5hbWVSZXNvbHZlcikgPz9cbiAgICBmaW5kQ2FyZEJ5TmFtZShsZWFkZXJzLCAnQWRhbicsIG5hbWVSZXNvbHZlcikgPz9cbiAgICBsZWFkZXJzWzBdO1xuXG4gIGNvbnN0IG9wcG9uZW50TGVhZGVyID1cbiAgICAoY2FyZEJ5SWQgJiYgb3B0aW9ucy5vcHBvbmVudExlYWRlcklkID8gY2FyZEJ5SWQob3B0aW9ucy5vcHBvbmVudExlYWRlcklkKSA6IHVuZGVmaW5lZCkgPz9cbiAgICBmaW5kQ2FyZEJ5TmFtZShsZWFkZXJzLCAnTm/DqScsIG5hbWVSZXNvbHZlcikgPz9cbiAgICBmaW5kQ2FyZEJ5TmFtZShsZWFkZXJzLCAnTm9lJywgbmFtZVJlc29sdmVyKSA/P1xuICAgIGxlYWRlcnMuZmluZChjID0+IGMuaWQgIT09IHBsYXllckxlYWRlcj8uaWQpID8/XG4gICAgbGVhZGVyc1swXTtcblxuICBjb25zdCBvZmZlcmluZ3MgPSBjYXJkc1xuICAgIC5maWx0ZXIoYyA9PiBjLnR5cGUgPT09ICdvZmZlcmluZycgJiYgaXNDbGFzc2ljR2FsbGVyeUNhcmQoYykpXG4gICAgLnNsaWNlKDAsIFRVVE9SSUFMX09GRkVSSU5HX0xJTUlUKTtcblxuICBjb25zdCBzdGFydGluZ09mZmVyaW5nID0gb2ZmZXJpbmdzXG4gICAgLnNsaWNlKClcbiAgICAuc29ydCgoYSwgYikgPT4gKGEub2ZmZXJpbmdWYWx1ZSA/PyBhLmxpZmUgPz8gMSkgLSAoYi5vZmZlcmluZ1ZhbHVlID8/IGIubGlmZSA/PyAxKSlbMF07XG5cbiAgY29uc3QgcGxhY2VzID0gY2FyZHMuZmlsdGVyKGMgPT4gYy50eXBlID09PSAncGxhY2UnKTtcblxuICBjb25zdCBjaGFyYWN0ZXJzID0gY2FyZHNcbiAgICAuZmlsdGVyKFxuICAgICAgYyA9PlxuICAgICAgICBjLnR5cGUgPT09ICdjaGFyYWN0ZXInICYmXG4gICAgICAgIGlzQ2xhc3NpY0dhbGxlcnlDYXJkKGMpICYmXG4gICAgICAgIChjLmNvc3QgPz8gMCkgPD0gNCAmJlxuICAgICAgICAoYy5hdHRhY2sgPz8gMCkgPj0gMCAmJlxuICAgICAgICAoYy5saWZlID8/IDApID4gMFxuICAgIClcbiAgICAuc2xpY2UoMCwgVFVUT1JJQUxfQ0hBUkFDVEVSX0xJTUlUKTtcblxuICBjb25zdCB0dXRvcmlhbERlY2sgPSBbLi4ub2ZmZXJpbmdzLCAuLi5jaGFyYWN0ZXJzLCAuLi5vZmZlcmluZ3MsIC4uLmNoYXJhY3RlcnMuc2xpY2UoMCwgNildLnNsaWNlKFxuICAgIDAsXG4gICAgMjhcbiAgKTtcbiAgLy8gTWF6byBjb21wYXJ0aWRvIGJhcmFqYWRvOiByZXBhcnRvIHB1cm8gYWxlYXRvcmlvLCBuYWRhIGRlIG1hbm9zIGZpamFzLlxuICAvLyBDYWRhIGp1Z2Fkb3IgeWEgYXJyYW5jYSBjb24gMSBsw61kZXIgKyAxIG9mcmVuZGEgZW4ganVlZ28gKHN0YXJ0aW5nT2ZmZXJpbmcpOyBlbCByZXN0byBzYWxlIGRlbCBtYXpvLlxuICBjb25zdCBzaHVmZmxlZERlY2sgPSBzaHVmZmxlQ2FyZHModHV0b3JpYWxEZWNrLCBvcHRpb25zLnNlZWQgPz8gVFVUT1JJQUxfU0VFRCk7XG5cbiAgY29uc3QgcGxheWVySGFuZCA9IHNodWZmbGVkRGVjay5zbGljZSgwLCBUVVRPUklBTF9PUEVOSU5HX0hBTkRfU0laRSkubWFwKGMgPT4gYy5pZCk7XG4gIGNvbnN0IG9wcG9uZW50SGFuZCA9IHNodWZmbGVkRGVja1xuICAgIC5zbGljZShUVVRPUklBTF9PUEVOSU5HX0hBTkRfU0laRSwgVFVUT1JJQUxfT1BFTklOR19IQU5EX1NJWkUgKiAyKVxuICAgIC5tYXAoYyA9PiBjLmlkKTtcbiAgY29uc3Qgc2hhcmVkRGVjayA9IHNodWZmbGVkRGVjay5zbGljZShUVVRPUklBTF9PUEVOSU5HX0hBTkRfU0laRSAqIDIpLm1hcChjID0+IGMuaWQpO1xuXG4gIGNvbnN0IGZpcnN0UGxheWVyID0gb3B0aW9ucy5maXJzdFBsYXllciA/PyAnUDEnO1xuICBjb25zdCBmaXJzdFBsYXllck5hbWUgPVxuICAgIGZpcnN0UGxheWVyID09PSAnUDEnXG4gICAgICA/IFNUQVJUSU5HX0dBTUUucGxheWVycy5QMS5kaXNwbGF5TmFtZVxuICAgICAgOiBTVEFSVElOR19HQU1FLnBsYXllcnMuUDIuZGlzcGxheU5hbWU7XG5cbiAgY29uc3QgbWVzc2FnZXMgPSBjb250ZXh0Lm1lc3NhZ2VzO1xuICBjb25zdCBsb2cgPSBtZXNzYWdlc1xuICAgID8gW2Ake21lc3NhZ2VzLnR1cm5PZn0gJHtmaXJzdFBsYXllck5hbWV9LmAsIG1lc3NhZ2VzLnR1dG9yaWFsTG9hZGVkXVxuICAgIDogW2BUdXJubyBkZSAke2ZpcnN0UGxheWVyTmFtZX0uYCwgJ1R1dG9yaWFsIGNhcmdhZG8uJ107XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdHJ1Y3R1cmVkQ2xvbmUoU1RBUlRJTkdfR0FNRSksXG4gICAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnLFxuICAgIHR1cm5Pd25lcjogZmlyc3RQbGF5ZXIsXG4gICAgdHVybkNvdW50OiAxLFxuICAgIG1hdGNoU2NvcmU6IHsgUDE6IDAsIFAyOiAwIH0sXG4gICAgc2hhcmVkRGVjayxcbiAgICBwbGFjZVpvbmU6IHBsYWNlc1swXSA/IFtwbGFjZXNbMF0uaWRdIDogW10sXG4gICAgaGlzdG9yeVpvbmU6IFtdLFxuICAgIHBsYXllcnM6IHtcbiAgICAgIFAxOiBjcmVhdGVUdXRvcmlhbFBsYXllcignUDEnLCBwbGF5ZXJMZWFkZXIsIHBsYXllckhhbmQsIFtdLCBuYW1lUmVzb2x2ZXIsIHN0YXJ0aW5nT2ZmZXJpbmcpLFxuICAgICAgUDI6IGNyZWF0ZVR1dG9yaWFsUGxheWVyKFxuICAgICAgICAnUDInLFxuICAgICAgICBvcHBvbmVudExlYWRlcixcbiAgICAgICAgb3Bwb25lbnRIYW5kLFxuICAgICAgICBbXSxcbiAgICAgICAgbmFtZVJlc29sdmVyLFxuICAgICAgICBzdGFydGluZ09mZmVyaW5nXG4gICAgICApLFxuICAgIH0sXG4gICAgbG9nLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHV0b3JpYWxTZXR1cChcbiAgbGVhZGVyczogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25bXSxcbiAgc2VlZDogbnVtYmVyID0gVFVUT1JJQUxfU0VFRFxuKTogQ2hyaXN0aWFuaXR5VHV0b3JpYWxTZXR1cCB7XG4gIGNvbnN0IGNvaW5XaW5uZXI6IENocmlzdGlhbml0eVNlYXQgPSBzZWVkICUgMiA9PT0gMCA/ICdQMScgOiAnUDInO1xuICBjb25zdCBmaXJzdFBsYXllcjogQ2hyaXN0aWFuaXR5U2VhdCA9IGNvaW5XaW5uZXIgPT09ICdQMScgPyAnUDInIDogJ1AxJztcbiAgcmV0dXJuIHtcbiAgICBjb2luV2lubmVyLFxuICAgIGxlYWRlclBpY2tlcjogY29pbldpbm5lcixcbiAgICBmaXJzdFBsYXllcixcbiAgICBhdmFpbGFibGVMZWFkZXJzOiBsZWFkZXJzLnNsaWNlKDAsIFRVVE9SSUFMX0xFQURFUl9DSE9JQ0VfQ09VTlQpLm1hcChjID0+IGMuaWQpLFxuICB9O1xufVxuIl19
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { ChristianityCardDefinition, ChristianityGameState } from './types';
|
|
2
|
-
export interface ChristianityBotMessages {
|
|
3
|
-
botNoAttackers: string;
|
|
4
|
-
combatsAgainst: string;
|
|
5
|
-
attacksYourLeader: string;
|
|
6
|
-
}
|
|
7
|
-
export interface ChristianityImpactEvent {
|
|
8
|
-
id: string;
|
|
9
|
-
text: string;
|
|
10
|
-
tone: 'damage' | 'heal' | 'resource';
|
|
11
|
-
seat: 'P1' | 'P2';
|
|
12
|
-
target: 'leader' | 'battle' | 'offerings';
|
|
13
|
-
}
|
|
14
|
-
export declare function resolveBotPlays(game: ChristianityGameState, log: string[], nameResolver?: (card: ChristianityCardDefinition) => string, cardById?: (id: string) => ChristianityCardDefinition): void;
|
|
15
|
-
export declare function resolveBotAttack(game: ChristianityGameState, log: string[], impacts: Array<Omit<ChristianityImpactEvent, 'id'>>, messages: ChristianityBotMessages): void;
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import * as i0 from "@angular/core";
|
|
2
|
-
export type ChristianityCardRenderType = 'leader' | 'character' | 'offering' | 'wisdom' | 'action' | 'tool' | 'place' | 'event';
|
|
3
|
-
export type ChristianityCardRenderVariant = 'full' | 'baby' | 'table' | 'hand' | 'list' | 'back' | 'board';
|
|
4
|
-
export interface ChristianityCardRenderModel {
|
|
5
|
-
id: string;
|
|
6
|
-
name: string;
|
|
7
|
-
type: ChristianityCardRenderType;
|
|
8
|
-
typeLabel: string;
|
|
9
|
-
cost?: number;
|
|
10
|
-
offeringValue?: number;
|
|
11
|
-
attack?: number;
|
|
12
|
-
life?: number;
|
|
13
|
-
currentHp?: number;
|
|
14
|
-
maxHp?: number;
|
|
15
|
-
abilityName?: string;
|
|
16
|
-
abilityText?: string;
|
|
17
|
-
verseText?: string;
|
|
18
|
-
scripture?: string;
|
|
19
|
-
edition?: string;
|
|
20
|
-
collectorNumber?: string;
|
|
21
|
-
editionIcon?: string;
|
|
22
|
-
year?: string;
|
|
23
|
-
author?: string;
|
|
24
|
-
rarity?: 'normal' | 'good' | 'very-good' | 'uncommon' | 'rare' | 'legendary';
|
|
25
|
-
imageUrl?: string;
|
|
26
|
-
frontTemplate?: string;
|
|
27
|
-
statusText?: string;
|
|
28
|
-
bibleCredit?: string;
|
|
29
|
-
}
|
|
30
|
-
export declare class ChristianityCardComponent {
|
|
31
|
-
readonly card: import("@angular/core").InputSignal<ChristianityCardRenderModel>;
|
|
32
|
-
readonly variant: import("@angular/core").InputSignal<ChristianityCardRenderVariant>;
|
|
33
|
-
private readonly typeColors;
|
|
34
|
-
protected readonly typeColor: import("@angular/core").Signal<string>;
|
|
35
|
-
protected readonly isInPlay: import("@angular/core").Signal<boolean>;
|
|
36
|
-
protected readonly hasRealArt: import("@angular/core").Signal<boolean>;
|
|
37
|
-
protected readonly normalizedTypeLabel: import("@angular/core").Signal<string>;
|
|
38
|
-
protected readonly frontTemplate: import("@angular/core").Signal<string>;
|
|
39
|
-
protected readonly isGenesisClassicTemplate: import("@angular/core").Signal<boolean>;
|
|
40
|
-
protected readonly typeIconUrl: import("@angular/core").Signal<string>;
|
|
41
|
-
protected readonly showTypeIcon: import("@angular/core").Signal<boolean>;
|
|
42
|
-
protected readonly headerMetric: import("@angular/core").Signal<{
|
|
43
|
-
kind: 'number' | 'pips' | 'cost-symbol';
|
|
44
|
-
value: number;
|
|
45
|
-
}>;
|
|
46
|
-
protected readonly cardStatsText: import("@angular/core").Signal<string>;
|
|
47
|
-
protected readonly leaderLifeText: import("@angular/core").Signal<string>;
|
|
48
|
-
protected readonly leaderLifeValue: import("@angular/core").Signal<number>;
|
|
49
|
-
protected readonly isRulesOnlyCard: import("@angular/core").Signal<boolean>;
|
|
50
|
-
protected offeringPips(value: number | undefined): unknown[];
|
|
51
|
-
protected isLongText(text: string | undefined, threshold: number): boolean;
|
|
52
|
-
private iconName;
|
|
53
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ChristianityCardComponent, never>;
|
|
54
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ChristianityCardComponent, "val-christianity-card", never, { "card": { "alias": "card"; "required": true; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
55
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { ChristianityCardDefinition, ChristianityCardBibleReference, ChristianityGameState } from './types';
|
|
2
|
-
export interface ChristianityEditionCatalog {
|
|
3
|
-
edition?: {
|
|
4
|
-
id?: string;
|
|
5
|
-
number?: number;
|
|
6
|
-
slug?: string;
|
|
7
|
-
name?: string;
|
|
8
|
-
icon?: string;
|
|
9
|
-
};
|
|
10
|
-
cards?: ChristianityCardDefinition[];
|
|
11
|
-
}
|
|
12
|
-
export declare const GENESIS_CATALOG_URL = "assets/games/christianity/data/01-genesis.cards.json";
|
|
13
|
-
export declare const GENESIS_ICON_URL = "assets/games/christianity/icons/1-icon.png";
|
|
14
|
-
export declare const SPLASH_MIN_DURATION_MS = 720;
|
|
15
|
-
export declare const STARTER_CARDS: Record<string, ChristianityCardDefinition>;
|
|
16
|
-
export declare const STARTING_GAME: ChristianityGameState;
|
|
17
|
-
export declare function formatScripture(bible?: ChristianityCardBibleReference): string | undefined;
|
|
18
|
-
export declare function normalizeCatalogCard(card: ChristianityCardDefinition, catalog: ChristianityEditionCatalog): ChristianityCardDefinition;
|