diff --git a/demo/app.js b/demo/app.js index 56a7bb0..59b8fec 100644 --- a/demo/app.js +++ b/demo/app.js @@ -3,6 +3,7 @@ var fs = require('fs'); const express = require('express'); var path = require("path"); +var cors = require('cors'); function fromDir(startPath,filter){ var files_list = []; @@ -22,6 +23,7 @@ function get_path(file){ } const app = express(); +app.use(cors()); app.use("/dist", express.static(path.join(__dirname, "dist/"))); app.use("/public", express.static(path.join(__dirname, "webapp/public/"))); diff --git a/demo/dist/metacar.min.js b/demo/dist/metacar.min.js index 5b52513..501acb1 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.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, force) {\n if (force === void 0) { force = false; }\n return _this.setCarOnRoad(road, car, line, force);\n };\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, force) {\n if (force === void 0) { force = false; }\n if (line == undefined)\n line = 0;\n var carById = this.level.findCarById(road.cars[0]);\n if (!force && road.cars.length >= 1 && carById && carById.core.line == line) {\n line = line == 0 ? 1 : 0;\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, displayLidar) {\n if (displayLidar === void 0) { displayLidar = true; }\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 if (displayLidar) {\n this.level.addChild(agent.lidar);\n }\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/* 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.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, force) {\n if (force === void 0) { force = false; }\n return _this.setCarOnRoad(road, car, line, force);\n };\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, force) {\n if (force === void 0) { force = false; }\n if (line == undefined)\n line = 0;\n var carById = this.level.findCarById(road.cars[0]);\n if (!force && road.cars.length >= 1 && carById && carById.core.line == line) {\n line = line == 0 ? 1 : 0;\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, displayLidar) {\n if (displayLidar === void 0) { displayLidar = true; }\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 if (displayLidar) {\n this.level.addChild(agent.lidar);\n }\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 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?"); /***/ }), @@ -179,7 +179,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__, \"fullCity\", function() { return fullCity; });\nvar fullCity = {\n \"cars\": [\n {\n \"mx\": 2,\n \"my\": 5,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 3,\n \"my\": 4,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 3,\n \"my\": 4,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 6,\n \"my\": 3,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 6,\n \"my\": 3,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 8,\n \"my\": 2,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 8,\n \"my\": 2,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 2,\n \"my\": 7,\n \"line\": 0,\n \"auto\": true\n }\n ],\n \"house\": [\n {\n \"x\": 9,\n \"y\": 409\n },\n {\n \"x\": 146,\n \"y\": 162\n },\n {\n \"x\": 439,\n \"y\": 39\n }\n ],\n \"house2\": [\n {\n \"x\": 425,\n \"y\": 192\n },\n {\n \"x\": 431,\n \"y\": 354\n }\n ],\n \"house3\": [\n {\n \"x\": 426,\n \"y\": 281\n },\n {\n \"x\": 51,\n \"y\": 157\n },\n {\n \"x\": 553,\n \"y\": 34\n }\n ],\n \"bench\": [\n {\n \"x\": 259,\n \"y\": 206\n },\n {\n \"x\": 8,\n \"y\": 205\n }\n ],\n \"tree\": [\n {\n \"x\": 1,\n \"y\": 303\n },\n {\n \"x\": 54,\n \"y\": 357\n },\n {\n \"x\": 215,\n \"y\": 325\n },\n {\n \"x\": 230,\n \"y\": 400\n },\n {\n \"x\": 282,\n \"y\": 368\n },\n {\n \"x\": 182,\n \"y\": 433\n },\n {\n \"x\": 285,\n \"y\": 309\n },\n {\n \"x\": 576,\n \"y\": 233\n },\n {\n \"x\": 581,\n \"y\": 300\n },\n {\n \"x\": 519,\n \"y\": 388\n },\n {\n \"x\": 582,\n \"y\": 391\n },\n {\n \"x\": 256,\n \"y\": 69\n },\n {\n \"x\": 151,\n \"y\": 43\n },\n {\n \"x\": 77,\n \"y\": 77\n },\n {\n \"x\": 26,\n \"y\": 24\n },\n {\n \"x\": 189,\n \"y\": 98\n }\n ],\n \"map\": [\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↠\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↦\",\n \"↔\",\n \"↔\",\n \"↟\",\n \"↔\"\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n \"↔\",\n \"↔\",\n \"↧\",\n \"↔\",\n \"↠\",\n \"↔\",\n \"↤\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n \"↠\",\n 0,\n 0,\n 0,\n \"↠\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ]\n ]\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded/level/full_city.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fullCity\", function() { return fullCity; });\nvar fullCity = {\n \"cars\": [\n {\n \"mx\": 2,\n \"my\": 5,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 3,\n \"my\": 4,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 3,\n \"my\": 4,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 6,\n \"my\": 3,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 6,\n \"my\": 3,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 8,\n \"my\": 2,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 8,\n \"my\": 2,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 2,\n \"my\": 7,\n \"line\": 0,\n \"auto\": true\n }\n ],\n \"house\": [\n {\n \"x\": 9,\n \"y\": 409\n },\n {\n \"x\": 146,\n \"y\": 162\n },\n {\n \"x\": 439,\n \"y\": 39\n }\n ],\n \"house2\": [\n {\n \"x\": 425,\n \"y\": 192\n },\n {\n \"x\": 431,\n \"y\": 354\n }\n ],\n \"house3\": [\n {\n \"x\": 426,\n \"y\": 281\n },\n {\n \"x\": 51,\n \"y\": 157\n },\n {\n \"x\": 553,\n \"y\": 34\n }\n ],\n \"bench\": [\n {\n \"x\": 259,\n \"y\": 206\n },\n {\n \"x\": 8,\n \"y\": 205\n }\n ],\n \"tree\": [\n {\n \"x\": 1,\n \"y\": 303\n },\n {\n \"x\": 54,\n \"y\": 357\n },\n {\n \"x\": 215,\n \"y\": 325\n },\n {\n \"x\": 230,\n \"y\": 400\n },\n {\n \"x\": 282,\n \"y\": 368\n },\n {\n \"x\": 182,\n \"y\": 433\n },\n {\n \"x\": 285,\n \"y\": 309\n },\n {\n \"x\": 576,\n \"y\": 233\n },\n {\n \"x\": 581,\n \"y\": 300\n },\n {\n \"x\": 519,\n \"y\": 388\n },\n {\n \"x\": 582,\n \"y\": 391\n },\n {\n \"x\": 256,\n \"y\": 69\n },\n {\n \"x\": 151,\n \"y\": 43\n },\n {\n \"x\": 77,\n \"y\": 77\n },\n {\n \"x\": 26,\n \"y\": 24\n },\n {\n \"x\": 189,\n \"y\": 98\n }\n ],\n \"map\": [\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↟\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↦\",\n \"↔\",\n \"↔\",\n \"↠\",\n \"↔\"\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n \"↔\",\n \"↔\",\n \"↧\",\n \"↔\",\n \"↠\",\n \"↔\",\n \"↤\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n \"↟\",\n 0,\n 0,\n 0,\n \"↟\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ]\n ]\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded/level/full_city.ts?"); /***/ }), @@ -191,7 +191,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__, \"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?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"level0\", function() { return level0; });\nvar level0 = {\n \"cars\": [],\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?"); /***/ }), @@ -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 export (binding) */ __webpack_require__.d(__webpack_exports__, \"Application\", function() { return Application; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Loader\", function() { return Loader; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Resources\", function() { return Resources; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Sprite\", function() { return Sprite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Graphics\", function() { return Graphics; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Container\", function() { return Container; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"URL\", function() { return URL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JSON_TEXTURES\", function() { return JSON_TEXTURES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JSON_IMAGE\", function() { return JSON_IMAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"IMAGE_FOLDER\", function() { return IMAGE_FOLDER; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ROADSIZE\", function() { return ROADSIZE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CAR_IMG\", function() { return CAR_IMG; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MAP\", function() { return MAP; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ASSETS\", function() { return ASSETS; });\n/* harmony import */ var pixi_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! pixi.js */ \"pixi.js\");\n/* harmony import */ var pixi_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(pixi_js__WEBPACK_IMPORTED_MODULE_0__);\n\nvar Application = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Application\"];\nvar Loader = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"loader\"];\nvar Resources = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"loader\"].resources;\nvar Sprite = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Sprite\"];\nvar Graphics = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"];\nvar Container = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Container\"];\nvar URL = window.location.href.indexOf(\"localhost\") == -1 ? \"https://metacar-project.com/\" : \"http://localhost:3000/\";\nvar JSON_TEXTURES = URL + \"public/textures/textures.json\";\nvar JSON_IMAGE = URL + \"public/textures/textures.png\";\nvar IMAGE_FOLDER = URL + \"public/images/\";\nvar ROADSIZE = 60;\nvar CAR_IMG = {\n DEFAULT: \"car.png\",\n AGENT: \"car_agent.png\"\n};\nvar MAP = {\n ROAD: -1,\n DEFAULT: 0,\n CAR: 1,\n AGENT: 1,\n};\nvar ASSETS = {\n ROADS: {\n \"↕\": {\n \"image\": \"road_u.png\",\n \"orientation\": 1.5\n },\n \"↔\": {\n \"image\": \"road_r.png\",\n \"orientation\": 0.\n },\n \"↱\": {\n \"image\": \"road_rotate_ld.png\",\n \"orientation\": 1.25\n },\n \"↰\": {\n \"image\": \"road_rotate_ul.png\",\n \"orientation\": 0.75\n },\n \"↲\": {\n \"image\": \"road_rotate_rl.png\",\n \"orientation\": 0.25\n },\n \"↳\": {\n \"image\": \"road_rotate_dl.png\",\n \"orientation\": 1.75\n },\n \"↟\": {\n \"image\": \"road_up.png\",\n \"orientation\": 1.5\n },\n \"↠\": {\n \"image\": \"road_rp.png\",\n \"orientation\": 0.\n },\n \"↤\": {\n \"image\": \"road_r2.png\",\n \"orientation\": 0.\n },\n \"↦\": {\n \"image\": \"road_l2.png\",\n \"orientation\": 1.\n },\n \"↥\": {\n \"image\": \"road_d2.png\",\n \"orientation\": 0.5\n },\n \"↧\": {\n \"image\": \"road_u2.png\",\n \"orientation\": 1.5\n },\n },\n \"house\": {\n \"image\": \"house.png\"\n },\n \"house2\": {\n \"image\": \"house2.png\"\n },\n \"house3\": {\n \"image\": \"house3.png\"\n },\n \"bench\": {\n \"image\": \"bench.png\"\n },\n \"tree\": {\n \"image\": \"tree.png\"\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/global.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Application\", function() { return Application; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Loader\", function() { return Loader; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Resources\", function() { return Resources; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Sprite\", function() { return Sprite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Graphics\", function() { return Graphics; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Container\", function() { return Container; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"URL\", function() { return URL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JSON_TEXTURES\", function() { return JSON_TEXTURES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JSON_IMAGE\", function() { return JSON_IMAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"IMAGE_FOLDER\", function() { return IMAGE_FOLDER; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ROADSIZE\", function() { return ROADSIZE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CAR_IMG\", function() { return CAR_IMG; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MAP\", function() { return MAP; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ASSETS\", function() { return ASSETS; });\n/* harmony import */ var pixi_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! pixi.js */ \"pixi.js\");\n/* harmony import */ var pixi_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(pixi_js__WEBPACK_IMPORTED_MODULE_0__);\n\nvar Application = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Application\"];\nvar Loader = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"loader\"];\nvar Resources = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"loader\"].resources;\nvar Sprite = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Sprite\"];\nvar Graphics = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"];\nvar Container = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Container\"];\nvar URL = \"https://metacar-project.com/\";\nvar JSON_TEXTURES = URL + \"public/textures/textures.json\";\nvar JSON_IMAGE = URL + \"public/textures/textures.png\";\nvar IMAGE_FOLDER = URL + \"public/images/\";\nvar ROADSIZE = 60;\nvar CAR_IMG = {\n DEFAULT: \"car.png\",\n AGENT: \"car_agent.png\"\n};\nvar MAP = {\n ROAD: -1,\n DEFAULT: 0,\n CAR: 1,\n AGENT: 1,\n};\nvar ASSETS = {\n ROADS: {\n \"↕\": {\n \"image\": \"road_u.png\",\n \"orientation\": 1.5\n },\n \"↔\": {\n \"image\": \"road_r.png\",\n \"orientation\": 0.\n },\n \"↱\": {\n \"image\": \"road_rotate_ld.png\",\n \"orientation\": 1.25\n },\n \"↰\": {\n \"image\": \"road_rotate_ul.png\",\n \"orientation\": 0.75\n },\n \"↲\": {\n \"image\": \"road_rotate_rl.png\",\n \"orientation\": 0.25\n },\n \"↳\": {\n \"image\": \"road_rotate_dl.png\",\n \"orientation\": 1.75\n },\n \"↟\": {\n \"image\": \"road_up.png\",\n \"orientation\": 1.5\n },\n \"↠\": {\n \"image\": \"road_rp.png\",\n \"orientation\": 0.\n },\n \"↤\": {\n \"image\": \"road_r2.png\",\n \"orientation\": 0.\n },\n \"↦\": {\n \"image\": \"road_l2.png\",\n \"orientation\": 1.\n },\n \"↥\": {\n \"image\": \"road_d2.png\",\n \"orientation\": 0.5\n },\n \"↧\": {\n \"image\": \"road_u2.png\",\n \"orientation\": 1.5\n },\n },\n \"house\": {\n \"image\": \"house.png\"\n },\n \"house2\": {\n \"image\": \"house2.png\"\n },\n \"house3\": {\n \"image\": \"house3.png\"\n },\n \"bench\": {\n \"image\": \"bench.png\"\n },\n \"tree\": {\n \"image\": \"tree.png\"\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/global.ts?"); /***/ }), @@ -239,7 +239,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.isCarsMoving = true;\n _this.lastReward = 0;\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.carsMoving = function (moving) {\n this.isCarsMoving = moving;\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 for (var c = 0; c < this.cars.length; c++) {\n this.cars[c].reset();\n }\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 this.lastReward = reward;\n return reward;\n };\n Level.prototype.getLastReward = function () {\n return this.lastReward;\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), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n var reward = this.setReward(agentCollisions, onRoad, 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.isCarsMoving = true;\n _this.lastReward = 0;\n _this.rewardFunction = null;\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.setRewardFunction = function (fc) {\n this.rewardFunction = fc;\n };\n Level.prototype.carsMoving = function (moving) {\n this.isCarsMoving = moving;\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 for (var c = 0; c < this.cars.length; c++) {\n }\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 = -1;\n }\n else if (!on_road) {\n reward = -1;\n }\n return reward;\n };\n Level.prototype.getLastReward = function () {\n return this.lastReward;\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), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n var reward = void 0;\n if (this.rewardFunction) {\n reward = this.rewardFunction(agentCollisions, onRoad, action);\n }\n else {\n reward = this.setReward(agentCollisions, onRoad, action);\n }\n this.lastReward = reward;\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?"); /***/ }), @@ -251,7 +251,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/* 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 this.isCarsMoving = true;\n this.loopCallback = undefined;\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 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.level.carsMoving(_this.isCarsMoving);\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.level.carsMoving(_this.isCarsMoving);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); });\n resolve();\n }\n });\n };\n MetaCar.prototype.carsMoving = function (moving) {\n this.isCarsMoving = moving;\n };\n MetaCar.prototype.getLastReward = function () {\n return this.level.getLastReward();\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 (fc) {\n this.loopCallback = fc;\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 if (this.loopCallback) {\n this.loopCallback();\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 this.isCarsMoving = true;\n this.loopCallback = undefined;\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.setRewardFunction = function (fc) {\n this.level.setRewardFunction(fc);\n };\n MetaCar.prototype.carsMoving = function (moving) {\n this.isCarsMoving = moving;\n };\n MetaCar.prototype.getLastReward = function () {\n return this.level.getLastReward();\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 (fc) {\n this.loopCallback = fc;\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 if (this.loopCallback) {\n this.loopCallback();\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 MetaCar.prototype.load = function () {\n var _this = this;\n return new Promise(function (resolve, reject) {\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.level.carsMoving(_this.isCarsMoving);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); }).then(function () {\n resolve();\n });\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.level.carsMoving(_this.isCarsMoving);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); }).then(function () {\n resolve();\n });\n }\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__, \"MetaCarEditor\", function() { return MetaCarEditor; });\n/* harmony import */ var _ui_event__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ui_event */ \"./src/ui_event.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\n/* harmony import */ var _editor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./editor */ \"./src/editor.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\n\n\n\nvar MetaCarEditor = (function () {\n function MetaCarEditor(canvasId, levelToLoad) {\n this.eventList = [\"save\"];\n if (!canvasId || this.levelToLoad) {\n console.error(\"You must specify the canvasId and the levelToLoad\");\n }\n this.canvasId = canvasId;\n this.levelToLoad = levelToLoad;\n }\n MetaCarEditor.prototype.load = function (level, agent) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n if (typeof _this.levelToLoad == \"string\") {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"loadCustomURL\"](_this.levelToLoad, function (content) {\n _this.level = new _editor__WEBPACK_IMPORTED_MODULE_2__[\"Editor\"](content, _this.canvasId);\n _this.level.load(function (delta) { return _this.loop(delta); });\n _this.event = new _ui_event__WEBPACK_IMPORTED_MODULE_0__[\"UIEvent\"](_this.level, _this.canvasId);\n _this.event.createEditorElementsEvents();\n _this.eventCallback = [\n function (fc, options) { return _this.event.onSaveEditor(fc, options); }\n ];\n resolve();\n });\n }\n else {\n _this.level = new _editor__WEBPACK_IMPORTED_MODULE_2__[\"Editor\"](_this.levelToLoad, _this.canvasId);\n _this.level.load(function (delta) { return _this.loop(delta); });\n _this.event = new _ui_event__WEBPACK_IMPORTED_MODULE_0__[\"UIEvent\"](_this.level, _this.canvasId);\n _this.event.createEditorElementsEvents();\n _this.eventCallback = [\n function (fc, options) { return _this.event.onSaveEditor(fc, options); }\n ];\n resolve();\n }\n });\n };\n MetaCarEditor.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 this.eventCallback[index](fc, options);\n };\n MetaCarEditor.prototype.loop = function (delta) {\n var mousePos = this.level.getMousePosition();\n var selectedItem = this.level.getSelectedItems();\n if (selectedItem && selectedItem.type == \"asset\") {\n selectedItem.x = mousePos.x;\n selectedItem.y = mousePos.y;\n }\n else if (selectedItem) {\n selectedItem.x = Math.floor(mousePos.x / _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"]) * _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"];\n selectedItem.y = Math.floor(mousePos.y / _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"]) * _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"];\n }\n };\n return MetaCarEditor;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/metacar_editor.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MetaCarEditor\", function() { return MetaCarEditor; });\n/* harmony import */ var _ui_event__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ui_event */ \"./src/ui_event.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\n/* harmony import */ var _editor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./editor */ \"./src/editor.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\n\n\n\nvar MetaCarEditor = (function () {\n function MetaCarEditor(canvasId, levelToLoad) {\n this.eventList = [\"save\"];\n if (!canvasId || this.levelToLoad) {\n console.error(\"You must specify the canvasId and the levelToLoad\");\n }\n this.canvasId = canvasId;\n this.levelToLoad = levelToLoad;\n }\n MetaCarEditor.prototype.load = function (level, agent) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n if (typeof _this.levelToLoad == \"string\") {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"loadCustomURL\"](_this.levelToLoad, function (content) {\n _this.level = new _editor__WEBPACK_IMPORTED_MODULE_2__[\"Editor\"](content, _this.canvasId);\n _this.level.load(function (delta) { return _this.loop(delta); });\n _this.event = new _ui_event__WEBPACK_IMPORTED_MODULE_0__[\"UIEvent\"](_this.level, _this.canvasId);\n _this.event.createEditorElementsEvents();\n _this.eventCallback = [\n function (fc, options) { return _this.event.onSaveEditor(fc, options); }\n ];\n resolve();\n });\n }\n else {\n _this.level = new _editor__WEBPACK_IMPORTED_MODULE_2__[\"Editor\"](_this.levelToLoad, _this.canvasId);\n _this.level.load(function (delta) { return _this.loop(delta); });\n _this.event = new _ui_event__WEBPACK_IMPORTED_MODULE_0__[\"UIEvent\"](_this.level, _this.canvasId);\n _this.event.createEditorElementsEvents();\n _this.eventCallback = [\n function (fc, options) { return _this.event.onSaveEditor(fc, options); }\n ];\n resolve();\n }\n });\n };\n MetaCarEditor.prototype.save = function (content, file_name) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"saveAs\"](content, file_name);\n };\n MetaCarEditor.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 this.eventCallback[index](fc, options);\n };\n MetaCarEditor.prototype.loop = function (delta) {\n var mousePos = this.level.getMousePosition();\n var selectedItem = this.level.getSelectedItems();\n if (selectedItem && selectedItem.type == \"asset\") {\n selectedItem.x = mousePos.x;\n selectedItem.y = mousePos.y;\n }\n else if (selectedItem) {\n selectedItem.x = Math.floor(mousePos.x / _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"]) * _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"];\n selectedItem.y = Math.floor(mousePos.y / _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"]) * _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"];\n }\n };\n return MetaCarEditor;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/metacar_editor.ts?"); /***/ }), @@ -299,7 +299,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__, \"loadJSON\", function() { return loadJSON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadEmbeddedURL\", function() { return loadEmbeddedURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadLocalStorageURL\", function() { return loadLocalStorageURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadCustomURL\", function() { return loadCustomURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mod\", function() { return mod; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"argMax\", function() { return argMax; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mean\", function() { return mean; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"saveAs\", function() { return saveAs; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"readDump\", function() { return readDump; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"shuffleArray\", function() { return shuffleArray; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"keyboard\", function() { return keyboard; });\n/* harmony import */ var _embedded__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./embedded */ \"./src/embedded.ts\");\n\nfunction loadJSON(url, callback) {\n var xobj = new XMLHttpRequest();\n xobj.overrideMimeType(\"application/json\");\n xobj.open('GET', url, true);\n xobj.onreadystatechange = function () {\n if (xobj.readyState == 4 && xobj.status == 200) {\n callback(xobj.responseText);\n }\n };\n xobj.send(null);\n}\nfunction loadEmbeddedURL(url, callback) {\n var split = url.split(\"//\");\n split = split[1].split(\"/\");\n callback(_embedded__WEBPACK_IMPORTED_MODULE_0__[\"embeddedContent\"][split[0]][split[1]]);\n}\nfunction loadLocalStorageURL(url, callback) {\n}\nfunction loadCustomURL(url, callback) {\n var customCall = {\n \"embedded:\": loadEmbeddedURL,\n \"http://\": loadJSON,\n \"https://\": loadJSON,\n \"localstorage://\": loadLocalStorageURL\n };\n var split = url.split(\"//\");\n customCall[split[0]](url, callback);\n}\nfunction mod(n, m) {\n return ((n % m) + m) % m;\n}\nfunction argMax(array) {\n if (array.every(function (v) { return v == -Infinity; })) {\n return Math.floor(Math.random() * array.length);\n }\n return array.map(function (x, i) { return [x, i]; }).reduce(function (r, a) { return (a[0] > r[0] ? a : r); })[1];\n}\nfunction mean(array) {\n if (array.length == 0)\n return null;\n var sum = array.reduce(function (a, b) { return a + b; });\n var avg = sum / array.length;\n return avg;\n}\nfunction saveAs(content, name) {\n var a = document.createElement(\"a\");\n document.body.appendChild(a);\n var blob = new Blob([content], { type: 'application/octet-binary' }), tmpURL = window.URL.createObjectURL(blob);\n a.href = tmpURL;\n a.download = name;\n a.click();\n window.URL.revokeObjectURL(tmpURL);\n a.href = \"\";\n}\nfunction readDump(dump, callback) {\n var input = dump.target;\n var file = input.files[0];\n var reader = new FileReader();\n reader.readAsText(file, \"UTF-8\");\n reader.onload = function (evt) {\n callback(evt.target.result);\n };\n}\nfunction shuffleArray(array) {\n for (var i = array.length - 1; i > 0; i--) {\n var j = Math.floor(Math.random() * (i + 1));\n var temp = array[i];\n array[i] = array[j];\n array[j] = temp;\n }\n return array;\n}\nfunction keyboard(keyCode) {\n var key = {};\n key.code = keyCode;\n key.isDown = false;\n key.isUp = true;\n key.press = undefined;\n key.release = undefined;\n key.downHandler = function (event) {\n if (event.keyCode === key.code) {\n if (key.isUp && key.press)\n key.press();\n key.isDown = true;\n key.isUp = false;\n }\n event.preventDefault();\n };\n key.upHandler = function (event) {\n if (event.keyCode === key.code) {\n if (key.isDown && key.release)\n key.release();\n key.isDown = false;\n key.isUp = true;\n }\n event.preventDefault();\n };\n window.addEventListener(\"keydown\", key.downHandler.bind(key), false);\n window.addEventListener(\"keyup\", key.upHandler.bind(key), false);\n return key;\n}\n\n\n//# sourceURL=webpack://metacar/./src/utils.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadJSON\", function() { return loadJSON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadEmbeddedURL\", function() { return loadEmbeddedURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadLocalStorageURL\", function() { return loadLocalStorageURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadCustomURL\", function() { return loadCustomURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mod\", function() { return mod; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"argMax\", function() { return argMax; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mean\", function() { return mean; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"saveAs\", function() { return saveAs; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"readDump\", function() { return readDump; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"shuffleArray\", function() { return shuffleArray; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"keyboard\", function() { return keyboard; });\n/* harmony import */ var _embedded__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./embedded */ \"./src/embedded.ts\");\n\nfunction loadJSON(url, callback) {\n var xobj = new XMLHttpRequest();\n xobj.overrideMimeType(\"application/json\");\n xobj.open('GET', url, true);\n xobj.onreadystatechange = function () {\n if (xobj.readyState == 4 && xobj.status == 200) {\n callback(JSON.parse(xobj.responseText));\n }\n };\n xobj.send(null);\n}\nfunction loadEmbeddedURL(url, callback) {\n var split = url.split(\"//\");\n split = split[1].split(\"/\");\n callback(_embedded__WEBPACK_IMPORTED_MODULE_0__[\"embeddedContent\"][split[0]][split[1]]);\n}\nfunction loadLocalStorageURL(url, callback) {\n}\nfunction loadCustomURL(url, callback) {\n var customCall = {\n \"embedded:\": loadEmbeddedURL,\n \"http:\": loadJSON,\n \"https:\": loadJSON\n };\n var split = url.split(\"//\");\n customCall[split[0]](url, callback);\n}\nfunction mod(n, m) {\n return ((n % m) + m) % m;\n}\nfunction argMax(array) {\n if (array.every(function (v) { return v == -Infinity; })) {\n return Math.floor(Math.random() * array.length);\n }\n return array.map(function (x, i) { return [x, i]; }).reduce(function (r, a) { return (a[0] > r[0] ? a : r); })[1];\n}\nfunction mean(array) {\n if (array.length == 0)\n return null;\n var sum = array.reduce(function (a, b) { return a + b; });\n var avg = sum / array.length;\n return avg;\n}\nfunction saveAs(content, name) {\n var a = document.createElement(\"a\");\n document.body.appendChild(a);\n var blob = new Blob([content], { type: 'application/octet-binary' }), tmpURL = window.URL.createObjectURL(blob);\n a.href = tmpURL;\n a.download = name;\n a.click();\n window.URL.revokeObjectURL(tmpURL);\n a.href = \"\";\n}\nfunction readDump(dump, callback) {\n var input = dump.target;\n var file = input.files[0];\n var reader = new FileReader();\n reader.readAsText(file, \"UTF-8\");\n reader.onload = function (evt) {\n callback(evt.target.result);\n };\n}\nfunction shuffleArray(array) {\n for (var i = array.length - 1; i > 0; i--) {\n var j = Math.floor(Math.random() * (i + 1));\n var temp = array[i];\n array[i] = array[j];\n array[j] = temp;\n }\n return array;\n}\nfunction keyboard(keyCode) {\n var key = {};\n key.code = keyCode;\n key.isDown = false;\n key.isUp = true;\n key.press = undefined;\n key.release = undefined;\n key.downHandler = function (event) {\n if (event.keyCode === key.code) {\n if (key.isUp && key.press)\n key.press();\n key.isDown = true;\n key.isUp = false;\n }\n event.preventDefault();\n };\n key.upHandler = function (event) {\n if (event.keyCode === key.code) {\n if (key.isDown && key.release)\n key.release();\n key.isDown = false;\n key.isUp = true;\n }\n event.preventDefault();\n };\n window.addEventListener(\"keydown\", key.downHandler.bind(key), false);\n window.addEventListener(\"keyup\", key.upHandler.bind(key), false);\n return key;\n}\n\n\n//# sourceURL=webpack://metacar/./src/utils.ts?"); /***/ }), @@ -311,7 +311,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__, \"World\", function() { return World; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar World = (function () {\n function World(levelContent, canvasId) {\n this.agent = null;\n this.app = null;\n this.map = null;\n this.info = null;\n this.envs = [];\n this.roads = {};\n this.cars = [];\n this.info = levelContent;\n this.canvasId = canvasId;\n }\n World.prototype.load = function (loop) {\n var _this = this;\n this.loop = loop;\n return new Promise(function (resolve, reject) {\n _this.createLevel(_this.info).then(function () { return resolve(); });\n });\n };\n World.prototype.createLevel = function (info) {\n var _this = this;\n this.map = info.map;\n this.app = new PIXI.Application({\n width: this.map[0].length * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"],\n height: this.map.length * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"],\n backgroundColor: 0x80bf3e\n });\n document.getElementById(this.canvasId).appendChild(this.app.view);\n return new Promise(function (resolve, reject) {\n _global__WEBPACK_IMPORTED_MODULE_0__[\"Loader\"].add([_global__WEBPACK_IMPORTED_MODULE_0__[\"JSON_TEXTURES\"], _global__WEBPACK_IMPORTED_MODULE_0__[\"JSON_IMAGE\"]]).load(function () {\n _this._setup(info);\n resolve();\n });\n });\n };\n World.prototype._setup = function (info) {\n console.warn(\"This method should be implemented.\");\n };\n World.prototype.getRoads = function () {\n return this.roads;\n };\n World.prototype.findCarById = function (id) {\n return this.cars.find(function (e) { return e.core.carId == id; });\n };\n World.prototype.getRoad = function (my, mx) {\n return this.roads[[my.toString(), mx.toString()].toString()];\n };\n World.prototype.addRoad = function (road) {\n this.roads[[road.my.toString(), road.mx.toString()].toString()] = road;\n this.envs.push(road);\n this.app.stage.addChild(road);\n };\n World.prototype.addCar = function (car) {\n this.cars.push(car);\n this.app.stage.addChild(car.core);\n this.envs.push(car.core);\n };\n World.prototype.getEnvs = function () {\n return this.envs;\n };\n World.prototype.getMap = function () {\n return this.map;\n };\n World.prototype.addChild = function (child) {\n this.app.stage.addChild(child);\n };\n World.prototype.render = function (val) {\n if (val) {\n this.app.ticker.start();\n }\n else {\n this.app.ticker.stop();\n }\n };\n World.prototype.reset = function () {\n };\n World.prototype.resize = function (width, height) {\n this.app.renderer.resize(width * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"], height * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"]);\n };\n World.prototype.getMousePosition = function () {\n return this.app.renderer.plugins.interaction.mouse.global;\n };\n return World;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/world.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"World\", function() { return World; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar World = (function () {\n function World(levelContent, canvasId) {\n this.agent = null;\n this.app = null;\n this.map = null;\n this.info = null;\n this.envs = [];\n this.roads = {};\n this.cars = [];\n this.info = levelContent;\n this.canvasId = canvasId;\n }\n World.prototype.load = function (loop) {\n var _this = this;\n this.loop = loop;\n return new Promise(function (resolve, reject) {\n _this.createLevel(_this.info).then(function () { return resolve(); });\n });\n };\n World.prototype.createLevel = function (info) {\n var _this = this;\n this.map = info.map;\n this.app = new PIXI.Application({\n width: this.map[0].length * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"],\n height: this.map.length * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"],\n backgroundColor: 0x80bf3e\n });\n document.getElementById(this.canvasId).appendChild(this.app.view);\n return new Promise(function (resolve, reject) {\n _global__WEBPACK_IMPORTED_MODULE_0__[\"Loader\"].add([_global__WEBPACK_IMPORTED_MODULE_0__[\"JSON_TEXTURES\"], _global__WEBPACK_IMPORTED_MODULE_0__[\"JSON_IMAGE\"]], { crossOrigin: true }).load(function () {\n _this._setup(info);\n resolve();\n });\n });\n };\n World.prototype._setup = function (info) {\n console.warn(\"This method should be implemented.\");\n };\n World.prototype.getRoads = function () {\n return this.roads;\n };\n World.prototype.findCarById = function (id) {\n return this.cars.find(function (e) { return e.core.carId == id; });\n };\n World.prototype.getRoad = function (my, mx) {\n return this.roads[[my.toString(), mx.toString()].toString()];\n };\n World.prototype.addRoad = function (road) {\n this.roads[[road.my.toString(), road.mx.toString()].toString()] = road;\n this.envs.push(road);\n this.app.stage.addChild(road);\n };\n World.prototype.addCar = function (car) {\n this.cars.push(car);\n this.app.stage.addChild(car.core);\n this.envs.push(car.core);\n };\n World.prototype.getEnvs = function () {\n return this.envs;\n };\n World.prototype.getMap = function () {\n return this.map;\n };\n World.prototype.addChild = function (child) {\n this.app.stage.addChild(child);\n };\n World.prototype.render = function (val) {\n if (val) {\n this.app.ticker.start();\n }\n else {\n this.app.ticker.stop();\n }\n };\n World.prototype.reset = function () {\n };\n World.prototype.resize = function (width, height) {\n this.app.renderer.resize(width * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"], height * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"]);\n };\n World.prototype.getMousePosition = function () {\n return this.app.renderer.plugins.interaction.mouse.global;\n };\n return World;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/world.ts?"); /***/ }), diff --git a/demo/package.json b/demo/package.json index 94c086d..a15a9c5 100644 --- a/demo/package.json +++ b/demo/package.json @@ -9,6 +9,7 @@ "author": "Thibault Neveu", "license": "ISC", "dependencies": { + "cors": "^2.8.4", "express": "^4.16.3", "pixi.js": "^4.8.1" } diff --git a/demo/webapp/public/js/editor.js b/demo/webapp/public/js/editor.js index 2844154..41c54e0 100644 --- a/demo/webapp/public/js/editor.js +++ b/demo/webapp/public/js/editor.js @@ -9,12 +9,12 @@ if (levelObject){ } // Create the editor (canvasID, levelUrl) -var editor = new metacar.editor("editor", levelToLoad); +var editor = new metacar.editor("editor", "http://localhost:3000/public/levels/levelGet.json"); editor.load().then(() => { editor.addEvent("save", (content) => { - console.log(content); // Put the object into storage localStorage.setItem('mylevel.json', JSON.stringify(content)); window.open("/test_editor.html"); - }, {download: false, name: "level0.json"}); + + }, {download: false, name: "level.json"}); }); \ No newline at end of file diff --git a/demo/webapp/public/js/level0.js b/demo/webapp/public/js/level0.js index 1d5d0d9..7ee6e69 100644 --- a/demo/webapp/public/js/level0.js +++ b/demo/webapp/public/js/level0.js @@ -3,9 +3,7 @@ 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.setAgentMotion(metacar.motion.BasicMotion, {rotationStep: 0.25}); env.setAgentLidar({pts: 2, width: 1, height: 1, pos: 1}); env.carsMoving(false); @@ -17,12 +15,19 @@ env.loop(() => { displayState("realtime_viewer", state, 200, 200); let scores = agent.getStateValues(state); let reward = env.getLastReward(); - //displayScores("realtime_viewer", scores, reward, ["Top", "Left", "Right"]); -}) + displayScores("realtime_viewer", scores, reward, ["Top", "Left", "Right"]); +}); + + env.load().then(() => { + // The level is loaded. Add listernes - env.addEvent("train", () => agent.train()); + env.addEvent("train", () => { + let train = confirm("The training process will freeze the tab during 1 minutes. Do you want to continue? You can also load the pre trained agent."); + if (train) + agent.train(); + }); env.addEvent("play", () => agent.play()); env.addEvent("stop"); env.addEvent("reset_env", () => { @@ -30,9 +35,11 @@ env.load().then(() => { }); env.addEvent("save", () => agent.save()); env.addEvent("load", (content) => { - agent.restore(content); - displayQTable("q_table", agent.stateList, agent, ["Top", "Left", "Right"]); - } , {local: true}); + loadJSON("http://localhost:3000/public/models/qtable/qtable.json", (content) => { + agent.restore(content); + displayQTable("q_table", agent.stateList, agent, ["Top", "Left", "Right"]); + }); + }); env.addEvent("custom", () => { }); }); diff --git a/demo/webapp/public/js/level1.js b/demo/webapp/public/js/level1.js index 390c0c5..710ec60 100644 --- a/demo/webapp/public/js/level1.js +++ b/demo/webapp/public/js/level1.js @@ -3,6 +3,8 @@ let levelUrl = metacar.level.level1; // Create the environement (canvasID, levelUrl) var env = new metacar.env("canvas", levelUrl); +env.setAgentMotion(metacar.motion.BasicMotion, {rotationStep: 0.1}); + // Create the Policy agent var agent = new PolicyAgent(env); @@ -16,7 +18,13 @@ env.loop(() => { env.load().then(() => { // The level is loaded. Add listernes - env.addEvent("train", () => agent.train()); + + env.addEvent("train", () => { + let train = confirm("The training process takes some time and might slow this tab. Do you want to continue? \ + You can also load a pre-trained model"); + if (train) + agent.train(); + }); env.addEvent("play", () => agent.play()); env.addEvent("stop", () => agent.stop()); env.addEvent("reset_env", () => { diff --git a/demo/webapp/public/js/policy_agent.js b/demo/webapp/public/js/policy_agent.js index f75eda0..609c709 100644 --- a/demo/webapp/public/js/policy_agent.js +++ b/demo/webapp/public/js/policy_agent.js @@ -22,7 +22,7 @@ class PolicyAgent { Build the Value function @weights (Object) Weights for the layer */ - const LEARNING_RATE = 0.05; + const LEARNING_RATE = 0.01; const value_optimizer = tf.train.adam(LEARNING_RATE); /* ----------------------- @@ -59,7 +59,7 @@ class PolicyAgent { Build the policy network @weights (Object) Weights for the layer */ - const LEARNING_RATE = 0.05; + const LEARNING_RATE = 0.01; this.policy_optimizer = tf.train.adam(LEARNING_RATE); /* ----------------------- @@ -160,7 +160,7 @@ class PolicyAgent { // Maximum number of step per episode this.nb_step = 800; this.mini_batch_size = 200; - this.episodeNb = 100; + this.episodeNb = 200; } save(env){ @@ -175,14 +175,8 @@ class PolicyAgent { /* Restore the weights of the network */ - if (window.location.href.indexOf("localhost") == -1){ - this.valueModel = await tf.loadModel('https://metacar-project.com/public/models/policy/value-model-policy-agent.json'); - this.policyModel = await tf.loadModel("https://metacar-project.com/public/models/policy/policy-model-policy-agent.json"); - } - else{ - this.valueModel = await tf.loadModel('http://localhost:3000/public/models/policy/value-model-policy-agent.json'); - this.policyModel = await tf.loadModel("http://localhost:3000/public/models/policy/policy-model-policy-agent.json"); - } + this.valueModel = await tf.loadModel('https://metacar-project.com/public/models/policy/value-model-policy-agent.json'); + this.policyModel = await tf.loadModel("https://metacar-project.com/public/models/policy/policy-model-policy-agent.json"); } play(){ @@ -258,6 +252,9 @@ class PolicyAgent { st.dispose(); // Step in the environement with this action reward = this.env.step(action); + if (reward == -1){ + reward = -10; + } } // Size of the next batches && minibatches const batch_size = rewards.length; diff --git a/demo/webapp/public/js/q_table_agent.js b/demo/webapp/public/js/q_table_agent.js index 5ed62fd..628da47 100644 --- a/demo/webapp/public/js/q_table_agent.js +++ b/demo/webapp/public/js/q_table_agent.js @@ -14,9 +14,7 @@ class QTableAgent { 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"); + this.env.save(save_content, "qtable.json"); } stringStateToState(state){ @@ -37,7 +35,6 @@ class QTableAgent { restore(content){ this.Q = {}; this.stateList = []; - content = JSON.parse(content); for (const key in content){ var nStateToPush = this.stringStateToState(key); var st = key.toString(); @@ -53,9 +50,6 @@ class QTableAgent { } } } - console.log(this.Q); - console.log(this.stateList); - console.log("Q table loaded"); } play(){ @@ -103,14 +97,14 @@ class QTableAgent { } train(){ - let episode = 10000; + let episode = 2000; 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); + if (ep % 10 == 0){ + eps = Math.max(0.05, eps*eps_decrease); console.log("episode=", ep, "eps=", eps, "mean_reward", mean(mean_reward)); } mean_reward = []; @@ -128,11 +122,15 @@ class QTableAgent { 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]); + this.Q[st][act] = this.Q[st][act] + 0.01*(reward + (gamma*this.Q[st2][act2]) - this.Q[st][act]); st = st2; } this.env.randomRoadPosition(); } this.env.render(true); + for (let s=0; s < this.stateList.length; s++){ + this.stateList[s] = this.stringStateToState(this.stateList[s]); + } + displayQTable("q_table", this.stateList, this, ["Top", "Left", "Right"]); } } diff --git a/demo/webapp/public/js/utils.js b/demo/webapp/public/js/utils.js index e1065ed..37765f8 100644 --- a/demo/webapp/public/js/utils.js +++ b/demo/webapp/public/js/utils.js @@ -21,4 +21,26 @@ function argMax(array) { return Math.floor(Math.random()*array.length); } return array.map((x, i) => [x, i]).reduce((r, a) => (a[0] > r[0] ? a : r))[1]; +} + +/* + File with some usefull methods +*/ +function loadJSON(url, callback) { + /* + Utils method to load a json on the server + @url: Url to the json file to load + @callback: Method to call when the json file is loaded + */ + var xobj = new XMLHttpRequest(); + xobj.overrideMimeType("application/json"); + xobj.open('GET', url, true); // Replace 'my_data' with the path to your file + xobj.onreadystatechange = function () { + if (xobj.readyState == 4 && xobj.status == 200) { + // Required use of an anonymous callback as .open will NOT return a value but simply returns undefined in asynchronous mode + console.log(xobj.responseText); + callback(JSON.parse(xobj.responseText)); + } + }; + xobj.send(null); } \ No newline at end of file diff --git a/demo/webapp/public/js/viewer.js b/demo/webapp/public/js/viewer.js index ee086f1..dba4376 100644 --- a/demo/webapp/public/js/viewer.js +++ b/demo/webapp/public/js/viewer.js @@ -43,17 +43,16 @@ function displayScores(id, score, reward, labels){ container.appendChild(textContainer); } - console.log(score); var text = ""; for (let c = 0; c < score.length; c++){ - text += labels[c] + ": " + Number((parseFloat(score[c])).toFixed(2)) + "
"; + text += labels[c] + ": " + ((score[c])).toFixed(2) + "
"; } - if (reward){ - if (reward < 0) - text += "

