forked from pguzek/pguzek.github.io
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathdeck.js
More file actions
126 lines (105 loc) · 4.31 KB
/
deck.js
File metadata and controls
126 lines (105 loc) · 4.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import { shuffle } from "./utils.js"
import { sendCreateMessage } from "./p2p.js"
import { createCard, snapOutOfHandArea } from "./card.js"
import { grabCard } from "./grab.js"
export const parseDeckList = (deckListString, allCards) => {
const names = deckListString.trim().split("\n").flatMap(entry => {
const trimmed = entry.trim()
if (!trimmed) return []
const nameParts = trimmed.split(" ")
const number = Number.parseInt(nameParts.shift().replace("x", ""))
if (!Number.isInteger(number) || number < 1) return []
const name = nameParts.join(" ")
return Array.from({ length: number }, () => name)
})
const matched = []
const failedSet = new Set()
for (const cardName of names) {
const card = allCards.find(c => c.title === cardName)
if (card) {
matched.push(card)
} else {
failedSet.add(cardName)
}
}
return { matched, failed: Array.from(failedSet) }
}
export const createDeck = (deckList, id, x, y) => {
const { matched, failed } = parseDeckList(deckList, window.allCards)
const deck = matched
shuffle(deck)
const deckElement = document.createElement("div")
deckElement.id = id
deckElement.title = `${deck.length} cards`
deckElement.style.left = x
deckElement.style.top = y
deckElement.classList.add("deck")
deckElement.innerHTML = `
<div class="deck-card-back">
<img width="190" height="265" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSEArMDpLqCtEe0kLcWh5dJj0s-dAnCShz_cQ&s">
</div>`
document.querySelector("#card-layer").appendChild(deckElement)
snapOutOfHandArea(deckElement)
if (failed.length > 0) {
const errorElement = document.createElement("div")
errorElement.classList.add("deck-parse-errors")
const heading = document.createElement("strong")
heading.textContent = "Unrecognized cards (not loaded):"
errorElement.appendChild(heading)
const list = document.createElement("ul")
for (const name of failed) {
const item = document.createElement("li")
item.textContent = name
list.appendChild(item)
}
errorElement.appendChild(list)
document.querySelector("#card-layer").appendChild(errorElement)
}
deckElement.addEventListener("mousedown", e => {
e.preventDefault()
if (deck.length) {
const deckRect = deckElement.getBoundingClientRect()
const cardElement = createCard(deck.pop(), `${deckRect.x}px`, `${deckRect.y}px`)
grabCard(cardElement)(e)
if (!deck.length) {
deckElement.firstElementChild.classList.add("red-tint")
deckElement.title = "no cards left"
} else {
deckElement.title = `${deck.length} card${deck.length > 1 ? "s" : ""}`
}
}
})
deckElement.addEventListener("puttop", e => {
const cardInfo = cardElementToCardInfo(e.detail.card)
deck.push(cardInfo)
deckElement.firstElementChild.classList.remove("red-tint")
deckElement.title = `${deck.length} card${deck.length > 1 ? "s" : ""}`
})
deckElement.addEventListener("putbottom", e => {
const cardInfo = cardElementToCardInfo(e.detail.card)
deck.unshift(cardInfo)
deckElement.firstElementChild.classList.remove("red-tint")
deckElement.title = `${deck.length} card${deck.length > 1 ? "s" : ""}`
})
deckElement.addEventListener("shufflein", e => {
const cardInfo = cardElementToCardInfo(e.detail.card)
deck.push(cardInfo)
shuffle(deck)
deckElement.firstElementChild.classList.remove("red-tint")
deckElement.title = `${deck.length} card${deck.length > 1 ? "s" : ""}`
})
deckElement.addEventListener("shuffle", e => {
shuffle(deck)
})
sendCreateMessage("deck", id, [deckList, id, x, y])
return deckElement
}
const cardElementToCardInfo = (cardElement) => {
return {
title: cardElement.getAttribute("data-title"),
side_code: cardElement.getAttribute("data-side"),
faction_code: cardElement.getAttribute("data-faction"),
type_code: cardElement.getAttribute("data-type"),
image: cardElement.querySelector(".card-front img").src
}
}