-
Notifications
You must be signed in to change notification settings - Fork 1
/
ArenajsCore.js
111 lines (87 loc) · 3.21 KB
/
ArenajsCore.js
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
/**
*/
var TankGame = require('./TankGame');
var TankWorld = require('./TankWorld');
//////////////////////////////////////////////////////////////////////////////////
// ctor/dtor //
//////////////////////////////////////////////////////////////////////////////////
var ArenajsCore = function(){
this.tankWorld = new TankWorld();
this.tankGame = new TankGame();
this.tankGame.setWorld(this.tankWorld);
this.scripts = {};
}
ArenajsCore.prototype.destroy = function(){
}
// inherit microevent
require('./microevent').mixin(ArenajsCore)
//////////////////////////////////////////////////////////////////////////////////
// addScript //
//////////////////////////////////////////////////////////////////////////////////
ArenajsCore.prototype.addScript = function(scriptId, scriptData){
this.scripts[scriptId] = scriptData;
}
//////////////////////////////////////////////////////////////////////////////////
// addScript //
//////////////////////////////////////////////////////////////////////////////////
ArenajsCore.prototype.start = function(){
console.assert(Object.keys(this.scripts).length > 0)
// sanity check - it MUST NOT be already started
console.assert(this.isStarted() === false, "game already started");
Object.keys(this.scripts).forEach(function(scriptId){
var script = this.scripts[scriptId];
//console.log("scriptid", scriptId, "script", script)
// require the bot
// - security issue - the bot can do everything it want - cheating possible
// - see with webworker... doesnt seem to work on nodejs
var BotClass = this._requireText(script)
var botX = Math.floor(Math.random()*this.tankWorld.width()) + this.tankWorld.minPosition.x;
var botY = Math.floor(Math.random()*this.tankWorld.height()) + this.tankWorld.minPosition.y;
var bot = new BotClass({
game : this.tankGame,
name : scriptId,
position: {
x: botX,
y: botY
}
});
}.bind(this))
// start the game
this.tankGame.start();
this.tankGame.bind('tick', function(gameState){
this.trigger('tick', gameState);
}.bind(this));
this.tankGame.bind('end', function(gameResult){
this.trigger('end', gameResult);
}.bind(this));
}
/**
* @returns {Boolean} true if the game isStarted(), false otherwise
*/
ArenajsCore.prototype.isStarted = function(){
return this.tankGame.isStarted() ? true : false;
}
//////////////////////////////////////////////////////////////////////////////////
// wtf is this function TODO //
//////////////////////////////////////////////////////////////////////////////////
/**
* Act as a commonjs require() with this text as file content
*
* - TODO experiment in another file
* - based weppy good work on brequire
* - http://boodigital.com/post/3424290434/sharing-javascript-between-client-and-server
*/
ArenajsCore.prototype._requireText = function(text){
var prefix = "(function(){" +
" var _module = { exports: {} };" +
" var _require = function(moduleId){" +
" return require(moduleId);" +
" };" +
" (function(module, exports, require){";
// Here goes the javascript with commonjs modules
var suffix = " })(_module, _module.exports, _require);"+
" return _module.exports;" +
"})();";
return eval(prefix+text+suffix)
}
module.exports = ArenajsCore;