summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assets/board.js105
-rw-r--r--src/server.c118
-rw-r--r--src/server/comms.c8
3 files changed, 160 insertions, 71 deletions
diff --git a/assets/board.js b/assets/board.js
index db3c282..8c4fdfc 100644
--- a/assets/board.js
+++ b/assets/board.js
@@ -18,18 +18,18 @@ const bitboards = [
4755801206503243776n,
71776119061217280n,
];
-const WHITE_KING = 1;
-const WHITE_QUEEN = 2;
-const WHITE_ROOK = 3;
-const WHITE_BISHOP = 4;
-const WHITE_KNIGHT = 5;
-const WHITE_PAWN = 6;
-const BLACK_KING = 7;
-const BLACK_QUEEN = 8;
-const BLACK_ROOK = 9;
-const BLACK_BISHOP = 10;
-const BLACK_KNIGHT = 11;
-const BLACK_PAWN = 12;
+const WHITE_KING = 0;
+const WHITE_QUEEN = 1;
+const WHITE_ROOK = 2;
+const WHITE_BISHOP = 3;
+const WHITE_KNIGHT = 4;
+const WHITE_PAWN = 5;
+const BLACK_KING = 6;
+const BLACK_QUEEN = 7;
+const BLACK_ROOK = 8;
+const BLACK_BISHOP = 9;
+const BLACK_KNIGHT = 10;
+const BLACK_PAWN = 11;
let counting_bitboard = 0n;
function trackBitboard(i, selected, output) {
@@ -73,6 +73,7 @@ position.bitboards[BLACK_PAWN] = ${bitboards[11].toString()}ULL;
let validMoves = {};
let renderingMoves = [];
+let pickedUpFrom = -1;
function updateRenderingMoves() {
for (let i = 0; i < 64; i++) {
@@ -89,15 +90,63 @@ function handleTransmission(data) {
let from = parseInt(moveData.slice(0, 2));
let to = parseInt(moveData.slice(2));
- console.log(from, to);
-
if (validMoves[from] == undefined) validMoves[from] = []
validMoves[from].push(to);
}
}
+function calculateFen() {
+ let fen = ""
+ let empty = 0;
+ for (let i = 7; i >= 0; i--) {
+ for (let j = 0; j < 8; j++) {
+ const sqr = document.getElementById(`square-${8 * i + j}`).style.backgroundImage;
+ if (sqr.length == 0 || sqr.includes("none")) {
+ empty++;
+ continue;
+ }
+ if (empty != 0) {
+ fen += empty.toString();
+ }
+ empty = 0;
+ let p = sqr[22];
+ if (sqr[21] == "w") p = sqr[22].toUpperCase();
+ fen += p;
+ }
+ if (empty != 0) {
+ fen += empty.toString();
+ }
+ if (i == 0) continue;
+ empty = 0;
+ fen += "/";
+ }
+ return fen;
+}
+
+let turn = "w";
+let castling = "KQkq";
+let passant_square = "-";
+let halfmove = 0;
+let fullmove = 1;
+let socket;
+let old_fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
+function checkMoveMade(pieceMoved) {
+ let new_fen = calculateFen();
+ if (new_fen == old_fen.split(" ")[0]) return;
+ old_fen = new_fen;
+ halfmove++;
+ console.log(pieceMoved)
+ if (pieceMoved == WHITE_PAWN || pieceMoved == BLACK_PAWN) halfmove = 0;
+ if (turn == "b") fullmove++;
+ turn = turn == "w" ? "b" : "w";
+ old_fen = `${new_fen} ${turn} ${castling} ${passant_square} ${halfmove} ${fullmove}`;
+ validMoves = {};
+ console.log(old_fen);
+ socket.send(old_fen);
+}
+
window.onload = () => {
- const socket = new WebSocket("ws://localhost:3456");
+ socket = new WebSocket("ws://localhost:3456");
let data = [];
socket.onmessage = e => {
console.log(e);
@@ -107,7 +156,10 @@ window.onload = () => {
}
data.push(e.data);
}
- socket.onopen = () => socket.send("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1");
+ socket.onopen = () => {
+ console.log(old_fen);
+ socket.send(old_fen);
+ }
socket.onerror = e => {
console.log("error", e);
};
@@ -147,21 +199,30 @@ window.onload = () => {
}
const piece = checkForPiece(square, bitIndex, false);
- if (
- (hoveringPiece < 0 && piece == null) ||
- (hoveringPiece >= 0 && piece != null)
- ) return;
- if (hoveringPiece < 0) {
+ const sqr_id = parseInt(square.id.slice(7));
+ if (hoveringPiece == -1) {
+ if (piece == null) return;
if (validMoves[bitIndex]) renderingMoves = validMoves[bitIndex];
setHoverpiece(piece);
+ pickedUpFrom = sqr_id;
square.style.backgroundImage = `none`;
bitboards[piece] &= ~(1n << BigInt(bitIndex));
} else {
+ if (sqr_id != pickedUpFrom && !renderingMoves.includes(sqr_id)) return;
renderingMoves = [];
square.style.backgroundImage = `url(${assets[hoveringPiece]})`;
+ if (piece) bitboards[piece] &= ~(1n << BigInt(bitIndex));
bitboards[hoveringPiece] |= (1n << BigInt(bitIndex));
setHoverpiece(-1);
}
+ console.log(piece, hoveringPiece, square, renderingMoves);
+ // if (
+ // (hoveringPiece < 0 && piece == null) ||
+ // (hoveringPiece >= 0 && piece != null)
+ // ) return;
+ // if (hoveringPiece < 0) {
+ // } else {
+ // }
updateRenderingMoves();
};
board.appendChild(square);
@@ -178,9 +239,11 @@ window.onload = () => {
const mouse = document.getElementById("mouse");
function setHoverpiece(i) {
+ let oldHoveringPiece = hoveringPiece;
hoveringPiece = i;
if (i < 0) {
mouse.style.backgroundImage = `none`;
+ checkMoveMade(oldHoveringPiece);
return;
}
mouse.style.backgroundImage = `url(${assets[i]})`;
diff --git a/src/server.c b/src/server.c
index ea18a68..1886712 100644
--- a/src/server.c
+++ b/src/server.c
@@ -18,10 +18,13 @@
#include "server/comms.c"
#include "ipc.c"
+mqd_t logging, tx, rx;
+int handle_client(int client);
+
int main(void) {
- mqd_t logging = mq_open("/logs", O_WRONLY);
- mqd_t tx = mq_open("/server_to_engine", O_WRONLY);
- mqd_t rx = mq_open("/engine_to_server", O_RDONLY);
+ logging = mq_open("/logs", O_WRONLY);
+ tx = mq_open("/server_to_engine", O_WRONLY);
+ rx = mq_open("/engine_to_server", O_RDONLY);
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
int opt = 1;
@@ -45,7 +48,7 @@ int main(void) {
log_infof("Listening on %d", PORT);
- for (;;) {
+ while(1) {
int client = accept(server_fd, NULL, NULL);
if (client < 0) continue;
@@ -84,58 +87,81 @@ int main(void) {
);
send(client, response, strlen(response), 0);
- log_infof("WebSocket connected");
+ if (fork() == 0) {
+ log_infof("{%d} WebSocket connected", client);
+ while(1) {
+ if (handle_client(client)) continue;
+ else break;
+ }
+ log_infof("{%d} WebSocket disconnected", client);
+ close(client);
+ }
+ }
+}
- for (;;) {
- unsigned char hdr[2];
+int handle_client(int client) {
+ unsigned char hdr[2];
- if (recv(client, hdr, 2, MSG_WAITALL) != 2)
- break;
+ if (recv(client, hdr, 2, MSG_WAITALL) != 2) {
+ log_warnf("{%d} recv close", client)
+ return 0;
+ }
- unsigned opcode = hdr[0] & 0x0F;
- unsigned len = hdr[1] & 0x7F;
- if (opcode == 0x8) {
- unsigned char close_frame[2] = {0x88, 0x00};
- send(client, close_frame, 2, 0);
- break;
- }
+ unsigned opcode = hdr[0] & 0x0F;
+ unsigned len = hdr[1] & 0x7F;
+ log_infof(
+ "{%d} opcode=%u len=%u masked=%u",
+ client,
+ opcode,
+ hdr[1] & 0x7F,
+ !!(hdr[1] & 0x80)
+ );
+ if (opcode == 0x8) {
+ unsigned char close_frame[2] = {0x88, 0x00};
+ send(client, close_frame, 2, 0);
+ log_warnf("{%d} opcode 0x8 close", client);
+ return 0;
+ }
- if (opcode == 0x9) {
- unsigned char pong[2] = {0x8A, 0x00};
- send(client, pong, 2, 0);
- continue;
- }
- if (len >= 126) break;
+ if (opcode == 0x9) {
+ unsigned char pong[2] = {0x8A, 0x00};
+ send(client, pong, 2, 0);
+ return 1;
+ }
- unsigned char mask[4];
- recv(client, mask, 4, MSG_WAITALL);
+ if (len >= 126) {
+ log_infof("{%d} unsupported length %u", client, len);
+ return 0;
+ }
- unsigned char payload[126];
- recv(client, payload, len, MSG_WAITALL);
+ unsigned char mask[4];
+ recv(client, mask, 4, MSG_WAITALL);
- for (unsigned i = 0; i < len; i++)
- payload[i] ^= mask[i % 4];
+ unsigned char payload[126];
+ recv(client, payload, len, MSG_WAITALL);
- char* payload_ptr = (char*)payload;
- struct strs response = handle_input(logging, tx, rx, payload_ptr, len);
+ for (unsigned i = 0; i < len; i++)
+ payload[i] ^= mask[i % 4];
- unsigned char out[128];
- out[0] = 0x81;
- for (int i = 0; i < response.count; i++) {
- struct str item = response.data[i];
- out[1] = item.len;
- assert(item.len <= 125);
+ payload[len] = 0;
+ char* payload_ptr = (char*)payload;
+ struct strs response = handle_input(logging, tx, rx, payload_ptr, len);
- memcpy(out + 2, item.msg, item.len);
- send(client, out, item.len + 2, 0);
- }
- char end_transmission[] = "END-TRANSMISSION";
- int n = strlen(end_transmission);
- out[1] = n;
+ unsigned char out[1024];
+ out[0] = 0x81;
+ for (int i = 0; i < response.count; i++) {
+ struct str item = response.data[i];
+ out[1] = item.len;
+ assert(item.len <= 1022);
- memcpy(out + 2, end_transmission, n);
- send(client, out, n + 2, 0);
- }
- close(client);
+ memcpy(out + 2, item.msg, item.len);
+ send(client, out, item.len + 2, 0);
}
+ char end_transmission[] = "END-TRANSMISSION";
+ int n = strlen(end_transmission);
+ out[1] = n;
+
+ memcpy(out + 2, end_transmission, n);
+ send(client, out, n + 2, 0);
+ return 1;
}
diff --git a/src/server/comms.c b/src/server/comms.c
index 9dd83b9..cc5a0ce 100644
--- a/src/server/comms.c
+++ b/src/server/comms.c
@@ -4,14 +4,14 @@
#include "../logger/logger.h"
struct str {
- char msg[126];
+ char msg[1023];
int len;
};
void set_output(struct str* output, char* msg) {
int i = 0;
while (msg[i] != 0) {
- assert(i < 126);
+ assert(i < 1023);
output->msg[i] = msg[i];
i++;
}
@@ -45,7 +45,8 @@ void add_str(struct strs* strs, char* str) {
}
struct strs handle_input(mqd_t logging, mqd_t tx, mqd_t rx, char* payload, int len) {
- send_queue(tx, payload, len);
+ log_infof("after: %d", payload[len]);
+ send_queue(tx, payload, len + 1);
char* buf = read_queue(rx);
struct strs output = init_strs();
@@ -62,6 +63,5 @@ struct strs handle_input(mqd_t logging, mqd_t tx, mqd_t rx, char* payload, int l
n--;
if (n == 0) n = get_num_messages(rx);
}
- log_infof("Handled the request");
return output;
}