removed game.html, fixes #85

This commit is contained in:
Jeena 2014-06-28 23:43:58 +02:00
parent b86052e93b
commit 9e6c42f221
8 changed files with 444 additions and 357 deletions

View file

@ -9,7 +9,9 @@ define([
function (ProtocolHelper, GameController, User, Nc, Settings, DomController) { function (ProtocolHelper, GameController, User, Nc, Settings, DomController) {
function Networker (socketLink) { function Networker (socketLink, channelName, nickname) {
this.channelName = channelName;
this.nickname = nickname;
this.socketLink = socketLink; this.socketLink = socketLink;
this.gameController = null; this.gameController = null;
this.users = {}; this.users = {};
@ -38,14 +40,13 @@ function (ProtocolHelper, GameController, User, Nc, Settings, DomController) {
Networker.prototype.onConnect = function () { Networker.prototype.onConnect = function () {
console.log('connected.') console.log('connected.')
var channel = JSON.parse(localStorage["channel"]); if(this.channelName) {
var player = JSON.parse(localStorage["player"]);
if(channel.name) {
var options = { var options = {
channelName: channel.name, channelName: this.channelName,
nickname: player.nickname nickname: this.nickname
} }
this.sendCommand('join', options); this.sendCommand('join', options);
DomController.setConnected(true);
} else { } else {
window.location.href = "/"; window.location.href = "/";
} }
@ -55,7 +56,7 @@ function (ProtocolHelper, GameController, User, Nc, Settings, DomController) {
//if(this.gameController) this.gameController.destruct(); //if(this.gameController) this.gameController.destruct();
//this.gameController = null; //this.gameController = null;
console.log('disconnected. game destroyed. no auto-reconnect'); console.log('disconnected. game destroyed. no auto-reconnect');
document.body.style.backgroundColor = '#aaaaaa'; DomController.setConnected(false);
} }
Networker.prototype.onJoinSuccess = function (options) { Networker.prototype.onJoinSuccess = function (options) {

View file

@ -123,6 +123,14 @@ function (Settings, Nc, Stats, Screenfull) {
this.health.innerHTML = "Health: " + parseInt(health, 10); this.health.innerHTML = "Health: " + parseInt(health, 10);
}; };
DomController.prototype.setConnected = function(connected) {
if(connected) {
document.body.style.backgroundColor = '';
} else {
document.body.style.backgroundColor = '#aaaaaa';
}
};
return new DomController(); return new DomController();

View file

@ -62,12 +62,12 @@ define(function() {
// NETWORKING // NETWORKING
NETWORK_UPDATE_INTERVAL: 70, NETWORK_UPDATE_INTERVAL: 70,
CHANNEL_DESTRUCTION_TIME: 30,
NETWORK_LOG_INCOMING: false, NETWORK_LOG_INCOMING: false,
NETWORK_LOG_OUTGOING: false, NETWORK_LOG_OUTGOING: false,
NETWORK_LOG_FILTER: ['ping', 'pong', 'worldUpdate', 'lookAt'], NETWORK_LOG_FILTER: ['ping', 'pong', 'worldUpdate', 'lookAt'],
// CHANNEL // CHANNEL
CHANNEL_DESTRUCTION_TIME: 5 * 60,
CHANNEL_END_ROUND_TIME: 4, //10, CHANNEL_END_ROUND_TIME: 4, //10,
CHANNEL_DEFAULT_MAX_USERS: 40, CHANNEL_DEFAULT_MAX_USERS: 40,
CHANNEL_DEFAULT_SCORE_LIMIT: 10, CHANNEL_DEFAULT_SCORE_LIMIT: 10,

View file

@ -6,7 +6,8 @@ requirejs.config({
waitSeconds: 0 waitSeconds: 0
}); });
var inspector = {}; if(!Chuck) var Chuck = {};
Chuck.inspector = {};
requirejs([ requirejs([
"Game/Client/Networker", "Game/Client/Networker",
@ -18,6 +19,7 @@ requirejs([
function (Networker, SocketIO, Settings, Exception, PIXI) { function (Networker, SocketIO, Settings, Exception, PIXI) {
Chuck.run = function(channelName, nickname) {
var options = { var options = {
"reconnect": false, "reconnect": false,
"reconnection delay": 500, "reconnection delay": 500,
@ -28,8 +30,9 @@ function (Networker, SocketIO, Settings, Exception, PIXI) {
] ]
}; };
var socket = SocketIO.connect("/", options); var socket = SocketIO.connect("/", options);
var networker = new Networker(socket); var networker = new Networker(socket, channelName, nickname);
inspector.networker = networker; Chuck.inspector.networker = networker;
inspector.settings = Settings; Chuck.inspector.settings = Settings;
inspector.resetLevel = function() { networker.sendGameCommand("resetLevel"); } Chuck.inspector.resetLevel = function() { networker.sendGameCommand("resetLevel"); }
}
}); });

108
static/css/screen.css Normal file
View file

@ -0,0 +1,108 @@
html, body {
width: 100%;
height: 100%;
}
body {
background: #222;
color: #ccc;
font-family: "Lucida Grande", sans-serif;
margin: 0;
padding: 0;
display: table;
}
::selection {
background: #607950; /* Safari */
}
::-moz-selection {
background: #607950; /* Firefox */
}
input, button {
background: black;
color: #ccc;
border: 0;
padding: 0.3em 0.6em;
font-size: 1em;
}
#createform, #customjoinform, #game {
display: none;
}
article#menu {
margin: 4em auto;
background: #1a1a1a;
padding: 2em;
max-width: 30em;
}
table, th, td {
border: 1px solid #777;
border-collapse: collapse;
}
th, td {
padding: 0.5em 1em;
}
ul {
list-style-type: none;
padding-left: 0;
}
#link {
width: 100%;
}
.offline {
background: #ccc;
}
tr:hover td {
background: #222;
}
a {
color: #ccc;
}
#canvasContainer {
/*
text-align: center;
display: table-cell;
vertical-align: middle;
*/
height: 100%;
}
canvas {
position: absolute;
top: 50%;
left: 50%;
margin-top: -200px;
margin-left: -300px;
}
:-webkit-full-screen {
top: 0;
left: 0;
margin: 0;
padding: 0;
}
#devtools {
font-family: monospace;
position: absolute;
right: 0;
top: 0;
padding: 10px;
background: #222;
}
#devtools p {
padding: 5px 0 0 0;
margin: 0;
}

View file

@ -1,63 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Chuck</title>
<style>
html, body {
margin: 0;
padding: 0;
display: table;
width: 100%;
height: 100%;
background: black;
color: white;
font-family: monospace;
}
#canvasContainer {
/*
text-align: center;
display: table-cell;
vertical-align: middle;
*/
height: 100%;
}
canvas {
position: absolute;
top: 50%;
left: 50%;
margin-top: -200px;
margin-left: -300px;
}
:-webkit-full-screen {
top: 0;
left: 0;
margin: 0;
padding: 0;
}
#devtools {
position: absolute;
right: 0;
top: 0;
padding: 10px;
background: #222;
}
#devtools p {
padding: 5px 0 0 0;
margin: 0;
}
</style>
</head>
<body>
<div id="canvasContainer">
<canvas id="canvas"></canvas>
</div>
<script data-main="client" src="require.js"></script>
</body>
</html>

View file

@ -2,20 +2,10 @@
<html> <html>
<head> <head>
<title>Chuck Lobby</title> <title>Chuck Lobby</title>
<style type="text/css"> <link rel="stylesheet" href="/static/css/screen.css" type="text/css" media="screen">
body { background: #222; color: #ccc; font-family: "Lucida Grande", sans-serif; }
input, button { background: black; color: #ccc; border: 0; padding: 0.3em 0.6em; font-size: 1em; }
#createform, #customjoinform { display: none; }
article { margin: 4em auto; background: #1a1a1a; padding: 2em; max-width: 30em; }
table, th, td { border: 1px solid #777; border-collapse: collapse; }
th, td { padding: 0.5em 1em; }
ul { list-style-type: none; padding-left: 0; }
#link { width: 100%; }
.offline { background: #ccc; }
</style>
</head> </head>
<body> <body>
<article> <article id="menu">
<h1>Chuck</h1> <h1>Chuck</h1>
<p> <p>
<label> <label>
@ -42,8 +32,8 @@
</fieldset> </fieldset>
<p> <p>
<button>Run</button> <button>Create</button>
<button onclick="show('#listform'); return false;">Cancel</button> <button onclick="Chuck.menu.show('#listform'); return false;">Cancel</button>
</p> </p>
</div> </div>
</form> </form>
@ -51,13 +41,14 @@
<form action="#" method="GET" id="customjoinform"> <form action="#" method="GET" id="customjoinform">
<p> <p>
<label> <label>
Link to share with your friends<br> Link to share with your friends:<br>
<input id="link"> <input id="link" readonly onclick="this.select()">
</label> </label>
</p> </p>
<p> <p>
<button>Join</button> <button>Join</button>
<span id="timeout"></span> <span id="timeout"></span>
<button onclick="Chuck.menu.show('#listform'); return false;">Cancel</button>
</p> </p>
</form> </form>
@ -73,13 +64,19 @@
<tbody id="list"></tbody> <tbody id="list"></tbody>
</table> </table>
<p> <p>
<button>Join</button>
<button id="refresh">Refresh list</button> <button id="refresh">Refresh list</button>
<button onclick="show('#createform'); return false;">Create</button> <button onclick="Chuck.menu.show('#createform'); return false;">Create</button>
<button onclick="quickstart(); return false;">Quickstart</button> <button onclick="Chuck.menu.quickstart(); return false;">Quickstart</button>
</p> </p>
</form> </form>
</article> </article>
<article id="game">
<button onclick="window.location.href='/'">Menu</button>
<div id="canvasContainer">
<canvas id="canvas"></canvas>
</div>
</article>
<script type="text/javascript" src="/static/js/menu.js"></script> <script type="text/javascript" src="/static/js/menu.js"></script>
<script data-main="client" src="require.js"></script>
</body> </body>
</html> </html>

View file

@ -1,24 +1,43 @@
function $(selector) { if(!Chuck) var Chuck = {};
(function(Chuck) {
window.onhashchange = function() {
if(window.location.hash) {
refresh(function(list) {
var channelName = unescape(window.location.hash.substr(1));
if(channelExists(list, channelName)) {
showCustomJoinForm()
} else {
alert("Channel \"" + channelName + "\" does not exist (anymore).")
window.location.href = "/";
}
});
}
}
window.onload = window.onhashchange;
function $(selector) {
return document.querySelector(selector); return document.querySelector(selector);
} }
function $$(selector) { function $$(selector) {
return document.querySelectorAll(selector); return document.querySelectorAll(selector);
} }
if(localStorage["player"]) { if(localStorage["player"]) {
var player = JSON.parse(localStorage["player"]); var player = JSON.parse(localStorage["player"]);
if(player.nickname) { if(player.nickname) {
$("#nick").value = player.nickname; $("#nick").value = player.nickname;
} }
} }
if(localStorage["customname"]) { if(localStorage["customname"]) {
$("#customname").value = localStorage["customname"]; $("#customname").value = localStorage["customname"];
} }
var lastRefreshResponse; var lastRefreshResponse;
function refresh(callback) { function refresh(callback) {
try { try {
var xhr = new XMLHttpRequest(); var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() { xhr.onreadystatechange = function() {
@ -48,28 +67,26 @@ function refresh(callback) {
console.error(e) console.error(e)
} }
return false; return false;
} }
function populate(list) { function populate(list) {
var html = ""; var html = "";
if(list.length > 0) { if(list.length > 0) {
for (var i = 0; i < list.length; i++) { for (var i = 0; i < list.length; i++) {
var channel = list[i]; var channel = list[i];
html += "<tr><td><label>"; html += "<tr><td>";
html += "<input name='channel' type='radio' value='" + channel.name + "'" html += "<a href='#" + channel.name + "'>";
if(i == 0) html += " checked"
html += "> ";
html += channel.name html += channel.name
html += "</label></td><td></td></tr>"; html += "</a></td><td>death match</td></tr>";
}; };
} else { } else {
html += "<tr><td colspan='2'>No channels found.</td></tr>"; html += "<tr><td colspan='2'>No channels found.</td></tr>";
} }
$("#list").innerHTML = html; $("#list").innerHTML = html;
} }
$("form#listform").onsubmit = function(e) { $("form#listform").onsubmit = function(e) {
try { try {
var nickname = $("#nick").value; var nickname = $("#nick").value;
var channelName = getSelectedChannel(); var channelName = getSelectedChannel();
@ -79,9 +96,9 @@ $("form#listform").onsubmit = function(e) {
} }
return false; return false;
} }
$("form#createform").onsubmit = function(e) { $("form#createform").onsubmit = function(e) {
try { try {
var channelName = $("#customname").value; var channelName = $("#customname").value;
create(channelName, onCreateSuccess); create(channelName, onCreateSuccess);
@ -90,9 +107,9 @@ $("form#createform").onsubmit = function(e) {
} }
return false; return false;
} }
$("form#customjoinform").onsubmit = function(e) { $("form#customjoinform").onsubmit = function(e) {
try { try {
var nickname = $("#nick").value; var nickname = $("#nick").value;
var channelName = $("#customname").value; var channelName = $("#customname").value;
@ -102,24 +119,33 @@ $("form#customjoinform").onsubmit = function(e) {
} }
return false; return false;
} }
function onCreateSuccess(options) { function onCreateSuccess(options) {
$("#customname").value = options.channelName; window.location.hash = options.channelName;
$("#link").value = window.location.href + options.link;
show("#customjoinform");
startTimer(options.timeout); startTimer(options.timeout);
} }
function show(id) { function showCustomJoinForm() {
$("#customname").value = unescape(window.location.hash.substr(1));
$("#link").value = window.location.href;
show("#customjoinform");
}
function show(id) {
$("#createform").style.display = "none"; $("#createform").style.display = "none";
$("#listform").style.display = "none"; $("#listform").style.display = "none";
$("#customjoinform").style.display = "none"; $("#customjoinform").style.display = "none";
$("#game").style.display = "none";
if(id != "#customjoinform") {
history.pushState("", document.title, window.location.pathname);
}
$(id).style.display = "block"; $(id).style.display = "block";
} }
function quickstart() { function quickstart() {
refresh(function(list){ refresh(function(list){
var defaultChannelName = "Dungeon"; var defaultChannelName = "Dungeon";
var nickname = $("#nick").value; var nickname = $("#nick").value;
@ -136,9 +162,9 @@ function quickstart() {
join(nickname, defaultChannelName); join(nickname, defaultChannelName);
} }
}); });
} }
function startTimer(seconds) { function startTimer(seconds) {
var now = new Date(); var now = new Date();
var end = new Date(now.getTime() + seconds * 1000); var end = new Date(now.getTime() + seconds * 1000);
setInterval(function() { setInterval(function() {
@ -151,18 +177,18 @@ function startTimer(seconds) {
$("#timeout").innerHTML = " within " + formatDate(diff) + " minutes"; $("#timeout").innerHTML = " within " + formatDate(diff) + " minutes";
} }
}, 1000); }, 1000);
} }
function formatDate(date) { function formatDate(date) {
var minutes = date.getMinutes(); var minutes = date.getMinutes();
var seconds = date.getSeconds(); var seconds = date.getSeconds();
if(minutes < 10) minutes = "0" + minutes; if(minutes < 10) minutes = "0" + minutes;
if(seconds < 10) seconds = "0" + seconds; if(seconds < 10) seconds = "0" + seconds;
return minutes + ":" + seconds; return minutes + ":" + seconds;
} }
function channelExists(list, channelName) { function channelExists(list, channelName) {
for (var i = 0; i < list.length; i++) { for (var i = 0; i < list.length; i++) {
var channel = list[i]; var channel = list[i];
if(channel.name == channelName) { if(channel.name == channelName) {
@ -170,9 +196,9 @@ function channelExists(list, channelName) {
} }
} }
return false; return false;
} }
function validateForJoin(nickname, channelName) { function validateForJoin(nickname, channelName) {
if(!nickname || nickname.length < 3) { if(!nickname || nickname.length < 3) {
alert("Nickname too short") alert("Nickname too short")
return false; return false;
@ -182,9 +208,9 @@ function validateForJoin(nickname, channelName) {
return false; return false;
} }
return true; return true;
} }
function validateForCreate(channelName, maps) { function validateForCreate(channelName, maps) {
return true; return true;
if(maps.length < 1) { if(maps.length < 1) {
alert("Please choose at least one map.") alert("Please choose at least one map.")
@ -196,9 +222,9 @@ function validateForCreate(channelName, maps) {
return false; return false;
} }
return true; return true;
} }
function getSelectedMaps() { function getSelectedMaps() {
var maps = []; var maps = [];
var checkboxes = document.querySelectorAll("form#createform input[name=maps]"); var checkboxes = document.querySelectorAll("form#createform input[name=maps]");
for (var i = 0; i < checkboxes.length; i++) { for (var i = 0; i < checkboxes.length; i++) {
@ -208,9 +234,9 @@ function getSelectedMaps() {
} }
}; };
return maps; return maps;
} }
function getSelectedChannel() { function getSelectedChannel() {
var name = null; var name = null;
var radios = document.querySelectorAll("form#listform input[name=channel]"); var radios = document.querySelectorAll("form#listform input[name=channel]");
for (var i = 0; i < radios.length; i++) { for (var i = 0; i < radios.length; i++) {
@ -221,9 +247,9 @@ function getSelectedChannel() {
} }
}; };
return name return name
} }
function join(nickname, channelName) { function join(nickname, channelName) {
if(validateForJoin(nickname, channelName)) { if(validateForJoin(nickname, channelName)) {
localStorage["player"] = JSON.stringify({ localStorage["player"] = JSON.stringify({
@ -233,11 +259,14 @@ function join(nickname, channelName) {
name: channelName name: channelName
}); });
window.location.href = "/game.html"; //window.location.href = "/game.html";
$("#menu").style.display = "none";
$("#game").style.display = "block";
Chuck.run(channelName, nickname);
}
} }
}
function create(channelName, callback) { function create(channelName, callback) {
var maps = getSelectedMaps(); var maps = getSelectedMaps();
if(validateForCreate(channelName, maps)) { if(validateForCreate(channelName, maps)) {
@ -268,9 +297,13 @@ function create(channelName, callback) {
xhr.open("POST", "/api", true); xhr.open("POST", "/api", true);
xhr.send(JSON.stringify({command:"createChannel", options: options})); xhr.send(JSON.stringify({command:"createChannel", options: options}));
} }
} }
$("#refresh").onclick = refresh; $("#refresh").onclick = refresh;
refresh(); refresh();
setInterval(refresh, 5000); setInterval(refresh, 5000);
Chuck.menu = {
show: show
}
})(Chuck);