gridwar-classic/gridwar.js

312 lines
7.3 KiB
JavaScript
Raw Normal View History

2025-01-15 12:28:57 -05:00
import { initDb } from "./db.js";
import { getToken } from './account.js';
let dat = {};
let cooldown = {};
let lastTurn = '';
let users = {};
let initTile = async (x, y, username) => {
let db = await initDb();
let data = new Array(25);
let blockData = await db.all('SELECT * FROM block WHERE x = ? AND y = ?', [
x,
y
]);
let occupied = await db.all('SELECT * FROM tile WHERE username = ?', [
username
]);
let blockEntry = blockData[0];
if (!dat[`${x},${y}`]) {
dat[`${x},${y}`] = {};
}
dat[`${x},${y}`].type = blockEntry ? (blockEntry.status == 1 ? 'select' : 'claimed') : ''
if (username && blockEntry && blockEntry.status == 1 && (!occupied || occupied.length < 1)) {
for (let i = 0; i < 25; i++) {
data[i] = username;
}
let vals = [
[x + 1, y],
[x, y + 1],
[x - 1, y],
[x, y - 1]
];
await db.run('UPDATE block SET status = 0 WHERE x = ? AND y = ?', [
x,
y
]);
for (let thing of vals) {
await db.run('INSERT INTO block (status, x, y) VALUES (1,?,?)', [
thing[0],
thing[1]
]);
}
} else if (!blockEntry || blockEntry.status == 1) {
return false;
} else {
for (let i = 0; i < 25; i++) {
data[i] = data[i] || '!nobody';
}
}
let table = await db.all('SELECT * FROM tile WHERE x < ? AND y < ? AND x > ? AND y > ?', [
x * 5 + 5,
y * 5 + 5,
x * 5 - 1,
y * 5 - 1,
]);
for (let i in data) {
let x2 = i % 5 + x * 5;
let y2 = Math.floor(i / 5) + y * 5;
let tile = table.find(({ x, y }) => x == x2 && y == y2);
if (tile) {
data[i] = tile.username;
} else {
await db.run('DELETE FROM tile WHERE x = ? AND y = ?', [
x2,
y2
]);
await db.run('INSERT INTO tile (username, x, y) VALUES (?, ?, ?)', [
data[i],
x2,
y2
]);
}
}
dat[`${x},${y}`].data = data;
return dat;
}
(async () => {
let db = await initDb();
let blocks = await db.all('SELECT * FROM block');
for (let block of blocks) {
initTile(block.x, block.y);
}
let dataUser = await db.all('SELECT * FROM player');
for (let entry of dataUser) {
dat[`_user_${entry.username}`] = entry;
}
})();
let socketHandler = async (socket, io) => {
let user;
let db = await initDb();
socket.on('join', async ({ token }) => {
user = await getToken(token);
if (user == '!nobody') {
user = '';
socket.emit('data','noauth');
}
users[user] = true;
socket.emit('data', dat);
socket.emit('cooldown', cooldown[user]);
socket.emit('turn',lastTurn);
let dataUser = await db.all('SELECT * FROM player WHERE username = ?', [
user
]);
if (dataUser && dataUser.length > 0) {
dat[`_user_${user}`] = dataUser[0];
} else {
dat[`_user_${user}`] = {
'username': user,
'score': 0,
'out': 0,
'color': `hsl(${Math.random() * 360}deg,${Math.random() * 30 + 65}%,${Math.random() * 30 + 60}%)`
};
await db.run('INSERT INTO player (username, score, out, color) VALUES (?,?,?,?)', [
dat[`_user_${user}`].username,
dat[`_user_${user}`].score,
dat[`_user_${user}`].out,
dat[`_user_${user}`].color
]);
}
})
socket.on('color', async (color) => {
await db.run('UPDATE player SET color = ? WHERE username = ?', [
color,
user
]);
dat[`_user_${user}`].color = color;
socket.emit('data', dat);
})
socket.on('disconnect', () => {
delete users[user];
})
socket.on('claim', async ({ x, y }) => {
if (!user) return;
x = x * 1;
y = y * 1;
await initTile(x, y, user);
let blocks = await db.all('SELECT * FROM block');
for (let block of blocks) {
await initTile(block.x, block.y);
}
io.emit('data', dat);
})
socket.on('conquer', async ({ x, y }) => {
if (!user) return;
x = x * 1;
y = y * 1;
let x2 = Math.floor(x / 5);
let y2 = Math.floor(y / 5);
let x3 = x % 5;
let y3 = Math.floor(y / 5);
let key = `${x2},${y2}`
if (!dat[key]) return;
let vals = [
[x + 1, y],
[x, y + 1],
[x - 1, y],
[x, y - 1]
];
let canClaim = false;
for (let val of vals) {
let isClaimed = await db.all('SELECT * FROM tile WHERE x = ? AND y = ?', [
val[0],
val[1]
]);
console.log(isClaimed)
if (isClaimed && isClaimed.length > 0 && isClaimed[0].username == user) {
canClaim = true;
break;
}
}
if (!canClaim) return;
if (new Date() * 1 < cooldown[user] || lastTurn == user) return;
let userFactor = Math.min(Object.keys(users).length, 10);
userFactor = Math.max(userFactor, 1);
cooldown[user] = (60000 / userFactor) + (new Date() * 1);
lastTurn = user;
socket.emit('cooldown', cooldown[user]);
io.emit('turn',lastTurn);
let formerOwner = await db.all('SELECT * FROM tile WHERE x = ? AND y = ?', [
x,
y
]);
let formerOwnerStr = formerOwner[0].username;
formerOwner = formerOwner[0] ? `_user_${formerOwner[0].username}` : false;
await db.run('UPDATE tile SET username = ? WHERE x = ? AND y = ?', [
user,
x,
y
]);
dat[key].data[`${x3},${y3}`] = user;
await initTile(x2, y2);
io.emit('data', dat);
if (!dat[formerOwner]) {
dat[formerOwner] = {
'username': formerOwnerStr,
'score': 0,
'out': 0,
'color': `hsl(${Math.random() * 360}deg,${Math.random() * 30 + 65}%,${Math.random() * 30 + 60}%)`
};
await db.run('INSERT INTO player (username, score, out, color) VALUES (?,?,?,?)', [
dat[formerOwner].username,
dat[formerOwner].score,
dat[formerOwner].out,
dat[formerOwner].color
]);
}
let tCount = (await db.all('SELECT * FROM tile WHERE username = ?', [
formerOwnerStr
])).length;
if (tCount < 26) {
dat[formerOwner].score--;
} else {
dat[formerOwner].score--;
dat[`_user_${user}`].score++;
}
await db.run('UPDATE player SET score = ? WHERE username = ?', [
dat[`_user_${user}`].score,
user
]);
await db.run('UPDATE player SET score = ? WHERE username = ?', [
dat[formerOwner].score,
formerOwnerStr
]);
console.log(dat[`_user_${user}`].score,dat[formerOwner].score);
});
}
export {
socketHandler
};