Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
game-server-flip-jump
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Gia Vương
game-server-flip-jump
Commits
2cc5435c
Commit
2cc5435c
authored
Aug 16, 2025
by
Vũ Gia Vương
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update try catch, get user by userId
parent
0ab5c370
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
385 additions
and
305 deletions
+385
-305
networkCtrl.js
dist/Controller/networkCtrl.js
+38
-28
User.js
dist/Model/User.js
+3
-1
index.js
dist/index.js
+6
-0
socket.js
dist/socket.js
+142
-116
networkCtrl.ts
src/Controller/networkCtrl.ts
+32
-24
User.ts
src/Model/User.ts
+12
-13
index.ts
src/index.ts
+9
-1
socket.ts
src/socket.ts
+143
-122
No files found.
dist/Controller/networkCtrl.js
View file @
2cc5435c
...
...
@@ -25,36 +25,47 @@ let matchId = '';
let
eventId
=
null
;
function
startGameApi
(
data
)
{
return
__awaiter
(
this
,
void
0
,
void
0
,
function
*
()
{
timeStart
=
new
Date
().
getTime
();
userId
=
(
Math
.
random
()
*
100
>>
0
)
+
10
;
matchId
=
`
${
userId
}
-
${
GAME_CODE
}
-
${
timeStart
}
`
;
data
=
{
matchId
,
gameCode
:
GAME_CODE
,
};
const
result
=
yield
callApi
(
URL_START_GAME
,
'POST'
,
data
);
return
result
;
try
{
timeStart
=
new
Date
().
getTime
();
userId
=
(
Math
.
random
()
*
100
>>
0
)
+
10
;
matchId
=
`
${
userId
}
-
${
GAME_CODE
}
-
${
timeStart
}
`
;
data
=
{
matchId
,
gameCode
:
GAME_CODE
,
};
const
result
=
yield
callApi
(
URL_START_GAME
,
'POST'
,
data
);
return
result
;
}
catch
(
error
)
{
console
.
log
(
'error'
,
error
);
}
});
}
function
endGameApi
(
user
)
{
return
__awaiter
(
this
,
void
0
,
void
0
,
function
*
()
{
const
playedSeconds
=
(
new
Date
().
getTime
()
-
timeStart
)
/
1
e3
;
const
details
=
user
.
history
.
map
(
h
=>
({
level
:
h
.
tower
,
score
:
h
.
score
,
timeStart
:
h
.
timeStart
,
timePlayed
:
h
.
timePlayed
/
1
e3
,
}));
const
params
=
{
matchId
,
gameCode
:
GAME_CODE
,
eventId
,
playedSeconds
,
score
:
user
.
totalScore
,
gameLevel
:
user
.
towerNumber
-
1
,
details
};
const
res
=
yield
callApi
(
URL_END_GAME
,
'POST'
,
params
);
try
{
const
playedSeconds
=
(
new
Date
().
getTime
()
-
timeStart
)
/
1
e3
;
const
details
=
user
.
history
.
map
(
h
=>
({
level
:
h
.
tower
,
score
:
h
.
score
,
timeStart
:
h
.
timeStart
,
timePlayed
:
h
.
timePlayed
/
1
e3
,
}));
const
params
=
{
matchId
,
gameCode
:
GAME_CODE
,
eventId
,
playedSeconds
,
score
:
user
.
totalScore
,
gameLevel
:
user
.
towerNumber
-
1
,
details
};
const
res
=
yield
callApi
(
URL_END_GAME
,
'POST'
,
params
);
return
res
;
}
catch
(
error
)
{
console
.
log
(
'error'
,
error
);
}
});
}
function
callApi
(
url
,
method
,
data
)
{
...
...
@@ -69,11 +80,10 @@ function callApi(url, method, data) {
body
:
JSON
.
stringify
(
data
),
});
const
result
=
yield
res
.
json
();
console
.
log
(
url
,
result
.
code
,
result
.
message
);
return
(
result
===
null
||
result
===
void
0
?
void
0
:
result
.
code
)
==
'success'
;
}
catch
(
error
)
{
console
.
log
(
'error call
a
pi: '
,
error
);
console
.
log
(
'error call
A
pi: '
,
error
);
}
});
}
dist/Model/User.js
View file @
2cc5435c
...
...
@@ -5,7 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
Object
.
defineProperty
(
exports
,
"__esModule"
,
{
value
:
true
});
const
v2_1
=
__importDefault
(
require
(
"./v2"
));
class
User
{
constructor
(
token
)
{
constructor
(
token
,
id
)
{
this
.
id
=
''
;
this
.
token
=
''
;
this
.
towerNumber
=
0
;
this
.
direction
=
1
;
...
...
@@ -21,6 +22,7 @@ class User {
this
.
isEndGame
=
true
;
this
.
history
=
[];
this
.
token
=
token
;
this
.
id
=
id
;
this
.
reset
();
}
reset
()
{
...
...
dist/index.js
View file @
2cc5435c
...
...
@@ -21,3 +21,9 @@ const io = new socket_io_1.Server(server, {
server
.
listen
(
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
);
});
dist/socket.js
View file @
2cc5435c
...
...
@@ -34,33 +34,44 @@ const CONFIG = {
}
};
function
setupSocket
(
io
)
{
io
.
use
((
socket
,
next
)
=>
{
const
token
=
String
(
socket
.
handshake
.
query
.
token
);
if
(
!
token
)
{
return
;
}
if
(
!
users
.
has
(
token
))
{
users
.
set
(
token
,
new
User_1
.
default
(
token
));
}
next
();
});
io
.
on
(
"connection"
,
(
socket
)
=>
{
console
.
log
(
`🟢 Client connected:
${
socket
.
id
}
`
);
socket
.
on
(
CONFIG
.
EVT
.
START_GAME
,
(
data
)
=>
startGame
(
socket
,
data
));
socket
.
on
(
CONFIG
.
EVT
.
PASS_TOWER
,
(
data
)
=>
__awaiter
(
this
,
void
0
,
void
0
,
function
*
()
{
return
yield
passTower
(
socket
,
data
);
}));
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
));
});
try
{
io
.
use
((
socket
,
next
)
=>
{
const
token
=
String
(
socket
.
handshake
.
query
.
token
);
const
userId
=
String
(
socket
.
handshake
.
query
.
userId
);
if
(
!
token
||
!
userId
)
{
return
;
}
if
(
!
users
.
has
(
userId
))
{
users
.
set
(
userId
,
new
User_1
.
default
(
token
,
userId
));
}
next
();
});
io
.
on
(
"connection"
,
(
socket
)
=>
{
console
.
log
(
`🟢 Client connected:
${
socket
.
id
}
`
);
socket
.
on
(
CONFIG
.
EVT
.
START_GAME
,
(
data
)
=>
startGame
(
socket
,
data
));
socket
.
on
(
CONFIG
.
EVT
.
PASS_TOWER
,
(
data
)
=>
__awaiter
(
this
,
void
0
,
void
0
,
function
*
()
{
return
yield
passTower
(
socket
,
data
);
}));
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
)
{
return
__awaiter
(
this
,
void
0
,
void
0
,
function
*
()
{
const
user
=
getUserBySocket
(
socket
);
user
.
reset
();
if
(
user
===
null
||
user
===
void
0
?
void
0
:
user
.
isEndGame
)
{
return
;
try
{
const
user
=
getUserBySocket
(
socket
);
user
.
reset
();
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
)
{
...
...
@@ -75,113 +86,128 @@ function getHistory(socket) {
}
function
startGame
(
socket
,
data
)
{
return
__awaiter
(
this
,
void
0
,
void
0
,
function
*
()
{
const
user
=
getUserBySocket
(
socket
);
const
result
=
yield
(
0
,
networkCtrl_1
.
startGameApi
)(
data
);
// const result = true;
if
(
result
)
{
socket
.
emit
(
CONFIG
.
EVT
.
REQUEST_START_GAME
,
true
);
user
.
isEndGame
=
false
;
addBlock
(
socket
);
try
{
const
user
=
getUserBySocket
(
socket
);
const
result
=
yield
(
0
,
networkCtrl_1
.
startGameApi
)(
data
);
// const result = true;
if
(
result
)
{
socket
.
emit
(
CONFIG
.
EVT
.
REQUEST_START_GAME
,
true
);
user
.
isEndGame
=
false
;
addBlock
(
socket
);
}
else
{
console
.
log
(
'start game fail'
);
socket
.
emit
(
CONFIG
.
EVT
.
REQUEST_START_GAME
,
false
);
}
}
else
{
console
.
log
(
'start game fail'
);
socket
.
emit
(
CONFIG
.
EVT
.
REQUEST_START_GAME
,
false
);
catch
(
error
)
{
console
.
log
(
'error'
,
error
);
}
});
}
function
passTower
(
socket
,
data
)
{
return
__awaiter
(
this
,
void
0
,
void
0
,
function
*
()
{
const
user
=
getUserBySocket
(
socket
);
const
xDistance_
=
data
.
distance
;
const
{
direction
,
nextBlock
,
towerNumber
,
position
}
=
user
;
const
point
=
new
v2_1
.
default
(
xDistance_
*
direction
,
xDistance_
*
Y_RADIO
);
const
nextTowerPos
=
nextBlock
;
const
distancePlayer2NextTower
=
nextTowerPos
.
clone
().
sub
(
position
).
mag
();
const
minDistance
=
Math
.
abs
(
xDistance_
-
distancePlayer2NextTower
);
const
isHead
=
distancePlayer2NextTower
>
xDistance_
;
let
score
=
-
1
;
const
pointEdge
=
new
v2_1
.
default
(
HALF_SIZE_TOWER
*
direction
,
HALF_SIZE_TOWER
*
Y_RADIO
);
let
target
=
position
.
clone
().
add
(
point
);
if
(
minDistance
<
HALF_SIZE_TOWER
*
1.5
)
{
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
));
score
=
1
;
}
if
(
minDistance
<
HALF_SIZE_TOWER
*
0.3
)
{
target
=
nextTowerPos
.
clone
();
score
=
2
;
}
// target = nextTowerPos.clone();
// score = 2;
const
heightJump
=
user
.
distance2Tower
*
0.7
;
if
(
score
<=
0
)
{
user
.
isEndGame
=
true
;
}
if
(
score
==
2
)
{
user
.
combo
=
Math
.
min
(
user
.
combo
+
1
,
2
);
score
*=
user
.
combo
;
try
{
const
user
=
getUserBySocket
(
socket
);
const
xDistance_
=
data
.
distance
;
const
{
direction
,
nextBlock
,
towerNumber
,
position
}
=
user
;
const
point
=
new
v2_1
.
default
(
xDistance_
*
direction
,
xDistance_
*
Y_RADIO
);
const
nextTowerPos
=
nextBlock
;
const
distancePlayer2NextTower
=
nextTowerPos
.
clone
().
sub
(
position
).
mag
();
const
minDistance
=
Math
.
abs
(
xDistance_
-
distancePlayer2NextTower
);
const
isHead
=
distancePlayer2NextTower
>
xDistance_
;
let
score
=
-
1
;
const
pointEdge
=
new
v2_1
.
default
(
HALF_SIZE_TOWER
*
direction
,
HALF_SIZE_TOWER
*
Y_RADIO
);
let
target
=
position
.
clone
().
add
(
point
);
if
(
minDistance
<
HALF_SIZE_TOWER
*
1.5
)
{
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
));
score
=
1
;
}
if
(
minDistance
<
HALF_SIZE_TOWER
*
0.3
)
{
target
=
nextTowerPos
.
clone
();
score
=
2
;
}
// target = nextTowerPos.clone();
// score = 2;
const
heightJump
=
user
.
distance2Tower
*
0.7
;
if
(
score
<=
0
)
{
user
.
isEndGame
=
true
;
}
if
(
score
==
2
)
{
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
{
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'
);
catch
(
error
)
{
console
.
log
(
'error'
,
error
);
}
});
}
function
addBlock
(
socket
)
{
return
__awaiter
(
this
,
void
0
,
void
0
,
function
*
()
{
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
yDistance
=
xDistance
*
Y_RADIO
;
user
.
curBlock
=
new
v2_1
.
default
(
user
.
nextBlock
.
x
,
user
.
nextBlock
.
y
);
if
(
towerNumber
>
1
)
{
user
.
direction
=
(
Math
.
random
()
<
0.5
)
?
-
1
:
1
;
try
{
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
yDistance
=
xDistance
*
Y_RADIO
;
user
.
curBlock
=
new
v2_1
.
default
(
user
.
nextBlock
.
x
,
user
.
nextBlock
.
y
);
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
)
{
const
token
=
String
(
socket
.
handshake
.
query
.
token
);
return
users
.
get
(
token
);
const
userId
=
String
(
socket
.
handshake
.
query
.
userId
);
return
users
.
get
(
userId
);
}
src/Controller/networkCtrl.ts
View file @
2cc5435c
...
...
@@ -15,38 +15,47 @@ let matchId = '';
let
eventId
:
string
|
null
=
null
;
export
async
function
startGameApi
(
data
:
any
)
{
timeStart
=
new
Date
().
getTime
();
userId
=
(
Math
.
random
()
*
100
>>
0
)
+
10
;
matchId
=
`
${
userId
}
-
${
GAME_CODE
}
-
${
timeStart
}
`
;
try
{
timeStart
=
new
Date
().
getTime
();
userId
=
(
Math
.
random
()
*
100
>>
0
)
+
10
;
matchId
=
`
${
userId
}
-
${
GAME_CODE
}
-
${
timeStart
}
`
;
data
=
{
matchId
,
gameCode
:
GAME_CODE
,
};
const
result
=
await
callApi
(
URL_START_GAME
,
'POST'
,
data
);
return
result
;
data
=
{
matchId
,
gameCode
:
GAME_CODE
,
};
const
result
=
await
callApi
(
URL_START_GAME
,
'POST'
,
data
);
return
result
;
}
catch
(
error
)
{
console
.
log
(
'error'
,
error
)
}
}
export
async
function
endGameApi
(
user
:
User
)
{
const
playedSeconds
=
(
new
Date
().
getTime
()
-
timeStart
)
/
1
e3
;
const
details
=
user
.
history
.
map
(
h
=>
({
try
{
const
playedSeconds
=
(
new
Date
().
getTime
()
-
timeStart
)
/
1
e3
;
const
details
=
user
.
history
.
map
(
h
=>
({
level
:
h
.
tower
,
score
:
h
.
score
,
timeStart
:
h
.
timeStart
,
timePlayed
:
h
.
timePlayed
/
1
e3
,
}));
}));
const
params
=
{
matchId
,
gameCode
:
GAME_CODE
,
eventId
,
playedSeconds
,
score
:
user
.
totalScore
,
gameLevel
:
user
.
towerNumber
-
1
,
details
}
const
params
=
{
matchId
,
gameCode
:
GAME_CODE
,
eventId
,
playedSeconds
,
score
:
user
.
totalScore
,
gameLevel
:
user
.
towerNumber
-
1
,
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
)
{
...
...
@@ -60,10 +69,9 @@ async function callApi(url: string, method: string, data: any) {
body
:
JSON
.
stringify
(
data
),
});
const
result
=
await
res
.
json
();
console
.
log
(
url
,
result
.
code
,
result
.
message
);
return
result
?.
code
==
'success'
;
}
catch
(
error
)
{
console
.
log
(
'error call
a
pi: '
,
error
);
console
.
log
(
'error call
A
pi: '
,
error
);
}
}
src/Model/User.ts
View file @
2cc5435c
import
v2
from
"./v2"
;
class
User
{
public
id
:
string
=
''
;
public
token
:
string
=
''
;
public
towerNumber
:
number
=
0
;
public
direction
:
number
=
1
;
...
...
@@ -10,17 +11,18 @@ class User {
public
totalScore
:
number
=
0
;
public
combo
:
number
=
0
;
public
curBlock
:
v2
=
new
v2
(
0
,
0
);
public
nextBlock
:
v2
=
new
v2
(
0
,
0
);
public
screenPos
:
v2
=
new
v2
(
0
,
0
);
public
position
:
v2
=
new
v2
(
0
,
0
);
public
curBlock
:
v2
=
new
v2
(
0
,
0
);
public
nextBlock
:
v2
=
new
v2
(
0
,
0
);
public
screenPos
:
v2
=
new
v2
(
0
,
0
);
public
position
:
v2
=
new
v2
(
0
,
0
);
public
timeStart
:
number
=
0
;
public
isEndGame
:
boolean
=
true
;
public
history
:
History
[]
=
[];
constructor
(
token
:
string
)
{
constructor
(
token
:
string
,
id
:
string
)
{
this
.
token
=
token
;
this
.
id
=
id
;
this
.
reset
();
}
...
...
@@ -61,14 +63,6 @@ export interface IDataPassTower {
totalScore
:
number
,
}
// {
// nextBlock: user.nextBlock,
// screenPos: user.screenPos,
// direction: user.direction,
// distance2Tower: user.distance2Tower,
// towerNumber: user.towerNumber - 1,
// };
export
interface
IDataSpawnTower
{
nextBlock
:
v2
,
screenPos
:
v2
,
...
...
@@ -77,4 +71,9 @@ export interface IDataSpawnTower {
towerNumber
:
number
,
}
export
interface
IQuery
{
token
?:
string
,
userId
?:
string
}
export
default
User
;
\ No newline at end of file
src/index.ts
View file @
2cc5435c
...
...
@@ -20,4 +20,12 @@ setupSocket(io);
server
.
listen
(
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
);
});
src/socket.ts
View file @
2cc5435c
...
...
@@ -22,38 +22,47 @@ const CONFIG = {
};
export
function
setupSocket
(
io
:
Server
)
{
io
.
use
((
socket
:
Socket
,
next
)
=>
{
const
token
=
String
(
socket
.
handshake
.
query
.
token
);
if
(
!
token
)
{
return
;
}
if
(
!
users
.
has
(
token
))
{
users
.
set
(
token
,
new
User
(
token
));
}
next
();
});
io
.
on
(
"connection"
,
(
socket
:
Socket
)
=>
{
console
.
log
(
`🟢 Client connected:
${
socket
.
id
}
`
);
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
.
HISTORY
,
async
()
=>
getHistory
(
socket
));
socket
.
on
(
CONFIG
.
EVT
.
END_GAME
,
()
=>
endGame
(
socket
));
socket
.
on
(
"disconnect"
,
()
=>
onDisconnect
(
socket
));
});
try
{
io
.
use
((
socket
:
Socket
,
next
)
=>
{
const
token
=
String
(
socket
.
handshake
.
query
.
token
);
const
userId
=
String
(
socket
.
handshake
.
query
.
userId
);
if
(
!
token
||
!
userId
)
{
return
;
}
if
(
!
users
.
has
(
userId
))
{
users
.
set
(
userId
,
new
User
(
token
,
userId
));
}
next
();
});
io
.
on
(
"connection"
,
(
socket
:
Socket
)
=>
{
console
.
log
(
`🟢 Client connected:
${
socket
.
id
}
`
);
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
.
HISTORY
,
async
()
=>
getHistory
(
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
)
{
const
user
=
getUserBySocket
(
socket
);
user
.
reset
();
try
{
const
user
=
getUserBySocket
(
socket
);
user
.
reset
();
if
(
user
?.
isEndGame
)
{
return
;
if
(
user
?.
isEndGame
)
{
return
;
}
endGameApi
(
user
);
}
catch
(
error
)
{
console
.
log
(
'error'
,
error
)
}
endGameApi
(
user
);
}
function
onDisconnect
(
socket
:
Socket
):
void
{
...
...
@@ -67,126 +76,138 @@ async function getHistory(socket: Socket) {
}
async
function
startGame
(
socket
:
Socket
,
data
:
any
)
{
const
user
=
getUserBySocket
(
socket
);
const
result
=
await
startGameApi
(
data
);
// const result = true;
if
(
result
)
{
socket
.
emit
(
CONFIG
.
EVT
.
REQUEST_START_GAME
,
true
);
user
.
isEndGame
=
false
;
addBlock
(
socket
);
}
else
{
console
.
log
(
'start game fail'
);
socket
.
emit
(
CONFIG
.
EVT
.
REQUEST_START_GAME
,
false
);
try
{
const
user
=
getUserBySocket
(
socket
);
const
result
=
await
startGameApi
(
data
);
// const result = true;
if
(
result
)
{
socket
.
emit
(
CONFIG
.
EVT
.
REQUEST_START_GAME
,
true
);
user
.
isEndGame
=
false
;
addBlock
(
socket
);
}
else
{
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
})
{
const
user
=
getUserBySocket
(
socket
);
try
{
const
user
=
getUserBySocket
(
socket
);
const
xDistance_
=
data
.
distance
;
const
{
direction
,
nextBlock
,
towerNumber
,
position
}
=
user
;
const
xDistance_
=
data
.
distance
;
const
{
direction
,
nextBlock
,
towerNumber
,
position
}
=
user
;
const
point
=
new
v2
(
xDistance_
*
direction
,
xDistance_
*
Y_RADIO
);
const
nextTowerPos
=
nextBlock
;
const
distancePlayer2NextTower
=
nextTowerPos
.
clone
().
sub
(
position
).
mag
();
const
minDistance
=
Math
.
abs
(
xDistance_
-
distancePlayer2NextTower
);
const
isHead
=
distancePlayer2NextTower
>
xDistance_
;
const
point
=
new
v2
(
xDistance_
*
direction
,
xDistance_
*
Y_RADIO
);
const
nextTowerPos
=
nextBlock
;
const
distancePlayer2NextTower
=
nextTowerPos
.
clone
().
sub
(
position
).
mag
();
const
minDistance
=
Math
.
abs
(
xDistance_
-
distancePlayer2NextTower
);
const
isHead
=
distancePlayer2NextTower
>
xDistance_
;
let
score
=
-
1
;
let
score
=
-
1
;
const
pointEdge
=
new
v2
(
HALF_SIZE_TOWER
*
direction
,
HALF_SIZE_TOWER
*
Y_RADIO
);
let
target
=
position
.
clone
().
add
(
point
);
const
pointEdge
=
new
v2
(
HALF_SIZE_TOWER
*
direction
,
HALF_SIZE_TOWER
*
Y_RADIO
);
let
target
=
position
.
clone
().
add
(
point
);
if
(
minDistance
<
HALF_SIZE_TOWER
*
1.5
)
{
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
));
score
=
1
;
}
if
(
minDistance
<
HALF_SIZE_TOWER
*
0.3
)
{
target
=
nextTowerPos
.
clone
();
score
=
2
;
}
if
(
minDistance
<
HALF_SIZE_TOWER
*
1.5
)
{
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
));
score
=
1
;
}
if
(
minDistance
<
HALF_SIZE_TOWER
*
0.3
)
{
target
=
nextTowerPos
.
clone
();
score
=
2
;
}
// target = nextTowerPos.clone();
// score = 2;
// target = nextTowerPos.clone();
// score = 2;
const
heightJump
=
user
.
distance2Tower
*
0.7
;
const
heightJump
=
user
.
distance2Tower
*
0.7
;
if
(
score
<=
0
)
{
user
.
isEndGame
=
true
;
}
if
(
score
<=
0
)
{
user
.
isEndGame
=
true
;
}
if
(
score
==
2
)
{
user
.
combo
=
Math
.
min
(
user
.
combo
+
1
,
2
);
score
*=
user
.
combo
;
}
else
{
user
.
combo
=
0
;
}
if
(
score
==
2
)
{
user
.
combo
=
Math
.
min
(
user
.
combo
+
1
,
2
);
score
*=
user
.
combo
;
}
else
{
user
.
combo
=
0
;
}
user
.
totalScore
+=
score
;
const
dataSocket
:
IDataPassTower
=
{
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
.
totalScore
+=
score
;
const
dataSocket
:
IDataPassTower
=
{
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
;
user
.
history
.
unshift
(
history
);
user
.
position
=
target
;
socket
.
emit
(
CONFIG
.
EVT
.
REQUEST_PASS_TOWER
,
dataSocket
);
socket
.
emit
(
CONFIG
.
EVT
.
REQUEST_PASS_TOWER
,
dataSocket
);
if
(
score
>
0
)
{
addBlock
(
socket
);
}
else
{
socket
.
emit
(
CONFIG
.
EVT
.
REQUEST_HISTORY
,
user
.
history
);
await
endGameApi
(
user
);
user
.
reset
();
console
.
log
(
'END'
);
if
(
score
>
0
)
{
addBlock
(
socket
);
}
else
{
socket
.
emit
(
CONFIG
.
EVT
.
REQUEST_HISTORY
,
user
.
history
);
await
endGameApi
(
user
);
user
.
reset
();
console
.
log
(
'END'
);
}
}
catch
(
error
)
{
console
.
log
(
'error'
,
error
)
}
}
async
function
addBlock
(
socket
:
Socket
)
{
const
user
=
getUserBySocket
(
socket
);
const
towerNumber
=
++
user
.
towerNumber
;
try
{
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
yDistance
=
xDistance
*
Y_RADIO
;
const
xDistance
=
((
Math
.
min
(
towerNumber
,
100
)
/
100
+
1
)
+
Math
.
random
()
*
(
towerNumber
<=
10
?
0.5
:
1
))
*
150
;
const
yDistance
=
xDistance
*
Y_RADIO
;
user
.
curBlock
=
new
v2
(
user
.
nextBlock
.
x
,
user
.
nextBlock
.
y
);
if
(
towerNumber
>
1
)
{
user
.
direction
=
(
Math
.
random
()
<
0.5
)
?
-
1
:
1
;
user
.
curBlock
=
new
v2
(
user
.
nextBlock
.
x
,
user
.
nextBlock
.
y
);
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
(
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
)
{
const
token
=
String
(
socket
.
handshake
.
query
.
token
);
return
users
.
get
(
token
)
!
;
const
userId
=
String
(
socket
.
handshake
.
query
.
userId
);
return
users
.
get
(
userId
)
!
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment