From 545dc657981f1997f83ec574ed2a038a3ed63369 Mon Sep 17 00:00:00 2001 From: Thibault Neveu Date: Sat, 16 Jun 2018 15:04:54 +0100 Subject: [PATCH] header github --- demo/app.js | 2 + demo/dist/metacar.min.js | 18 +++---- demo/package.json | 1 + demo/webapp/public/js/editor.js | 6 +-- demo/webapp/public/js/level0.js | 25 +++++---- demo/webapp/public/js/level1.js | 10 +++- demo/webapp/public/js/policy_agent.js | 19 +++---- demo/webapp/public/js/q_table_agent.js | 20 ++++--- demo/webapp/public/js/utils.js | 22 ++++++++ demo/webapp/public/js/viewer.js | 11 ++-- dist/metacar.min.js | 18 +++---- img/header_github.png | Bin 0 -> 80997 bytes package.json | 3 +- src/asset_manager.ts | 1 - src/car.ts | 2 +- src/embedded/level/full_city.ts | 8 +-- src/embedded/level/level_0.ts | 28 +--------- src/global.ts | 3 +- src/level.ts | 31 ++++++++--- src/metacar.ts | 70 +++++++++++++++---------- src/metacar_editor.ts | 14 ++++- src/utils.ts | 7 ++- src/world.ts | 2 +- 23 files changed, 186 insertions(+), 135 deletions(-) create mode 100644 img/header_github.png 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 0000000000000000000000000000000000000000..0c5ae95036360996027d153c47011c2feb92dc03 GIT binary patch literal 80997 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%0Aue9fG~$M$r6ufs=s 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 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(); });