Commit 2cc5435c authored by Vũ Gia Vương's avatar Vũ Gia Vương

update try catch, get user by userId

parent 0ab5c370
...@@ -25,36 +25,47 @@ let matchId = ''; ...@@ -25,36 +25,47 @@ let matchId = '';
let eventId = null; let eventId = null;
function startGameApi(data) { function startGameApi(data) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
timeStart = new Date().getTime(); try {
userId = (Math.random() * 100 >> 0) + 10; timeStart = new Date().getTime();
matchId = `${userId}-${GAME_CODE}-${timeStart}`; userId = (Math.random() * 100 >> 0) + 10;
data = { matchId = `${userId}-${GAME_CODE}-${timeStart}`;
matchId, data = {
gameCode: GAME_CODE, matchId,
}; gameCode: GAME_CODE,
const result = yield callApi(URL_START_GAME, 'POST', data); };
return result; const result = yield callApi(URL_START_GAME, 'POST', data);
return result;
}
catch (error) {
console.log('error', error);
}
}); });
} }
function endGameApi(user) { function endGameApi(user) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const playedSeconds = (new Date().getTime() - timeStart) / 1e3; try {
const details = user.history.map(h => ({ const playedSeconds = (new Date().getTime() - timeStart) / 1e3;
level: h.tower, const details = user.history.map(h => ({
score: h.score, level: h.tower,
timeStart: h.timeStart, score: h.score,
timePlayed: h.timePlayed / 1e3, timeStart: h.timeStart,
})); timePlayed: h.timePlayed / 1e3,
const params = { }));
matchId, const params = {
gameCode: GAME_CODE, matchId,
eventId, gameCode: GAME_CODE,
playedSeconds, eventId,
score: user.totalScore, playedSeconds,
gameLevel: user.towerNumber - 1, score: user.totalScore,
details gameLevel: user.towerNumber - 1,
}; details
const res = yield callApi(URL_END_GAME, 'POST', params); };
const res = yield callApi(URL_END_GAME, 'POST', params);
return res;
}
catch (error) {
console.log('error', error);
}
}); });
} }
function callApi(url, method, data) { function callApi(url, method, data) {
...@@ -69,11 +80,10 @@ function callApi(url, method, data) { ...@@ -69,11 +80,10 @@ function callApi(url, method, data) {
body: JSON.stringify(data), body: JSON.stringify(data),
}); });
const result = yield res.json(); const result = yield res.json();
console.log(url, result.code, result.message);
return (result === null || result === void 0 ? void 0 : result.code) == 'success'; return (result === null || result === void 0 ? void 0 : result.code) == 'success';
} }
catch (error) { catch (error) {
console.log('error call api: ', error); console.log('error callApi: ', error);
} }
}); });
} }
...@@ -5,7 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) { ...@@ -5,7 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const v2_1 = __importDefault(require("./v2")); const v2_1 = __importDefault(require("./v2"));
class User { class User {
constructor(token) { constructor(token, id) {
this.id = '';
this.token = ''; this.token = '';
this.towerNumber = 0; this.towerNumber = 0;
this.direction = 1; this.direction = 1;
...@@ -21,6 +22,7 @@ class User { ...@@ -21,6 +22,7 @@ class User {
this.isEndGame = true; this.isEndGame = true;
this.history = []; this.history = [];
this.token = token; this.token = token;
this.id = id;
this.reset(); this.reset();
} }
reset() { reset() {
......
...@@ -21,3 +21,9 @@ const io = new socket_io_1.Server(server, { ...@@ -21,3 +21,9 @@ const io = new socket_io_1.Server(server, {
server.listen(PORT, () => { server.listen(PORT, () => {
console.log(`Server is running on port ${PORT}!`); console.log(`Server is running on port ${PORT}!`);
}); });
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err);
});
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
});
...@@ -34,33 +34,44 @@ const CONFIG = { ...@@ -34,33 +34,44 @@ const CONFIG = {
} }
}; };
function setupSocket(io) { function setupSocket(io) {
io.use((socket, next) => { try {
const token = String(socket.handshake.query.token); io.use((socket, next) => {
if (!token) { const token = String(socket.handshake.query.token);
return; const userId = String(socket.handshake.query.userId);
} if (!token || !userId) {
if (!users.has(token)) { return;
users.set(token, new User_1.default(token)); }
} if (!users.has(userId)) {
next(); users.set(userId, new User_1.default(token, userId));
}); }
io.on("connection", (socket) => { next();
console.log(`🟢 Client connected: ${socket.id}`); });
socket.on(CONFIG.EVT.START_GAME, (data) => startGame(socket, data)); io.on("connection", (socket) => {
socket.on(CONFIG.EVT.PASS_TOWER, (data) => __awaiter(this, void 0, void 0, function* () { return yield passTower(socket, data); })); console.log(`🟢 Client connected: ${socket.id}`);
socket.on(CONFIG.EVT.HISTORY, () => __awaiter(this, void 0, void 0, function* () { return getHistory(socket); })); socket.on(CONFIG.EVT.START_GAME, (data) => startGame(socket, data));
socket.on(CONFIG.EVT.END_GAME, () => endGame(socket)); socket.on(CONFIG.EVT.PASS_TOWER, (data) => __awaiter(this, void 0, void 0, function* () { return yield passTower(socket, data); }));
socket.on("disconnect", () => onDisconnect(socket)); socket.on(CONFIG.EVT.HISTORY, () => __awaiter(this, void 0, void 0, function* () { return getHistory(socket); }));
}); socket.on(CONFIG.EVT.END_GAME, () => endGame(socket));
socket.on("disconnect", () => onDisconnect(socket));
});
}
catch (error) {
console.log('error', error);
}
} }
function endGame(socket) { function endGame(socket) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const user = getUserBySocket(socket); try {
user.reset(); const user = getUserBySocket(socket);
if (user === null || user === void 0 ? void 0 : user.isEndGame) { user.reset();
return; if (user === null || user === void 0 ? void 0 : user.isEndGame) {
return;
}
(0, networkCtrl_1.endGameApi)(user);
}
catch (error) {
console.log('error', error);
} }
(0, networkCtrl_1.endGameApi)(user);
}); });
} }
function onDisconnect(socket) { function onDisconnect(socket) {
...@@ -75,113 +86,128 @@ function getHistory(socket) { ...@@ -75,113 +86,128 @@ function getHistory(socket) {
} }
function startGame(socket, data) { function startGame(socket, data) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const user = getUserBySocket(socket); try {
const result = yield (0, networkCtrl_1.startGameApi)(data); const user = getUserBySocket(socket);
// const result = true; const result = yield (0, networkCtrl_1.startGameApi)(data);
if (result) { // const result = true;
socket.emit(CONFIG.EVT.REQUEST_START_GAME, true); if (result) {
user.isEndGame = false; socket.emit(CONFIG.EVT.REQUEST_START_GAME, true);
addBlock(socket); user.isEndGame = false;
addBlock(socket);
}
else {
console.log('start game fail');
socket.emit(CONFIG.EVT.REQUEST_START_GAME, false);
}
} }
else { catch (error) {
console.log('start game fail'); console.log('error', error);
socket.emit(CONFIG.EVT.REQUEST_START_GAME, false);
} }
}); });
} }
function passTower(socket, data) { function passTower(socket, data) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const user = getUserBySocket(socket); try {
const xDistance_ = data.distance; const user = getUserBySocket(socket);
const { direction, nextBlock, towerNumber, position } = user; const xDistance_ = data.distance;
const point = new v2_1.default(xDistance_ * direction, xDistance_ * Y_RADIO); const { direction, nextBlock, towerNumber, position } = user;
const nextTowerPos = nextBlock; const point = new v2_1.default(xDistance_ * direction, xDistance_ * Y_RADIO);
const distancePlayer2NextTower = nextTowerPos.clone().sub(position).mag(); const nextTowerPos = nextBlock;
const minDistance = Math.abs(xDistance_ - distancePlayer2NextTower); const distancePlayer2NextTower = nextTowerPos.clone().sub(position).mag();
const isHead = distancePlayer2NextTower > xDistance_; const minDistance = Math.abs(xDistance_ - distancePlayer2NextTower);
let score = -1; const isHead = distancePlayer2NextTower > xDistance_;
const pointEdge = new v2_1.default(HALF_SIZE_TOWER * direction, HALF_SIZE_TOWER * Y_RADIO); let score = -1;
let target = position.clone().add(point); const pointEdge = new v2_1.default(HALF_SIZE_TOWER * direction, HALF_SIZE_TOWER * Y_RADIO);
if (minDistance < HALF_SIZE_TOWER * 1.5) { let target = position.clone().add(point);
target = nextTowerPos.clone().sub(isHead ? pointEdge : pointEdge.clone().mul(-1)); if (minDistance < HALF_SIZE_TOWER * 1.5) {
score = 0; target = nextTowerPos.clone().sub(isHead ? pointEdge : pointEdge.clone().mul(-1));
} score = 0;
if (minDistance < HALF_SIZE_TOWER * 0.8) { }
target = nextTowerPos.clone().sub(pointEdge.clone().mul(0.5)); if (minDistance < HALF_SIZE_TOWER * 0.8) {
score = 1; target = nextTowerPos.clone().sub(pointEdge.clone().mul(0.5));
} score = 1;
if (minDistance < HALF_SIZE_TOWER * 0.3) { }
target = nextTowerPos.clone(); if (minDistance < HALF_SIZE_TOWER * 0.3) {
score = 2; target = nextTowerPos.clone();
} score = 2;
// target = nextTowerPos.clone(); }
// score = 2; // target = nextTowerPos.clone();
const heightJump = user.distance2Tower * 0.7; // score = 2;
if (score <= 0) { const heightJump = user.distance2Tower * 0.7;
user.isEndGame = true; if (score <= 0) {
} user.isEndGame = true;
if (score == 2) { }
user.combo = Math.min(user.combo + 1, 2); if (score == 2) {
score *= user.combo; user.combo = Math.min(user.combo + 1, 2);
score *= user.combo;
}
else {
user.combo = 0;
}
user.totalScore += score;
const dataSocket = {
target,
score,
isHead,
heightJump,
totalScore: user.totalScore,
};
const history = {
totalScore: user.totalScore,
tower: towerNumber,
score: Math.max(score, 0),
timeStart: user.timeStart,
timePlayed: Date.now() - user.timeStart,
};
user.history.unshift(history);
user.position = target;
socket.emit(CONFIG.EVT.REQUEST_PASS_TOWER, dataSocket);
if (score > 0) {
addBlock(socket);
}
else {
socket.emit(CONFIG.EVT.REQUEST_HISTORY, user.history);
yield (0, networkCtrl_1.endGameApi)(user);
user.reset();
console.log('END');
}
} }
else { catch (error) {
user.combo = 0; console.log('error', error);
}
user.totalScore += score;
const dataSocket = {
target,
score,
isHead,
heightJump,
totalScore: user.totalScore,
};
const history = {
totalScore: user.totalScore,
tower: towerNumber,
score: Math.max(score, 0),
timeStart: user.timeStart,
timePlayed: Date.now() - user.timeStart,
};
user.history.unshift(history);
user.position = target;
socket.emit(CONFIG.EVT.REQUEST_PASS_TOWER, dataSocket);
if (score > 0) {
addBlock(socket);
}
else {
socket.emit(CONFIG.EVT.REQUEST_HISTORY, user.history);
yield (0, networkCtrl_1.endGameApi)(user);
user.reset();
console.log('END');
} }
}); });
} }
function addBlock(socket) { function addBlock(socket) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const user = getUserBySocket(socket); try {
const towerNumber = ++user.towerNumber; const user = getUserBySocket(socket);
const xDistance = ((Math.min(towerNumber, 100) / 100 + 1) + Math.random() * (towerNumber <= 10 ? 0.5 : 1)) * 150; const towerNumber = ++user.towerNumber;
const yDistance = xDistance * Y_RADIO; const xDistance = ((Math.min(towerNumber, 100) / 100 + 1) + Math.random() * (towerNumber <= 10 ? 0.5 : 1)) * 150;
user.curBlock = new v2_1.default(user.nextBlock.x, user.nextBlock.y); const yDistance = xDistance * Y_RADIO;
if (towerNumber > 1) { user.curBlock = new v2_1.default(user.nextBlock.x, user.nextBlock.y);
user.direction = (Math.random() < 0.5) ? -1 : 1; if (towerNumber > 1) {
user.direction = (Math.random() < 0.5) ? -1 : 1;
}
user.nextBlock.x = user.curBlock.x + (xDistance * user.direction);
user.nextBlock.y = user.curBlock.y + yDistance;
user.distance2Tower = user.nextBlock.distanceTo(user.curBlock);
user.screenPos = user.nextBlock.add(user.curBlock).mul(0.5).sub(new v2_1.default(0, 100));
const data = {
nextBlock: user.nextBlock,
screenPos: user.screenPos,
direction: user.direction,
distance2Tower: user.distance2Tower,
towerNumber: user.towerNumber,
};
user.timeStart = Date.now();
socket.emit(CONFIG.EVT.REQUEST_SPAWN_TOWER, data);
}
catch (error) {
console.log('error', error);
} }
user.nextBlock.x = user.curBlock.x + (xDistance * user.direction);
user.nextBlock.y = user.curBlock.y + yDistance;
user.distance2Tower = user.nextBlock.distanceTo(user.curBlock);
user.screenPos = user.nextBlock.add(user.curBlock).mul(0.5).sub(new v2_1.default(0, 100));
const data = {
nextBlock: user.nextBlock,
screenPos: user.screenPos,
direction: user.direction,
distance2Tower: user.distance2Tower,
towerNumber: user.towerNumber,
};
user.timeStart = Date.now();
socket.emit(CONFIG.EVT.REQUEST_SPAWN_TOWER, data);
}); });
} }
function getUserBySocket(socket) { function getUserBySocket(socket) {
const token = String(socket.handshake.query.token); const userId = String(socket.handshake.query.userId);
return users.get(token); return users.get(userId);
} }
...@@ -15,38 +15,47 @@ let matchId = ''; ...@@ -15,38 +15,47 @@ let matchId = '';
let eventId: string | null = null; let eventId: string | null = null;
export async function startGameApi(data: any) { export async function startGameApi(data: any) {
timeStart = new Date().getTime(); try {
userId = (Math.random() * 100 >> 0) + 10; timeStart = new Date().getTime();
matchId = `${userId}-${GAME_CODE}-${timeStart}`; userId = (Math.random() * 100 >> 0) + 10;
matchId = `${userId}-${GAME_CODE}-${timeStart}`;
data = { data = {
matchId, matchId,
gameCode: GAME_CODE, gameCode: GAME_CODE,
}; };
const result = await callApi(URL_START_GAME, 'POST', data); const result = await callApi(URL_START_GAME, 'POST', data);
return result; return result;
} catch (error) {
console.log('error', error)
}
} }
export async function endGameApi(user: User) { export async function endGameApi(user: User) {
const playedSeconds = (new Date().getTime() - timeStart) / 1e3; try {
const details = user.history.map(h=>({ const playedSeconds = (new Date().getTime() - timeStart) / 1e3;
const details = user.history.map(h => ({
level: h.tower, level: h.tower,
score: h.score, score: h.score,
timeStart: h.timeStart, timeStart: h.timeStart,
timePlayed: h.timePlayed / 1e3, timePlayed: h.timePlayed / 1e3,
})); }));
const params = { const params = {
matchId, matchId,
gameCode: GAME_CODE, gameCode: GAME_CODE,
eventId, eventId,
playedSeconds, playedSeconds,
score: user.totalScore, score: user.totalScore,
gameLevel: user.towerNumber - 1, gameLevel: user.towerNumber - 1,
details details
} }
const res = await callApi(URL_END_GAME, 'POST', params); const res = await callApi(URL_END_GAME, 'POST', params);
return res;
} catch (error) {
console.log('error', error)
}
} }
async function callApi(url: string, method: string, data: any) { async function callApi(url: string, method: string, data: any) {
...@@ -60,10 +69,9 @@ async function callApi(url: string, method: string, data: any) { ...@@ -60,10 +69,9 @@ async function callApi(url: string, method: string, data: any) {
body: JSON.stringify(data), body: JSON.stringify(data),
}); });
const result = await res.json(); const result = await res.json();
console.log(url, result.code, result.message);
return result?.code == 'success'; return result?.code == 'success';
} catch (error) { } catch (error) {
console.log('error call api: ', error); console.log('error callApi: ', error);
} }
} }
import v2 from "./v2"; import v2 from "./v2";
class User { class User {
public id: string = '';
public token: string = ''; public token: string = '';
public towerNumber: number = 0; public towerNumber: number = 0;
public direction: number = 1; public direction: number = 1;
...@@ -10,17 +11,18 @@ class User { ...@@ -10,17 +11,18 @@ class User {
public totalScore: number = 0; public totalScore: number = 0;
public combo: number = 0; public combo: number = 0;
public curBlock: v2 = new v2(0,0); public curBlock: v2 = new v2(0, 0);
public nextBlock: v2 = new v2(0,0); public nextBlock: v2 = new v2(0, 0);
public screenPos: v2 = new v2(0,0); public screenPos: v2 = new v2(0, 0);
public position: v2 = new v2(0,0); public position: v2 = new v2(0, 0);
public timeStart: number = 0; public timeStart: number = 0;
public isEndGame: boolean = true; public isEndGame: boolean = true;
public history: History[] = []; public history: History[] = [];
constructor(token: string) { constructor(token: string, id: string) {
this.token = token; this.token = token;
this.id = id;
this.reset(); this.reset();
} }
...@@ -61,14 +63,6 @@ export interface IDataPassTower { ...@@ -61,14 +63,6 @@ export interface IDataPassTower {
totalScore: number, totalScore: number,
} }
// {
// nextBlock: user.nextBlock,
// screenPos: user.screenPos,
// direction: user.direction,
// distance2Tower: user.distance2Tower,
// towerNumber: user.towerNumber - 1,
// };
export interface IDataSpawnTower { export interface IDataSpawnTower {
nextBlock: v2, nextBlock: v2,
screenPos: v2, screenPos: v2,
...@@ -77,4 +71,9 @@ export interface IDataSpawnTower { ...@@ -77,4 +71,9 @@ export interface IDataSpawnTower {
towerNumber: number, towerNumber: number,
} }
export interface IQuery {
token?: string,
userId?: string
}
export default User; export default User;
\ No newline at end of file
...@@ -20,4 +20,12 @@ setupSocket(io); ...@@ -20,4 +20,12 @@ setupSocket(io);
server.listen(PORT, () => { server.listen(PORT, () => {
console.log(`Server is running on port ${PORT}!`); console.log(`Server is running on port ${PORT}!`);
}) });
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err);
});
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
});
...@@ -22,38 +22,47 @@ const CONFIG = { ...@@ -22,38 +22,47 @@ const CONFIG = {
}; };
export function setupSocket(io: Server) { export function setupSocket(io: Server) {
io.use((socket: Socket, next) => { try {
const token = String(socket.handshake.query.token); io.use((socket: Socket, next) => {
if (!token) { const token = String(socket.handshake.query.token);
return; const userId = String(socket.handshake.query.userId);
} if (!token || !userId) {
if (!users.has(token)) { return;
users.set(token, new User(token)); }
} if (!users.has(userId)) {
next(); users.set(userId, new User(token, userId));
}); }
next();
io.on("connection", (socket: Socket) => { });
console.log(`🟢 Client connected: ${socket.id}`);
io.on("connection", (socket: Socket) => {
socket.on(CONFIG.EVT.START_GAME, (data: string) => startGame(socket, data)); console.log(`🟢 Client connected: ${socket.id}`);
socket.on(CONFIG.EVT.PASS_TOWER, async (data: { playerPos: v2, time: number, distance: number }) => await passTower(socket, data));
socket.on(CONFIG.EVT.HISTORY, async () => getHistory(socket)); socket.on(CONFIG.EVT.START_GAME, (data: string) => startGame(socket, data));
socket.on(CONFIG.EVT.PASS_TOWER, async (data: { playerPos: v2, time: number, distance: number }) => await passTower(socket, data));
socket.on(CONFIG.EVT.END_GAME, () => endGame(socket)); socket.on(CONFIG.EVT.HISTORY, async () => getHistory(socket));
socket.on("disconnect", () => onDisconnect(socket)); socket.on(CONFIG.EVT.END_GAME, () => endGame(socket));
});
socket.on("disconnect", () => onDisconnect(socket));
});
} catch (error) {
console.log('error', error)
}
} }
async function endGame(socket: Socket) { async function endGame(socket: Socket) {
const user = getUserBySocket(socket); try {
user.reset(); const user = getUserBySocket(socket);
user.reset();
if (user?.isEndGame) { if (user?.isEndGame) {
return; return;
}
endGameApi(user);
} catch (error) {
console.log('error', error)
} }
endGameApi(user);
} }
function onDisconnect(socket: Socket): void { function onDisconnect(socket: Socket): void {
...@@ -67,126 +76,138 @@ async function getHistory(socket: Socket) { ...@@ -67,126 +76,138 @@ async function getHistory(socket: Socket) {
} }
async function startGame(socket: Socket, data: any) { async function startGame(socket: Socket, data: any) {
const user = getUserBySocket(socket); try {
const result = await startGameApi(data); const user = getUserBySocket(socket);
// const result = true; const result = await startGameApi(data);
if (result) { // const result = true;
socket.emit(CONFIG.EVT.REQUEST_START_GAME, true); if (result) {
user.isEndGame = false; socket.emit(CONFIG.EVT.REQUEST_START_GAME, true);
addBlock(socket); user.isEndGame = false;
} else { addBlock(socket);
console.log('start game fail'); } else {
socket.emit(CONFIG.EVT.REQUEST_START_GAME, false); console.log('start game fail');
socket.emit(CONFIG.EVT.REQUEST_START_GAME, false);
}
} catch (error) {
console.log('error', error)
} }
} }
async function passTower(socket: Socket, data: { distance: number }) { async function passTower(socket: Socket, data: { distance: number }) {
const user = getUserBySocket(socket); try {
const user = getUserBySocket(socket);
const xDistance_ = data.distance; const xDistance_ = data.distance;
const { direction, nextBlock, towerNumber, position } = user; const { direction, nextBlock, towerNumber, position } = user;
const point = new v2(xDistance_ * direction, xDistance_ * Y_RADIO); const point = new v2(xDistance_ * direction, xDistance_ * Y_RADIO);
const nextTowerPos = nextBlock; const nextTowerPos = nextBlock;
const distancePlayer2NextTower = nextTowerPos.clone().sub(position).mag(); const distancePlayer2NextTower = nextTowerPos.clone().sub(position).mag();
const minDistance = Math.abs(xDistance_ - distancePlayer2NextTower); const minDistance = Math.abs(xDistance_ - distancePlayer2NextTower);
const isHead = distancePlayer2NextTower > xDistance_; const isHead = distancePlayer2NextTower > xDistance_;
let score = -1; let score = -1;
const pointEdge = new v2(HALF_SIZE_TOWER * direction, HALF_SIZE_TOWER * Y_RADIO); const pointEdge = new v2(HALF_SIZE_TOWER * direction, HALF_SIZE_TOWER * Y_RADIO);
let target = position.clone().add(point); let target = position.clone().add(point);
if (minDistance < HALF_SIZE_TOWER * 1.5) { if (minDistance < HALF_SIZE_TOWER * 1.5) {
target = nextTowerPos.clone().sub(isHead ? pointEdge : pointEdge.clone().mul(-1)); target = nextTowerPos.clone().sub(isHead ? pointEdge : pointEdge.clone().mul(-1));
score = 0; score = 0;
} }
if (minDistance < HALF_SIZE_TOWER * 0.8) { if (minDistance < HALF_SIZE_TOWER * 0.8) {
target = nextTowerPos.clone().sub(pointEdge.clone().mul(0.5)); target = nextTowerPos.clone().sub(pointEdge.clone().mul(0.5));
score = 1; score = 1;
} }
if (minDistance < HALF_SIZE_TOWER * 0.3) { if (minDistance < HALF_SIZE_TOWER * 0.3) {
target = nextTowerPos.clone(); target = nextTowerPos.clone();
score = 2; score = 2;
} }
// target = nextTowerPos.clone(); // target = nextTowerPos.clone();
// score = 2; // score = 2;
const heightJump = user.distance2Tower * 0.7; const heightJump = user.distance2Tower * 0.7;
if (score <= 0) { if (score <= 0) {
user.isEndGame = true; user.isEndGame = true;
} }
if (score == 2) { if (score == 2) {
user.combo = Math.min(user.combo + 1, 2); user.combo = Math.min(user.combo + 1, 2);
score *= user.combo; score *= user.combo;
} else { } else {
user.combo = 0; user.combo = 0;
} }
user.totalScore += score; user.totalScore += score;
const dataSocket: IDataPassTower = { const dataSocket: IDataPassTower = {
target, target,
score, score,
isHead, isHead,
heightJump, heightJump,
totalScore: user.totalScore, totalScore: user.totalScore,
}; };
const history = { const history = {
totalScore: user.totalScore, totalScore: user.totalScore,
tower: towerNumber, tower: towerNumber,
score: Math.max(score, 0), score: Math.max(score, 0),
timeStart: user.timeStart, timeStart: user.timeStart,
timePlayed: Date.now() - user.timeStart, timePlayed: Date.now() - user.timeStart,
} }
user.history.unshift(history); user.history.unshift(history);
user.position = target; user.position = target;
socket.emit(CONFIG.EVT.REQUEST_PASS_TOWER, dataSocket); socket.emit(CONFIG.EVT.REQUEST_PASS_TOWER, dataSocket);
if (score > 0) { if (score > 0) {
addBlock(socket); addBlock(socket);
} else { } else {
socket.emit(CONFIG.EVT.REQUEST_HISTORY, user.history); socket.emit(CONFIG.EVT.REQUEST_HISTORY, user.history);
await endGameApi(user); await endGameApi(user);
user.reset(); user.reset();
console.log('END'); console.log('END');
}
} catch (error) {
console.log('error', error)
} }
} }
async function addBlock(socket: Socket) { async function addBlock(socket: Socket) {
const user = getUserBySocket(socket); try {
const towerNumber = ++user.towerNumber; const user = getUserBySocket(socket);
const towerNumber = ++user.towerNumber;
const xDistance = ((Math.min(towerNumber, 100) / 100 + 1) + Math.random() * (towerNumber <= 10 ? 0.5 : 1)) * 150; const xDistance = ((Math.min(towerNumber, 100) / 100 + 1) + Math.random() * (towerNumber <= 10 ? 0.5 : 1)) * 150;
const yDistance = xDistance * Y_RADIO; const yDistance = xDistance * Y_RADIO;
user.curBlock = new v2(user.nextBlock.x, user.nextBlock.y); user.curBlock = new v2(user.nextBlock.x, user.nextBlock.y);
if (towerNumber > 1) { if (towerNumber > 1) {
user.direction = (Math.random() < 0.5) ? -1 : 1; user.direction = (Math.random() < 0.5) ? -1 : 1;
}
user.nextBlock.x = user.curBlock.x + (xDistance * user.direction);
user.nextBlock.y = user.curBlock.y + yDistance;
user.distance2Tower = user.nextBlock.distanceTo(user.curBlock);
user.screenPos = user.nextBlock.add(user.curBlock).mul(0.5).sub(new v2(0, 100));
const data: IDataSpawnTower = {
nextBlock: user.nextBlock,
screenPos: user.screenPos,
direction: user.direction,
distance2Tower: user.distance2Tower,
towerNumber: user.towerNumber,
};
user.timeStart = Date.now();
socket.emit(CONFIG.EVT.REQUEST_SPAWN_TOWER, data);
} catch (error) {
console.log('error', error)
} }
user.nextBlock.x = user.curBlock.x + (xDistance * user.direction);
user.nextBlock.y = user.curBlock.y + yDistance;
user.distance2Tower = user.nextBlock.distanceTo(user.curBlock);
user.screenPos = user.nextBlock.add(user.curBlock).mul(0.5).sub(new v2(0, 100));
const data: IDataSpawnTower = {
nextBlock: user.nextBlock,
screenPos: user.screenPos,
direction: user.direction,
distance2Tower: user.distance2Tower,
towerNumber: user.towerNumber,
};
user.timeStart = Date.now();
socket.emit(CONFIG.EVT.REQUEST_SPAWN_TOWER, data);
} }
function getUserBySocket(socket: Socket) { function getUserBySocket(socket: Socket) {
const token = String(socket.handshake.query.token); const userId = String(socket.handshake.query.userId);
return users.get(token)!; return users.get(userId)!;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment