frames
BIN
data/images/m15/REFERENCEm15FrameW.png
Normal file
After Width: | Height: | Size: 4.0 MiB |
BIN
data/images/m15/m15FrameA.png
Normal file
After Width: | Height: | Size: 1.2 MiB |
BIN
data/images/m15/m15FrameANyx.png
Normal file
After Width: | Height: | Size: 1.1 MiB |
Before Width: | Height: | Size: 416 KiB After Width: | Height: | Size: 1.0 MiB |
BIN
data/images/m15/m15FrameBNyx.png
Normal file
After Width: | Height: | Size: 1006 KiB |
Before Width: | Height: | Size: 431 KiB After Width: | Height: | Size: 1.0 MiB |
BIN
data/images/m15/m15FrameGNyx.png
Normal file
After Width: | Height: | Size: 988 KiB |
BIN
data/images/m15/m15FrameL.png
Normal file
After Width: | Height: | Size: 891 KiB |
BIN
data/images/m15/m15FrameM.png
Normal file
After Width: | Height: | Size: 870 KiB |
BIN
data/images/m15/m15FrameMNyx.png
Normal file
After Width: | Height: | Size: 868 KiB |
Before Width: | Height: | Size: 472 KiB After Width: | Height: | Size: 1.2 MiB |
BIN
data/images/m15/m15FrameRNyx.png
Normal file
After Width: | Height: | Size: 1.1 MiB |
Before Width: | Height: | Size: 253 KiB After Width: | Height: | Size: 558 KiB |
BIN
data/images/m15/m15FrameUNyx.png
Normal file
After Width: | Height: | Size: 640 KiB |
BIN
data/images/m15/m15FrameV.png
Normal file
After Width: | Height: | Size: 1.0 MiB |
Before Width: | Height: | Size: 268 KiB After Width: | Height: | Size: 668 KiB |
BIN
data/images/m15/m15FrameWNyx.png
Normal file
After Width: | Height: | Size: 686 KiB |
@@ -16,6 +16,7 @@ var cardTextList = new Array()
|
|||||||
var manaSymbolCodeList = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "w", "u", "b", "r", "g", "2w", "2u", "2b", "2r", "2g", "pw", "pu", "pb", "pr", "pg", "wu", "wb", "ub", "ur", "br", "bg", "rg", "rw", "gw", "gu", "x", "s", "c", "t","untap", "e", "y", "z", "1/2", "inf", "chaos", "plane", "l+", "l-", "l0", "oldtap", "artistbrush", "bar", "whiteBrush", "blackBrush"];
|
var manaSymbolCodeList = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "w", "u", "b", "r", "g", "2w", "2u", "2b", "2r", "2g", "pw", "pu", "pb", "pr", "pg", "wu", "wb", "ub", "ur", "br", "bg", "rg", "rw", "gw", "gu", "x", "s", "c", "t","untap", "e", "y", "z", "1/2", "inf", "chaos", "plane", "l+", "l-", "l0", "oldtap", "artistbrush", "bar", "whiteBrush", "blackBrush"];
|
||||||
var manaSymbolImageList = [];
|
var manaSymbolImageList = [];
|
||||||
manaSymbolCodeList.forEach((item, index) => {manaSymbolImageList[index] = new Image(); manaSymbolImageList[index].src = 'data/images/manaSymbols/' + index + '.png'})
|
manaSymbolCodeList.forEach((item, index) => {manaSymbolImageList[index] = new Image(); manaSymbolImageList[index].src = 'data/images/manaSymbols/' + index + '.png'})
|
||||||
|
date = new Date()
|
||||||
|
|
||||||
function newCanvas(name) {
|
function newCanvas(name) {
|
||||||
window[name + 'Canvas'] = document.createElement('canvas')
|
window[name + 'Canvas'] = document.createElement('canvas')
|
||||||
@@ -263,6 +264,14 @@ function loadMaskImages(listOfMasks) {
|
|||||||
function loadFrameImages(listOfFrames) {
|
function loadFrameImages(listOfFrames) {
|
||||||
for (var i = 0; i < listOfFrames.length; i++) {
|
for (var i = 0; i < listOfFrames.length; i++) {
|
||||||
frameImageList.push(new frameImage(...listOfFrames[i], frameImageList.length))
|
frameImageList.push(new frameImage(...listOfFrames[i], frameImageList.length))
|
||||||
|
if (i == 0) {
|
||||||
|
frameObjectToAdd = frameImageList[frameImageList.length - 1]
|
||||||
|
var frameToInsert = cardMasterList.push(new cardImage(frameObjectToAdd.name, frameObjectToAdd.image.src, frameObjectToAdd.x, frameObjectToAdd.y, frameObjectToAdd.width, frameObjectToAdd.height, 1, [], false))
|
||||||
|
cardMaster.insertBefore(cardMasterList[frameToInsert - 1].cardMasterElement(), cardMaster.children[1])
|
||||||
|
frameObjectToAdd.image.onload = function() {
|
||||||
|
drawCardObjects()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -320,6 +329,9 @@ function cardTextEdited() {
|
|||||||
selectedTextObject.width = document.getElementById('textEditorWidth').value / cardWidth
|
selectedTextObject.width = document.getElementById('textEditorWidth').value / cardWidth
|
||||||
selectedTextObject.height = document.getElementById('textEditorHeight').value / cardHeight
|
selectedTextObject.height = document.getElementById('textEditorHeight').value / cardHeight
|
||||||
drawCardText()
|
drawCardText()
|
||||||
|
if (selectedTextObject.name == 'Power/Toughness') {
|
||||||
|
bottomInfoUpdated()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
function drawCardText() {
|
function drawCardText() {
|
||||||
textContext.clearRect(0, 0, cardWidth, cardHeight)
|
textContext.clearRect(0, 0, cardWidth, cardHeight)
|
||||||
@@ -328,7 +340,7 @@ function drawCardText() {
|
|||||||
function writeText(textObjectList, targetContext) {
|
function writeText(textObjectList, targetContext) {
|
||||||
var textCanvasBuffer = 100
|
var textCanvasBuffer = 100
|
||||||
var rewritingLine = false
|
var rewritingLine = false
|
||||||
var textSize
|
var textSize, textFont
|
||||||
outerloop:
|
outerloop:
|
||||||
for (var i = 0; i < textObjectList.length; i++) {
|
for (var i = 0; i < textObjectList.length; i++) {
|
||||||
if (!rewritingLine) {
|
if (!rewritingLine) {
|
||||||
@@ -343,11 +355,12 @@ function writeText(textObjectList, targetContext) {
|
|||||||
textParagraphCanvas.height = scaleY(textObjectList[i].height) + 2 * textCanvasBuffer
|
textParagraphCanvas.height = scaleY(textObjectList[i].height) + 2 * textCanvasBuffer
|
||||||
textLineContext.clearRect(0, 0, textLineCanvas.width, textLineCanvas.height)
|
textLineContext.clearRect(0, 0, textLineCanvas.width, textLineCanvas.height)
|
||||||
textParagraphContext.clearRect(0, 0, textParagraphCanvas.width, textParagraphCanvas.height)
|
textParagraphContext.clearRect(0, 0, textParagraphCanvas.width, textParagraphCanvas.height)
|
||||||
var outline, shadow = 0, oneLine = false, outlineThickness = 2, textAlign = 'left', finishLine = false, paragraphSpace = 0
|
var outline, shadow = 0, oneLine = false, outlineThickness = 2, textAlign = 'left', finishLine = false, paragraphSpace = 0, permanentLineShift = 0, temporaryLineShift = 0
|
||||||
textObjectList[i].otherParameters.forEach(item => eval(item))
|
textObjectList[i].otherParameters.forEach(item => eval(item))
|
||||||
textLineContext.strokeStyle = outline
|
textLineContext.strokeStyle = outline
|
||||||
textLineContext.lineWidth = outlineThickness
|
textLineContext.lineWidth = outlineThickness
|
||||||
textLineContext.font = textSize + 'px ' + textObjectList[i].font
|
textFont = textObjectList[i].font
|
||||||
|
textLineContext.font = textSize + 'px ' + textFont
|
||||||
textLineContext.fillStyle = textObjectList[i].fontColor
|
textLineContext.fillStyle = textObjectList[i].fontColor
|
||||||
var textX = textCanvasBuffer
|
var textX = textCanvasBuffer
|
||||||
var textY = 0
|
var textY = 0
|
||||||
@@ -362,7 +375,7 @@ function writeText(textObjectList, targetContext) {
|
|||||||
var possibleCodeLower = splitText[n].substr(1, splitText[n].length - 2).toLowerCase()
|
var possibleCodeLower = splitText[n].substr(1, splitText[n].length - 2).toLowerCase()
|
||||||
if (possibleCodeLower == 'line' && !oneLine) {
|
if (possibleCodeLower == 'line' && !oneLine) {
|
||||||
finishLine = true
|
finishLine = true
|
||||||
paragraphSpace = textSize * 0.35
|
paragraphSpace += textSize * 0.35
|
||||||
} else if (possibleCodeLower == 'linenospace' && !oneLine) {
|
} else if (possibleCodeLower == 'linenospace' && !oneLine) {
|
||||||
finishLine = true
|
finishLine = true
|
||||||
} else if ((possibleCodeLower == 'bar' || possibleCodeLower == 'flavor') && !oneLine) {
|
} else if ((possibleCodeLower == 'bar' || possibleCodeLower == 'flavor') && !oneLine) {
|
||||||
@@ -370,23 +383,37 @@ function writeText(textObjectList, targetContext) {
|
|||||||
var barWidth = scaleX(textObjectList[i].width) * 0.95
|
var barWidth = scaleX(textObjectList[i].width) * 0.95
|
||||||
var barHeight = scaleY(0.001)
|
var barHeight = scaleY(0.001)
|
||||||
textLineContext.drawImage(manaSymbolImageList[63], textCanvasBuffer + (scaleX(textObjectList[i].width) - barWidth) / 2, textSize * 1.6 + textCanvasBuffer, barWidth, barHeight)
|
textLineContext.drawImage(manaSymbolImageList[63], textCanvasBuffer + (scaleX(textObjectList[i].width) - barWidth) / 2, textSize * 1.6 + textCanvasBuffer, barWidth, barHeight)
|
||||||
paragraphSpace = textSize * 0.8
|
paragraphSpace += textSize * 0.8
|
||||||
if (possibleCodeLower == 'flavor') {
|
if (possibleCodeLower == 'flavor') {
|
||||||
textLineContext.font = 'italic ' + (textSize * 0.92) + 'px ' + textObjectList[i].font
|
textLineContext.font = 'italic ' + (textSize * 0.92) + 'px ' + textFont
|
||||||
}
|
}
|
||||||
} else if (possibleCodeLower == 'i') {
|
} else if (possibleCodeLower == 'i') {
|
||||||
textLineContext.font = 'italic ' + textSize + 'px ' + textObjectList[i].font
|
textLineContext.font = 'italic ' + textSize + 'px ' + textFont
|
||||||
} else if (possibleCodeLower == '/i') {
|
} else if (possibleCodeLower == '/i') {
|
||||||
textLineContext.font = textSize + 'px ' + textObjectList[i].font
|
textLineContext.font = textSize + 'px ' + textFont
|
||||||
} else if (possibleCodeLower.includes('fontsize')) {
|
} else if (possibleCodeLower.includes('fontsize')) {
|
||||||
textSize += parseInt(possibleCodeLower.slice(8, possibleCodeLower.length))
|
textSize += parseInt(possibleCodeLower.slice(8, possibleCodeLower.length))
|
||||||
textLineContext.font = textSize + 'px ' + textObjectList[i].font
|
textLineContext.font = textSize + 'px ' + textFont
|
||||||
} else if (possibleCodeLower == 'left') {
|
} else if (possibleCodeLower == 'left') {
|
||||||
textAlign = 'left'
|
textAlign = 'left'
|
||||||
} else if (possibleCodeLower == 'center') {
|
} else if (possibleCodeLower == 'center') {
|
||||||
textAlign = 'center'
|
textAlign = 'center'
|
||||||
} else if (possibleCodeLower == 'right') {
|
} else if (possibleCodeLower == 'right') {
|
||||||
textAlign = 'right'
|
textAlign = 'right'
|
||||||
|
} else if (possibleCodeLower.includes('right')) {
|
||||||
|
textX += parseInt(possibleCodeLower.replace('right', ''))
|
||||||
|
currentLineWidth += parseInt(possibleCodeLower.replace('right', ''))
|
||||||
|
} else if (possibleCodeLower.includes('left')) {
|
||||||
|
textX -= parseInt(possibleCodeLower.replace('left', ''))
|
||||||
|
currentLineWidth -= parseInt(possibleCodeLower.replace('left', ''))
|
||||||
|
} else if (possibleCodeLower.includes('up')) {
|
||||||
|
finishLine = true
|
||||||
|
paragraphSpace -= parseInt(possibleCodeLower.replace('up', '')) + textSize
|
||||||
|
temporaryLineShift += currentLineWidth
|
||||||
|
} else if (possibleCodeLower.includes('down')) {
|
||||||
|
finishLine = true
|
||||||
|
paragraphSpace += parseInt(possibleCodeLower.replace('down', '')) - textSize
|
||||||
|
temporaryLineShift += currentLineWidth
|
||||||
} else if (possibleCodeLower.includes('outline:')) {
|
} else if (possibleCodeLower.includes('outline:')) {
|
||||||
outline = true;
|
outline = true;
|
||||||
textLineContext.strokeStyle = possibleCodeLower.replace('outline:', '').split(',')[0];
|
textLineContext.strokeStyle = possibleCodeLower.replace('outline:', '').split(',')[0];
|
||||||
@@ -398,8 +425,11 @@ function writeText(textObjectList, targetContext) {
|
|||||||
} else if (possibleCodeLower == 'artistbrush') {
|
} else if (possibleCodeLower == 'artistbrush') {
|
||||||
var artistBrushWidth = textSize * 1.2
|
var artistBrushWidth = textSize * 1.2
|
||||||
textLineContext.drawImage(manaSymbolImageList[62], textX, textCanvasBuffer + textSize - artistBrushWidth * 0.58, artistBrushWidth, artistBrushWidth * 13 / 21)
|
textLineContext.drawImage(manaSymbolImageList[62], textX, textCanvasBuffer + textSize - artistBrushWidth * 0.58, artistBrushWidth, artistBrushWidth * 13 / 21)
|
||||||
currentLineX += artistBrushWidth * 1.1
|
textX += artistBrushWidth * 1.1
|
||||||
} else if (manaSymbolCodeList.includes(possibleCodeLower.split('/').join(''))) {
|
} else if (possibleCodeLower.includes('font')) {
|
||||||
|
textFont = possibleCodeLower.replace('font', '')
|
||||||
|
textLineContext.font = textSize + 'px ' + textFont
|
||||||
|
} else if (manaSymbolCodeList.includes(possibleCodeLower.split('/').join(''))) {
|
||||||
//THIS HAS TO BE THE LAST ONE
|
//THIS HAS TO BE THE LAST ONE
|
||||||
var manaSymbolDiameter = textSize * 0.77
|
var manaSymbolDiameter = textSize * 0.77
|
||||||
textLineContext.drawImage(manaSymbolImageList[manaSymbolCodeList.indexOf(possibleCodeLower.split('/').join(''))], textX, textCanvasBuffer + textSize - manaSymbolDiameter * 0.95, manaSymbolDiameter, manaSymbolDiameter)
|
textLineContext.drawImage(manaSymbolImageList[manaSymbolCodeList.indexOf(possibleCodeLower.split('/').join(''))], textX, textCanvasBuffer + textSize - manaSymbolDiameter * 0.95, manaSymbolDiameter, manaSymbolDiameter)
|
||||||
@@ -428,11 +458,15 @@ function writeText(textObjectList, targetContext) {
|
|||||||
textParagraphContext.drawImage(textLineCanvas, 0 + textAlignShift, textY, textLineCanvas.width, textLineCanvas.height)
|
textParagraphContext.drawImage(textLineCanvas, 0 + textAlignShift, textY, textLineCanvas.width, textLineCanvas.height)
|
||||||
if (n != splitText.length - 1) {
|
if (n != splitText.length - 1) {
|
||||||
textLineContext.clearRect(0, 0, textLineCanvas.width, textLineCanvas.height)
|
textLineContext.clearRect(0, 0, textLineCanvas.width, textLineCanvas.height)
|
||||||
textX = textCanvasBuffer
|
textX = textCanvasBuffer + permanentLineShift + temporaryLineShift
|
||||||
currentLineWidth = 0
|
currentLineWidth = 0 + permanentLineShift + temporaryLineShift
|
||||||
textY += textSize + paragraphSpace
|
textY += textSize + paragraphSpace
|
||||||
paragraphSpace = 0
|
paragraphSpace = 0
|
||||||
|
temporaryLineShift = 0
|
||||||
finishLine = false
|
finishLine = false
|
||||||
|
if (wordToWrite == " ") {
|
||||||
|
continue innerloop
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (shadow > 0) {
|
if (shadow > 0) {
|
||||||
@@ -503,11 +537,30 @@ function inputCardArtNameNumber(cardArtNameNumberInput) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function initialize() {
|
function initialize() {
|
||||||
|
//Card stuff
|
||||||
cardMasterList.push(new cardPlaceholder('Card Art Placeholder', cardArt))
|
cardMasterList.push(new cardPlaceholder('Card Art Placeholder', cardArt))
|
||||||
cardMasterList.push(new cardPlaceholder('Text Placeholder', window['textCanvas']))
|
cardMasterList.push(new cardPlaceholder('Text Placeholder', window['textCanvas']))
|
||||||
cardMaster.insertBefore(cardMasterList[0].cardMasterElement(), cardMaster.children[0])
|
cardMaster.insertBefore(cardMasterList[0].cardMasterElement(), cardMaster.children[0])
|
||||||
cardMaster.insertBefore(cardMasterList[1].cardMasterElement(), cardMaster.children[0])
|
cardMaster.insertBefore(cardMasterList[1].cardMasterElement(), cardMaster.children[0])
|
||||||
drawCardObjects()
|
document.getElementById('inputInfoNumber').value = date.getFullYear()
|
||||||
|
setTimeout(bottomInfoUpdated, 500)
|
||||||
|
//CSS & HTML stuff
|
||||||
|
window.layerElements = document.querySelectorAll('.layer')
|
||||||
|
window.addEventListener('resize', windowResized)
|
||||||
|
window.addEventListener('scroll', windowScrolled)
|
||||||
|
windowResized()
|
||||||
|
}
|
||||||
|
|
||||||
|
function windowResized() {
|
||||||
|
window.windowHeight = window.innerHeight
|
||||||
|
}
|
||||||
|
function windowScrolled() {
|
||||||
|
for (var i = 0; i < layerElements.length; i++) {
|
||||||
|
var positionFromTop = (layerElements[i].getBoundingClientRect().top + layerElements[i].getBoundingClientRect().bottom) / 2
|
||||||
|
if (positionFromTop - windowHeight <= 0) {
|
||||||
|
layerElements[i].classList.add('revealedLayer')
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function bottomInfoUpdated() {
|
function bottomInfoUpdated() {
|
||||||
@@ -529,9 +582,12 @@ function addUploadedFrameImage(imageSource) {
|
|||||||
|
|
||||||
function manaCostUpdated() {
|
function manaCostUpdated() {
|
||||||
manaCostContext.clearRect(0, 0, cardWidth, cardHeight)
|
manaCostContext.clearRect(0, 0, cardWidth, cardHeight)
|
||||||
var manaCostList = document.getElementById('inputManaCost').value.toLowerCase().replace(/{/, ' ').replace(/}/, ' ').split('/').join('').split(' ')
|
var manaCostList = document.getElementById('inputManaCost').value.toLowerCase().replace(/{/g, ' ').replace(/}/g, ' ').split('/').join('').split(' ')
|
||||||
var manaSymbolIndex = -1
|
var manaSymbolIndex = -1
|
||||||
manaCostCanvas.fillStyle = 'black'
|
manaCostCanvas.fillStyle = 'black'
|
||||||
|
if (manaCostDirection == 'reverse') {
|
||||||
|
manaCostList.reverse()
|
||||||
|
}
|
||||||
for (var i = 0; i < manaCostList.length; i++) {
|
for (var i = 0; i < manaCostList.length; i++) {
|
||||||
if (manaSymbolCodeList.includes(manaCostList[i])) {
|
if (manaSymbolCodeList.includes(manaCostList[i])) {
|
||||||
manaSymbolIndex += 1
|
manaSymbolIndex += 1
|
||||||
@@ -652,6 +708,8 @@ function inputCardNameNumberTextImport(index) {
|
|||||||
document.getElementById('inputSetRarity').value = beforeAfter(importCardTextResponse, '"rarity":"', '",')[0]
|
document.getElementById('inputSetRarity').value = beforeAfter(importCardTextResponse, '"rarity":"', '",')[0]
|
||||||
setSymbol.src = 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + document.getElementById('inputSetCode').value + '&size=large&rarity=' + document.getElementById('inputSetRarity').value
|
setSymbol.src = 'https://cors-anywhere.herokuapp.com/http://gatherer.wizards.com/Handlers/Image.ashx?type=symbol&set=' + document.getElementById('inputSetCode').value + '&size=large&rarity=' + document.getElementById('inputSetRarity').value
|
||||||
inputCardArtName(beforeAfter(importCardTextResponse, '"name":"', '",'))
|
inputCardArtName(beforeAfter(importCardTextResponse, '"name":"', '",'))
|
||||||
|
manaCostUpdated()
|
||||||
|
drawCardText()
|
||||||
}
|
}
|
||||||
function importText(text, target) {
|
function importText(text, target) {
|
||||||
for (var i = 0; i < cardTextList.length; i++) {
|
for (var i = 0; i < cardTextList.length; i++) {
|
||||||
|
@@ -3,36 +3,51 @@ var versionM15ImageList = [
|
|||||||
['Blue Frame', 'data/images/m15/m15FrameU.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
['Blue Frame', 'data/images/m15/m15FrameU.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
['Black Frame', 'data/images/m15/m15FrameB.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
['Black Frame', 'data/images/m15/m15FrameB.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
['Red Frame', 'data/images/m15/m15FrameR.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
['Red Frame', 'data/images/m15/m15FrameR.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
['Green Frame', 'data/images/m15/m15FrameG.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']]
|
['Green Frame', 'data/images/m15/m15FrameG.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
|
['Multicolored Frame', 'data/images/m15/m15FrameM.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
|
['Artifact Frame', 'data/images/m15/m15FrameA.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
|
['Vehicle Frame', 'data/images/m15/m15FrameV.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
|
['Land Frame', 'data/images/m15/m15FrameL.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
|
['White Nyx Nyx Frame', 'data/images/m15/m15FrameWNyx.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
|
['Blue Nyx Frame', 'data/images/m15/m15FrameUNyx.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
|
['Black Nyx Frame', 'data/images/m15/m15FrameBNyx.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
|
['Red Nyx Frame', 'data/images/m15/m15FrameRNyx.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
|
['Green Nyx Frame', 'data/images/m15/m15FrameGNyx.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
|
['Multicolored Nyx Frame', 'data/images/m15/m15FrameMNyx.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']],
|
||||||
|
['Artifact Nyx Frame', 'data/images/m15/m15FrameANyx.png', 0, 0, 1, 1, ['Full', 'Pinline (m15)']]
|
||||||
]
|
]
|
||||||
|
|
||||||
var versionM15MaskList = [['Right Half', 'data/images/maskRightHalf.png'], ['Pinline (m15)', 'data/images/m15/m15MaskPinline.png'], ['Full', 'data/images/maskFull.png']]
|
var versionM15MaskList = [['Right Half', 'data/images/maskRightHalf.png'], ['Pinline (m15)', 'data/images/m15/m15MaskPinline.png'], ['Full', 'data/images/maskFull.png']]
|
||||||
|
|
||||||
if (!loadedVersions.includes('m15')) {
|
if (!loadedVersions.includes('m15')) {
|
||||||
loadedVersions.push("m15")
|
loadedVersions.push("m15")
|
||||||
loadMaskImages(versionM15MaskList)
|
loadMaskImages(versionM15MaskList)
|
||||||
loadFrameImages(versionM15ImageList)
|
loadFrameImages(versionM15ImageList)
|
||||||
}
|
}
|
||||||
|
|
||||||
loadTextOptions([
|
loadTextOptions([
|
||||||
new cardText('Card Title', 'Awesome Card Tho!!!', 0.1, 0.1, 0.8, 0.8, 'belerenb', 0.0177, 'black'),
|
new cardText('Card Title', '', 126/1500, 188/2100, 1248/1500, 80/2100, 'belerenb', 80/2100, 'black', ['oneLine=true']),
|
||||||
new cardText('Card Type', '', 0.1, 0.1, 0.8, 0.8, 'belerenb', 0.0177, 'black'),
|
new cardText('Card Type', '', 126/1500, 1263/2100, 1248/1500, 68/2100, 'belerenb', 68/2100, 'black', ['oneLine=true']),
|
||||||
new cardText('Rules Text', '', 0.1, 0.1, 0.8, 0.8, 'mplantin', 0.0177, 'black'),
|
new cardText('Rules Text', '', 135/1500, 1372/2100, 1230/1500, 624/2100, 'mplantin', 74/2100, 'black'),
|
||||||
new cardText('Power/Toughness', '', 0.1, 0.1, 0.8, 0.8, 'mplantin', 0.0177, 'black')
|
new cardText('Power/Toughness', '', 0.1, 0.1, 0.8, 0.8, 'mplantin', 0.0177, 'black', ['oneLine=true'])
|
||||||
])
|
])
|
||||||
|
|
||||||
artX = 0
|
artX = scaleX(115 / 1500)
|
||||||
artY = 0
|
artY = scaleY(237 / 2100)
|
||||||
artWidth = 1500
|
artWidth = scaleX(1154 / 1500)
|
||||||
artHeight = 500
|
artHeight = scaleY(928 / 2100)
|
||||||
bottomInfoFunction = 'bottomInfoM15'
|
bottomInfoFunction = 'bottomInfoM15'
|
||||||
|
|
||||||
manaCostXPath = 'scaleX(0.05) * manaSymbolIndex'
|
manaCostXPath = '1316 - 78 * manaSymbolIndex'
|
||||||
manaCostYPath = 'scaleY(0.1)'
|
manaCostYPath = '121'
|
||||||
manaCostDiameter = 'scaleX(0.05)'
|
manaCostDiameter = '70'
|
||||||
manaCostShadowOffset = '[scaleX(-0.01), scaleY(0.01)]'
|
manaCostShadowOffset = '[-2, 6]'
|
||||||
|
manaCostDirection = 'reverse'
|
||||||
|
|
||||||
setSymbolX = [scaleX(0.8), 'right']
|
setSymbolX = [scaleX(1382/1500), 'right']
|
||||||
setSymbolY = [scaleY(0.5), 'left']
|
setSymbolY = [scaleY(1200/2100), 'left']
|
||||||
setSymbolWidth = scaleX(0.1)
|
setSymbolWidth = scaleX(180/1500)
|
||||||
setSymbolHeight = scaleY(0.1)
|
setSymbolHeight = scaleY(80/2100)
|
||||||
|
|
||||||
watermarkX = scaleX(0.5)
|
watermarkX = scaleX(0.5)
|
||||||
watermarkY = scaleY(0.5)
|
watermarkY = scaleY(0.5)
|
||||||
@@ -41,9 +56,22 @@ watermarkHeight = scaleY(1)
|
|||||||
|
|
||||||
function bottomInfoM15() {
|
function bottomInfoM15() {
|
||||||
bottomInfoContext.clearRect(0, 0, cardWidth, cardHeight)
|
bottomInfoContext.clearRect(0, 0, cardWidth, cardHeight)
|
||||||
|
var ptBoxShift = 0
|
||||||
|
for (var i = 0; i < cardTextList.length; i++) {
|
||||||
|
if (cardTextList[i].name == 'Power/Toughness' && cardTextList[i].text != '') {
|
||||||
|
ptBoxShift = 36/2100
|
||||||
|
} else {
|
||||||
|
// console.log(cardTextList[i].name, cardTextList[i].text)
|
||||||
|
}
|
||||||
|
}
|
||||||
writeText(
|
writeText(
|
||||||
[
|
[
|
||||||
{text: 'EEEEEEEE', x: 0, y: 0.05, width: 0.8, height: 0.05, font: 'mplantin', fontSize: 0.05, fontColor: 'black', otherParameters: ['oneLine=true']},
|
{text: document.getElementById('inputInfoNumber').value, x: 97/1500, y: 1990/2100, width: 1306/1500, height: 36/2100, font: 'gothammedium', fontSize: 36/2100, fontColor: 'white', otherParameters: ['oneLine=true']},
|
||||||
|
{text: document.getElementById('inputInfoSet').value + '\u2605' + document.getElementById('inputInfoLanguage').value + ' {artistbrush}{up' + scaleY(36/2100) + '}' + document.getElementById('inputInfoRarity').value + ' {down' + scaleY(72/2100) + '}{up' + scaleY(36/2100) + '}{fontbelerenbsc}' + document.getElementById('inputInfoArtist').value, x: 97/1500, y: 2026/2100, width: 1306/1500, height: 36/2100, font: 'gothammedium', fontSize: 36/2100, fontColor: 'white', otherParameters: ['oneLine=true']},
|
||||||
|
{text: '{right}\u2122 & \u00a9 ' + date.getFullYear() + ' Wizards of the Coast', x: 97/1500, y: 1990/2100 + ptBoxShift, width: 1306/1500, height: 35/2100, font: 'mplantin', fontSize: 35/2100, fontColor: 'white', otherParameters: ['oneLine=true']},
|
||||||
|
{text: '*Not for Sale*', x: 97/1500, y: 2056/2100, width: 1306/1500, height: 30/2100, font: 'gothammedium', fontSize: 30/2100, fontColor: 'white', otherParameters: ['oneLine=true']},
|
||||||
|
{text: '{right}CardConjurer.com', x: 97/1500, y: 2020/2100 + ptBoxShift, width: 1306/1500, height: 30/2100, font: 'mplantin', fontSize: 30/2100, fontColor: 'white', otherParameters: ['oneLine=true']}
|
||||||
], bottomInfoContext)
|
], bottomInfoContext)
|
||||||
// document.body.appendChild(bottomInfoCanvas)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bottomInfoUpdated()
|
BIN
data/site/images/samples/sample1.png
Normal file
After Width: | Height: | Size: 1.1 MiB |
BIN
data/site/images/samples/sample2.png
Normal file
After Width: | Height: | Size: 1.1 MiB |
BIN
data/site/images/samples/sample3.png
Normal file
After Width: | Height: | Size: 869 KiB |
BIN
data/site/images/samples/sample4.png
Normal file
After Width: | Height: | Size: 1.3 MiB |
BIN
data/site/images/samples/sample5.png
Normal file
After Width: | Height: | Size: 1.1 MiB |
@@ -37,15 +37,31 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--light-color: #eee;
|
--background-color: #fafafa;
|
||||||
|
--background-color-contrast: #222;
|
||||||
|
--interactable-color: #aaa;
|
||||||
|
--interactable-selected-color: #888;
|
||||||
|
--input-color: #ddd;
|
||||||
|
--font-color: #000;
|
||||||
|
--font-color-contrast: #eee;
|
||||||
}
|
}
|
||||||
|
|
||||||
html {
|
html {
|
||||||
user-select: none;
|
user-select: none;
|
||||||
font-size: 20pt;
|
font-size: 20pt;
|
||||||
|
background-color: var(--background-color);
|
||||||
|
color: var(--font-color);
|
||||||
}
|
}
|
||||||
body {
|
html, body {
|
||||||
margin: 0px;
|
margin: 0;
|
||||||
|
overflow-x: hidden
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
text-align: center;
|
||||||
|
color: var(--font-color);
|
||||||
|
font: 2.5rem 'belerenbsc';
|
||||||
|
margin-top: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cardMaster {
|
.cardMaster {
|
||||||
@@ -57,7 +73,7 @@ body {
|
|||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 2rem auto 2rem;
|
grid-template-columns: 2rem auto 2rem;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background: gray;
|
background-color: var(--input-color);
|
||||||
}
|
}
|
||||||
.cardMasterElement > .handle {
|
.cardMasterElement > .handle {
|
||||||
cursor: move;
|
cursor: move;
|
||||||
@@ -65,14 +81,14 @@ body {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
.cardMasterElementMoving {
|
.cardMasterElementMoving {
|
||||||
background-color: #555;
|
background-color: var(--interactable-selected-color);
|
||||||
}
|
}
|
||||||
.cardMasterElement > .delete {
|
.cardMasterElement > .delete {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
.cardMasterElement.cardMasterElementSelected {
|
.cardMasterElement.cardMasterElementSelected {
|
||||||
background: green;
|
background-color: var(--interactable-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.splitGrid {
|
.splitGrid {
|
||||||
@@ -84,6 +100,7 @@ body {
|
|||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fit, minmax(5rem, 1fr));
|
grid-template-columns: repeat(auto-fit, minmax(5rem, 1fr));
|
||||||
grid-auto-rows: min-content;
|
grid-auto-rows: min-content;
|
||||||
|
grid-gap: 0.1rem;
|
||||||
}
|
}
|
||||||
.frameGrid {
|
.frameGrid {
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -117,10 +134,10 @@ img {
|
|||||||
max-height: 1.5rem;
|
max-height: 1.5rem;
|
||||||
}
|
}
|
||||||
#framePicker > div.frameOptionSelected, #maskPicker > div.maskOptionSelected {
|
#framePicker > div.frameOptionSelected, #maskPicker > div.maskOptionSelected {
|
||||||
background-color: green;
|
background-color: var(--interactable-selected-color);
|
||||||
}
|
}
|
||||||
#maskPicker > div, #framePicker > div {
|
#maskPicker > div, #framePicker > div {
|
||||||
background-color: gray;
|
background-color: var(--interactable-color);
|
||||||
}
|
}
|
||||||
#maskPicker > div {
|
#maskPicker > div {
|
||||||
padding: 0.5rem;
|
padding: 0.5rem;
|
||||||
@@ -136,15 +153,20 @@ img {
|
|||||||
}
|
}
|
||||||
#textPicker > div {
|
#textPicker > div {
|
||||||
font: 1rem belerenbsc;
|
font: 1rem belerenbsc;
|
||||||
background: gray;
|
background-color: var(--interactable-color);
|
||||||
padding: 0.5rem;
|
padding: 0.5rem;
|
||||||
}
|
}
|
||||||
#textPicker > div.selectedText {
|
#textPicker > div.selectedText {
|
||||||
background: green;
|
background-color: var(--interactable-selected-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
canvas {
|
canvas {
|
||||||
background: gray;
|
/*background-color: var(--interactable-color);*/
|
||||||
|
}
|
||||||
|
textarea {
|
||||||
|
resize: vertical;
|
||||||
|
min-height: 4rem;
|
||||||
|
max-height: 12rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hidden {
|
.hidden {
|
||||||
@@ -157,9 +179,7 @@ canvas {
|
|||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 750px auto;
|
grid-template-columns: 750px auto;
|
||||||
grid-gap: 1rem;
|
grid-gap: 1rem;
|
||||||
background: #eeeeee;
|
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
margin-bottom: 12rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabPicker {
|
.tabPicker {
|
||||||
@@ -173,13 +193,112 @@ canvas {
|
|||||||
font: 1rem belerenbsc;
|
font: 1rem belerenbsc;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 0.5rem;
|
padding: 0.5rem;
|
||||||
background: gray;
|
background-color: var(--interactable-color);
|
||||||
}
|
}
|
||||||
.tabPicker > div.tabOptionSelected {
|
.tabPicker > div.tabOptionSelected {
|
||||||
background: green;
|
background-color: var(--interactable-selected-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
input, textarea, button, select {
|
input, textarea, button, select {
|
||||||
font: 0.8rem mplantin;
|
font: 0.8rem mplantin;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
background-color: var(--input-color);
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
padding: 0.2rem;
|
||||||
|
margin-top: 0.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fade-in {
|
||||||
|
from {opacity: 0;}
|
||||||
|
to {opacity: 1;}
|
||||||
|
}
|
||||||
|
@keyframes slide-from-left {
|
||||||
|
from {position: relative; left: -100vw;}
|
||||||
|
to {position: relative; left: 0px;}
|
||||||
|
}
|
||||||
|
@keyframes slide-from-right {
|
||||||
|
from {position: relative; left: 100vw;}
|
||||||
|
to {position: relative; left: 0px;}
|
||||||
|
}
|
||||||
|
.layer {
|
||||||
|
padding: 5rem;
|
||||||
|
}
|
||||||
|
.layerTitle {
|
||||||
|
/*color: inherit;*/
|
||||||
|
text-align: center;
|
||||||
|
font: 2rem 'belerenbsc';
|
||||||
|
}
|
||||||
|
.darkLayer {
|
||||||
|
background-color: var(--background-color-contrast);
|
||||||
|
color: var(--font-color-contrast);
|
||||||
|
}
|
||||||
|
.layer > div {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.layer.revealedLayer > div {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.layer.revealedLayer.fadeIn > div {
|
||||||
|
animation: fade-in 2s;
|
||||||
|
}
|
||||||
|
.mainGrid.fadeIn {
|
||||||
|
animation: fade-in 0.5s;
|
||||||
|
}
|
||||||
|
.layer.revealedLayer.slideFromLeft > div {
|
||||||
|
animation: slide-from-left 2s;
|
||||||
|
}
|
||||||
|
.layer.revealedLayer.slideFromRight > div {
|
||||||
|
animation: slide-from-right 2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
padding: 2rem;
|
||||||
|
background-color: var(--background-color-contrast);
|
||||||
|
color: var(--font-color-contrast);
|
||||||
|
font: 0.6rem 'open sans';
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: auto auto auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fiveSampleCards {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
|
||||||
|
margin: 2rem 0;
|
||||||
|
}
|
||||||
|
.fiveSampleCards > div > img {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.layer.revealedLayer > div > div > div > .sample1 {
|
||||||
|
animation: sample-one 2s;
|
||||||
|
transform: rotate(-10deg) translate(16%, 15%);
|
||||||
|
}
|
||||||
|
.layer.revealedLayer > div > div > div > .sample2 {
|
||||||
|
animation: sample-two 2s;
|
||||||
|
transform: rotate(-5deg) translate(10%, 4%);
|
||||||
|
}
|
||||||
|
.layer.revealedLayer > div > div > div > .sample4 {
|
||||||
|
animation: sample-four 2s;
|
||||||
|
transform: rotate(5deg) translate(-10%, 4%);
|
||||||
|
}
|
||||||
|
.layer.revealedLayer > div > div > div > .sample5 {
|
||||||
|
animation: sample-five 2s;
|
||||||
|
transform: rotate(10deg) translate(-16%, 15%);
|
||||||
|
}
|
||||||
|
@keyframes sample-one {
|
||||||
|
from {transform: rotate(0deg) translate(0, 0); position: relative; left: 200%;}
|
||||||
|
to {transform: rotate(-10deg) translate(16%, 15%); position: relative; left: 0;}
|
||||||
|
}
|
||||||
|
@keyframes sample-two {
|
||||||
|
from {transform: rotate(0deg) translate(0, 0); position: relative; left: 100%;}
|
||||||
|
to {transform: rotate(-5deg) translate(10%, 4%); position: relative; left: 0;}
|
||||||
|
}
|
||||||
|
@keyframes sample-four {
|
||||||
|
from {transform: rotate(0deg) translate(0, 0); position: relative; left: -100%;}
|
||||||
|
to {transform: rotate(5deg) translate(-10%, 4%); position: relative; left: 0;}
|
||||||
|
}
|
||||||
|
@keyframes sample-five {
|
||||||
|
from {transform: rotate(0deg) translate(0, 0); position: relative; left: -200%;}
|
||||||
|
to {transform: rotate(10deg) translate(-16%, 15%); position: relative; left: 0;}
|
||||||
}
|
}
|
44
index.html
@@ -5,9 +5,10 @@
|
|||||||
<link rel="stylesheet" href="data/site/styles.css">
|
<link rel="stylesheet" href="data/site/styles.css">
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<div class='title'>Card Conjurer</div>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class='mainGrid'>
|
<div class='mainGrid fadeIn'>
|
||||||
<canvas id="previewCanvas"></canvas>
|
<canvas id="previewCanvas"></canvas>
|
||||||
<div>
|
<div>
|
||||||
<div class='tabPicker'>
|
<div class='tabPicker'>
|
||||||
@@ -130,7 +131,48 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class='layer darkLayer fadeIn'>
|
||||||
|
<div>
|
||||||
|
<div class='layerTitle'>Welcome to Card Conjurer</div>
|
||||||
|
<div class='fiveSampleCards'>
|
||||||
|
<div><img src='data/site/images/samples/sample1.png' alt='loading sample...' class='sample1'></div>
|
||||||
|
<div><img src='data/site/images/samples/sample2.png' alt='loading sample...' class='sample2'></div>
|
||||||
|
<div><img src='data/site/images/samples/sample3.png' alt='loading sample...' class='sample3'></div>
|
||||||
|
<div><img src='data/site/images/samples/sample4.png' alt='loading sample...' class='sample4'></div>
|
||||||
|
<div><img src='data/site/images/samples/sample5.png' alt='loading sample...' class='sample5'></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='layer fadeIn'>
|
||||||
|
<div>
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Id volutpat lacus laoreet non curabitur. Adipiscing tristique risus nec feugiat in fermentum. Vulputate mi sit amet mauris. Morbi tincidunt augue interdum velit euismod in. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan. Sed felis eget velit aliquet sagittis. Neque ornare aenean euismod elementum nisi quis eleifend. Nisl nunc mi ipsum faucibus vitae. Mattis nunc sed blandit libero volutpat sed cras ornare. Sed vulputate mi sit amet mauris commodo quis imperdiet massa. Condimentum mattis pellentesque id nibh tortor. Leo in vitae turpis massa. Dignissim cras tincidunt lobortis feugiat vivamus. Massa ultricies mi quis hendrerit dolor magna eget est.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='layer darkLayer slideFromRight'>
|
||||||
|
<div>
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vehicula ipsum a arcu cursus vitae. Venenatis tellus in metus vulputate eu. Id diam maecenas ultricies mi. Enim nec dui nunc mattis enim ut tellus elementum. Consectetur libero id faucibus nisl tincidunt eget nullam non. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Morbi leo urna molestie at elementum eu facilisis sed odio. Nulla pharetra diam sit amet nisl suscipit. A erat nam at lectus urna duis. Neque viverra justo nec ultrices.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='layer slideFromLeft'>
|
||||||
|
<div>
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vehicula ipsum a arcu cursus vitae. Venenatis tellus in metus vulputate eu. Id diam maecenas ultricies mi. Enim nec dui nunc mattis enim ut tellus elementum. Consectetur libero id faucibus nisl tincidunt eget nullam non. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Morbi leo urna molestie at elementum eu facilisis sed odio. Nulla pharetra diam sit amet nisl suscipit. A erat nam at lectus urna duis. Neque viverra justo nec ultrices.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
<footer class='footer'>
|
||||||
|
<div>Card Conjurer by Kyle Burton</div>
|
||||||
|
<div>
|
||||||
|
Navigation<br>
|
||||||
|
Card Creator<br>
|
||||||
|
Life Counter<br>
|
||||||
|
Ask Scryfall
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
Legal<br>
|
||||||
|
Terms of Use<br>
|
||||||
|
Disclaimer
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
<script defer src="data/scripts/sortable.js"></script>
|
<script defer src="data/scripts/sortable.js"></script>
|
||||||
<script defer src="data/scripts/main.js"></script>
|
<script defer src="data/scripts/main.js"></script>
|
||||||
<script defer src="data/scripts/versionM15.js"></script>
|
<script defer src="data/scripts/versionM15.js"></script>
|
||||||
|