diff options
| author | Aargh Rai <aargh.rai+git@gmail.com> | 2026-05-31 23:57:37 +0530 |
|---|---|---|
| committer | Aargh Rai <aargh.rai+git@gmail.com> | 2026-05-31 23:57:37 +0530 |
| commit | 97c2eacc290ef4ba298b6659ab8bba925203f125 (patch) | |
| tree | dd91ed1d3bf864ae22a03a19cfe296b0814ad8c2 | |
| parent | 1043870b3efb37179c71e0b21c7faf9179e641c1 (diff) | |
only valid moves here + piece captures
| -rw-r--r-- | assets/board.js | 105 | ||||
| -rw-r--r-- | src/server.c | 118 | ||||
| -rw-r--r-- | src/server/comms.c | 8 |
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; } |