Reward: " +Number((parseFloat(reward)).toFixed(2)) + "

" + if (reward != null){ + if (reward <= 0) + text += "

Reward: " + ((reward)).toFixed(2) + "

" else - text += "

Reward: " +Number((parseFloat(reward)).toFixed(2)) + "

" + text += "

Reward: " + ((reward)).toFixed(2) + "

" } textContainer.innerHTML = text; diff --git a/dist/metacar.min.js b/dist/metacar.min.js index 5b52513..501acb1 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.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, force) {\n if (force === void 0) { force = false; }\n return _this.setCarOnRoad(road, car, line, force);\n };\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, force) {\n if (force === void 0) { force = false; }\n if (line == undefined)\n line = 0;\n var carById = this.level.findCarById(road.cars[0]);\n if (!force && road.cars.length >= 1 && carById && carById.core.line == line) {\n line = line == 0 ? 1 : 0;\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, displayLidar) {\n if (displayLidar === void 0) { displayLidar = true; }\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 if (displayLidar) {\n this.level.addChild(agent.lidar);\n }\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/* 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.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, force) {\n if (force === void 0) { force = false; }\n return _this.setCarOnRoad(road, car, line, force);\n };\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, force) {\n if (force === void 0) { force = false; }\n if (line == undefined)\n line = 0;\n var carById = this.level.findCarById(road.cars[0]);\n if (!force && road.cars.length >= 1 && carById && carById.core.line == line) {\n line = line == 0 ? 1 : 0;\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, displayLidar) {\n if (displayLidar === void 0) { displayLidar = true; }\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 if (displayLidar) {\n this.level.addChild(agent.lidar);\n }\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 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?"); /***/ }), @@ -179,7 +179,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__, \"fullCity\", function() { return fullCity; });\nvar fullCity = {\n \"cars\": [\n {\n \"mx\": 2,\n \"my\": 5,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 3,\n \"my\": 4,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 3,\n \"my\": 4,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 6,\n \"my\": 3,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 6,\n \"my\": 3,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 8,\n \"my\": 2,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 8,\n \"my\": 2,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 2,\n \"my\": 7,\n \"line\": 0,\n \"auto\": true\n }\n ],\n \"house\": [\n {\n \"x\": 9,\n \"y\": 409\n },\n {\n \"x\": 146,\n \"y\": 162\n },\n {\n \"x\": 439,\n \"y\": 39\n }\n ],\n \"house2\": [\n {\n \"x\": 425,\n \"y\": 192\n },\n {\n \"x\": 431,\n \"y\": 354\n }\n ],\n \"house3\": [\n {\n \"x\": 426,\n \"y\": 281\n },\n {\n \"x\": 51,\n \"y\": 157\n },\n {\n \"x\": 553,\n \"y\": 34\n }\n ],\n \"bench\": [\n {\n \"x\": 259,\n \"y\": 206\n },\n {\n \"x\": 8,\n \"y\": 205\n }\n ],\n \"tree\": [\n {\n \"x\": 1,\n \"y\": 303\n },\n {\n \"x\": 54,\n \"y\": 357\n },\n {\n \"x\": 215,\n \"y\": 325\n },\n {\n \"x\": 230,\n \"y\": 400\n },\n {\n \"x\": 282,\n \"y\": 368\n },\n {\n \"x\": 182,\n \"y\": 433\n },\n {\n \"x\": 285,\n \"y\": 309\n },\n {\n \"x\": 576,\n \"y\": 233\n },\n {\n \"x\": 581,\n \"y\": 300\n },\n {\n \"x\": 519,\n \"y\": 388\n },\n {\n \"x\": 582,\n \"y\": 391\n },\n {\n \"x\": 256,\n \"y\": 69\n },\n {\n \"x\": 151,\n \"y\": 43\n },\n {\n \"x\": 77,\n \"y\": 77\n },\n {\n \"x\": 26,\n \"y\": 24\n },\n {\n \"x\": 189,\n \"y\": 98\n }\n ],\n \"map\": [\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↠\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↦\",\n \"↔\",\n \"↔\",\n \"↟\",\n \"↔\"\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n \"↔\",\n \"↔\",\n \"↧\",\n \"↔\",\n \"↠\",\n \"↔\",\n \"↤\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n \"↠\",\n 0,\n 0,\n 0,\n \"↠\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ]\n ]\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded/level/full_city.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fullCity\", function() { return fullCity; });\nvar fullCity = {\n \"cars\": [\n {\n \"mx\": 2,\n \"my\": 5,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 3,\n \"my\": 4,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 3,\n \"my\": 4,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 6,\n \"my\": 3,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 6,\n \"my\": 3,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 8,\n \"my\": 2,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 8,\n \"my\": 2,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 2,\n \"my\": 7,\n \"line\": 0,\n \"auto\": true\n }\n ],\n \"house\": [\n {\n \"x\": 9,\n \"y\": 409\n },\n {\n \"x\": 146,\n \"y\": 162\n },\n {\n \"x\": 439,\n \"y\": 39\n }\n ],\n \"house2\": [\n {\n \"x\": 425,\n \"y\": 192\n },\n {\n \"x\": 431,\n \"y\": 354\n }\n ],\n \"house3\": [\n {\n \"x\": 426,\n \"y\": 281\n },\n {\n \"x\": 51,\n \"y\": 157\n },\n {\n \"x\": 553,\n \"y\": 34\n }\n ],\n \"bench\": [\n {\n \"x\": 259,\n \"y\": 206\n },\n {\n \"x\": 8,\n \"y\": 205\n }\n ],\n \"tree\": [\n {\n \"x\": 1,\n \"y\": 303\n },\n {\n \"x\": 54,\n \"y\": 357\n },\n {\n \"x\": 215,\n \"y\": 325\n },\n {\n \"x\": 230,\n \"y\": 400\n },\n {\n \"x\": 282,\n \"y\": 368\n },\n {\n \"x\": 182,\n \"y\": 433\n },\n {\n \"x\": 285,\n \"y\": 309\n },\n {\n \"x\": 576,\n \"y\": 233\n },\n {\n \"x\": 581,\n \"y\": 300\n },\n {\n \"x\": 519,\n \"y\": 388\n },\n {\n \"x\": 582,\n \"y\": 391\n },\n {\n \"x\": 256,\n \"y\": 69\n },\n {\n \"x\": 151,\n \"y\": 43\n },\n {\n \"x\": 77,\n \"y\": 77\n },\n {\n \"x\": 26,\n \"y\": 24\n },\n {\n \"x\": 189,\n \"y\": 98\n }\n ],\n \"map\": [\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↟\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↦\",\n \"↔\",\n \"↔\",\n \"↠\",\n \"↔\"\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n \"↔\",\n \"↔\",\n \"↧\",\n \"↔\",\n \"↠\",\n \"↔\",\n \"↤\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n \"↟\",\n 0,\n 0,\n 0,\n \"↟\",\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n 0\n ]\n ]\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded/level/full_city.ts?"); /***/ }), @@ -191,7 +191,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__, \"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?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"level0\", function() { return level0; });\nvar level0 = {\n \"cars\": [],\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?"); /***/ }), @@ -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 export (binding) */ __webpack_require__.d(__webpack_exports__, \"Application\", function() { return Application; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Loader\", function() { return Loader; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Resources\", function() { return Resources; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Sprite\", function() { return Sprite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Graphics\", function() { return Graphics; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Container\", function() { return Container; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"URL\", function() { return URL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JSON_TEXTURES\", function() { return JSON_TEXTURES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JSON_IMAGE\", function() { return JSON_IMAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"IMAGE_FOLDER\", function() { return IMAGE_FOLDER; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ROADSIZE\", function() { return ROADSIZE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CAR_IMG\", function() { return CAR_IMG; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MAP\", function() { return MAP; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ASSETS\", function() { return ASSETS; });\n/* harmony import */ var pixi_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! pixi.js */ \"pixi.js\");\n/* harmony import */ var pixi_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(pixi_js__WEBPACK_IMPORTED_MODULE_0__);\n\nvar Application = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Application\"];\nvar Loader = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"loader\"];\nvar Resources = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"loader\"].resources;\nvar Sprite = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Sprite\"];\nvar Graphics = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"];\nvar Container = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Container\"];\nvar URL = window.location.href.indexOf(\"localhost\") == -1 ? \"https://metacar-project.com/\" : \"http://localhost:3000/\";\nvar JSON_TEXTURES = URL + \"public/textures/textures.json\";\nvar JSON_IMAGE = URL + \"public/textures/textures.png\";\nvar IMAGE_FOLDER = URL + \"public/images/\";\nvar ROADSIZE = 60;\nvar CAR_IMG = {\n DEFAULT: \"car.png\",\n AGENT: \"car_agent.png\"\n};\nvar MAP = {\n ROAD: -1,\n DEFAULT: 0,\n CAR: 1,\n AGENT: 1,\n};\nvar ASSETS = {\n ROADS: {\n \"↕\": {\n \"image\": \"road_u.png\",\n \"orientation\": 1.5\n },\n \"↔\": {\n \"image\": \"road_r.png\",\n \"orientation\": 0.\n },\n \"↱\": {\n \"image\": \"road_rotate_ld.png\",\n \"orientation\": 1.25\n },\n \"↰\": {\n \"image\": \"road_rotate_ul.png\",\n \"orientation\": 0.75\n },\n \"↲\": {\n \"image\": \"road_rotate_rl.png\",\n \"orientation\": 0.25\n },\n \"↳\": {\n \"image\": \"road_rotate_dl.png\",\n \"orientation\": 1.75\n },\n \"↟\": {\n \"image\": \"road_up.png\",\n \"orientation\": 1.5\n },\n \"↠\": {\n \"image\": \"road_rp.png\",\n \"orientation\": 0.\n },\n \"↤\": {\n \"image\": \"road_r2.png\",\n \"orientation\": 0.\n },\n \"↦\": {\n \"image\": \"road_l2.png\",\n \"orientation\": 1.\n },\n \"↥\": {\n \"image\": \"road_d2.png\",\n \"orientation\": 0.5\n },\n \"↧\": {\n \"image\": \"road_u2.png\",\n \"orientation\": 1.5\n },\n },\n \"house\": {\n \"image\": \"house.png\"\n },\n \"house2\": {\n \"image\": \"house2.png\"\n },\n \"house3\": {\n \"image\": \"house3.png\"\n },\n \"bench\": {\n \"image\": \"bench.png\"\n },\n \"tree\": {\n \"image\": \"tree.png\"\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/global.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Application\", function() { return Application; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Loader\", function() { return Loader; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Resources\", function() { return Resources; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Sprite\", function() { return Sprite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Graphics\", function() { return Graphics; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Container\", function() { return Container; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"URL\", function() { return URL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JSON_TEXTURES\", function() { return JSON_TEXTURES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JSON_IMAGE\", function() { return JSON_IMAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"IMAGE_FOLDER\", function() { return IMAGE_FOLDER; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ROADSIZE\", function() { return ROADSIZE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CAR_IMG\", function() { return CAR_IMG; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MAP\", function() { return MAP; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ASSETS\", function() { return ASSETS; });\n/* harmony import */ var pixi_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! pixi.js */ \"pixi.js\");\n/* harmony import */ var pixi_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(pixi_js__WEBPACK_IMPORTED_MODULE_0__);\n\nvar Application = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Application\"];\nvar Loader = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"loader\"];\nvar Resources = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"loader\"].resources;\nvar Sprite = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Sprite\"];\nvar Graphics = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"];\nvar Container = pixi_js__WEBPACK_IMPORTED_MODULE_0__[\"Container\"];\nvar URL = \"https://metacar-project.com/\";\nvar JSON_TEXTURES = URL + \"public/textures/textures.json\";\nvar JSON_IMAGE = URL + \"public/textures/textures.png\";\nvar IMAGE_FOLDER = URL + \"public/images/\";\nvar ROADSIZE = 60;\nvar CAR_IMG = {\n DEFAULT: \"car.png\",\n AGENT: \"car_agent.png\"\n};\nvar MAP = {\n ROAD: -1,\n DEFAULT: 0,\n CAR: 1,\n AGENT: 1,\n};\nvar ASSETS = {\n ROADS: {\n \"↕\": {\n \"image\": \"road_u.png\",\n \"orientation\": 1.5\n },\n \"↔\": {\n \"image\": \"road_r.png\",\n \"orientation\": 0.\n },\n \"↱\": {\n \"image\": \"road_rotate_ld.png\",\n \"orientation\": 1.25\n },\n \"↰\": {\n \"image\": \"road_rotate_ul.png\",\n \"orientation\": 0.75\n },\n \"↲\": {\n \"image\": \"road_rotate_rl.png\",\n \"orientation\": 0.25\n },\n \"↳\": {\n \"image\": \"road_rotate_dl.png\",\n \"orientation\": 1.75\n },\n \"↟\": {\n \"image\": \"road_up.png\",\n \"orientation\": 1.5\n },\n \"↠\": {\n \"image\": \"road_rp.png\",\n \"orientation\": 0.\n },\n \"↤\": {\n \"image\": \"road_r2.png\",\n \"orientation\": 0.\n },\n \"↦\": {\n \"image\": \"road_l2.png\",\n \"orientation\": 1.\n },\n \"↥\": {\n \"image\": \"road_d2.png\",\n \"orientation\": 0.5\n },\n \"↧\": {\n \"image\": \"road_u2.png\",\n \"orientation\": 1.5\n },\n },\n \"house\": {\n \"image\": \"house.png\"\n },\n \"house2\": {\n \"image\": \"house2.png\"\n },\n \"house3\": {\n \"image\": \"house3.png\"\n },\n \"bench\": {\n \"image\": \"bench.png\"\n },\n \"tree\": {\n \"image\": \"tree.png\"\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/global.ts?"); /***/ }), @@ -239,7 +239,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.isCarsMoving = true;\n _this.lastReward = 0;\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.carsMoving = function (moving) {\n this.isCarsMoving = moving;\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 for (var c = 0; c < this.cars.length; c++) {\n this.cars[c].reset();\n }\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 this.lastReward = reward;\n return reward;\n };\n Level.prototype.getLastReward = function () {\n return this.lastReward;\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), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n var reward = this.setReward(agentCollisions, onRoad, 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.isCarsMoving = true;\n _this.lastReward = 0;\n _this.rewardFunction = null;\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.setRewardFunction = function (fc) {\n this.rewardFunction = fc;\n };\n Level.prototype.carsMoving = function (moving) {\n this.isCarsMoving = moving;\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 for (var c = 0; c < this.cars.length; c++) {\n }\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 = -1;\n }\n else if (!on_road) {\n reward = -1;\n }\n return reward;\n };\n Level.prototype.getLastReward = function () {\n return this.lastReward;\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), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n var reward = void 0;\n if (this.rewardFunction) {\n reward = this.rewardFunction(agentCollisions, onRoad, action);\n }\n else {\n reward = this.setReward(agentCollisions, onRoad, action);\n }\n this.lastReward = reward;\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?"); /***/ }), @@ -251,7 +251,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/* 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 this.isCarsMoving = true;\n this.loopCallback = undefined;\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 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.level.carsMoving(_this.isCarsMoving);\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.level.carsMoving(_this.isCarsMoving);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); });\n resolve();\n }\n });\n };\n MetaCar.prototype.carsMoving = function (moving) {\n this.isCarsMoving = moving;\n };\n MetaCar.prototype.getLastReward = function () {\n return this.level.getLastReward();\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 (fc) {\n this.loopCallback = fc;\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 if (this.loopCallback) {\n this.loopCallback();\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 this.isCarsMoving = true;\n this.loopCallback = undefined;\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.setRewardFunction = function (fc) {\n this.level.setRewardFunction(fc);\n };\n MetaCar.prototype.carsMoving = function (moving) {\n this.isCarsMoving = moving;\n };\n MetaCar.prototype.getLastReward = function () {\n return this.level.getLastReward();\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 (fc) {\n this.loopCallback = fc;\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 if (this.loopCallback) {\n this.loopCallback();\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 MetaCar.prototype.load = function () {\n var _this = this;\n return new Promise(function (resolve, reject) {\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.level.carsMoving(_this.isCarsMoving);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); }).then(function () {\n resolve();\n });\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.level.carsMoving(_this.isCarsMoving);\n _this._setEvents();\n _this.level.load(function (delta) { return _this._loop(delta); }).then(function () {\n resolve();\n });\n }\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__, \"MetaCarEditor\", function() { return MetaCarEditor; });\n/* harmony import */ var _ui_event__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ui_event */ \"./src/ui_event.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\n/* harmony import */ var _editor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./editor */ \"./src/editor.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\n\n\n\nvar MetaCarEditor = (function () {\n function MetaCarEditor(canvasId, levelToLoad) {\n this.eventList = [\"save\"];\n if (!canvasId || this.levelToLoad) {\n console.error(\"You must specify the canvasId and the levelToLoad\");\n }\n this.canvasId = canvasId;\n this.levelToLoad = levelToLoad;\n }\n MetaCarEditor.prototype.load = function (level, agent) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n if (typeof _this.levelToLoad == \"string\") {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"loadCustomURL\"](_this.levelToLoad, function (content) {\n _this.level = new _editor__WEBPACK_IMPORTED_MODULE_2__[\"Editor\"](content, _this.canvasId);\n _this.level.load(function (delta) { return _this.loop(delta); });\n _this.event = new _ui_event__WEBPACK_IMPORTED_MODULE_0__[\"UIEvent\"](_this.level, _this.canvasId);\n _this.event.createEditorElementsEvents();\n _this.eventCallback = [\n function (fc, options) { return _this.event.onSaveEditor(fc, options); }\n ];\n resolve();\n });\n }\n else {\n _this.level = new _editor__WEBPACK_IMPORTED_MODULE_2__[\"Editor\"](_this.levelToLoad, _this.canvasId);\n _this.level.load(function (delta) { return _this.loop(delta); });\n _this.event = new _ui_event__WEBPACK_IMPORTED_MODULE_0__[\"UIEvent\"](_this.level, _this.canvasId);\n _this.event.createEditorElementsEvents();\n _this.eventCallback = [\n function (fc, options) { return _this.event.onSaveEditor(fc, options); }\n ];\n resolve();\n }\n });\n };\n MetaCarEditor.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 this.eventCallback[index](fc, options);\n };\n MetaCarEditor.prototype.loop = function (delta) {\n var mousePos = this.level.getMousePosition();\n var selectedItem = this.level.getSelectedItems();\n if (selectedItem && selectedItem.type == \"asset\") {\n selectedItem.x = mousePos.x;\n selectedItem.y = mousePos.y;\n }\n else if (selectedItem) {\n selectedItem.x = Math.floor(mousePos.x / _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"]) * _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"];\n selectedItem.y = Math.floor(mousePos.y / _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"]) * _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"];\n }\n };\n return MetaCarEditor;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/metacar_editor.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MetaCarEditor\", function() { return MetaCarEditor; });\n/* harmony import */ var _ui_event__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ui_event */ \"./src/ui_event.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\n/* harmony import */ var _editor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./editor */ \"./src/editor.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\n\n\n\nvar MetaCarEditor = (function () {\n function MetaCarEditor(canvasId, levelToLoad) {\n this.eventList = [\"save\"];\n if (!canvasId || this.levelToLoad) {\n console.error(\"You must specify the canvasId and the levelToLoad\");\n }\n this.canvasId = canvasId;\n this.levelToLoad = levelToLoad;\n }\n MetaCarEditor.prototype.load = function (level, agent) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n if (typeof _this.levelToLoad == \"string\") {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"loadCustomURL\"](_this.levelToLoad, function (content) {\n _this.level = new _editor__WEBPACK_IMPORTED_MODULE_2__[\"Editor\"](content, _this.canvasId);\n _this.level.load(function (delta) { return _this.loop(delta); });\n _this.event = new _ui_event__WEBPACK_IMPORTED_MODULE_0__[\"UIEvent\"](_this.level, _this.canvasId);\n _this.event.createEditorElementsEvents();\n _this.eventCallback = [\n function (fc, options) { return _this.event.onSaveEditor(fc, options); }\n ];\n resolve();\n });\n }\n else {\n _this.level = new _editor__WEBPACK_IMPORTED_MODULE_2__[\"Editor\"](_this.levelToLoad, _this.canvasId);\n _this.level.load(function (delta) { return _this.loop(delta); });\n _this.event = new _ui_event__WEBPACK_IMPORTED_MODULE_0__[\"UIEvent\"](_this.level, _this.canvasId);\n _this.event.createEditorElementsEvents();\n _this.eventCallback = [\n function (fc, options) { return _this.event.onSaveEditor(fc, options); }\n ];\n resolve();\n }\n });\n };\n MetaCarEditor.prototype.save = function (content, file_name) {\n _utils__WEBPACK_IMPORTED_MODULE_1__[\"saveAs\"](content, file_name);\n };\n MetaCarEditor.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 this.eventCallback[index](fc, options);\n };\n MetaCarEditor.prototype.loop = function (delta) {\n var mousePos = this.level.getMousePosition();\n var selectedItem = this.level.getSelectedItems();\n if (selectedItem && selectedItem.type == \"asset\") {\n selectedItem.x = mousePos.x;\n selectedItem.y = mousePos.y;\n }\n else if (selectedItem) {\n selectedItem.x = Math.floor(mousePos.x / _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"]) * _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"];\n selectedItem.y = Math.floor(mousePos.y / _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"]) * _global__WEBPACK_IMPORTED_MODULE_3__[\"ROADSIZE\"];\n }\n };\n return MetaCarEditor;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/metacar_editor.ts?"); /***/ }), @@ -299,7 +299,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__, \"loadJSON\", function() { return loadJSON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadEmbeddedURL\", function() { return loadEmbeddedURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadLocalStorageURL\", function() { return loadLocalStorageURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadCustomURL\", function() { return loadCustomURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mod\", function() { return mod; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"argMax\", function() { return argMax; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mean\", function() { return mean; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"saveAs\", function() { return saveAs; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"readDump\", function() { return readDump; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"shuffleArray\", function() { return shuffleArray; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"keyboard\", function() { return keyboard; });\n/* harmony import */ var _embedded__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./embedded */ \"./src/embedded.ts\");\n\nfunction loadJSON(url, callback) {\n var xobj = new XMLHttpRequest();\n xobj.overrideMimeType(\"application/json\");\n xobj.open('GET', url, true);\n xobj.onreadystatechange = function () {\n if (xobj.readyState == 4 && xobj.status == 200) {\n callback(xobj.responseText);\n }\n };\n xobj.send(null);\n}\nfunction loadEmbeddedURL(url, callback) {\n var split = url.split(\"//\");\n split = split[1].split(\"/\");\n callback(_embedded__WEBPACK_IMPORTED_MODULE_0__[\"embeddedContent\"][split[0]][split[1]]);\n}\nfunction loadLocalStorageURL(url, callback) {\n}\nfunction loadCustomURL(url, callback) {\n var customCall = {\n \"embedded:\": loadEmbeddedURL,\n \"http://\": loadJSON,\n \"https://\": loadJSON,\n \"localstorage://\": loadLocalStorageURL\n };\n var split = url.split(\"//\");\n customCall[split[0]](url, callback);\n}\nfunction mod(n, m) {\n return ((n % m) + m) % m;\n}\nfunction argMax(array) {\n if (array.every(function (v) { return v == -Infinity; })) {\n return Math.floor(Math.random() * array.length);\n }\n return array.map(function (x, i) { return [x, i]; }).reduce(function (r, a) { return (a[0] > r[0] ? a : r); })[1];\n}\nfunction mean(array) {\n if (array.length == 0)\n return null;\n var sum = array.reduce(function (a, b) { return a + b; });\n var avg = sum / array.length;\n return avg;\n}\nfunction saveAs(content, name) {\n var a = document.createElement(\"a\");\n document.body.appendChild(a);\n var blob = new Blob([content], { type: 'application/octet-binary' }), tmpURL = window.URL.createObjectURL(blob);\n a.href = tmpURL;\n a.download = name;\n a.click();\n window.URL.revokeObjectURL(tmpURL);\n a.href = \"\";\n}\nfunction readDump(dump, callback) {\n var input = dump.target;\n var file = input.files[0];\n var reader = new FileReader();\n reader.readAsText(file, \"UTF-8\");\n reader.onload = function (evt) {\n callback(evt.target.result);\n };\n}\nfunction shuffleArray(array) {\n for (var i = array.length - 1; i > 0; i--) {\n var j = Math.floor(Math.random() * (i + 1));\n var temp = array[i];\n array[i] = array[j];\n array[j] = temp;\n }\n return array;\n}\nfunction keyboard(keyCode) {\n var key = {};\n key.code = keyCode;\n key.isDown = false;\n key.isUp = true;\n key.press = undefined;\n key.release = undefined;\n key.downHandler = function (event) {\n if (event.keyCode === key.code) {\n if (key.isUp && key.press)\n key.press();\n key.isDown = true;\n key.isUp = false;\n }\n event.preventDefault();\n };\n key.upHandler = function (event) {\n if (event.keyCode === key.code) {\n if (key.isDown && key.release)\n key.release();\n key.isDown = false;\n key.isUp = true;\n }\n event.preventDefault();\n };\n window.addEventListener(\"keydown\", key.downHandler.bind(key), false);\n window.addEventListener(\"keyup\", key.upHandler.bind(key), false);\n return key;\n}\n\n\n//# sourceURL=webpack://metacar/./src/utils.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadJSON\", function() { return loadJSON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadEmbeddedURL\", function() { return loadEmbeddedURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadLocalStorageURL\", function() { return loadLocalStorageURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadCustomURL\", function() { return loadCustomURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mod\", function() { return mod; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"argMax\", function() { return argMax; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mean\", function() { return mean; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"saveAs\", function() { return saveAs; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"readDump\", function() { return readDump; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"shuffleArray\", function() { return shuffleArray; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"keyboard\", function() { return keyboard; });\n/* harmony import */ var _embedded__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./embedded */ \"./src/embedded.ts\");\n\nfunction loadJSON(url, callback) {\n var xobj = new XMLHttpRequest();\n xobj.overrideMimeType(\"application/json\");\n xobj.open('GET', url, true);\n xobj.onreadystatechange = function () {\n if (xobj.readyState == 4 && xobj.status == 200) {\n callback(JSON.parse(xobj.responseText));\n }\n };\n xobj.send(null);\n}\nfunction loadEmbeddedURL(url, callback) {\n var split = url.split(\"//\");\n split = split[1].split(\"/\");\n callback(_embedded__WEBPACK_IMPORTED_MODULE_0__[\"embeddedContent\"][split[0]][split[1]]);\n}\nfunction loadLocalStorageURL(url, callback) {\n}\nfunction loadCustomURL(url, callback) {\n var customCall = {\n \"embedded:\": loadEmbeddedURL,\n \"http:\": loadJSON,\n \"https:\": loadJSON\n };\n var split = url.split(\"//\");\n customCall[split[0]](url, callback);\n}\nfunction mod(n, m) {\n return ((n % m) + m) % m;\n}\nfunction argMax(array) {\n if (array.every(function (v) { return v == -Infinity; })) {\n return Math.floor(Math.random() * array.length);\n }\n return array.map(function (x, i) { return [x, i]; }).reduce(function (r, a) { return (a[0] > r[0] ? a : r); })[1];\n}\nfunction mean(array) {\n if (array.length == 0)\n return null;\n var sum = array.reduce(function (a, b) { return a + b; });\n var avg = sum / array.length;\n return avg;\n}\nfunction saveAs(content, name) {\n var a = document.createElement(\"a\");\n document.body.appendChild(a);\n var blob = new Blob([content], { type: 'application/octet-binary' }), tmpURL = window.URL.createObjectURL(blob);\n a.href = tmpURL;\n a.download = name;\n a.click();\n window.URL.revokeObjectURL(tmpURL);\n a.href = \"\";\n}\nfunction readDump(dump, callback) {\n var input = dump.target;\n var file = input.files[0];\n var reader = new FileReader();\n reader.readAsText(file, \"UTF-8\");\n reader.onload = function (evt) {\n callback(evt.target.result);\n };\n}\nfunction shuffleArray(array) {\n for (var i = array.length - 1; i > 0; i--) {\n var j = Math.floor(Math.random() * (i + 1));\n var temp = array[i];\n array[i] = array[j];\n array[j] = temp;\n }\n return array;\n}\nfunction keyboard(keyCode) {\n var key = {};\n key.code = keyCode;\n key.isDown = false;\n key.isUp = true;\n key.press = undefined;\n key.release = undefined;\n key.downHandler = function (event) {\n if (event.keyCode === key.code) {\n if (key.isUp && key.press)\n key.press();\n key.isDown = true;\n key.isUp = false;\n }\n event.preventDefault();\n };\n key.upHandler = function (event) {\n if (event.keyCode === key.code) {\n if (key.isDown && key.release)\n key.release();\n key.isDown = false;\n key.isUp = true;\n }\n event.preventDefault();\n };\n window.addEventListener(\"keydown\", key.downHandler.bind(key), false);\n window.addEventListener(\"keyup\", key.upHandler.bind(key), false);\n return key;\n}\n\n\n//# sourceURL=webpack://metacar/./src/utils.ts?"); /***/ }), @@ -311,7 +311,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__, \"World\", function() { return World; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar World = (function () {\n function World(levelContent, canvasId) {\n this.agent = null;\n this.app = null;\n this.map = null;\n this.info = null;\n this.envs = [];\n this.roads = {};\n this.cars = [];\n this.info = levelContent;\n this.canvasId = canvasId;\n }\n World.prototype.load = function (loop) {\n var _this = this;\n this.loop = loop;\n return new Promise(function (resolve, reject) {\n _this.createLevel(_this.info).then(function () { return resolve(); });\n });\n };\n World.prototype.createLevel = function (info) {\n var _this = this;\n this.map = info.map;\n this.app = new PIXI.Application({\n width: this.map[0].length * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"],\n height: this.map.length * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"],\n backgroundColor: 0x80bf3e\n });\n document.getElementById(this.canvasId).appendChild(this.app.view);\n return new Promise(function (resolve, reject) {\n _global__WEBPACK_IMPORTED_MODULE_0__[\"Loader\"].add([_global__WEBPACK_IMPORTED_MODULE_0__[\"JSON_TEXTURES\"], _global__WEBPACK_IMPORTED_MODULE_0__[\"JSON_IMAGE\"]]).load(function () {\n _this._setup(info);\n resolve();\n });\n });\n };\n World.prototype._setup = function (info) {\n console.warn(\"This method should be implemented.\");\n };\n World.prototype.getRoads = function () {\n return this.roads;\n };\n World.prototype.findCarById = function (id) {\n return this.cars.find(function (e) { return e.core.carId == id; });\n };\n World.prototype.getRoad = function (my, mx) {\n return this.roads[[my.toString(), mx.toString()].toString()];\n };\n World.prototype.addRoad = function (road) {\n this.roads[[road.my.toString(), road.mx.toString()].toString()] = road;\n this.envs.push(road);\n this.app.stage.addChild(road);\n };\n World.prototype.addCar = function (car) {\n this.cars.push(car);\n this.app.stage.addChild(car.core);\n this.envs.push(car.core);\n };\n World.prototype.getEnvs = function () {\n return this.envs;\n };\n World.prototype.getMap = function () {\n return this.map;\n };\n World.prototype.addChild = function (child) {\n this.app.stage.addChild(child);\n };\n World.prototype.render = function (val) {\n if (val) {\n this.app.ticker.start();\n }\n else {\n this.app.ticker.stop();\n }\n };\n World.prototype.reset = function () {\n };\n World.prototype.resize = function (width, height) {\n this.app.renderer.resize(width * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"], height * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"]);\n };\n World.prototype.getMousePosition = function () {\n return this.app.renderer.plugins.interaction.mouse.global;\n };\n return World;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/world.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"World\", function() { return World; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar World = (function () {\n function World(levelContent, canvasId) {\n this.agent = null;\n this.app = null;\n this.map = null;\n this.info = null;\n this.envs = [];\n this.roads = {};\n this.cars = [];\n this.info = levelContent;\n this.canvasId = canvasId;\n }\n World.prototype.load = function (loop) {\n var _this = this;\n this.loop = loop;\n return new Promise(function (resolve, reject) {\n _this.createLevel(_this.info).then(function () { return resolve(); });\n });\n };\n World.prototype.createLevel = function (info) {\n var _this = this;\n this.map = info.map;\n this.app = new PIXI.Application({\n width: this.map[0].length * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"],\n height: this.map.length * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"],\n backgroundColor: 0x80bf3e\n });\n document.getElementById(this.canvasId).appendChild(this.app.view);\n return new Promise(function (resolve, reject) {\n _global__WEBPACK_IMPORTED_MODULE_0__[\"Loader\"].add([_global__WEBPACK_IMPORTED_MODULE_0__[\"JSON_TEXTURES\"], _global__WEBPACK_IMPORTED_MODULE_0__[\"JSON_IMAGE\"]], { crossOrigin: true }).load(function () {\n _this._setup(info);\n resolve();\n });\n });\n };\n World.prototype._setup = function (info) {\n console.warn(\"This method should be implemented.\");\n };\n World.prototype.getRoads = function () {\n return this.roads;\n };\n World.prototype.findCarById = function (id) {\n return this.cars.find(function (e) { return e.core.carId == id; });\n };\n World.prototype.getRoad = function (my, mx) {\n return this.roads[[my.toString(), mx.toString()].toString()];\n };\n World.prototype.addRoad = function (road) {\n this.roads[[road.my.toString(), road.mx.toString()].toString()] = road;\n this.envs.push(road);\n this.app.stage.addChild(road);\n };\n World.prototype.addCar = function (car) {\n this.cars.push(car);\n this.app.stage.addChild(car.core);\n this.envs.push(car.core);\n };\n World.prototype.getEnvs = function () {\n return this.envs;\n };\n World.prototype.getMap = function () {\n return this.map;\n };\n World.prototype.addChild = function (child) {\n this.app.stage.addChild(child);\n };\n World.prototype.render = function (val) {\n if (val) {\n this.app.ticker.start();\n }\n else {\n this.app.ticker.stop();\n }\n };\n World.prototype.reset = function () {\n };\n World.prototype.resize = function (width, height) {\n this.app.renderer.resize(width * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"], height * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"]);\n };\n World.prototype.getMousePosition = function () {\n return this.app.renderer.plugins.interaction.mouse.global;\n };\n return World;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/world.ts?"); /***/ }), diff --git a/img/header_github.png b/img/header_github.png new file mode 100644 index 0000000..0c5ae95 Binary files /dev/null and b/img/header_github.png differ diff --git a/package.json b/package.json index d9b603a..0ebfef5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "metacar", "version": "0.0.1", - "main": "index.js", + "main": "dist/metacar.min.js", "author": "Thibault Neveu", "license": "MIT", "devDependencies": { @@ -13,7 +13,6 @@ }, "dependencies": { "@types/pixi.js": "^4.7.5", - "express": "^4.16.3", "pixi.js": "^4.8.0" }, "scripts": { diff --git a/src/asset_manager.ts b/src/asset_manager.ts index 341f638..7eaa9e6 100644 --- a/src/asset_manager.ts +++ b/src/asset_manager.ts @@ -326,7 +326,6 @@ export class AssetManger { file.map = map; // If the agent exist if (this.level.agent){ - console.log("enter here to create egent...."); file.agent = { "mx": this.level.agent.core.mx, "my": this.level.agent.core.my, diff --git a/src/car.ts b/src/car.ts index df4c5dd..05db179 100644 --- a/src/car.ts +++ b/src/car.ts @@ -121,7 +121,7 @@ export class Car { this.motion.setUp(this.core, this.lidar); this.core.rotationStep = 0.5; } - else{ + else { this.core.rotationStep = 0.5; } diff --git a/src/embedded/level/full_city.ts b/src/embedded/level/full_city.ts index 71c3029..b919381 100644 --- a/src/embedded/level/full_city.ts +++ b/src/embedded/level/full_city.ts @@ -184,7 +184,7 @@ export const fullCity: any = { 0, 0, 0, - "↠", + "↟", 0, 0, 0, @@ -200,7 +200,7 @@ export const fullCity: any = { "↦", "↔", "↔", - "↟", + "↠", "↔" ], [ @@ -245,11 +245,11 @@ export const fullCity: any = { [ 0, 0, - "↠", + "↟", 0, 0, 0, - "↠", + "↟", 0, 0, 0, diff --git a/src/embedded/level/level_0.ts b/src/embedded/level/level_0.ts index e8c5e05..fbad767 100644 --- a/src/embedded/level/level_0.ts +++ b/src/embedded/level/level_0.ts @@ -1,31 +1,5 @@ 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 - } - ], + "cars": [], "house": [ { "x": 263, diff --git a/src/global.ts b/src/global.ts index 9a7a0af..1133a71 100644 --- a/src/global.ts +++ b/src/global.ts @@ -13,7 +13,8 @@ export const Graphics = PIXI.Graphics; export const Container = PIXI.Container; // Main server -export const URL = window.location.href.indexOf("localhost") == -1 ? "https://metacar-project.com/" : "http://localhost:3000/"; +//export const URL = window.location.href.indexOf("localhost") == -1 ? "https://metacar-project.com/" : "http://localhost:3000/"; +export const URL = "https://metacar-project.com/"; // Textures files export const JSON_TEXTURES = URL + "public/textures/textures.json"; diff --git a/src/level.ts b/src/level.ts index af2a876..f9a8906 100644 --- a/src/level.ts +++ b/src/level.ts @@ -28,6 +28,7 @@ export class Level extends World { public isCarsMoving: boolean = true; private lastReward: number = 0; + private rewardFunction: any = null; constructor(levelContent: LevelInfo, canvasId: string) { /* @@ -39,6 +40,18 @@ export class Level extends World { this.am = new AssetManger(this); } + /** + * Set a custom reward function + * The @fc will be called with three parameters and should return one number. + * *agentCollisions: A list with all current collisions + * *onRoad: Is the car on the road + * *action: The last action took by the car + * @fc The reward function to call + */ + public setRewardFunction(fc: any) { + this.rewardFunction = fc; + } + /** * Choose whether other cars move or stay fixed. * This method should be called before to called 'load'. @@ -93,7 +106,7 @@ export class Level extends World { */ this.agent.reset(); for (var c = 0; c < this.cars.length; c++) { - this.cars[c].reset(); + //this.cars[c].reset(); } } @@ -105,12 +118,11 @@ export class Level extends World { if (action == 0 || this.agent.core.v == 1) reward += 0.5; if (agent_col.length > 0){ - reward = -10; + reward = -1; } else if (!on_road){ - reward = -10; + reward = -1; } - this.lastReward = reward; return reward; } @@ -132,12 +144,19 @@ export class Level extends World { 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 {agentCollisions, onRoad} = this.agent.step(delta, action); // Get the reward - let reward = this.setReward(agentCollisions, onRoad, action); + let reward; + if (this.rewardFunction){ + reward = this.rewardFunction(agentCollisions, onRoad, action); + } + else { + reward = this.setReward(agentCollisions, onRoad, action); + } + this.lastReward = reward; return reward; } return 0; diff --git a/src/metacar.ts b/src/metacar.ts index fa95f1b..69e009e 100644 --- a/src/metacar.ts +++ b/src/metacar.ts @@ -46,34 +46,17 @@ export class MetaCar { this.canvasId = canvasId; this.levelToLoad = levelToLoad; } - - /* - Load the environement with the parameters passed in the constructor. - */ - public load(): Promise{ - - return new Promise((resolve, reject) => { - if (typeof this.levelToLoad == "string"){ - U.loadCustomURL(this.levelToLoad, (content: LevelInfo) => { - this.level = new Level(content, this.canvasId); - this.level.setAgentMotion(this.agentMotionEngine, this.agentMotionOptions); - this.level.setAgentLidar(this.agentLidarInfo); - this.level.carsMoving(this.isCarsMoving); - this._setEvents(); - this.level.load((delta: number) => this._loop(delta)); - resolve(); - }); - } - else{ - this.level = new Level(this.levelToLoad, this.canvasId); - this.level.setAgentMotion(this.agentMotionEngine, this.agentMotionOptions); - this.level.setAgentLidar(this.agentLidarInfo); - this.level.carsMoving(this.isCarsMoving); - this._setEvents(); - this.level.load((delta: number) => this._loop(delta)); - resolve(); - } - }); + + /** + * Set a custom reward function + * The @fc will be called with three parameters and should return one number. + * *agentCollisions: A list with all current collisions + * *onRoad: Is the car on the road + * *action: The last action took by the car + * @fc The reward function to call + */ + public setRewardFunction(fc: any): void { + this.level.setRewardFunction(fc); } /** @@ -257,4 +240,35 @@ export class MetaCar { ]; } + /* + Load the environement with the parameters passed in the constructor. + */ + public load(): Promise{ + + return new Promise((resolve, reject) => { + if (typeof this.levelToLoad == "string"){ + U.loadCustomURL(this.levelToLoad, (content: LevelInfo) => { + this.level = new Level(content, this.canvasId); + this.level.setAgentMotion(this.agentMotionEngine, this.agentMotionOptions); + this.level.setAgentLidar(this.agentLidarInfo); + this.level.carsMoving(this.isCarsMoving); + this._setEvents(); + this.level.load((delta: number) => this._loop(delta)).then(() => { + resolve(); + }); + }); + } + else{ + this.level = new Level(this.levelToLoad, this.canvasId); + this.level.setAgentMotion(this.agentMotionEngine, this.agentMotionOptions); + this.level.setAgentLidar(this.agentLidarInfo); + this.level.carsMoving(this.isCarsMoving); + this._setEvents(); + this.level.load((delta: number) => this._loop(delta)).then(() => { + resolve(); + }); + } + }); +} + } diff --git a/src/metacar_editor.ts b/src/metacar_editor.ts index 8811317..019fc9a 100644 --- a/src/metacar_editor.ts +++ b/src/metacar_editor.ts @@ -12,7 +12,7 @@ export class MetaCarEditor { private canvasId: string; private levelToLoad: string|Object; private event: UIEvent; - private eventList: string[] = ["save"] + private eventList: string[] = ["save"]; private eventCallback: any[]; /** @@ -62,6 +62,18 @@ export class MetaCarEditor { }); } + /** + * Usefull method to save/download a string as file. + * @content The content of the file + * @file_name The name of the file + */ + public save(content: string, file_name: string): void{ + /* + Save the agent + */ + U.saveAs(content, file_name); + } + /** * This method is used to add button under the canvas. When a * click is detected on the window, the associated @fc is called. diff --git a/src/utils.ts b/src/utils.ts index 0bcb4bd..a3ac361 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -15,7 +15,7 @@ export function loadJSON(url: string, callback: any) { xobj.onreadystatechange = function () { if (xobj.readyState == 4 && xobj.status == 200) { // Required use of an anonymous callback as .open will NOT return a value but simply returns undefined in asynchronous mode - callback(xobj.responseText); + callback(JSON.parse(xobj.responseText)); } }; xobj.send(null); @@ -40,9 +40,8 @@ export function loadCustomURL(url: string, callback: any):void { */ const customCall: any = { "embedded:": loadEmbeddedURL, - "http://": loadJSON, - "https://": loadJSON, - "localstorage://": loadLocalStorageURL + "http:": loadJSON, + "https:": loadJSON } const split = url.split("//"); customCall[split[0]](url, callback); diff --git a/src/world.ts b/src/world.ts index 0c1e56e..9aca03f 100644 --- a/src/world.ts +++ b/src/world.ts @@ -58,7 +58,7 @@ export class World { document.getElementById(this.canvasId).appendChild(this.app.view); return new Promise((resolve, reject) => { - Loader.add([JSON_TEXTURES, JSON_IMAGE]).load(() => { + Loader.add([JSON_TEXTURES, JSON_IMAGE], {crossOrigin: true}).load(() => { this._setup(info); // Set up the level (Add assets) resolve(); });