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.
Files changed (60) hide show
  1. package/esm2022/lib/components/molecules/group-picker/group-picker.component.mjs +97 -0
  2. package/esm2022/lib/components/organisms/group-members/group-members.component.mjs +178 -0
  3. package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +1 -381
  4. package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
  5. package/esm2022/lib/services/groups/groups.service.mjs +92 -0
  6. package/esm2022/lib/services/groups/types.mjs +2 -0
  7. package/esm2022/lib/version.mjs +2 -2
  8. package/esm2022/public-api.mjs +4 -3
  9. package/fesm2022/valtech-components.mjs +641 -7612
  10. package/fesm2022/valtech-components.mjs.map +1 -1
  11. package/lib/components/molecules/group-picker/group-picker.component.d.ts +28 -0
  12. package/lib/components/organisms/group-members/group-members.component.d.ts +43 -0
  13. package/lib/components/organisms/mini-games/types.d.ts +0 -182
  14. package/lib/services/groups/groups.service.d.ts +39 -0
  15. package/lib/services/groups/types.d.ts +69 -0
  16. package/lib/version.d.ts +1 -1
  17. package/package.json +1 -1
  18. package/public-api.d.ts +4 -2
  19. package/src/lib/assets/games/README.md +8 -0
  20. package/esm2022/lib/components/organisms/mini-games/christianity-bot.mjs +0 -94
  21. package/esm2022/lib/components/organisms/mini-games/christianity-card.component.mjs +0 -503
  22. package/esm2022/lib/components/organisms/mini-games/christianity-catalog.mjs +0 -247
  23. package/esm2022/lib/components/organisms/mini-games/christianity-game.component.mjs +0 -4580
  24. package/esm2022/lib/components/organisms/mini-games/christianity-rules.mjs +0 -1383
  25. package/esm2022/lib/components/organisms/mini-games/christianity-tutorial.mjs +0 -152
  26. package/lib/components/organisms/mini-games/christianity-bot.d.ts +0 -15
  27. package/lib/components/organisms/mini-games/christianity-card.component.d.ts +0 -55
  28. package/lib/components/organisms/mini-games/christianity-catalog.d.ts +0 -18
  29. package/lib/components/organisms/mini-games/christianity-game.component.d.ts +0 -395
  30. package/lib/components/organisms/mini-games/christianity-rules.d.ts +0 -57
  31. package/lib/components/organisms/mini-games/christianity-tutorial.d.ts +0 -38
  32. package/src/lib/assets/games/christianity/card-symbol.svg +0 -51
  33. package/src/lib/assets/games/christianity/card-template-reference/front.html +0 -114
  34. package/src/lib/assets/games/christianity/card-template-reference/front.style.css +0 -352
  35. package/src/lib/assets/games/christianity/data/01-genesis.bible-reference-suggestions.csv +0 -191
  36. package/src/lib/assets/games/christianity/data/01-genesis.bible-verses.nbv-open.csv +0 -170
  37. package/src/lib/assets/games/christianity/data/01-genesis.cards.csv +0 -281
  38. package/src/lib/assets/games/christianity/data/01-genesis.cards.i18n.csv +0 -281
  39. package/src/lib/assets/games/christianity/data/01-genesis.cards.json +0 -16453
  40. package/src/lib/assets/games/christianity/data/01-genesis.unassigned-effects.csv +0 -49
  41. package/src/lib/assets/games/christianity/data/README.md +0 -40
  42. package/src/lib/assets/games/christianity/data/data-con-habilides.csv +0 -273
  43. package/src/lib/assets/games/christianity/data/habilidades-por-tipo.xlsx +0 -0
  44. package/src/lib/assets/games/christianity/data/listado-edicion.csv +0 -281
  45. package/src/lib/assets/games/christianity/editions/1/cards/.gitkeep +0 -1
  46. package/src/lib/assets/games/christianity/editions/1/cards/PLACEHOLDER.png +0 -0
  47. package/src/lib/assets/games/christianity/editions/README.md +0 -34
  48. package/src/lib/assets/games/christianity/icons/1-icon.png +0 -0
  49. package/src/lib/assets/games/christianity/icons/action.png +0 -0
  50. package/src/lib/assets/games/christianity/icons/character.png +0 -0
  51. package/src/lib/assets/games/christianity/icons/event.png +0 -0
  52. package/src/lib/assets/games/christianity/icons/leader.png +0 -0
  53. package/src/lib/assets/games/christianity/icons/offering.png +0 -0
  54. package/src/lib/assets/games/christianity/icons/place.png +0 -0
  55. package/src/lib/assets/games/christianity/icons/tool.png +0 -0
  56. package/src/lib/assets/games/christianity/icons/wisdom.png +0 -0
  57. package/src/lib/assets/games/christianity/sources/README.md +0 -16
  58. package/src/lib/assets/games/christianity/sources/spaonbv_vpl.txt +0 -29102
  59. package/src/lib/assets/games/christianity/sources/spaonbv_vpl.xml +0 -29104
  60. 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;