diff --git a/client/src/App.js b/client/src/App.js
index 4c1507c..b15fdfe 100644
--- a/client/src/App.js
+++ b/client/src/App.js
@@ -9,8 +9,38 @@ const socket = io('http://localhost:7777');
var id = '';
var drawing_app = null;
-var game_info = document.getElementById('game_state_info');
-var pixi_wrapper = document.getElementById('pixi-wrapper');
+var did_vote = false;
+
+const game_info = document.getElementById('game_state_info');
+const pixi_wrapper = document.getElementById('pixi-wrapper');
+
+const join_room_btn = document.getElementById('join_room_btn');
+
+const room_code_input = document.getElementById('room_code');
+const username_input = document.getElementById('username');
+
+const game_room_code_label = document.getElementById('game_room_code');
+
+const game_setup_panel = document.getElementById('game_setup');
+const game_info_panel = document.getElementById('game_info');
+
+const copy_image_btn = document.getElementById('copy_image');
+const download_image_btn = document.getElementById('download_image');
+
+const current_player_count = document.getElementById('current_player_count');
+const player_list = document.getElementById('player_list');
+const pre_game_player_list = document.getElementById('pre_game_player_list');
+
+const ready_up_btn = document.getElementById('ready_up_btn');
+const create_room_btn = document.getElementById('create_room_btn');
+
+const game_leader_input = document.getElementById('game_leader_input');
+
+const game_hint = document.getElementById('game_hint');
+const game_topic = document.getElementById('game_topic');
+const submit_topic_btn = document.getElementById('submit_topic');
+
+const voting_player_list = document.getElementById('voting_player_list');
function setGameInfo(info) {
game_info.innerHTML = info;
@@ -24,87 +54,75 @@ socket.on('connect', () => {
console.log('\n*** Startup! ***');
});
-document.getElementById('join_room_btn').addEventListener('click', (e) => {
- var room_code = document.getElementById('room_code').value;
- var username = document.getElementById('username').value;
-
- socket.emit('join_room', room_code, username);
+join_room_btn.addEventListener('click', (e) => {
+ socket.emit('join_room', room_code_input.value, username_input.value);
});
-socket.on('room', (room_id) => {
+socket.on('join_room', (room_id) => {
// join the room
console.log(room_id);
- document.getElementById('game_room_code').innerHTML = room_id;
+ game_room_code_label.innerHTML = room_id;
- document.getElementById('game_setup').style.display = 'none';
- document.getElementById('game_info').style.display = 'initial';
+ game_setup_panel.style.display = 'none';
+ game_info_panel.style.display = 'initial';
- document.getElementById('copy_image').style.display = 'none';
- document.getElementById('download_image').style.display = 'none';
+ copy_image_btn.style.display = 'none';
+ download_image_btn.style.display = 'none';
});
socket.on('room_error', (error_msg) => {
alert(error_msg);
});
-document.getElementById('create_room_btn').addEventListener('click', (e) => {
+socket.on('topic_error', (error_msg) => {
+ alert(error_msg);
+});
+
+create_room_btn.addEventListener('click', (e) => {
// Tell the server we want a new room
- var username = document.getElementById('username').value;
- socket.emit('create_room', username);
+ socket.emit('create_room', username_input.value);
});
socket.on('player_data', (player_arr) => {
+ console.log('Playerdata!?');
var count = player_arr.length;
- document.getElementById('current_player_count').innerHTML = count;
-
- var player_list = document.getElementById('player_list');
+ current_player_count.innerHTML = count;
player_list.innerHTML = '';
player_arr.forEach((player) => {
- player_list.innerHTML += '
' + player.player_name + '';
+ player_list.innerHTML +=
+ `${player.player_name}`;
})
- document.getElementById('start_game_btn').disabled = (count < 2);
+ ready_up_btn.disabled = (count < 2);
});
-document.getElementById('start_game_btn').addEventListener('click', (e) => {
- socket.emit('start_game');
+ready_up_btn.addEventListener('click', (e) => {
+ socket.emit('ready');
});
socket.on('game_started', () => {
- // game_data.game_leader =
- console.log('yooo');
- document.getElementById('pre_game_player_list').style.display = 'none';
+ voting_player_list.innerHTML = "";
+ document.getElementById('pl_container').style.display = "none";
+ document.getElementById('copy_image').style.display = 'none';
+ document.getElementById('download_image').style.display = 'none';
+
+ pixi_wrapper.innerHTML = "";
+ drawing_app = null;
+
+ pre_game_player_list.style.display = 'none';
});
socket.on('leader_selected', (leader) => {
- console.log(leader);
- console.log(id);
setGameInfo(`Please wait while the leader ${
- leader.player_name} is selecting a hint to be painted`);
+ leader.player_name} is thinking of a topic to be painted`);
if (leader.id == id) {
setGameInfo(
'You are the game leader! Please choose a hint and a category that the hint fits in.');
- document.getElementById('game_leader_input').style.display = 'initial';
-
- const game_hint = document.getElementById('game_hint');
- const game_topic = document.getElementById('game_topic');
- const submit_topic_btn = document.getElementById('submit_topic');
-
- function updateSubmitButtonState() {
- submit_topic_btn.disabled =
- game_hint.value.length < 2 || game_topic.value.length < 2;
- }
-
- game_hint.addEventListener('input', (e) => {
- updateSubmitButtonState();
- });
-
- game_topic.addEventListener('input', (e) => {
- updateSubmitButtonState();
- });
-
+ game_leader_input.style.display = 'initial';
submit_topic_btn.addEventListener('click', (e) => {
socket.emit('topic_selected', game_topic.value, game_hint.value);
@@ -112,28 +130,118 @@ socket.on('leader_selected', (leader) => {
}
});
+function updateSubmitButtonState() {
+ submit_topic_btn.disabled =
+ game_hint.value.length < 2 || game_topic.value.length < 2;
+}
+
+game_hint.addEventListener('input', (e) => {
+ updateSubmitButtonState();
+});
+
+game_topic.addEventListener('input', (e) => {
+ updateSubmitButtonState();
+});
+
socket.on('topic_selected', (topic, hint) => {
console.log(topic, hint);
- document.getElementById('game_leader_input').style.display = 'none';
+ game_leader_input.style.display = 'none';
setGameInfo(`Hint: ${hint}
Topic: ${topic}`);
});
socket.on('game_finished', (leader, player_list) => {
- var pl = document.getElementById('endgame_player_list');
+ did_vote = false;
+ drawing_app.addBackgroundForDownload();
- pl.innerHTML = '';
+ document.getElementById('pl_container').style.display = 'flex';
+ document.getElementById('copy_image').style.display = 'initial';
+ document.getElementById('download_image').style.display = 'initial';
+ document.getElementById('current_user_text').style.display = 'none';
- player_list.forEach((player) => {
- if (player.id == leader.id) {
- pl.innerHTML += `${
- player.player_name} (Leader)`;
- } else {
- pl.innerHTML += `${
- player.player_name}`;
+ var idx = 1;
+
+ player_list.forEach((p) => {
+ var tr = voting_player_list.insertRow(-1);
+
+ var c1 = tr.insertCell(-1);
+ c1.innerHTML = `?`;
+
+ var c2 = tr.insertCell(-1);
+
+ // leader should not be able to vote
+ // spectators should not be able to vote
+ // basically, only show voting button if this players' id is in the list of
+ // voteable players
+ if (player_list.filter(e => e.id === id).length > 0) {
+ var vote_btn = document.createElement('input');
+ vote_btn.type = 'button';
+ vote_btn.value = 'vote';
+ vote_btn.classList.add('vote_btn');
+ vote_btn.addEventListener('click', () => {
+ console.log(p.id);
+ socket.emit('vote_for_player', p.id);
+
+ Array.from(document.getElementsByClassName('vote_btn'))
+ .forEach((element) => {
+ element.disabled = true;
+ element.style.display = 'none';
+ })
+ });
+ c2.appendChild(vote_btn);
}
- })
- pl.style.display = 'initial';
+ var c3 = tr.insertCell(-1);
+ c3.innerHTML = `${
+ p.player_name}`;
+
+ var c4 = tr.insertCell(-1);
+ c4.innerHTML = `${
+ idx}, ${idx + player_list.length}`;
+
+ var c5 = tr.insertCell(-1);
+ var chkbox = document.createElement('input');
+ chkbox.type = 'checkbox';
+ chkbox.disabled = true;
+ chkbox.id = `votestatus_${p.id}`;
+
+ c5.appendChild(chkbox);
+ // c5.innerHTML = ``;
+
+ idx++;
+ });
+
+ socket.on('show_vote_results', (votes) => {
+ votes.players_voted.forEach((pv) => {
+ var e = document.getElementById(`votestatus_${pv}`);
+ if (e) {
+ e.checked = true;
+ }
+
+ Object.entries(votes.player_votes).forEach(([k, v]) => {
+ var e = document.getElementById(`votecount_${k}`);
+ if (e) {
+ e.innerHTML = v;
+ }
+ });
+
+ var fake = document.getElementById(`playername_${votes.fake_artist.id}`);
+ if(fake) {
+ fake.innerHTML = `>>> ${votes.fake_artist.player_name} <<<`;
+ }
+ });
+
+ pre_game_player_list.style.display = "initial";
+ });
+
+ socket.on('update_votes', (votes) => {
+ // update player vote display
+ votes.players_voted.forEach((pv) => {
+ var e = document.getElementById(`votestatus_${pv}`);
+ if (e) {
+ e.checked = true;
+ }
+ });
+ });
var ink_bar = document.getElementById('myBar');
ink_bar.style.display = 'none';
@@ -186,32 +294,32 @@ socket.on('game_finished', (leader, player_list) => {
base64_image.then((str) => {
try {
- navigator.clipboard.write([
- new ClipboardItem({
- 'image/png': b64toBlob(str)
- })
- ]);
- } catch (error) {
+ navigator.clipboard.write(
+ [new ClipboardItem({'image/png': b64toBlob(str)})]);
+ } catch (error) {
console.error(error);
- }
+ }
});
});
});
socket.on('actually_start_game', (player_data) => {
// Get player with our id to get the correct color
+ document.getElementById('current_user_text').style.display = 'flex';
+ var ink_bar = document.getElementById('myBar');
+ ink_bar.style.display = 'initial';
drawing_app = new DrawingApp(pixi_wrapper, player_data);
window.drawing_app = drawing_app;
});
-socket.on('draw_data', (round_num, data) => {
- console.log('Draw Data: ', round_num);
- var cur_layer = drawing_app.layers[round_num];
+socket.on('draw_data', (turn_num, data) => {
+ console.log('Draw Data: ', turn_num);
+ var cur_layer = drawing_app.layers[turn_num];
cur_layer.drawPointLine(data[0], data[1], true);
});
-socket.on('advance_round', (round_num, current_player) => {
+socket.on('advance_turn', (turn_num, current_player) => {
var ink_bar = document.getElementById('myBar');
ink_bar.style.width = '100%';
@@ -226,7 +334,7 @@ socket.on('advance_round', (round_num, current_player) => {
ink_bar.style.backgroundColor = current_player.player_color;
ink_bar.style.visibility = 'visible';
- const cur_layer = drawing_app.layers[round_num];
+ const cur_layer = drawing_app.layers[turn_num];
cur_layer.enable();
@@ -235,14 +343,14 @@ socket.on('advance_round', (round_num, current_player) => {
ink_bar.style.width = ((1.0 - ink_pct) * 100) + '%';
- console.log(ink_pct);
+ console.log(ink_pct, old_pos, new_pos);
socket.emit('draw_data', [old_pos, new_pos]);
});
cur_layer.setFinishedPaintingCallback(() => {
cur_layer.disable();
- socket.emit('round_finished');
+ socket.emit('turn_finished');
});
/*player_data.forEach((p) => {
diff --git a/client/src/DrawingApp.js b/client/src/DrawingApp.js
index 05c04c9..7224c25 100644
--- a/client/src/DrawingApp.js
+++ b/client/src/DrawingApp.js
@@ -116,22 +116,22 @@ export class Layer {
y: oldPos.y - newPos.y,
};
const deltaLength = Math.sqrt(delta.x ** 2 + delta.y ** 2);
+ this.ink_used += deltaLength;
if (!force) {
- this.ink_used += deltaLength;
+ console.log("Force?");
this.live_paint_progress_cb(oldPos, newPos);
}
if (this.ink_used >= max_ink_per_layer) {
this.lifted = true;
this.drawingStarted = false;
- this.finished_painting_cb();
+ if(!force) {
+ this.finished_painting_cb();
+ }
return;
}
- // TODO: Pass socket.io to tell server?
- // Or save to array and just pass to server on round-end. Should be easier?
-
this.drawPoint(newPos.x, newPos.y);
if (deltaLength >= brush_size / 8) {
@@ -170,7 +170,6 @@ export class Layer {
export class DrawingApp {
constructor(dom_elem, player_data) {
- var self = this;
this.app = new PIXI.Application({
width: layer_width,
height: layer_height,
@@ -182,13 +181,6 @@ export class DrawingApp {
this.layers = [];
- const base_render_texture = PIXI.RenderTexture.create({width: 512, height: 512});
-
-
- /*this.layers.push(new Layer(
- this.app, base_render_texture, this.brushGenerator, "-1",
- "0xFFFFFF"));*/
-
for (var i = 0; i < player_data.length * 2; i++) {
const render_texture =
PIXI.RenderTexture.create({width: 512, height: 512});
@@ -205,5 +197,19 @@ export class DrawingApp {
return this.app;
}
+ addBackgroundForDownload() {
+ if(!this.hasBackgroundAlready) {
+ let rectangle = new PIXI.Graphics();
+ rectangle.lineStyle(0.5, 0x999999);
+ rectangle.beginFill(0xFFFFFF); // draw each row of rectangles in different color :)
+ rectangle.drawRect(0, 0, 512, 512);
+ rectangle.endFill();
+
+ this.app.stage.addChildAt(rectangle, 0);
+
+ this.hasBackgroundAlready = true;
+ }
+ }
+
lock_all_layers() {}
}
\ No newline at end of file
diff --git a/client/src/index.html b/client/src/index.html
index df7202d..6296381 100644
--- a/client/src/index.html
+++ b/client/src/index.html
@@ -25,6 +25,10 @@
color: #FFFFFF;
}
+ .room_input {
+ text-transform: uppercase;
+ }
+
li {
color: #FFFFFF;
}
@@ -40,6 +44,11 @@
justify-content: center;
}
+ .table-center {
+ height: 100%;
+ justify-content: center;
+ }
+
#game_leader_input {
display: none;
}
@@ -88,15 +97,59 @@
#pl_container {
background-color: white;
margin-bottom: 20px;
+ display: none;
}
label {
color: white;
}
- #copy_image {}
+ #copy_image {
+ display: none;
+ }
- #download_image {}
+ #download_image {
+ display: none;
+ }
+
+ #player_list {
+ list-style-type: none;
+ }
+
+ .player_ready_state {
+ width: 1.2vmax;
+ height: 1.2vmax;
+ }
+
+ #ready_up_btn {
+ color: black;
+ }
+
+ #ready_up_btn:disabled {
+ color: white;
+ }
+
+ .additional_info {
+ font-size: 1.5vmax;
+ color: white;
+ margin-top: 50px;
+ }
+
+ .additional_info>a:link {
+ color: red;
+ }
+
+ .additional_info>a:hover {
+ color: green;
+ }
+
+ .additional_info>a:active {
+ color: teal;
+ }
+
+ .additional_info>a:visited {
+ color: yellow;
+ }
@@ -111,7 +164,8 @@
@@ -128,7 +182,7 @@
+
+
+ Sourcecode available on
GitHub :)
+