251 lines
12 KiB
HTML
251 lines
12 KiB
HTML
<html>
|
|
<head>
|
|
<title>Deckard + Company</title>
|
|
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
|
|
<meta http-equiv="Pragma" content="no-cache" />
|
|
<meta http-equiv="Expires" content="0" />
|
|
<link href="css.css" rel="stylesheet">
|
|
<script src="https://labs.murkfall.net/bluesaxman/blue.js/raw/master/libs/bluecore.js"></script>
|
|
</head>
|
|
<body>
|
|
<h1>Welcome to Deckard + Company<h1>
|
|
</body>
|
|
<script>
|
|
|
|
window.server = "wss://test.murkfall.net:42024/";
|
|
window.gameState = {};
|
|
window.gameState.log = "";
|
|
window.gameState.users = [];
|
|
window.gameState.decks = [];
|
|
window.gameState.pools = [];
|
|
window.gameState.hands = [];
|
|
window.gameState.active = {};
|
|
|
|
function updateEvent() {
|
|
window.UI.display.innerHTML = "";
|
|
if (Object.keys(window.gameState.decks).length < 2) { window.gameState.active.deck = Object.keys(window.gameState.decks)[0]; }
|
|
if (Object.keys(window.gameState.hands).length < 2) { window.gameState.active.hand = Object.keys(window.gameState.hands)[0]; }
|
|
if (Object.keys(window.gameState.pools).length < 2) { window.gameState.active.pool = Object.keys(window.gameState.pools)[0]; }
|
|
if (window.UI.menu.decks.button.checked) {
|
|
elementPlace("#display","decks",null,"ol");
|
|
var myKeys = Object.keys(window.gameState.decks);
|
|
myKeys.sort();
|
|
myKeys.forEach(function (deckID) {
|
|
var deck = window.gameState.decks[deckID];
|
|
window.UI.display[deckID] = elementPlace("#decks","Deck_"+deck.name,"deck"+(deck.name == window.gameState.active.deck ? " selected" : ""),"li");
|
|
window.UI.display[deckID].innerHTML = '<div class="object_name">'+deck.name+"</div>";
|
|
window.UI.display[deckID].controls = elementPlace("#Deck_"+deck.name,"Deck_controls_"+deck.name,"controls","div");
|
|
window.UI.display[deckID].content = elementPlace("#Deck_"+deck.name,null,"content","div");
|
|
window.UI.display[deckID].content.innerHTML = '<div class="deck_size">'+deck.size+'</div>';
|
|
buttonAdd("#Deck_controls_"+deck.name,null,"Add Cards", function () {
|
|
popupDialog("deckLoader","Select DDF (Deck Definition File)",true,inputDialog,{"inputType":"file"},function (f) {
|
|
var myFile = new FileReader();
|
|
myFile.onload = function (file) {
|
|
var message = {};
|
|
message.action = "ddf";
|
|
message.deck = deckID;
|
|
message.ddf = file.target.result;
|
|
window.gameSession.send(JSON.stringify(message));
|
|
}
|
|
myFile.readAsText(f[0]);
|
|
});
|
|
},"deck_button add_cards","div");
|
|
buttonAdd("#Deck_controls_"+deck.name,null,"Shuffle", function () {
|
|
window.gameSession.send('{"action":"shuffle", "deck":"'+deckID+'"}');
|
|
}, "deck_button shuffle","div");
|
|
buttonAdd("#Deck_controls_"+deck.name,null,"Draw", function () {
|
|
window.gameSession.send('{"action":"draw","deck":"'+deckID+'","hand":"'+window.gameState.active.hand+'"}'); // Will need to be updated when I figure out selection
|
|
}, "deck_button draw","div");
|
|
buttonAdd("#Deck_controls_"+deck.name,null,"X", function () {
|
|
window.gameSession.send('{"action":"del","type":"deck","id":"'+deckID+'"}');
|
|
}, "deck_button delete", "div");
|
|
window.UI.display[deckID].onclick = function () {
|
|
window.gameState.active.deck = deck.name;
|
|
updateEvent();
|
|
};
|
|
});
|
|
buttonAdd("#decks",null,"+",function () {
|
|
popupDialog("addDeck","Please name new deck",true, inputDialog,{"inputType":"text"},function (newDeckName) {
|
|
window.gameSession.send('{"action":"add","type":"deck","id":"'+newDeckName+'"}');
|
|
});
|
|
}, "add_button","li");
|
|
}
|
|
if (window.UI.menu.users.button.checked) {
|
|
elementPlace("#display","users",null,"ol");
|
|
window.gameState.users.sort();
|
|
window.gameState.users.forEach(function (user) {
|
|
window.UI.display[user] = elementPlace("#users","User_"+user,"username","li");
|
|
window.UI.display[user].innerText = user;
|
|
});
|
|
}
|
|
if (window.UI.menu.hands.button.checked) {
|
|
elementPlace("#display","hands",null,"ol");
|
|
var myHands = Object.keys(window.gameState.hands);
|
|
myHands.sort();
|
|
myHands.forEach(function (handID) {
|
|
var hand = window.gameState.hands[handID];
|
|
window.UI.display[handID] = elementPlace("#hands","Hand_"+hand.name,"hand"+(hand.name == window.gameState.active.hand ? " selected" : ""),"li");
|
|
window.UI.display[handID].innerHTML = '<div class="object_name">'+hand.name+"</div>";
|
|
window.UI.display[handID].controls = elementPlace("#Hand_"+hand.name,"Hand_controls_"+hand.name,"controls","div");
|
|
window.UI.display[handID].content = elementPlace("#Hand_"+hand.name,"Hand_content_"+hand.name,"content","div");
|
|
buttonAdd("#Hand_controls_"+hand.name,null,"Muligan",function () {
|
|
window.gameSession.send('{"action":"muligan","hand":"'+handID+'","deck":"'+window.gameState.active.deck+'"}');
|
|
}, "hand_button muligan", "div");
|
|
buttonAdd("#Hand_controls_"+hand.name,null,"X",function () {
|
|
window.gameSession.send('{"action":"del","type":"hand","id":"'+handID+'"}');
|
|
}, "hand_button delete", "div");
|
|
window.UI.display[handID].cards = elementPlace("#Hand_content_"+hand.name,hand.name+"_cards",null,"ol");
|
|
hand.cards.forEach(function (card,index) {
|
|
window.UI.display[handID].cards[index] = elementPlace("#"+hand.name+"_cards","card"+hand.name+index,"card","li");
|
|
window.UI.display[handID].cards[index].style.position = "relative";
|
|
window.UI.display[handID].cards[index].innerHTML = card;
|
|
window.UI.display[handID].cards[index].controls = elementPlace("#card"+hand.name+index,"card"+hand.name+index+"_controls","controls","div");
|
|
buttonAdd("#card"+handID+index+"_controls",null,"Play Card", function () {
|
|
window.gameSession.send('{"action":"play","hand":"'+handID+'","cardID":"'+index+'","pool":"'+window.gameState.active.pool+'"}');
|
|
}, "card_button play", "div");
|
|
});
|
|
window.UI.display[handID].onclick = function () {
|
|
window.gameState.active.hand = hand.name;
|
|
updateEvent();
|
|
}
|
|
});
|
|
buttonAdd("#hands",null,"+",function () {
|
|
popupDialog("addHand","Please name new hand",true, inputDialog,{"inputType":"text"},function (newHandName) {
|
|
window.gameSession.send('{"action":"add","type":"hand","id":"'+newHandName+'"}');
|
|
});
|
|
}, "add_button", "li");
|
|
}
|
|
if (window.UI.menu.pools.button.checked) {
|
|
elementPlace("#display","pools",null,"ol");
|
|
var myPools = Object.keys(window.gameState.pools);
|
|
myPools.sort();
|
|
myPools.forEach(function (poolID) {
|
|
var pool = window.gameState.pools[poolID];
|
|
window.UI.display[poolID] = elementPlace("#pools","Pool_"+pool.name,"pool"+(pool.name == window.gameState.active.pool ? " selected" : ""),"li");
|
|
window.UI.display[poolID].innerHTML = '<div class="object_name">'+pool.name+"</div>";
|
|
window.UI.display[poolID].controls = elementPlace("#Pool_"+pool.name,"Pool_controls_"+pool.name, "controls","div");
|
|
window.UI.display[poolID].content = elementPlace("#Pool_"+pool.name,"Pool_content_"+pool.name, "content","div");
|
|
window.UI.display[poolID].content.innerHTML += '<div class="card">'+pool.top+"</div>";
|
|
buttonAdd("#Pool_controls_"+pool.name,null,"X",function () {
|
|
window.gameSession.send('{"action":"del","type":"pool","id":"'+poolID+'","deck":"'+window.gameState.active.deck+'"}');
|
|
},"pool_button delete","div");
|
|
window.UI.display[poolID].onclick = function () {
|
|
window.gameState.active.pool = pool.name;
|
|
updateEvent();
|
|
}
|
|
});
|
|
buttonAdd("#pools",null,"+",function () {
|
|
popupDialog("addHand","Please name new pool",true, inputDialog,{"inputType":"text"},function (newPoolName) {
|
|
window.gameSession.send('{"action":"add","type":"pool","id":"'+newPoolName+'"}');
|
|
});
|
|
}, "add_button", "li");
|
|
}
|
|
if (window.UI.menu.options.button.checked) {
|
|
elementPlace("#display","options",null,"div");
|
|
buttonAdd("#options", null, "Invite", function () {
|
|
var invite = window.location.href;
|
|
navigator.clipboard.writeText(invite).then(function () {
|
|
window.alert("Invite link copied")});
|
|
}, null, "div");
|
|
buttonAdd("#options", null, "Leave Game", function () {
|
|
window.gameSession.close(4001,"User is leaving");
|
|
window.location.search = "";
|
|
}, null, "div");
|
|
}
|
|
}
|
|
|
|
function startGameSession() {
|
|
window.gameSession = new WebSocket(server);
|
|
gameSession.onmessage = function (event) {
|
|
var message = JSON.parse(event.data);
|
|
if (message.userID) { window.userID = message.userID; }
|
|
if (message.message) { console.log(message.message); }
|
|
if (message.request) {
|
|
if ("session" == message.request) { window.gameSession.send('{"session":'+window.gameState.session+'}'); }
|
|
if ("user" == message.request) { window.gameSession.send('{"user":"'+window.gameState.user+'"}'); }
|
|
if ("join" == message.request) { window.gameSession.send('{"action":"join"}'); }
|
|
if ("update" == message.request) { window.gameSession.send('{"action":"update"}'); }
|
|
}
|
|
if (message.push) {
|
|
window.gameSession.log += "<p>"+message.user+": "+message.action+"</p>";
|
|
if ("draw" == message.action) { window.UI.menu.decks.button.checked = true; }
|
|
if ("play" == message.action) { window.UI.menu.pools.button.checked = true; }
|
|
if ("muligan" == message.action) { window.UI.menu.decks.button.checked = true; }
|
|
if ("clear" == message.action) { window.UI.menu.decks.button.checked = true; }
|
|
updateEvent();
|
|
}
|
|
if (message.users) { window.gameState.users = message.users; updateEvent(); }
|
|
if (message.decks) { window.gameState.decks = message.decks; updateEvent(); }
|
|
if (message.pools) { window.gameState.pools = message.pools; updateEvent(); }
|
|
if (message.hands) { window.gameState.hands = message.hands; updateEvent(); }
|
|
if (message.action) {
|
|
if ("addCard" == message.action) {
|
|
window.gameState.hands[message.hand].cards.push(message.card);
|
|
updateEvent();
|
|
}
|
|
}
|
|
console.log(message);
|
|
|
|
};
|
|
gameSession.onconnect = function () {};
|
|
gameSession.onclose = function (event) {
|
|
console.log(event);
|
|
};
|
|
}
|
|
|
|
|
|
|
|
window.document.body.innerHTML = "";
|
|
window.UI = {};
|
|
|
|
function menuButton(ParentID,name,group,checked) {
|
|
var button = elementPlace(ParentID,name+"_handle", "menu_button_input", "input");
|
|
var label = elementPlace(ParentID,null,"menu_button","label");
|
|
button.type = "radio";
|
|
button.name = group;
|
|
button.value = name;
|
|
button.checked = checked;
|
|
label.setAttribute("for", name+"_handle");
|
|
label.innerText = name;
|
|
button.onchange = updateEvent;
|
|
return {"label":label,"button":button};
|
|
}
|
|
|
|
window.UI.menu = elementPlace("body","menu",null,"div");
|
|
window.UI.menu.decks = menuButton("#menu","Decks","menu",true);
|
|
window.UI.menu.hands = menuButton("#menu","Hands","menu",false);
|
|
window.UI.menu.pools = menuButton("#menu","Pools","menu",false);
|
|
window.UI.menu.users = menuButton("#menu","Users","menu",false);
|
|
window.UI.menu.options = menuButton("#menu","Options","menu",false);
|
|
|
|
window.UI.display = elementPlace("body","display",null,"div");
|
|
|
|
var parms = new URLSearchParams(window.location.search);
|
|
if (!parms.get("s")) {
|
|
popupDialog("gettingStarted","Welcome to Deckard and company", false, inputDialog,{"content":"Please enter a game ID or leave blank to start a new game","inputType":"number"},
|
|
function (value) {
|
|
if (Number.isInteger(Number.parseInt(value))) {
|
|
window.gameState.session = Number.parseInt(value);
|
|
} else {
|
|
window.gameState.session = null;
|
|
}
|
|
window.location.search = '?s='+window.gameState.session;
|
|
// window.location.reload();
|
|
});
|
|
} else {
|
|
window.gameState.session = parms.get("s");
|
|
if (!window.gameState.user) {
|
|
popupDialog("gettingStarted","Welcome to Deckard and company", false, inputDialog, {"content":"Please enter a username","inputType":"text"},
|
|
function (value) {
|
|
if ((null != value) && ("" != value)) {
|
|
window.gameState.user = value;
|
|
} else {
|
|
window.gameState.user = "Unknown"+(new Date()).getTime();
|
|
}
|
|
startGameSession();
|
|
});
|
|
} else { startGameSession(); }
|
|
}
|
|
</script>
|
|
</html>
|