diff --git a/demo/dist/metacar.min.js b/demo/dist/metacar.min.js
index 8513460..2496366 100644
--- a/demo/dist/metacar.min.js
+++ b/demo/dist/metacar.min.js
@@ -95,7 +95,7 @@ window["metacar"] =
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"AssetManger\", function() { return AssetManger; });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _car__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./car */ \"./src/car.ts\");\n/* harmony import */ var _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./basic_motion_engine */ \"./src/basic_motion_engine.ts\");\n/* harmony import */ var _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./control_motion_engine */ \"./src/control_motion_engine.ts\");\n/* harmony import */ var _bot_motion_engine__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./bot_motion_engine */ \"./src/bot_motion_engine.ts\");\n\n\n\n\n\n\n;\nvar AssetManger = (function () {\n function AssetManger(level) {\n this.assets = [];\n this.level = level;\n this.motion = {\n \"BasicMotionEngine\": _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"],\n \"ControlMotionEngine\": _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__[\"ControlMotionEngine\"]\n };\n }\n AssetManger.prototype.createRoadSide = function (info, textures) {\n var x = (info.mx) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n var y = (info.my) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n var area = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Graphics\"]();\n area.beginFill(0xe8e8e8);\n area.drawRoundedRect(0, 0, _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] + 30, _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] + 30, undefined);\n area.x = x - 15;\n area.y = y - 15;\n area.endFill();\n this.level.addChild(area);\n };\n AssetManger.prototype.createRoad = function (info, textures, arrow) {\n var _this = this;\n var road = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[info.type].image]);\n road.arrow = arrow;\n road.x = (info.mx) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n road.y = (info.my) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n road.obstacle = false;\n road.mapId = _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].ROAD;\n road.orientation = _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[info.type].orientation;\n road.setCarPosition = function (car, line) { return _this.setCarOnRoad(road, car, line); };\n road.cars = [];\n road.mx = info.mx;\n road.my = info.my;\n this.level.addRoad(road);\n };\n AssetManger.prototype.setCarOnRoad = function (road, car, line) {\n if (line == undefined)\n line = 0;\n var carById = this.level.findCarById(road.cars[0]);\n if (road.cars.length >= 1 && carById && carById.core.line == line) {\n line = line == 0 ? 1 : 0;\n }\n if (road.cars.length >= 2) {\n car.is_valid = false;\n return;\n }\n car.line = line;\n car.x = road.x;\n car.y = road.y;\n car.x += _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2;\n car.y += _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2;\n var x_margin = 0;\n var y_margin = (_global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] * 1 / 4);\n road.orientation = (Math.floor(road.orientation / car.rotationStep) * car.rotationStep);\n var th = -road.orientation * (Math.PI);\n var x_m = (Math.cos(th) * x_margin) - (y_margin * Math.sin(th));\n var y_m = (Math.cos(th) * y_margin) + (x_margin * Math.sin(th));\n var line_side_factor = line == 0 ? 1 : -1;\n var line_side_factor_t = line == 0 ? 0 : Math.PI;\n car.x += line_side_factor * Math.round(x_m);\n car.y += line_side_factor * Math.round(y_m);\n car.mx = Math.floor(car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n car.my = Math.floor(car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n car.rotation = (th + line_side_factor_t);\n car.checkAndsetNewRoad(road);\n };\n AssetManger.prototype.createAsset = function (img, info, textures, type) {\n var asset = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[img]);\n asset.obstacle = false;\n asset.type = type;\n asset.mapId = 0;\n asset.x = info.x;\n asset.y = info.y;\n this.level.addChild(asset);\n this.assets.push(asset);\n };\n AssetManger.prototype.createMap = function (map, info, textures, roadside) {\n if (roadside === void 0) { roadside = true; }\n if (roadside) {\n for (var my = 0; my < map.length; my++) {\n for (var mx = 0; mx < map[my].length; mx++) {\n if (_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[map[my][mx]]) {\n this.createRoadSide({ mx: mx, my: my, type: map[my][mx] }, textures);\n }\n }\n }\n }\n for (var my = 0; my < map.length; my++) {\n for (var mx = 0; mx < map[my].length; mx++) {\n if (_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[map[my][mx]]) {\n this.createRoad({ mx: mx, my: my, type: map[my][mx] }, textures, map[my][mx]);\n }\n }\n }\n for (var key in _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"]) {\n if (key != \"ROADS\" && info[key]) {\n for (var a = 0; a < info[key].length; a++) {\n this.createAsset(_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"][key].image, info[key][a], textures, key);\n }\n }\n }\n };\n AssetManger.prototype.createCars = function (map, info, textures) {\n for (var c in info.cars) {\n var options = { lidar: true, lidarInfo: { pts: 2, width: 0.5, height: 1, pos: 1 } };\n options.lidar = true;\n options.motionEngine = new _bot_motion_engine__WEBPACK_IMPORTED_MODULE_5__[\"BotMotionEngine\"](this.level);\n var n_car = new _car__WEBPACK_IMPORTED_MODULE_2__[\"Car\"](this.level, info.cars[c], textures, options);\n this.level.addCar(n_car);\n }\n };\n AssetManger.prototype.createAgent = function (map, info, textures) {\n var motionOptions = {\n \"rotationStep\": 0.5,\n \"actions\": [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"]\n };\n var agent = new _car__WEBPACK_IMPORTED_MODULE_2__[\"Car\"](this.level, info.agent, textures, {\n image: _global__WEBPACK_IMPORTED_MODULE_1__[\"CAR_IMG\"].AGENT,\n lidar: true,\n motionEngine: new _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"](this.level, motionOptions)\n });\n this.level.addChild(agent.lidar);\n this.level.addCar(agent);\n agent.core.agent = true;\n return agent;\n };\n AssetManger.prototype.addAsset = function (asset) {\n this.assets.push(asset);\n };\n AssetManger.prototype.exportMap = function (width, height, file_name, download) {\n var file = { \"cars\": [] };\n var map = [];\n var envs = this.level.getEnvs();\n for (var y = 0; y < height; y++) {\n var line = [];\n for (var x = 0; x < width; x++) {\n line.push(0);\n }\n map.push(line);\n }\n for (var e = 0; e < envs.length; e++) {\n var elem = envs[e];\n if (!elem.isremove) {\n if (elem.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR && !elem.agent && elem.my < height && elem.mx < width) {\n file.cars.push({\n \"mx\": elem.mx,\n \"my\": elem.my,\n \"line\": elem.line\n });\n }\n else if (elem.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].ROAD && elem.my < height && elem.mx < width) {\n map[elem.my][elem.mx] = elem.arrow;\n }\n }\n }\n for (var e = 0; e < this.assets.length; e++) {\n var elem = this.assets[e];\n if (!elem.isremove) {\n if (elem.type != \"car\" && elem.type != \"agent\") {\n if (!file[elem.type])\n file[elem.type] = [];\n file[elem.type].push({\n \"x\": elem.x,\n \"y\": elem.y\n });\n }\n }\n }\n file.map = map;\n if (this.level.agent) {\n console.log(\"enter here to create egent....\");\n file.agent = {\n \"mx\": this.level.agent.core.mx,\n \"my\": this.level.agent.core.my,\n \"line\": this.level.agent.core.line,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotationStep\": 0.5,\n \"actions\": [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"]\n }\n }\n };\n }\n var fileCOntent = JSON.stringify(file, null, 4);\n if (download)\n _utils__WEBPACK_IMPORTED_MODULE_0__[\"saveAs\"](fileCOntent, file_name);\n return file;\n };\n return AssetManger;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/asset_manager.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"AssetManger\", function() { return AssetManger; });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _car__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./car */ \"./src/car.ts\");\n/* harmony import */ var _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./basic_motion_engine */ \"./src/basic_motion_engine.ts\");\n/* harmony import */ var _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./control_motion_engine */ \"./src/control_motion_engine.ts\");\n\n\n\n\n\n;\nvar AssetManger = (function () {\n function AssetManger(level) {\n this.assets = [];\n this.agentMotionEngine = _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"];\n this.agentMotionOptions = {};\n this.agentLidarInfo = {};\n this.level = level;\n this.motion = {\n \"BasicMotionEngine\": _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"],\n \"ControlMotionEngine\": _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__[\"ControlMotionEngine\"]\n };\n }\n AssetManger.prototype.setAgentLidar = function (options) {\n this.agentLidarInfo = options;\n };\n AssetManger.prototype.setAgentMotion = function (motion, options) {\n this.agentMotionEngine = motion;\n this.agentMotionOptions = options;\n };\n AssetManger.prototype.createRoadSide = function (info, textures) {\n var x = (info.mx) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n var y = (info.my) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n var area = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Graphics\"]();\n area.beginFill(0xe8e8e8);\n area.drawRoundedRect(0, 0, _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] + 30, _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] + 30, undefined);\n area.x = x - 15;\n area.y = y - 15;\n area.endFill();\n this.level.addChild(area);\n };\n AssetManger.prototype.createRoad = function (info, textures, arrow) {\n var _this = this;\n var road = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[info.type].image]);\n road.arrow = arrow;\n road.x = (info.mx) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n road.y = (info.my) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n road.obstacle = false;\n road.mapId = _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].ROAD;\n road.orientation = _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[info.type].orientation;\n road.setCarPosition = function (car, line) { return _this.setCarOnRoad(road, car, line); };\n road.cars = [];\n road.mx = info.mx;\n road.my = info.my;\n this.level.addRoad(road);\n };\n AssetManger.prototype.setCarOnRoad = function (road, car, line) {\n if (line == undefined)\n line = 0;\n var carById = this.level.findCarById(road.cars[0]);\n if (road.cars.length >= 1 && carById && carById.core.line == line) {\n line = line == 0 ? 1 : 0;\n }\n if (road.cars.length >= 2) {\n car.is_valid = false;\n return;\n }\n car.line = line;\n car.x = road.x;\n car.y = road.y;\n car.x += _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2;\n car.y += _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2;\n var x_margin = 0;\n var y_margin = (_global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] * 1 / 4);\n road.orientation = (Math.floor(road.orientation / car.rotationStep) * car.rotationStep);\n var th = -road.orientation * (Math.PI);\n var x_m = (Math.cos(th) * x_margin) - (y_margin * Math.sin(th));\n var y_m = (Math.cos(th) * y_margin) + (x_margin * Math.sin(th));\n var line_side_factor = line == 0 ? 1 : -1;\n var line_side_factor_t = line == 0 ? 0 : Math.PI;\n car.x += line_side_factor * Math.round(x_m);\n car.y += line_side_factor * Math.round(y_m);\n car.mx = Math.floor(car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n car.my = Math.floor(car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n car.rotation = (th + line_side_factor_t);\n car.checkAndsetNewRoad(road);\n };\n AssetManger.prototype.createAsset = function (img, info, textures, type) {\n var asset = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[img]);\n asset.obstacle = false;\n asset.type = type;\n asset.mapId = 0;\n asset.x = info.x;\n asset.y = info.y;\n this.level.addChild(asset);\n this.assets.push(asset);\n };\n AssetManger.prototype.createMap = function (map, info, textures, roadside) {\n if (roadside === void 0) { roadside = true; }\n if (roadside) {\n for (var my = 0; my < map.length; my++) {\n for (var mx = 0; mx < map[my].length; mx++) {\n if (_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[map[my][mx]]) {\n this.createRoadSide({ mx: mx, my: my, type: map[my][mx] }, textures);\n }\n }\n }\n }\n for (var my = 0; my < map.length; my++) {\n for (var mx = 0; mx < map[my].length; mx++) {\n if (_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[map[my][mx]]) {\n this.createRoad({ mx: mx, my: my, type: map[my][mx] }, textures, map[my][mx]);\n }\n }\n }\n for (var key in _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"]) {\n if (key != \"ROADS\" && info[key]) {\n for (var a = 0; a < info[key].length; a++) {\n this.createAsset(_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"][key].image, info[key][a], textures, key);\n }\n }\n }\n };\n AssetManger.prototype.createCars = function (map, info, textures) {\n for (var c in info.cars) {\n var options = { lidar: true, lidarInfo: { pts: 2, width: 0.5, height: 1, pos: 1 } };\n options.lidar = true;\n var n_car = new _car__WEBPACK_IMPORTED_MODULE_2__[\"Car\"](this.level, info.cars[c], textures, options);\n this.level.addCar(n_car);\n }\n };\n AssetManger.prototype.createAgent = function (map, info, textures) {\n var agent = new _car__WEBPACK_IMPORTED_MODULE_2__[\"Car\"](this.level, info.agent, textures, {\n image: _global__WEBPACK_IMPORTED_MODULE_1__[\"CAR_IMG\"].AGENT,\n lidar: true,\n lidarInfo: this.agentLidarInfo,\n motionEngine: new this.agentMotionEngine(this.level, this.agentMotionOptions)\n });\n this.level.addChild(agent.lidar);\n this.level.addCar(agent);\n agent.core.agent = true;\n return agent;\n };\n AssetManger.prototype.addAsset = function (asset) {\n this.assets.push(asset);\n };\n AssetManger.prototype.exportMap = function (width, height, file_name, download) {\n var file = { \"cars\": [] };\n var map = [];\n var envs = this.level.getEnvs();\n for (var y = 0; y < height; y++) {\n var line = [];\n for (var x = 0; x < width; x++) {\n line.push(0);\n }\n map.push(line);\n }\n for (var e = 0; e < envs.length; e++) {\n var elem = envs[e];\n if (!elem.isremove) {\n if (elem.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR && !elem.agent && elem.my < height && elem.mx < width) {\n file.cars.push({\n \"mx\": elem.mx,\n \"my\": elem.my,\n \"line\": elem.line\n });\n }\n else if (elem.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].ROAD && elem.my < height && elem.mx < width) {\n map[elem.my][elem.mx] = elem.arrow;\n }\n }\n }\n for (var e = 0; e < this.assets.length; e++) {\n var elem = this.assets[e];\n if (!elem.isremove) {\n if (elem.type != \"car\" && elem.type != \"agent\") {\n if (!file[elem.type])\n file[elem.type] = [];\n file[elem.type].push({\n \"x\": elem.x,\n \"y\": elem.y\n });\n }\n }\n }\n file.map = map;\n if (this.level.agent) {\n console.log(\"enter here to create egent....\");\n file.agent = {\n \"mx\": this.level.agent.core.mx,\n \"my\": this.level.agent.core.my,\n \"line\": this.level.agent.core.line,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotationStep\": 0.5,\n \"actions\": [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"]\n }\n }\n };\n }\n var fileCOntent = JSON.stringify(file, null, 4);\n if (download)\n _utils__WEBPACK_IMPORTED_MODULE_0__[\"saveAs\"](fileCOntent, file_name);\n return file;\n };\n return AssetManger;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/asset_manager.ts?");
/***/ }),
@@ -107,19 +107,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BasicMotionEngine\", function() { return BasicMotionEngine; });\n/* harmony import */ var _motion_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./motion_engine */ \"./src/motion_engine.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar BasicMotionEngine = (function (_super) {\n __extends(BasicMotionEngine, _super);\n function BasicMotionEngine(level, options) {\n var _this = _super.call(this, level) || this;\n _this.rotationStep = options.rotationStep;\n _this.actions = options.actions;\n return _this;\n }\n BasicMotionEngine.prototype.setUp = function (car, lidar) {\n this.car = car;\n this.lidar = lidar;\n this.state = [];\n for (var y = 0; y < lidar.pts; y++) {\n var line = [];\n for (var x = 0; x < lidar.pts; x++) {\n line.push(_global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].DEFAULT);\n }\n this.state.push(line);\n }\n this.setUpKeyboard();\n this.car.v = 0;\n this.detectInteractions();\n };\n BasicMotionEngine.prototype.setUpKeyboard = function () {\n var _this = this;\n var left = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](37);\n var up = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](38);\n var right = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](39);\n var down = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](40);\n if (this.actions.indexOf(\"LEFT\") != -1)\n left.press = function () { _this.turnLeft(); };\n if (this.actions.indexOf(\"RIGHT\") != -1)\n right.press = function () { _this.turnRight(); };\n if (this.actions.indexOf(\"UP\") != -1) {\n up.press = function () { _this.moveForward(); };\n up.release = function () {\n _this.car.v = 0;\n };\n }\n if (this.actions.indexOf(\"DOWN\") != -1) {\n down.press = function () { _this.moveBackward(); };\n down.release = function () {\n _this.car.v = 0;\n };\n }\n };\n BasicMotionEngine.prototype.turnLeft = function () {\n this.car.rotation -= this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BasicMotionEngine.prototype.turnRight = function () {\n this.car.rotation += this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BasicMotionEngine.prototype.moveForward = function () {\n this.car.v = 1;\n };\n BasicMotionEngine.prototype.moveBackward = function () {\n this.car.v = -1;\n };\n BasicMotionEngine.prototype.actionStep = function (delta, action) {\n if (this.actions[action] == \"LEFT\") {\n this.turnLeft();\n }\n if (this.actions[action] == \"RIGHT\") {\n this.turnRight();\n }\n if (this.actions[action] == \"UP\") {\n this.moveForward();\n }\n if (this.actions[action] == \"DOWN\") {\n this.moveBackward();\n }\n var _a = this.step(delta), agent_col = _a.agent_col, on_road = _a.on_road;\n this.car.v = 0;\n return { agent_col: agent_col, on_road: on_road };\n };\n BasicMotionEngine.prototype.actionSpace = function () {\n return {\n type: \"Discrete\",\n size: 1,\n range: [0, 2]\n };\n };\n BasicMotionEngine.prototype.step = function (delta) {\n this.car.x += this.car.v * Math.cos(this.car.rotation) * delta;\n this.car.y += this.car.v * Math.sin(this.car.rotation) * delta;\n this.car.mx = Math.floor(this.car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.my = Math.floor(this.car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.checkAndsetNewRoad();\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n var _a = this.detectInteractions(), agent_col = _a.agent_col, on_road = _a.on_road;\n if (agent_col.length > 0) {\n this.car.v = 0;\n this.car.vy = 0;\n }\n return { agent_col: agent_col, on_road: on_road };\n };\n return BasicMotionEngine;\n}(_motion_engine__WEBPACK_IMPORTED_MODULE_0__[\"MotionEngine\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/basic_motion_engine.ts?");
-
-/***/ }),
-
-/***/ "./src/bot_motion_engine.ts":
-/*!**********************************!*\
- !*** ./src/bot_motion_engine.ts ***!
- \**********************************/
-/*! exports provided: BotMotionEngine */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BotMotionEngine\", function() { return BotMotionEngine; });\n/* harmony import */ var _motion_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./motion_engine */ \"./src/motion_engine.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar BotMotionEngine = (function (_super) {\n __extends(BotMotionEngine, _super);\n function BotMotionEngine(level) {\n var _this = _super.call(this, level) || this;\n _this.map = _this.level.getMap();\n _this.mapSizeY = _this.map.length;\n _this.mapSizeX = _this.map[0].length;\n _this.rotationStep = 0.5;\n _this.rotationToNextCase = {};\n _this.rotationToNextCase[0] = { \"mx\": 1, \"my\": 0 };\n _this.rotationToNextCase[0.5] = { \"mx\": 0, \"my\": 1 };\n _this.rotationToNextCase[1.0] = { \"mx\": -1, \"my\": 0 };\n _this.rotationToNextCase[1.5] = { \"mx\": 0, \"my\": -1 };\n _this.rotationToNextCase[-0.5] = { \"mx\": 0, \"my\": -1 };\n _this.rotationToNextCase[-1.0] = { \"mx\": -1, \"my\": 0 };\n _this.rotationToNextCase[-1.5] = { \"mx\": 0, \"my\": 1 };\n return _this;\n }\n BotMotionEngine.prototype.setUp = function (car, lidar) {\n this.car = car;\n this.lidar = lidar;\n this.state = [];\n for (var y = 0; y < lidar.pts; y++) {\n var line = [];\n for (var x = 0; x < lidar.pts; x++) {\n line.push(_global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].DEFAULT);\n }\n this.state.push(line);\n }\n this.car.v = 0;\n this.detectInteractions();\n };\n BotMotionEngine.prototype.turnLeft = function () {\n this.car.rotation -= this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BotMotionEngine.prototype.turnRight = function () {\n this.car.rotation += this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BotMotionEngine.prototype.moveUp = function () {\n this.car.v = 1;\n };\n BotMotionEngine.prototype.moveDown = function () {\n this.car.v = -1;\n };\n BotMotionEngine.prototype.isRoad = function (nx, ny) {\n if (ny < 0 || ny >= this.mapSizeY || nx < 0 || nx >= this.mapSizeX || this.map[ny][nx] == 0) {\n return false;\n }\n return true;\n };\n BotMotionEngine.prototype.autoRotation = function () {\n var right_dist = _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] + (_global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 3);\n var left_dist = _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] - (_global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 3.5);\n var same_dist = _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n if (this.car.next_road) {\n var y_dist = Math.abs(((this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) - this.car.y) * this.car.next_road.outroad_np.my);\n var x_dist = Math.abs(((this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) - this.car.x) * this.car.next_road.outroad_np.mx);\n if (this.car.next_road.rotation_type == 0) {\n if (y_dist < right_dist && x_dist < right_dist) {\n this.car.haveTurned = true;\n this.car.rotation = this.car.rotation += Math.PI / 2;\n this.car.rotation = this.car.rotation % (2 * Math.PI);\n this.car.next_road = undefined;\n return;\n }\n }\n if (this.car.next_road.rotation_type == 1) {\n if (y_dist < left_dist && x_dist < left_dist) {\n this.car.haveTurned = true;\n this.car.rotation = this.car.rotation -= Math.PI / 2;\n this.car.rotation = this.car.rotation % (2 * Math.PI);\n this.car.next_road = undefined;\n return;\n }\n }\n if (this.car.next_road.rotation_type == 2) {\n if (y_dist < same_dist && x_dist < same_dist) {\n this.car.haveTurned = true;\n this.car.rotation = this.car.rotation -= Math.PI;\n this.car.rotation = this.car.rotation % (2 * Math.PI);\n if (y_dist != 0 && this.car.x < this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.x = this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.y = this.car.next_road.outroad.y;\n }\n else if (y_dist != 0 && this.car.x > this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.x = this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.y = this.car.next_road.outroad.y;\n }\n else if (x_dist != 0 && this.car.y < this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.y = this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.x = this.car.next_road.outroad.x;\n }\n else if (x_dist != 0 && this.car.y > this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.y = this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.x = this.car.next_road.outroad.x;\n }\n this.car.next_road = undefined;\n return;\n }\n }\n }\n else {\n var key = this.car.rotation / Math.PI;\n var key_r = ((this.car.rotation / Math.PI) + 0.5) % 2;\n var key_l = ((this.car.rotation / Math.PI) - 0.5) % 2;\n var is_next_pos = this.rotationToNextCase[key];\n var is_next_pos_r = this.rotationToNextCase[key_r];\n var is_next_pos_l = this.rotationToNextCase[key_l];\n var turn = false;\n var nx = this.car.mx + is_next_pos.mx;\n var ny = this.car.my + is_next_pos.my;\n if (!this.isRoad(nx, ny)) {\n turn = true;\n }\n else if (!this.car.haveTurned && !this.car.turnedRandom) {\n this.car.turnedRandom = Math.random();\n }\n else if (!this.car.haveTurned && this.car.turnedRandom < 0.33 && this.isRoad(this.car.mx + is_next_pos_r.mx, this.car.my + is_next_pos_r.my)) {\n turn = true;\n }\n else if (!this.car.haveTurned && this.car.turnedRandom > 0.66 && this.isRoad(this.car.mx + is_next_pos_l.mx, this.car.my + is_next_pos_l.my)) {\n turn = true;\n }\n if (turn) {\n var possibles_rotations = [(key + 0.5) % 2., (key - 0.5) % 2., null];\n for (var p = 0; p < possibles_rotations.length; p++) {\n var next_pos = void 0;\n if (possibles_rotations[p] != null) {\n next_pos = this.rotationToNextCase[possibles_rotations[p]];\n }\n else {\n next_pos = { \"mx\": 0, \"my\": 0 };\n }\n var px = this.car.mx + next_pos.mx;\n var py = this.car.my + next_pos.my;\n if (this.isRoad(px, py)) {\n this.car.next_road = {\n \"outroad\": { y: ny * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"], x: nx * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] },\n \"outroad_np\": is_next_pos,\n \"rotation_type\": p,\n };\n return;\n }\n }\n }\n }\n };\n BotMotionEngine.prototype.step = function (delta) {\n if (this.state.toString().indexOf(\",\" + _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR.toString()) != -1) {\n this.car.v = 0;\n }\n else {\n this.car.v = 0.8;\n this.autoRotation();\n }\n this.car.x += this.car.v * Math.cos(this.car.rotation) * delta;\n this.car.y += this.car.v * Math.sin(this.car.rotation) * delta;\n this.car.mx = Math.floor(this.car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.my = Math.floor(this.car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.checkAndsetNewRoad();\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n var _a = this.detectInteractions(), agent_col = _a.agent_col, on_road = _a.on_road;\n if (agent_col.length > 0) {\n this.car.v = 0;\n }\n return { agent_col: agent_col, on_road: on_road };\n };\n return BotMotionEngine;\n}(_motion_engine__WEBPACK_IMPORTED_MODULE_0__[\"MotionEngine\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/bot_motion_engine.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BasicMotionEngine\", function() { return BasicMotionEngine; });\n/* harmony import */ var _motion_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./motion_engine */ \"./src/motion_engine.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar BasicMotionEngine = (function (_super) {\n __extends(BasicMotionEngine, _super);\n function BasicMotionEngine(level, options) {\n var _this = _super.call(this, level) || this;\n _this.rotationStep = options.rotationStep || 0.5;\n _this.actions = options.actions || [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"];\n return _this;\n }\n BasicMotionEngine.prototype.setUp = function (car, lidar) {\n this.car = car;\n this.lidar = lidar;\n this.state = [];\n for (var y = 0; y < lidar.pts; y++) {\n var line = [];\n for (var x = 0; x < lidar.pts; x++) {\n line.push(_global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].DEFAULT);\n }\n this.state.push(line);\n }\n this.setUpKeyboard();\n this.car.v = 0;\n this.detectInteractions();\n };\n BasicMotionEngine.prototype.setUpKeyboard = function () {\n var _this = this;\n var left = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](37);\n var up = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](38);\n var right = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](39);\n var down = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](40);\n if (this.actions.indexOf(\"LEFT\") != -1)\n left.press = function () { _this.turnLeft(); };\n if (this.actions.indexOf(\"RIGHT\") != -1)\n right.press = function () { _this.turnRight(); };\n if (this.actions.indexOf(\"UP\") != -1) {\n up.press = function () { _this.moveForward(); };\n up.release = function () {\n _this.car.v = 0;\n };\n }\n if (this.actions.indexOf(\"DOWN\") != -1) {\n down.press = function () { _this.moveBackward(); };\n down.release = function () {\n _this.car.v = 0;\n };\n }\n };\n BasicMotionEngine.prototype.turnLeft = function () {\n this.car.rotation -= this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BasicMotionEngine.prototype.turnRight = function () {\n this.car.rotation += this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BasicMotionEngine.prototype.moveForward = function () {\n this.car.v = 1;\n };\n BasicMotionEngine.prototype.moveBackward = function () {\n this.car.v = -1;\n };\n BasicMotionEngine.prototype.actionStep = function (delta, action) {\n if (this.actions[action] == \"LEFT\") {\n this.turnLeft();\n }\n if (this.actions[action] == \"RIGHT\") {\n this.turnRight();\n }\n if (this.actions[action] == \"UP\") {\n this.moveForward();\n }\n if (this.actions[action] == \"DOWN\") {\n this.moveBackward();\n }\n var _a = this.step(delta), agent_col = _a.agent_col, on_road = _a.on_road;\n this.car.v = 0;\n return { agent_col: agent_col, on_road: on_road };\n };\n BasicMotionEngine.prototype.actionSpace = function () {\n return {\n type: \"Discrete\",\n size: 1,\n range: [0, 1, 2, 3, 4]\n };\n };\n BasicMotionEngine.prototype.step = function (delta) {\n this.car.x += this.car.v * Math.cos(this.car.rotation) * delta;\n this.car.y += this.car.v * Math.sin(this.car.rotation) * delta;\n this.car.mx = Math.floor(this.car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.my = Math.floor(this.car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.checkAndsetNewRoad();\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n var _a = this.detectInteractions(), agent_col = _a.agent_col, on_road = _a.on_road;\n if (agent_col.length > 0) {\n this.car.v = 0;\n this.car.vy = 0;\n }\n return { agent_col: agent_col, on_road: on_road };\n };\n return BasicMotionEngine;\n}(_motion_engine__WEBPACK_IMPORTED_MODULE_0__[\"MotionEngine\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/basic_motion_engine.ts?");
/***/ }),
@@ -131,7 +119,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Car\", function() { return Car; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar Global_carId = 0;\nvar Car = (function () {\n function Car(level, info, textures, options) {\n if (options === void 0) { options = {}; }\n var _this = this;\n this.level = level;\n options.image = options.image || _global__WEBPACK_IMPORTED_MODULE_0__[\"CAR_IMG\"].DEFAULT;\n options.lidar = options.lidar || false;\n options.lidarInfo = options.lidarInfo || { pts: 5, width: 4, height: 5, pos: 0 };\n this.core = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Sprite\"](textures[options.image]);\n this.info = info;\n this.core.scale.x = 0.8;\n this.core.scale.y = 0.8;\n this.core.anchor.x = 0.5;\n this.core.anchor.y = 0.5;\n this.core.road = undefined;\n this.core.carId = Global_carId;\n Global_carId += 1;\n this.core.agent = false;\n this.core.obstacle = true;\n this.core.mapId = _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].CAR;\n if (options.lidar) {\n this.createLidar(options.lidarInfo);\n this.core.lidar = this.lidar;\n }\n if (options.motionEngine) {\n this.motion = options.motionEngine;\n this.motion.setUp(this.core, this.lidar);\n this.core.rotationStep = 0.5;\n }\n else {\n this.core.rotationStep = 0.5;\n }\n this.core.mx = this.info.mx;\n this.core.my = this.info.my;\n this.core.x = (this.info.mx) * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"];\n this.core.y = (this.info.my) * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"];\n this.core.checkAndsetNewRoad = function (road) { return _this.checkAndsetNewRoad(road); };\n var road = this.level.getRoad(this.core.my, this.core.mx);\n this.core.line = 0;\n if (road) {\n road.setCarPosition(this.core, this.info.line);\n }\n }\n Car.prototype.checkAndsetNewRoad = function (n_road) {\n var current_road = this.core.road;\n if (!n_road) {\n n_road = this.level.getRoad(this.core.my, this.core.mx);\n ;\n }\n if (n_road != current_road) {\n if (current_road) {\n current_road.cars.splice(current_road.cars.indexOf(this.core.carId), 1);\n }\n this.core.road = n_road;\n this.core.haveTurned = false;\n this.turnedRandom = undefined;\n if (n_road)\n n_road.cars.push(this.core.carId);\n }\n };\n Car.prototype.reset = function () {\n this.core.mx = this.info.mx;\n this.core.my = this.info.my;\n var road = this.level.getRoad(this.core.my, this.core.mx);\n if (road) {\n road.setCarPosition(this.core, this.info.line);\n }\n };\n Car.prototype.getState = function (linear) {\n if (linear === void 0) { linear = false; }\n if (!linear)\n return this.motion.state.map(function (arr) { return arr.slice(); });\n else {\n var state_1 = [];\n this.motion.state.map(function (row) { state_1 = state_1.concat(row); });\n return state_1;\n }\n };\n Car.prototype.step = function (delta, action) {\n if (action === void 0) { action = null; }\n if (action == null) {\n var _a = this.motion.step(delta), agent_col = _a.agent_col, on_road = _a.on_road;\n }\n else {\n var _b = this.motion.actionStep(delta, action), agent_col = _b.agent_col, on_road = _b.on_road;\n }\n return { agent_col: agent_col, on_road: on_road };\n };\n Car.prototype.createLidar = function (lidarOptions) {\n this.lidar = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Container\"]();\n var area = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n area.pt = false;\n area.alpha = 0.5;\n area.beginFill(0x515151);\n area.drawRect(0, 0, this.core.width * lidarOptions.width, this.core.height * lidarOptions.height);\n area.endFill();\n var x_step = area.width / lidarOptions.pts;\n var y_step = area.height / lidarOptions.pts;\n for (var xs = lidarOptions.pts - 1; xs >= 0; xs--) {\n for (var ys = 0; ys < lidarOptions.pts; ys++) {\n var x = (x_step / 4) + xs * x_step;\n var y = (y_step / 4) + ys * y_step;\n var pt = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n pt.pt = true;\n pt.beginFill(0xffffff);\n pt.drawRect(x, y, 5, 5);\n pt.endFill();\n this.lidar.addChild(pt);\n }\n }\n this.lidar.pts = lidarOptions.pts;\n this.lidar.addChild(area);\n this.lidar.x = this.core.x;\n this.lidar.y = this.core.y;\n this.lidar.pivot.y = this.lidar.height / 2;\n this.lidar.pivot.x = this.core.width / 2 - (lidarOptions.pos * this.core.width);\n this.lidar.rotation = this.core.rotation;\n };\n return Car;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/car.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Car\", function() { return Car; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar Global_carId = 0;\nvar Car = (function () {\n function Car(level, info, textures, options) {\n if (options === void 0) { options = {}; }\n var _this = this;\n this.level = level;\n options.image = options.image || _global__WEBPACK_IMPORTED_MODULE_0__[\"CAR_IMG\"].DEFAULT;\n options.lidar = options.lidar || false;\n options.lidarInfo = options.lidarInfo || { pts: 5, width: 4, height: 5, pos: 0 };\n this.core = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Sprite\"](textures[options.image]);\n this.info = info;\n this.core.scale.x = 0.8;\n this.core.scale.y = 0.8;\n this.core.anchor.x = 0.5;\n this.core.anchor.y = 0.5;\n this.core.road = undefined;\n this.core.carId = Global_carId;\n Global_carId += 1;\n this.core.agent = false;\n this.core.obstacle = true;\n this.core.mapId = _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].CAR;\n if (options.lidar) {\n this.createLidar(options.lidarInfo);\n this.core.lidar = this.lidar;\n }\n if (options.motionEngine) {\n this.motion = options.motionEngine;\n this.motion.setUp(this.core, this.lidar);\n this.core.rotationStep = 0.5;\n }\n else {\n this.core.rotationStep = 0.5;\n }\n this.core.mx = this.info.mx;\n this.core.my = this.info.my;\n this.core.x = (this.info.mx) * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"];\n this.core.y = (this.info.my) * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"];\n this.core.checkAndsetNewRoad = function (road) { return _this.checkAndsetNewRoad(road); };\n var road = this.level.getRoad(this.core.my, this.core.mx);\n this.core.line = 0;\n if (road) {\n road.setCarPosition(this.core, this.info.line);\n }\n }\n Car.prototype.checkAndsetNewRoad = function (n_road) {\n var current_road = this.core.road;\n if (!n_road) {\n n_road = this.level.getRoad(this.core.my, this.core.mx);\n ;\n }\n if (n_road != current_road) {\n if (current_road) {\n current_road.cars.splice(current_road.cars.indexOf(this.core.carId), 1);\n }\n this.core.road = n_road;\n this.core.haveTurned = false;\n this.turnedRandom = undefined;\n if (n_road)\n n_road.cars.push(this.core.carId);\n }\n };\n Car.prototype.reset = function () {\n this.core.mx = this.info.mx;\n this.core.my = this.info.my;\n var road = this.level.getRoad(this.core.my, this.core.mx);\n if (road) {\n road.setCarPosition(this.core, this.info.line);\n }\n };\n Car.prototype.getState = function (linear) {\n if (linear === void 0) { linear = false; }\n if (!linear)\n return this.motion.state.map(function (arr) { return arr.slice(); });\n else {\n var state_1 = [];\n this.motion.state.map(function (row) { state_1 = state_1.concat(row); });\n return state_1;\n }\n };\n Car.prototype.step = function (delta, action) {\n if (action === void 0) { action = null; }\n if (action == null) {\n var _a = this.motion.step(delta), agent_col = _a.agent_col, on_road = _a.on_road;\n }\n else {\n var _b = this.motion.actionStep(delta, action), agent_col = _b.agent_col, on_road = _b.on_road;\n }\n return { agent_col: agent_col, on_road: on_road };\n };\n Car.prototype.createLidar = function (lidarOptions) {\n lidarOptions.pts = lidarOptions.pts || 5;\n lidarOptions.width = lidarOptions.width || 4;\n lidarOptions.height = lidarOptions.height || 5;\n lidarOptions.pos = lidarOptions.pos || 0;\n this.lidar = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Container\"]();\n var area = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n area.pt = false;\n area.beginFill(0x515151);\n area.drawRect(0, 0, this.core.width * lidarOptions.width, this.core.height * lidarOptions.height);\n area.endFill();\n var x_step = area.width / lidarOptions.pts;\n var y_step = area.height / lidarOptions.pts;\n for (var xs = lidarOptions.pts - 1; xs >= 0; xs--) {\n for (var ys = 0; ys < lidarOptions.pts; ys++) {\n var x = (x_step / 4) + xs * x_step;\n var y = (y_step / 4) + ys * y_step;\n var pt = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n pt.pt = true;\n pt.beginFill(0xffffff);\n pt.drawRect(x, y, 5, 5);\n pt.endFill();\n this.lidar.addChild(pt);\n }\n }\n this.lidar.pts = lidarOptions.pts;\n this.lidar.addChild(area);\n this.lidar.x = this.core.x;\n this.lidar.y = this.core.y;\n this.lidar.pivot.y = this.lidar.height / 2;\n this.lidar.pivot.x = this.core.width / 2 - (lidarOptions.pos * this.core.width);\n this.lidar.rotation = this.core.rotation;\n };\n return Car;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/car.ts?");
/***/ }),
@@ -155,7 +143,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Editor\", function() { return Editor; });\n/* harmony import */ var _asset_manager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./asset_manager */ \"./src/asset_manager.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _world__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./world */ \"./src/world.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar Editor = (function (_super) {\n __extends(Editor, _super);\n function Editor(levelContent, canvasId) {\n var _this = _super.call(this, levelContent, canvasId) || this;\n _this.selectedItems = null;\n _this.am = new _asset_manager__WEBPACK_IMPORTED_MODULE_0__[\"AssetManger\"](_this);\n return _this;\n }\n Editor.prototype._setEvents = function () {\n };\n Editor.prototype._setup = function (info) {\n var _this = this;\n this._setEvents();\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n this.am.createMap(this.map, info, textures, false);\n this.am.createCars(this.map, info, textures);\n if (info.agent)\n this.agent = this.am.createAgent(this.map, info, textures);\n var that = this;\n for (var i = 0; i < this.envs.length; i++) {\n this.envs[i].interactive = true;\n this.envs[i].on(\"rightclick\", function () { that.removeItem(this); });\n }\n for (var i = 0; i < this.am.assets.length; i++) {\n this.am.assets[i].interactive = true;\n this.am.assets[i].on(\"rightclick\", function () { that.removeItem(this); });\n }\n this.app.ticker.add(function (delta) { return _this.loop(delta); });\n };\n Editor.prototype.resize = function (width, height) {\n this.app.renderer.resize(width * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"], height * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n };\n Editor.prototype.getSelectedItems = function () {\n return this.selectedItems;\n };\n Editor.prototype.selectedItem = function (item) {\n if (this.selectedItems) {\n this.app.stage.removeChild(this.selectedItems);\n }\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n this.selectedItems = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[item.image]);\n this.selectedItems.type = item.type;\n this.selectedItems.image = item.image;\n this.selectedItems.data = item.data;\n this.selectedItems.x = 0;\n this.selectedItems.y = 0;\n this.app.stage.addChild(this.selectedItems);\n };\n Editor.prototype.removeItem = function (item) {\n if (item.lidar) {\n this.app.stage.removeChild(item.lidar);\n }\n if (item.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR) {\n item.road.cars.splice(item.road.cars.indexOf(item.car_id), 1);\n }\n if (item.agent)\n this.agent = undefined;\n this.app.stage.removeChild(item);\n item.isremove = true;\n console.log(item.isremove, item.agent, this.agent);\n };\n Editor.prototype.exportMap = function (width, height, file_name, download) {\n return this.am.exportMap(width, height, file_name, download);\n };\n Editor.prototype.setCurrentItem = function () {\n this.am.addAsset(this.selectedItems);\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n var that = this;\n if (this.selectedItems.type == \"road\") {\n this.am.createRoad({\n mx: Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n my: Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n type: this.selectedItems.data\n }, textures, this.selectedItems.data);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"car\") {\n this.am.createCars(this.map, { cars: [{\n \"mx\": Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"my\": Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"rotation\": 0,\n \"line\": 0,\n }] }, textures);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"agent\" && this.agent == undefined) {\n this.agent = this.am.createAgent(this.map, { agent: {\n \"mx\": Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"my\": Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"rotation\": 0,\n \"line\": 0,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotation_step\": 0.5,\n \"actions\": [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"]\n }\n }\n } }, textures);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"asset\") {\n this.am.createAsset(this.selectedItems.image, { x: this.selectedItems.x, y: this.selectedItems.y }, textures, this.selectedItems.data);\n this.am.assets[this.am.assets.length - 1].interactive = true;\n this.am.assets[this.am.assets.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n this.app.stage.removeChild(this.selectedItems);\n this.selectedItems = null;\n };\n return Editor;\n}(_world__WEBPACK_IMPORTED_MODULE_2__[\"World\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/editor.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Editor\", function() { return Editor; });\n/* harmony import */ var _asset_manager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./asset_manager */ \"./src/asset_manager.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _world__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./world */ \"./src/world.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar Editor = (function (_super) {\n __extends(Editor, _super);\n function Editor(levelContent, canvasId) {\n var _this = _super.call(this, levelContent, canvasId) || this;\n _this.selectedItems = null;\n _this.am = new _asset_manager__WEBPACK_IMPORTED_MODULE_0__[\"AssetManger\"](_this);\n return _this;\n }\n Editor.prototype._setEvents = function () {\n };\n Editor.prototype._setup = function (info) {\n var _this = this;\n this._setEvents();\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n this.am.createMap(this.map, info, textures, false);\n this.am.createCars(this.map, info, textures);\n if (info.agent)\n this.agent = this.am.createAgent(this.map, info, textures);\n var that = this;\n for (var i = 0; i < this.envs.length; i++) {\n this.envs[i].interactive = true;\n this.envs[i].on(\"rightclick\", function () { that.removeItem(this); });\n }\n for (var i = 0; i < this.am.assets.length; i++) {\n this.am.assets[i].interactive = true;\n this.am.assets[i].on(\"rightclick\", function () { that.removeItem(this); });\n }\n this.app.ticker.add(function (delta) { return _this.loop(delta); });\n };\n Editor.prototype.resize = function (width, height) {\n this.app.renderer.resize(width * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"], height * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n };\n Editor.prototype.getSelectedItems = function () {\n return this.selectedItems;\n };\n Editor.prototype.selectedItem = function (item) {\n if (this.selectedItems) {\n this.app.stage.removeChild(this.selectedItems);\n }\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n this.selectedItems = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[item.image]);\n this.selectedItems.type = item.type;\n this.selectedItems.image = item.image;\n this.selectedItems.data = item.data;\n this.selectedItems.x = 0;\n this.selectedItems.y = 0;\n this.app.stage.addChild(this.selectedItems);\n };\n Editor.prototype.removeItem = function (item) {\n if (item.lidar) {\n this.app.stage.removeChild(item.lidar);\n }\n if (item.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR) {\n item.road.cars.splice(item.road.cars.indexOf(item.car_id), 1);\n }\n if (item.agent)\n this.agent = undefined;\n this.app.stage.removeChild(item);\n item.isremove = true;\n };\n Editor.prototype.exportMap = function (width, height, file_name, download) {\n return this.am.exportMap(width, height, file_name, download);\n };\n Editor.prototype.setCurrentItem = function () {\n this.am.addAsset(this.selectedItems);\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n var that = this;\n if (this.selectedItems.type == \"road\") {\n this.am.createRoad({\n mx: Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n my: Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n type: this.selectedItems.data\n }, textures, this.selectedItems.data);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"car\") {\n this.am.createCars(this.map, { cars: [{\n \"mx\": Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"my\": Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"rotation\": 0,\n \"line\": 0,\n }] }, textures);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"agent\" && this.agent == undefined) {\n this.agent = this.am.createAgent(this.map, { agent: {\n \"mx\": Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"my\": Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"rotation\": 0,\n \"line\": 0,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotation_step\": 0.5,\n \"actions\": [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"]\n }\n }\n } }, textures);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"asset\") {\n this.am.createAsset(this.selectedItems.image, { x: this.selectedItems.x, y: this.selectedItems.y }, textures, this.selectedItems.data);\n this.am.assets[this.am.assets.length - 1].interactive = true;\n this.am.assets[this.am.assets.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n this.app.stage.removeChild(this.selectedItems);\n this.selectedItems = null;\n };\n return Editor;\n}(_world__WEBPACK_IMPORTED_MODULE_2__[\"World\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/editor.ts?");
/***/ }),
@@ -167,7 +155,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"embeddedUrl\", function() { return embeddedUrl; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"embeddedContent\", function() { return embeddedContent; });\n/* harmony import */ var _embedded_level_full_city__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./embedded/level/full_city */ \"./src/embedded/level/full_city.ts\");\n/* harmony import */ var _embedded_level_level_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./embedded/level/level_1 */ \"./src/embedded/level/level_1.ts\");\n\n\n;\nvar embeddedUrl = {\n fullCity: \"embedded://level/fullCity\",\n level1: \"embedded://level/level1\"\n};\nvar embeddedContent = {\n level: {\n fullCity: _embedded_level_full_city__WEBPACK_IMPORTED_MODULE_0__[\"fullCity\"],\n level1: _embedded_level_level_1__WEBPACK_IMPORTED_MODULE_1__[\"level1\"]\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"embeddedUrl\", function() { return embeddedUrl; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"embeddedContent\", function() { return embeddedContent; });\n/* harmony import */ var _embedded_level_full_city__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./embedded/level/full_city */ \"./src/embedded/level/full_city.ts\");\n/* harmony import */ var _embedded_level_level_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./embedded/level/level_1 */ \"./src/embedded/level/level_1.ts\");\n/* harmony import */ var _embedded_level_level_0__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./embedded/level/level_0 */ \"./src/embedded/level/level_0.ts\");\n\n\n\n;\nvar embeddedUrl = {\n fullCity: \"embedded://level/fullCity\",\n level1: \"embedded://level/level1\",\n level0: \"embedded://level/level0\"\n};\nvar embeddedContent = {\n level: {\n fullCity: _embedded_level_full_city__WEBPACK_IMPORTED_MODULE_0__[\"fullCity\"],\n level1: _embedded_level_level_1__WEBPACK_IMPORTED_MODULE_1__[\"level1\"],\n level0: _embedded_level_level_0__WEBPACK_IMPORTED_MODULE_2__[\"level0\"]\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded.ts?");
/***/ }),
@@ -183,6 +171,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ }),
+/***/ "./src/embedded/level/level_0.ts":
+/*!***************************************!*\
+ !*** ./src/embedded/level/level_0.ts ***!
+ \***************************************/
+/*! exports provided: level0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"level0\", function() { return level0; });\nvar level0 = {\n \"cars\": [\n {\n \"mx\": 3,\n \"my\": 2,\n \"line\": 0\n },\n {\n \"mx\": 1,\n \"my\": 2,\n \"line\": 0\n },\n {\n \"mx\": 2,\n \"my\": 3,\n \"line\": 0\n },\n {\n \"mx\": 3,\n \"my\": 1,\n \"line\": 0\n },\n {\n \"mx\": 1,\n \"my\": 1,\n \"line\": 0\n }\n ],\n \"house\": [\n {\n \"x\": 263,\n \"y\": 108\n },\n {\n \"x\": 112,\n \"y\": 258\n }\n ],\n \"house3\": [\n {\n \"x\": 262,\n \"y\": 16\n }\n ],\n \"bench\": [\n {\n \"x\": 135,\n \"y\": 34\n }\n ],\n \"tree\": [\n {\n \"x\": 124,\n \"y\": 134\n },\n {\n \"x\": 7,\n \"y\": 11\n },\n {\n \"x\": 69,\n \"y\": 10\n },\n {\n \"x\": 19,\n \"y\": 238\n },\n {\n \"x\": 5,\n \"y\": 133\n },\n {\n \"x\": 260,\n \"y\": 211\n }\n ],\n \"map\": [\n [\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n \"↱\",\n \"↔\",\n \"↰\",\n 0\n ],\n [\n 0,\n \"↕\",\n 0,\n \"↕\",\n 0\n ],\n [\n 0,\n \"↳\",\n \"↠\",\n \"↲\",\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ],\n \"agent\": {\n \"mx\": 2,\n \"my\": 1,\n \"line\": 1,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotationStep\": 0.5,\n \"actions\": [\n \"UP\",\n \"LEFT\",\n \"RIGHT\",\n \"DOWN\",\n \"WAIT\"\n ]\n }\n }\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded/level/level_0.ts?");
+
+/***/ }),
+
/***/ "./src/embedded/level/level_1.ts":
/*!***************************************!*\
!*** ./src/embedded/level/level_1.ts ***!
@@ -215,7 +215,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _metacar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./metacar */ \"./src/metacar.ts\");\n/* harmony import */ var _embedded__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./embedded */ \"./src/embedded.ts\");\n/* harmony import */ var _metacar_editor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./metacar_editor */ \"./src/metacar_editor.ts\");\n\n\n\nvar metacar = {\n env: _metacar__WEBPACK_IMPORTED_MODULE_0__[\"MetaCar\"],\n editor: _metacar_editor__WEBPACK_IMPORTED_MODULE_2__[\"MetaCarEditor\"],\n level: _embedded__WEBPACK_IMPORTED_MODULE_1__[\"embeddedUrl\"]\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (metacar);\n\n\n//# sourceURL=webpack://metacar/./src/index.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _metacar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./metacar */ \"./src/metacar.ts\");\n/* harmony import */ var _embedded__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./embedded */ \"./src/embedded.ts\");\n/* harmony import */ var _metacar_editor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./metacar_editor */ \"./src/metacar_editor.ts\");\n/* harmony import */ var _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./basic_motion_engine */ \"./src/basic_motion_engine.ts\");\n/* harmony import */ var _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./control_motion_engine */ \"./src/control_motion_engine.ts\");\n\n\n\n\n\nvar metacar = {\n env: _metacar__WEBPACK_IMPORTED_MODULE_0__[\"MetaCar\"],\n editor: _metacar_editor__WEBPACK_IMPORTED_MODULE_2__[\"MetaCarEditor\"],\n level: _embedded__WEBPACK_IMPORTED_MODULE_1__[\"embeddedUrl\"],\n motion: {\n BasicMotion: _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"],\n ControlMotion: _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__[\"ControlMotionEngine\"]\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (metacar);\n\n\n//# sourceURL=webpack://metacar/./src/index.ts?");
/***/ }),
@@ -227,7 +227,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _met
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Level\", function() { return Level; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _asset_manager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./asset_manager */ \"./src/asset_manager.ts\");\n/* harmony import */ var _world__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./world */ \"./src/world.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar Level = (function (_super) {\n __extends(Level, _super);\n function Level(levelContent, canvasId) {\n var _this = _super.call(this, levelContent, canvasId) || this;\n _this.map = _this.info.map;\n _this.am = new _asset_manager__WEBPACK_IMPORTED_MODULE_1__[\"AssetManger\"](_this);\n return _this;\n }\n Level.prototype._setup = function (info) {\n var _this = this;\n var textures = _global__WEBPACK_IMPORTED_MODULE_0__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_0__[\"JSON_TEXTURES\"]].textures;\n this.am.createMap(this.map, info, textures);\n this.am.createCars(this.map, info, textures);\n if (info.agent)\n this.agent = this.am.createAgent(this.map, info, textures);\n this.app.ticker.add(function (delta) { return _this.loop(delta); });\n };\n Level.prototype.reset = function () {\n this.agent.reset();\n };\n Level.prototype.setReward = function (agent_col, on_road, action) {\n var reward = -0.1;\n if (action == 0 || this.agent.core.v == 1)\n reward += 0.5;\n if (agent_col.length > 0) {\n reward = -10;\n }\n else if (!on_road) {\n reward = -10;\n }\n return reward;\n };\n Level.prototype.step = function (delta, action) {\n if (action === void 0) { action = null; }\n for (var c = 0; c < this.cars.length; c++) {\n if (this.cars[c].lidar && !this.cars[c].core.agent)\n this.cars[c].step(delta);\n }\n if (this.agent) {\n var _a = this.agent.step(delta, action), agent_col = _a.agent_col, on_road = _a.on_road;\n var reward = this.setReward(agent_col, on_road, action);\n return reward;\n }\n return 0;\n };\n Level.prototype.stopRender = function () {\n this.app.ticker.stop();\n };\n return Level;\n}(_world__WEBPACK_IMPORTED_MODULE_2__[\"World\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/level.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Level\", function() { return Level; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _asset_manager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./asset_manager */ \"./src/asset_manager.ts\");\n/* harmony import */ var _world__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./world */ \"./src/world.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar Level = (function (_super) {\n __extends(Level, _super);\n function Level(levelContent, canvasId) {\n var _this = _super.call(this, levelContent, canvasId) || this;\n _this.map = _this.info.map;\n _this.am = new _asset_manager__WEBPACK_IMPORTED_MODULE_1__[\"AssetManger\"](_this);\n return _this;\n }\n Level.prototype.setAgentMotion = function (motion, options) {\n this.am.setAgentMotion(motion, options);\n };\n Level.prototype.setAgentLidar = function (options) {\n this.am.setAgentLidar(options);\n };\n Level.prototype._setup = function (info) {\n var _this = this;\n var textures = _global__WEBPACK_IMPORTED_MODULE_0__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_0__[\"JSON_TEXTURES\"]].textures;\n this.am.createMap(this.map, info, textures);\n this.am.createCars(this.map, info, textures);\n if (info.agent)\n this.agent = this.am.createAgent(this.map, info, textures);\n this.app.ticker.add(function (delta) { return _this.loop(delta); });\n };\n Level.prototype.reset = function () {\n this.agent.reset();\n };\n Level.prototype.setReward = function (agent_col, on_road, action) {\n var reward = -0.1;\n if (action == 0 || this.agent.core.v == 1)\n reward += 0.5;\n if (agent_col.length > 0) {\n reward = -10;\n }\n else if (!on_road) {\n reward = -10;\n }\n return reward;\n };\n Level.prototype.step = function (delta, action) {\n if (action === void 0) { action = null; }\n if (this.agent) {\n var _a = this.agent.step(delta, action), agent_col = _a.agent_col, on_road = _a.on_road;\n var reward = this.setReward(agent_col, on_road, action);\n return reward;\n }\n return 0;\n };\n Level.prototype.stopRender = function () {\n this.app.ticker.stop();\n };\n return Level;\n}(_world__WEBPACK_IMPORTED_MODULE_2__[\"World\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/level.ts?");
/***/ }),
@@ -239,7 +239,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MetaCar\", function() { return MetaCar; });\n/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./level */ \"./src/level.ts\");\n/* harmony import */ var _ui_event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui_event */ \"./src/ui_event.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\n\n\n\nvar MetaCar = (function () {\n function MetaCar(canvasId, levelToLoad) {\n this.eventList = [\"train\", \"play\", \"stop\", \"reset_env\", \"load\"];\n if (!canvasId || !levelToLoad) {\n console.error(\"You must specify the canvasId and the levelToLoad\");\n }\n this.canvasId = canvasId;\n this.levelToLoad = levelToLoad;\n }\n MetaCar.prototype.load = function () {\n var _this = this;\n return new Promise(function (resolve, reject) {\n console.log(typeof _this.levelToLoad, _this.levelToLoad);\n if (typeof _this.levelToLoad == \"string\") {\n _utils__WEBPACK_IMPORTED_MODULE_2__[\"loadCustomURL\"](_this.levelToLoad, function (content) {\n _this.level = new _level__WEBPACK_IMPORTED_MODULE_0__[\"Level\"](content, _this.canvasId);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); });\n resolve();\n });\n }\n else {\n _this.level = new _level__WEBPACK_IMPORTED_MODULE_0__[\"Level\"](_this.levelToLoad, _this.canvasId);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); });\n resolve();\n }\n });\n };\n MetaCar.prototype.addEvent = function (eventName, fc, options) {\n var index = this.eventList.indexOf(eventName);\n if (index == -1) {\n this.event.onCustomEvent(eventName, fc);\n return;\n }\n var event = this.eventList[index];\n if (event != \"load\") {\n this.eventCallback[index](fc);\n }\n else {\n this.eventCallback[index](fc, options);\n }\n };\n MetaCar.prototype.render = function (val) {\n this.level.render(val);\n };\n MetaCar.prototype.save = function (content, file_name) {\n _utils__WEBPACK_IMPORTED_MODULE_2__[\"saveAs\"](content, file_name);\n };\n MetaCar.prototype.actionSpace = function () {\n return this.level.agent.motion.actionSpace();\n };\n MetaCar.prototype.getState = function (linear) {\n if (linear === void 0) { linear = false; }\n return this.level.agent.getState(linear);\n };\n MetaCar.prototype.step = function (action) {\n return this.level.step(1, action);\n };\n MetaCar.prototype.reset = function () {\n this.level.reset();\n };\n MetaCar.prototype.randomRoadPosition = function () {\n var roads = this.level.getRoads();\n var keys = Object.keys(roads);\n keys.sort(function () { return Math.random() - 0.5; });\n for (var k in keys) {\n var road = roads[keys[k]];\n if (road.cars.length == 0) {\n road.setCarPosition(this.level.agent.core);\n break;\n }\n }\n };\n MetaCar.prototype._loop = function (delta) {\n if (this.event.isPlaying()) {\n this.event.playCallback();\n }\n else {\n this.level.step(delta);\n }\n };\n MetaCar.prototype._setEvents = function () {\n var _this = this;\n this.event = new _ui_event__WEBPACK_IMPORTED_MODULE_1__[\"UIEvent\"](this.level, this.canvasId);\n this.eventCallback = [\n function (fc) { return _this.event.onTrain(fc); },\n function (fc) { return _this.event.onPlay(fc); },\n function (fc) { return _this.event.onStop(fc); },\n function (fc) { return _this.event.onResetEnv(fc); },\n function (fc, opt) { return _this.event.onLoad(fc, opt); }\n ];\n };\n return MetaCar;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/metacar.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MetaCar\", function() { return MetaCar; });\n/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./level */ \"./src/level.ts\");\n/* harmony import */ var _ui_event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui_event */ \"./src/ui_event.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\n/* harmony import */ var _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./basic_motion_engine */ \"./src/basic_motion_engine.ts\");\n\n\n\n\nvar MetaCar = (function () {\n function MetaCar(canvasId, levelToLoad) {\n this.eventList = [\"train\", \"play\", \"stop\", \"reset_env\", \"load\"];\n this.agentMotionEngine = _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"];\n this.agentMotionOptions = {};\n if (!canvasId || !levelToLoad) {\n console.error(\"You must specify the canvasId and the levelToLoad\");\n }\n this.canvasId = canvasId;\n this.levelToLoad = levelToLoad;\n }\n MetaCar.prototype.load = function () {\n var _this = this;\n return new Promise(function (resolve, reject) {\n console.log(typeof _this.levelToLoad, _this.levelToLoad);\n if (typeof _this.levelToLoad == \"string\") {\n _utils__WEBPACK_IMPORTED_MODULE_2__[\"loadCustomURL\"](_this.levelToLoad, function (content) {\n _this.level = new _level__WEBPACK_IMPORTED_MODULE_0__[\"Level\"](content, _this.canvasId);\n _this.level.setAgentMotion(_this.agentMotionEngine, _this.agentMotionOptions);\n _this.level.setAgentLidar(_this.agentLidarInfo);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); });\n resolve();\n });\n }\n else {\n _this.level = new _level__WEBPACK_IMPORTED_MODULE_0__[\"Level\"](_this.levelToLoad, _this.canvasId);\n _this.level.setAgentMotion(_this.agentMotionEngine, _this.agentMotionOptions);\n _this.level.setAgentLidar(_this.agentLidarInfo);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); });\n resolve();\n }\n });\n };\n MetaCar.prototype.setAgentLidar = function (options) {\n this.agentLidarInfo = options;\n };\n MetaCar.prototype.setAgentMotion = function (motion, options) {\n this.agentMotionEngine = motion;\n this.agentMotionOptions = options;\n };\n MetaCar.prototype.addEvent = function (eventName, fc, options) {\n var index = this.eventList.indexOf(eventName);\n if (index == -1) {\n this.event.onCustomEvent(eventName, fc);\n return;\n }\n var event = this.eventList[index];\n if (event != \"load\") {\n this.eventCallback[index](fc);\n }\n else {\n this.eventCallback[index](fc, options);\n }\n };\n MetaCar.prototype.render = function (val) {\n this.level.render(val);\n };\n MetaCar.prototype.save = function (content, file_name) {\n _utils__WEBPACK_IMPORTED_MODULE_2__[\"saveAs\"](content, file_name);\n };\n MetaCar.prototype.actionSpace = function () {\n return this.level.agent.motion.actionSpace();\n };\n MetaCar.prototype.getState = function (linear) {\n if (linear === void 0) { linear = false; }\n return this.level.agent.getState(linear);\n };\n MetaCar.prototype.step = function (action) {\n return this.level.step(1, action);\n };\n MetaCar.prototype.reset = function () {\n this.level.reset();\n };\n MetaCar.prototype.randomRoadPosition = function () {\n var roads = this.level.getRoads();\n var keys = Object.keys(roads);\n keys.sort(function () { return Math.random() - 0.5; });\n for (var k in keys) {\n var road = roads[keys[k]];\n if (road.cars.length == 0) {\n road.setCarPosition(this.level.agent.core);\n break;\n }\n }\n };\n MetaCar.prototype._loop = function (delta) {\n if (this.event.isPlaying()) {\n this.event.playCallback();\n }\n else {\n this.level.step(delta);\n }\n };\n MetaCar.prototype._setEvents = function () {\n var _this = this;\n this.event = new _ui_event__WEBPACK_IMPORTED_MODULE_1__[\"UIEvent\"](this.level, this.canvasId);\n this.eventCallback = [\n function (fc) { return _this.event.onTrain(fc); },\n function (fc) { return _this.event.onPlay(fc); },\n function (fc) { return _this.event.onStop(fc); },\n function (fc) { return _this.event.onResetEnv(fc); },\n function (fc, opt) { return _this.event.onLoad(fc, opt); }\n ];\n };\n return MetaCar;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/metacar.ts?");
/***/ }),
@@ -263,7 +263,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MotionEngine\", function() { return MotionEngine; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar MotionEngine = (function () {\n function MotionEngine(level) {\n this.level = level;\n }\n MotionEngine.prototype.boxesIntersect = function (a, b) {\n var ab = a.getBounds();\n var bb = b.getBounds();\n return ab.x + ab.width > bb.x && ab.x < bb.x + bb.width && ab.y + ab.height > bb.y && ab.y < bb.y + bb.height;\n };\n MotionEngine.prototype.detectInteractions = function () {\n var envs = this.level.getEnvs();\n var agent_col = [];\n var lidar_collisions = [];\n var on_road = false;\n for (var i = 0; i < envs.length; i++) {\n if (envs[i] != this.car && envs[i].obstacle && this.boxesIntersect(envs[i], this.car)) {\n agent_col.push(envs[i]);\n }\n else if (envs[i].mapId == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].ROAD && this.boxesIntersect(envs[i], this.car)) {\n on_road = true;\n }\n if (this.boxesIntersect(envs[i], this.lidar)) {\n lidar_collisions.push(envs[i]);\n }\n }\n this.setState(lidar_collisions);\n return { agent_col: agent_col, on_road: on_road };\n };\n MotionEngine.prototype.setState = function (lidar_collisions) {\n var pt_id = 0;\n for (var i = 0; i < this.lidar.children.length; i++) {\n this.lidar.children[i].alpha = 0.1;\n if (this.lidar.children[i].pt) {\n var pt_y = Math.floor(pt_id / this.lidar.pts);\n var pt_x = Math.floor(pt_id % this.lidar.pts);\n this.state[pt_y][pt_x] = _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].DEFAULT;\n for (var a = 0; a < lidar_collisions.length; a++) {\n if (lidar_collisions[a] != this.car) {\n var touch = this.boxesIntersect(lidar_collisions[a], this.lidar.children[i]);\n if (touch && lidar_collisions[a].obstacle) {\n this.lidar.children[i].alpha = 1.;\n }\n if (touch && (lidar_collisions[a].mapId > this.state[pt_y][pt_x] || (lidar_collisions[a].mapId == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].ROAD && this.state[pt_y][pt_x] == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].DEFAULT))) {\n this.state[pt_y][pt_x] = lidar_collisions[a].mapId;\n }\n }\n }\n pt_id += 1;\n }\n }\n };\n return MotionEngine;\n}());\n\n;\n\n\n//# sourceURL=webpack://metacar/./src/motion_engine.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MotionEngine\", function() { return MotionEngine; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar MotionEngine = (function () {\n function MotionEngine(level) {\n this.level = level;\n }\n MotionEngine.prototype.boxesIntersect = function (a, b, reduce) {\n var ab = a.getBounds();\n var bb = b.getBounds();\n if (reduce) {\n ab.width = 15;\n ab.height = 15;\n bb.width = 15;\n bb.height = 15;\n }\n return ab.x + ab.width > bb.x && ab.x < bb.x + bb.width && ab.y + ab.height > bb.y && ab.y < bb.y + bb.height;\n };\n MotionEngine.prototype.detectInteractions = function () {\n var envs = this.level.getEnvs();\n var agent_col = [];\n var lidar_collisions = [];\n var on_road = false;\n for (var i = 0; i < envs.length; i++) {\n if (envs[i] != this.car && envs[i].obstacle && this.boxesIntersect(envs[i], this.car, true)) {\n agent_col.push(envs[i]);\n }\n else if (envs[i].mapId == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].ROAD && this.boxesIntersect(envs[i], this.car, false)) {\n on_road = true;\n }\n if (this.boxesIntersect(envs[i], this.lidar, false)) {\n lidar_collisions.push(envs[i]);\n }\n }\n this.setState(lidar_collisions);\n return { agent_col: agent_col, on_road: on_road };\n };\n MotionEngine.prototype.setState = function (lidar_collisions) {\n var pt_id = 0;\n for (var i = 0; i < this.lidar.children.length; i++) {\n this.lidar.children[i].alpha = 0.3;\n if (this.lidar.children[i].pt) {\n var pt_y = Math.floor(pt_id / this.lidar.pts);\n var pt_x = Math.floor(pt_id % this.lidar.pts);\n this.state[pt_y][pt_x] = _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].DEFAULT;\n for (var a = 0; a < lidar_collisions.length; a++) {\n if (lidar_collisions[a] != this.car) {\n var touch = this.boxesIntersect(lidar_collisions[a], this.lidar.children[i]);\n if (touch && lidar_collisions[a].obstacle) {\n this.lidar.children[i].alpha = 1.;\n }\n if (touch && (lidar_collisions[a].mapId > this.state[pt_y][pt_x] || (lidar_collisions[a].mapId == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].ROAD && this.state[pt_y][pt_x] == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].DEFAULT))) {\n this.state[pt_y][pt_x] = lidar_collisions[a].mapId;\n }\n }\n }\n pt_id += 1;\n }\n }\n };\n return MotionEngine;\n}());\n\n;\n\n\n//# sourceURL=webpack://metacar/./src/motion_engine.ts?");
/***/ }),
diff --git a/demo/webapp/level0.html b/demo/webapp/level0.html
new file mode 100644
index 0000000..5b3b666
--- /dev/null
+++ b/demo/webapp/level0.html
@@ -0,0 +1,20 @@
+
+
+
+
+ Hello World
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/webapp/public/js/editor.js b/demo/webapp/public/js/editor.js
index 3609f33..696a0c3 100644
--- a/demo/webapp/public/js/editor.js
+++ b/demo/webapp/public/js/editor.js
@@ -1,5 +1,5 @@
// Get the url of the desired level
-let levelUrl = metacar.level.fullCity;
+let levelUrl = metacar.level.level0;
// Create the editor (canvasID, levelUrl)
var editor = new metacar.editor("editor", levelUrl);
@@ -8,6 +8,5 @@ editor.load().then(() => {
console.log(content);
// Put the object into storage
localStorage.setItem('mylevel.json', JSON.stringify(content));
-
- }, {download: false, name: "mylevel.json"});
+ }, {download: true, name: "level0.json"});
});
\ No newline at end of file
diff --git a/demo/webapp/public/js/level0.js b/demo/webapp/public/js/level0.js
new file mode 100644
index 0000000..0db2590
--- /dev/null
+++ b/demo/webapp/public/js/level0.js
@@ -0,0 +1,24 @@
+// Get the url of the desired level
+let levelUrl = metacar.level.level0;
+// Create the environement (canvasID, levelUrl)
+var env = new metacar.env("canvas", levelUrl);
+
+console.log(env);
+
+env.setAgentMotion(metacar.motion.BasicMotion, {rotationStep: 0.1});
+env.setAgentLidar({pts: 2, width: 1, height: 1, pos: 1});
+
+// Create the Policy agent
+var agent = new QTableAgent(env);
+
+env.load().then(() => {
+ // The level is loaded. Add listernes
+ env.addEvent("train", () => agent.train());
+ env.addEvent("play", () => agent.play());
+ env.addEvent("stop");
+ env.addEvent("reset_env", () => {
+ console.log("On reset env!");
+ });
+ env.addEvent("save", () => agent.save());
+ env.addEvent("load", (content) => agent.restore(content), {local: true});
+});
diff --git a/demo/webapp/public/js/level1.js b/demo/webapp/public/js/level1.js
index 8901978..0a8d52e 100644
--- a/demo/webapp/public/js/level1.js
+++ b/demo/webapp/public/js/level1.js
@@ -14,9 +14,6 @@ env.load().then(() => {
env.addEvent("reset_env", () => {
console.log("On reset env!");
});
- env.addEvent("reset_agent", () => {
- console.log("On reset agent");
- });
env.addEvent("save", () => agent.save());
env.addEvent("load", () => agent.restore());
});
diff --git a/demo/webapp/public/js/q_table_agent.js b/demo/webapp/public/js/q_table_agent.js
new file mode 100644
index 0000000..3cf4044
--- /dev/null
+++ b/demo/webapp/public/js/q_table_agent.js
@@ -0,0 +1,107 @@
+
+class QTableAgent {
+ /*
+ Monte Carlo Agent
+ */
+
+ constructor(env) {
+ this.env = env;
+ this.Q = {};
+ this.m = 0;
+ }
+
+ save(){
+ let save_content = JSON.stringify(this.Q);
+ console.log(save_content);
+ this.env.save(save_content, "mc_agent.json");
+ console.log("Q table saved");
+ }
+
+ restore(content){
+ this.Q = {};
+ content = JSON.parse(content);
+ for (const key in content){
+ this.Q[key] = [];
+ for (var i = 0; i < content[key].length; i++) {
+ if (content[key][i] != null){
+ this.Q[key].push(content[key][i]);
+ }
+ else{
+ this.Q[key].push(-Infinity);
+ }
+ }
+ }
+ console.log("Q table loaded");
+ }
+
+ play(){
+ // Get the current state
+ let state = this.env.getState().toString();
+ // In this state in not in the Q(s, a) function
+ if (!(state in this.Q)){
+ let action_space = this.env.actionSpace();
+ action_space.range = [0, 1, 2]; // Simplification of the numbers of actions
+ this.Q[state] = Array.apply(null, Array(action_space.range.length)).map(Number.prototype.valueOf, 0.0);
+ }
+ // Select the max action a in Q
+ let action = argMax(this.Q[state]);
+
+ // Take this action and get the associated reward
+ let reward = this.env.step(action);
+ }
+
+ createStateIfNotExist(st){
+ if (!(st in this.Q)){
+ let action_space = this.env.actionSpace();
+ action_space.range = [0, 1, 3];
+ this.Q[st] = Array.apply(null, Array(action_space.range.length)).map(Number.prototype.valueOf, 0);
+ }
+ }
+
+ pickAction(st, eps){
+ this.createStateIfNotExist(st);
+ let act;
+ if (Math.random() < eps){ // Pick a random action
+ act = Math.floor(Math.random()*this.Q[st].length);
+ }
+ else{
+ act = argMax(this.Q[st]);
+ }
+ return act;
+ }
+
+ train(){
+ let episode = 10000;
+ let eps = 1.0;
+ let eps_decrease = 0.99;
+
+ let mean_reward = [];
+ for (let ep = 0; ep < episode; ep++) {
+ if (ep % 50 == 0){
+ eps = Math.max(0.1, eps*eps_decrease);
+ console.log("episode=", ep, "eps=", eps, "mean_reward", mean(mean_reward));
+ }
+ mean_reward = [];
+ let st = this.env.getState().toString();
+ let act;
+ let gamma = 0.99;
+ let st2;
+ let act2;
+ for (var t = 0; t < 800; t++) {
+ act = this.pickAction(this.env, st, eps);
+ let reward = this.env.step(act);
+ mean_reward.push(reward);
+ st2 = this.env.getState().toString();
+ // Pick greedy action (eps = 0)
+ act2 = this.pickAction(st2, 0.);
+ this.createStateIfNotExist(st2);
+ this.createStateIfNotExist(st);
+ this.Q[st][act] = this.Q[st][act] + 0.05*(reward + (gamma*this.Q[st2][act2]) - this.Q[st][act]);
+ st = st2;
+ }
+ this.env.randomRoadPosition();
+ }
+ this.env.render(true);
+ console.log(this.Q);
+ }
+}
diff --git a/demo/webapp/public/js/utils.js b/demo/webapp/public/js/utils.js
index 0c6a0e1..e1065ed 100644
--- a/demo/webapp/public/js/utils.js
+++ b/demo/webapp/public/js/utils.js
@@ -10,4 +10,15 @@ function mean(array){
var sum = array.reduce(function(a, b) { return a + b; });
var avg = sum / array.length;
return avg;
+}
+
+function argMax(array) {
+ /*
+ Return the argmax of an array.
+ TODO: Should be replace soon by the usage of Tensorflow.js
+ */
+ if (array.every((v) => v == -Infinity)){
+ return Math.floor(Math.random()*array.length);
+ }
+ return array.map((x, i) => [x, i]).reduce((r, a) => (a[0] > r[0] ? a : r))[1];
}
\ No newline at end of file
diff --git a/dist/metacar.min.js b/dist/metacar.min.js
index 8513460..2496366 100644
--- a/dist/metacar.min.js
+++ b/dist/metacar.min.js
@@ -95,7 +95,7 @@ window["metacar"] =
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"AssetManger\", function() { return AssetManger; });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _car__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./car */ \"./src/car.ts\");\n/* harmony import */ var _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./basic_motion_engine */ \"./src/basic_motion_engine.ts\");\n/* harmony import */ var _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./control_motion_engine */ \"./src/control_motion_engine.ts\");\n/* harmony import */ var _bot_motion_engine__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./bot_motion_engine */ \"./src/bot_motion_engine.ts\");\n\n\n\n\n\n\n;\nvar AssetManger = (function () {\n function AssetManger(level) {\n this.assets = [];\n this.level = level;\n this.motion = {\n \"BasicMotionEngine\": _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"],\n \"ControlMotionEngine\": _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__[\"ControlMotionEngine\"]\n };\n }\n AssetManger.prototype.createRoadSide = function (info, textures) {\n var x = (info.mx) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n var y = (info.my) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n var area = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Graphics\"]();\n area.beginFill(0xe8e8e8);\n area.drawRoundedRect(0, 0, _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] + 30, _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] + 30, undefined);\n area.x = x - 15;\n area.y = y - 15;\n area.endFill();\n this.level.addChild(area);\n };\n AssetManger.prototype.createRoad = function (info, textures, arrow) {\n var _this = this;\n var road = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[info.type].image]);\n road.arrow = arrow;\n road.x = (info.mx) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n road.y = (info.my) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n road.obstacle = false;\n road.mapId = _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].ROAD;\n road.orientation = _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[info.type].orientation;\n road.setCarPosition = function (car, line) { return _this.setCarOnRoad(road, car, line); };\n road.cars = [];\n road.mx = info.mx;\n road.my = info.my;\n this.level.addRoad(road);\n };\n AssetManger.prototype.setCarOnRoad = function (road, car, line) {\n if (line == undefined)\n line = 0;\n var carById = this.level.findCarById(road.cars[0]);\n if (road.cars.length >= 1 && carById && carById.core.line == line) {\n line = line == 0 ? 1 : 0;\n }\n if (road.cars.length >= 2) {\n car.is_valid = false;\n return;\n }\n car.line = line;\n car.x = road.x;\n car.y = road.y;\n car.x += _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2;\n car.y += _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2;\n var x_margin = 0;\n var y_margin = (_global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] * 1 / 4);\n road.orientation = (Math.floor(road.orientation / car.rotationStep) * car.rotationStep);\n var th = -road.orientation * (Math.PI);\n var x_m = (Math.cos(th) * x_margin) - (y_margin * Math.sin(th));\n var y_m = (Math.cos(th) * y_margin) + (x_margin * Math.sin(th));\n var line_side_factor = line == 0 ? 1 : -1;\n var line_side_factor_t = line == 0 ? 0 : Math.PI;\n car.x += line_side_factor * Math.round(x_m);\n car.y += line_side_factor * Math.round(y_m);\n car.mx = Math.floor(car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n car.my = Math.floor(car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n car.rotation = (th + line_side_factor_t);\n car.checkAndsetNewRoad(road);\n };\n AssetManger.prototype.createAsset = function (img, info, textures, type) {\n var asset = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[img]);\n asset.obstacle = false;\n asset.type = type;\n asset.mapId = 0;\n asset.x = info.x;\n asset.y = info.y;\n this.level.addChild(asset);\n this.assets.push(asset);\n };\n AssetManger.prototype.createMap = function (map, info, textures, roadside) {\n if (roadside === void 0) { roadside = true; }\n if (roadside) {\n for (var my = 0; my < map.length; my++) {\n for (var mx = 0; mx < map[my].length; mx++) {\n if (_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[map[my][mx]]) {\n this.createRoadSide({ mx: mx, my: my, type: map[my][mx] }, textures);\n }\n }\n }\n }\n for (var my = 0; my < map.length; my++) {\n for (var mx = 0; mx < map[my].length; mx++) {\n if (_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[map[my][mx]]) {\n this.createRoad({ mx: mx, my: my, type: map[my][mx] }, textures, map[my][mx]);\n }\n }\n }\n for (var key in _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"]) {\n if (key != \"ROADS\" && info[key]) {\n for (var a = 0; a < info[key].length; a++) {\n this.createAsset(_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"][key].image, info[key][a], textures, key);\n }\n }\n }\n };\n AssetManger.prototype.createCars = function (map, info, textures) {\n for (var c in info.cars) {\n var options = { lidar: true, lidarInfo: { pts: 2, width: 0.5, height: 1, pos: 1 } };\n options.lidar = true;\n options.motionEngine = new _bot_motion_engine__WEBPACK_IMPORTED_MODULE_5__[\"BotMotionEngine\"](this.level);\n var n_car = new _car__WEBPACK_IMPORTED_MODULE_2__[\"Car\"](this.level, info.cars[c], textures, options);\n this.level.addCar(n_car);\n }\n };\n AssetManger.prototype.createAgent = function (map, info, textures) {\n var motionOptions = {\n \"rotationStep\": 0.5,\n \"actions\": [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"]\n };\n var agent = new _car__WEBPACK_IMPORTED_MODULE_2__[\"Car\"](this.level, info.agent, textures, {\n image: _global__WEBPACK_IMPORTED_MODULE_1__[\"CAR_IMG\"].AGENT,\n lidar: true,\n motionEngine: new _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"](this.level, motionOptions)\n });\n this.level.addChild(agent.lidar);\n this.level.addCar(agent);\n agent.core.agent = true;\n return agent;\n };\n AssetManger.prototype.addAsset = function (asset) {\n this.assets.push(asset);\n };\n AssetManger.prototype.exportMap = function (width, height, file_name, download) {\n var file = { \"cars\": [] };\n var map = [];\n var envs = this.level.getEnvs();\n for (var y = 0; y < height; y++) {\n var line = [];\n for (var x = 0; x < width; x++) {\n line.push(0);\n }\n map.push(line);\n }\n for (var e = 0; e < envs.length; e++) {\n var elem = envs[e];\n if (!elem.isremove) {\n if (elem.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR && !elem.agent && elem.my < height && elem.mx < width) {\n file.cars.push({\n \"mx\": elem.mx,\n \"my\": elem.my,\n \"line\": elem.line\n });\n }\n else if (elem.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].ROAD && elem.my < height && elem.mx < width) {\n map[elem.my][elem.mx] = elem.arrow;\n }\n }\n }\n for (var e = 0; e < this.assets.length; e++) {\n var elem = this.assets[e];\n if (!elem.isremove) {\n if (elem.type != \"car\" && elem.type != \"agent\") {\n if (!file[elem.type])\n file[elem.type] = [];\n file[elem.type].push({\n \"x\": elem.x,\n \"y\": elem.y\n });\n }\n }\n }\n file.map = map;\n if (this.level.agent) {\n console.log(\"enter here to create egent....\");\n file.agent = {\n \"mx\": this.level.agent.core.mx,\n \"my\": this.level.agent.core.my,\n \"line\": this.level.agent.core.line,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotationStep\": 0.5,\n \"actions\": [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"]\n }\n }\n };\n }\n var fileCOntent = JSON.stringify(file, null, 4);\n if (download)\n _utils__WEBPACK_IMPORTED_MODULE_0__[\"saveAs\"](fileCOntent, file_name);\n return file;\n };\n return AssetManger;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/asset_manager.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"AssetManger\", function() { return AssetManger; });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _car__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./car */ \"./src/car.ts\");\n/* harmony import */ var _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./basic_motion_engine */ \"./src/basic_motion_engine.ts\");\n/* harmony import */ var _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./control_motion_engine */ \"./src/control_motion_engine.ts\");\n\n\n\n\n\n;\nvar AssetManger = (function () {\n function AssetManger(level) {\n this.assets = [];\n this.agentMotionEngine = _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"];\n this.agentMotionOptions = {};\n this.agentLidarInfo = {};\n this.level = level;\n this.motion = {\n \"BasicMotionEngine\": _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"],\n \"ControlMotionEngine\": _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__[\"ControlMotionEngine\"]\n };\n }\n AssetManger.prototype.setAgentLidar = function (options) {\n this.agentLidarInfo = options;\n };\n AssetManger.prototype.setAgentMotion = function (motion, options) {\n this.agentMotionEngine = motion;\n this.agentMotionOptions = options;\n };\n AssetManger.prototype.createRoadSide = function (info, textures) {\n var x = (info.mx) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n var y = (info.my) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n var area = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Graphics\"]();\n area.beginFill(0xe8e8e8);\n area.drawRoundedRect(0, 0, _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] + 30, _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] + 30, undefined);\n area.x = x - 15;\n area.y = y - 15;\n area.endFill();\n this.level.addChild(area);\n };\n AssetManger.prototype.createRoad = function (info, textures, arrow) {\n var _this = this;\n var road = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[info.type].image]);\n road.arrow = arrow;\n road.x = (info.mx) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n road.y = (info.my) * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n road.obstacle = false;\n road.mapId = _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].ROAD;\n road.orientation = _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[info.type].orientation;\n road.setCarPosition = function (car, line) { return _this.setCarOnRoad(road, car, line); };\n road.cars = [];\n road.mx = info.mx;\n road.my = info.my;\n this.level.addRoad(road);\n };\n AssetManger.prototype.setCarOnRoad = function (road, car, line) {\n if (line == undefined)\n line = 0;\n var carById = this.level.findCarById(road.cars[0]);\n if (road.cars.length >= 1 && carById && carById.core.line == line) {\n line = line == 0 ? 1 : 0;\n }\n if (road.cars.length >= 2) {\n car.is_valid = false;\n return;\n }\n car.line = line;\n car.x = road.x;\n car.y = road.y;\n car.x += _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2;\n car.y += _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2;\n var x_margin = 0;\n var y_margin = (_global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] * 1 / 4);\n road.orientation = (Math.floor(road.orientation / car.rotationStep) * car.rotationStep);\n var th = -road.orientation * (Math.PI);\n var x_m = (Math.cos(th) * x_margin) - (y_margin * Math.sin(th));\n var y_m = (Math.cos(th) * y_margin) + (x_margin * Math.sin(th));\n var line_side_factor = line == 0 ? 1 : -1;\n var line_side_factor_t = line == 0 ? 0 : Math.PI;\n car.x += line_side_factor * Math.round(x_m);\n car.y += line_side_factor * Math.round(y_m);\n car.mx = Math.floor(car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n car.my = Math.floor(car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n car.rotation = (th + line_side_factor_t);\n car.checkAndsetNewRoad(road);\n };\n AssetManger.prototype.createAsset = function (img, info, textures, type) {\n var asset = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[img]);\n asset.obstacle = false;\n asset.type = type;\n asset.mapId = 0;\n asset.x = info.x;\n asset.y = info.y;\n this.level.addChild(asset);\n this.assets.push(asset);\n };\n AssetManger.prototype.createMap = function (map, info, textures, roadside) {\n if (roadside === void 0) { roadside = true; }\n if (roadside) {\n for (var my = 0; my < map.length; my++) {\n for (var mx = 0; mx < map[my].length; mx++) {\n if (_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[map[my][mx]]) {\n this.createRoadSide({ mx: mx, my: my, type: map[my][mx] }, textures);\n }\n }\n }\n }\n for (var my = 0; my < map.length; my++) {\n for (var mx = 0; mx < map[my].length; mx++) {\n if (_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"].ROADS[map[my][mx]]) {\n this.createRoad({ mx: mx, my: my, type: map[my][mx] }, textures, map[my][mx]);\n }\n }\n }\n for (var key in _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"]) {\n if (key != \"ROADS\" && info[key]) {\n for (var a = 0; a < info[key].length; a++) {\n this.createAsset(_global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"][key].image, info[key][a], textures, key);\n }\n }\n }\n };\n AssetManger.prototype.createCars = function (map, info, textures) {\n for (var c in info.cars) {\n var options = { lidar: true, lidarInfo: { pts: 2, width: 0.5, height: 1, pos: 1 } };\n options.lidar = true;\n var n_car = new _car__WEBPACK_IMPORTED_MODULE_2__[\"Car\"](this.level, info.cars[c], textures, options);\n this.level.addCar(n_car);\n }\n };\n AssetManger.prototype.createAgent = function (map, info, textures) {\n var agent = new _car__WEBPACK_IMPORTED_MODULE_2__[\"Car\"](this.level, info.agent, textures, {\n image: _global__WEBPACK_IMPORTED_MODULE_1__[\"CAR_IMG\"].AGENT,\n lidar: true,\n lidarInfo: this.agentLidarInfo,\n motionEngine: new this.agentMotionEngine(this.level, this.agentMotionOptions)\n });\n this.level.addChild(agent.lidar);\n this.level.addCar(agent);\n agent.core.agent = true;\n return agent;\n };\n AssetManger.prototype.addAsset = function (asset) {\n this.assets.push(asset);\n };\n AssetManger.prototype.exportMap = function (width, height, file_name, download) {\n var file = { \"cars\": [] };\n var map = [];\n var envs = this.level.getEnvs();\n for (var y = 0; y < height; y++) {\n var line = [];\n for (var x = 0; x < width; x++) {\n line.push(0);\n }\n map.push(line);\n }\n for (var e = 0; e < envs.length; e++) {\n var elem = envs[e];\n if (!elem.isremove) {\n if (elem.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR && !elem.agent && elem.my < height && elem.mx < width) {\n file.cars.push({\n \"mx\": elem.mx,\n \"my\": elem.my,\n \"line\": elem.line\n });\n }\n else if (elem.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].ROAD && elem.my < height && elem.mx < width) {\n map[elem.my][elem.mx] = elem.arrow;\n }\n }\n }\n for (var e = 0; e < this.assets.length; e++) {\n var elem = this.assets[e];\n if (!elem.isremove) {\n if (elem.type != \"car\" && elem.type != \"agent\") {\n if (!file[elem.type])\n file[elem.type] = [];\n file[elem.type].push({\n \"x\": elem.x,\n \"y\": elem.y\n });\n }\n }\n }\n file.map = map;\n if (this.level.agent) {\n console.log(\"enter here to create egent....\");\n file.agent = {\n \"mx\": this.level.agent.core.mx,\n \"my\": this.level.agent.core.my,\n \"line\": this.level.agent.core.line,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotationStep\": 0.5,\n \"actions\": [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"]\n }\n }\n };\n }\n var fileCOntent = JSON.stringify(file, null, 4);\n if (download)\n _utils__WEBPACK_IMPORTED_MODULE_0__[\"saveAs\"](fileCOntent, file_name);\n return file;\n };\n return AssetManger;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/asset_manager.ts?");
/***/ }),
@@ -107,19 +107,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BasicMotionEngine\", function() { return BasicMotionEngine; });\n/* harmony import */ var _motion_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./motion_engine */ \"./src/motion_engine.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar BasicMotionEngine = (function (_super) {\n __extends(BasicMotionEngine, _super);\n function BasicMotionEngine(level, options) {\n var _this = _super.call(this, level) || this;\n _this.rotationStep = options.rotationStep;\n _this.actions = options.actions;\n return _this;\n }\n BasicMotionEngine.prototype.setUp = function (car, lidar) {\n this.car = car;\n this.lidar = lidar;\n this.state = [];\n for (var y = 0; y < lidar.pts; y++) {\n var line = [];\n for (var x = 0; x < lidar.pts; x++) {\n line.push(_global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].DEFAULT);\n }\n this.state.push(line);\n }\n this.setUpKeyboard();\n this.car.v = 0;\n this.detectInteractions();\n };\n BasicMotionEngine.prototype.setUpKeyboard = function () {\n var _this = this;\n var left = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](37);\n var up = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](38);\n var right = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](39);\n var down = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](40);\n if (this.actions.indexOf(\"LEFT\") != -1)\n left.press = function () { _this.turnLeft(); };\n if (this.actions.indexOf(\"RIGHT\") != -1)\n right.press = function () { _this.turnRight(); };\n if (this.actions.indexOf(\"UP\") != -1) {\n up.press = function () { _this.moveForward(); };\n up.release = function () {\n _this.car.v = 0;\n };\n }\n if (this.actions.indexOf(\"DOWN\") != -1) {\n down.press = function () { _this.moveBackward(); };\n down.release = function () {\n _this.car.v = 0;\n };\n }\n };\n BasicMotionEngine.prototype.turnLeft = function () {\n this.car.rotation -= this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BasicMotionEngine.prototype.turnRight = function () {\n this.car.rotation += this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BasicMotionEngine.prototype.moveForward = function () {\n this.car.v = 1;\n };\n BasicMotionEngine.prototype.moveBackward = function () {\n this.car.v = -1;\n };\n BasicMotionEngine.prototype.actionStep = function (delta, action) {\n if (this.actions[action] == \"LEFT\") {\n this.turnLeft();\n }\n if (this.actions[action] == \"RIGHT\") {\n this.turnRight();\n }\n if (this.actions[action] == \"UP\") {\n this.moveForward();\n }\n if (this.actions[action] == \"DOWN\") {\n this.moveBackward();\n }\n var _a = this.step(delta), agent_col = _a.agent_col, on_road = _a.on_road;\n this.car.v = 0;\n return { agent_col: agent_col, on_road: on_road };\n };\n BasicMotionEngine.prototype.actionSpace = function () {\n return {\n type: \"Discrete\",\n size: 1,\n range: [0, 2]\n };\n };\n BasicMotionEngine.prototype.step = function (delta) {\n this.car.x += this.car.v * Math.cos(this.car.rotation) * delta;\n this.car.y += this.car.v * Math.sin(this.car.rotation) * delta;\n this.car.mx = Math.floor(this.car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.my = Math.floor(this.car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.checkAndsetNewRoad();\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n var _a = this.detectInteractions(), agent_col = _a.agent_col, on_road = _a.on_road;\n if (agent_col.length > 0) {\n this.car.v = 0;\n this.car.vy = 0;\n }\n return { agent_col: agent_col, on_road: on_road };\n };\n return BasicMotionEngine;\n}(_motion_engine__WEBPACK_IMPORTED_MODULE_0__[\"MotionEngine\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/basic_motion_engine.ts?");
-
-/***/ }),
-
-/***/ "./src/bot_motion_engine.ts":
-/*!**********************************!*\
- !*** ./src/bot_motion_engine.ts ***!
- \**********************************/
-/*! exports provided: BotMotionEngine */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BotMotionEngine\", function() { return BotMotionEngine; });\n/* harmony import */ var _motion_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./motion_engine */ \"./src/motion_engine.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar BotMotionEngine = (function (_super) {\n __extends(BotMotionEngine, _super);\n function BotMotionEngine(level) {\n var _this = _super.call(this, level) || this;\n _this.map = _this.level.getMap();\n _this.mapSizeY = _this.map.length;\n _this.mapSizeX = _this.map[0].length;\n _this.rotationStep = 0.5;\n _this.rotationToNextCase = {};\n _this.rotationToNextCase[0] = { \"mx\": 1, \"my\": 0 };\n _this.rotationToNextCase[0.5] = { \"mx\": 0, \"my\": 1 };\n _this.rotationToNextCase[1.0] = { \"mx\": -1, \"my\": 0 };\n _this.rotationToNextCase[1.5] = { \"mx\": 0, \"my\": -1 };\n _this.rotationToNextCase[-0.5] = { \"mx\": 0, \"my\": -1 };\n _this.rotationToNextCase[-1.0] = { \"mx\": -1, \"my\": 0 };\n _this.rotationToNextCase[-1.5] = { \"mx\": 0, \"my\": 1 };\n return _this;\n }\n BotMotionEngine.prototype.setUp = function (car, lidar) {\n this.car = car;\n this.lidar = lidar;\n this.state = [];\n for (var y = 0; y < lidar.pts; y++) {\n var line = [];\n for (var x = 0; x < lidar.pts; x++) {\n line.push(_global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].DEFAULT);\n }\n this.state.push(line);\n }\n this.car.v = 0;\n this.detectInteractions();\n };\n BotMotionEngine.prototype.turnLeft = function () {\n this.car.rotation -= this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BotMotionEngine.prototype.turnRight = function () {\n this.car.rotation += this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BotMotionEngine.prototype.moveUp = function () {\n this.car.v = 1;\n };\n BotMotionEngine.prototype.moveDown = function () {\n this.car.v = -1;\n };\n BotMotionEngine.prototype.isRoad = function (nx, ny) {\n if (ny < 0 || ny >= this.mapSizeY || nx < 0 || nx >= this.mapSizeX || this.map[ny][nx] == 0) {\n return false;\n }\n return true;\n };\n BotMotionEngine.prototype.autoRotation = function () {\n var right_dist = _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] + (_global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 3);\n var left_dist = _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] - (_global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 3.5);\n var same_dist = _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n if (this.car.next_road) {\n var y_dist = Math.abs(((this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) - this.car.y) * this.car.next_road.outroad_np.my);\n var x_dist = Math.abs(((this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) - this.car.x) * this.car.next_road.outroad_np.mx);\n if (this.car.next_road.rotation_type == 0) {\n if (y_dist < right_dist && x_dist < right_dist) {\n this.car.haveTurned = true;\n this.car.rotation = this.car.rotation += Math.PI / 2;\n this.car.rotation = this.car.rotation % (2 * Math.PI);\n this.car.next_road = undefined;\n return;\n }\n }\n if (this.car.next_road.rotation_type == 1) {\n if (y_dist < left_dist && x_dist < left_dist) {\n this.car.haveTurned = true;\n this.car.rotation = this.car.rotation -= Math.PI / 2;\n this.car.rotation = this.car.rotation % (2 * Math.PI);\n this.car.next_road = undefined;\n return;\n }\n }\n if (this.car.next_road.rotation_type == 2) {\n if (y_dist < same_dist && x_dist < same_dist) {\n this.car.haveTurned = true;\n this.car.rotation = this.car.rotation -= Math.PI;\n this.car.rotation = this.car.rotation % (2 * Math.PI);\n if (y_dist != 0 && this.car.x < this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.x = this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.y = this.car.next_road.outroad.y;\n }\n else if (y_dist != 0 && this.car.x > this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.x = this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.y = this.car.next_road.outroad.y;\n }\n else if (x_dist != 0 && this.car.y < this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.y = this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.x = this.car.next_road.outroad.x;\n }\n else if (x_dist != 0 && this.car.y > this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.y = this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.x = this.car.next_road.outroad.x;\n }\n this.car.next_road = undefined;\n return;\n }\n }\n }\n else {\n var key = this.car.rotation / Math.PI;\n var key_r = ((this.car.rotation / Math.PI) + 0.5) % 2;\n var key_l = ((this.car.rotation / Math.PI) - 0.5) % 2;\n var is_next_pos = this.rotationToNextCase[key];\n var is_next_pos_r = this.rotationToNextCase[key_r];\n var is_next_pos_l = this.rotationToNextCase[key_l];\n var turn = false;\n var nx = this.car.mx + is_next_pos.mx;\n var ny = this.car.my + is_next_pos.my;\n if (!this.isRoad(nx, ny)) {\n turn = true;\n }\n else if (!this.car.haveTurned && !this.car.turnedRandom) {\n this.car.turnedRandom = Math.random();\n }\n else if (!this.car.haveTurned && this.car.turnedRandom < 0.33 && this.isRoad(this.car.mx + is_next_pos_r.mx, this.car.my + is_next_pos_r.my)) {\n turn = true;\n }\n else if (!this.car.haveTurned && this.car.turnedRandom > 0.66 && this.isRoad(this.car.mx + is_next_pos_l.mx, this.car.my + is_next_pos_l.my)) {\n turn = true;\n }\n if (turn) {\n var possibles_rotations = [(key + 0.5) % 2., (key - 0.5) % 2., null];\n for (var p = 0; p < possibles_rotations.length; p++) {\n var next_pos = void 0;\n if (possibles_rotations[p] != null) {\n next_pos = this.rotationToNextCase[possibles_rotations[p]];\n }\n else {\n next_pos = { \"mx\": 0, \"my\": 0 };\n }\n var px = this.car.mx + next_pos.mx;\n var py = this.car.my + next_pos.my;\n if (this.isRoad(px, py)) {\n this.car.next_road = {\n \"outroad\": { y: ny * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"], x: nx * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] },\n \"outroad_np\": is_next_pos,\n \"rotation_type\": p,\n };\n return;\n }\n }\n }\n }\n };\n BotMotionEngine.prototype.step = function (delta) {\n if (this.state.toString().indexOf(\",\" + _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR.toString()) != -1) {\n this.car.v = 0;\n }\n else {\n this.car.v = 0.8;\n this.autoRotation();\n }\n this.car.x += this.car.v * Math.cos(this.car.rotation) * delta;\n this.car.y += this.car.v * Math.sin(this.car.rotation) * delta;\n this.car.mx = Math.floor(this.car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.my = Math.floor(this.car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.checkAndsetNewRoad();\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n var _a = this.detectInteractions(), agent_col = _a.agent_col, on_road = _a.on_road;\n if (agent_col.length > 0) {\n this.car.v = 0;\n }\n return { agent_col: agent_col, on_road: on_road };\n };\n return BotMotionEngine;\n}(_motion_engine__WEBPACK_IMPORTED_MODULE_0__[\"MotionEngine\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/bot_motion_engine.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BasicMotionEngine\", function() { return BasicMotionEngine; });\n/* harmony import */ var _motion_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./motion_engine */ \"./src/motion_engine.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar BasicMotionEngine = (function (_super) {\n __extends(BasicMotionEngine, _super);\n function BasicMotionEngine(level, options) {\n var _this = _super.call(this, level) || this;\n _this.rotationStep = options.rotationStep || 0.5;\n _this.actions = options.actions || [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"];\n return _this;\n }\n BasicMotionEngine.prototype.setUp = function (car, lidar) {\n this.car = car;\n this.lidar = lidar;\n this.state = [];\n for (var y = 0; y < lidar.pts; y++) {\n var line = [];\n for (var x = 0; x < lidar.pts; x++) {\n line.push(_global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].DEFAULT);\n }\n this.state.push(line);\n }\n this.setUpKeyboard();\n this.car.v = 0;\n this.detectInteractions();\n };\n BasicMotionEngine.prototype.setUpKeyboard = function () {\n var _this = this;\n var left = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](37);\n var up = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](38);\n var right = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](39);\n var down = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](40);\n if (this.actions.indexOf(\"LEFT\") != -1)\n left.press = function () { _this.turnLeft(); };\n if (this.actions.indexOf(\"RIGHT\") != -1)\n right.press = function () { _this.turnRight(); };\n if (this.actions.indexOf(\"UP\") != -1) {\n up.press = function () { _this.moveForward(); };\n up.release = function () {\n _this.car.v = 0;\n };\n }\n if (this.actions.indexOf(\"DOWN\") != -1) {\n down.press = function () { _this.moveBackward(); };\n down.release = function () {\n _this.car.v = 0;\n };\n }\n };\n BasicMotionEngine.prototype.turnLeft = function () {\n this.car.rotation -= this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BasicMotionEngine.prototype.turnRight = function () {\n this.car.rotation += this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BasicMotionEngine.prototype.moveForward = function () {\n this.car.v = 1;\n };\n BasicMotionEngine.prototype.moveBackward = function () {\n this.car.v = -1;\n };\n BasicMotionEngine.prototype.actionStep = function (delta, action) {\n if (this.actions[action] == \"LEFT\") {\n this.turnLeft();\n }\n if (this.actions[action] == \"RIGHT\") {\n this.turnRight();\n }\n if (this.actions[action] == \"UP\") {\n this.moveForward();\n }\n if (this.actions[action] == \"DOWN\") {\n this.moveBackward();\n }\n var _a = this.step(delta), agent_col = _a.agent_col, on_road = _a.on_road;\n this.car.v = 0;\n return { agent_col: agent_col, on_road: on_road };\n };\n BasicMotionEngine.prototype.actionSpace = function () {\n return {\n type: \"Discrete\",\n size: 1,\n range: [0, 1, 2, 3, 4]\n };\n };\n BasicMotionEngine.prototype.step = function (delta) {\n this.car.x += this.car.v * Math.cos(this.car.rotation) * delta;\n this.car.y += this.car.v * Math.sin(this.car.rotation) * delta;\n this.car.mx = Math.floor(this.car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.my = Math.floor(this.car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.checkAndsetNewRoad();\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n var _a = this.detectInteractions(), agent_col = _a.agent_col, on_road = _a.on_road;\n if (agent_col.length > 0) {\n this.car.v = 0;\n this.car.vy = 0;\n }\n return { agent_col: agent_col, on_road: on_road };\n };\n return BasicMotionEngine;\n}(_motion_engine__WEBPACK_IMPORTED_MODULE_0__[\"MotionEngine\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/basic_motion_engine.ts?");
/***/ }),
@@ -131,7 +119,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Car\", function() { return Car; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar Global_carId = 0;\nvar Car = (function () {\n function Car(level, info, textures, options) {\n if (options === void 0) { options = {}; }\n var _this = this;\n this.level = level;\n options.image = options.image || _global__WEBPACK_IMPORTED_MODULE_0__[\"CAR_IMG\"].DEFAULT;\n options.lidar = options.lidar || false;\n options.lidarInfo = options.lidarInfo || { pts: 5, width: 4, height: 5, pos: 0 };\n this.core = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Sprite\"](textures[options.image]);\n this.info = info;\n this.core.scale.x = 0.8;\n this.core.scale.y = 0.8;\n this.core.anchor.x = 0.5;\n this.core.anchor.y = 0.5;\n this.core.road = undefined;\n this.core.carId = Global_carId;\n Global_carId += 1;\n this.core.agent = false;\n this.core.obstacle = true;\n this.core.mapId = _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].CAR;\n if (options.lidar) {\n this.createLidar(options.lidarInfo);\n this.core.lidar = this.lidar;\n }\n if (options.motionEngine) {\n this.motion = options.motionEngine;\n this.motion.setUp(this.core, this.lidar);\n this.core.rotationStep = 0.5;\n }\n else {\n this.core.rotationStep = 0.5;\n }\n this.core.mx = this.info.mx;\n this.core.my = this.info.my;\n this.core.x = (this.info.mx) * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"];\n this.core.y = (this.info.my) * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"];\n this.core.checkAndsetNewRoad = function (road) { return _this.checkAndsetNewRoad(road); };\n var road = this.level.getRoad(this.core.my, this.core.mx);\n this.core.line = 0;\n if (road) {\n road.setCarPosition(this.core, this.info.line);\n }\n }\n Car.prototype.checkAndsetNewRoad = function (n_road) {\n var current_road = this.core.road;\n if (!n_road) {\n n_road = this.level.getRoad(this.core.my, this.core.mx);\n ;\n }\n if (n_road != current_road) {\n if (current_road) {\n current_road.cars.splice(current_road.cars.indexOf(this.core.carId), 1);\n }\n this.core.road = n_road;\n this.core.haveTurned = false;\n this.turnedRandom = undefined;\n if (n_road)\n n_road.cars.push(this.core.carId);\n }\n };\n Car.prototype.reset = function () {\n this.core.mx = this.info.mx;\n this.core.my = this.info.my;\n var road = this.level.getRoad(this.core.my, this.core.mx);\n if (road) {\n road.setCarPosition(this.core, this.info.line);\n }\n };\n Car.prototype.getState = function (linear) {\n if (linear === void 0) { linear = false; }\n if (!linear)\n return this.motion.state.map(function (arr) { return arr.slice(); });\n else {\n var state_1 = [];\n this.motion.state.map(function (row) { state_1 = state_1.concat(row); });\n return state_1;\n }\n };\n Car.prototype.step = function (delta, action) {\n if (action === void 0) { action = null; }\n if (action == null) {\n var _a = this.motion.step(delta), agent_col = _a.agent_col, on_road = _a.on_road;\n }\n else {\n var _b = this.motion.actionStep(delta, action), agent_col = _b.agent_col, on_road = _b.on_road;\n }\n return { agent_col: agent_col, on_road: on_road };\n };\n Car.prototype.createLidar = function (lidarOptions) {\n this.lidar = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Container\"]();\n var area = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n area.pt = false;\n area.alpha = 0.5;\n area.beginFill(0x515151);\n area.drawRect(0, 0, this.core.width * lidarOptions.width, this.core.height * lidarOptions.height);\n area.endFill();\n var x_step = area.width / lidarOptions.pts;\n var y_step = area.height / lidarOptions.pts;\n for (var xs = lidarOptions.pts - 1; xs >= 0; xs--) {\n for (var ys = 0; ys < lidarOptions.pts; ys++) {\n var x = (x_step / 4) + xs * x_step;\n var y = (y_step / 4) + ys * y_step;\n var pt = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n pt.pt = true;\n pt.beginFill(0xffffff);\n pt.drawRect(x, y, 5, 5);\n pt.endFill();\n this.lidar.addChild(pt);\n }\n }\n this.lidar.pts = lidarOptions.pts;\n this.lidar.addChild(area);\n this.lidar.x = this.core.x;\n this.lidar.y = this.core.y;\n this.lidar.pivot.y = this.lidar.height / 2;\n this.lidar.pivot.x = this.core.width / 2 - (lidarOptions.pos * this.core.width);\n this.lidar.rotation = this.core.rotation;\n };\n return Car;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/car.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Car\", function() { return Car; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar Global_carId = 0;\nvar Car = (function () {\n function Car(level, info, textures, options) {\n if (options === void 0) { options = {}; }\n var _this = this;\n this.level = level;\n options.image = options.image || _global__WEBPACK_IMPORTED_MODULE_0__[\"CAR_IMG\"].DEFAULT;\n options.lidar = options.lidar || false;\n options.lidarInfo = options.lidarInfo || { pts: 5, width: 4, height: 5, pos: 0 };\n this.core = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Sprite\"](textures[options.image]);\n this.info = info;\n this.core.scale.x = 0.8;\n this.core.scale.y = 0.8;\n this.core.anchor.x = 0.5;\n this.core.anchor.y = 0.5;\n this.core.road = undefined;\n this.core.carId = Global_carId;\n Global_carId += 1;\n this.core.agent = false;\n this.core.obstacle = true;\n this.core.mapId = _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].CAR;\n if (options.lidar) {\n this.createLidar(options.lidarInfo);\n this.core.lidar = this.lidar;\n }\n if (options.motionEngine) {\n this.motion = options.motionEngine;\n this.motion.setUp(this.core, this.lidar);\n this.core.rotationStep = 0.5;\n }\n else {\n this.core.rotationStep = 0.5;\n }\n this.core.mx = this.info.mx;\n this.core.my = this.info.my;\n this.core.x = (this.info.mx) * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"];\n this.core.y = (this.info.my) * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"];\n this.core.checkAndsetNewRoad = function (road) { return _this.checkAndsetNewRoad(road); };\n var road = this.level.getRoad(this.core.my, this.core.mx);\n this.core.line = 0;\n if (road) {\n road.setCarPosition(this.core, this.info.line);\n }\n }\n Car.prototype.checkAndsetNewRoad = function (n_road) {\n var current_road = this.core.road;\n if (!n_road) {\n n_road = this.level.getRoad(this.core.my, this.core.mx);\n ;\n }\n if (n_road != current_road) {\n if (current_road) {\n current_road.cars.splice(current_road.cars.indexOf(this.core.carId), 1);\n }\n this.core.road = n_road;\n this.core.haveTurned = false;\n this.turnedRandom = undefined;\n if (n_road)\n n_road.cars.push(this.core.carId);\n }\n };\n Car.prototype.reset = function () {\n this.core.mx = this.info.mx;\n this.core.my = this.info.my;\n var road = this.level.getRoad(this.core.my, this.core.mx);\n if (road) {\n road.setCarPosition(this.core, this.info.line);\n }\n };\n Car.prototype.getState = function (linear) {\n if (linear === void 0) { linear = false; }\n if (!linear)\n return this.motion.state.map(function (arr) { return arr.slice(); });\n else {\n var state_1 = [];\n this.motion.state.map(function (row) { state_1 = state_1.concat(row); });\n return state_1;\n }\n };\n Car.prototype.step = function (delta, action) {\n if (action === void 0) { action = null; }\n if (action == null) {\n var _a = this.motion.step(delta), agent_col = _a.agent_col, on_road = _a.on_road;\n }\n else {\n var _b = this.motion.actionStep(delta, action), agent_col = _b.agent_col, on_road = _b.on_road;\n }\n return { agent_col: agent_col, on_road: on_road };\n };\n Car.prototype.createLidar = function (lidarOptions) {\n lidarOptions.pts = lidarOptions.pts || 5;\n lidarOptions.width = lidarOptions.width || 4;\n lidarOptions.height = lidarOptions.height || 5;\n lidarOptions.pos = lidarOptions.pos || 0;\n this.lidar = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Container\"]();\n var area = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n area.pt = false;\n area.beginFill(0x515151);\n area.drawRect(0, 0, this.core.width * lidarOptions.width, this.core.height * lidarOptions.height);\n area.endFill();\n var x_step = area.width / lidarOptions.pts;\n var y_step = area.height / lidarOptions.pts;\n for (var xs = lidarOptions.pts - 1; xs >= 0; xs--) {\n for (var ys = 0; ys < lidarOptions.pts; ys++) {\n var x = (x_step / 4) + xs * x_step;\n var y = (y_step / 4) + ys * y_step;\n var pt = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n pt.pt = true;\n pt.beginFill(0xffffff);\n pt.drawRect(x, y, 5, 5);\n pt.endFill();\n this.lidar.addChild(pt);\n }\n }\n this.lidar.pts = lidarOptions.pts;\n this.lidar.addChild(area);\n this.lidar.x = this.core.x;\n this.lidar.y = this.core.y;\n this.lidar.pivot.y = this.lidar.height / 2;\n this.lidar.pivot.x = this.core.width / 2 - (lidarOptions.pos * this.core.width);\n this.lidar.rotation = this.core.rotation;\n };\n return Car;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/car.ts?");
/***/ }),
@@ -155,7 +143,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Editor\", function() { return Editor; });\n/* harmony import */ var _asset_manager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./asset_manager */ \"./src/asset_manager.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _world__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./world */ \"./src/world.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar Editor = (function (_super) {\n __extends(Editor, _super);\n function Editor(levelContent, canvasId) {\n var _this = _super.call(this, levelContent, canvasId) || this;\n _this.selectedItems = null;\n _this.am = new _asset_manager__WEBPACK_IMPORTED_MODULE_0__[\"AssetManger\"](_this);\n return _this;\n }\n Editor.prototype._setEvents = function () {\n };\n Editor.prototype._setup = function (info) {\n var _this = this;\n this._setEvents();\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n this.am.createMap(this.map, info, textures, false);\n this.am.createCars(this.map, info, textures);\n if (info.agent)\n this.agent = this.am.createAgent(this.map, info, textures);\n var that = this;\n for (var i = 0; i < this.envs.length; i++) {\n this.envs[i].interactive = true;\n this.envs[i].on(\"rightclick\", function () { that.removeItem(this); });\n }\n for (var i = 0; i < this.am.assets.length; i++) {\n this.am.assets[i].interactive = true;\n this.am.assets[i].on(\"rightclick\", function () { that.removeItem(this); });\n }\n this.app.ticker.add(function (delta) { return _this.loop(delta); });\n };\n Editor.prototype.resize = function (width, height) {\n this.app.renderer.resize(width * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"], height * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n };\n Editor.prototype.getSelectedItems = function () {\n return this.selectedItems;\n };\n Editor.prototype.selectedItem = function (item) {\n if (this.selectedItems) {\n this.app.stage.removeChild(this.selectedItems);\n }\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n this.selectedItems = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[item.image]);\n this.selectedItems.type = item.type;\n this.selectedItems.image = item.image;\n this.selectedItems.data = item.data;\n this.selectedItems.x = 0;\n this.selectedItems.y = 0;\n this.app.stage.addChild(this.selectedItems);\n };\n Editor.prototype.removeItem = function (item) {\n if (item.lidar) {\n this.app.stage.removeChild(item.lidar);\n }\n if (item.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR) {\n item.road.cars.splice(item.road.cars.indexOf(item.car_id), 1);\n }\n if (item.agent)\n this.agent = undefined;\n this.app.stage.removeChild(item);\n item.isremove = true;\n console.log(item.isremove, item.agent, this.agent);\n };\n Editor.prototype.exportMap = function (width, height, file_name, download) {\n return this.am.exportMap(width, height, file_name, download);\n };\n Editor.prototype.setCurrentItem = function () {\n this.am.addAsset(this.selectedItems);\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n var that = this;\n if (this.selectedItems.type == \"road\") {\n this.am.createRoad({\n mx: Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n my: Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n type: this.selectedItems.data\n }, textures, this.selectedItems.data);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"car\") {\n this.am.createCars(this.map, { cars: [{\n \"mx\": Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"my\": Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"rotation\": 0,\n \"line\": 0,\n }] }, textures);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"agent\" && this.agent == undefined) {\n this.agent = this.am.createAgent(this.map, { agent: {\n \"mx\": Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"my\": Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"rotation\": 0,\n \"line\": 0,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotation_step\": 0.5,\n \"actions\": [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"]\n }\n }\n } }, textures);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"asset\") {\n this.am.createAsset(this.selectedItems.image, { x: this.selectedItems.x, y: this.selectedItems.y }, textures, this.selectedItems.data);\n this.am.assets[this.am.assets.length - 1].interactive = true;\n this.am.assets[this.am.assets.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n this.app.stage.removeChild(this.selectedItems);\n this.selectedItems = null;\n };\n return Editor;\n}(_world__WEBPACK_IMPORTED_MODULE_2__[\"World\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/editor.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Editor\", function() { return Editor; });\n/* harmony import */ var _asset_manager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./asset_manager */ \"./src/asset_manager.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _world__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./world */ \"./src/world.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar Editor = (function (_super) {\n __extends(Editor, _super);\n function Editor(levelContent, canvasId) {\n var _this = _super.call(this, levelContent, canvasId) || this;\n _this.selectedItems = null;\n _this.am = new _asset_manager__WEBPACK_IMPORTED_MODULE_0__[\"AssetManger\"](_this);\n return _this;\n }\n Editor.prototype._setEvents = function () {\n };\n Editor.prototype._setup = function (info) {\n var _this = this;\n this._setEvents();\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n this.am.createMap(this.map, info, textures, false);\n this.am.createCars(this.map, info, textures);\n if (info.agent)\n this.agent = this.am.createAgent(this.map, info, textures);\n var that = this;\n for (var i = 0; i < this.envs.length; i++) {\n this.envs[i].interactive = true;\n this.envs[i].on(\"rightclick\", function () { that.removeItem(this); });\n }\n for (var i = 0; i < this.am.assets.length; i++) {\n this.am.assets[i].interactive = true;\n this.am.assets[i].on(\"rightclick\", function () { that.removeItem(this); });\n }\n this.app.ticker.add(function (delta) { return _this.loop(delta); });\n };\n Editor.prototype.resize = function (width, height) {\n this.app.renderer.resize(width * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"], height * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n };\n Editor.prototype.getSelectedItems = function () {\n return this.selectedItems;\n };\n Editor.prototype.selectedItem = function (item) {\n if (this.selectedItems) {\n this.app.stage.removeChild(this.selectedItems);\n }\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n this.selectedItems = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[item.image]);\n this.selectedItems.type = item.type;\n this.selectedItems.image = item.image;\n this.selectedItems.data = item.data;\n this.selectedItems.x = 0;\n this.selectedItems.y = 0;\n this.app.stage.addChild(this.selectedItems);\n };\n Editor.prototype.removeItem = function (item) {\n if (item.lidar) {\n this.app.stage.removeChild(item.lidar);\n }\n if (item.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR) {\n item.road.cars.splice(item.road.cars.indexOf(item.car_id), 1);\n }\n if (item.agent)\n this.agent = undefined;\n this.app.stage.removeChild(item);\n item.isremove = true;\n };\n Editor.prototype.exportMap = function (width, height, file_name, download) {\n return this.am.exportMap(width, height, file_name, download);\n };\n Editor.prototype.setCurrentItem = function () {\n this.am.addAsset(this.selectedItems);\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n var that = this;\n if (this.selectedItems.type == \"road\") {\n this.am.createRoad({\n mx: Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n my: Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n type: this.selectedItems.data\n }, textures, this.selectedItems.data);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"car\") {\n this.am.createCars(this.map, { cars: [{\n \"mx\": Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"my\": Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"rotation\": 0,\n \"line\": 0,\n }] }, textures);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"agent\" && this.agent == undefined) {\n this.agent = this.am.createAgent(this.map, { agent: {\n \"mx\": Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"my\": Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"rotation\": 0,\n \"line\": 0,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotation_step\": 0.5,\n \"actions\": [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"]\n }\n }\n } }, textures);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"asset\") {\n this.am.createAsset(this.selectedItems.image, { x: this.selectedItems.x, y: this.selectedItems.y }, textures, this.selectedItems.data);\n this.am.assets[this.am.assets.length - 1].interactive = true;\n this.am.assets[this.am.assets.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n this.app.stage.removeChild(this.selectedItems);\n this.selectedItems = null;\n };\n return Editor;\n}(_world__WEBPACK_IMPORTED_MODULE_2__[\"World\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/editor.ts?");
/***/ }),
@@ -167,7 +155,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"embeddedUrl\", function() { return embeddedUrl; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"embeddedContent\", function() { return embeddedContent; });\n/* harmony import */ var _embedded_level_full_city__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./embedded/level/full_city */ \"./src/embedded/level/full_city.ts\");\n/* harmony import */ var _embedded_level_level_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./embedded/level/level_1 */ \"./src/embedded/level/level_1.ts\");\n\n\n;\nvar embeddedUrl = {\n fullCity: \"embedded://level/fullCity\",\n level1: \"embedded://level/level1\"\n};\nvar embeddedContent = {\n level: {\n fullCity: _embedded_level_full_city__WEBPACK_IMPORTED_MODULE_0__[\"fullCity\"],\n level1: _embedded_level_level_1__WEBPACK_IMPORTED_MODULE_1__[\"level1\"]\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"embeddedUrl\", function() { return embeddedUrl; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"embeddedContent\", function() { return embeddedContent; });\n/* harmony import */ var _embedded_level_full_city__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./embedded/level/full_city */ \"./src/embedded/level/full_city.ts\");\n/* harmony import */ var _embedded_level_level_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./embedded/level/level_1 */ \"./src/embedded/level/level_1.ts\");\n/* harmony import */ var _embedded_level_level_0__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./embedded/level/level_0 */ \"./src/embedded/level/level_0.ts\");\n\n\n\n;\nvar embeddedUrl = {\n fullCity: \"embedded://level/fullCity\",\n level1: \"embedded://level/level1\",\n level0: \"embedded://level/level0\"\n};\nvar embeddedContent = {\n level: {\n fullCity: _embedded_level_full_city__WEBPACK_IMPORTED_MODULE_0__[\"fullCity\"],\n level1: _embedded_level_level_1__WEBPACK_IMPORTED_MODULE_1__[\"level1\"],\n level0: _embedded_level_level_0__WEBPACK_IMPORTED_MODULE_2__[\"level0\"]\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded.ts?");
/***/ }),
@@ -183,6 +171,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ }),
+/***/ "./src/embedded/level/level_0.ts":
+/*!***************************************!*\
+ !*** ./src/embedded/level/level_0.ts ***!
+ \***************************************/
+/*! exports provided: level0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"level0\", function() { return level0; });\nvar level0 = {\n \"cars\": [\n {\n \"mx\": 3,\n \"my\": 2,\n \"line\": 0\n },\n {\n \"mx\": 1,\n \"my\": 2,\n \"line\": 0\n },\n {\n \"mx\": 2,\n \"my\": 3,\n \"line\": 0\n },\n {\n \"mx\": 3,\n \"my\": 1,\n \"line\": 0\n },\n {\n \"mx\": 1,\n \"my\": 1,\n \"line\": 0\n }\n ],\n \"house\": [\n {\n \"x\": 263,\n \"y\": 108\n },\n {\n \"x\": 112,\n \"y\": 258\n }\n ],\n \"house3\": [\n {\n \"x\": 262,\n \"y\": 16\n }\n ],\n \"bench\": [\n {\n \"x\": 135,\n \"y\": 34\n }\n ],\n \"tree\": [\n {\n \"x\": 124,\n \"y\": 134\n },\n {\n \"x\": 7,\n \"y\": 11\n },\n {\n \"x\": 69,\n \"y\": 10\n },\n {\n \"x\": 19,\n \"y\": 238\n },\n {\n \"x\": 5,\n \"y\": 133\n },\n {\n \"x\": 260,\n \"y\": 211\n }\n ],\n \"map\": [\n [\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n \"↱\",\n \"↔\",\n \"↰\",\n 0\n ],\n [\n 0,\n \"↕\",\n 0,\n \"↕\",\n 0\n ],\n [\n 0,\n \"↳\",\n \"↠\",\n \"↲\",\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ],\n \"agent\": {\n \"mx\": 2,\n \"my\": 1,\n \"line\": 1,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotationStep\": 0.5,\n \"actions\": [\n \"UP\",\n \"LEFT\",\n \"RIGHT\",\n \"DOWN\",\n \"WAIT\"\n ]\n }\n }\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded/level/level_0.ts?");
+
+/***/ }),
+
/***/ "./src/embedded/level/level_1.ts":
/*!***************************************!*\
!*** ./src/embedded/level/level_1.ts ***!
@@ -215,7 +215,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _metacar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./metacar */ \"./src/metacar.ts\");\n/* harmony import */ var _embedded__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./embedded */ \"./src/embedded.ts\");\n/* harmony import */ var _metacar_editor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./metacar_editor */ \"./src/metacar_editor.ts\");\n\n\n\nvar metacar = {\n env: _metacar__WEBPACK_IMPORTED_MODULE_0__[\"MetaCar\"],\n editor: _metacar_editor__WEBPACK_IMPORTED_MODULE_2__[\"MetaCarEditor\"],\n level: _embedded__WEBPACK_IMPORTED_MODULE_1__[\"embeddedUrl\"]\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (metacar);\n\n\n//# sourceURL=webpack://metacar/./src/index.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _metacar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./metacar */ \"./src/metacar.ts\");\n/* harmony import */ var _embedded__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./embedded */ \"./src/embedded.ts\");\n/* harmony import */ var _metacar_editor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./metacar_editor */ \"./src/metacar_editor.ts\");\n/* harmony import */ var _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./basic_motion_engine */ \"./src/basic_motion_engine.ts\");\n/* harmony import */ var _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./control_motion_engine */ \"./src/control_motion_engine.ts\");\n\n\n\n\n\nvar metacar = {\n env: _metacar__WEBPACK_IMPORTED_MODULE_0__[\"MetaCar\"],\n editor: _metacar_editor__WEBPACK_IMPORTED_MODULE_2__[\"MetaCarEditor\"],\n level: _embedded__WEBPACK_IMPORTED_MODULE_1__[\"embeddedUrl\"],\n motion: {\n BasicMotion: _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"],\n ControlMotion: _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__[\"ControlMotionEngine\"]\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (metacar);\n\n\n//# sourceURL=webpack://metacar/./src/index.ts?");
/***/ }),
@@ -227,7 +227,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _met
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Level\", function() { return Level; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _asset_manager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./asset_manager */ \"./src/asset_manager.ts\");\n/* harmony import */ var _world__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./world */ \"./src/world.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar Level = (function (_super) {\n __extends(Level, _super);\n function Level(levelContent, canvasId) {\n var _this = _super.call(this, levelContent, canvasId) || this;\n _this.map = _this.info.map;\n _this.am = new _asset_manager__WEBPACK_IMPORTED_MODULE_1__[\"AssetManger\"](_this);\n return _this;\n }\n Level.prototype._setup = function (info) {\n var _this = this;\n var textures = _global__WEBPACK_IMPORTED_MODULE_0__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_0__[\"JSON_TEXTURES\"]].textures;\n this.am.createMap(this.map, info, textures);\n this.am.createCars(this.map, info, textures);\n if (info.agent)\n this.agent = this.am.createAgent(this.map, info, textures);\n this.app.ticker.add(function (delta) { return _this.loop(delta); });\n };\n Level.prototype.reset = function () {\n this.agent.reset();\n };\n Level.prototype.setReward = function (agent_col, on_road, action) {\n var reward = -0.1;\n if (action == 0 || this.agent.core.v == 1)\n reward += 0.5;\n if (agent_col.length > 0) {\n reward = -10;\n }\n else if (!on_road) {\n reward = -10;\n }\n return reward;\n };\n Level.prototype.step = function (delta, action) {\n if (action === void 0) { action = null; }\n for (var c = 0; c < this.cars.length; c++) {\n if (this.cars[c].lidar && !this.cars[c].core.agent)\n this.cars[c].step(delta);\n }\n if (this.agent) {\n var _a = this.agent.step(delta, action), agent_col = _a.agent_col, on_road = _a.on_road;\n var reward = this.setReward(agent_col, on_road, action);\n return reward;\n }\n return 0;\n };\n Level.prototype.stopRender = function () {\n this.app.ticker.stop();\n };\n return Level;\n}(_world__WEBPACK_IMPORTED_MODULE_2__[\"World\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/level.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Level\", function() { return Level; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _asset_manager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./asset_manager */ \"./src/asset_manager.ts\");\n/* harmony import */ var _world__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./world */ \"./src/world.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar Level = (function (_super) {\n __extends(Level, _super);\n function Level(levelContent, canvasId) {\n var _this = _super.call(this, levelContent, canvasId) || this;\n _this.map = _this.info.map;\n _this.am = new _asset_manager__WEBPACK_IMPORTED_MODULE_1__[\"AssetManger\"](_this);\n return _this;\n }\n Level.prototype.setAgentMotion = function (motion, options) {\n this.am.setAgentMotion(motion, options);\n };\n Level.prototype.setAgentLidar = function (options) {\n this.am.setAgentLidar(options);\n };\n Level.prototype._setup = function (info) {\n var _this = this;\n var textures = _global__WEBPACK_IMPORTED_MODULE_0__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_0__[\"JSON_TEXTURES\"]].textures;\n this.am.createMap(this.map, info, textures);\n this.am.createCars(this.map, info, textures);\n if (info.agent)\n this.agent = this.am.createAgent(this.map, info, textures);\n this.app.ticker.add(function (delta) { return _this.loop(delta); });\n };\n Level.prototype.reset = function () {\n this.agent.reset();\n };\n Level.prototype.setReward = function (agent_col, on_road, action) {\n var reward = -0.1;\n if (action == 0 || this.agent.core.v == 1)\n reward += 0.5;\n if (agent_col.length > 0) {\n reward = -10;\n }\n else if (!on_road) {\n reward = -10;\n }\n return reward;\n };\n Level.prototype.step = function (delta, action) {\n if (action === void 0) { action = null; }\n if (this.agent) {\n var _a = this.agent.step(delta, action), agent_col = _a.agent_col, on_road = _a.on_road;\n var reward = this.setReward(agent_col, on_road, action);\n return reward;\n }\n return 0;\n };\n Level.prototype.stopRender = function () {\n this.app.ticker.stop();\n };\n return Level;\n}(_world__WEBPACK_IMPORTED_MODULE_2__[\"World\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/level.ts?");
/***/ }),
@@ -239,7 +239,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MetaCar\", function() { return MetaCar; });\n/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./level */ \"./src/level.ts\");\n/* harmony import */ var _ui_event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui_event */ \"./src/ui_event.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\n\n\n\nvar MetaCar = (function () {\n function MetaCar(canvasId, levelToLoad) {\n this.eventList = [\"train\", \"play\", \"stop\", \"reset_env\", \"load\"];\n if (!canvasId || !levelToLoad) {\n console.error(\"You must specify the canvasId and the levelToLoad\");\n }\n this.canvasId = canvasId;\n this.levelToLoad = levelToLoad;\n }\n MetaCar.prototype.load = function () {\n var _this = this;\n return new Promise(function (resolve, reject) {\n console.log(typeof _this.levelToLoad, _this.levelToLoad);\n if (typeof _this.levelToLoad == \"string\") {\n _utils__WEBPACK_IMPORTED_MODULE_2__[\"loadCustomURL\"](_this.levelToLoad, function (content) {\n _this.level = new _level__WEBPACK_IMPORTED_MODULE_0__[\"Level\"](content, _this.canvasId);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); });\n resolve();\n });\n }\n else {\n _this.level = new _level__WEBPACK_IMPORTED_MODULE_0__[\"Level\"](_this.levelToLoad, _this.canvasId);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); });\n resolve();\n }\n });\n };\n MetaCar.prototype.addEvent = function (eventName, fc, options) {\n var index = this.eventList.indexOf(eventName);\n if (index == -1) {\n this.event.onCustomEvent(eventName, fc);\n return;\n }\n var event = this.eventList[index];\n if (event != \"load\") {\n this.eventCallback[index](fc);\n }\n else {\n this.eventCallback[index](fc, options);\n }\n };\n MetaCar.prototype.render = function (val) {\n this.level.render(val);\n };\n MetaCar.prototype.save = function (content, file_name) {\n _utils__WEBPACK_IMPORTED_MODULE_2__[\"saveAs\"](content, file_name);\n };\n MetaCar.prototype.actionSpace = function () {\n return this.level.agent.motion.actionSpace();\n };\n MetaCar.prototype.getState = function (linear) {\n if (linear === void 0) { linear = false; }\n return this.level.agent.getState(linear);\n };\n MetaCar.prototype.step = function (action) {\n return this.level.step(1, action);\n };\n MetaCar.prototype.reset = function () {\n this.level.reset();\n };\n MetaCar.prototype.randomRoadPosition = function () {\n var roads = this.level.getRoads();\n var keys = Object.keys(roads);\n keys.sort(function () { return Math.random() - 0.5; });\n for (var k in keys) {\n var road = roads[keys[k]];\n if (road.cars.length == 0) {\n road.setCarPosition(this.level.agent.core);\n break;\n }\n }\n };\n MetaCar.prototype._loop = function (delta) {\n if (this.event.isPlaying()) {\n this.event.playCallback();\n }\n else {\n this.level.step(delta);\n }\n };\n MetaCar.prototype._setEvents = function () {\n var _this = this;\n this.event = new _ui_event__WEBPACK_IMPORTED_MODULE_1__[\"UIEvent\"](this.level, this.canvasId);\n this.eventCallback = [\n function (fc) { return _this.event.onTrain(fc); },\n function (fc) { return _this.event.onPlay(fc); },\n function (fc) { return _this.event.onStop(fc); },\n function (fc) { return _this.event.onResetEnv(fc); },\n function (fc, opt) { return _this.event.onLoad(fc, opt); }\n ];\n };\n return MetaCar;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/metacar.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MetaCar\", function() { return MetaCar; });\n/* harmony import */ var _level__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./level */ \"./src/level.ts\");\n/* harmony import */ var _ui_event__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui_event */ \"./src/ui_event.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\n/* harmony import */ var _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./basic_motion_engine */ \"./src/basic_motion_engine.ts\");\n\n\n\n\nvar MetaCar = (function () {\n function MetaCar(canvasId, levelToLoad) {\n this.eventList = [\"train\", \"play\", \"stop\", \"reset_env\", \"load\"];\n this.agentMotionEngine = _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"];\n this.agentMotionOptions = {};\n if (!canvasId || !levelToLoad) {\n console.error(\"You must specify the canvasId and the levelToLoad\");\n }\n this.canvasId = canvasId;\n this.levelToLoad = levelToLoad;\n }\n MetaCar.prototype.load = function () {\n var _this = this;\n return new Promise(function (resolve, reject) {\n console.log(typeof _this.levelToLoad, _this.levelToLoad);\n if (typeof _this.levelToLoad == \"string\") {\n _utils__WEBPACK_IMPORTED_MODULE_2__[\"loadCustomURL\"](_this.levelToLoad, function (content) {\n _this.level = new _level__WEBPACK_IMPORTED_MODULE_0__[\"Level\"](content, _this.canvasId);\n _this.level.setAgentMotion(_this.agentMotionEngine, _this.agentMotionOptions);\n _this.level.setAgentLidar(_this.agentLidarInfo);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); });\n resolve();\n });\n }\n else {\n _this.level = new _level__WEBPACK_IMPORTED_MODULE_0__[\"Level\"](_this.levelToLoad, _this.canvasId);\n _this.level.setAgentMotion(_this.agentMotionEngine, _this.agentMotionOptions);\n _this.level.setAgentLidar(_this.agentLidarInfo);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); });\n resolve();\n }\n });\n };\n MetaCar.prototype.setAgentLidar = function (options) {\n this.agentLidarInfo = options;\n };\n MetaCar.prototype.setAgentMotion = function (motion, options) {\n this.agentMotionEngine = motion;\n this.agentMotionOptions = options;\n };\n MetaCar.prototype.addEvent = function (eventName, fc, options) {\n var index = this.eventList.indexOf(eventName);\n if (index == -1) {\n this.event.onCustomEvent(eventName, fc);\n return;\n }\n var event = this.eventList[index];\n if (event != \"load\") {\n this.eventCallback[index](fc);\n }\n else {\n this.eventCallback[index](fc, options);\n }\n };\n MetaCar.prototype.render = function (val) {\n this.level.render(val);\n };\n MetaCar.prototype.save = function (content, file_name) {\n _utils__WEBPACK_IMPORTED_MODULE_2__[\"saveAs\"](content, file_name);\n };\n MetaCar.prototype.actionSpace = function () {\n return this.level.agent.motion.actionSpace();\n };\n MetaCar.prototype.getState = function (linear) {\n if (linear === void 0) { linear = false; }\n return this.level.agent.getState(linear);\n };\n MetaCar.prototype.step = function (action) {\n return this.level.step(1, action);\n };\n MetaCar.prototype.reset = function () {\n this.level.reset();\n };\n MetaCar.prototype.randomRoadPosition = function () {\n var roads = this.level.getRoads();\n var keys = Object.keys(roads);\n keys.sort(function () { return Math.random() - 0.5; });\n for (var k in keys) {\n var road = roads[keys[k]];\n if (road.cars.length == 0) {\n road.setCarPosition(this.level.agent.core);\n break;\n }\n }\n };\n MetaCar.prototype._loop = function (delta) {\n if (this.event.isPlaying()) {\n this.event.playCallback();\n }\n else {\n this.level.step(delta);\n }\n };\n MetaCar.prototype._setEvents = function () {\n var _this = this;\n this.event = new _ui_event__WEBPACK_IMPORTED_MODULE_1__[\"UIEvent\"](this.level, this.canvasId);\n this.eventCallback = [\n function (fc) { return _this.event.onTrain(fc); },\n function (fc) { return _this.event.onPlay(fc); },\n function (fc) { return _this.event.onStop(fc); },\n function (fc) { return _this.event.onResetEnv(fc); },\n function (fc, opt) { return _this.event.onLoad(fc, opt); }\n ];\n };\n return MetaCar;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/metacar.ts?");
/***/ }),
@@ -263,7 +263,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MotionEngine\", function() { return MotionEngine; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar MotionEngine = (function () {\n function MotionEngine(level) {\n this.level = level;\n }\n MotionEngine.prototype.boxesIntersect = function (a, b) {\n var ab = a.getBounds();\n var bb = b.getBounds();\n return ab.x + ab.width > bb.x && ab.x < bb.x + bb.width && ab.y + ab.height > bb.y && ab.y < bb.y + bb.height;\n };\n MotionEngine.prototype.detectInteractions = function () {\n var envs = this.level.getEnvs();\n var agent_col = [];\n var lidar_collisions = [];\n var on_road = false;\n for (var i = 0; i < envs.length; i++) {\n if (envs[i] != this.car && envs[i].obstacle && this.boxesIntersect(envs[i], this.car)) {\n agent_col.push(envs[i]);\n }\n else if (envs[i].mapId == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].ROAD && this.boxesIntersect(envs[i], this.car)) {\n on_road = true;\n }\n if (this.boxesIntersect(envs[i], this.lidar)) {\n lidar_collisions.push(envs[i]);\n }\n }\n this.setState(lidar_collisions);\n return { agent_col: agent_col, on_road: on_road };\n };\n MotionEngine.prototype.setState = function (lidar_collisions) {\n var pt_id = 0;\n for (var i = 0; i < this.lidar.children.length; i++) {\n this.lidar.children[i].alpha = 0.1;\n if (this.lidar.children[i].pt) {\n var pt_y = Math.floor(pt_id / this.lidar.pts);\n var pt_x = Math.floor(pt_id % this.lidar.pts);\n this.state[pt_y][pt_x] = _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].DEFAULT;\n for (var a = 0; a < lidar_collisions.length; a++) {\n if (lidar_collisions[a] != this.car) {\n var touch = this.boxesIntersect(lidar_collisions[a], this.lidar.children[i]);\n if (touch && lidar_collisions[a].obstacle) {\n this.lidar.children[i].alpha = 1.;\n }\n if (touch && (lidar_collisions[a].mapId > this.state[pt_y][pt_x] || (lidar_collisions[a].mapId == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].ROAD && this.state[pt_y][pt_x] == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].DEFAULT))) {\n this.state[pt_y][pt_x] = lidar_collisions[a].mapId;\n }\n }\n }\n pt_id += 1;\n }\n }\n };\n return MotionEngine;\n}());\n\n;\n\n\n//# sourceURL=webpack://metacar/./src/motion_engine.ts?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MotionEngine\", function() { return MotionEngine; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar MotionEngine = (function () {\n function MotionEngine(level) {\n this.level = level;\n }\n MotionEngine.prototype.boxesIntersect = function (a, b, reduce) {\n var ab = a.getBounds();\n var bb = b.getBounds();\n if (reduce) {\n ab.width = 15;\n ab.height = 15;\n bb.width = 15;\n bb.height = 15;\n }\n return ab.x + ab.width > bb.x && ab.x < bb.x + bb.width && ab.y + ab.height > bb.y && ab.y < bb.y + bb.height;\n };\n MotionEngine.prototype.detectInteractions = function () {\n var envs = this.level.getEnvs();\n var agent_col = [];\n var lidar_collisions = [];\n var on_road = false;\n for (var i = 0; i < envs.length; i++) {\n if (envs[i] != this.car && envs[i].obstacle && this.boxesIntersect(envs[i], this.car, true)) {\n agent_col.push(envs[i]);\n }\n else if (envs[i].mapId == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].ROAD && this.boxesIntersect(envs[i], this.car, false)) {\n on_road = true;\n }\n if (this.boxesIntersect(envs[i], this.lidar, false)) {\n lidar_collisions.push(envs[i]);\n }\n }\n this.setState(lidar_collisions);\n return { agent_col: agent_col, on_road: on_road };\n };\n MotionEngine.prototype.setState = function (lidar_collisions) {\n var pt_id = 0;\n for (var i = 0; i < this.lidar.children.length; i++) {\n this.lidar.children[i].alpha = 0.3;\n if (this.lidar.children[i].pt) {\n var pt_y = Math.floor(pt_id / this.lidar.pts);\n var pt_x = Math.floor(pt_id % this.lidar.pts);\n this.state[pt_y][pt_x] = _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].DEFAULT;\n for (var a = 0; a < lidar_collisions.length; a++) {\n if (lidar_collisions[a] != this.car) {\n var touch = this.boxesIntersect(lidar_collisions[a], this.lidar.children[i]);\n if (touch && lidar_collisions[a].obstacle) {\n this.lidar.children[i].alpha = 1.;\n }\n if (touch && (lidar_collisions[a].mapId > this.state[pt_y][pt_x] || (lidar_collisions[a].mapId == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].ROAD && this.state[pt_y][pt_x] == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].DEFAULT))) {\n this.state[pt_y][pt_x] = lidar_collisions[a].mapId;\n }\n }\n }\n pt_id += 1;\n }\n }\n };\n return MotionEngine;\n}());\n\n;\n\n\n//# sourceURL=webpack://metacar/./src/motion_engine.ts?");
/***/ }),
diff --git a/src/asset_manager.ts b/src/asset_manager.ts
index 4c53e70..f5d6d3a 100644
--- a/src/asset_manager.ts
+++ b/src/asset_manager.ts
@@ -10,11 +10,12 @@ import {
ROADSIZE, Graphics, Sprite, ASSETS, MAP, CAR_IMG
} from "./global";
-import {CarOptions, Car} from "./car";
+import {CarOptions, Car, LidarInfoI} from "./car";
import {BasicMotionEngine} from "./basic_motion_engine";
import {ControlMotionEngine} from "./control_motion_engine";
import {BotMotionEngine} from "./bot_motion_engine";
import { Editor } from "./editor";
+import { MotionEngine } from "./motion_engine";
export interface AssetInfo {
readonly mx?: number;
@@ -58,6 +59,9 @@ export class AssetManger {
private motion: any;
// List of all items on the map
public assets: SimpleSprite[] = [];
+ private agentMotionEngine: any = BasicMotionEngine;
+ private agentMotionOptions: Object = {};
+ private agentLidarInfo: LidarInfoI = {};
constructor(level: Level|Editor) {
this.level = level;
@@ -67,6 +71,27 @@ export class AssetManger {
}
}
+ /**
+ *
+ * options Options to change the lidar options of the agent.
+ * Changing the lidar change the state representation of the car in the
+ * environement.
+ */
+ public setAgentLidar(options: LidarInfoI){
+ this.agentLidarInfo = options;
+ }
+
+ /**
+ * Change the motion engine of the agent. BasicMotionEngine by default.
+ * This method should be called before to called 'load'.
+ * @motion The motion engine to used for the agent when the environement is loaded.
+ * @options Options to change the behavior of the motion engine.
+ */
+ public setAgentMotion(motion: any, options: Object){
+ this.agentMotionEngine = motion;
+ this.agentMotionOptions = options;
+ }
+
createRoadSide(info: AssetInfo, textures: any){
/*
@textures: (Pixi textures)
@@ -221,7 +246,7 @@ export class AssetManger {
for (let c in info.cars){
let options: CarOptions = {lidar: true, lidarInfo: {pts: 2, width: 0.5, height: 1, pos: 1}};
options.lidar = true;
- options.motionEngine = new BotMotionEngine(this.level);
+ //options.motionEngine = new BotMotionEngine(this.level);
let n_car = new Car(this.level, info.cars[c], textures, options);
// Append the car to the canvas
this.level.addCar(n_car);
@@ -236,14 +261,11 @@ export class AssetManger {
@info (Object) Level's json.
@textures: (Pixi textures)
*/
- const motionOptions = {
- "rotationStep": 0.5,
- "actions": ["UP", "LEFT", "RIGHT", "DOWN", "WAIT"]
- }
let agent = new Car(this.level, info.agent, textures, {
image: CAR_IMG.AGENT,
lidar: true,
- motionEngine: new BasicMotionEngine(this.level, motionOptions)
+ lidarInfo: this.agentLidarInfo,
+ motionEngine: new this.agentMotionEngine(this.level, this.agentMotionOptions)
});
this.level.addChild(agent.lidar)
diff --git a/src/basic_motion_engine.ts b/src/basic_motion_engine.ts
index c18de42..20d0848 100644
--- a/src/basic_motion_engine.ts
+++ b/src/basic_motion_engine.ts
@@ -1,4 +1,4 @@
-import { MotionEngine, MotionOption } from "./motion_engine";
+import { MotionEngine} from "./motion_engine";
import {Level} from "./level";
import {
@@ -8,6 +8,11 @@ import {
import * as U from "./utils";
import {actionSpaceDescription} from "./motion_engine";
+export interface BasicMotionOptions{
+ readonly rotationStep?: number;
+ readonly actions?: string[];
+}
+
export class BasicMotionEngine extends MotionEngine {
/*
Basic Motion Engine
@@ -17,10 +22,10 @@ export class BasicMotionEngine extends MotionEngine {
private rotationStep: number;
private actions: string[];
- constructor(level: Level, options: MotionOption) {
+ constructor(level: Level, options: BasicMotionOptions) {
super(level);
- this.rotationStep = options.rotationStep;
- this.actions = options.actions;
+ this.rotationStep = options.rotationStep || 0.5;
+ this.actions = options.actions || ["UP", "LEFT", "RIGHT", "DOWN", "WAIT"];
}
setUp(car: any, lidar: any){
@@ -131,7 +136,7 @@ export class BasicMotionEngine extends MotionEngine {
return {
type: "Discrete",
size: 1,
- range: [0, 2]
+ range: [0, 1, 2, 3, 4]
}
}
diff --git a/src/car.ts b/src/car.ts
index 236c303..947a375 100644
--- a/src/car.ts
+++ b/src/car.ts
@@ -213,11 +213,15 @@ export class Car {
@width: Width of the lidar (in proportion to the car)
@height: Height of the lidar (in proportion to the car)
*/
+ lidarOptions.pts = lidarOptions.pts || 5;
+ lidarOptions.width = lidarOptions.width || 4;
+ lidarOptions.height = lidarOptions.height || 5;
+ lidarOptions.pos = lidarOptions.pos || 0;
+
this.lidar = new Container();
// Area of the lidar
let area: LidarChild = new Graphics();
area.pt = false;
- area.alpha = 0.5;
area.beginFill(0x515151);
area.drawRect(0, 0, this.core.width*lidarOptions.width, this.core.height*lidarOptions.height);
area.endFill();
diff --git a/src/editor.ts b/src/editor.ts
index 24a3501..5e27519 100644
--- a/src/editor.ts
+++ b/src/editor.ts
@@ -103,7 +103,6 @@ export class Editor extends World {
this.agent = undefined;
this.app.stage.removeChild(item);
item.isremove = true;
- console.log(item.isremove, item.agent, this.agent);
}
exportMap(width: number, height: number, file_name: string, download: boolean): any{
diff --git a/src/embedded.ts b/src/embedded.ts
index 0fb665f..5cd93d9 100644
--- a/src/embedded.ts
+++ b/src/embedded.ts
@@ -1,5 +1,6 @@
import {fullCity} from "./embedded/level/full_city";
import {level1} from "./embedded/level/level_1";
+import {level0} from "./embedded/level/level_0";
/**
* Object used to enumerate each
@@ -10,18 +11,21 @@ import {level1} from "./embedded/level/level_1";
*
*/
export interface embeddedUrlI {
- fullCity: string
- level1: string
+ fullCity: string;
+ level1: string;
+ level0: string;
};
export const embeddedUrl: embeddedUrlI = {
fullCity: "embedded://level/fullCity",
- level1: "embedded://level/level1"
+ level1: "embedded://level/level1",
+ level0: "embedded://level/level0"
}
export const embeddedContent: any = {
level: {
fullCity: fullCity,
- level1: level1
+ level1: level1,
+ level0: level0
}
}
\ No newline at end of file
diff --git a/src/embedded/level/level_0.ts b/src/embedded/level/level_0.ts
new file mode 100644
index 0000000..e8c5e05
--- /dev/null
+++ b/src/embedded/level/level_0.ts
@@ -0,0 +1,132 @@
+export const level0: any = {
+ "cars": [
+ {
+ "mx": 3,
+ "my": 2,
+ "line": 0
+ },
+ {
+ "mx": 1,
+ "my": 2,
+ "line": 0
+ },
+ {
+ "mx": 2,
+ "my": 3,
+ "line": 0
+ },
+ {
+ "mx": 3,
+ "my": 1,
+ "line": 0
+ },
+ {
+ "mx": 1,
+ "my": 1,
+ "line": 0
+ }
+ ],
+ "house": [
+ {
+ "x": 263,
+ "y": 108
+ },
+ {
+ "x": 112,
+ "y": 258
+ }
+ ],
+ "house3": [
+ {
+ "x": 262,
+ "y": 16
+ }
+ ],
+ "bench": [
+ {
+ "x": 135,
+ "y": 34
+ }
+ ],
+ "tree": [
+ {
+ "x": 124,
+ "y": 134
+ },
+ {
+ "x": 7,
+ "y": 11
+ },
+ {
+ "x": 69,
+ "y": 10
+ },
+ {
+ "x": 19,
+ "y": 238
+ },
+ {
+ "x": 5,
+ "y": 133
+ },
+ {
+ "x": 260,
+ "y": 211
+ }
+ ],
+ "map": [
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ 0,
+ "↱",
+ "↔",
+ "↰",
+ 0
+ ],
+ [
+ 0,
+ "↕",
+ 0,
+ "↕",
+ 0
+ ],
+ [
+ 0,
+ "↳",
+ "↠",
+ "↲",
+ 0
+ ],
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ ],
+ "agent": {
+ "mx": 2,
+ "my": 1,
+ "line": 1,
+ "motion": {
+ "type": "BasicMotionEngine",
+ "options": {
+ "rotationStep": 0.5,
+ "actions": [
+ "UP",
+ "LEFT",
+ "RIGHT",
+ "DOWN",
+ "WAIT"
+ ]
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/index.ts b/src/index.ts
index 6ed03dc..e4965f7 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,11 +1,17 @@
import {MetaCar} from "./metacar";
import {embeddedUrl, embeddedUrlI} from "./embedded";
import {MetaCarEditor} from "./metacar_editor";
+import {BasicMotionEngine} from "./basic_motion_engine";
+import {ControlMotionEngine} from "./control_motion_engine";
const metacar = {
env: MetaCar,
editor: MetaCarEditor,
- level: embeddedUrl
+ level: embeddedUrl,
+ motion: {
+ BasicMotion: BasicMotionEngine,
+ ControlMotion: ControlMotionEngine
+ }
}
export default metacar;
\ No newline at end of file
diff --git a/src/level.ts b/src/level.ts
index 06c798b..c58a440 100644
--- a/src/level.ts
+++ b/src/level.ts
@@ -9,8 +9,10 @@ import {
} from "./global";
import {AssetManger, RoadSprite} from "./asset_manager";
-import {Car, CarSprite} from "./car";
+import {Car, CarSprite, LidarChild, LidarInfoI} from "./car";
import {World} from "./world";
+import { BasicMotionEngine, BasicMotionOptions } from "./basic_motion_engine";
+import { ControlMotionEngine } from "./control_motion_engine";
export interface LevelInfo {
map: (string|number)[][];
@@ -34,6 +36,26 @@ export class Level extends World {
this.am = new AssetManger(this);
}
+ /**
+ * Change the motion engine of the agent. BasicMotionEngine by default.
+ * This method should be called before to called 'load'.
+ * @motion The motion engine to used for the agent when the environement is loaded.
+ * @options Options to change the behavior of the motion engine.
+ */
+ public setAgentMotion(motion: typeof BasicMotionEngine|typeof ControlMotionEngine, options: BasicMotionOptions){
+ this.am.setAgentMotion(motion, options);
+ }
+
+ /**
+ *
+ * options Options to change the lidar options of the agent.
+ * Changing the lidar change the state representation of the car in the
+ * environement.
+ */
+ public setAgentLidar(options: LidarInfoI){
+ this.am.setAgentLidar(options);
+ }
+
protected _setup(info: LevelInfo){
/*
Setup all the element of the map
@@ -82,10 +104,10 @@ export class Level extends World {
@action: (Integer) The action to take (can be null if no action)
*/
// Go through all cars to move each one
- for (var c = 0; c < this.cars.length; c++) {
- if (this.cars[c].lidar && !this.cars[c].core.agent) // If this car can move
- this.cars[c].step(delta);
- }
+ //for (var c = 0; c < this.cars.length; c++) {
+ // if (this.cars[c].lidar && !this.cars[c].core.agent) // If this car can move
+ // this.cars[c].step(delta);
+ //}
// Move the agent
if (this.agent){
let {agent_col, on_road} = this.agent.step(delta, action);
diff --git a/src/metacar.ts b/src/metacar.ts
index 41753f4..8c0762f 100644
--- a/src/metacar.ts
+++ b/src/metacar.ts
@@ -3,9 +3,12 @@
*/
import {Level, LevelInfo} from "./level";
-import {actionSpaceDescription} from "./motion_engine";
+import {actionSpaceDescription, MotionEngine} from "./motion_engine";
import {UIEvent} from "./ui_event";
import * as U from "./utils";
+import { BasicMotionEngine, BasicMotionOptions } from "./basic_motion_engine";
+import { ControlMotionEngine } from "./control_motion_engine";
+import { LidarInfoI } from "./car";
/**
* @local Chooce whether to load a file from the computer.
@@ -24,6 +27,9 @@ export class MetaCar {
private eventList: string[] = ["train", "play", "stop", "reset_env", "load"]
private eventCallback: any[];
private event: UIEvent;
+ private agentMotionEngine: typeof BasicMotionEngine|typeof ControlMotionEngine = BasicMotionEngine;
+ private agentMotionOptions: BasicMotionOptions = {}
+ private agentLidarInfo: LidarInfoI;
/**
* Class used to create a new environement.
@@ -48,7 +54,9 @@ export class MetaCar {
console.log(typeof this.levelToLoad, this.levelToLoad);
if (typeof this.levelToLoad == "string"){
U.loadCustomURL(this.levelToLoad, (content: LevelInfo) => {
- this.level = new Level(content, this.canvasId);
+ this.level = new Level(content, this.canvasId);
+ this.level.setAgentMotion(this.agentMotionEngine, this.agentMotionOptions);
+ this.level.setAgentLidar(this.agentLidarInfo);
this._setEvents();
this.level.load((delta: number) => this._loop(delta));
resolve();
@@ -56,13 +64,36 @@ export class MetaCar {
}
else{
this.level = new Level(this.levelToLoad, this.canvasId);
+ this.level.setAgentMotion(this.agentMotionEngine, this.agentMotionOptions);
+ this.level.setAgentLidar(this.agentLidarInfo);
this._setEvents();
this.level.load((delta: number) => this._loop(delta));
resolve();
}
});
}
-
+
+ /**
+ *
+ * options Options to change the lidar options of the agent.
+ * Changing the lidar change the state representation of the car in the
+ * environement.
+ */
+ public setAgentLidar(options: LidarInfoI){
+ this.agentLidarInfo = options;
+ }
+
+ /**
+ * Change the motion engine of the agent. BasicMotionEngine by default.
+ * This method should be called before to called 'load'.
+ * @motion The motion engine to used for the agent when the environement is loaded.
+ * @options Options to change the behavior of the motion engine.
+ */
+ public setAgentMotion(motion: typeof BasicMotionEngine|typeof ControlMotionEngine, options: BasicMotionOptions){
+ this.agentMotionEngine = motion;
+ this.agentMotionOptions = options;
+ }
+
/**
* This method is used to add a button under the canvas. When a
* click is detected on the window, the associated @fc is called.
diff --git a/src/motion_engine.ts b/src/motion_engine.ts
index d7f403b..79c1881 100644
--- a/src/motion_engine.ts
+++ b/src/motion_engine.ts
@@ -10,11 +10,6 @@ import {
} from "./global";
import { Editor } from "./editor";
-export interface MotionOption{
- readonly rotationStep?: number;
- readonly actions: string[];
-}
-
/**
* Structure used to describe the action space.
* @type: Discrete or continous values
@@ -38,15 +33,23 @@ export class MotionEngine {
this.level = level;
}
- protected boxesIntersect(a: any, b: any) {
+ protected boxesIntersect(a: any, b: any, reduce: boolean) {
/*
Chack if a the two elements intersect each others
@a (Pixi sprite)
@b (Pixi sprite)
*/
- var ab = a.getBounds();
- var bb = b.getBounds();
- return ab.x + ab.width > bb.x && ab.x < bb.x + bb.width && ab.y + ab.height > bb.y && ab.y < bb.y + bb.height;
+ var ab = a.getBounds();
+ var bb = b.getBounds();
+
+ if (reduce){
+ ab.width = 15;
+ ab.height = 15;
+ bb.width = 15;
+ bb.height = 15;
+ }
+
+ return ab.x + ab.width > bb.x && ab.x < bb.x + bb.width && ab.y + ab.height > bb.y && ab.y < bb.y + bb.height;
}
protected detectInteractions(){
@@ -63,13 +66,13 @@ export class MotionEngine {
let on_road = false;
for (let i = 0; i < envs.length; i++) {
- if (envs[i] != this.car && envs[i].obstacle && this.boxesIntersect(envs[i], this.car)){
+ if (envs[i] != this.car && envs[i].obstacle && this.boxesIntersect(envs[i], this.car, true)){
agent_col.push(envs[i]);
}
- else if (envs[i].mapId == MAP.ROAD && this.boxesIntersect(envs[i], this.car)){
+ else if (envs[i].mapId == MAP.ROAD && this.boxesIntersect(envs[i], this.car, false)){
on_road = true;
}
- if (this.boxesIntersect(envs[i], this.lidar)){
+ if (this.boxesIntersect(envs[i], this.lidar, false)){
lidar_collisions.push(envs[i]);
}
}
@@ -86,7 +89,7 @@ export class MotionEngine {
let pt_id = 0;
for (var i = 0; i < this.lidar.children.length; i++) {
- this.lidar.children[i].alpha = 0.1;
+ this.lidar.children[i].alpha = 0.3;
if (this.lidar.children[i].pt){ // If this is a lidar point
let pt_y = Math.floor(pt_id/this.lidar.pts);