-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathserver.js
More file actions
240 lines (226 loc) · 22.3 KB
/
server.js
File metadata and controls
240 lines (226 loc) · 22.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
var express = require('express');
var app = express();
var server = require('http').createServer(app);
app.get('/', function(req, res) {
res.sendFile(__dirname, 'public/index.html');
});
app.use(express.static('public'));
var port = process.env.PORT || 80;
server.listen(port);
var io = require('socket.io')(server);
var players = {};
var sprites = ['ambulance', 'audi', 'black_viper', 'car', 'mini_truck', 'mini_van', 'police', 'sedan', 'sonic', 'taxi', 'trashmaster', 'truck'];
var tileSize = 5;
var inputs = [];
io.on('connection', function(socket) {
socket.emit('initialize', socket.id);
socket.on('disconnect', function() {
delete players[socket.id];
io.emit('destroy', socket.id);
});
socket.on('input', function(data) {
inputs.push(data);
});
socket.on('level', function(data) {
players[socket.id] = new Player(loadLevel(data));
io.emit('create', players);
});
});
var Player = function(level) {
this.speed = 5;
this.turn = .05;
this.x = level.startX;
this.y = level.startY;
this.rotation = 1.5708;
this.type = sprites[getRandomInt(0, sprites.length - 1)];
this.level = level;
this.boostVel = 2;
this.boostVal = 1;
this.boostDuration = 500;
this.boostCooldown = 1000;
this.updateData;
}
var tps = 60;
const gameloop = require('node-gameloop');
const id = gameloop.setGameLoop(function(deltaTime) {
var len = inputs.length;
for (var i = 0; i < len; i++) {
var data = inputs.shift();
var player = players[data.id];
if (player) {
player.rotation = player.rotation + (-data.left + data.right) * player.turn * data.delta;
var x = player.x + (data.forward - data.back) * player.speed * player.boostVal * Math.sin(player.rotation) * data.delta;
var y = player.y - (data.forward - data.back) * player.speed * player.boostVal * Math.cos(player.rotation) * data.delta;
if (player.level.contains(x, y)) {
player.x = x;
player.y = y;
}
player.updateData = {
id: data.id,
x: player.x,
y: player.y,
rotation: player.rotation,
seq: data.seq
};
}
}
var update = [];
for (var i in players) {
if (players[i].updateData)
update.push(players[i].updateData);
}
if (update.length > 0)
io.emit('update', update);
},
1000 / tps);
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function loadLevel(level) {
if (level == 1)
return new Level1();
function Level1() {
var map = "\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#################$\
################X X################$\
###############X X###############$\
##############X X##############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X#############$\
#############X X#################################################################################X X#############$\
#############X X###################################################################################X X#############$\
#############X X#####################################################################################X X#############$\
#############X X#######################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#########################################################################################X X#############$\
#############X X#######################################################################################X X#############$\
#############X X#####################################################################################X X#############$\
#############X X###################################################################################X X#############$\
#############X X#################################################################################X X#############$\
#############X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
#############X X#############$\
##############X X##############$\
###############X X###############$\
################X X################$\
#################XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$\
#################################################################################################################################################################$";
this.bounds = load(map);
this.startX = 200;
this.startY = 150;
this.contains = function(x, y) {
return (this.bounds[Math.round(x / tileSize) + "," + Math.round(y / tileSize)])
}
}
function load(map) {
var bounds = {};
var x = 0;
var y = 0;
for (var i = 0; i < map.length; i++) {
if (map[i] == '$') {
x = -tileSize;
y += tileSize;
} else if (map[i] == ' ') {
bounds[x / tileSize + "," + y / tileSize] = true;
}
x += tileSize;
}
return bounds;
}
}