From d582567d37e8a040878529c28c7dcbe1b7a94434 Mon Sep 17 00:00:00 2001 From: Thibault Neveu Date: Sat, 16 Jun 2018 16:57:43 +0100 Subject: [PATCH] API issues --- .gitignore | 3 +- .npmignore | 5 + demo/app.js | 1 + demo/dist/metacar.min.js | 330 +------------------ demo/webapp/editor.html | 8 + demo/webapp/index.html | 21 +- demo/webapp/level0.html | 11 +- demo/webapp/level1.html | 9 +- demo/webapp/public/js/level0.js | 6 +- demo/webapp/public/js/level1.js | 7 +- demo/webapp/public/js/policy_agent.js | 10 +- demo/webapp/public/levels/levelGet.json | 148 +++++++++ demo/webapp/public/models/qtable/qtable.json | 1 + dist/metacar.min.js | 330 +------------------ package.json | 3 +- src/asset_manager.ts | 15 +- src/bot_motion_engine.ts | 1 - src/car.ts | 1 - src/editor.ts | 27 +- src/level.ts | 9 +- src/metacar.ts | 5 +- src/metacar_editor.ts | 15 +- src/motion_engine.ts | 16 +- src/ui_event.ts | 1 - src/utils.ts | 3 - src/world.ts | 8 +- typedoc.json | 2 +- 27 files changed, 245 insertions(+), 751 deletions(-) create mode 100644 .npmignore create mode 100644 demo/webapp/public/levels/levelGet.json create mode 100644 demo/webapp/public/models/qtable/qtable.json diff --git a/.gitignore b/.gitignore index c0486b9..38bca93 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ demo/dist/dist-es6/* demo/node_modules/ *package-lock.json* docs -dist-es6 \ No newline at end of file +dist-es6 +demo/docs \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..04cf2d5 --- /dev/null +++ b/.npmignore @@ -0,0 +1,5 @@ +demo +docs +node_modules +package-lock.json +img diff --git a/demo/app.js b/demo/app.js index 59b8fec..b916a51 100644 --- a/demo/app.js +++ b/demo/app.js @@ -27,6 +27,7 @@ app.use(cors()); app.use("/dist", express.static(path.join(__dirname, "dist/"))); app.use("/public", express.static(path.join(__dirname, "webapp/public/"))); +app.use("/docs", express.static(path.join(__dirname, "docs/"))); app.get('/', (req, res) => { res.sendFile(get_path("index.html")); diff --git a/demo/dist/metacar.min.js b/demo/dist/metacar.min.js index 501acb1..7243487 100644 --- a/demo/dist/metacar.min.js +++ b/demo/dist/metacar.min.js @@ -1,329 +1 @@ -window["metacar"] = -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./src/index.ts"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "./src/asset_manager.ts": -/*!******************************!*\ - !*** ./src/asset_manager.ts ***! - \******************************/ -/*! exports provided: AssetManger */ -/***/ (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 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?"); - -/***/ }), - -/***/ "./src/basic_motion_engine.ts": -/*!************************************!*\ - !*** ./src/basic_motion_engine.ts ***! - \************************************/ -/*! exports provided: BasicMotionEngine */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BasicMotionEngine\", function() { return BasicMotionEngine; });\n/* harmony import */ var _motion_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./motion_engine */ \"./src/motion_engine.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar BasicMotionEngine = (function (_super) {\n __extends(BasicMotionEngine, _super);\n function BasicMotionEngine(level, options) {\n var _this = _super.call(this, level) || this;\n _this.rotationStep = options.rotationStep || 0.5;\n _this.actions = options.actions || [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"];\n return _this;\n }\n BasicMotionEngine.prototype.setUp = function (car, lidar) {\n this.car = car;\n this.lidar = lidar;\n this.state = [];\n for (var y = 0; y < lidar.pts; y++) {\n var line = [];\n for (var x = 0; x < lidar.pts; x++) {\n line.push(_global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].DEFAULT);\n }\n this.state.push(line);\n }\n this.setUpKeyboard();\n this.car.v = 0;\n this.detectInteractions();\n };\n BasicMotionEngine.prototype.setUpKeyboard = function () {\n var _this = this;\n var left = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](37);\n var up = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](38);\n var right = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](39);\n var down = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](40);\n if (this.actions.indexOf(\"LEFT\") != -1)\n left.press = function () { _this.turnLeft(); };\n if (this.actions.indexOf(\"RIGHT\") != -1)\n right.press = function () { _this.turnRight(); };\n if (this.actions.indexOf(\"UP\") != -1) {\n up.press = function () { _this.moveForward(); };\n up.release = function () {\n _this.car.v = 0;\n };\n }\n if (this.actions.indexOf(\"DOWN\") != -1) {\n down.press = function () { _this.moveBackward(); };\n down.release = function () {\n _this.car.v = 0;\n };\n }\n };\n BasicMotionEngine.prototype.turnLeft = function () {\n this.car.rotation -= this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BasicMotionEngine.prototype.turnRight = function () {\n this.car.rotation += this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BasicMotionEngine.prototype.moveForward = function () {\n this.car.v = 1;\n };\n BasicMotionEngine.prototype.moveBackward = function () {\n this.car.v = -1;\n };\n BasicMotionEngine.prototype.actionStep = function (delta, action) {\n if (this.actions[action] == \"LEFT\") {\n this.turnLeft();\n }\n if (this.actions[action] == \"RIGHT\") {\n this.turnRight();\n }\n if (this.actions[action] == \"UP\") {\n this.moveForward();\n }\n if (this.actions[action] == \"DOWN\") {\n this.moveBackward();\n }\n var _a = this.step(delta), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n this.car.v = 0;\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n BasicMotionEngine.prototype.actionSpace = function () {\n return {\n type: \"Discrete\",\n size: 1,\n range: [0, 1, 2, 3, 4]\n };\n };\n BasicMotionEngine.prototype.step = function (delta) {\n this.car.x += this.car.v * Math.cos(this.car.rotation) * delta;\n this.car.y += this.car.v * Math.sin(this.car.rotation) * delta;\n this.car.mx = Math.floor(this.car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.my = Math.floor(this.car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.checkAndsetNewRoad();\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n var _a = this.detectInteractions(), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n if (agentCollisions.length > 0) {\n this.car.v = 0;\n this.car.vy = 0;\n }\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n return BasicMotionEngine;\n}(_motion_engine__WEBPACK_IMPORTED_MODULE_0__[\"MotionEngine\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/basic_motion_engine.ts?"); - -/***/ }), - -/***/ "./src/bot_motion_engine.ts": -/*!**********************************!*\ - !*** ./src/bot_motion_engine.ts ***! - \**********************************/ -/*! exports provided: BotMotionEngine */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BotMotionEngine\", function() { return BotMotionEngine; });\n/* harmony import */ var _motion_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./motion_engine */ \"./src/motion_engine.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar BotMotionEngine = (function (_super) {\n __extends(BotMotionEngine, _super);\n function BotMotionEngine(level) {\n var _this = _super.call(this, level) || this;\n _this.map = _this.level.getMap();\n _this.mapSizeY = _this.map.length;\n _this.mapSizeX = _this.map[0].length;\n _this.rotationStep = 0.5;\n _this.rotationToNextCase = {};\n _this.rotationToNextCase[0] = { \"mx\": 1, \"my\": 0 };\n _this.rotationToNextCase[0.5] = { \"mx\": 0, \"my\": 1 };\n _this.rotationToNextCase[1.0] = { \"mx\": -1, \"my\": 0 };\n _this.rotationToNextCase[1.5] = { \"mx\": 0, \"my\": -1 };\n _this.rotationToNextCase[-0.5] = { \"mx\": 0, \"my\": -1 };\n _this.rotationToNextCase[-1.0] = { \"mx\": -1, \"my\": 0 };\n _this.rotationToNextCase[-1.5] = { \"mx\": 0, \"my\": 1 };\n return _this;\n }\n BotMotionEngine.prototype.setUp = function (car, lidar) {\n this.car = car;\n this.lidar = lidar;\n this.state = [];\n for (var y = 0; y < lidar.pts; y++) {\n var line = [];\n for (var x = 0; x < lidar.pts; x++) {\n line.push(_global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].DEFAULT);\n }\n this.state.push(line);\n }\n this.car.v = 0;\n this.detectInteractions();\n };\n BotMotionEngine.prototype.turnLeft = function () {\n this.car.rotation -= this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BotMotionEngine.prototype.turnRight = function () {\n this.car.rotation += this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BotMotionEngine.prototype.moveUp = function () {\n this.car.v = 1;\n };\n BotMotionEngine.prototype.moveDown = function () {\n this.car.v = -1;\n };\n BotMotionEngine.prototype.isRoad = function (nx, ny, avaibility) {\n if (avaibility === void 0) { avaibility = false; }\n if (ny < 0 || ny >= this.mapSizeY || nx < 0 || nx >= this.mapSizeX || this.map[ny][nx] == 0) {\n return false;\n }\n if (avaibility) {\n var road = this.level.getRoad(ny, nx);\n if (road.cars.length > 0)\n return false;\n }\n return true;\n };\n BotMotionEngine.prototype.autoRotation = function () {\n var right_dist = _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] + (_global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 3);\n var left_dist = _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] - (_global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 3.5);\n var same_dist = _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n if (this.car.next_road) {\n var y_dist = Math.abs(((this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) - this.car.y) * this.car.next_road.outroad_np.my);\n var x_dist = Math.abs(((this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) - this.car.x) * this.car.next_road.outroad_np.mx);\n if (this.car.next_road.rotation_type == 0) {\n if (y_dist < right_dist && x_dist < right_dist) {\n this.car.haveTurned = true;\n this.car.previousRotation = this.car.rotation;\n this.car.rotation = this.car.rotation += Math.PI / 2;\n this.car.rotation = this.car.rotation % (2 * Math.PI);\n this.car.next_road = undefined;\n return;\n }\n }\n if (this.car.next_road.rotation_type == 1) {\n if (y_dist < left_dist && x_dist < left_dist) {\n this.car.previousRotation = this.car.rotation;\n this.car.haveTurned = true;\n this.car.rotation = this.car.rotation -= Math.PI / 2;\n this.car.rotation = this.car.rotation % (2 * Math.PI);\n this.car.next_road = undefined;\n return;\n }\n }\n if (this.car.next_road.rotation_type == 2) {\n if (y_dist < same_dist && x_dist < same_dist) {\n this.car.haveTurned = true;\n this.car.previousRotation = this.car.rotation;\n this.car.rotation = this.car.rotation -= Math.PI;\n this.car.rotation = this.car.rotation % (2 * Math.PI);\n if (y_dist != 0 && this.car.x < this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.x = this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.y = this.car.next_road.outroad.y;\n }\n else if (y_dist != 0 && this.car.x > this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.x = this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.y = this.car.next_road.outroad.y;\n }\n else if (x_dist != 0 && this.car.y < this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.y = this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.x = this.car.next_road.outroad.x;\n }\n else if (x_dist != 0 && this.car.y > this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.y = this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.x = this.car.next_road.outroad.x;\n }\n this.car.next_road = undefined;\n return;\n }\n }\n }\n else {\n var key = this.car.rotation / Math.PI;\n var key_r = ((this.car.rotation / Math.PI) + 0.5) % 2;\n var key_l = ((this.car.rotation / Math.PI) - 0.5) % 2;\n var is_next_pos = this.rotationToNextCase[key];\n var is_next_pos_r = this.rotationToNextCase[key_r];\n var is_next_pos_l = this.rotationToNextCase[key_l];\n var turn = false;\n var nx = this.car.mx + is_next_pos.mx;\n var ny = this.car.my + is_next_pos.my;\n var current_road = this.level.getRoad(this.car.my, this.car.mx);\n if (!this.isRoad(nx, ny)) {\n turn = true;\n this.car.optionalTurn = false;\n }\n else if (!this.car.haveTurned && !this.car.turnedRandom) {\n this.car.turnedRandom = Math.random();\n }\n else if (!this.car.haveTurned && this.car.turnedRandom < 0.5 &&\n this.isRoad(this.car.mx + is_next_pos_r.mx, this.car.my + is_next_pos_r.my)) {\n turn = true;\n this.car.optionalTurn = true;\n }\n else if (!this.car.haveTurned && this.car.turnedRandom >= 0.5 &&\n this.isRoad(this.car.mx + is_next_pos_l.mx, this.car.my + is_next_pos_l.my)) {\n turn = true;\n this.car.optionalTurn = true;\n }\n if (turn) {\n var possibles_rotations = [(key + 0.5) % 2., (key - 0.5) % 2., null];\n for (var p = 0; p < possibles_rotations.length; p++) {\n var next_pos = void 0;\n if (possibles_rotations[p] != null) {\n next_pos = this.rotationToNextCase[possibles_rotations[p]];\n }\n else {\n next_pos = { \"mx\": 0, \"my\": 0 };\n }\n var px = this.car.mx + next_pos.mx;\n var py = this.car.my + next_pos.my;\n if (this.isRoad(px, py)) {\n this.car.next_road = {\n \"outroad\": { y: ny * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"], x: nx * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] },\n \"outroad_np\": is_next_pos,\n \"rotation_type\": p,\n };\n return;\n }\n }\n }\n }\n };\n BotMotionEngine.prototype.step = function (delta) {\n if (this.state.toString().indexOf(\",\" + _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR.toString()) != -1) {\n this.car.v = 0;\n if (this.car.v == 0 && this.car.haveTurned && this.car.optionalTurn == true) {\n this.car.rotation = this.car.previousRotation;\n }\n }\n else {\n this.car.v = 0.8;\n this.autoRotation();\n }\n if (this.level.isCarsMoving) {\n this.car.x += this.car.v * Math.cos(this.car.rotation) * delta;\n this.car.y += this.car.v * Math.sin(this.car.rotation) * delta;\n }\n this.car.mx = Math.floor(this.car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.my = Math.floor(this.car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.checkAndsetNewRoad();\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n var _a = this.detectInteractions(false), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n return BotMotionEngine;\n}(_motion_engine__WEBPACK_IMPORTED_MODULE_0__[\"MotionEngine\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/bot_motion_engine.ts?"); - -/***/ }), - -/***/ "./src/car.ts": -/*!********************!*\ - !*** ./src/car.ts ***! - \********************/ -/*! exports provided: Car */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Car\", function() { return Car; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar Global_carId = 0;\nvar Car = (function () {\n function Car(level, info, textures, options) {\n if (options === void 0) { options = {}; }\n var _this = this;\n this.level = level;\n options.image = options.image || _global__WEBPACK_IMPORTED_MODULE_0__[\"CAR_IMG\"].DEFAULT;\n options.lidar = options.lidar || false;\n options.lidarInfo = options.lidarInfo || { pts: 5, width: 4, height: 5, pos: 0 };\n this.core = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Sprite\"](textures[options.image]);\n this.info = info;\n this.core.scale.x = 0.8;\n this.core.scale.y = 0.8;\n this.core.anchor.x = 0.5;\n this.core.anchor.y = 0.5;\n this.core.road = undefined;\n this.core.carId = Global_carId;\n Global_carId += 1;\n this.core.agent = false;\n this.core.obstacle = true;\n this.core.mapId = _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].CAR;\n if (options.lidar) {\n this.createLidar(options.lidarInfo);\n this.core.lidar = this.lidar;\n }\n if (options.motionEngine) {\n this.motion = options.motionEngine;\n this.motion.setUp(this.core, this.lidar);\n this.core.rotationStep = 0.5;\n }\n else {\n this.core.rotationStep = 0.5;\n }\n this.core.mx = this.info.mx;\n this.core.my = this.info.my;\n this.core.x = (this.info.mx) * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"];\n this.core.y = (this.info.my) * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"];\n this.core.checkAndsetNewRoad = function (road) { return _this.checkAndsetNewRoad(road); };\n var road = this.level.getRoad(this.core.my, this.core.mx);\n this.core.line = 0;\n if (road) {\n road.setCarPosition(this.core, this.info.line);\n }\n }\n Car.prototype.checkAndsetNewRoad = function (n_road) {\n var current_road = this.core.road;\n if (!n_road) {\n n_road = this.level.getRoad(this.core.my, this.core.mx);\n ;\n }\n if (n_road != current_road) {\n if (current_road) {\n current_road.cars.splice(current_road.cars.indexOf(this.core.carId), 1);\n }\n this.core.road = n_road;\n this.core.haveTurned = false;\n this.core.optionalTurn = false;\n this.turnedRandom = undefined;\n if (n_road)\n n_road.cars.push(this.core.carId);\n }\n };\n Car.prototype.reset = function () {\n this.core.mx = this.info.mx;\n this.core.my = this.info.my;\n var road = this.level.getRoad(this.core.my, this.core.mx);\n if (road) {\n road.setCarPosition(this.core, this.info.line, true);\n }\n };\n Car.prototype.getState = function (linear) {\n if (linear === void 0) { linear = false; }\n if (!linear)\n return this.motion.state.map(function (arr) { return arr.slice(); });\n else {\n var state_1 = [];\n this.motion.state.map(function (row) { state_1 = state_1.concat(row); });\n return state_1;\n }\n };\n Car.prototype.step = function (delta, action) {\n if (action === void 0) { action = null; }\n if (action == null) {\n var _a = this.motion.step(delta), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n }\n else {\n var _b = this.motion.actionStep(delta, action), agentCollisions = _b.agentCollisions, onRoad = _b.onRoad;\n }\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n Car.prototype.createLidar = function (lidarOptions) {\n lidarOptions.pts = lidarOptions.pts || 5;\n lidarOptions.width = lidarOptions.width || 4;\n lidarOptions.height = lidarOptions.height || 5;\n lidarOptions.pos = lidarOptions.pos || 0;\n this.lidar = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Container\"]();\n this.lidar.lidarPts = [];\n this.lidar.collisionPts = [];\n var area = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n area.pt = false;\n area.alpha = 0.3;\n area.beginFill(0x515151);\n area.drawRect(0, 0, this.core.width * lidarOptions.width, this.core.height * lidarOptions.height);\n area.endFill();\n var front = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n front.pt = false;\n front.alpha = 0;\n front.beginFill(0x510000);\n front.drawRect(this.core.width - 5, area.height / 2, 3, 3);\n front.endFill();\n var back = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n back.pt = false;\n back.alpha = 0;\n back.beginFill(0x510000);\n back.drawRect(-1, area.height / 2 - 2, 3, 3);\n back.endFill();\n var left = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n left.pt = false;\n left.alpha = 0;\n left.beginFill(0x510000);\n left.drawRect(this.core.width / 2, area.height / 2 - this.core.height / 2 + 5, 3, 3);\n left.endFill();\n var right = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n right.pt = false;\n right.alpha = 0;\n right.beginFill(0x510000);\n right.drawRect(this.core.width / 2, area.height / 2 + this.core.height / 2 - 8, 3, 3);\n right.endFill();\n back.x -= (lidarOptions.pos * this.core.width);\n front.x -= (lidarOptions.pos * this.core.width);\n right.x -= (lidarOptions.pos * this.core.width);\n left.x -= (lidarOptions.pos * this.core.width);\n var x_step = area.width / lidarOptions.pts;\n var y_step = area.height / lidarOptions.pts;\n for (var xs = lidarOptions.pts - 1; xs >= 0; xs--) {\n for (var ys = 0; ys < lidarOptions.pts; ys++) {\n var x = (x_step / 4) + xs * x_step;\n var y = (y_step / 4) + ys * y_step;\n var pt = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n pt.pt = true;\n pt.beginFill(0xffffff);\n pt.drawRect(x, y, 5, 5);\n pt.endFill();\n this.lidar.addChild(pt);\n this.lidar.lidarPts.push(pt);\n }\n }\n this.lidar.pts = lidarOptions.pts;\n this.lidar.addChild(area);\n this.lidar.addChild(front);\n this.lidar.addChild(back);\n this.lidar.addChild(left);\n this.lidar.addChild(right);\n this.lidar.collisionPts.push(front);\n this.lidar.collisionPts.push(back);\n this.lidar.collisionPts.push(left);\n this.lidar.collisionPts.push(right);\n this.lidar.x = this.core.x;\n this.lidar.y = this.core.y;\n this.lidar.pivot.y = this.lidar.height / 2;\n this.lidar.pivot.x = this.core.width / 2 - (lidarOptions.pos * this.core.width);\n this.lidar.rotation = this.core.rotation;\n };\n return Car;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/car.ts?"); - -/***/ }), - -/***/ "./src/control_motion_engine.ts": -/*!**************************************!*\ - !*** ./src/control_motion_engine.ts ***! - \**************************************/ -/*! exports provided: ControlMotionEngine */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ControlMotionEngine\", function() { return ControlMotionEngine; });\n/* harmony import */ var _motion_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./motion_engine */ \"./src/motion_engine.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar ControlMotionEngine = (function (_super) {\n __extends(ControlMotionEngine, _super);\n function ControlMotionEngine(level) {\n var _this = _super.call(this, level) || this;\n _this.level = level;\n _this.actions = [\"SteeringAngle\", \"Throttle\"];\n return _this;\n }\n ControlMotionEngine.prototype.setUp = function (car, lidar) {\n this.car = car;\n this.lidar = lidar;\n this.state = [];\n for (var y = 0; y < lidar.pts; y++) {\n var line = [];\n for (var x = 0; x < lidar.pts; x++) {\n line.push(_global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].DEFAULT);\n }\n this.state.push(line);\n }\n this.setUpKeyboard();\n this.car.v = 0;\n this.car.a = 0;\n this.car.yaw_rate = 0;\n this.detectInteractions();\n };\n ControlMotionEngine.prototype.setUpKeyboard = function () {\n var _this = this;\n var left = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](37);\n var up = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](38);\n var right = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](39);\n var down = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](40);\n left.press = function () {\n _this.turn(-0.5);\n };\n left.release = function () {\n _this.turn(0);\n };\n right.press = function () {\n _this.turn(0.5);\n };\n right.release = function () {\n _this.turn(0);\n };\n up.press = function () { _this.move(1); };\n up.release = function () {\n _this.car.a = 0;\n };\n down.press = function () { _this.move(-1); };\n down.release = function () {\n _this.car.a = 0;\n };\n };\n ControlMotionEngine.prototype.turn = function (value) {\n this.car.yaw_rate = value;\n };\n ControlMotionEngine.prototype.move = function (throttle) {\n this.car.a = throttle;\n };\n ControlMotionEngine.prototype.actionStep = function (delta, actions) {\n this.car.a = Math.min(Math.max(parseInt(actions[0].toString()), -1), 1);\n this.car.yaw_rate = Math.min(Math.max(parseInt(actions[1].toString()), -1), 1);\n var _a = this.step(delta), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n this.car.a = 0;\n this.car.yaw_rate = 0;\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n ControlMotionEngine.prototype.actionSpace = function () {\n return Array.apply(null, { length: this.actions.length }).map(Number.call, Number);\n };\n ControlMotionEngine.prototype.step = function (delta) {\n if (this.car.v > 0)\n this.car.v = Math.max(0, this.car.v - 0.01);\n else if (this.car.v < 0)\n this.car.v = Math.min(0, this.car.v + 0.01);\n if (this.car.a > 0)\n this.car.v = Math.min(2., this.car.v + this.car.a * 0.02);\n else\n this.car.v = Math.max(-2., this.car.v + this.car.a * 0.02);\n if (this.car.yaw_rate == 0) {\n this.car.x += this.car.v * Math.cos(this.car.rotation) * delta;\n this.car.y += this.car.v * Math.sin(this.car.rotation) * delta;\n }\n else {\n var yr = this.car.yaw_rate * 0.01 * (this.car.v + 0.001) * Math.PI;\n this.car.x += (this.car.v / yr) * (Math.sin(this.car.rotation + (yr * delta)) - Math.sin(this.car.rotation));\n this.car.y += (this.car.v / yr) * (Math.cos(this.car.rotation) - Math.cos(this.car.rotation + (yr * delta)));\n this.car.rotation += yr * delta;\n }\n this.car.mx = Math.floor(this.car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.my = Math.floor(this.car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.checkAndsetNewRoad();\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n var _a = this.detectInteractions(), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n if (agentCollisions.length > 0) {\n this.car.v = 0;\n this.car.vy = 0;\n }\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n return ControlMotionEngine;\n}(_motion_engine__WEBPACK_IMPORTED_MODULE_0__[\"MotionEngine\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/control_motion_engine.ts?"); - -/***/ }), - -/***/ "./src/editor.ts": -/*!***********************!*\ - !*** ./src/editor.ts ***! - \***********************/ -/*! exports provided: Editor */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Editor\", function() { return Editor; });\n/* harmony import */ var _asset_manager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./asset_manager */ \"./src/asset_manager.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _world__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./world */ \"./src/world.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar Editor = (function (_super) {\n __extends(Editor, _super);\n function Editor(levelContent, canvasId) {\n var _this = _super.call(this, levelContent, canvasId) || this;\n _this.selectedItems = null;\n _this.am = new _asset_manager__WEBPACK_IMPORTED_MODULE_0__[\"AssetManger\"](_this);\n return _this;\n }\n Editor.prototype._setEvents = function () {\n };\n Editor.prototype._setup = function (info) {\n var _this = this;\n this._setEvents();\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n this.am.createMap(this.map, info, textures, false);\n this.am.createCars(this.map, info, textures);\n if (info.agent)\n this.agent = this.am.createAgent(this.map, info, textures, false);\n var that = this;\n for (var i = 0; i < this.envs.length; i++) {\n this.envs[i].interactive = true;\n this.envs[i].on(\"rightclick\", function () { that.removeItem(this); });\n }\n for (var i = 0; i < this.am.assets.length; i++) {\n this.am.assets[i].interactive = true;\n this.am.assets[i].on(\"rightclick\", function () { that.removeItem(this); });\n }\n this.app.ticker.add(function (delta) { return _this.loop(delta); });\n };\n Editor.prototype.resize = function (width, height) {\n this.app.renderer.resize(width * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"], height * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n };\n Editor.prototype.getSelectedItems = function () {\n return this.selectedItems;\n };\n Editor.prototype.selectedItem = function (item) {\n if (this.selectedItems) {\n this.app.stage.removeChild(this.selectedItems);\n }\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n this.selectedItems = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[item.image]);\n this.selectedItems.type = item.type;\n this.selectedItems.image = item.image;\n this.selectedItems.data = item.data;\n this.selectedItems.x = 0;\n this.selectedItems.y = 0;\n this.app.stage.addChild(this.selectedItems);\n };\n Editor.prototype.removeItem = function (item) {\n if (item.lidar) {\n this.app.stage.removeChild(item.lidar);\n }\n if (item.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR) {\n if (item.road)\n item.road.cars.splice(item.road.cars.indexOf(item.carId), 1);\n }\n if (item.agent)\n this.agent = undefined;\n this.app.stage.removeChild(item);\n item.isremove = true;\n };\n Editor.prototype.exportMap = function (width, height, file_name, download) {\n return this.am.exportMap(width, height, file_name, download);\n };\n Editor.prototype.setCurrentItem = function () {\n this.am.addAsset(this.selectedItems);\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n var that = this;\n if (this.selectedItems.type == \"road\") {\n this.am.createRoad({\n mx: Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n my: Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n type: this.selectedItems.data\n }, textures, this.selectedItems.data);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"car\") {\n this.am.createCars(this.map, { cars: [{\n \"mx\": Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"my\": Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"rotation\": 0,\n \"line\": 0,\n }] }, textures);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"agent\" && this.agent == undefined) {\n this.agent = this.am.createAgent(this.map, { agent: {\n \"mx\": Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"my\": Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"rotation\": 0,\n \"line\": 0,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotation_step\": 0.5,\n \"actions\": [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"]\n }\n }\n } }, textures);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"asset\") {\n this.am.createAsset(this.selectedItems.image, { x: this.selectedItems.x, y: this.selectedItems.y }, textures, this.selectedItems.data);\n this.am.assets[this.am.assets.length - 1].interactive = true;\n this.am.assets[this.am.assets.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n this.app.stage.removeChild(this.selectedItems);\n this.selectedItems = null;\n };\n return Editor;\n}(_world__WEBPACK_IMPORTED_MODULE_2__[\"World\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/editor.ts?"); - -/***/ }), - -/***/ "./src/embedded.ts": -/*!*************************!*\ - !*** ./src/embedded.ts ***! - \*************************/ -/*! exports provided: embeddedUrl, embeddedContent */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"embeddedUrl\", function() { return embeddedUrl; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"embeddedContent\", function() { return embeddedContent; });\n/* harmony import */ var _embedded_level_full_city__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./embedded/level/full_city */ \"./src/embedded/level/full_city.ts\");\n/* harmony import */ var _embedded_level_level_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./embedded/level/level_1 */ \"./src/embedded/level/level_1.ts\");\n/* harmony import */ var _embedded_level_level_0__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./embedded/level/level_0 */ \"./src/embedded/level/level_0.ts\");\n\n\n\n;\nvar embeddedUrl = {\n fullCity: \"embedded://level/fullCity\",\n level1: \"embedded://level/level1\",\n level0: \"embedded://level/level0\"\n};\nvar embeddedContent = {\n level: {\n fullCity: _embedded_level_full_city__WEBPACK_IMPORTED_MODULE_0__[\"fullCity\"],\n level1: _embedded_level_level_1__WEBPACK_IMPORTED_MODULE_1__[\"level1\"],\n level0: _embedded_level_level_0__WEBPACK_IMPORTED_MODULE_2__[\"level0\"]\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded.ts?"); - -/***/ }), - -/***/ "./src/embedded/level/full_city.ts": -/*!*****************************************!*\ - !*** ./src/embedded/level/full_city.ts ***! - \*****************************************/ -/*! exports provided: fullCity */ -/***/ (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?"); - -/***/ }), - -/***/ "./src/embedded/level/level_0.ts": -/*!***************************************!*\ - !*** ./src/embedded/level/level_0.ts ***! - \***************************************/ -/*! exports provided: level0 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"level0\", function() { return level0; });\nvar level0 = {\n \"cars\": [],\n \"house\": [\n {\n \"x\": 263,\n \"y\": 108\n },\n {\n \"x\": 112,\n \"y\": 258\n }\n ],\n \"house3\": [\n {\n \"x\": 262,\n \"y\": 16\n }\n ],\n \"bench\": [\n {\n \"x\": 135,\n \"y\": 34\n }\n ],\n \"tree\": [\n {\n \"x\": 124,\n \"y\": 134\n },\n {\n \"x\": 7,\n \"y\": 11\n },\n {\n \"x\": 69,\n \"y\": 10\n },\n {\n \"x\": 19,\n \"y\": 238\n },\n {\n \"x\": 5,\n \"y\": 133\n },\n {\n \"x\": 260,\n \"y\": 211\n }\n ],\n \"map\": [\n [\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n \"↱\",\n \"↔\",\n \"↰\",\n 0\n ],\n [\n 0,\n \"↕\",\n 0,\n \"↕\",\n 0\n ],\n [\n 0,\n \"↳\",\n \"↠\",\n \"↲\",\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ],\n \"agent\": {\n \"mx\": 2,\n \"my\": 1,\n \"line\": 1,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotationStep\": 0.5,\n \"actions\": [\n \"UP\",\n \"LEFT\",\n \"RIGHT\",\n \"DOWN\",\n \"WAIT\"\n ]\n }\n }\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded/level/level_0.ts?"); - -/***/ }), - -/***/ "./src/embedded/level/level_1.ts": -/*!***************************************!*\ - !*** ./src/embedded/level/level_1.ts ***! - \***************************************/ -/*! exports provided: level1 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"level1\", function() { return level1; });\nvar level1 = {\n \"cars\": [\n {\n \"mx\": 5,\n \"my\": 3,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 5,\n \"my\": 3,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 5,\n \"my\": 1,\n \"line\": 0,\n \"auto\": true\n }\n ],\n \"tree\": [\n {\n \"x\": 120,\n \"y\": 50\n },\n {\n \"x\": 86.5,\n \"y\": 85\n },\n {\n \"x\": 94.5,\n \"y\": 135\n },\n {\n \"x\": 30.5,\n \"y\": 128\n },\n {\n \"x\": 72.5,\n \"y\": 190\n },\n {\n \"x\": 23.5,\n \"y\": 232\n },\n {\n \"x\": 110.5,\n \"y\": 242\n },\n {\n \"x\": 43.5,\n \"y\": 33\n },\n {\n \"x\": 18.5,\n \"y\": 178\n },\n {\n \"x\": 305.5,\n \"y\": 125\n },\n {\n \"x\": 360.5,\n \"y\": 122\n }\n ],\n \"asset\": [\n {\n \"x\": 252.5,\n \"y\": 142\n },\n {\n \"x\": 86.5,\n \"y\": 85\n },\n {\n \"x\": 94.5,\n \"y\": 135\n },\n {\n \"x\": 30.5,\n \"y\": 128\n },\n {\n \"x\": 252.5,\n \"y\": 26\n },\n {\n \"x\": 195.5,\n \"y\": 0\n },\n {\n \"x\": 307.5,\n \"y\": 1\n },\n {\n \"x\": 72.5,\n \"y\": 190\n },\n {\n \"x\": 23.5,\n \"y\": 232\n },\n {\n \"x\": 110.5,\n \"y\": 242\n },\n {\n \"x\": 43.5,\n \"y\": 33\n },\n {\n \"x\": 35.5,\n \"y\": 185\n },\n {\n \"x\": 18.5,\n \"y\": 178\n },\n {\n \"x\": 289.5,\n \"y\": 126\n },\n {\n \"x\": 337.5,\n \"y\": 126\n },\n {\n \"x\": 305.5,\n \"y\": 125\n },\n {\n \"x\": 360.5,\n \"y\": 122\n },\n {\n \"x\": 492.5,\n \"y\": 56\n },\n {\n \"x\": 503.5,\n \"y\": 136\n },\n {\n \"x\": 504.5,\n \"y\": 58\n }\n ],\n \"bench\": [\n {\n \"x\": 252.5,\n \"y\": 142\n },\n {\n \"x\": 252.5,\n \"y\": 26\n }\n ],\n \"road\": [\n {\n \"x\": 240,\n \"y\": 60\n },\n {\n \"x\": 240,\n \"y\": 60\n },\n {\n \"x\": 480,\n \"y\": 0\n },\n {\n \"x\": 480,\n \"y\": 60\n },\n {\n \"x\": 480,\n \"y\": 120\n },\n {\n \"x\": 480,\n \"y\": 180\n },\n {\n \"x\": 480,\n \"y\": 240\n },\n {\n \"x\": 300,\n \"y\": 180\n },\n {\n \"x\": 300,\n \"y\": 180\n },\n {\n \"x\": 360,\n \"y\": 180\n },\n {\n \"x\": 420,\n \"y\": 180\n },\n {\n \"x\": 420,\n \"y\": 120\n },\n {\n \"x\": 420,\n \"y\": 60\n },\n {\n \"x\": 360,\n \"y\": 60\n },\n {\n \"x\": 300,\n \"y\": 60\n },\n {\n \"x\": 420,\n \"y\": 120\n }\n ],\n \"house3\": [\n {\n \"x\": 503.5,\n \"y\": 136\n }\n ],\n \"house\": [\n {\n \"x\": 504.5,\n \"y\": 58\n }\n ],\n \"map\": [\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n \"↱\",\n \"↠\",\n \"↔\",\n \"↔\",\n \"↰\",\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n \"↟\",\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n \"↳\",\n \"↔\",\n \"↔\",\n \"↔\",\n \"↲\",\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ],\n \"agent\": {\n \"mx\": 4,\n \"my\": 3,\n \"line\": 0,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotationStep\": 0.5,\n \"actions\": [\n \"UP\",\n \"LEFT\",\n \"RIGHT\"\n ]\n }\n }\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded/level/level_1.ts?"); - -/***/ }), - -/***/ "./src/global.ts": -/*!***********************!*\ - !*** ./src/global.ts ***! - \***********************/ -/*! exports provided: Application, Loader, Resources, Sprite, Graphics, Container, URL, JSON_TEXTURES, JSON_IMAGE, IMAGE_FOLDER, ROADSIZE, CAR_IMG, MAP, ASSETS */ -/***/ (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 = \"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?"); - -/***/ }), - -/***/ "./src/index.ts": -/*!**********************!*\ - !*** ./src/index.ts ***! - \**********************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _metacar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./metacar */ \"./src/metacar.ts\");\n/* harmony import */ var _embedded__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./embedded */ \"./src/embedded.ts\");\n/* harmony import */ var _metacar_editor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./metacar_editor */ \"./src/metacar_editor.ts\");\n/* harmony import */ var _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./basic_motion_engine */ \"./src/basic_motion_engine.ts\");\n/* harmony import */ var _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./control_motion_engine */ \"./src/control_motion_engine.ts\");\n\n\n\n\n\nvar metacar = {\n env: _metacar__WEBPACK_IMPORTED_MODULE_0__[\"MetaCar\"],\n editor: _metacar_editor__WEBPACK_IMPORTED_MODULE_2__[\"MetaCarEditor\"],\n level: _embedded__WEBPACK_IMPORTED_MODULE_1__[\"embeddedUrl\"],\n motion: {\n BasicMotion: _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"],\n ControlMotion: _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__[\"ControlMotionEngine\"]\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (metacar);\n\n\n//# sourceURL=webpack://metacar/./src/index.ts?"); - -/***/ }), - -/***/ "./src/level.ts": -/*!**********************!*\ - !*** ./src/level.ts ***! - \**********************/ -/*! exports provided: Level */ -/***/ (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.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?"); - -/***/ }), - -/***/ "./src/metacar.ts": -/*!************************!*\ - !*** ./src/metacar.ts ***! - \************************/ -/*! exports provided: MetaCar */ -/***/ (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.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?"); - -/***/ }), - -/***/ "./src/metacar_editor.ts": -/*!*******************************!*\ - !*** ./src/metacar_editor.ts ***! - \*******************************/ -/*! exports provided: MetaCarEditor */ -/***/ (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.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?"); - -/***/ }), - -/***/ "./src/motion_engine.ts": -/*!******************************!*\ - !*** ./src/motion_engine.ts ***! - \******************************/ -/*! exports provided: MotionEngine */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MotionEngine\", function() { return MotionEngine; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar MotionEngine = (function () {\n function MotionEngine(level) {\n this.level = level;\n }\n MotionEngine.prototype.boxesIntersect = function (a, b, reduce) {\n var ab = a.getBounds();\n var bb = b.getBounds();\n return ab.x + ab.width > bb.x && ab.x < bb.x + bb.width && ab.y + ab.height > bb.y && ab.y < bb.y + bb.height;\n };\n MotionEngine.prototype.carIntersect = function (car1, object) {\n var nb = this.car.lidar.collisionPts.length;\n for (var c = 0; c < nb; c++) {\n if (this.boxesIntersect(this.car.lidar.collisionPts[c], object, false)) {\n return true;\n }\n }\n return false;\n };\n MotionEngine.prototype.carCaptorInObject = function (car1, object) {\n var size = this.car.lidar.collisionPts.length;\n var nb = 0;\n for (var c = 0; c < size; c++) {\n if (this.boxesIntersect(this.car.lidar.collisionPts[c], object, false)) {\n nb += 1;\n }\n }\n return nb;\n };\n MotionEngine.prototype.detectInteractions = function (all) {\n if (all === void 0) { all = true; }\n var envs = this.level.getEnvs();\n var agentCollisions = [];\n var lidar_collisions = [];\n var onRoadCnt = 0;\n var checkNb = 0;\n var onRoad = false;\n for (var i = 0; i < envs.length; i++) {\n if (envs[i] != this.car && Math.abs(envs[i].mx - this.car.mx) < 2 && Math.abs(envs[i].my - this.car.my) < 2) {\n checkNb += 1;\n if (all && envs[i].obstacle && this.carIntersect(this.car, envs[i])) {\n agentCollisions.push(envs[i]);\n }\n else if (all && envs[i].mapId == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].ROAD) {\n onRoadCnt += this.carCaptorInObject(this.car, envs[i]);\n }\n if (this.boxesIntersect(envs[i], this.lidar, false)) {\n lidar_collisions.push(envs[i]);\n }\n }\n }\n this.setState(lidar_collisions);\n if (onRoadCnt >= 4 || !all) {\n onRoad = true;\n }\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n MotionEngine.prototype.setState = function (lidar_collisions) {\n var pt_id = 0;\n for (var i = 0; i < this.lidar.lidarPts.length; i++) {\n this.lidar.lidarPts[i].alpha = 0.3;\n var pt_y = Math.floor(pt_id / this.lidar.pts);\n var pt_x = Math.floor(pt_id % this.lidar.pts);\n this.state[pt_y][pt_x] = _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].DEFAULT;\n for (var a = 0; a < lidar_collisions.length; a++) {\n if (lidar_collisions[a] != this.car) {\n var touch = this.boxesIntersect(lidar_collisions[a], this.lidar.lidarPts[i], false);\n if (touch && lidar_collisions[a].obstacle) {\n this.lidar.lidarPts[i].alpha = 1.;\n }\n if (touch && (lidar_collisions[a].mapId > this.state[pt_y][pt_x] || (lidar_collisions[a].mapId == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].ROAD && this.state[pt_y][pt_x] == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].DEFAULT))) {\n this.state[pt_y][pt_x] = lidar_collisions[a].mapId;\n }\n }\n }\n pt_id += 1;\n }\n };\n return MotionEngine;\n}());\n\n;\n\n\n//# sourceURL=webpack://metacar/./src/motion_engine.ts?"); - -/***/ }), - -/***/ "./src/ui_event.ts": -/*!*************************!*\ - !*** ./src/ui_event.ts ***! - \*************************/ -/*! exports provided: UIEvent */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"UIEvent\", function() { return UIEvent; });\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\n\nvar UIEvent = (function () {\n function UIEvent(level, canvasId) {\n this.selectedItems = false;\n this.level = level;\n this.canvasId = canvasId;\n var canvas = document.getElementById(canvasId);\n var buttons = document.createElement('div');\n buttons.classList.add(\"metacar_buttons_container\");\n buttons.id = \"metacar_\" + canvasId + \"_buttons_container\";\n canvas.parentNode.insertBefore(buttons, canvas.nextSibling);\n this.buttonsContainer = buttons;\n }\n UIEvent.prototype.isPlaying = function () {\n return this.playing;\n };\n UIEvent.prototype.getEditorSize = function () {\n return { width: this.editorWidth, height: this.editorHeight };\n };\n UIEvent.prototype._createButton = function (parent, name) {\n var button = document.createElement('button');\n button.classList.add(\"metacar_button_train\");\n button.id = \"metacar_\" + this.canvasId + \"_button_\" + name;\n name = name.replace(/_/g, \" \");\n button.innerHTML = name.charAt(0).toUpperCase() + name.slice(1);\n ;\n parent.appendChild(button);\n return button;\n };\n UIEvent.prototype.onTrain = function (fc) {\n var _this = this;\n var button = this._createButton(this.buttonsContainer, \"train\");\n button.addEventListener(\"click\", function () {\n _this.level.render(false);\n if (fc)\n fc();\n });\n };\n UIEvent.prototype.onPlay = function (fc) {\n var _this = this;\n var button = this._createButton(this.buttonsContainer, \"play\");\n button.addEventListener(\"click\", function () {\n if (fc) {\n _this.playing = true;\n _this.playCallback = fc;\n }\n });\n };\n UIEvent.prototype.onStop = function (fc) {\n var _this = this;\n var button = this._createButton(this.buttonsContainer, \"stop\");\n button.addEventListener(\"click\", function () {\n _this.playing = false;\n _this.playCallback = undefined;\n if (fc)\n fc();\n });\n };\n UIEvent.prototype.onResetEnv = function (fc) {\n var _this = this;\n var button = this._createButton(this.buttonsContainer, \"reset_env\");\n button.addEventListener(\"click\", function () {\n _this.level.reset();\n if (fc)\n fc();\n });\n };\n UIEvent.prototype.onCustomEvent = function (name, fc) {\n var button = this._createButton(this.buttonsContainer, name);\n button.addEventListener(\"click\", function () {\n if (fc)\n fc();\n });\n };\n UIEvent.prototype.onSaveEditor = function (fc, options) {\n var _this = this;\n var button = this._createButton(this.buttonsContainer, \"save\");\n button.addEventListener(\"click\", function () {\n var size = _this.getEditorSize();\n var content = _this.level.exportMap(size.width, size.height, options.name, options.download);\n if (fc)\n fc(content);\n });\n };\n UIEvent.prototype.onLoad = function (fc, options) {\n if (options === void 0) { options = Object(); }\n options.local = options.local || false;\n var button = this._createButton(this.buttonsContainer, \"load_trained_agent\");\n var input_file = document.createElement('input');\n input_file.type = \"file\";\n input_file.accept = \"*/*\";\n input_file.style.display = \"none\";\n input_file.classList.add(\"metacar_button_input_file\");\n input_file.id = \"metacar_\" + this.canvasId + \"_button_input_file\";\n this.buttonsContainer.appendChild(input_file);\n input_file.addEventListener(\"change\", function (dump) {\n _utils__WEBPACK_IMPORTED_MODULE_0__[\"readDump\"](dump, function (content) {\n if (fc)\n fc(content);\n });\n });\n button.addEventListener(\"click\", function () {\n if (options.local) {\n input_file.click();\n }\n else {\n if (fc)\n fc();\n }\n });\n };\n UIEvent.prototype._createRangeBar = function (name) {\n var inputProgress = document.createElement('input');\n inputProgress.type = \"range\";\n inputProgress.min = \"5\";\n inputProgress.max = \"15\";\n inputProgress.value = \"5\";\n inputProgress.classList.add(\"metacar_\" + name + \"_input\");\n inputProgress.id = \"metacar_\" + this.canvasId + \"_\" + name + \"_input\";\n return inputProgress;\n };\n UIEvent.prototype._createSpan = function (name, text) {\n var span = document.createElement('span');\n span.classList.add(\"metacar_\" + name + \"_span\");\n span.id = \"metacar_\" + this.canvasId + \"_\" + name + \"_span\";\n span.innerHTML = text;\n return span;\n };\n UIEvent.prototype._createImage = function (name, src) {\n var img = document.createElement('img');\n img.classList.add(\"metacar_img\");\n img.id = \"metacar_\" + this.canvasId + \"_\" + name + \"_img\";\n img.src = src;\n return img;\n };\n UIEvent.prototype._listenRangeChanges = function (widthInput, heightInput) {\n var _this = this;\n widthInput.onchange = function () {\n var width = parseInt((widthInput).value);\n var height = parseInt((heightInput).value);\n _this.level.resize(width, height);\n _this.editorWidth = width;\n _this.editorHeight = height;\n };\n heightInput.onchange = function () {\n var width = parseInt((widthInput).value);\n var height = parseInt((heightInput).value);\n _this.level.resize(width, height);\n _this.editorWidth = width;\n _this.editorHeight = height;\n };\n };\n UIEvent.prototype._listenCanvasEditor = function () {\n var _this = this;\n document.getElementById(this.canvasId).addEventListener('contextmenu', function (event) { return event.preventDefault(); });\n document.getElementById(this.canvasId).addEventListener(\"click\", function () {\n var selectedItem = _this.level.getSelectedItems();\n if (selectedItem) {\n _this.level.setCurrentItem();\n }\n });\n };\n UIEvent.prototype._listenEditorImgs = function () {\n var classname = document.getElementsByClassName(\"metacar_img\");\n var that = this;\n for (var i = 0; i < classname.length; i++) {\n classname[i].addEventListener('click', function () {\n that.level.selectedItem({\n image: this.getAttribute('data-img'),\n type: this.getAttribute('data-type'),\n data: this.getAttribute(\"data-data\")\n });\n }, false);\n }\n };\n UIEvent.prototype.createEditorElementsEvents = function () {\n var widthText = this._createSpan(\"width\", \"Width\");\n var widthProgress = this._createRangeBar(\"width\");\n var heightText = this._createSpan(\"height\", \"Height\");\n var heightProgress = this._createRangeBar(\"height\");\n this.buttonsContainer.appendChild(widthText);\n this.buttonsContainer.appendChild(widthProgress);\n this.buttonsContainer.appendChild(heightText);\n this.buttonsContainer.appendChild(heightProgress);\n this._listenRangeChanges(widthProgress, heightProgress);\n this._listenCanvasEditor();\n var map = this.level.getMap();\n var width = map[0].length;\n var height = map.length;\n widthProgress.value = width.toString();\n heightProgress.value = height.toString();\n this.editorWidth = width;\n this.editorHeight = height;\n var agentImg = this._createImage(\"car_agent\", _global__WEBPACK_IMPORTED_MODULE_1__[\"IMAGE_FOLDER\"] + \"car_agent.png\");\n agentImg.dataset.type = \"agent\";\n agentImg.dataset.img = \"car_agent.png\";\n this.buttonsContainer.appendChild(agentImg);\n var carImg = this._createImage(\"car_agent\", _global__WEBPACK_IMPORTED_MODULE_1__[\"IMAGE_FOLDER\"] + \"car.png\");\n carImg.dataset.type = \"car\";\n carImg.dataset.img = \"car.png\";\n this.buttonsContainer.appendChild(carImg);\n var roads = _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"][\"ROADS\"];\n for (var arrow in roads) {\n var nImg = this._createImage(roads[arrow].image.replace(\".png\", \"\"), _global__WEBPACK_IMPORTED_MODULE_1__[\"IMAGE_FOLDER\"] + roads[arrow].image);\n nImg.dataset.type = \"road\";\n nImg.dataset.img = roads[arrow].image;\n nImg.dataset.data = arrow;\n this.buttonsContainer.appendChild(nImg);\n }\n for (var key in _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"]) {\n if (key != \"ROADS\") {\n var nImg = this._createImage(key, _global__WEBPACK_IMPORTED_MODULE_1__[\"IMAGE_FOLDER\"] + _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"][key].image);\n nImg.dataset.img = _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"][key].image;\n nImg.dataset.data = key;\n nImg.dataset.type = \"asset\";\n this.buttonsContainer.appendChild(nImg);\n }\n }\n this._listenEditorImgs();\n };\n return UIEvent;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/ui_event.ts?"); - -/***/ }), - -/***/ "./src/utils.ts": -/*!**********************!*\ - !*** ./src/utils.ts ***! - \**********************/ -/*! exports provided: loadJSON, loadEmbeddedURL, loadLocalStorageURL, loadCustomURL, mod, argMax, mean, saveAs, readDump, shuffleArray, keyboard */ -/***/ (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(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?"); - -/***/ }), - -/***/ "./src/world.ts": -/*!**********************!*\ - !*** ./src/world.ts ***! - \**********************/ -/*! exports provided: World */ -/***/ (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\"]], { 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?"); - -/***/ }), - -/***/ "pixi.js": -/*!***********************!*\ - !*** external "PIXI" ***! - \***********************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("(function() { module.exports = window[\"PIXI\"]; }());\n\n//# sourceURL=webpack://metacar/external_%22PIXI%22?"); - -/***/ }) - -/******/ })["default"]; \ No newline at end of file +window.metacar=function(t){var e={};function i(o){if(e[o])return e[o].exports;var n=e[o]={i:o,l:!1,exports:{}};return t[o].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=t,i.c=e,i.d=function(t,e,o){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:o})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(i.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)i.d(o,n,function(e){return t[e]}.bind(null,n));return o},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=1)}([function(t,e){t.exports=window.PIXI},function(t,e,i){"use strict";i.r(e);var o=i(0),n=(o.Application,o.loader),a=(o.loader.resources,o.Sprite),r=o.Graphics,s=o.Container,h="https://metacar-project.com/",c=h+"public/textures/textures.json",l=h+"public/images/",d=60,p={DEFAULT:"car.png",AGENT:"car_agent.png"},u={ROAD:-1,DEFAULT:0,CAR:1,AGENT:1},v={ROADS:{"↕":{image:"road_u.png",orientation:1.5},"↔":{image:"road_r.png",orientation:0},"↱":{image:"road_rotate_ld.png",orientation:1.25},"↰":{image:"road_rotate_ul.png",orientation:.75},"↲":{image:"road_rotate_rl.png",orientation:.25},"↳":{image:"road_rotate_dl.png",orientation:1.75},"↟":{image:"road_up.png",orientation:1.5},"↠":{image:"road_rp.png",orientation:0},"↤":{image:"road_r2.png",orientation:0},"↦":{image:"road_l2.png",orientation:1},"↥":{image:"road_d2.png",orientation:.5},"↧":{image:"road_u2.png",orientation:1.5}},house:{image:"house.png"},house2:{image:"house2.png"},house3:{image:"house3.png"},bench:{image:"bench.png"},tree:{image:"tree.png"}},y={level:{fullCity:{cars:[{mx:2,my:5,line:0,auto:!0},{mx:3,my:4,line:0,auto:!0},{mx:3,my:4,line:1,auto:!0},{mx:6,my:3,line:0,auto:!0},{mx:6,my:3,line:1,auto:!0},{mx:8,my:2,line:0,auto:!0},{mx:8,my:2,line:1,auto:!0},{mx:2,my:7,line:0,auto:!0}],house:[{x:9,y:409},{x:146,y:162},{x:439,y:39}],house2:[{x:425,y:192},{x:431,y:354}],house3:[{x:426,y:281},{x:51,y:157},{x:553,y:34}],bench:[{x:259,y:206},{x:8,y:205}],tree:[{x:1,y:303},{x:54,y:357},{x:215,y:325},{x:230,y:400},{x:282,y:368},{x:182,y:433},{x:285,y:309},{x:576,y:233},{x:581,y:300},{x:519,y:388},{x:582,y:391},{x:256,y:69},{x:151,y:43},{x:77,y:77},{x:26,y:24},{x:189,y:98}],map:[[0,0,0,0,0,0,"↕",0,0,0,0],[0,0,0,0,0,0,"↟",0,0,0,0],[0,0,0,0,0,0,"↦","↔","↔","↠","↔"],[0,0,0,0,0,0,"↕",0,0,0,0],["↔","↔","↧","↔","↠","↔","↤",0,0,0,0],[0,0,"↕",0,0,0,"↕",0,0,0,0],[0,0,"↟",0,0,0,"↟",0,0,0,0],[0,0,"↕",0,0,0,"↕",0,0,0,0]]},level1:{cars:[{mx:5,my:3,line:0,auto:!0},{mx:5,my:3,line:1,auto:!0},{mx:5,my:1,line:0,auto:!0}],tree:[{x:120,y:50},{x:86.5,y:85},{x:94.5,y:135},{x:30.5,y:128},{x:72.5,y:190},{x:23.5,y:232},{x:110.5,y:242},{x:43.5,y:33},{x:18.5,y:178},{x:305.5,y:125},{x:360.5,y:122}],asset:[{x:252.5,y:142},{x:86.5,y:85},{x:94.5,y:135},{x:30.5,y:128},{x:252.5,y:26},{x:195.5,y:0},{x:307.5,y:1},{x:72.5,y:190},{x:23.5,y:232},{x:110.5,y:242},{x:43.5,y:33},{x:35.5,y:185},{x:18.5,y:178},{x:289.5,y:126},{x:337.5,y:126},{x:305.5,y:125},{x:360.5,y:122},{x:492.5,y:56},{x:503.5,y:136},{x:504.5,y:58}],bench:[{x:252.5,y:142},{x:252.5,y:26}],road:[{x:240,y:60},{x:240,y:60},{x:480,y:0},{x:480,y:60},{x:480,y:120},{x:480,y:180},{x:480,y:240},{x:300,y:180},{x:300,y:180},{x:360,y:180},{x:420,y:180},{x:420,y:120},{x:420,y:60},{x:360,y:60},{x:300,y:60},{x:420,y:120}],house3:[{x:503.5,y:136}],house:[{x:504.5,y:58}],map:[[0,0,0,0,0,0,0,0,0,0],[0,0,0,"↱","↠","↔","↔","↰",0,0],[0,0,0,"↕",0,0,0,"↟",0,0],[0,0,0,"↳","↔","↔","↔","↲",0,0],[0,0,0,0,0,0,0,0,0,0]],agent:{mx:4,my:3,line:0,motion:{type:"BasicMotionEngine",options:{rotationStep:.5,actions:["UP","LEFT","RIGHT"]}}}},level0:{cars:[],house:[{x:263,y:108},{x:112,y:258}],house3:[{x:262,y:16}],bench:[{x:135,y:34}],tree:[{x:124,y:134},{x:7,y:11},{x:69,y:10},{x:19,y:238},{x:5,y:133},{x:260,y:211}],map:[[0,0,0,0,0],[0,"↱","↔","↰",0],[0,"↕",0,"↕",0],[0,"↳","↠","↲",0],[0,0,0,0,0]],agent:{mx:2,my:1,line:1,motion:{type:"BasicMotionEngine",options:{rotationStep:.5,actions:["UP","LEFT","RIGHT","DOWN","WAIT"]}}}}}};function f(t,e){var i=new XMLHttpRequest;i.overrideMimeType("application/json"),i.open("GET",t,!0),i.onreadystatechange=function(){4==i.readyState&&200==i.status&&e(JSON.parse(i.responseText))},i.send(null)}function m(t,e){var i=t.split("//");i=i[1].split("/"),e(y[i[0]][i[1]])}function g(t,e){({"embedded:":m,"http:":f,"https:":f})[t.split("//")[0]](t,e)}function x(t,e){var i=document.createElement("a");document.body.appendChild(i);var o=new Blob([t],{type:"application/octet-binary"}),n=window.URL.createObjectURL(o);i.href=n,i.download=e,i.click(),window.URL.revokeObjectURL(n),i.href=""}function _(t){var e={};return e.code=t,e.isDown=!1,e.isUp=!0,e.press=void 0,e.release=void 0,e.downHandler=function(t){t.keyCode===e.code&&(e.isUp&&e.press&&e.press(),e.isDown=!0,e.isUp=!1),t.preventDefault()},e.upHandler=function(t){t.keyCode===e.code&&(e.isDown&&e.release&&e.release(),e.isDown=!1,e.isUp=!0),t.preventDefault()},window.addEventListener("keydown",e.downHandler.bind(e),!1),window.addEventListener("keyup",e.upHandler.bind(e),!1),e}var I,C=0,w=function(){function t(t,e,i,o){void 0===o&&(o={});var n=this;this.level=t,o.image=o.image||p.DEFAULT,o.lidar=o.lidar||!1,o.lidarInfo=o.lidarInfo||{pts:5,width:4,height:5,pos:0},this.core=new a(i[o.image]),this.info=e,this.core.scale.x=.8,this.core.scale.y=.8,this.core.anchor.x=.5,this.core.anchor.y=.5,this.core.road=void 0,this.core.carId=C,C+=1,this.core.agent=!1,this.core.obstacle=!0,this.core.mapId=u.CAR,o.lidar&&(this.createLidar(o.lidarInfo),this.core.lidar=this.lidar),o.motionEngine?(this.motion=o.motionEngine,this.motion.setUp(this.core,this.lidar),this.core.rotationStep=.5):this.core.rotationStep=.5,this.core.mx=this.info.mx,this.core.my=this.info.my,this.core.x=this.info.mx*d,this.core.y=this.info.my*d,this.core.checkAndsetNewRoad=function(t){return n.checkAndsetNewRoad(t)};var r=this.level.getRoad(this.core.my,this.core.mx);this.core.line=0,r&&r.setCarPosition(this.core,this.info.line)}return t.prototype.checkAndsetNewRoad=function(t){var e=this.core.road;t||(t=this.level.getRoad(this.core.my,this.core.mx)),t!=e&&(e&&e.cars.splice(e.cars.indexOf(this.core.carId),1),this.core.road=t,this.core.haveTurned=!1,this.core.optionalTurn=!1,this.turnedRandom=void 0,t&&t.cars.push(this.core.carId))},t.prototype.reset=function(){this.core.mx=this.info.mx,this.core.my=this.info.my;var t=this.level.getRoad(this.core.my,this.core.mx);t&&t.setCarPosition(this.core,this.info.line,!0)},t.prototype.getState=function(t){if(void 0===t&&(t=!1),t){var e=[];return this.motion.state.map(function(t){e=e.concat(t)}),e}return this.motion.state.map(function(t){return t.slice()})},t.prototype.step=function(t,e){if(void 0===e&&(e=null),null==e)var i=this.motion.step(t),o=i.agentCollisions,n=i.onRoad;else{var a=this.motion.actionStep(t,e);o=a.agentCollisions,n=a.onRoad}return{agentCollisions:o,onRoad:n}},t.prototype.createLidar=function(t){t.pts=t.pts||5,t.width=t.width||4,t.height=t.height||5,t.pos=t.pos||0,this.lidar=new s,this.lidar.lidarPts=[],this.lidar.collisionPts=[];var e=new r;e.pt=!1,e.alpha=.3,e.beginFill(5329233),e.drawRect(0,0,this.core.width*t.width,this.core.height*t.height),e.endFill();var i=new r;i.pt=!1,i.alpha=0,i.beginFill(5308416),i.drawRect(this.core.width-5,e.height/2,3,3),i.endFill();var o=new r;o.pt=!1,o.alpha=0,o.beginFill(5308416),o.drawRect(-1,e.height/2-2,3,3),o.endFill();var n=new r;n.pt=!1,n.alpha=0,n.beginFill(5308416),n.drawRect(this.core.width/2,e.height/2-this.core.height/2+5,3,3),n.endFill();var a=new r;a.pt=!1,a.alpha=0,a.beginFill(5308416),a.drawRect(this.core.width/2,e.height/2+this.core.height/2-8,3,3),a.endFill(),o.x-=t.pos*this.core.width,i.x-=t.pos*this.core.width,a.x-=t.pos*this.core.width,n.x-=t.pos*this.core.width;for(var h=e.width/t.pts,c=e.height/t.pts,l=t.pts-1;l>=0;l--)for(var d=0;do.x&&i.xo.y&&i.y=4||!t)&&(a=!0),{agentCollisions:i,onRoad:a}},t.prototype.setState=function(t){for(var e=0,i=0;ithis.state[o][n]||t[a].mapId==u.ROAD&&this.state[o][n]==u.DEFAULT)&&(this.state[o][n]=t[a].mapId)}e+=1}},t}(),b=(I=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i])},function(t,e){function i(){this.constructor=t}I(t,e),t.prototype=null===e?Object.create(e):(i.prototype=e.prototype,new i)}),R=function(t){function e(e,i){var o=t.call(this,e)||this;return o.rotationStep=i.rotationStep||.5,o.actions=i.actions||["UP","LEFT","RIGHT","DOWN","WAIT"],o}return b(e,t),e.prototype.setUp=function(t,e){this.car=t,this.lidar=e,this.state=[];for(var i=0;i0&&(this.car.v=0,this.car.vy=0),{agentCollisions:i,onRoad:o}},e}(M),E=function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i])};return function(e,i){function o(){this.constructor=e}t(e,i),e.prototype=null===i?Object.create(i):(o.prototype=i.prototype,new o)}}(),L=function(t){function e(e){var i=t.call(this,e)||this;return i.map=i.level.getMap(),i.mapSizeY=i.map.length,i.mapSizeX=i.map[0].length,i.rotationStep=.5,i.rotationToNextCase={},i.rotationToNextCase[0]={mx:1,my:0},i.rotationToNextCase[.5]={mx:0,my:1},i.rotationToNextCase[1]={mx:-1,my:0},i.rotationToNextCase[1.5]={mx:0,my:-1},i.rotationToNextCase[-.5]={mx:0,my:-1},i.rotationToNextCase[-1]={mx:-1,my:0},i.rotationToNextCase[-1.5]={mx:0,my:1},i}return E(e,t),e.prototype.setUp=function(t,e){this.car=t,this.lidar=e,this.state=[];for(var i=0;i=this.mapSizeY||t<0||t>=this.mapSizeX||0==this.map[e][t])return!1;if(i&&this.level.getRoad(e,t).cars.length>0)return!1;return!0},e.prototype.autoRotation=function(){var t=d+d/3,e=d-d/3.5,i=d;if(this.car.next_road){var o=Math.abs((this.car.next_road.outroad.y+d/2-this.car.y)*this.car.next_road.outroad_np.my),n=Math.abs((this.car.next_road.outroad.x+d/2-this.car.x)*this.car.next_road.outroad_np.mx);if(0==this.car.next_road.rotation_type&&othis.car.next_road.outroad.x+d/2?(this.car.x=this.car.next_road.outroad.x+d-d/2-d/4,this.car.y=this.car.next_road.outroad.y):0!=n&&this.car.ythis.car.next_road.outroad.y+d/2&&(this.car.y=this.car.next_road.outroad.y+d-d/2-d/4,this.car.x=this.car.next_road.outroad.x),void(this.car.next_road=void 0)}else{var a=this.car.rotation/Math.PI,r=(this.car.rotation/Math.PI+.5)%2,s=(this.car.rotation/Math.PI-.5)%2,h=this.rotationToNextCase[a],c=this.rotationToNextCase[r],l=this.rotationToNextCase[s],p=!1,u=this.car.mx+h.mx,v=this.car.my+h.my;if(this.isRoad(u,v)?this.car.haveTurned||this.car.turnedRandom?!this.car.haveTurned&&this.car.turnedRandom<.5&&this.isRoad(this.car.mx+c.mx,this.car.my+c.my)?(p=!0,this.car.optionalTurn=!0):!this.car.haveTurned&&this.car.turnedRandom>=.5&&this.isRoad(this.car.mx+l.mx,this.car.my+l.my)&&(p=!0,this.car.optionalTurn=!0):this.car.turnedRandom=Math.random():(p=!0,this.car.optionalTurn=!1),p)for(var y=[(a+.5)%2,(a-.5)%2,null],f=0;f=1&&n&&n.core.line==i&&(i=0==i?1:0),e.line=i,e.x=t.x,e.y=t.y,e.x+=d/2,e.y+=d/2;var a=1*d/4;t.orientation=Math.floor(t.orientation/e.rotationStep)*e.rotationStep;var r=-t.orientation*Math.PI,s=0*Math.cos(r)-a*Math.sin(r),h=Math.cos(r)*a+0*Math.sin(r),c=0==i?1:-1,l=0==i?0:Math.PI;e.x+=c*Math.round(s),e.y+=c*Math.round(h),e.mx=Math.floor(e.x/d),e.my=Math.floor(e.y/d),e.rotation=r+l,e.checkAndsetNewRoad(t)},t.prototype.createAsset=function(t,e,i,o){var n=new a(i[t]);n.obstacle=!1,n.type=o,n.mapId=0,n.x=e.x,n.y=e.y,this.level.addChild(n),this.assets.push(n)},t.prototype.createMap=function(t,e,i,o){if(void 0===o&&(o=!0),o)for(var n=0;n0?o=-1:e||(o=-1),o},e.prototype.getLastReward=function(){return this.lastReward},e.prototype.step=function(t,e){void 0===e&&(e=null);for(var i=0;i0?this.car.v=Math.max(0,this.car.v-.01):this.car.v<0&&(this.car.v=Math.min(0,this.car.v+.01)),this.car.a>0?this.car.v=Math.min(2,this.car.v+.02*this.car.a):this.car.v=Math.max(-2,this.car.v+.02*this.car.a),0==this.car.yaw_rate)this.car.x+=this.car.v*Math.cos(this.car.rotation)*t,this.car.y+=this.car.v*Math.sin(this.car.rotation)*t;else{var e=.01*this.car.yaw_rate*(this.car.v+.001)*Math.PI;this.car.x+=this.car.v/e*(Math.sin(this.car.rotation+e*t)-Math.sin(this.car.rotation)),this.car.y+=this.car.v/e*(Math.cos(this.car.rotation)-Math.cos(this.car.rotation+e*t)),this.car.rotation+=e*t}this.car.mx=Math.floor(this.car.x/d),this.car.my=Math.floor(this.car.y/d),this.car.checkAndsetNewRoad(),this.lidar.x=this.car.x,this.lidar.y=this.car.y,this.lidar.rotation=this.car.rotation;var i=this.detectInteractions(),o=i.agentCollisions,n=i.onRoad;return o.length>0&&(this.car.v=0,this.car.vy=0),{agentCollisions:o,onRoad:n}},e}(M),j={env:k,editor:N,level:{fullCity:"embedded://level/fullCity",level1:"embedded://level/level1",level0:"embedded://level/level0"},motion:{BasicMotion:R,ControlMotion:B}};e.default=j}]).default; \ No newline at end of file diff --git a/demo/webapp/editor.html b/demo/webapp/editor.html index 5ef1425..6444280 100644 --- a/demo/webapp/editor.html +++ b/demo/webapp/editor.html @@ -25,6 +25,14 @@ +
+

Editor


+

+ Left click on one item to select it. Then Left click on the map to set the item.
+ Right click is used to remove an item. +

+
+ diff --git a/demo/webapp/index.html b/demo/webapp/index.html index a1e8a98..cd857fe 100644 --- a/demo/webapp/index.html +++ b/demo/webapp/index.html @@ -25,15 +25,14 @@

Metacar

-

A reinforcement learning environement for self driving cars in the browser.

+

A reinforcement learning environment for self-driving cars in the browser.

  const env = new metacar.env("canvas", metacar.level.fullCity);
env.load();

Learn how to start with metacar by reading the documentation.

-


-

Checkout examples of algorithm create with metacar

+

Check out examples of algorithm create with metacar




@@ -54,8 +53,9 @@
Policy Monte carlo

- In this example, I give an example of policy gradient algorithm based on monte carlo - exploration. The neural network is build using tensorflow.js. Checkout the demo + + Example of policy gradient algorithm based on Monte Carlo exploration. + The neural network is build using tensorflow.js. Check out the demo.

@@ -66,8 +66,9 @@
Create your own level!

- Metacar let's you edit your own level using the editor. -
Also, you’re more than welcome to contributing. + + Metacar lets you edit your own level using the the editor. + Also, you’re more than welcome to contribute to the project.

diff --git a/demo/webapp/level0.html b/demo/webapp/level0.html index 8f21e09..bd9d607 100644 --- a/demo/webapp/level0.html +++ b/demo/webapp/level0.html @@ -27,7 +27,16 @@

Current state (Lidar points)


- Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. + Q-learning algorithm with table.

+ + Click on "Load trained agent" to load the model. Then click on "Play" + to see the result.

+ + The left window gives you an overview of what's the autonomous vehicle (in red) see.

+ + The algorithm is implemented here using the metacar environement. + + You can see below the content of the Q-table once the model is loaded.

diff --git a/demo/webapp/level1.html b/demo/webapp/level1.html index 373564d..86fdfce 100644 --- a/demo/webapp/level1.html +++ b/demo/webapp/level1.html @@ -26,7 +26,14 @@

Current state (Lidar points)


- Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. + Policy Gradient algorithm based on Monte Carlo exploration.

+ + Click on "Load trained agent" to load the model. Then click on "Play" + to see the result.

+ + The left window gives you an overview of what's the autonomous vehicle (in red) see.

+ + The algorithm is implemented here using the metacar environement.

diff --git a/demo/webapp/public/js/level0.js b/demo/webapp/public/js/level0.js index 7ee6e69..6990832 100644 --- a/demo/webapp/public/js/level0.js +++ b/demo/webapp/public/js/level0.js @@ -35,11 +35,9 @@ env.load().then(() => { }); env.addEvent("save", () => agent.save()); env.addEvent("load", (content) => { - loadJSON("http://localhost:3000/public/models/qtable/qtable.json", (content) => { - agent.restore(content); + loadJSON("https://meta-project/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 710ec60..f3eb19f 100644 --- a/demo/webapp/public/js/level1.js +++ b/demo/webapp/public/js/level1.js @@ -3,8 +3,6 @@ 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); @@ -31,5 +29,8 @@ env.load().then(() => { console.log("On reset env!"); }); env.addEvent("save", () => agent.save()); - env.addEvent("load", () => agent.restore()); + env.addEvent("load", () => { + document.getElementById("metacar_canvas_button_train").style.display = "none"; + agent.restore() + }); }); diff --git a/demo/webapp/public/js/policy_agent.js b/demo/webapp/public/js/policy_agent.js index 609c709..b739695 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.01; + const LEARNING_RATE = 0.005; 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.01; + const LEARNING_RATE = 0.005; this.policy_optimizer = tf.train.adam(LEARNING_RATE); /* ----------------------- @@ -175,8 +175,10 @@ class PolicyAgent { /* Restore the weights of the network */ - 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"); + //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"); + 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"); } play(){ diff --git a/demo/webapp/public/levels/levelGet.json b/demo/webapp/public/levels/levelGet.json new file mode 100644 index 0000000..50e9681 --- /dev/null +++ b/demo/webapp/public/levels/levelGet.json @@ -0,0 +1,148 @@ +{ + "cars": [], + "house": [ + { + "x": 263, + "y": 108 + }, + { + "x": 112, + "y": 258 + } + ], + "house3": [ + { + "x": 262, + "y": 16 + } + ], + "bench": [ + { + "x": 135, + "y": 34 + } + ], + "tree": [ + { + "x": 124, + "y": 134 + }, + { + "x": 260, + "y": 211 + }, + { + "x": 19, + "y": 54 + }, + { + "x": 17, + "y": 92 + }, + { + "x": 23, + "y": 132 + }, + { + "x": 71, + "y": 129 + }, + { + "x": 54, + "y": 46 + }, + { + "x": 107, + "y": 29 + }, + { + "x": 54, + "y": 78 + } + ], + "asset": [ + { + "x": 19, + "y": 54 + }, + { + "x": 17, + "y": 92 + }, + { + "x": 23, + "y": 132 + }, + { + "x": 71, + "y": 129 + }, + { + "x": 54, + "y": 46 + }, + { + "x": 107, + "y": 29 + }, + { + "x": 54, + "y": 78 + } + ], + "map": [ + [ + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + "↱", + "↔", + "↰", + 0 + ], + [ + 0, + "↕", + 0, + "↕", + 0 + ], + [ + 0, + "↳", + "↠", + "↲", + 0 + ], + [ + 0, + 0, + 0, + 0, + 0 + ] + ], + "agent": { + "mx": 2, + "my": 1, + "line": 1, + "motion": { + "type": "BasicMotionEngine", + "options": { + "rotationStep": 0.5, + "actions": [ + "UP", + "LEFT", + "RIGHT", + "DOWN", + "WAIT" + ] + } + } + } +} \ No newline at end of file diff --git a/demo/webapp/public/models/qtable/qtable.json b/demo/webapp/public/models/qtable/qtable.json new file mode 100644 index 0000000..5ed7e29 --- /dev/null +++ b/demo/webapp/public/models/qtable/qtable.json @@ -0,0 +1 @@ +{"-1,-1,-1,-1":[38.41559993476102,37.65002795012376,37.38483694531514],"0,0,-1,-1":[37.62498572562567,37.80332356260869,37.3046709762896],"0,0,0,0":[34.070528769574345,34.641914478399805,33.874618288072924],"0,0,-1,0":[37.49471434416808,37.72852866958,36.31603666094973],"0,-1,-1,-1":[38.07277667405897,37.41500326267591,37.87683622071364],"-1,0,-1,-1":[38.051726923441535,37.90970644063301,37.293556977524595],"0,0,0,-1":[37.28014175378364,36.78736188762118,37.57500486223731],"0,-1,0,-1":[35.51195704245981,35.42196427040668,37.84970557040712],"-1,0,-1,0":[36.803399265972836,37.93584887730367,36.343739000290775],"-1,-1,0,-1":[17.326632163377663,23.714711979348117,37.54300608700161],"-1,-1,-1,0":[33.45157506696106,37.89368395744174,33.56173243769651],"-1,-1,0,0":[3.8973901965290025,7.788651280752156,22.37450751169544],"0,-1,0,0":[1.488747275090645,19.456561890876525,7.225236475305854],"-1,0,0,0":[1.998090897118808,7.814518157457918,26.485809153258685]} \ No newline at end of file diff --git a/dist/metacar.min.js b/dist/metacar.min.js index 501acb1..7243487 100644 --- a/dist/metacar.min.js +++ b/dist/metacar.min.js @@ -1,329 +1 @@ -window["metacar"] = -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./src/index.ts"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "./src/asset_manager.ts": -/*!******************************!*\ - !*** ./src/asset_manager.ts ***! - \******************************/ -/*! exports provided: AssetManger */ -/***/ (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 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?"); - -/***/ }), - -/***/ "./src/basic_motion_engine.ts": -/*!************************************!*\ - !*** ./src/basic_motion_engine.ts ***! - \************************************/ -/*! exports provided: BasicMotionEngine */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BasicMotionEngine\", function() { return BasicMotionEngine; });\n/* harmony import */ var _motion_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./motion_engine */ \"./src/motion_engine.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar BasicMotionEngine = (function (_super) {\n __extends(BasicMotionEngine, _super);\n function BasicMotionEngine(level, options) {\n var _this = _super.call(this, level) || this;\n _this.rotationStep = options.rotationStep || 0.5;\n _this.actions = options.actions || [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"];\n return _this;\n }\n BasicMotionEngine.prototype.setUp = function (car, lidar) {\n this.car = car;\n this.lidar = lidar;\n this.state = [];\n for (var y = 0; y < lidar.pts; y++) {\n var line = [];\n for (var x = 0; x < lidar.pts; x++) {\n line.push(_global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].DEFAULT);\n }\n this.state.push(line);\n }\n this.setUpKeyboard();\n this.car.v = 0;\n this.detectInteractions();\n };\n BasicMotionEngine.prototype.setUpKeyboard = function () {\n var _this = this;\n var left = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](37);\n var up = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](38);\n var right = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](39);\n var down = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](40);\n if (this.actions.indexOf(\"LEFT\") != -1)\n left.press = function () { _this.turnLeft(); };\n if (this.actions.indexOf(\"RIGHT\") != -1)\n right.press = function () { _this.turnRight(); };\n if (this.actions.indexOf(\"UP\") != -1) {\n up.press = function () { _this.moveForward(); };\n up.release = function () {\n _this.car.v = 0;\n };\n }\n if (this.actions.indexOf(\"DOWN\") != -1) {\n down.press = function () { _this.moveBackward(); };\n down.release = function () {\n _this.car.v = 0;\n };\n }\n };\n BasicMotionEngine.prototype.turnLeft = function () {\n this.car.rotation -= this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BasicMotionEngine.prototype.turnRight = function () {\n this.car.rotation += this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BasicMotionEngine.prototype.moveForward = function () {\n this.car.v = 1;\n };\n BasicMotionEngine.prototype.moveBackward = function () {\n this.car.v = -1;\n };\n BasicMotionEngine.prototype.actionStep = function (delta, action) {\n if (this.actions[action] == \"LEFT\") {\n this.turnLeft();\n }\n if (this.actions[action] == \"RIGHT\") {\n this.turnRight();\n }\n if (this.actions[action] == \"UP\") {\n this.moveForward();\n }\n if (this.actions[action] == \"DOWN\") {\n this.moveBackward();\n }\n var _a = this.step(delta), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n this.car.v = 0;\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n BasicMotionEngine.prototype.actionSpace = function () {\n return {\n type: \"Discrete\",\n size: 1,\n range: [0, 1, 2, 3, 4]\n };\n };\n BasicMotionEngine.prototype.step = function (delta) {\n this.car.x += this.car.v * Math.cos(this.car.rotation) * delta;\n this.car.y += this.car.v * Math.sin(this.car.rotation) * delta;\n this.car.mx = Math.floor(this.car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.my = Math.floor(this.car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.checkAndsetNewRoad();\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n var _a = this.detectInteractions(), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n if (agentCollisions.length > 0) {\n this.car.v = 0;\n this.car.vy = 0;\n }\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n return BasicMotionEngine;\n}(_motion_engine__WEBPACK_IMPORTED_MODULE_0__[\"MotionEngine\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/basic_motion_engine.ts?"); - -/***/ }), - -/***/ "./src/bot_motion_engine.ts": -/*!**********************************!*\ - !*** ./src/bot_motion_engine.ts ***! - \**********************************/ -/*! exports provided: BotMotionEngine */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BotMotionEngine\", function() { return BotMotionEngine; });\n/* harmony import */ var _motion_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./motion_engine */ \"./src/motion_engine.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar BotMotionEngine = (function (_super) {\n __extends(BotMotionEngine, _super);\n function BotMotionEngine(level) {\n var _this = _super.call(this, level) || this;\n _this.map = _this.level.getMap();\n _this.mapSizeY = _this.map.length;\n _this.mapSizeX = _this.map[0].length;\n _this.rotationStep = 0.5;\n _this.rotationToNextCase = {};\n _this.rotationToNextCase[0] = { \"mx\": 1, \"my\": 0 };\n _this.rotationToNextCase[0.5] = { \"mx\": 0, \"my\": 1 };\n _this.rotationToNextCase[1.0] = { \"mx\": -1, \"my\": 0 };\n _this.rotationToNextCase[1.5] = { \"mx\": 0, \"my\": -1 };\n _this.rotationToNextCase[-0.5] = { \"mx\": 0, \"my\": -1 };\n _this.rotationToNextCase[-1.0] = { \"mx\": -1, \"my\": 0 };\n _this.rotationToNextCase[-1.5] = { \"mx\": 0, \"my\": 1 };\n return _this;\n }\n BotMotionEngine.prototype.setUp = function (car, lidar) {\n this.car = car;\n this.lidar = lidar;\n this.state = [];\n for (var y = 0; y < lidar.pts; y++) {\n var line = [];\n for (var x = 0; x < lidar.pts; x++) {\n line.push(_global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].DEFAULT);\n }\n this.state.push(line);\n }\n this.car.v = 0;\n this.detectInteractions();\n };\n BotMotionEngine.prototype.turnLeft = function () {\n this.car.rotation -= this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BotMotionEngine.prototype.turnRight = function () {\n this.car.rotation += this.rotationStep * Math.PI;\n this.lidar.rotation = this.car.rotation;\n };\n BotMotionEngine.prototype.moveUp = function () {\n this.car.v = 1;\n };\n BotMotionEngine.prototype.moveDown = function () {\n this.car.v = -1;\n };\n BotMotionEngine.prototype.isRoad = function (nx, ny, avaibility) {\n if (avaibility === void 0) { avaibility = false; }\n if (ny < 0 || ny >= this.mapSizeY || nx < 0 || nx >= this.mapSizeX || this.map[ny][nx] == 0) {\n return false;\n }\n if (avaibility) {\n var road = this.level.getRoad(ny, nx);\n if (road.cars.length > 0)\n return false;\n }\n return true;\n };\n BotMotionEngine.prototype.autoRotation = function () {\n var right_dist = _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] + (_global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 3);\n var left_dist = _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] - (_global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 3.5);\n var same_dist = _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"];\n if (this.car.next_road) {\n var y_dist = Math.abs(((this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) - this.car.y) * this.car.next_road.outroad_np.my);\n var x_dist = Math.abs(((this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) - this.car.x) * this.car.next_road.outroad_np.mx);\n if (this.car.next_road.rotation_type == 0) {\n if (y_dist < right_dist && x_dist < right_dist) {\n this.car.haveTurned = true;\n this.car.previousRotation = this.car.rotation;\n this.car.rotation = this.car.rotation += Math.PI / 2;\n this.car.rotation = this.car.rotation % (2 * Math.PI);\n this.car.next_road = undefined;\n return;\n }\n }\n if (this.car.next_road.rotation_type == 1) {\n if (y_dist < left_dist && x_dist < left_dist) {\n this.car.previousRotation = this.car.rotation;\n this.car.haveTurned = true;\n this.car.rotation = this.car.rotation -= Math.PI / 2;\n this.car.rotation = this.car.rotation % (2 * Math.PI);\n this.car.next_road = undefined;\n return;\n }\n }\n if (this.car.next_road.rotation_type == 2) {\n if (y_dist < same_dist && x_dist < same_dist) {\n this.car.haveTurned = true;\n this.car.previousRotation = this.car.rotation;\n this.car.rotation = this.car.rotation -= Math.PI;\n this.car.rotation = this.car.rotation % (2 * Math.PI);\n if (y_dist != 0 && this.car.x < this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.x = this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.y = this.car.next_road.outroad.y;\n }\n else if (y_dist != 0 && this.car.x > this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.x = this.car.next_road.outroad.x + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.y = this.car.next_road.outroad.y;\n }\n else if (x_dist != 0 && this.car.y < this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.y = this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.x = this.car.next_road.outroad.x;\n }\n else if (x_dist != 0 && this.car.y > this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2) {\n this.car.y = this.car.next_road.outroad.y + _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 2 - _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] / 4;\n this.car.x = this.car.next_road.outroad.x;\n }\n this.car.next_road = undefined;\n return;\n }\n }\n }\n else {\n var key = this.car.rotation / Math.PI;\n var key_r = ((this.car.rotation / Math.PI) + 0.5) % 2;\n var key_l = ((this.car.rotation / Math.PI) - 0.5) % 2;\n var is_next_pos = this.rotationToNextCase[key];\n var is_next_pos_r = this.rotationToNextCase[key_r];\n var is_next_pos_l = this.rotationToNextCase[key_l];\n var turn = false;\n var nx = this.car.mx + is_next_pos.mx;\n var ny = this.car.my + is_next_pos.my;\n var current_road = this.level.getRoad(this.car.my, this.car.mx);\n if (!this.isRoad(nx, ny)) {\n turn = true;\n this.car.optionalTurn = false;\n }\n else if (!this.car.haveTurned && !this.car.turnedRandom) {\n this.car.turnedRandom = Math.random();\n }\n else if (!this.car.haveTurned && this.car.turnedRandom < 0.5 &&\n this.isRoad(this.car.mx + is_next_pos_r.mx, this.car.my + is_next_pos_r.my)) {\n turn = true;\n this.car.optionalTurn = true;\n }\n else if (!this.car.haveTurned && this.car.turnedRandom >= 0.5 &&\n this.isRoad(this.car.mx + is_next_pos_l.mx, this.car.my + is_next_pos_l.my)) {\n turn = true;\n this.car.optionalTurn = true;\n }\n if (turn) {\n var possibles_rotations = [(key + 0.5) % 2., (key - 0.5) % 2., null];\n for (var p = 0; p < possibles_rotations.length; p++) {\n var next_pos = void 0;\n if (possibles_rotations[p] != null) {\n next_pos = this.rotationToNextCase[possibles_rotations[p]];\n }\n else {\n next_pos = { \"mx\": 0, \"my\": 0 };\n }\n var px = this.car.mx + next_pos.mx;\n var py = this.car.my + next_pos.my;\n if (this.isRoad(px, py)) {\n this.car.next_road = {\n \"outroad\": { y: ny * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"], x: nx * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"] },\n \"outroad_np\": is_next_pos,\n \"rotation_type\": p,\n };\n return;\n }\n }\n }\n }\n };\n BotMotionEngine.prototype.step = function (delta) {\n if (this.state.toString().indexOf(\",\" + _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR.toString()) != -1) {\n this.car.v = 0;\n if (this.car.v == 0 && this.car.haveTurned && this.car.optionalTurn == true) {\n this.car.rotation = this.car.previousRotation;\n }\n }\n else {\n this.car.v = 0.8;\n this.autoRotation();\n }\n if (this.level.isCarsMoving) {\n this.car.x += this.car.v * Math.cos(this.car.rotation) * delta;\n this.car.y += this.car.v * Math.sin(this.car.rotation) * delta;\n }\n this.car.mx = Math.floor(this.car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.my = Math.floor(this.car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.checkAndsetNewRoad();\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n var _a = this.detectInteractions(false), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n return BotMotionEngine;\n}(_motion_engine__WEBPACK_IMPORTED_MODULE_0__[\"MotionEngine\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/bot_motion_engine.ts?"); - -/***/ }), - -/***/ "./src/car.ts": -/*!********************!*\ - !*** ./src/car.ts ***! - \********************/ -/*! exports provided: Car */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Car\", function() { return Car; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar Global_carId = 0;\nvar Car = (function () {\n function Car(level, info, textures, options) {\n if (options === void 0) { options = {}; }\n var _this = this;\n this.level = level;\n options.image = options.image || _global__WEBPACK_IMPORTED_MODULE_0__[\"CAR_IMG\"].DEFAULT;\n options.lidar = options.lidar || false;\n options.lidarInfo = options.lidarInfo || { pts: 5, width: 4, height: 5, pos: 0 };\n this.core = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Sprite\"](textures[options.image]);\n this.info = info;\n this.core.scale.x = 0.8;\n this.core.scale.y = 0.8;\n this.core.anchor.x = 0.5;\n this.core.anchor.y = 0.5;\n this.core.road = undefined;\n this.core.carId = Global_carId;\n Global_carId += 1;\n this.core.agent = false;\n this.core.obstacle = true;\n this.core.mapId = _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].CAR;\n if (options.lidar) {\n this.createLidar(options.lidarInfo);\n this.core.lidar = this.lidar;\n }\n if (options.motionEngine) {\n this.motion = options.motionEngine;\n this.motion.setUp(this.core, this.lidar);\n this.core.rotationStep = 0.5;\n }\n else {\n this.core.rotationStep = 0.5;\n }\n this.core.mx = this.info.mx;\n this.core.my = this.info.my;\n this.core.x = (this.info.mx) * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"];\n this.core.y = (this.info.my) * _global__WEBPACK_IMPORTED_MODULE_0__[\"ROADSIZE\"];\n this.core.checkAndsetNewRoad = function (road) { return _this.checkAndsetNewRoad(road); };\n var road = this.level.getRoad(this.core.my, this.core.mx);\n this.core.line = 0;\n if (road) {\n road.setCarPosition(this.core, this.info.line);\n }\n }\n Car.prototype.checkAndsetNewRoad = function (n_road) {\n var current_road = this.core.road;\n if (!n_road) {\n n_road = this.level.getRoad(this.core.my, this.core.mx);\n ;\n }\n if (n_road != current_road) {\n if (current_road) {\n current_road.cars.splice(current_road.cars.indexOf(this.core.carId), 1);\n }\n this.core.road = n_road;\n this.core.haveTurned = false;\n this.core.optionalTurn = false;\n this.turnedRandom = undefined;\n if (n_road)\n n_road.cars.push(this.core.carId);\n }\n };\n Car.prototype.reset = function () {\n this.core.mx = this.info.mx;\n this.core.my = this.info.my;\n var road = this.level.getRoad(this.core.my, this.core.mx);\n if (road) {\n road.setCarPosition(this.core, this.info.line, true);\n }\n };\n Car.prototype.getState = function (linear) {\n if (linear === void 0) { linear = false; }\n if (!linear)\n return this.motion.state.map(function (arr) { return arr.slice(); });\n else {\n var state_1 = [];\n this.motion.state.map(function (row) { state_1 = state_1.concat(row); });\n return state_1;\n }\n };\n Car.prototype.step = function (delta, action) {\n if (action === void 0) { action = null; }\n if (action == null) {\n var _a = this.motion.step(delta), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n }\n else {\n var _b = this.motion.actionStep(delta, action), agentCollisions = _b.agentCollisions, onRoad = _b.onRoad;\n }\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n Car.prototype.createLidar = function (lidarOptions) {\n lidarOptions.pts = lidarOptions.pts || 5;\n lidarOptions.width = lidarOptions.width || 4;\n lidarOptions.height = lidarOptions.height || 5;\n lidarOptions.pos = lidarOptions.pos || 0;\n this.lidar = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Container\"]();\n this.lidar.lidarPts = [];\n this.lidar.collisionPts = [];\n var area = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n area.pt = false;\n area.alpha = 0.3;\n area.beginFill(0x515151);\n area.drawRect(0, 0, this.core.width * lidarOptions.width, this.core.height * lidarOptions.height);\n area.endFill();\n var front = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n front.pt = false;\n front.alpha = 0;\n front.beginFill(0x510000);\n front.drawRect(this.core.width - 5, area.height / 2, 3, 3);\n front.endFill();\n var back = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n back.pt = false;\n back.alpha = 0;\n back.beginFill(0x510000);\n back.drawRect(-1, area.height / 2 - 2, 3, 3);\n back.endFill();\n var left = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n left.pt = false;\n left.alpha = 0;\n left.beginFill(0x510000);\n left.drawRect(this.core.width / 2, area.height / 2 - this.core.height / 2 + 5, 3, 3);\n left.endFill();\n var right = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n right.pt = false;\n right.alpha = 0;\n right.beginFill(0x510000);\n right.drawRect(this.core.width / 2, area.height / 2 + this.core.height / 2 - 8, 3, 3);\n right.endFill();\n back.x -= (lidarOptions.pos * this.core.width);\n front.x -= (lidarOptions.pos * this.core.width);\n right.x -= (lidarOptions.pos * this.core.width);\n left.x -= (lidarOptions.pos * this.core.width);\n var x_step = area.width / lidarOptions.pts;\n var y_step = area.height / lidarOptions.pts;\n for (var xs = lidarOptions.pts - 1; xs >= 0; xs--) {\n for (var ys = 0; ys < lidarOptions.pts; ys++) {\n var x = (x_step / 4) + xs * x_step;\n var y = (y_step / 4) + ys * y_step;\n var pt = new _global__WEBPACK_IMPORTED_MODULE_0__[\"Graphics\"]();\n pt.pt = true;\n pt.beginFill(0xffffff);\n pt.drawRect(x, y, 5, 5);\n pt.endFill();\n this.lidar.addChild(pt);\n this.lidar.lidarPts.push(pt);\n }\n }\n this.lidar.pts = lidarOptions.pts;\n this.lidar.addChild(area);\n this.lidar.addChild(front);\n this.lidar.addChild(back);\n this.lidar.addChild(left);\n this.lidar.addChild(right);\n this.lidar.collisionPts.push(front);\n this.lidar.collisionPts.push(back);\n this.lidar.collisionPts.push(left);\n this.lidar.collisionPts.push(right);\n this.lidar.x = this.core.x;\n this.lidar.y = this.core.y;\n this.lidar.pivot.y = this.lidar.height / 2;\n this.lidar.pivot.x = this.core.width / 2 - (lidarOptions.pos * this.core.width);\n this.lidar.rotation = this.core.rotation;\n };\n return Car;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/car.ts?"); - -/***/ }), - -/***/ "./src/control_motion_engine.ts": -/*!**************************************!*\ - !*** ./src/control_motion_engine.ts ***! - \**************************************/ -/*! exports provided: ControlMotionEngine */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ControlMotionEngine\", function() { return ControlMotionEngine; });\n/* harmony import */ var _motion_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./motion_engine */ \"./src/motion_engine.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/utils.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar ControlMotionEngine = (function (_super) {\n __extends(ControlMotionEngine, _super);\n function ControlMotionEngine(level) {\n var _this = _super.call(this, level) || this;\n _this.level = level;\n _this.actions = [\"SteeringAngle\", \"Throttle\"];\n return _this;\n }\n ControlMotionEngine.prototype.setUp = function (car, lidar) {\n this.car = car;\n this.lidar = lidar;\n this.state = [];\n for (var y = 0; y < lidar.pts; y++) {\n var line = [];\n for (var x = 0; x < lidar.pts; x++) {\n line.push(_global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].DEFAULT);\n }\n this.state.push(line);\n }\n this.setUpKeyboard();\n this.car.v = 0;\n this.car.a = 0;\n this.car.yaw_rate = 0;\n this.detectInteractions();\n };\n ControlMotionEngine.prototype.setUpKeyboard = function () {\n var _this = this;\n var left = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](37);\n var up = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](38);\n var right = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](39);\n var down = _utils__WEBPACK_IMPORTED_MODULE_2__[\"keyboard\"](40);\n left.press = function () {\n _this.turn(-0.5);\n };\n left.release = function () {\n _this.turn(0);\n };\n right.press = function () {\n _this.turn(0.5);\n };\n right.release = function () {\n _this.turn(0);\n };\n up.press = function () { _this.move(1); };\n up.release = function () {\n _this.car.a = 0;\n };\n down.press = function () { _this.move(-1); };\n down.release = function () {\n _this.car.a = 0;\n };\n };\n ControlMotionEngine.prototype.turn = function (value) {\n this.car.yaw_rate = value;\n };\n ControlMotionEngine.prototype.move = function (throttle) {\n this.car.a = throttle;\n };\n ControlMotionEngine.prototype.actionStep = function (delta, actions) {\n this.car.a = Math.min(Math.max(parseInt(actions[0].toString()), -1), 1);\n this.car.yaw_rate = Math.min(Math.max(parseInt(actions[1].toString()), -1), 1);\n var _a = this.step(delta), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n this.car.a = 0;\n this.car.yaw_rate = 0;\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n ControlMotionEngine.prototype.actionSpace = function () {\n return Array.apply(null, { length: this.actions.length }).map(Number.call, Number);\n };\n ControlMotionEngine.prototype.step = function (delta) {\n if (this.car.v > 0)\n this.car.v = Math.max(0, this.car.v - 0.01);\n else if (this.car.v < 0)\n this.car.v = Math.min(0, this.car.v + 0.01);\n if (this.car.a > 0)\n this.car.v = Math.min(2., this.car.v + this.car.a * 0.02);\n else\n this.car.v = Math.max(-2., this.car.v + this.car.a * 0.02);\n if (this.car.yaw_rate == 0) {\n this.car.x += this.car.v * Math.cos(this.car.rotation) * delta;\n this.car.y += this.car.v * Math.sin(this.car.rotation) * delta;\n }\n else {\n var yr = this.car.yaw_rate * 0.01 * (this.car.v + 0.001) * Math.PI;\n this.car.x += (this.car.v / yr) * (Math.sin(this.car.rotation + (yr * delta)) - Math.sin(this.car.rotation));\n this.car.y += (this.car.v / yr) * (Math.cos(this.car.rotation) - Math.cos(this.car.rotation + (yr * delta)));\n this.car.rotation += yr * delta;\n }\n this.car.mx = Math.floor(this.car.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.my = Math.floor(this.car.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n this.car.checkAndsetNewRoad();\n this.lidar.x = this.car.x;\n this.lidar.y = this.car.y;\n this.lidar.rotation = this.car.rotation;\n var _a = this.detectInteractions(), agentCollisions = _a.agentCollisions, onRoad = _a.onRoad;\n if (agentCollisions.length > 0) {\n this.car.v = 0;\n this.car.vy = 0;\n }\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n return ControlMotionEngine;\n}(_motion_engine__WEBPACK_IMPORTED_MODULE_0__[\"MotionEngine\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/control_motion_engine.ts?"); - -/***/ }), - -/***/ "./src/editor.ts": -/*!***********************!*\ - !*** ./src/editor.ts ***! - \***********************/ -/*! exports provided: Editor */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Editor\", function() { return Editor; });\n/* harmony import */ var _asset_manager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./asset_manager */ \"./src/asset_manager.ts\");\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n/* harmony import */ var _world__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./world */ \"./src/world.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar Editor = (function (_super) {\n __extends(Editor, _super);\n function Editor(levelContent, canvasId) {\n var _this = _super.call(this, levelContent, canvasId) || this;\n _this.selectedItems = null;\n _this.am = new _asset_manager__WEBPACK_IMPORTED_MODULE_0__[\"AssetManger\"](_this);\n return _this;\n }\n Editor.prototype._setEvents = function () {\n };\n Editor.prototype._setup = function (info) {\n var _this = this;\n this._setEvents();\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n this.am.createMap(this.map, info, textures, false);\n this.am.createCars(this.map, info, textures);\n if (info.agent)\n this.agent = this.am.createAgent(this.map, info, textures, false);\n var that = this;\n for (var i = 0; i < this.envs.length; i++) {\n this.envs[i].interactive = true;\n this.envs[i].on(\"rightclick\", function () { that.removeItem(this); });\n }\n for (var i = 0; i < this.am.assets.length; i++) {\n this.am.assets[i].interactive = true;\n this.am.assets[i].on(\"rightclick\", function () { that.removeItem(this); });\n }\n this.app.ticker.add(function (delta) { return _this.loop(delta); });\n };\n Editor.prototype.resize = function (width, height) {\n this.app.renderer.resize(width * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"], height * _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]);\n };\n Editor.prototype.getSelectedItems = function () {\n return this.selectedItems;\n };\n Editor.prototype.selectedItem = function (item) {\n if (this.selectedItems) {\n this.app.stage.removeChild(this.selectedItems);\n }\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n this.selectedItems = new _global__WEBPACK_IMPORTED_MODULE_1__[\"Sprite\"](textures[item.image]);\n this.selectedItems.type = item.type;\n this.selectedItems.image = item.image;\n this.selectedItems.data = item.data;\n this.selectedItems.x = 0;\n this.selectedItems.y = 0;\n this.app.stage.addChild(this.selectedItems);\n };\n Editor.prototype.removeItem = function (item) {\n if (item.lidar) {\n this.app.stage.removeChild(item.lidar);\n }\n if (item.mapId == _global__WEBPACK_IMPORTED_MODULE_1__[\"MAP\"].CAR) {\n if (item.road)\n item.road.cars.splice(item.road.cars.indexOf(item.carId), 1);\n }\n if (item.agent)\n this.agent = undefined;\n this.app.stage.removeChild(item);\n item.isremove = true;\n };\n Editor.prototype.exportMap = function (width, height, file_name, download) {\n return this.am.exportMap(width, height, file_name, download);\n };\n Editor.prototype.setCurrentItem = function () {\n this.am.addAsset(this.selectedItems);\n var textures = _global__WEBPACK_IMPORTED_MODULE_1__[\"Loader\"].resources[_global__WEBPACK_IMPORTED_MODULE_1__[\"JSON_TEXTURES\"]].textures;\n var that = this;\n if (this.selectedItems.type == \"road\") {\n this.am.createRoad({\n mx: Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n my: Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n type: this.selectedItems.data\n }, textures, this.selectedItems.data);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"car\") {\n this.am.createCars(this.map, { cars: [{\n \"mx\": Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"my\": Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"rotation\": 0,\n \"line\": 0,\n }] }, textures);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"agent\" && this.agent == undefined) {\n this.agent = this.am.createAgent(this.map, { agent: {\n \"mx\": Math.floor(this.selectedItems.x / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"my\": Math.floor(this.selectedItems.y / _global__WEBPACK_IMPORTED_MODULE_1__[\"ROADSIZE\"]),\n \"rotation\": 0,\n \"line\": 0,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotation_step\": 0.5,\n \"actions\": [\"UP\", \"LEFT\", \"RIGHT\", \"DOWN\", \"WAIT\"]\n }\n }\n } }, textures);\n this.envs[this.envs.length - 1].interactive = true;\n this.envs[this.envs.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n else if (this.selectedItems.type == \"asset\") {\n this.am.createAsset(this.selectedItems.image, { x: this.selectedItems.x, y: this.selectedItems.y }, textures, this.selectedItems.data);\n this.am.assets[this.am.assets.length - 1].interactive = true;\n this.am.assets[this.am.assets.length - 1].on(\"rightclick\", function () { that.removeItem(this); });\n }\n this.app.stage.removeChild(this.selectedItems);\n this.selectedItems = null;\n };\n return Editor;\n}(_world__WEBPACK_IMPORTED_MODULE_2__[\"World\"]));\n\n\n\n//# sourceURL=webpack://metacar/./src/editor.ts?"); - -/***/ }), - -/***/ "./src/embedded.ts": -/*!*************************!*\ - !*** ./src/embedded.ts ***! - \*************************/ -/*! exports provided: embeddedUrl, embeddedContent */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"embeddedUrl\", function() { return embeddedUrl; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"embeddedContent\", function() { return embeddedContent; });\n/* harmony import */ var _embedded_level_full_city__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./embedded/level/full_city */ \"./src/embedded/level/full_city.ts\");\n/* harmony import */ var _embedded_level_level_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./embedded/level/level_1 */ \"./src/embedded/level/level_1.ts\");\n/* harmony import */ var _embedded_level_level_0__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./embedded/level/level_0 */ \"./src/embedded/level/level_0.ts\");\n\n\n\n;\nvar embeddedUrl = {\n fullCity: \"embedded://level/fullCity\",\n level1: \"embedded://level/level1\",\n level0: \"embedded://level/level0\"\n};\nvar embeddedContent = {\n level: {\n fullCity: _embedded_level_full_city__WEBPACK_IMPORTED_MODULE_0__[\"fullCity\"],\n level1: _embedded_level_level_1__WEBPACK_IMPORTED_MODULE_1__[\"level1\"],\n level0: _embedded_level_level_0__WEBPACK_IMPORTED_MODULE_2__[\"level0\"]\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded.ts?"); - -/***/ }), - -/***/ "./src/embedded/level/full_city.ts": -/*!*****************************************!*\ - !*** ./src/embedded/level/full_city.ts ***! - \*****************************************/ -/*! exports provided: fullCity */ -/***/ (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?"); - -/***/ }), - -/***/ "./src/embedded/level/level_0.ts": -/*!***************************************!*\ - !*** ./src/embedded/level/level_0.ts ***! - \***************************************/ -/*! exports provided: level0 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"level0\", function() { return level0; });\nvar level0 = {\n \"cars\": [],\n \"house\": [\n {\n \"x\": 263,\n \"y\": 108\n },\n {\n \"x\": 112,\n \"y\": 258\n }\n ],\n \"house3\": [\n {\n \"x\": 262,\n \"y\": 16\n }\n ],\n \"bench\": [\n {\n \"x\": 135,\n \"y\": 34\n }\n ],\n \"tree\": [\n {\n \"x\": 124,\n \"y\": 134\n },\n {\n \"x\": 7,\n \"y\": 11\n },\n {\n \"x\": 69,\n \"y\": 10\n },\n {\n \"x\": 19,\n \"y\": 238\n },\n {\n \"x\": 5,\n \"y\": 133\n },\n {\n \"x\": 260,\n \"y\": 211\n }\n ],\n \"map\": [\n [\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n \"↱\",\n \"↔\",\n \"↰\",\n 0\n ],\n [\n 0,\n \"↕\",\n 0,\n \"↕\",\n 0\n ],\n [\n 0,\n \"↳\",\n \"↠\",\n \"↲\",\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ],\n \"agent\": {\n \"mx\": 2,\n \"my\": 1,\n \"line\": 1,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotationStep\": 0.5,\n \"actions\": [\n \"UP\",\n \"LEFT\",\n \"RIGHT\",\n \"DOWN\",\n \"WAIT\"\n ]\n }\n }\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded/level/level_0.ts?"); - -/***/ }), - -/***/ "./src/embedded/level/level_1.ts": -/*!***************************************!*\ - !*** ./src/embedded/level/level_1.ts ***! - \***************************************/ -/*! exports provided: level1 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"level1\", function() { return level1; });\nvar level1 = {\n \"cars\": [\n {\n \"mx\": 5,\n \"my\": 3,\n \"line\": 0,\n \"auto\": true\n },\n {\n \"mx\": 5,\n \"my\": 3,\n \"line\": 1,\n \"auto\": true\n },\n {\n \"mx\": 5,\n \"my\": 1,\n \"line\": 0,\n \"auto\": true\n }\n ],\n \"tree\": [\n {\n \"x\": 120,\n \"y\": 50\n },\n {\n \"x\": 86.5,\n \"y\": 85\n },\n {\n \"x\": 94.5,\n \"y\": 135\n },\n {\n \"x\": 30.5,\n \"y\": 128\n },\n {\n \"x\": 72.5,\n \"y\": 190\n },\n {\n \"x\": 23.5,\n \"y\": 232\n },\n {\n \"x\": 110.5,\n \"y\": 242\n },\n {\n \"x\": 43.5,\n \"y\": 33\n },\n {\n \"x\": 18.5,\n \"y\": 178\n },\n {\n \"x\": 305.5,\n \"y\": 125\n },\n {\n \"x\": 360.5,\n \"y\": 122\n }\n ],\n \"asset\": [\n {\n \"x\": 252.5,\n \"y\": 142\n },\n {\n \"x\": 86.5,\n \"y\": 85\n },\n {\n \"x\": 94.5,\n \"y\": 135\n },\n {\n \"x\": 30.5,\n \"y\": 128\n },\n {\n \"x\": 252.5,\n \"y\": 26\n },\n {\n \"x\": 195.5,\n \"y\": 0\n },\n {\n \"x\": 307.5,\n \"y\": 1\n },\n {\n \"x\": 72.5,\n \"y\": 190\n },\n {\n \"x\": 23.5,\n \"y\": 232\n },\n {\n \"x\": 110.5,\n \"y\": 242\n },\n {\n \"x\": 43.5,\n \"y\": 33\n },\n {\n \"x\": 35.5,\n \"y\": 185\n },\n {\n \"x\": 18.5,\n \"y\": 178\n },\n {\n \"x\": 289.5,\n \"y\": 126\n },\n {\n \"x\": 337.5,\n \"y\": 126\n },\n {\n \"x\": 305.5,\n \"y\": 125\n },\n {\n \"x\": 360.5,\n \"y\": 122\n },\n {\n \"x\": 492.5,\n \"y\": 56\n },\n {\n \"x\": 503.5,\n \"y\": 136\n },\n {\n \"x\": 504.5,\n \"y\": 58\n }\n ],\n \"bench\": [\n {\n \"x\": 252.5,\n \"y\": 142\n },\n {\n \"x\": 252.5,\n \"y\": 26\n }\n ],\n \"road\": [\n {\n \"x\": 240,\n \"y\": 60\n },\n {\n \"x\": 240,\n \"y\": 60\n },\n {\n \"x\": 480,\n \"y\": 0\n },\n {\n \"x\": 480,\n \"y\": 60\n },\n {\n \"x\": 480,\n \"y\": 120\n },\n {\n \"x\": 480,\n \"y\": 180\n },\n {\n \"x\": 480,\n \"y\": 240\n },\n {\n \"x\": 300,\n \"y\": 180\n },\n {\n \"x\": 300,\n \"y\": 180\n },\n {\n \"x\": 360,\n \"y\": 180\n },\n {\n \"x\": 420,\n \"y\": 180\n },\n {\n \"x\": 420,\n \"y\": 120\n },\n {\n \"x\": 420,\n \"y\": 60\n },\n {\n \"x\": 360,\n \"y\": 60\n },\n {\n \"x\": 300,\n \"y\": 60\n },\n {\n \"x\": 420,\n \"y\": 120\n }\n ],\n \"house3\": [\n {\n \"x\": 503.5,\n \"y\": 136\n }\n ],\n \"house\": [\n {\n \"x\": 504.5,\n \"y\": 58\n }\n ],\n \"map\": [\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n \"↱\",\n \"↠\",\n \"↔\",\n \"↔\",\n \"↰\",\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n \"↕\",\n 0,\n 0,\n 0,\n \"↟\",\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n \"↳\",\n \"↔\",\n \"↔\",\n \"↔\",\n \"↲\",\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ],\n \"agent\": {\n \"mx\": 4,\n \"my\": 3,\n \"line\": 0,\n \"motion\": {\n \"type\": \"BasicMotionEngine\",\n \"options\": {\n \"rotationStep\": 0.5,\n \"actions\": [\n \"UP\",\n \"LEFT\",\n \"RIGHT\"\n ]\n }\n }\n }\n};\n\n\n//# sourceURL=webpack://metacar/./src/embedded/level/level_1.ts?"); - -/***/ }), - -/***/ "./src/global.ts": -/*!***********************!*\ - !*** ./src/global.ts ***! - \***********************/ -/*! exports provided: Application, Loader, Resources, Sprite, Graphics, Container, URL, JSON_TEXTURES, JSON_IMAGE, IMAGE_FOLDER, ROADSIZE, CAR_IMG, MAP, ASSETS */ -/***/ (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 = \"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?"); - -/***/ }), - -/***/ "./src/index.ts": -/*!**********************!*\ - !*** ./src/index.ts ***! - \**********************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _metacar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./metacar */ \"./src/metacar.ts\");\n/* harmony import */ var _embedded__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./embedded */ \"./src/embedded.ts\");\n/* harmony import */ var _metacar_editor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./metacar_editor */ \"./src/metacar_editor.ts\");\n/* harmony import */ var _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./basic_motion_engine */ \"./src/basic_motion_engine.ts\");\n/* harmony import */ var _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./control_motion_engine */ \"./src/control_motion_engine.ts\");\n\n\n\n\n\nvar metacar = {\n env: _metacar__WEBPACK_IMPORTED_MODULE_0__[\"MetaCar\"],\n editor: _metacar_editor__WEBPACK_IMPORTED_MODULE_2__[\"MetaCarEditor\"],\n level: _embedded__WEBPACK_IMPORTED_MODULE_1__[\"embeddedUrl\"],\n motion: {\n BasicMotion: _basic_motion_engine__WEBPACK_IMPORTED_MODULE_3__[\"BasicMotionEngine\"],\n ControlMotion: _control_motion_engine__WEBPACK_IMPORTED_MODULE_4__[\"ControlMotionEngine\"]\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (metacar);\n\n\n//# sourceURL=webpack://metacar/./src/index.ts?"); - -/***/ }), - -/***/ "./src/level.ts": -/*!**********************!*\ - !*** ./src/level.ts ***! - \**********************/ -/*! exports provided: Level */ -/***/ (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.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?"); - -/***/ }), - -/***/ "./src/metacar.ts": -/*!************************!*\ - !*** ./src/metacar.ts ***! - \************************/ -/*! exports provided: MetaCar */ -/***/ (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.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?"); - -/***/ }), - -/***/ "./src/metacar_editor.ts": -/*!*******************************!*\ - !*** ./src/metacar_editor.ts ***! - \*******************************/ -/*! exports provided: MetaCarEditor */ -/***/ (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.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?"); - -/***/ }), - -/***/ "./src/motion_engine.ts": -/*!******************************!*\ - !*** ./src/motion_engine.ts ***! - \******************************/ -/*! exports provided: MotionEngine */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MotionEngine\", function() { return MotionEngine; });\n/* harmony import */ var _global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global */ \"./src/global.ts\");\n\nvar MotionEngine = (function () {\n function MotionEngine(level) {\n this.level = level;\n }\n MotionEngine.prototype.boxesIntersect = function (a, b, reduce) {\n var ab = a.getBounds();\n var bb = b.getBounds();\n return ab.x + ab.width > bb.x && ab.x < bb.x + bb.width && ab.y + ab.height > bb.y && ab.y < bb.y + bb.height;\n };\n MotionEngine.prototype.carIntersect = function (car1, object) {\n var nb = this.car.lidar.collisionPts.length;\n for (var c = 0; c < nb; c++) {\n if (this.boxesIntersect(this.car.lidar.collisionPts[c], object, false)) {\n return true;\n }\n }\n return false;\n };\n MotionEngine.prototype.carCaptorInObject = function (car1, object) {\n var size = this.car.lidar.collisionPts.length;\n var nb = 0;\n for (var c = 0; c < size; c++) {\n if (this.boxesIntersect(this.car.lidar.collisionPts[c], object, false)) {\n nb += 1;\n }\n }\n return nb;\n };\n MotionEngine.prototype.detectInteractions = function (all) {\n if (all === void 0) { all = true; }\n var envs = this.level.getEnvs();\n var agentCollisions = [];\n var lidar_collisions = [];\n var onRoadCnt = 0;\n var checkNb = 0;\n var onRoad = false;\n for (var i = 0; i < envs.length; i++) {\n if (envs[i] != this.car && Math.abs(envs[i].mx - this.car.mx) < 2 && Math.abs(envs[i].my - this.car.my) < 2) {\n checkNb += 1;\n if (all && envs[i].obstacle && this.carIntersect(this.car, envs[i])) {\n agentCollisions.push(envs[i]);\n }\n else if (all && envs[i].mapId == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].ROAD) {\n onRoadCnt += this.carCaptorInObject(this.car, envs[i]);\n }\n if (this.boxesIntersect(envs[i], this.lidar, false)) {\n lidar_collisions.push(envs[i]);\n }\n }\n }\n this.setState(lidar_collisions);\n if (onRoadCnt >= 4 || !all) {\n onRoad = true;\n }\n return { agentCollisions: agentCollisions, onRoad: onRoad };\n };\n MotionEngine.prototype.setState = function (lidar_collisions) {\n var pt_id = 0;\n for (var i = 0; i < this.lidar.lidarPts.length; i++) {\n this.lidar.lidarPts[i].alpha = 0.3;\n var pt_y = Math.floor(pt_id / this.lidar.pts);\n var pt_x = Math.floor(pt_id % this.lidar.pts);\n this.state[pt_y][pt_x] = _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].DEFAULT;\n for (var a = 0; a < lidar_collisions.length; a++) {\n if (lidar_collisions[a] != this.car) {\n var touch = this.boxesIntersect(lidar_collisions[a], this.lidar.lidarPts[i], false);\n if (touch && lidar_collisions[a].obstacle) {\n this.lidar.lidarPts[i].alpha = 1.;\n }\n if (touch && (lidar_collisions[a].mapId > this.state[pt_y][pt_x] || (lidar_collisions[a].mapId == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].ROAD && this.state[pt_y][pt_x] == _global__WEBPACK_IMPORTED_MODULE_0__[\"MAP\"].DEFAULT))) {\n this.state[pt_y][pt_x] = lidar_collisions[a].mapId;\n }\n }\n }\n pt_id += 1;\n }\n };\n return MotionEngine;\n}());\n\n;\n\n\n//# sourceURL=webpack://metacar/./src/motion_engine.ts?"); - -/***/ }), - -/***/ "./src/ui_event.ts": -/*!*************************!*\ - !*** ./src/ui_event.ts ***! - \*************************/ -/*! exports provided: UIEvent */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"UIEvent\", function() { return UIEvent; });\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\n\nvar UIEvent = (function () {\n function UIEvent(level, canvasId) {\n this.selectedItems = false;\n this.level = level;\n this.canvasId = canvasId;\n var canvas = document.getElementById(canvasId);\n var buttons = document.createElement('div');\n buttons.classList.add(\"metacar_buttons_container\");\n buttons.id = \"metacar_\" + canvasId + \"_buttons_container\";\n canvas.parentNode.insertBefore(buttons, canvas.nextSibling);\n this.buttonsContainer = buttons;\n }\n UIEvent.prototype.isPlaying = function () {\n return this.playing;\n };\n UIEvent.prototype.getEditorSize = function () {\n return { width: this.editorWidth, height: this.editorHeight };\n };\n UIEvent.prototype._createButton = function (parent, name) {\n var button = document.createElement('button');\n button.classList.add(\"metacar_button_train\");\n button.id = \"metacar_\" + this.canvasId + \"_button_\" + name;\n name = name.replace(/_/g, \" \");\n button.innerHTML = name.charAt(0).toUpperCase() + name.slice(1);\n ;\n parent.appendChild(button);\n return button;\n };\n UIEvent.prototype.onTrain = function (fc) {\n var _this = this;\n var button = this._createButton(this.buttonsContainer, \"train\");\n button.addEventListener(\"click\", function () {\n _this.level.render(false);\n if (fc)\n fc();\n });\n };\n UIEvent.prototype.onPlay = function (fc) {\n var _this = this;\n var button = this._createButton(this.buttonsContainer, \"play\");\n button.addEventListener(\"click\", function () {\n if (fc) {\n _this.playing = true;\n _this.playCallback = fc;\n }\n });\n };\n UIEvent.prototype.onStop = function (fc) {\n var _this = this;\n var button = this._createButton(this.buttonsContainer, \"stop\");\n button.addEventListener(\"click\", function () {\n _this.playing = false;\n _this.playCallback = undefined;\n if (fc)\n fc();\n });\n };\n UIEvent.prototype.onResetEnv = function (fc) {\n var _this = this;\n var button = this._createButton(this.buttonsContainer, \"reset_env\");\n button.addEventListener(\"click\", function () {\n _this.level.reset();\n if (fc)\n fc();\n });\n };\n UIEvent.prototype.onCustomEvent = function (name, fc) {\n var button = this._createButton(this.buttonsContainer, name);\n button.addEventListener(\"click\", function () {\n if (fc)\n fc();\n });\n };\n UIEvent.prototype.onSaveEditor = function (fc, options) {\n var _this = this;\n var button = this._createButton(this.buttonsContainer, \"save\");\n button.addEventListener(\"click\", function () {\n var size = _this.getEditorSize();\n var content = _this.level.exportMap(size.width, size.height, options.name, options.download);\n if (fc)\n fc(content);\n });\n };\n UIEvent.prototype.onLoad = function (fc, options) {\n if (options === void 0) { options = Object(); }\n options.local = options.local || false;\n var button = this._createButton(this.buttonsContainer, \"load_trained_agent\");\n var input_file = document.createElement('input');\n input_file.type = \"file\";\n input_file.accept = \"*/*\";\n input_file.style.display = \"none\";\n input_file.classList.add(\"metacar_button_input_file\");\n input_file.id = \"metacar_\" + this.canvasId + \"_button_input_file\";\n this.buttonsContainer.appendChild(input_file);\n input_file.addEventListener(\"change\", function (dump) {\n _utils__WEBPACK_IMPORTED_MODULE_0__[\"readDump\"](dump, function (content) {\n if (fc)\n fc(content);\n });\n });\n button.addEventListener(\"click\", function () {\n if (options.local) {\n input_file.click();\n }\n else {\n if (fc)\n fc();\n }\n });\n };\n UIEvent.prototype._createRangeBar = function (name) {\n var inputProgress = document.createElement('input');\n inputProgress.type = \"range\";\n inputProgress.min = \"5\";\n inputProgress.max = \"15\";\n inputProgress.value = \"5\";\n inputProgress.classList.add(\"metacar_\" + name + \"_input\");\n inputProgress.id = \"metacar_\" + this.canvasId + \"_\" + name + \"_input\";\n return inputProgress;\n };\n UIEvent.prototype._createSpan = function (name, text) {\n var span = document.createElement('span');\n span.classList.add(\"metacar_\" + name + \"_span\");\n span.id = \"metacar_\" + this.canvasId + \"_\" + name + \"_span\";\n span.innerHTML = text;\n return span;\n };\n UIEvent.prototype._createImage = function (name, src) {\n var img = document.createElement('img');\n img.classList.add(\"metacar_img\");\n img.id = \"metacar_\" + this.canvasId + \"_\" + name + \"_img\";\n img.src = src;\n return img;\n };\n UIEvent.prototype._listenRangeChanges = function (widthInput, heightInput) {\n var _this = this;\n widthInput.onchange = function () {\n var width = parseInt((widthInput).value);\n var height = parseInt((heightInput).value);\n _this.level.resize(width, height);\n _this.editorWidth = width;\n _this.editorHeight = height;\n };\n heightInput.onchange = function () {\n var width = parseInt((widthInput).value);\n var height = parseInt((heightInput).value);\n _this.level.resize(width, height);\n _this.editorWidth = width;\n _this.editorHeight = height;\n };\n };\n UIEvent.prototype._listenCanvasEditor = function () {\n var _this = this;\n document.getElementById(this.canvasId).addEventListener('contextmenu', function (event) { return event.preventDefault(); });\n document.getElementById(this.canvasId).addEventListener(\"click\", function () {\n var selectedItem = _this.level.getSelectedItems();\n if (selectedItem) {\n _this.level.setCurrentItem();\n }\n });\n };\n UIEvent.prototype._listenEditorImgs = function () {\n var classname = document.getElementsByClassName(\"metacar_img\");\n var that = this;\n for (var i = 0; i < classname.length; i++) {\n classname[i].addEventListener('click', function () {\n that.level.selectedItem({\n image: this.getAttribute('data-img'),\n type: this.getAttribute('data-type'),\n data: this.getAttribute(\"data-data\")\n });\n }, false);\n }\n };\n UIEvent.prototype.createEditorElementsEvents = function () {\n var widthText = this._createSpan(\"width\", \"Width\");\n var widthProgress = this._createRangeBar(\"width\");\n var heightText = this._createSpan(\"height\", \"Height\");\n var heightProgress = this._createRangeBar(\"height\");\n this.buttonsContainer.appendChild(widthText);\n this.buttonsContainer.appendChild(widthProgress);\n this.buttonsContainer.appendChild(heightText);\n this.buttonsContainer.appendChild(heightProgress);\n this._listenRangeChanges(widthProgress, heightProgress);\n this._listenCanvasEditor();\n var map = this.level.getMap();\n var width = map[0].length;\n var height = map.length;\n widthProgress.value = width.toString();\n heightProgress.value = height.toString();\n this.editorWidth = width;\n this.editorHeight = height;\n var agentImg = this._createImage(\"car_agent\", _global__WEBPACK_IMPORTED_MODULE_1__[\"IMAGE_FOLDER\"] + \"car_agent.png\");\n agentImg.dataset.type = \"agent\";\n agentImg.dataset.img = \"car_agent.png\";\n this.buttonsContainer.appendChild(agentImg);\n var carImg = this._createImage(\"car_agent\", _global__WEBPACK_IMPORTED_MODULE_1__[\"IMAGE_FOLDER\"] + \"car.png\");\n carImg.dataset.type = \"car\";\n carImg.dataset.img = \"car.png\";\n this.buttonsContainer.appendChild(carImg);\n var roads = _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"][\"ROADS\"];\n for (var arrow in roads) {\n var nImg = this._createImage(roads[arrow].image.replace(\".png\", \"\"), _global__WEBPACK_IMPORTED_MODULE_1__[\"IMAGE_FOLDER\"] + roads[arrow].image);\n nImg.dataset.type = \"road\";\n nImg.dataset.img = roads[arrow].image;\n nImg.dataset.data = arrow;\n this.buttonsContainer.appendChild(nImg);\n }\n for (var key in _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"]) {\n if (key != \"ROADS\") {\n var nImg = this._createImage(key, _global__WEBPACK_IMPORTED_MODULE_1__[\"IMAGE_FOLDER\"] + _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"][key].image);\n nImg.dataset.img = _global__WEBPACK_IMPORTED_MODULE_1__[\"ASSETS\"][key].image;\n nImg.dataset.data = key;\n nImg.dataset.type = \"asset\";\n this.buttonsContainer.appendChild(nImg);\n }\n }\n this._listenEditorImgs();\n };\n return UIEvent;\n}());\n\n\n\n//# sourceURL=webpack://metacar/./src/ui_event.ts?"); - -/***/ }), - -/***/ "./src/utils.ts": -/*!**********************!*\ - !*** ./src/utils.ts ***! - \**********************/ -/*! exports provided: loadJSON, loadEmbeddedURL, loadLocalStorageURL, loadCustomURL, mod, argMax, mean, saveAs, readDump, shuffleArray, keyboard */ -/***/ (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(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?"); - -/***/ }), - -/***/ "./src/world.ts": -/*!**********************!*\ - !*** ./src/world.ts ***! - \**********************/ -/*! exports provided: World */ -/***/ (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\"]], { 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?"); - -/***/ }), - -/***/ "pixi.js": -/*!***********************!*\ - !*** external "PIXI" ***! - \***********************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("(function() { module.exports = window[\"PIXI\"]; }());\n\n//# sourceURL=webpack://metacar/external_%22PIXI%22?"); - -/***/ }) - -/******/ })["default"]; \ No newline at end of file +window.metacar=function(t){var e={};function i(o){if(e[o])return e[o].exports;var n=e[o]={i:o,l:!1,exports:{}};return t[o].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=t,i.c=e,i.d=function(t,e,o){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:o})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(i.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)i.d(o,n,function(e){return t[e]}.bind(null,n));return o},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=1)}([function(t,e){t.exports=window.PIXI},function(t,e,i){"use strict";i.r(e);var o=i(0),n=(o.Application,o.loader),a=(o.loader.resources,o.Sprite),r=o.Graphics,s=o.Container,h="https://metacar-project.com/",c=h+"public/textures/textures.json",l=h+"public/images/",d=60,p={DEFAULT:"car.png",AGENT:"car_agent.png"},u={ROAD:-1,DEFAULT:0,CAR:1,AGENT:1},v={ROADS:{"↕":{image:"road_u.png",orientation:1.5},"↔":{image:"road_r.png",orientation:0},"↱":{image:"road_rotate_ld.png",orientation:1.25},"↰":{image:"road_rotate_ul.png",orientation:.75},"↲":{image:"road_rotate_rl.png",orientation:.25},"↳":{image:"road_rotate_dl.png",orientation:1.75},"↟":{image:"road_up.png",orientation:1.5},"↠":{image:"road_rp.png",orientation:0},"↤":{image:"road_r2.png",orientation:0},"↦":{image:"road_l2.png",orientation:1},"↥":{image:"road_d2.png",orientation:.5},"↧":{image:"road_u2.png",orientation:1.5}},house:{image:"house.png"},house2:{image:"house2.png"},house3:{image:"house3.png"},bench:{image:"bench.png"},tree:{image:"tree.png"}},y={level:{fullCity:{cars:[{mx:2,my:5,line:0,auto:!0},{mx:3,my:4,line:0,auto:!0},{mx:3,my:4,line:1,auto:!0},{mx:6,my:3,line:0,auto:!0},{mx:6,my:3,line:1,auto:!0},{mx:8,my:2,line:0,auto:!0},{mx:8,my:2,line:1,auto:!0},{mx:2,my:7,line:0,auto:!0}],house:[{x:9,y:409},{x:146,y:162},{x:439,y:39}],house2:[{x:425,y:192},{x:431,y:354}],house3:[{x:426,y:281},{x:51,y:157},{x:553,y:34}],bench:[{x:259,y:206},{x:8,y:205}],tree:[{x:1,y:303},{x:54,y:357},{x:215,y:325},{x:230,y:400},{x:282,y:368},{x:182,y:433},{x:285,y:309},{x:576,y:233},{x:581,y:300},{x:519,y:388},{x:582,y:391},{x:256,y:69},{x:151,y:43},{x:77,y:77},{x:26,y:24},{x:189,y:98}],map:[[0,0,0,0,0,0,"↕",0,0,0,0],[0,0,0,0,0,0,"↟",0,0,0,0],[0,0,0,0,0,0,"↦","↔","↔","↠","↔"],[0,0,0,0,0,0,"↕",0,0,0,0],["↔","↔","↧","↔","↠","↔","↤",0,0,0,0],[0,0,"↕",0,0,0,"↕",0,0,0,0],[0,0,"↟",0,0,0,"↟",0,0,0,0],[0,0,"↕",0,0,0,"↕",0,0,0,0]]},level1:{cars:[{mx:5,my:3,line:0,auto:!0},{mx:5,my:3,line:1,auto:!0},{mx:5,my:1,line:0,auto:!0}],tree:[{x:120,y:50},{x:86.5,y:85},{x:94.5,y:135},{x:30.5,y:128},{x:72.5,y:190},{x:23.5,y:232},{x:110.5,y:242},{x:43.5,y:33},{x:18.5,y:178},{x:305.5,y:125},{x:360.5,y:122}],asset:[{x:252.5,y:142},{x:86.5,y:85},{x:94.5,y:135},{x:30.5,y:128},{x:252.5,y:26},{x:195.5,y:0},{x:307.5,y:1},{x:72.5,y:190},{x:23.5,y:232},{x:110.5,y:242},{x:43.5,y:33},{x:35.5,y:185},{x:18.5,y:178},{x:289.5,y:126},{x:337.5,y:126},{x:305.5,y:125},{x:360.5,y:122},{x:492.5,y:56},{x:503.5,y:136},{x:504.5,y:58}],bench:[{x:252.5,y:142},{x:252.5,y:26}],road:[{x:240,y:60},{x:240,y:60},{x:480,y:0},{x:480,y:60},{x:480,y:120},{x:480,y:180},{x:480,y:240},{x:300,y:180},{x:300,y:180},{x:360,y:180},{x:420,y:180},{x:420,y:120},{x:420,y:60},{x:360,y:60},{x:300,y:60},{x:420,y:120}],house3:[{x:503.5,y:136}],house:[{x:504.5,y:58}],map:[[0,0,0,0,0,0,0,0,0,0],[0,0,0,"↱","↠","↔","↔","↰",0,0],[0,0,0,"↕",0,0,0,"↟",0,0],[0,0,0,"↳","↔","↔","↔","↲",0,0],[0,0,0,0,0,0,0,0,0,0]],agent:{mx:4,my:3,line:0,motion:{type:"BasicMotionEngine",options:{rotationStep:.5,actions:["UP","LEFT","RIGHT"]}}}},level0:{cars:[],house:[{x:263,y:108},{x:112,y:258}],house3:[{x:262,y:16}],bench:[{x:135,y:34}],tree:[{x:124,y:134},{x:7,y:11},{x:69,y:10},{x:19,y:238},{x:5,y:133},{x:260,y:211}],map:[[0,0,0,0,0],[0,"↱","↔","↰",0],[0,"↕",0,"↕",0],[0,"↳","↠","↲",0],[0,0,0,0,0]],agent:{mx:2,my:1,line:1,motion:{type:"BasicMotionEngine",options:{rotationStep:.5,actions:["UP","LEFT","RIGHT","DOWN","WAIT"]}}}}}};function f(t,e){var i=new XMLHttpRequest;i.overrideMimeType("application/json"),i.open("GET",t,!0),i.onreadystatechange=function(){4==i.readyState&&200==i.status&&e(JSON.parse(i.responseText))},i.send(null)}function m(t,e){var i=t.split("//");i=i[1].split("/"),e(y[i[0]][i[1]])}function g(t,e){({"embedded:":m,"http:":f,"https:":f})[t.split("//")[0]](t,e)}function x(t,e){var i=document.createElement("a");document.body.appendChild(i);var o=new Blob([t],{type:"application/octet-binary"}),n=window.URL.createObjectURL(o);i.href=n,i.download=e,i.click(),window.URL.revokeObjectURL(n),i.href=""}function _(t){var e={};return e.code=t,e.isDown=!1,e.isUp=!0,e.press=void 0,e.release=void 0,e.downHandler=function(t){t.keyCode===e.code&&(e.isUp&&e.press&&e.press(),e.isDown=!0,e.isUp=!1),t.preventDefault()},e.upHandler=function(t){t.keyCode===e.code&&(e.isDown&&e.release&&e.release(),e.isDown=!1,e.isUp=!0),t.preventDefault()},window.addEventListener("keydown",e.downHandler.bind(e),!1),window.addEventListener("keyup",e.upHandler.bind(e),!1),e}var I,C=0,w=function(){function t(t,e,i,o){void 0===o&&(o={});var n=this;this.level=t,o.image=o.image||p.DEFAULT,o.lidar=o.lidar||!1,o.lidarInfo=o.lidarInfo||{pts:5,width:4,height:5,pos:0},this.core=new a(i[o.image]),this.info=e,this.core.scale.x=.8,this.core.scale.y=.8,this.core.anchor.x=.5,this.core.anchor.y=.5,this.core.road=void 0,this.core.carId=C,C+=1,this.core.agent=!1,this.core.obstacle=!0,this.core.mapId=u.CAR,o.lidar&&(this.createLidar(o.lidarInfo),this.core.lidar=this.lidar),o.motionEngine?(this.motion=o.motionEngine,this.motion.setUp(this.core,this.lidar),this.core.rotationStep=.5):this.core.rotationStep=.5,this.core.mx=this.info.mx,this.core.my=this.info.my,this.core.x=this.info.mx*d,this.core.y=this.info.my*d,this.core.checkAndsetNewRoad=function(t){return n.checkAndsetNewRoad(t)};var r=this.level.getRoad(this.core.my,this.core.mx);this.core.line=0,r&&r.setCarPosition(this.core,this.info.line)}return t.prototype.checkAndsetNewRoad=function(t){var e=this.core.road;t||(t=this.level.getRoad(this.core.my,this.core.mx)),t!=e&&(e&&e.cars.splice(e.cars.indexOf(this.core.carId),1),this.core.road=t,this.core.haveTurned=!1,this.core.optionalTurn=!1,this.turnedRandom=void 0,t&&t.cars.push(this.core.carId))},t.prototype.reset=function(){this.core.mx=this.info.mx,this.core.my=this.info.my;var t=this.level.getRoad(this.core.my,this.core.mx);t&&t.setCarPosition(this.core,this.info.line,!0)},t.prototype.getState=function(t){if(void 0===t&&(t=!1),t){var e=[];return this.motion.state.map(function(t){e=e.concat(t)}),e}return this.motion.state.map(function(t){return t.slice()})},t.prototype.step=function(t,e){if(void 0===e&&(e=null),null==e)var i=this.motion.step(t),o=i.agentCollisions,n=i.onRoad;else{var a=this.motion.actionStep(t,e);o=a.agentCollisions,n=a.onRoad}return{agentCollisions:o,onRoad:n}},t.prototype.createLidar=function(t){t.pts=t.pts||5,t.width=t.width||4,t.height=t.height||5,t.pos=t.pos||0,this.lidar=new s,this.lidar.lidarPts=[],this.lidar.collisionPts=[];var e=new r;e.pt=!1,e.alpha=.3,e.beginFill(5329233),e.drawRect(0,0,this.core.width*t.width,this.core.height*t.height),e.endFill();var i=new r;i.pt=!1,i.alpha=0,i.beginFill(5308416),i.drawRect(this.core.width-5,e.height/2,3,3),i.endFill();var o=new r;o.pt=!1,o.alpha=0,o.beginFill(5308416),o.drawRect(-1,e.height/2-2,3,3),o.endFill();var n=new r;n.pt=!1,n.alpha=0,n.beginFill(5308416),n.drawRect(this.core.width/2,e.height/2-this.core.height/2+5,3,3),n.endFill();var a=new r;a.pt=!1,a.alpha=0,a.beginFill(5308416),a.drawRect(this.core.width/2,e.height/2+this.core.height/2-8,3,3),a.endFill(),o.x-=t.pos*this.core.width,i.x-=t.pos*this.core.width,a.x-=t.pos*this.core.width,n.x-=t.pos*this.core.width;for(var h=e.width/t.pts,c=e.height/t.pts,l=t.pts-1;l>=0;l--)for(var d=0;do.x&&i.xo.y&&i.y=4||!t)&&(a=!0),{agentCollisions:i,onRoad:a}},t.prototype.setState=function(t){for(var e=0,i=0;ithis.state[o][n]||t[a].mapId==u.ROAD&&this.state[o][n]==u.DEFAULT)&&(this.state[o][n]=t[a].mapId)}e+=1}},t}(),b=(I=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i])},function(t,e){function i(){this.constructor=t}I(t,e),t.prototype=null===e?Object.create(e):(i.prototype=e.prototype,new i)}),R=function(t){function e(e,i){var o=t.call(this,e)||this;return o.rotationStep=i.rotationStep||.5,o.actions=i.actions||["UP","LEFT","RIGHT","DOWN","WAIT"],o}return b(e,t),e.prototype.setUp=function(t,e){this.car=t,this.lidar=e,this.state=[];for(var i=0;i0&&(this.car.v=0,this.car.vy=0),{agentCollisions:i,onRoad:o}},e}(M),E=function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i])};return function(e,i){function o(){this.constructor=e}t(e,i),e.prototype=null===i?Object.create(i):(o.prototype=i.prototype,new o)}}(),L=function(t){function e(e){var i=t.call(this,e)||this;return i.map=i.level.getMap(),i.mapSizeY=i.map.length,i.mapSizeX=i.map[0].length,i.rotationStep=.5,i.rotationToNextCase={},i.rotationToNextCase[0]={mx:1,my:0},i.rotationToNextCase[.5]={mx:0,my:1},i.rotationToNextCase[1]={mx:-1,my:0},i.rotationToNextCase[1.5]={mx:0,my:-1},i.rotationToNextCase[-.5]={mx:0,my:-1},i.rotationToNextCase[-1]={mx:-1,my:0},i.rotationToNextCase[-1.5]={mx:0,my:1},i}return E(e,t),e.prototype.setUp=function(t,e){this.car=t,this.lidar=e,this.state=[];for(var i=0;i=this.mapSizeY||t<0||t>=this.mapSizeX||0==this.map[e][t])return!1;if(i&&this.level.getRoad(e,t).cars.length>0)return!1;return!0},e.prototype.autoRotation=function(){var t=d+d/3,e=d-d/3.5,i=d;if(this.car.next_road){var o=Math.abs((this.car.next_road.outroad.y+d/2-this.car.y)*this.car.next_road.outroad_np.my),n=Math.abs((this.car.next_road.outroad.x+d/2-this.car.x)*this.car.next_road.outroad_np.mx);if(0==this.car.next_road.rotation_type&&othis.car.next_road.outroad.x+d/2?(this.car.x=this.car.next_road.outroad.x+d-d/2-d/4,this.car.y=this.car.next_road.outroad.y):0!=n&&this.car.ythis.car.next_road.outroad.y+d/2&&(this.car.y=this.car.next_road.outroad.y+d-d/2-d/4,this.car.x=this.car.next_road.outroad.x),void(this.car.next_road=void 0)}else{var a=this.car.rotation/Math.PI,r=(this.car.rotation/Math.PI+.5)%2,s=(this.car.rotation/Math.PI-.5)%2,h=this.rotationToNextCase[a],c=this.rotationToNextCase[r],l=this.rotationToNextCase[s],p=!1,u=this.car.mx+h.mx,v=this.car.my+h.my;if(this.isRoad(u,v)?this.car.haveTurned||this.car.turnedRandom?!this.car.haveTurned&&this.car.turnedRandom<.5&&this.isRoad(this.car.mx+c.mx,this.car.my+c.my)?(p=!0,this.car.optionalTurn=!0):!this.car.haveTurned&&this.car.turnedRandom>=.5&&this.isRoad(this.car.mx+l.mx,this.car.my+l.my)&&(p=!0,this.car.optionalTurn=!0):this.car.turnedRandom=Math.random():(p=!0,this.car.optionalTurn=!1),p)for(var y=[(a+.5)%2,(a-.5)%2,null],f=0;f=1&&n&&n.core.line==i&&(i=0==i?1:0),e.line=i,e.x=t.x,e.y=t.y,e.x+=d/2,e.y+=d/2;var a=1*d/4;t.orientation=Math.floor(t.orientation/e.rotationStep)*e.rotationStep;var r=-t.orientation*Math.PI,s=0*Math.cos(r)-a*Math.sin(r),h=Math.cos(r)*a+0*Math.sin(r),c=0==i?1:-1,l=0==i?0:Math.PI;e.x+=c*Math.round(s),e.y+=c*Math.round(h),e.mx=Math.floor(e.x/d),e.my=Math.floor(e.y/d),e.rotation=r+l,e.checkAndsetNewRoad(t)},t.prototype.createAsset=function(t,e,i,o){var n=new a(i[t]);n.obstacle=!1,n.type=o,n.mapId=0,n.x=e.x,n.y=e.y,this.level.addChild(n),this.assets.push(n)},t.prototype.createMap=function(t,e,i,o){if(void 0===o&&(o=!0),o)for(var n=0;n0?o=-1:e||(o=-1),o},e.prototype.getLastReward=function(){return this.lastReward},e.prototype.step=function(t,e){void 0===e&&(e=null);for(var i=0;i0?this.car.v=Math.max(0,this.car.v-.01):this.car.v<0&&(this.car.v=Math.min(0,this.car.v+.01)),this.car.a>0?this.car.v=Math.min(2,this.car.v+.02*this.car.a):this.car.v=Math.max(-2,this.car.v+.02*this.car.a),0==this.car.yaw_rate)this.car.x+=this.car.v*Math.cos(this.car.rotation)*t,this.car.y+=this.car.v*Math.sin(this.car.rotation)*t;else{var e=.01*this.car.yaw_rate*(this.car.v+.001)*Math.PI;this.car.x+=this.car.v/e*(Math.sin(this.car.rotation+e*t)-Math.sin(this.car.rotation)),this.car.y+=this.car.v/e*(Math.cos(this.car.rotation)-Math.cos(this.car.rotation+e*t)),this.car.rotation+=e*t}this.car.mx=Math.floor(this.car.x/d),this.car.my=Math.floor(this.car.y/d),this.car.checkAndsetNewRoad(),this.lidar.x=this.car.x,this.lidar.y=this.car.y,this.lidar.rotation=this.car.rotation;var i=this.detectInteractions(),o=i.agentCollisions,n=i.onRoad;return o.length>0&&(this.car.v=0,this.car.vy=0),{agentCollisions:o,onRoad:n}},e}(M),j={env:k,editor:N,level:{fullCity:"embedded://level/fullCity",level1:"embedded://level/level1",level0:"embedded://level/level0"},motion:{BasicMotion:R,ControlMotion:B}};e.default=j}]).default; \ No newline at end of file diff --git a/package.json b/package.json index 0ebfef5..5e903e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "metacar", - "version": "0.0.1", + "description": "A reinforcement learning environment for self-driving cars in the browser.", + "version": "0.0.3", "main": "dist/metacar.min.js", "author": "Thibault Neveu", "license": "MIT", diff --git a/src/asset_manager.ts b/src/asset_manager.ts index 7eaa9e6..8a3c97c 100644 --- a/src/asset_manager.ts +++ b/src/asset_manager.ts @@ -12,10 +12,8 @@ import { import {CarOptions, Car, LidarInfoI} from "./car"; import {BasicMotionEngine} from "./basic_motion_engine"; -import {ControlMotionEngine} from "./control_motion_engine"; import {BotMotionEngine} from "./bot_motion_engine"; import { Editor } from "./editor"; -import { MotionEngine } from "./motion_engine"; export interface AssetInfo { readonly mx?: number; @@ -56,7 +54,6 @@ export class AssetManger { private level: Level|Editor; // Used to list the differents MotionEngine possible to add on the car - private motion: any; // List of all items on the map public assets: SimpleSprite[] = []; private agentMotionEngine: any = BasicMotionEngine; @@ -65,10 +62,6 @@ export class AssetManger { constructor(level: Level|Editor) { this.level = level; - this.motion = { - "BasicMotionEngine": BasicMotionEngine, - "ControlMotionEngine": ControlMotionEngine - } } /** @@ -92,7 +85,7 @@ export class AssetManger { this.agentMotionOptions = options; } - createRoadSide(info: AssetInfo, textures: any){ + createRoadSide(info: AssetInfo){ /* @textures: (Pixi textures) */ @@ -208,7 +201,7 @@ export class AssetManger { for (let my = 0; my < map.length; my++) { for (let mx = 0; mx < map[my].length; mx++) { if (ASSETS.ROADS[map[my][mx]]){ - this.createRoadSide({mx, my, type: map[my][mx]}, textures); + this.createRoadSide({mx, my, type: map[my][mx]}); } } } @@ -231,7 +224,7 @@ export class AssetManger { } } - createCars(map: (string|number)[][], info: any, textures: (PIXI.Texture|PIXI.loaders.TextureDictionary)){ + createCars(info: any, textures: (PIXI.Texture|PIXI.loaders.TextureDictionary)){ /* Method used to create all the cars @map (2dim Array) @@ -250,7 +243,7 @@ export class AssetManger { } } - createAgent(map: (string|number)[][], info: any, textures: (PIXI.Texture|PIXI.loaders.TextureDictionary), displayLidar:boolean=true){ + createAgent(info: any, textures: (PIXI.Texture|PIXI.loaders.TextureDictionary), displayLidar:boolean=true){ /* Method used to create the agent's car. @map (2dim Array) diff --git a/src/bot_motion_engine.ts b/src/bot_motion_engine.ts index 862e43b..af35ba4 100644 --- a/src/bot_motion_engine.ts +++ b/src/bot_motion_engine.ts @@ -182,7 +182,6 @@ export class BotMotionEngine extends MotionEngine { let turn = false; let nx = this.car.mx + is_next_pos.mx; let ny = this.car.my + is_next_pos.my; - let current_road = this.level.getRoad(this.car.my, this.car.mx); if (!this.isRoad(nx, ny)) { turn = true; this.car.optionalTurn = false; diff --git a/src/car.ts b/src/car.ts index 05db179..23aae93 100644 --- a/src/car.ts +++ b/src/car.ts @@ -11,7 +11,6 @@ import { CAR_IMG, Sprite, MAP, ROADSIZE, Container, Graphics } from "./global"; import { RoadSprite } from "./asset_manager"; -import { stat } from "fs"; var Global_carId = 0; diff --git a/src/editor.ts b/src/editor.ts index b34a679..028b814 100644 --- a/src/editor.ts +++ b/src/editor.ts @@ -1,9 +1,6 @@ -import { LevelInfo, Roads } from "./level"; -import { AssetManger, RoadSprite } from "./asset_manager"; -import { Car} from "./car"; +import { LevelInfo } from "./level"; +import { AssetManger } from "./asset_manager"; import {Loader, Sprite, JSON_TEXTURES, ROADSIZE, MAP} from "./global"; -import * as U from "./utils"; -import {UIEvent} from "./ui_event"; import { World } from "./world"; /* @@ -16,7 +13,6 @@ export class Editor extends World { // Current selector items by the editor private selectedItems: any = null; - private event: UIEvent; constructor(levelContent: LevelInfo, canvasId: string) { /* @@ -40,9 +36,9 @@ export class Editor extends World { let textures = Loader.resources[JSON_TEXTURES].textures; // Load all elements of the car this.am.createMap(this.map, info, textures, false); - this.am.createCars(this.map, info, textures); + this.am.createCars(info, textures); if (info.agent) - this.agent = this.am.createAgent(this.map, info, textures, false); + this.agent = this.am.createAgent(info, textures, false); var that = this; for (var i = 0; i < this.envs.length; i++) { @@ -124,7 +120,7 @@ export class Editor extends World { this.envs[this.envs.length - 1].on("rightclick", function(this: any) {that.removeItem(this)}); } else if (this.selectedItems.type == "car"){ - this.am.createCars(this.map, {cars:[{ + this.am.createCars({cars:[{ "mx": Math.floor(this.selectedItems.x / ROADSIZE), "my": Math.floor(this.selectedItems.y / ROADSIZE), "rotation": 0, @@ -134,7 +130,7 @@ export class Editor extends World { this.envs[this.envs.length - 1].on("rightclick", function(this: any) {that.removeItem(this)}); } else if (this.selectedItems.type == "agent" && this.agent == undefined){ - this.agent = this.am.createAgent(this.map, {agent:{ + this.agent = this.am.createAgent({agent:{ "mx": Math.floor(this.selectedItems.x / ROADSIZE), "my": Math.floor(this.selectedItems.y / ROADSIZE), "rotation": 0, @@ -158,13 +154,4 @@ export class Editor extends World { this.app.stage.removeChild(this.selectedItems); this.selectedItems = null; } -} - -/* -function createEditor(id: string){ - - - document.getElementById("saveMap").onclick = () => { - editor.am.exportMap(width, height, file); - }; -}*/ \ No newline at end of file +} \ No newline at end of file diff --git a/src/level.ts b/src/level.ts index f9a8906..d675f92 100644 --- a/src/level.ts +++ b/src/level.ts @@ -3,13 +3,12 @@ services in the game (assets, map, agents...). */ -import * as U from "./utils"; import { - ROADSIZE, Loader, JSON_TEXTURES + Loader, JSON_TEXTURES } from "./global"; import {AssetManger, RoadSprite} from "./asset_manager"; -import {Car, CarSprite, LidarChild, LidarInfoI} from "./car"; +import {LidarInfoI} from "./car"; import {World} from "./world"; import { BasicMotionEngine, BasicMotionOptions } from "./basic_motion_engine"; import { ControlMotionEngine } from "./control_motion_engine"; @@ -90,9 +89,9 @@ export class Level extends World { let textures = Loader.resources[JSON_TEXTURES].textures; // Load all elements of the car this.am.createMap(this.map, info, textures); - this.am.createCars(this.map, info, textures); + this.am.createCars(info, textures); if (info.agent) - this.agent = this.am.createAgent(this.map, info, textures); + this.agent = this.am.createAgent(info, textures); // Set up the main loop this.app.ticker.add((delta: number) => this.loop(delta)); } diff --git a/src/metacar.ts b/src/metacar.ts index 69e009e..9628ff2 100644 --- a/src/metacar.ts +++ b/src/metacar.ts @@ -3,7 +3,7 @@ */ import {Level, LevelInfo} from "./level"; -import {actionSpaceDescription, MotionEngine} from "./motion_engine"; +import {actionSpaceDescription} from "./motion_engine"; import {UIEvent} from "./ui_event"; import * as U from "./utils"; import { BasicMotionEngine, BasicMotionOptions } from "./basic_motion_engine"; @@ -20,7 +20,6 @@ export interface eventLoadOptions { export class MetaCar { - private agent: any; private level: Level; private canvasId: string; private levelToLoad: string|Object; @@ -245,7 +244,7 @@ export class MetaCar { */ public load(): Promise{ - return new Promise((resolve, reject) => { + return new Promise((resolve) => { if (typeof this.levelToLoad == "string"){ U.loadCustomURL(this.levelToLoad, (content: LevelInfo) => { this.level = new Level(content, this.canvasId); diff --git a/src/metacar_editor.ts b/src/metacar_editor.ts index 019fc9a..bae9037 100644 --- a/src/metacar_editor.ts +++ b/src/metacar_editor.ts @@ -1,13 +1,11 @@ -import { Level, LevelInfo } from "./level"; +import { LevelInfo } from "./level"; import { UIEvent, eventEditorLoadOptions } from "./ui_event"; import * as U from "./utils"; import { Editor } from "./editor"; import { ROADSIZE } from "./global"; -import { eventLoadOptions } from "./metacar"; export class MetaCarEditor { - private agent: any; private level: Editor; private canvasId: string; private levelToLoad: string|Object; @@ -28,17 +26,17 @@ export class MetaCarEditor { this.levelToLoad = levelToLoad; } - public load(level: string, agent: any): Promise{ + public load(): Promise{ /* Load the environement @level (String) Name of the json level to load @agent (Agent class) */ - return new Promise((resolve, reject) => { + return new Promise((resolve) => { if (typeof this.levelToLoad == "string"){ U.loadCustomURL(this.levelToLoad, (content: LevelInfo) => { this.level = new Editor(content, this.canvasId); - this.level.load((delta: number) => this.loop(delta)); + this.level.load(() => this.loop()); this.event = new UIEvent(this.level, this.canvasId); this.event.createEditorElementsEvents(); @@ -50,7 +48,7 @@ export class MetaCarEditor { } else{ this.level = new Editor(this.levelToLoad, this.canvasId); - this.level.load((delta: number) => this.loop(delta)); + this.level.load(() => this.loop()); this.event = new UIEvent(this.level, this.canvasId); this.event.createEditorElementsEvents(); @@ -88,11 +86,10 @@ export class MetaCarEditor { this.event.onCustomEvent(eventName, fc); return; } - const event = this.eventList[index]; this.eventCallback[index](fc, options); } - private loop(delta: number): void{ + private loop(): void{ let mousePos = this.level.getMousePosition(); let selectedItem = (this.level).getSelectedItems(); if (selectedItem && selectedItem.type == "asset"){ diff --git a/src/motion_engine.ts b/src/motion_engine.ts index 867388b..5589bc1 100644 --- a/src/motion_engine.ts +++ b/src/motion_engine.ts @@ -34,7 +34,7 @@ export class MotionEngine { this.level = level; } - protected boxesIntersect(a: any, b: any, reduce: boolean) { + protected boxesIntersect(a: any, b: any) { /* Chack if a the two elements intersect each others @a (Pixi sprite) @@ -51,9 +51,9 @@ export class MotionEngine { * @object The object */ protected carIntersect(car1: CarSprite, object: CarSprite){ - const nb = this.car.lidar.collisionPts.length; + const nb = car1.lidar.collisionPts.length; for (let c=0; c < nb; c++){ - if (this.boxesIntersect(this.car.lidar.collisionPts[c], object, false)){ + if (this.boxesIntersect(car1.lidar.collisionPts[c], object)){ return true; } } @@ -66,10 +66,10 @@ export class MotionEngine { * @object The object */ protected carCaptorInObject(car1: CarSprite, object: CarSprite): number{ - const size = this.car.lidar.collisionPts.length; + const size = car1.lidar.collisionPts.length; let nb = 0; for (let c=0; c < size; c++){ - if (this.boxesIntersect(this.car.lidar.collisionPts[c], object, false)){ + if (this.boxesIntersect(car1.lidar.collisionPts[c], object)){ nb += 1; } } @@ -91,19 +91,17 @@ export class MotionEngine { let agentCollisions = []; let lidar_collisions = []; let onRoadCnt = 0; - let checkNb = 0; let onRoad = false; for (let i = 0; i < envs.length; i++) { if (envs[i] != this.car && Math.abs(envs[i].mx - this.car.mx) < 2 && Math.abs(envs[i].my - this.car.my) < 2){ - checkNb += 1; if (all && envs[i].obstacle && this.carIntersect(this.car, envs[i])){ agentCollisions.push(envs[i]); } else if (all && envs[i].mapId == MAP.ROAD){ onRoadCnt += this.carCaptorInObject(this.car, envs[i]); } - if (this.boxesIntersect(envs[i], this.lidar, false)){ + if (this.boxesIntersect(envs[i], this.lidar)){ lidar_collisions.push(envs[i]); } } @@ -131,7 +129,7 @@ export class MotionEngine { for (var a = 0; a < lidar_collisions.length; a++) { if (lidar_collisions[a] != this.car){ - let touch = this.boxesIntersect(lidar_collisions[a], this.lidar.lidarPts[i], false); + let touch = this.boxesIntersect(lidar_collisions[a], this.lidar.lidarPts[i]); if (touch && lidar_collisions[a].obstacle){ // If this is an obstacle this.lidar.lidarPts[i].alpha = 1.; diff --git a/src/ui_event.ts b/src/ui_event.ts index 596eda7..929db62 100644 --- a/src/ui_event.ts +++ b/src/ui_event.ts @@ -18,7 +18,6 @@ export class UIEvent { private playing: boolean; private canvasId: string; private buttonsContainer: HTMLDivElement; - private selectedItems: boolean = false; private level: Level|Editor; private editorWidth: number; private editorHeight: number; diff --git a/src/utils.ts b/src/utils.ts index a3ac361..109b57a 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -27,9 +27,6 @@ export function loadEmbeddedURL(url: string, callback: any):void { callback(embeddedContent[split[0]][split[1]]); } -export function loadLocalStorageURL(url: string, callback: any):void{ -} - export function loadCustomURL(url: string, callback: any):void { /** * @url: CustomURL to load diff --git a/src/world.ts b/src/world.ts index 9aca03f..ac9481e 100644 --- a/src/world.ts +++ b/src/world.ts @@ -1,6 +1,6 @@ import { LevelInfo, Roads } from "./level"; import { AssetManger, RoadSprite } from "./asset_manager"; -import { Car, CarSprite } from "./car"; +import { Car } from "./car"; import { ROADSIZE, Loader, JSON_TEXTURES, JSON_IMAGE } from "./global"; export class World { @@ -36,7 +36,7 @@ export class World { @loop (Method) This method will be call for each render */ this.loop = loop; - return new Promise((resolve, reject) => { + return new Promise((resolve) => { this.createLevel(this.info).then(() => resolve()); }); } @@ -57,7 +57,7 @@ export class World { // Append the app to the body document.getElementById(this.canvasId).appendChild(this.app.view); - return new Promise((resolve, reject) => { + return new Promise((resolve) => { Loader.add([JSON_TEXTURES, JSON_IMAGE], {crossOrigin: true}).load(() => { this._setup(info); // Set up the level (Add assets) resolve(); @@ -66,7 +66,7 @@ export class World { } protected _setup(info: LevelInfo){ - console.warn("This method should be implemented."); + console.warn("This method should be implemented.", info); } public getRoads(): Roads { diff --git a/typedoc.json b/typedoc.json index e93b3a0..d4535a5 100644 --- a/typedoc.json +++ b/typedoc.json @@ -1,6 +1,6 @@ { "mode": "modules", - "out": "docs", + "out": "demo/docs", "src": "src/index.ts", "theme": "default", "ignoreCompilerErrors": "true",