From 2fbabc785e11f135f7fdef97d247f14aa63554c7 Mon Sep 17 00:00:00 2001 From: asraelite Date: Mon, 5 Mar 2018 00:57:33 +0000 Subject: [PATCH] Add start of ship editing grid --- .gitignore | 1 + dist/improcket.min.js.map | 1 - js/consts.mjs | 4 ++- js/game/edit.mjs | 58 +++++++++++++++++++++++++++++++- js/game/events.mjs | 2 -- js/graphics/edit.mjs | 16 +++++++++ js/graphics/gui.mjs | 45 +++++++++++++++++++++++-- js/graphics/index.mjs | 5 +-- js/graphics/world.mjs | 6 ++++ js/gui/edit.mjs | 69 +++++++++++++++++++++++++++++++++++++++ js/gui/inventory.mjs | 0 js/gui/item.mjs | 18 ++++++++++ js/gui/misc.mjs | 13 ++++++++ js/gui/modules.mjs | 19 +++++++---- js/input.mjs | 4 +++ js/world/ship.mjs | 6 ++-- 16 files changed, 249 insertions(+), 18 deletions(-) delete mode 100644 dist/improcket.min.js.map create mode 100644 js/graphics/edit.mjs create mode 100644 js/gui/edit.mjs create mode 100644 js/gui/inventory.mjs create mode 100644 js/gui/item.mjs diff --git a/.gitignore b/.gitignore index 7a15733..bba8027 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .cache/ *.min.js +*.map diff --git a/dist/improcket.min.js.map b/dist/improcket.min.js.map deleted file mode 100644 index 3e6d83c..0000000 --- a/dist/improcket.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"improcket.min.js","sources":["../js/assets.mjs","../js/input.mjs","../js/gui/misc.mjs","../js/gui/element.mjs","../js/gui/frame.mjs","../js/gui/image.mjs","../js/gui/button.mjs","../js/consts.mjs","../js/world/module.mjs","../js/world/body.mjs","../js/world/particle.mjs","../js/world/ship.mjs","../js/world/celestial.mjs","../js/data.mjs","../js/world/spawn.mjs","../js/world/index.mjs","../js/game/player.mjs","../js/game/edit.mjs","../js/game/events.mjs","../js/gui/modules.mjs","../js/gui/index.mjs","../js/graphics/draw.mjs","../js/graphics/gui.mjs","../js/graphics/world.mjs","../js/graphics/background.mjs","../js/graphics/index.mjs","../js/game/control.mjs","../js/game/index.mjs","../js/index.mjs"],"sourcesContent":["export const images = {\n\ttitle: {\n\t\tlogo: 'logo.png',\n\t\tlogoSvg: 'logo2.svg'\n\t},\n\tbackground: {\n\t\tback: 'background.png',\n\t\tmiddle: 'stars_back.png',\n\t\tfront: 'stars_front.png'\n\t},\n\tmodules: {\n\t\tcapsule: {\n\t\t\tsmall: 'modules/small_capsule.svg'\n\t\t},\n\t\tfuel: {\n\t\t\tsmall: 'modules/small_fuel_tank.svg'\n\t\t},\n\t\tthruster: {\n\t\t\tlight: {\n\t\t\t\toff: 'modules/light_thruster.svg',\n\t\t\t\ton: 'modules/light_thruster_on.svg',\n\t\t\t}\n\t\t}\n\t},\n\tcelestials: {\n\t\tgreen: {\n\t\t\t\"0\": 'celestials/green_0.svg'\n\t\t}\n\t}\n};\n\nexport const audio = {};\n\nexport async function init() {\n\tlet parse = (obj, convert) => Object.entries(obj).forEach(([k, v]) => {\n\t\ttypeof v == 'object' ? parse(v, convert) : obj[k] = convert(v);\n\t});\n\n\tlet promises = [];\n\tparse(images, str => {\n\t\tlet img = new Image();\n\t\timg.src = 'img/' + str;\n\t\tpromises.push(new Promise((res, rej) => {\n\t\t\timg.addEventListener('load', res);\n\t\t}));\n\t\treturn img;\n\t});\n\tparse(audio, str => {\n\t\t// TODO: Load audio.\n\t});\n\n\tawait Promise.all(promises);\n}\n","import {canvas} from './graphics/index.mjs';\n\nexport const mouse = { pressed: {}, held: {}, x: 0, y: 0, scroll: 0 };\nexport const keyCode = { pressed: {}, held: {} };\nexport const key = { pressed: {}, held: {} };\nexport const action = {};\n\nconst mapping = {};\n\nexport function tick() {\n\tmouse.pressed = {};\n\tkeyCode.pressed = {};\n\tkey.pressed = {};\n\tmouse.scroll = 0;\n}\n\nexport function init() {\n\twindow.addEventListener('keydown', event => {\n\t\tkeyCode.pressed[event.code] = !keyCode.held[event.code];\n\t\tkeyCode.held[event.code] = true;\n\t\tkey.pressed[event.key] = !keyCode.held[event.key];\n\t\tkey.held[event.key] = true;\n\t});\n\n\twindow.addEventListener('keyup', event => {\n\t\tkeyCode.pressed[event.code] = false;\n\t\tkeyCode.held[event.code] = false;\n\t\tkey.pressed[event.key] = false;\n\t\tkey.held[event.key] = false;\n\t});\n\t// Ṕ͕͖ẖ̨’̖̺͓̪̹n̼͇͔̯̝̖g̙̩̭͕ͅͅl̻̰͘u͎̥͍̗ͅi̼̞̪̩͚̜͖ ̫̝̻͚͟m͎̳̙̭̩̩̕g̟̤̬̮l̫̕w̶͚͈͚̟͔’͖n͏̝͖̞̺ͅa͏̹͓̬̺f̗̬̬̬̖̫͜h͙̘̝̱̬̗͜ ̼͎͖C̱͔̱͖ṭ̬̱͖h̵̰̼̘̩ùlh̙́u̪̫ ̪̺̹̙̯R̞͓̹̞’͍͎͉͎̦͙ͅl͇̠̮y̙̪̰̪͙̖e̢̩͉͙̼h̗͔̹̳ ̶w̨̼͍̝̭̣̣ͅg̶̳̦̳a̴͉̹͙̭̟ͅh͈͎̞̜͉́’̼̜̠͞n̲a̯g̮͚͓̝l̠ ̹̹̱͙̝f̧̝͖̱h̪̟̻͖̖t͎͘aͅg̤̘͜n̶͈̻̻̝̳\n\twindow.addEventListener('mousedown', event => {\n\t\tmouse.pressed[event.button] = !mouse.held[event.button];\n\t\tmouse.held[event.button] = true;\n\t});\n\n\twindow.addEventListener('mouseup', event => {\n\t\tmouse.pressed[event.button] = false;\n\t\tmouse.held[event.button] = false;\n\t});\n\n\twindow.addEventListener('mousemove', event => {\n\t\tlet rect = canvas.getBoundingClientRect();\n\t\tmouse.x = event.clientX - rect.left;\n\t\tmouse.y = event.clientY - rect.top;\n\t});\n\n\twindow.addEventListener('wheel', event => {\n\t\tmouse.scroll = event.deltaY;\n\t});\n}\n","import * as input from '../input.mjs';\n\nexport class Rect {\n\tconstructor(x = 0, y = 0, w = 0, h = 0) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.w = w;\n\t\tthis.h = h;\n\n\t\tthis.onclick = null;\n\t\tthis.mouseHeld = false;\n\t}\n\n\tclick() {}\n\n\ttickMouse() {\n\t\tif (this.mouseHeld == true && !input.mouse.held[0] && this.mouseOver)\n\t\t\tthis.click();\n\t\tif (!this.mouseHeld && input.mouse.pressed[0] && this.mouseOver)\n\t\t\tthis.mouseHeld = true;\n\t\tif (!input.mouse.held[0])\n\t\t\tthis.mouseHeld = false;\n\t}\n\n\tget shape() {\n\t\treturn [this.x, this.y, this.w, this.h];\n\t}\n\n\tget center() {\n\t\treturn [this.x + this.w / 2, this.y + this.h / 2];\n\t}\n\n\tget mouseOver() {\n\t\treturn this.containsPoint(input.mouse.x, input.mouse.y);\n\t}\n\n\tget mouseClicked() {\n\t\treturn this.mouseOver() && input.mouse.pressed[0];\n\t}\n\n\tcontainsPoint(x, y) {\n\t\treturn x > this.x && x < this.x + this.w\n\t\t\t&& y > this.y && y < this.y + this.h;\n\t}\n}\n","import {Rect} from './misc.mjs';\n\nconst defaultOptions = {\n\tdraw: true, // Whether the element itself will be rendered.\n\tdrawChildren: true // Whether children will be rendered.\n}\n\nexport default class GuiElement extends Rect {\n\tconstructor(x, y, w, h, options = {}) {\n\t\tsuper(x, y, w, h);\n\t\tthis.children = new Set();\n\t\tthis.parent = null;\n\n\t\tthis.type = 'element';\n\n\t\tthis.options = Object.assign({}, defaultOptions, options);\n\t}\n\n\ttickElement() {\n\t\tthis.tickMouse();\n\t\tthis.tick();\n\t\tthis.children.forEach(c => c.tickElement());\n\t}\n\n\ttick() {\n\n\t}\n\n\tappend(element) {\n\t\tthis.children.add(element);\n\t\telement.parent = this;\n\t}\n\n\tclear() {\n\t\tthis.children.clear();\n\t}\n\t// Code should be self-describing, comments are for fucking about.\n\t// - Albert Einstein\n\n\tposRelative({x = null, xc = 0, y = null, yc = 0, w = null, h = null}) {\n\t\tif (x !== null) {\n\t\t\tthis.x = (this.parent.w * x) - (this.w * xc);\n\t\t}\n\t\tif (y !== null)\n\t\t\tthis.y = (this.parent.h * y) - (this.h * yc);\n\t\tif (w !== null)\n\t\t\tthis.w = this.parent.w * w;\n\t\tif (h !== null)\n\t\t\tthis.h = this.parent.h * h;\n\t}\n}\n","import * as gui from './index.mjs';\nimport GuiElement from './element.mjs';\n\nexport default class GuiFrame extends GuiElement {\n\tconstructor(x, y, w, h, options) {\n\t\tsuper(x, y, w, h, options);\n\t\tthis.type = 'frame';\n\t}\n}\n","import * as gui from './index.mjs';\nimport GuiElement from './element.mjs';\n\nexport default class GuiImage extends GuiElement {\n\tconstructor(src, x, y, w, h) {\n\t\tw = w || src.width;\n\t\th = h || src.height;\n\t\tsuper(x, y, w, h);\n\t\tthis.type = 'image';\n\t\tthis.image = src;\n\t\tthis.imgRatio = src.width / src.height;\n\t}\n\n\tscaleImage({ w = null, h = null }) {\n\t\tif (w !== null && h === null) {\n\t\t\tthis.w = w;\n\t\t\tthis.h = w / this.imgRatio;\n\t\t} else if (h !== null && w === null) {\n\t\t\tthis.h = h;\n\t\t\tthis.w = h / this.imgRatio;\n\t\t} else if ( h !== null && w !== null) {\n\t\t\tthis.w = w;\n\t\t\tthis.h = h;\n\t\t}\n\t}\n}\n","import * as gui from './index.mjs';\nimport GuiElement from './element.mjs';\n\nexport default class GuiButton extends GuiElement {\n\tconstructor(text, onclick, x, y, w = 100, h = 30) {\n\t\tsuper(x, y, w, h);\n\t\tthis.type = 'button';\n\t\tthis.text = text;\n\t\tthis.onclick = onclick;\n\t}\n\n\tclick() {\n\t\tif (this.options.draw)\n\t\t\tthis.onclick();\n\t}\n}\n","/*\n *\tConstants that do not change during gameplay.\n *\tThis can kind of be treated like a configuration file, I guess.\n *\n *\tAll length units are relative to the size of a small ship module, which\n *\tis always 1x1.\n */\n\n// For fixing floating point rounding errors.\nexport const EPSILON = 1e-8;\n// Unit length of sector. Only for internal representation.\nexport const SECTOR_SIZE = 512;\n// G, G-boy, The big G, Mr. G, g's big brother, G-dog\nexport const GRAVITATIONAL_CONSTANT = 0.01;\n// Perspective constraints. Higher zoom value = closer.\nexport const MIN_ZOOM = 1;\nexport const MAX_ZOOM = 100;\nexport const DEFAULT_ZOOM = 10;\nexport const ZOOM_SPEED = 0.01;\n// Ship landing. Angle in radians.\nexport const TIP_ANGLE = 30.3;\nexport const TIP_SPEED = 0.015;\n// Ship flight mechanics. Speed measured in units per tick.\nexport const FUEL_BURN_RATE = 0.01;\n// Distance at which an orbited planet will not be considered a parent body.\nexport const MAX_PARENT_CELESTIAL_DISTANCE = 120;\n","import {images as assets} from '../assets.mjs';\n\nexport default class Module {\n\tconstructor(x, y, ship, {\n\t\tname = 'Unnamed Module',\n\t\ttype = 'block',\n\t\tid = 'unknown',\n\t\tmass = 1,\n\t\t// Fuel\n\t\tfilled = false,\n\t\tfuelCapacity = 0,\n\t\t...properties\n\t}) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.name = name;\n\t\tthis.type = type;\n\t\tthis.mass = mass;\n\t\tthis.ship = ship;\n\t\tthis.id = id;\n\t\tthis.images = assets.modules[this.type][this.id];\n\t\t// Fuel\n\t\tif (this.type == 'fuel') {\n\t\t\tthis.fuel = filled ? fuelCapacity : 0;\n\t\t} else if (this.type == 'thruster') {\n\t\t\tthis.power = 0;\n\t\t}\n\t}\n\n\treset() {\n\t\tif (this.type == 'thruster') {\n\t\t\tthis.power = 0;\n\t\t}\n\t}\n\n\tget com() {\n\t\treturn this.ship.getWorldPoint(...this.localCom);\n\t}\n\n\tget currentImage() {\n\t\tif (this.type == 'thruster') {\n\t\t\treturn this.power > 0 ? this.images.on : this.images.off;\n\t\t} else {\n\t\t\treturn this.images;\n\t\t}\n\t}\n\n\tget localCom() {\n\t\treturn [this.x + 0.5, this.y + 0.5];\n\t}\n}\n","import {GRAVITATIONAL_CONSTANT as G} from '../consts.mjs';\n\nexport default class Body {\n\tconstructor(x, y, mass) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.r = 0;\n\t\tthis.xvel = 0;\n\t\tthis.yvel = 0;\n\t\tthis.rvel = 0;\n\t\tthis.rfriction = 0.9;\n\t\tthis.mass = mass;\n\t}\n\n\tget com() {\n\t\treturn [this.x, this.y];\n\t}\n\n\tget pos() {\n\t\treturn [this.x, this.y];\n\t}\n\n\tget speed() {\n\t\treturn Math.sqrt(this.xvel ** 2 + this.yvel ** 2);\n\t}\n\n\tgetWorldPoint(lx, ly) {\n\t\tlet [cx, cy] = this.localCom;\n\t\tlet [nx, ny] = this.rotateVector(lx - cx, ly - cy, this.r);\n\t\treturn [nx + this.x + cx, ny + this.y + cy];\n\t}\n\n\tgetLocalPoint(wx, wy) {\n\t\tlet [lx, ly] = [wx - this.x, wy - this.y];\n\t\tlet [cx, cy] = this.localCom;\n\t\tlet [nx, ny] = this.rotateVector(lx, ly, -this.r);\n\t\treturn [nx - cx, ny - cy];\n\t}\n\n\trotateVector(x, y, r = this.r) {\n\t\treturn [(x * Math.cos(r) - y * Math.sin(r)),\n\t\t\t(y * Math.cos(r) - x * Math.sin(r))];\n\t}\n\n\trelativeVector(x, y) {\n\t\treturn this.rotateVector(x, y, this.r);\n\t}\n\n\ttickMotion() {\n\t\tthis.x += this.xvel;\n\t\tthis.y += this.yvel;\n\t\tthis.r += this.rvel;\n\t\tthis.rvel *= this.rfriction;\n\t}\n\n\ttickGravity(bodies) {\n\t\tbodies.forEach(b => {\n\t\t\tlet force = b.mass / this.mass / (this.distanceTo(b) ** 2) * G;\n\t\t\tlet [[ax, ay], [bx, by]] = [this.com, b.com];\n\t\t\tlet angle = Math.atan2(by - ay, bx - ax);\n\t\t\tthis.xvel += Math.cos(angle) * force;\n\t\t\tthis.yvel += Math.sin(angle) * force;\n\t\t});\n\t}\n\n\tdistanceTo(body) {\n\t\tlet [[ax, ay], [bx, by]] = [this.com, body.com];\n\t\treturn Math.max(Math.sqrt(((bx - ax) ** 2) +\n\t\t\t((by - ay) ** 2)), 1);\n\t}\n\n\tangleTo(ax, ay, bx, by) {\n\t\treturn Math.atan2(by - ay, bx - ax);\n\t}\n\n\tapproach(body, distance) {\n\t\tlet [[ax, ay], [bx, by]] = [this.com, body.com];\n\t\tlet angle = Math.atan2(by - ay, bx - ax);\n\t\tthis.x += Math.cos(angle) * distance;\n\t\tthis.y += Math.sin(angle) * distance;\n\t}\n\n\thalt() {\n\t\tthis.xvel = 0;\n\t\tthis.yvel = 0;\n\t}\n\n\tapplyDirectionalForce(x, y, r) {\n\t\tlet [vx, vy] = this.rotateVector(x, y);\n\t\tthis.xvel += vx;\n\t\tthis.yvel += vy;\n\t\tthis.rvel += r / this.mass;\n\t}\n}\n","import Body from './body.mjs';\nimport {celestials, particles} from './index.mjs';\n\nexport function createThrustExhaust(thruster) {\n\tlet ship = thruster.ship;\n\tlet [fx, fy] = ship.relativeVector(0, 0.2);\n\tlet [dx, dy] = ship.relativeVector((Math.random() - 0.5) * 0.5, 0.5);\n\tlet [cx, cy] = thruster.com;\n\tparticles.add(new Particle(cx + dx, cy + dy, {\n\t\txvel: ship.xvel + fx,\n\t\tyvel: ship.yvel + fy,\n\t\tcolor: '#f4c542',\n\t\tlifetime: 5,\n\t\tsize: 0.07\n\t}));\n}\n\nclass Particle extends Body {\n\tconstructor(x, y, {\n\t\txvel = 0,\n\t\tyvel = 0,\n\t\tspray = 0.1,\n\t\tfizzle = 0,\n\t\tmaxFizzle = fizzle * 2,\n\t\tcolor = '#fff',\n\t\tgravity = false,\n\t\tlifetime = 50,\n\t\tsize = 0.1,\n\t\tfriction = 0.99\n\t}) {\n\t\tsuper(x, y, 0.1);\n\n\t\tthis.size = size;\n\t\tthis.xvel = xvel + (Math.random() - 0.5) * spray;\n\t\tthis.yvel = yvel + (Math.random() - 0.5) * spray;\n\t\tthis.friction = friction;\n\t\tthis.fizzle = fizzle;\n\t\tthis.maxFizzle = maxFizzle;\n\t\tthis.color = color;\n\t\tthis.gravity = gravity;\n\t\tthis.life = lifetime;\n\t}\n\n\tget com() {\n\t\treturn [this.x - this.size / 2, this.y - this.size / 2];\n\t}\n\n\ttick() {\n\t\tif (!this.life--) {\n\t\t\tparticles.delete(this);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.tickMotion();\n\t\tif (this.gravity) this.tickGravity(celestials);\n\n\t\tthis.xvel *= this.friction;\n\t\tthis.yvel *= this.friction;\n\t\tthis.x += (Math.random() - 0.5) * this.fizzle;\n\t\tthis.y += (Math.random() - 0.5) * this.fizzle;\n\t\tif (this.fizzle < this.mazFizzle) this.fizzle *= 1.05;\n\t}\n}\n","import Module from './module.mjs';\nimport Body from './body.mjs';\nimport * as world from './index.mjs';\nimport * as consts from '../consts.mjs';\nimport * as particle from './particle.mjs';\nimport * as events from '../game/events.mjs';\nimport {state} from '../game/index.mjs';\n\nexport default class Ship extends Body {\n\tconstructor(x, y) {\n\t\tsuper(x, y, 0);\n\n\t\tthis.localCom = [0, 0];\n\t\tthis.modules = new Set();\n\t\tthis.maxRadius = 0;\n\t\tthis.landed = false;\n\t}\n\n\tget com() {\n\t\tlet [lx, ly] = this.localCom;\n\t\treturn [this.x + lx, this.y + ly];\n\t}\n\n\tget parentCelestial() {\n\t\tlet closest = null;\n\t\tlet closestDistance = 0;\n\n\t\tworld.celestials.forEach(c => {\n\t\t\tlet dis = this.distanceTo(c);\n\t\t\tif (closest === null || dis < closestDistance) {\n\t\t\t\tclosest = c;\n\t\t\t\tclosestDistance = dis;\n\t\t\t}\n\t\t});\n\n\t\tif (closestDistance > consts.MAX_PARENT_CELESTIAL_DISTANCE)\n\t\t\treturn null;\n\t\t\t\n\t\treturn closest;\n\t}\n\n\ttick() {\n\t\tthis.tickMotion();\n\t\tif (!this.landed) this.tickGravity(world.celestials);\n\t\tthis.resolveCollisions();\n\n\t\tthis.modules.forEach(m => {\n\t\t\tif (m.type == 'thruster' && m.power !== 0) {\n\t\t\t\tfor (let i = 0; i < 2; i++) particle.createThrustExhaust(m);\n\t\t\t}\n\t\t});\n\n\t\tthis.modules.forEach(m => m.reset());\n\n\t\tif (events.shipLanded != this.landed)\n\t\t\tthis.landed ? events.landShip() : events.launchShip();\n\t}\n\n\taddModule(x, y, properties, options) {\n\t\tlet module = new Module(x, y, this, {...properties, ...options});\n\t\tthis.modules.add(module);\n\t\tthis.refreshShape();\n\t}\n\n\tdeleteModule(module) {\n\t\tthis.modules.delete(module);\n\t\tthis.refreshShape();\n\t}\n\n\trefreshShape() {\n\t\tlet points = [];\n\t\tthis.modules.forEach(m => points.push([...m.localCom, m.mass]));\n\t\tthis.mass = points.reduce((a, [,,b]) => a + b, 0);\n\t\tthis.localCom = points.reduce(([ax, ay], [bx, by, bm]) =>\n\t\t\t[ax + bx * bm, ay + by * bm], [0, 0])\n\t\t\t.map(x => x / this.mass);\n\t\tlet [lx, ly] = this.localCom;\n\t\tthis.maxRadius = points.reduce((a, [bx, by]) =>\n\t\t\tMath.max(Math.sqrt((bx - lx) ** 2 + (by - ly) ** 2), a), 0) + 1;\n\t}\n\n\tresolveCollisions() {\n\t\tthis.landed = false;\n\n\t\tworld.celestials.forEach(c => {\n\t\t\tlet dis = this.distanceTo(c);\n\n\t\t\tif (dis < c.radius + this.maxRadius) {\n\t\t\t\tthis.modules.forEach(m => {\n\t\t\t\t\tthis.checkModuleCollision(m, c);\n\t\t\t\t});\n\t\t\t}\n\t\t})\n\t}\n\n\tresolveCelestialCollision(pos, cel) {\n\t\t//debugger;\n\t\tlet theta = this.angleTo(...this.com, ...cel.com);\n\t\tlet angleToCom = this.angleTo(...this.com, ...pos);\n\t\tlet angle = angleToCom - theta;\n\t\tlet [force] = this.rotateVector(0, 1, angle);\n\t\tif (Math.abs(angle) < consts.TIP_ANGLE) {\n\t\t\tforce *= -1;\n\t\t}\n\t\tif (Math.abs(angle) < 0.003\n\t\t\t&& Math.abs(this.rvel) < 0.001) {\n\t\t\tthis.landed = true;\n\t\t\tthis.rvel = 0;\n\t\t\tthis.r = theta - Math.PI / 2;\n\t\t}\n\t\tthis.rvel -= force * consts.TIP_SPEED;\n\t}\n\n\tcheckModuleCollision(module, body) {\n\t\tlet p = this.getWorldPoint(...module.localCom);\n\t\tlet dis = body.distanceTo({ com: p });\n\t\tif (dis < body.radius + 0.5 + consts.EPSILON) {\n\t\t\tthis.approach(body, dis - (body.radius + 0.5));\n\t\t\tthis.halt();\n\t\t\tthis.resolveCelestialCollision(p, body);\n\t\t}\n\t}\n\n\tapplyThrust({ forward = 0, left = 0, right = 0, back = 0,\n\t\tturnLeft = 0, turnRight = 0}) {\n\t\tlet turnForce = (turnRight - turnLeft) / 20;\n\t\tthis.applyDirectionalForce(0, -forward / 30, turnForce);\n\n\t\tthis.modules.forEach(m => {\n\t\t\tif (m.type !== 'thruster') return;\n\t\t\tm.power = forward;\n\t\t});\n\n\t}\n}\n","import {images as assets} from '../assets.mjs';\nimport Body from './body.mjs';\n\nexport default class Celestial extends Body {\n\tconstructor(x, y, radius, {\n\t\tdensity = 1,\n\t\ttype = 'rock'\n\t}) {\n\t\tlet mass = (radius ** 2) * density\n\t\tsuper(x, y, mass);\n\t\tthis.radius = radius;\n\n\t\tthis.type = type;\n\t\tlet imageArr = Object.values(assets.celestials[this.type]);\n\t\tthis.image = imageArr[Math.random() * imageArr.length | 0];\n\t}\n\n\tget com() {\n\t\treturn [this.x + this.radius, this.y + this.radius];\n\t}\n\n\tget escapeVelocity() {\n\t\t\n\t}\n\n\ttick() {\n\n\t}\n\n\tget diameter() {\n\t\treturn this.radius * 2;\n\t}\n}\n","export const modules = {\n\tcapsule: {\n\t\tsmall: {\n\t\t\tname: 'Small Capsule',\n\t\t\ttooltip: 'A small, simple capsule. Provides just enough ' +\n\t\t\t\t'rotational power for a small rocket.',\n\t\t\ttype: 'capsule',\n\t\t\tid: 'small',\n\t\t\tmass: 2,\n\t\t\trotation: 0.1\n\t\t}\n\t},\n\tfuel: {\n\t\tsmall: {\n\t\t\tname: 'Small Fuel Tank',\n\t\t\ttooltip: 'A small flimsy tank with enough fuel for a short trip.',\n\t\t\ttype: 'fuel',\n\t\t\tid: 'small',\n\t\t\tmass: 1,\n\t\t\tcapacity: 3\n\t\t}\n\t},\n\tthruster: {\n\t\tlight: {\n\t\t\tname: 'Light Main Thruster',\n\t\t\ttooltip: 'Powerful enough to lift a small ship, but not much ' +\n\t\t\t\t'more. Not very efficient.',\n\t\t\ttype: 'thruster',\n\t\t\tid: 'light',\n\t\t\tmass: 2,\n\t\t\tthrust: 10,\n\t\t\tisp: 200\n\t\t}\n\t}\n}\n","import Ship from './ship.mjs';\nimport Module from './module.mjs';\nimport Celestial from './celestial.mjs';\nimport {modules} from '../data.mjs';\nimport * as world from './index.mjs';\n\nexport function player() {\n\tlet ship = new Ship(0, -45);\n\tship.addModule(0, 0, modules.capsule.small);\n\tship.addModule(0, 1, modules.fuel.small, { filled: true });\n\tship.addModule(0, 2, modules.thruster.light);\n\tworld.ships.add(ship);\n\tworld.setPlayerShip(ship);\n\treturn ship;\n}\n\nexport function startPlanet() {\n\treturn celestial(0, 0, 40, {\n\t\tdensity: 10,\n\t\ttype: 'green'\n\t});\n}\n\nexport function celestial(x, y, radius, params) {\n\tlet celestial = new Celestial(x - radius, y - radius, radius, params);\n\tworld.celestials.add(celestial);\n\treturn celestial;\n}\n","import * as sector from './sector.mjs';\nimport * as spawn from './spawn.mjs';\n\nexport {getSectorFromWorld, getContainedSectors} from './sector.mjs';\n\nexport const entities = new Set();\nexport const celestials = new Set();\nexport const ships = new Set();\nexport const particles = new Set();\n\nexport let playerShip = null;\n\nexport function setPlayerShip(ship) {\n\tplayerShip = ship;\n}\n\nexport function init() {\n\tentities.clear();\n\tcelestials.clear();\n\tships.clear();\n\tparticles.clear();\n\tspawn.player();\n\tspawn.startPlanet();\n}\n\nexport function tick() {\n\tparticles.forEach(p => p.tick());\n\tcelestials.forEach(c => c.tick());\n\tentities.forEach(e => e.tick());\n\tships.forEach(s => s.tick());\n}\n","import * as world from '../world/index.mjs';\nimport * as inventory from './inventory.mjs';\n\nexport let ship;\n\nexport function init() {\n\tship = world.playerShip;\n}\n","import * as game from './index.mjs';\nimport * as graphics from '../graphics/index.mjs';\n\nexport function init() {\n\tgraphics.setZoom(20);\n}\n\nexport function end() {\n\n}\n","import * as game from './index.mjs';\nimport * as graphics from '../graphics/index.mjs';\nimport * as world from '../world/index.mjs';\nimport * as player from './player.mjs';\nimport * as edit from './edit.mjs';\n\nexport let shipLanded = false;\n\nexport function startGame() {\n\tgame.changeView('game');\n\tgraphics.perspective.focusPlayer();\n}\n\nexport function landShip() {\n\tshipLanded = true;\n\tgame.state.landed = true;\n}\n\nexport function launchShip() {\n\tshipLanded = false;\n\tgame.state.landed = false;\n}\n\nexport function editShip() {\n\tconsole.log('a');\n\tgraphics.changePerspective('parent', -5, 0);\n\tgame.state.editing = true;\n\tedit.init();\n}\n\nexport function endEditing() {\n\tgraphics.changePerspective('universe');\n\tgame.state.editing = false;\n\tedit.end();\n}\n","import * as gui from './index.mjs';\nimport {images as assets} from '../assets.mjs';\nimport {canvas} from '../graphics/index.mjs';\nimport GuiFrame from './frame.mjs';\nimport GuiImage from './image.mjs';\nimport GuiButton from './button.mjs';\nimport * as events from '../game/events.mjs';\nimport {state} from '../game/index.mjs';\n\nexport function root() {\n\treturn new GuiFrame(0, 0, canvas.width, canvas.height, {\n\t\tdraw: false\n\t});\n}\n\nexport function title() {\n\tlet shadow = root();\n\tlet logo = new GuiImage(assets.title.logo);\n\tshadow.append(logo);\n\tlogo.scaleImage({ w: shadow.w * 0.7 });\n\tlogo.posRelative({ x: 0.5, xc: 0.5, y: 0.2 });\n\n\t// TODO: Implement call to change view to game.\n\tlet startFunction = events.startGame;\n\tlet start = new GuiButton('Start game', events.startGame, 0, 0, 200);\n\tshadow.append(start);\n\tstart.posRelative({ x: 0.5, xc: 0.5, y: 0.7 });\n\n\tlet secondFunction = () => {};\n\tlet second = new GuiButton('Don\\'t start game', secondFunction, 0, 0, 200);\n\tshadow.append(second);\n\tsecond.posRelative({ x: 0.5, xc: 0.5, y: 0.7 });\n\tsecond.y += 60;\n\n\treturn shadow;\n}\n\nexport function game() {\n\tlet shadow = root();\n\n\tlet edit = new GuiButton('Edit rocket', events.editShip, 0, 0, 200);\n\tshadow.append(edit);\n\tedit.posRelative({ x: 0.5, xc: 0.5, y: 1 });\n\tedit.y -= 45;\n\tedit.tick = () => {\n\t\tedit.options.draw = state.landed && !state.editing;\n\t}\n\n\treturn shadow;\n}\n","import {context} from '../graphics/index.mjs';\nimport * as modules from './modules.mjs';\n\nexport const elements = new Set();\nexport let root;\n\nexport function init() {\n\telements.clear();\n\troot = modules.root();\n\tchangeView('title');\n}\n\nexport function tick() {\n\troot.tickElement();\n}\n\nexport function changeView(view) {\n\troot.clear();\n\n\tif (view == 'title') {\n\t\troot.append(modules.title());\n\t}\n\n\tif (view == 'game') {\n\t\troot.append(modules.game());\n\t}\n}\n\nexport function measureText(msg, font) {\n\tcontext.font = font;\n\tlet measurement = context.measureText(msg);\n\treturn [measurement.width, measurement.height];\n}\n","import {canvas, context} from './index.mjs';\n\nexport function text(string, x, y,\n\t{font = '52pt Arial', align = 'left', valign = 'top', color = null}) {\n\tcontext.textAlign = align;\n\tcontext.textBaseline = valign;\n\tcontext.fillStyle = color === null ? context.fillStyle : color;\n\tcontext.font = font;\n\n\tcontext.fillText(string, x, y);\n}\n","import {canvas, context} from './index.mjs';\nimport * as gui from '../gui/index.mjs';\nimport * as draw from './draw.mjs';\n\nexport function render() {\n\trenderElement(gui.root);\n}\n\nfunction renderElement(element) {\n\t//console.log(element.options);\n\tif (element.options.draw) {\n\t\tif (element.type == 'frame') renderFrame(element);\n\t\tif (element.type == 'image') renderImage(element);\n\t\tif (element.type == 'button') renderButton(element);\n\t}\n\telement.children.forEach(renderElement);\n}\n\nfunction renderFrame(element) {\n\tcontext.fillStyle = '#eb9';\n\tcontext.fillRect(...element.shape);\n}\n\nfunction renderImage(element) {\n\tcontext.drawImage(element.image, ...element.shape);\n}\n\nfunction renderButton(element) {\n\tif (element.mouseHeld) {\n\t\tcontext.fillStyle = '#706244';\n\t} else {\n\t\tcontext.fillStyle = element.mouseOver ? '#ad9869' : '#917f58';\n\t}\n\t\n\tcontext.fillRect(...element.shape);\n\tcontext.strokeStyle = '#541';\n\tcontext.strokeWidth = 4;\n\tcontext.strokeRect(...element.shape);\n\tcontext.textAlign = 'center';\n\tcontext.textBaseline = 'middle';\n\tcontext.fillStyle = '#fff';\n\tcontext.font = '12pt Consolas';\n\tcontext.fillText(element.text, ...element.center);\n}\n","import {canvas, context} from './index.mjs';\nimport {images as assets} from '../assets.mjs';\nimport * as world from '../world/index.mjs';\n\nexport function render() {\n\tworld.particles.forEach(renderParticle);\n\tworld.celestials.forEach(renderCelestial);\n\tworld.ships.forEach(renderShip);\n}\n\nfunction renderParticle(particle) {\n\tcontext.fillStyle = particle.color;\n\tcontext.fillRect(...particle.com, particle.size, particle.size);\n}\n\nfunction renderShip(ship) {\n\tcontext.save();\n\tcontext.translate(...ship.com);\n\tcontext.rotate(ship.r);\n\tlet [cx, cy] = ship.localCom;\n\tcontext.translate(-cx, -cy);\n\tship.modules.forEach(m => {\n\t\tcontext.drawImage(m.currentImage, m.x, m.y, 1, 1);\n\t});\n\tcontext.restore();\n}\n\nconst celestialImages = {\n\tgreen: Object.values(assets.celestials.green)\n}\n\nfunction renderCelestial(cel) {\n\tcontext.drawImage(cel.image, cel.x, cel.y,\n\t\tcel.diameter, cel.diameter);\n}\n","import {canvas, context, perspective} from './index.mjs';\nimport {images as assets} from '../assets.mjs';\n\nlet patterns = null;\n\nfunction init() {\n\tpatterns = {\n\t\tback: context.createPattern(assets.background.back, 'repeat'),\n\t\tmiddle: context.createPattern(assets.background.middle, 'repeat'),\n\t\tfront: context.createPattern(assets.background.front, 'repeat')\n\t};\n}\n\nexport function render(angle) {\n\tif (patterns === null) init();\n\n\trenderLayer(patterns.back, 0.3, 1, angle);\n\trenderLayer(patterns.middle, 0.5, 0.3, angle);\n\t//renderLayer(patterns.front, 0.7, 0.3, angle);\n}\n\nfunction renderLayer(pattern, speed = 1, scale = 1, angle = 0) {\n\tcontext.save();\n\tlet outset = (Math.abs(Math.cos(angle)) + Math.abs(Math.sin(angle)));\n\toutset = ((outset - 1) * canvas.width) / scale;\n\tlet [px, py] = [perspective.x * speed, perspective.y * speed];\n\tcontext.translate(-px, -py);\n\tcontext.scale(scale, scale);\n\tcontext.fillStyle = pattern;\n\tcontext.fillRect(px / scale - outset / 2, py / scale - outset / 2,\n\t\tcanvas.width / scale + outset, canvas.height / scale + outset);\n\tcontext.restore();\n}\n","import * as gui from './gui.mjs';\nimport * as draw from './draw.mjs';\nimport * as input from '../input.mjs';\nimport {render as renderWorld} from './world.mjs';\nimport {render as renderBackground} from './background.mjs';\nimport * as world from '../world/index.mjs';\nimport * as consts from '../consts.mjs';\n\nexport let canvas, context, tempCanvas, tempContext;\nexport let perspective;\n\nexport function init() {\n\tcanvas = document.querySelector('#main');\n\tcontext = canvas.getContext('2d');\n\ttempCanvas = document.querySelector('#temp');\n\ttempContext = tempCanvas.getContext('2d');\n\n\tcanvas.width = 600;\n\tcanvas.height = 600;\n\n\tperspective = new Perspective();\n\n\tdraw.text('Loading...', canvas.width / 2, canvas.height / 2,\n\t\t{ align: 'center', valign: 'middle' });\n}\n\nexport function render() {\n\tcontext.clearRect(0, 0, canvas.width, canvas.height);\n\tcontext.fillStyle = '#000';\n\tcontext.fillRect(0, 0, canvas.width, canvas.height);\n\n\tcontext.save();\n\tperspective.tick();\n\tperspective.transformRotate();\n\trenderBackground(perspective.rotation);\n\tperspective.transformCanvas();\n\trenderWorld();\n\tcontext.restore();\n\n\tgui.render();\n}\n\nexport function getVisibleSectors() {\n\treturn world.getContainedSectors(...perspective.bounds);\n}\n\nexport function changePerspective(rotationMode, shiftX = 0, shiftY = 0) {\n\tperspective.changeRotationMode(rotationMode);\n\tperspective.changeShift(shiftX, shiftY);\n\tperspective.transition = 1;\n}\n\nexport function changeZoom(delta) {\n\tperspective.zoomDelta(delta);\n}\n\nexport function setZoom(target) {\n\tperspective.changeZoom(target);\n}\n\nclass Perspective {\n\tconstructor() {\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t\tthis.shiftX = 0;\n\t\tthis.shiftY = 0;\n\t\tthis.zoom = 0;\n\t\tthis.bounds = [0, 0, canvas.width, canvas.height];\n\t\tthis.rotationMode = 'universe';\n\t\tthis.targetZoom = consts.DEFAULT_ZOOM;\n\t\tthis.oldTarget = 0;\n\t\tthis.oldShift = [0, 0];\n\t\tthis.oldZoom = 0;\n\t\tthis.transition = 0;\n\t\tthis.zoomTransition = 0;\n\t\tthis.reset();\n\t}\n\n\tchangeRotationMode(mode) {\n\t\tthis.oldTarget = this.targetRotation;\n\t\tthis.rotationMode = mode;\n\t}\n\n\tchangeShift(x, y) {\n\t\tthis.oldShift = this.currentShift;\n\t\t[this.shiftX, this.shiftY] = [x, y];\n\t}\n\n\tchangeZoom(zoom) {\n\t\tthis.oldZoom = this.currentZoom;\n\t\tthis.targetZoom = zoom;\n\t\tthis.zoomTransition = 1;\n\t}\n\n\tget currentShift() {\n\t\tlet [ox, oy] = this.oldShift;\n\t\treturn [this.interpolate(this.shiftX, ox),\n\t\t\tthis.interpolate(this.shiftY, oy)];\n\t}\n\n\tget currentRotation() {\n\t\treturn this.interpolate(this.targetRotation, this.oldTarget);\n\t}\n\n\tget currentZoom() {\n\t\tlet t = this.zoomTransition;\n\t\treturn (this.oldZoom * t + this.targetZoom * (1 - t));\n\t}\n\n\tinterpolate(cur, old, x = this.transition) {\n\t\treturn (old * x + cur * (1 - x));\n\t}\n\n\ttick() {\n\t\tif (this.focus !== null)\n\t\t\t[this.x, this.y] = this.focus.com;\n\n\t\tif (this.focus === null || this.rotationMode === 'universe') {\n\t\t\tthis.targetRotation = 0;\n\t\t} else if (this.rotationMode === 'parent') {\n\t\t\tlet parent = this.focus.parentCelestial;\n\t\t\tif (parent === null) {\n\t\t\t\tthis.targetRotation = 0;\n\t\t\t} else {\n\t\t\t\tlet a = this.focus.angleTo(...this.focus.com, ...parent.com);\n\t\t\t\tthis.targetRotation = a - Math.PI / 2;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.targetRotation = this.focus.r;\n\t\t}\n\n\t\tlet dif = Math.abs(this.targetRotation - this.rotation);\n\t\tthis.rotationMet = dif < (this.rotationMet ? 0.3 : 0.05);\n\n\t\tthis.rotation = this.currentRotation;\n\t\tthis.zoom = this.currentZoom;\n\n\t\tthis.transition *= 0.9;\n\t\tthis.zoomTransition *= 0.9;\n\n\t\tthis.normalize();\n\t}\n\n\treset() {\n\t\tthis.rotation = 0;\n\t\tthis.targetRotation = 0;\n\t\tthis.zoom = consts.DEFAULT_ZOOM;\n\t\tthis.targetZoom = this.zoom;\n\t\tthis.focus = null;\n\t\tthis.rotationFocus = null;\n\t}\n\n\tfocusPlayer() {\n\t\tthis.focus = world.playerShip;\n\t\tthis.rotationFocus = world.playerShip;\n\t}\n\n\tzoomDelta(delta) {\n\t\tlet factor = 1 + (consts.ZOOM_SPEED * Math.abs(delta));\n\t\tthis.targetZoom *= delta > 0 ? factor : 1 / factor;\n\t\tthis.normalize();\n\t}\n\n\tnormalize() {\n\t\tthis.targetZoom = Math.max(consts.MIN_ZOOM,\n\t\t\tMath.min(consts.MAX_ZOOM, this.targetZoom));\n\t\tthis.targetRotation %= (Math.PI * 2);\n\t}\n\n\ttransformRotate() {\n\t\tlet [,,bw, bh] = this.bounds;\n\t\tcontext.translate(bw / 2, bh / 2);\n\t\tcontext.rotate(-this.rotation);\n\t\tcontext.translate(-bw / 2, -bh / 2);\n\t}\n\n\trotateVector(x, y, r = this.rotation) {\n\t\treturn [(x * Math.cos(r) - y * Math.sin(r)),\n\t\t\t(y * Math.cos(r) - x * Math.sin(r))];\n\t}\n\n\ttransformCanvas() {\n\t\tlet [,,bw, bh] = this.bounds;\n\t\tlet [sx, sy] = this.rotateVector(...this.currentShift, -this.rotation);\n\t\tlet tx = -(this.x + sx) * this.zoom;\n\t\tlet ty = -(this.y + sy) * this.zoom;\n\t\tcontext.translate(tx + bw / 2, ty + bh / 2);\n\t\tcontext.scale(this.zoom, this.zoom);\n\t}\n}\n","import * as input from '../input.mjs';\nimport * as events from './events.mjs';\nimport * as player from './player.mjs';\nimport * as graphics from '../graphics/index.mjs';\nimport {state} from './index.mjs';\n\nexport const mapping = {\n\tthrust: 'KeyW',\n\tleft: 'KeyA',\n\tright: 'KeyD',\n\texitEdit: 'Escape'\n};\n\nlet held, pressed;\n\nexport function tick() {\n\theld = input.keyCode.held;\n\tpressed = input.keyCode.pressed;\n\n\tif (state.editing) {\n\t\ttickEditing();\n\t} else if (state.playing) {\n\t\ttickPlaying();\n\t}\n\n\tif (!state.editing) {\n\t\tif (input.mouse.scroll !== 0) {\n\t\t\tgraphics.changeZoom(-input.mouse.scroll);\n\t\t}\n\t}\n}\n\nfunction tickPlaying() {\n\tif (held[mapping.thrust]) {\n\t\tplayer.ship.applyThrust({ forward: 1 });\n\t}\n\n\tif (held[mapping.left]) {\n\t\tplayer.ship.applyThrust({ turnLeft: 1 });\n\t}\n\n\tif (held[mapping.right]) {\n\t\tplayer.ship.applyThrust({ turnRight: 1 });\n\t}\n}\n\nfunction tickEditing() {\n\tif (held[mapping.exitEdit]) {\n\t\tevents.endEditing();\n\t}\n}\n","import * as graphics from '../graphics/index.mjs';\nimport * as gui from '../gui/index.mjs';\nimport * as assets from '../assets.mjs';\nimport * as input from '../input.mjs';\nimport * as world from '../world/index.mjs';\nimport * as events from './events.mjs';\nimport * as control from './control.mjs';\nimport * as player from './player.mjs';\nimport * as edit from './edit.mjs';\n\nexport let state;\n\nexport async function init() {\n\tstate = {\n\t\tview: 'menu',\n\t\tplaying: false,\n\t\tediting: false,\n\t\tpaused: false\n\t};\n\n\tgraphics.init();\n\tawait assets.init();\n\tgui.init();\n\tinput.init();\n\n\t//events.startGame();\n\n\t//tick(); return;\n\n\t// Recursive `requestAnimationFrame` can cause problems with Parcel.\n\twhile(true) {\n\t\tawait tick();\n\t\tawait new Promise(res => requestAnimationFrame(res));\n\t}\n}\n\nexport function changeView(view) {\n\tstate.view = view;\n\tgui.changeView(view);\n\n\tif (view == 'game') {\n\t\tstate.playing = true;\n\t\tstate.editing = false;\n\t\tstate.paused = false;\n\t\tworld.init();\n\t\tplayer.init();\n\t}\n}\n\nasync function tick() {\n\tif (state.view == 'game') {\n\t\tworld.tick();\n\t\tcontrol.tick();\n\t}\n\n\tgui.tick();\n\tgraphics.render();\n\tinput.tick();\n}\n","import { init } from './game/index.mjs';\n\nwindow.addEventListener('load', init);\n"],"names":["init","input.mouse","assets","G","world.celestials","consts.MAX_PARENT_CELESTIAL_DISTANCE","particle.createThrustExhaust","events.shipLanded","events.landShip","events.launchShip","consts.TIP_ANGLE","consts.TIP_SPEED","consts.EPSILON","world.ships","world.setPlayerShip","spawn.player","spawn.startPlanet","tick","world.playerShip","graphics.setZoom","game.changeView","graphics.perspective","game.state","graphics.changePerspective","edit.init","events.startGame","events.editShip","root","modules.root","modules.title","modules.game","gui.root","render","world.particles","draw.text","renderBackground","renderWorld","gui.render","consts.DEFAULT_ZOOM","consts.ZOOM_SPEED","consts.MIN_ZOOM","consts.MAX_ZOOM","mapping","input.keyCode","graphics.changeZoom","player.ship","events.endEditing","graphics.init","assets.init","gui.init","input.init","changeView","gui.changeView","world.init","player.init","world.tick","control.tick","gui.tick","graphics.render","input.tick"],"mappings":"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"} \ No newline at end of file diff --git a/js/consts.mjs b/js/consts.mjs index 00b9124..1bf711a 100644 --- a/js/consts.mjs +++ b/js/consts.mjs @@ -18,9 +18,11 @@ export const MAX_ZOOM = 100; export const DEFAULT_ZOOM = 10; export const ZOOM_SPEED = 0.01; // Ship landing. Angle in radians. -export const TIP_ANGLE = 30.3; +export const TIP_ANGLE = 0.3; export const TIP_SPEED = 0.015; // Ship flight mechanics. Speed measured in units per tick. export const FUEL_BURN_RATE = 0.01; // Distance at which an orbited planet will not be considered a parent body. export const MAX_PARENT_CELESTIAL_DISTANCE = 120; +// Ship editing. +export const EDIT_MARGIN = 2; diff --git a/js/game/edit.mjs b/js/game/edit.mjs index 4d40a80..9b635a1 100644 --- a/js/game/edit.mjs +++ b/js/game/edit.mjs @@ -1,10 +1,66 @@ import * as game from './index.mjs'; import * as graphics from '../graphics/index.mjs'; +import * as world from '../world/index.mjs'; +import * as consts from '../consts.mjs'; + +export let tiles = new Map(); +export let width = 0; +export let height = 0; +export let position = [0, 0]; +export let bounds = [0, 0, 0, 0]; +export let currentModule = null; export function init() { - graphics.setZoom(20); + let ship = world.playerShip; + let modules = ship.modules; + let margin = consts.EDIT_MARGIN; + + modules.forEach(m => { + let pos = [m.x, m.y]; + tiles.set(posId(...pos), new Tile(...pos, m)); + }); + + let [sx, ex, sy, ey] = getBoundaries(); + [width, height] = [ex - sx + margin * 2 + 1, ey - sy + margin * 2 + 1]; + position = [sx - margin, sy - margin]; + let neededZoom = graphics.canvas.width / (Math.max(width, height) + 10); + + graphics.changePerspective('planet', 0, -5); + graphics.setZoom(neededZoom); } export function end() { } + +export function getTile(x, y) { + let id = posId(x, y); + if (!tiles.has(id)) + tiles.set(id, new Tile(x, y, null)); + return tiles.get(id); +} + +function posId(x, y) { + return `${x}.${y}`; +} + +function getBoundaries() { + return [0, 0, 0, 2]; +} + +class Tile { + constructor(x, y, module) { + this.module = module; + this.x = x; + this.y = y; + } + + get valid() { + return true; + } + + get drawPos() { + let [px, py] = pos; + return [this.x + px, this.y + py]; + } +} diff --git a/js/game/events.mjs b/js/game/events.mjs index 76c3804..f451efe 100644 --- a/js/game/events.mjs +++ b/js/game/events.mjs @@ -22,8 +22,6 @@ export function launchShip() { } export function editShip() { - console.log('a'); - graphics.changePerspective('parent', -5, 0); game.state.editing = true; edit.init(); } diff --git a/js/graphics/edit.mjs b/js/graphics/edit.mjs new file mode 100644 index 0000000..01b972b --- /dev/null +++ b/js/graphics/edit.mjs @@ -0,0 +1,16 @@ +import {context} from './index.mjs'; +import * as edit from '../game/edit.mjs'; +import * as world from '../world/index.mjs'; + +export function render() { + let ship = world.playerShip; + + context.save(); + context.translate(...ship.com); + context.rotate(ship.r); + let [cx, cy] = ship.localCom; + + context.translate(-cx, -cy); + + context.restore(); +} diff --git a/js/graphics/gui.mjs b/js/graphics/gui.mjs index a877fd2..c59efb6 100644 --- a/js/graphics/gui.mjs +++ b/js/graphics/gui.mjs @@ -12,8 +12,12 @@ function renderElement(element) { if (element.type == 'frame') renderFrame(element); if (element.type == 'image') renderImage(element); if (element.type == 'button') renderButton(element); + if (element.type == 'edit') renderEdit(element); + if (element.type == 'itemButton') renderItemButton(element); } - element.children.forEach(renderElement); + + if (element.options.drawChildren) + element.children.forEach(renderElement); } function renderFrame(element) { @@ -31,7 +35,7 @@ function renderButton(element) { } else { context.fillStyle = element.mouseOver ? '#ad9869' : '#917f58'; } - + context.fillRect(...element.shape); context.strokeStyle = '#541'; context.strokeWidth = 4; @@ -42,3 +46,40 @@ function renderButton(element) { context.font = '12pt Consolas'; context.fillText(element.text, ...element.center); } + +function renderItemButton(element) { + context.globalAlpha = 0.5; + if (element.mouseHeld) { + context.fillStyle = '#080808'; + } else { + context.fillStyle = element.mouseOver ? '#222' : '#0e0e0e'; + } + + context.fillRect(...element.shape); + context.strokeStyle = '#333'; + context.strokeWidth = 4; + context.strokeRect(...element.shape); + context.globalAlpha = 1; + + if (element.image) { + context.drawImage(element.image, ...element.shape); + } +} + +function renderEdit(element) { + /* + element.tiles.forEach(t => { + let tile = edit.getTile(x, y); + let [dx, dy] = tile.drawPos; + context.globalAlpha = 0.5; + context.fillStyle = '#000'; + context.fillRect(dx, dy, 1, 1); + context.globalAlpha = 1; + + let module = tile.module; + if (module !== null) { + context.drawImage(module.currentImage, dx, dy, 1, 1); + } + }); + */ +} diff --git a/js/graphics/index.mjs b/js/graphics/index.mjs index 98d7e37..3327e6f 100644 --- a/js/graphics/index.mjs +++ b/js/graphics/index.mjs @@ -3,6 +3,7 @@ import * as draw from './draw.mjs'; import * as input from '../input.mjs'; import {render as renderWorld} from './world.mjs'; import {render as renderBackground} from './background.mjs'; +import {render as renderEdit} from './edit.mjs'; import * as world from '../world/index.mjs'; import * as consts from '../consts.mjs'; @@ -77,7 +78,7 @@ class Perspective { } changeRotationMode(mode) { - this.oldTarget = this.targetRotation; + this.oldTarget = this.currentRotation; this.rotationMode = mode; } @@ -181,7 +182,7 @@ class Perspective { transformCanvas() { let [,,bw, bh] = this.bounds; - let [sx, sy] = this.rotateVector(...this.currentShift, -this.rotation); + let [sx, sy] = this.rotateVector(...this.currentShift, this.rotation); let tx = -(this.x + sx) * this.zoom; let ty = -(this.y + sy) * this.zoom; context.translate(tx + bw / 2, ty + bh / 2); diff --git a/js/graphics/world.mjs b/js/graphics/world.mjs index a9381e7..78a11f4 100644 --- a/js/graphics/world.mjs +++ b/js/graphics/world.mjs @@ -1,6 +1,8 @@ import {canvas, context} from './index.mjs'; import {images as assets} from '../assets.mjs'; import * as world from '../world/index.mjs'; +import * as edit from './edit.mjs'; +import {state} from '../game/index.mjs'; export function render() { world.particles.forEach(renderParticle); @@ -20,6 +22,10 @@ function renderShip(ship) { let [cx, cy] = ship.localCom; context.translate(-cx, -cy); ship.modules.forEach(m => { + let [mx, my] = [m.x, m.y]; + if (state.editing) { + + } context.drawImage(m.currentImage, m.x, m.y, 1, 1); }); context.restore(); diff --git a/js/gui/edit.mjs b/js/gui/edit.mjs new file mode 100644 index 0000000..80df1a5 --- /dev/null +++ b/js/gui/edit.mjs @@ -0,0 +1,69 @@ +import * as gui from './index.mjs'; +import GuiElement from './element.mjs'; +import GuiItemButton from './item.mjs'; +import {state} from '../game/index.mjs'; +import * as edit from '../game/edit.mjs'; + +export default class GuiEdit extends GuiElement { + constructor(x, y, w = 100, h = 30) { + super(x, y, w, h); + this.type = 'edit'; + this.tileWidth = 0; + this.tileHeight = 0; + this.active = false; + } + + updateTiles() { + this.children.clear(); + + [this.tileWidth, this.tileHeight] = [edit.width, edit.height]; + + let tileRatio = this.tileWidth / this.tileHeight; + let rectRatio = this.w / this.h; + let tileSize; + let [ox, oy] = [0, 0]; + + if (tileRatio < rectRatio) { + tileSize = this.h / this.tileHeight; + ox = (this.w - (tileSize * this.tileWidth)) / 2; + } else { + tileSize = this.w / this.tileWidth; + oy = (this.h - (tileSize * this.tileHeight)) / 2; + } + + let spacing = 0.1 * tileSize; + + for (let x = 0; x < this.tileWidth; x++) + for (let y = 0; y < this.tileHeight; y++) { + let tile = this.getTile(x, y); + let ex = x * tileSize + spacing / 2 + ox + this.x; + let ey = y * tileSize + spacing / 2 + oy + this.y; + let [ew, eh] = [tileSize - spacing, tileSize - spacing]; + + let onclick = (button) => { + this.tileClicked(x, y, button); + }; + + let el = new GuiItemButton(tile.module, onclick, ex, ey, ew, eh); + this.append(el); + } + } + + tick() { + if (state.editing && !this.active) this.updateTiles(); + this.active = state.editing; + this.options.draw = this.options.drawChildren = this.active; + if (!this.active) return; + + [this.tileWidth, this.tileHeight] = [edit.width, edit.height]; + } + + getTile(x, y) { + let [px, py] = edit.position; + return edit.getTile(x + px, y + py); + } + + tileClicked(x, y, button) { + console.log(x, y, button); + } +} diff --git a/js/gui/inventory.mjs b/js/gui/inventory.mjs new file mode 100644 index 0000000..e69de29 diff --git a/js/gui/item.mjs b/js/gui/item.mjs new file mode 100644 index 0000000..1a997d6 --- /dev/null +++ b/js/gui/item.mjs @@ -0,0 +1,18 @@ +import * as gui from './index.mjs'; +import GuiButton from './button.mjs'; + +export default class GuiItemButton extends GuiButton { + constructor(module, onclick, x, y, w = 50, h = 50) { + super(null, onclick, x, y, w, h); + this.image = module === null ? null : module.currentImage; + this.type = 'itemButton'; + } + + click() { + this.onclick('left'); + } + + rightClick() { + this.onclick('right'); + } +} diff --git a/js/gui/misc.mjs b/js/gui/misc.mjs index 69d1577..c518d1a 100644 --- a/js/gui/misc.mjs +++ b/js/gui/misc.mjs @@ -9,10 +9,15 @@ export class Rect { this.onclick = null; this.mouseHeld = false; + + this.rightMouseHeld = false; + this.onRightClick = null; } click() {} + rightClick() {} + tickMouse() { if (this.mouseHeld == true && !input.mouse.held[0] && this.mouseOver) this.click(); @@ -20,6 +25,14 @@ export class Rect { this.mouseHeld = true; if (!input.mouse.held[0]) this.mouseHeld = false; + + if (this.rightMouseHeld == true && !input.mouse.held[2] + &&this.mouseOver) + this.rightClick(); + if (!this.rightMouseHeld && input.mouse.pressed[2] && this.mouseOver) + this.rightMouseHeld = true; + if (!input.mouse.held[2]) + this.rightMouseHeld = false; } get shape() { diff --git a/js/gui/modules.mjs b/js/gui/modules.mjs index bfe7fcb..94343df 100644 --- a/js/gui/modules.mjs +++ b/js/gui/modules.mjs @@ -4,6 +4,7 @@ import {canvas} from '../graphics/index.mjs'; import GuiFrame from './frame.mjs'; import GuiImage from './image.mjs'; import GuiButton from './button.mjs'; +import GuiEdit from './edit.mjs'; import * as events from '../game/events.mjs'; import {state} from '../game/index.mjs'; @@ -38,13 +39,19 @@ export function title() { export function game() { let shadow = root(); - let edit = new GuiButton('Edit rocket', events.editShip, 0, 0, 200); - shadow.append(edit); - edit.posRelative({ x: 0.5, xc: 0.5, y: 1 }); - edit.y -= 45; - edit.tick = () => { - edit.options.draw = state.landed && !state.editing; + let editButton = new GuiButton('Edit rocket', events.editShip, 0, 0, 200); + shadow.append(editButton); + editButton.posRelative({ x: 0.5, xc: 0.5, y: 1 }); + editButton.y -= 45; + editButton.tick = () => { + editButton.options.draw = state.landed && !state.editing; } + let edit = new GuiEdit(0, 0, 0, 0); + shadow.append(edit); + edit.posRelative({x: 0.45, y: 0, w: 0.55, h: 0.6}); + edit.x -= 10; + edit.y += 10; + return shadow; } diff --git a/js/input.mjs b/js/input.mjs index 521b46d..b4f1d72 100644 --- a/js/input.mjs +++ b/js/input.mjs @@ -48,4 +48,8 @@ export function init() { window.addEventListener('wheel', event => { mouse.scroll = event.deltaY; }); + + window.addEventListener('contextmenu', event => { + event.preventDefault(); + }); } diff --git a/js/world/ship.mjs b/js/world/ship.mjs index 15ad0d8..dd5ebc2 100644 --- a/js/world/ship.mjs +++ b/js/world/ship.mjs @@ -35,14 +35,14 @@ export default class Ship extends Body { if (closestDistance > consts.MAX_PARENT_CELESTIAL_DISTANCE) return null; - + return closest; } tick() { - this.tickMotion(); + if (!state.editing) this.tickMotion(); if (!this.landed) this.tickGravity(world.celestials); - this.resolveCollisions(); + if (!state.editing) this.resolveCollisions(); this.modules.forEach(m => { if (m.type == 'thruster' && m.power !== 0) {