1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2026-02-11 18:39:21 +00:00

Merge pull request #3 from tobspr/master

a
This commit is contained in:
mse-k 2020-05-28 18:58:34 -04:00 committed by GitHub
commit c8b072c7d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
72 changed files with 1389 additions and 535 deletions

View File

@ -1,25 +1,25 @@
env: env:
browser: true browser: true
es6: true es6: true
extends: extends:
- 'eslint:recommended' - "eslint:recommended"
- 'plugin:@typescript-eslint/eslint-recommended' - "plugin:@typescript-eslint/eslint-recommended"
- 'prettier' - "prettier"
globals: globals:
Atomics: readonly Atomics: readonly
SharedArrayBuffer: readonly SharedArrayBuffer: readonly
parser: '@typescript-eslint/parser' parser: "@typescript-eslint/parser"
parserOptions: parserOptions:
ecmaVersion: 6 ecmaVersion: 6
sourceType: 'module' sourceType: "module"
ecmaFeatures: ecmaFeatures:
- modules: true - modules: true
plugins: plugins:
- '@typescript-eslint' - "@typescript-eslint"
- 'prettier' - "prettier"
rules: rules:
prettier/prettier: error prettier/prettier: error
no-undef: off no-undef: off
no-unused-vars: off no-unused-vars: off
no-prototype-builtins: off no-prototype-builtins: off
linebreak-style: off

View File

@ -1,42 +1,41 @@
name: CI name: CI
on: on:
push: push:
branches: branches:
- master - master
- ModdedGamers-GH-Actions - ModdedGamers-GH-Actions
pull_request: pull_request:
branches: branches:
- master - master
jobs: jobs:
setup: setup:
name: CI
name: CI runs-on: ubuntu-latest
runs-on: ubuntu-latest steps:
- name: Install Dependencies
run: |
sudo apt-get update
sudo apt-get install ffmpeg
steps: - name: Setup Node
- name: Install Dependencies uses: actions/setup-node@v2-beta
run: | with:
sudo apt-get update node-version: 10.x
sudo apt-get install ffmpeg
- name: Setup Node - name: Checkout repo
uses: actions/setup-node@v2-beta uses: actions/checkout@v2
with:
node-version: 10.x
- name: Checkout repo - name: Install Yarn Dependencies
uses: actions/checkout@v2 run: |
yarn
cd gulp/
yarn
cd ..
- name: Install Yarn Dependencies - name: Lint
run: | run: |
yarn yarn lint
cd gulp/
yarn
cd ..
- name: Lint
run: |
npx eslint src/js

2
.gitignore vendored
View File

@ -110,3 +110,5 @@ build
tmp_standalone_files tmp_standalone_files
# Github Actions files
.github/workflows

View File

@ -8,4 +8,4 @@ useTabs: false
quoteProps: "consistent" quoteProps: "consistent"
bracketSpacing: true bracketSpacing: true
arrowParens: avoid arrowParens: avoid
endOfLine: "lf" endOfLine: auto

167
.travis.yml Normal file
View File

@ -0,0 +1,167 @@
# validate config at https://config.travis-ci.com/explore
os: linux
dist: xenial
language: node_js
node_js:
- "10"
cache: yarn
# platform specific configuration
jobs:
# jobs which have to succeed
include:
# OS: MAC
## -> build darwin
- name: "Standalone MacOS on MacOS"
os: osx
osx_image: xcode11.3
before_install:
- HOMEBREW_NO_AUTO_UPDATE=1 brew install git-lfs
- HOMEBREW_NO_AUTO_UPDATE=1 brew install ffmpeg
script:
- cd gulp
- yarn gulp build.standalone-prod || travis_terminate 1
- yarn gulp standalone.prepare
- yarn gulp standalone.package.prod.darwin64
- cd ..
## -> build win
- name: "Standalone Windows on MacOS"
os: osx
osx_image: xcode11.3
before_install:
- HOMEBREW_NO_AUTO_UPDATE=1 brew install git-lfs
- HOMEBREW_NO_AUTO_UPDATE=1 brew install ffmpeg
- HOMEBREW_NO_AUTO_UPDATE=1 brew cask install wine-stable
# prevent Wine popup dialogs about installing additional packages
- export WINEDLLOVERRIDES="mscoree,mshtml="
- export WINEDEBUG="-all"
script:
- cd gulp
- yarn gulp build.standalone-prod || travis_terminate 1
- yarn gulp standalone.prepare
- yarn gulp standalone.package.prod.win64
- yarn gulp standalone.package.prod.win32
- cd ..
## -> build linux
- name: "Standalone Linux on MacOS"
os: osx
osx_image: xcode11.3
before_install:
- HOMEBREW_NO_AUTO_UPDATE=1 brew install git-lfs
- HOMEBREW_NO_AUTO_UPDATE=1 brew install ffmpeg
script:
- cd gulp
- yarn gulp build.standalone-prod || travis_terminate 1
- yarn gulp standalone.prepare
- yarn gulp standalone.package.prod.linux64
- yarn gulp standalone.package.prod.linux32
- cd ..
# OS: LINUX
## -> build darwin
## not possible
## -> build win
- name: "Standalone Windows on Linux"
os: linux
addons:
apt:
packages:
- libavformat-dev
- libavfilter-dev
- libavdevice-dev
- ffmpeg
- wine
script:
- cd gulp
- yarn gulp build.standalone-prod || travis_terminate 1
- yarn gulp standalone.prepare
- yarn gulp standalone.package.prod.win64
- yarn gulp standalone.package.prod.win32
- cd ..
## -> build linux
- name: "Standalone Linux on Linux"
os: linux
addons:
apt:
packages:
- libavformat-dev
- libavfilter-dev
- libavdevice-dev
- ffmpeg
script:
- cd gulp
- yarn gulp build.standalone-prod || travis_terminate 1
- yarn gulp standalone.prepare
- yarn gulp standalone.package.prod.linux64
- yarn gulp standalone.package.prod.linux32
- cd ..
# OS: WINDOWS
## -> build darwin
## not possible
## -> build linux
- name: "Standalone Linux on Windows"
os: windows
env: YARN_GPG=no
before_install:
- choco install git-lfs -y -f || echo "0" # choco fails but git-lfs is still installed
- choco install ffmpeg
- export PATH=/C/ProgramData/chocolatey/lib/ffmpeg/tools/ffmpeg/bin:$PATH
- wget https://github.com/moiamond/docker-ffmpeg-base-windowsservercore/raw/master/System32/avicap32.dll -P /C/Windows/System32/
- wget https://github.com/moiamond/docker-ffmpeg-base-windowsservercore/raw/master/System32/msvfw32.dll -P /C/Windows/System32/
script:
- cd gulp
- yarn gulp build.standalone-prod || travis_terminate 1
- yarn gulp standalone.prepare
- yarn gulp standalone.package.prod.linux64
- yarn gulp standalone.package.prod.linux32
- cd ..
## -> build win
- name: "Standalone Windows on Windows"
os: windows
env: YARN_GPG=no
before_install:
- choco install git-lfs -y -f || echo "0" # choco fails but git-lfs is still installed
- choco install ffmpeg
- choco install wget
- export PATH=/C/ProgramData/chocolatey/lib/ffmpeg/tools/ffmpeg/bin:$PATH
- wget https://github.com/moiamond/docker-ffmpeg-base-windowsservercore/raw/master/System32/avicap32.dll -P /C/Windows/System32/
- wget https://github.com/moiamond/docker-ffmpeg-base-windowsservercore/raw/master/System32/msvfw32.dll -P /C/Windows/System32/
script:
- cd gulp
- yarn gulp build.standalone-prod || travis_terminate 1
- yarn gulp standalone.prepare
- yarn gulp standalone.package.prod.win64
- yarn gulp standalone.package.prod.win32
- cd ..
# mark build as finished even if "allow_failures" are still running
fast_finish: true
# optional jobs which may fail
#allow_failures:
# - name: ""
# shared
install:
- git lfs install
- git lfs pull
- yarn
# electron dependencies
- cd electron
- yarn
- cd ..
# gulp dependendencies
- cd gulp
- yarn
- cd ..

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
electron/favicon.icns Normal file

Binary file not shown.

View File

@ -292,7 +292,7 @@ function gulptasksHTML($, gulp, buildFolder, browserSync) {
}); });
gulp.task("html.prod", () => { gulp.task("html.prod", () => {
return buildHtml("https://api.shapez.io", { return buildHtml("https://analytics.shapez.io", {
analytics: true, analytics: true,
}); });
}); });
@ -315,7 +315,7 @@ function gulptasksHTML($, gulp, buildFolder, browserSync) {
}); });
gulp.task("html.standalone-prod", () => { gulp.task("html.standalone-prod", () => {
return buildHtml("https://api.shapez.io", { return buildHtml("https://analytics.shapez.io", {
analytics: false, analytics: false,
standalone: true, standalone: true,
enableCachebust: false, enableCachebust: false,

View File

@ -46,7 +46,6 @@ function gulptasksJS($, gulp, buildFolder, browserSync) {
requireUncached("./webpack.production.config.js")({ requireUncached("./webpack.production.config.js")({
enableAssert: true, enableAssert: true,
environment: "staging", environment: "staging",
apiEndpoint: "https://api-staging.shapez.io/v1",
es6: false, es6: false,
}) })
) )
@ -63,7 +62,6 @@ function gulptasksJS($, gulp, buildFolder, browserSync) {
requireUncached("./webpack.production.config.js")({ requireUncached("./webpack.production.config.js")({
enableAssert: true, enableAssert: true,
environment: "staging", environment: "staging",
apiEndpoint: "https://api-staging.shapez.io/v1",
es6: true, es6: true,
}) })
) )
@ -81,7 +79,6 @@ function gulptasksJS($, gulp, buildFolder, browserSync) {
requireUncached("./webpack.production.config.js")({ requireUncached("./webpack.production.config.js")({
enableAssert: false, enableAssert: false,
environment: "prod", environment: "prod",
apiEndpoint: "https://api.shapez.io/v1",
es6: false, es6: false,
}) })
) )
@ -100,7 +97,6 @@ function gulptasksJS($, gulp, buildFolder, browserSync) {
enableAssert: false, enableAssert: false,
environment: "prod", environment: "prod",
es6: true, es6: true,
apiEndpoint: "https://api.shapez.io/v1",
}) })
) )
) )
@ -148,7 +144,6 @@ function gulptasksJS($, gulp, buildFolder, browserSync) {
requireUncached("./webpack.production.config.js")({ requireUncached("./webpack.production.config.js")({
enableAssert: true, enableAssert: true,
environment: "staging", environment: "staging",
apiEndpoint: "https://api-staging.shapez.io/v1",
es6: true, es6: true,
standalone: true, standalone: true,
}) })
@ -165,7 +160,6 @@ function gulptasksJS($, gulp, buildFolder, browserSync) {
requireUncached("./webpack.production.config.js")({ requireUncached("./webpack.production.config.js")({
enableAssert: false, enableAssert: false,
environment: "prod", environment: "prod",
apiEndpoint: "https://api.shapez.io/v1",
es6: true, es6: true,
standalone: true, standalone: true,
}) })

View File

@ -21,8 +21,11 @@ function gulptasksStandalone($, gulp, buildFolder) {
path.join(electronBaseDir, "lib", "**", "*.node"), path.join(electronBaseDir, "lib", "**", "*.node"),
path.join(electronBaseDir, "node_modules", "**", "*.*"), path.join(electronBaseDir, "node_modules", "**", "*.*"),
path.join(electronBaseDir, "node_modules", "**", ".*"), path.join(electronBaseDir, "node_modules", "**", ".*"),
path.join(electronBaseDir, "node_modules", "**", "*"),
path.join(electronBaseDir, "favicon*"), path.join(electronBaseDir, "favicon*"),
// fails on platforms which support symlinks
// https://github.com/gulpjs/gulp/issues/1427
// path.join(electronBaseDir, "node_modules", "**", "*"),
]; ];
return gulp.src(requiredFiles, { base: electronBaseDir }).pipe(gulp.dest(tempDestBuildDir)); return gulp.src(requiredFiles, { base: electronBaseDir }).pipe(gulp.dest(tempDestBuildDir));
}); });

View File

@ -32,9 +32,6 @@ module.exports = ({ watch = false, standalone = false }) => {
"window.assert(false, 'abstract method called of: ' + (this.name || (this.constructor && this.constructor.name)));", "window.assert(false, 'abstract method called of: ' + (this.name || (this.constructor && this.constructor.name)));",
G_HAVE_ASSERT: "true", G_HAVE_ASSERT: "true",
G_APP_ENVIRONMENT: JSON.stringify("dev"), G_APP_ENVIRONMENT: JSON.stringify("dev"),
G_API_ENDPOINT: JSON.stringify(
lzString.compressToEncodedURIComponent("http://localhost:5005/v1")
),
G_TRACKING_ENDPOINT: JSON.stringify( G_TRACKING_ENDPOINT: JSON.stringify(
lzString.compressToEncodedURIComponent("http://localhost:10005/v1") lzString.compressToEncodedURIComponent("http://localhost:10005/v1")
), ),

View File

@ -13,7 +13,6 @@ const UnusedFilesPlugin = require("unused-files-webpack-plugin").UnusedFilesWebp
module.exports = ({ module.exports = ({
enableAssert = false, enableAssert = false,
apiEndpoint,
environment, environment,
es6 = false, es6 = false,
standalone = false, standalone = false,
@ -30,7 +29,6 @@ module.exports = ({
G_IS_STANDALONE: standalone ? "true" : "false", G_IS_STANDALONE: standalone ? "true" : "false",
G_IS_BROWSER: isBrowser ? "true" : "false", G_IS_BROWSER: isBrowser ? "true" : "false",
G_IS_MOBILE_APP: mobileApp ? "true" : "false", G_IS_MOBILE_APP: mobileApp ? "true" : "false",
G_API_ENDPOINT: JSON.stringify(lzString.compressToEncodedURIComponent(apiEndpoint)),
G_TRACKING_ENDPOINT: JSON.stringify( G_TRACKING_ENDPOINT: JSON.stringify(
lzString.compressToEncodedURIComponent("https://tracking.shapez.io/v1") lzString.compressToEncodedURIComponent("https://tracking.shapez.io/v1")
), ),

View File

@ -9,6 +9,7 @@
"scripts": { "scripts": {
"dev": "./gulp/gulp main.serveDev", "dev": "./gulp/gulp main.serveDev",
"tslint": "cd src/js && tsc", "tslint": "cd src/js && tsc",
"lint": "npx eslint src/js",
"prettier-all": "prettier --write src/**/*.* && prettier --write gulp/**/*.*", "prettier-all": "prettier --write src/**/*.* && prettier --write gulp/**/*.*",
"publishOnItch": "butler push tmp_standalone_files/shapez.io-standalone-win32-x64 tobspr/shapezio:windows --userversion-file version" "publishOnItch": "butler push tmp_standalone_files/shapez.io-standalone-win32-x64 tobspr/shapezio:windows --userversion-file version"
}, },

BIN
res/ui/icons/waypoint.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 B

View File

@ -2,7 +2,7 @@
"sprites/belt/forward_0.png": "sprites/belt/forward_0.png":
{ {
"frame": {"x":160,"y":26,"w":13,"h":13}, "frame": {"x":204,"y":26,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -10,7 +10,7 @@
}, },
"sprites/belt/forward_1.png": "sprites/belt/forward_1.png":
{ {
"frame": {"x":177,"y":26,"w":13,"h":13}, "frame": {"x":221,"y":26,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -18,7 +18,7 @@
}, },
"sprites/belt/forward_2.png": "sprites/belt/forward_2.png":
{ {
"frame": {"x":194,"y":26,"w":13,"h":13}, "frame": {"x":238,"y":26,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -26,7 +26,7 @@
}, },
"sprites/belt/forward_3.png": "sprites/belt/forward_3.png":
{ {
"frame": {"x":211,"y":26,"w":13,"h":13}, "frame": {"x":255,"y":26,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -34,7 +34,7 @@
}, },
"sprites/belt/forward_4.png": "sprites/belt/forward_4.png":
{ {
"frame": {"x":228,"y":26,"w":13,"h":13}, "frame": {"x":272,"y":26,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -42,7 +42,7 @@
}, },
"sprites/belt/forward_5.png": "sprites/belt/forward_5.png":
{ {
"frame": {"x":245,"y":26,"w":13,"h":13}, "frame": {"x":245,"y":112,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -50,7 +50,7 @@
}, },
"sprites/belt/left_0.png": "sprites/belt/left_0.png":
{ {
"frame": {"x":167,"y":112,"w":13,"h":13}, "frame": {"x":262,"y":112,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -58,7 +58,7 @@
}, },
"sprites/belt/left_1.png": "sprites/belt/left_1.png":
{ {
"frame": {"x":184,"y":112,"w":13,"h":13}, "frame": {"x":279,"y":112,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -66,7 +66,7 @@
}, },
"sprites/belt/left_2.png": "sprites/belt/left_2.png":
{ {
"frame": {"x":201,"y":112,"w":13,"h":13}, "frame": {"x":296,"y":112,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -74,7 +74,7 @@
}, },
"sprites/belt/left_3.png": "sprites/belt/left_3.png":
{ {
"frame": {"x":262,"y":26,"w":13,"h":13}, "frame": {"x":313,"y":112,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -82,7 +82,7 @@
}, },
"sprites/belt/left_4.png": "sprites/belt/left_4.png":
{ {
"frame": {"x":279,"y":26,"w":13,"h":13}, "frame": {"x":289,"y":26,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -90,7 +90,7 @@
}, },
"sprites/belt/left_5.png": "sprites/belt/left_5.png":
{ {
"frame": {"x":218,"y":112,"w":13,"h":13}, "frame": {"x":306,"y":26,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -98,7 +98,7 @@
}, },
"sprites/belt/right_0.png": "sprites/belt/right_0.png":
{ {
"frame": {"x":235,"y":112,"w":13,"h":13}, "frame": {"x":330,"y":112,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -106,7 +106,7 @@
}, },
"sprites/belt/right_1.png": "sprites/belt/right_1.png":
{ {
"frame": {"x":296,"y":26,"w":13,"h":13}, "frame": {"x":347,"y":112,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -114,7 +114,7 @@
}, },
"sprites/belt/right_2.png": "sprites/belt/right_2.png":
{ {
"frame": {"x":252,"y":112,"w":13,"h":13}, "frame": {"x":323,"y":26,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -122,7 +122,7 @@
}, },
"sprites/belt/right_3.png": "sprites/belt/right_3.png":
{ {
"frame": {"x":269,"y":112,"w":13,"h":13}, "frame": {"x":364,"y":111,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -130,7 +130,7 @@
}, },
"sprites/belt/right_4.png": "sprites/belt/right_4.png":
{ {
"frame": {"x":313,"y":26,"w":13,"h":13}, "frame": {"x":381,"y":111,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -138,7 +138,7 @@
}, },
"sprites/belt/right_5.png": "sprites/belt/right_5.png":
{ {
"frame": {"x":330,"y":26,"w":13,"h":13}, "frame": {"x":340,"y":25,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -146,7 +146,7 @@
}, },
"sprites/blueprints/belt_left.png": "sprites/blueprints/belt_left.png":
{ {
"frame": {"x":286,"y":112,"w":13,"h":13}, "frame": {"x":357,"y":23,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -154,7 +154,7 @@
}, },
"sprites/blueprints/belt_right.png": "sprites/blueprints/belt_right.png":
{ {
"frame": {"x":347,"y":26,"w":13,"h":13}, "frame": {"x":374,"y":23,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -162,7 +162,7 @@
}, },
"sprites/blueprints/belt_top.png": "sprites/blueprints/belt_top.png":
{ {
"frame": {"x":303,"y":112,"w":13,"h":13}, "frame": {"x":391,"y":23,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -170,7 +170,7 @@
}, },
"sprites/blueprints/cutter-quad.png": "sprites/blueprints/cutter-quad.png":
{ {
"frame": {"x":87,"y":82,"w":76,"h":19}, "frame": {"x":82,"y":3,"w":76,"h":19},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":76,"h":19}, "spriteSourceSize": {"x":1,"y":0,"w":76,"h":19},
@ -178,7 +178,7 @@
}, },
"sprites/blueprints/cutter.png": "sprites/blueprints/cutter.png":
{ {
"frame": {"x":209,"y":66,"w":36,"h":19}, "frame": {"x":207,"y":43,"w":36,"h":19},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":36,"h":19}, "spriteSourceSize": {"x":1,"y":0,"w":36,"h":19},
@ -186,7 +186,7 @@
}, },
"sprites/blueprints/miner-chainable.png": "sprites/blueprints/miner-chainable.png":
{ {
"frame": {"x":286,"y":43,"w":19,"h":19}, "frame": {"x":285,"y":3,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -194,7 +194,7 @@
}, },
"sprites/blueprints/miner.png": "sprites/blueprints/miner.png":
{ {
"frame": {"x":249,"y":89,"w":19,"h":19}, "frame": {"x":245,"y":89,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -202,7 +202,7 @@
}, },
"sprites/blueprints/mixer.png": "sprites/blueprints/mixer.png":
{ {
"frame": {"x":205,"y":43,"w":37,"h":19}, "frame": {"x":166,"y":45,"w":37,"h":19},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":37,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":37,"h":19},
@ -210,7 +210,7 @@
}, },
"sprites/blueprints/painter-double.png": "sprites/blueprints/painter-double.png":
{ {
"frame": {"x":3,"y":83,"w":38,"h":38}, "frame": {"x":84,"y":82,"w":38,"h":38},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":38,"h":38}, "spriteSourceSize": {"x":0,"y":0,"w":38,"h":38},
@ -218,7 +218,7 @@
}, },
"sprites/blueprints/painter-quad.png": "sprites/blueprints/painter-quad.png":
{ {
"frame": {"x":82,"y":45,"w":77,"h":19}, "frame": {"x":3,"y":83,"w":77,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":77,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":77,"h":19},
@ -226,7 +226,7 @@
}, },
"sprites/blueprints/painter.png": "sprites/blueprints/painter.png":
{ {
"frame": {"x":163,"y":43,"w":38,"h":19}, "frame": {"x":82,"y":49,"w":38,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":38,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":38,"h":19},
@ -234,7 +234,7 @@
}, },
"sprites/blueprints/rotater-ccw.png": "sprites/blueprints/rotater-ccw.png":
{ {
"frame": {"x":272,"y":89,"w":19,"h":19}, "frame": {"x":268,"y":89,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -242,7 +242,7 @@
}, },
"sprites/blueprints/rotater.png": "sprites/blueprints/rotater.png":
{ {
"frame": {"x":289,"y":66,"w":19,"h":19}, "frame": {"x":285,"y":66,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -250,7 +250,7 @@
}, },
"sprites/blueprints/splitter-compact-inverse.png": "sprites/blueprints/splitter-compact-inverse.png":
{ {
"frame": {"x":309,"y":43,"w":19,"h":19}, "frame": {"x":291,"y":89,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -258,7 +258,7 @@
}, },
"sprites/blueprints/splitter-compact.png": "sprites/blueprints/splitter-compact.png":
{ {
"frame": {"x":322,"y":3,"w":19,"h":19}, "frame": {"x":287,"y":43,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -266,7 +266,7 @@
}, },
"sprites/blueprints/splitter.png": "sprites/blueprints/splitter.png":
{ {
"frame": {"x":246,"y":43,"w":36,"h":19}, "frame": {"x":245,"y":3,"w":36,"h":19},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":36,"h":19}, "spriteSourceSize": {"x":1,"y":0,"w":36,"h":19},
@ -274,7 +274,7 @@
}, },
"sprites/blueprints/stacker.png": "sprites/blueprints/stacker.png":
{ {
"frame": {"x":241,"y":3,"w":37,"h":19}, "frame": {"x":204,"y":3,"w":37,"h":19},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":37,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":37,"h":19},
@ -282,7 +282,7 @@
}, },
"sprites/blueprints/trash-storage.png": "sprites/blueprints/trash-storage.png":
{ {
"frame": {"x":82,"y":3,"w":35,"h":38}, "frame": {"x":126,"y":79,"w":35,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":35,"h":38}, "spriteSourceSize": {"x":2,"y":0,"w":35,"h":38},
@ -290,7 +290,7 @@
}, },
"sprites/blueprints/trash.png": "sprites/blueprints/trash.png":
{ {
"frame": {"x":345,"y":3,"w":19,"h":19}, "frame": {"x":308,"y":66,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -298,7 +298,7 @@
}, },
"sprites/blueprints/underground_belt_entry-tier2.png": "sprites/blueprints/underground_belt_entry-tier2.png":
{ {
"frame": {"x":378,"y":26,"w":19,"h":18}, "frame": {"x":360,"y":89,"w":19,"h":18},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":1,"w":19,"h":18}, "spriteSourceSize": {"x":0,"y":1,"w":19,"h":18},
@ -306,7 +306,7 @@
}, },
"sprites/blueprints/underground_belt_entry.png": "sprites/blueprints/underground_belt_entry.png":
{ {
"frame": {"x":341,"y":89,"w":19,"h":16}, "frame": {"x":354,"y":3,"w":19,"h":16},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":3,"w":19,"h":16}, "spriteSourceSize": {"x":0,"y":3,"w":19,"h":16},
@ -314,7 +314,7 @@
}, },
"sprites/blueprints/underground_belt_exit-tier2.png": "sprites/blueprints/underground_belt_exit-tier2.png":
{ {
"frame": {"x":341,"y":109,"w":19,"h":16}, "frame": {"x":356,"y":42,"w":19,"h":16},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":16}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":16},
@ -322,7 +322,7 @@
}, },
"sprites/blueprints/underground_belt_exit.png": "sprites/blueprints/underground_belt_exit.png":
{ {
"frame": {"x":364,"y":70,"w":19,"h":16}, "frame": {"x":377,"y":62,"w":19,"h":16},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":16}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":16},
@ -330,7 +330,7 @@
}, },
"sprites/buildings/belt_left.png": "sprites/buildings/belt_left.png":
{ {
"frame": {"x":167,"y":112,"w":13,"h":13}, "frame": {"x":262,"y":112,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -338,7 +338,7 @@
}, },
"sprites/buildings/belt_right.png": "sprites/buildings/belt_right.png":
{ {
"frame": {"x":235,"y":112,"w":13,"h":13}, "frame": {"x":330,"y":112,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -346,7 +346,7 @@
}, },
"sprites/buildings/belt_top.png": "sprites/buildings/belt_top.png":
{ {
"frame": {"x":160,"y":26,"w":13,"h":13}, "frame": {"x":204,"y":26,"w":13,"h":13},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13}, "spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -354,7 +354,7 @@
}, },
"sprites/buildings/cutter-quad.png": "sprites/buildings/cutter-quad.png":
{ {
"frame": {"x":87,"y":105,"w":76,"h":19}, "frame": {"x":82,"y":26,"w":76,"h":19},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":76,"h":19}, "spriteSourceSize": {"x":1,"y":0,"w":76,"h":19},
@ -362,7 +362,7 @@
}, },
"sprites/buildings/cutter.png": "sprites/buildings/cutter.png":
{ {
"frame": {"x":282,"y":3,"w":36,"h":19}, "frame": {"x":245,"y":66,"w":36,"h":19},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":36,"h":19}, "spriteSourceSize": {"x":1,"y":0,"w":36,"h":19},
@ -378,7 +378,7 @@
}, },
"sprites/buildings/miner-chainable.png": "sprites/buildings/miner-chainable.png":
{ {
"frame": {"x":295,"y":89,"w":19,"h":19}, "frame": {"x":314,"y":89,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -386,7 +386,7 @@
}, },
"sprites/buildings/miner.png": "sprites/buildings/miner.png":
{ {
"frame": {"x":312,"y":66,"w":19,"h":19}, "frame": {"x":310,"y":43,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -394,7 +394,7 @@
}, },
"sprites/buildings/mixer.png": "sprites/buildings/mixer.png":
{ {
"frame": {"x":167,"y":89,"w":37,"h":19}, "frame": {"x":204,"y":68,"w":37,"h":19},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":37,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":37,"h":19},
@ -402,7 +402,7 @@
}, },
"sprites/buildings/painter-double.png": "sprites/buildings/painter-double.png":
{ {
"frame": {"x":45,"y":83,"w":38,"h":38}, "frame": {"x":162,"y":3,"w":38,"h":38},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":38,"h":38}, "spriteSourceSize": {"x":0,"y":0,"w":38,"h":38},
@ -410,7 +410,7 @@
}, },
"sprites/buildings/painter-quad.png": "sprites/buildings/painter-quad.png":
{ {
"frame": {"x":160,"y":3,"w":77,"h":19}, "frame": {"x":3,"y":106,"w":77,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":77,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":77,"h":19},
@ -418,7 +418,7 @@
}, },
"sprites/buildings/painter.png": "sprites/buildings/painter.png":
{ {
"frame": {"x":167,"y":66,"w":38,"h":19}, "frame": {"x":124,"y":49,"w":38,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":38,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":38,"h":19},
@ -426,7 +426,7 @@
}, },
"sprites/buildings/rotater-ccw.png": "sprites/buildings/rotater-ccw.png":
{ {
"frame": {"x":332,"y":43,"w":19,"h":19}, "frame": {"x":331,"y":66,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -434,7 +434,7 @@
}, },
"sprites/buildings/rotater.png": "sprites/buildings/rotater.png":
{ {
"frame": {"x":318,"y":89,"w":19,"h":19}, "frame": {"x":337,"y":89,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -442,7 +442,7 @@
}, },
"sprites/buildings/splitter-compact-inverse.png": "sprites/buildings/splitter-compact-inverse.png":
{ {
"frame": {"x":335,"y":66,"w":19,"h":19}, "frame": {"x":308,"y":3,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -450,7 +450,7 @@
}, },
"sprites/buildings/splitter-compact.png": "sprites/buildings/splitter-compact.png":
{ {
"frame": {"x":355,"y":43,"w":19,"h":19}, "frame": {"x":333,"y":43,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -458,7 +458,7 @@
}, },
"sprites/buildings/splitter.png": "sprites/buildings/splitter.png":
{ {
"frame": {"x":249,"y":66,"w":36,"h":19}, "frame": {"x":247,"y":43,"w":36,"h":19},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":36,"h":19}, "spriteSourceSize": {"x":1,"y":0,"w":36,"h":19},
@ -466,7 +466,7 @@
}, },
"sprites/buildings/stacker.png": "sprites/buildings/stacker.png":
{ {
"frame": {"x":208,"y":89,"w":37,"h":19}, "frame": {"x":204,"y":91,"w":37,"h":19},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":37,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":37,"h":19},
@ -474,7 +474,7 @@
}, },
"sprites/buildings/trash-storage.png": "sprites/buildings/trash-storage.png":
{ {
"frame": {"x":121,"y":3,"w":35,"h":38}, "frame": {"x":165,"y":72,"w":35,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":35,"h":38}, "spriteSourceSize": {"x":2,"y":0,"w":35,"h":38},
@ -482,7 +482,7 @@
}, },
"sprites/buildings/trash.png": "sprites/buildings/trash.png":
{ {
"frame": {"x":378,"y":3,"w":19,"h":19}, "frame": {"x":354,"y":66,"w":19,"h":19},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -490,7 +490,7 @@
}, },
"sprites/buildings/underground_belt_entry-tier2.png": "sprites/buildings/underground_belt_entry-tier2.png":
{ {
"frame": {"x":378,"y":48,"w":19,"h":18}, "frame": {"x":331,"y":3,"w":19,"h":18},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":1,"w":19,"h":18}, "spriteSourceSize": {"x":0,"y":1,"w":19,"h":18},
@ -498,7 +498,7 @@
}, },
"sprites/buildings/underground_belt_entry.png": "sprites/buildings/underground_belt_entry.png":
{ {
"frame": {"x":387,"y":70,"w":19,"h":16}, "frame": {"x":383,"y":82,"w":19,"h":16},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":3,"w":19,"h":16}, "spriteSourceSize": {"x":0,"y":3,"w":19,"h":16},
@ -506,7 +506,7 @@
}, },
"sprites/buildings/underground_belt_exit-tier2.png": "sprites/buildings/underground_belt_exit-tier2.png":
{ {
"frame": {"x":364,"y":90,"w":19,"h":16}, "frame": {"x":377,"y":3,"w":19,"h":16},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":16}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":16},
@ -514,7 +514,7 @@
}, },
"sprites/buildings/underground_belt_exit.png": "sprites/buildings/underground_belt_exit.png":
{ {
"frame": {"x":387,"y":90,"w":19,"h":16}, "frame": {"x":379,"y":40,"w":19,"h":16},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":16}, "spriteSourceSize": {"x":0,"y":0,"w":19,"h":16},
@ -522,7 +522,7 @@
}, },
"sprites/debug/acceptor_slot.png": "sprites/debug/acceptor_slot.png":
{ {
"frame": {"x":132,"y":68,"w":6,"h":6}, "frame": {"x":82,"y":72,"w":6,"h":6},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":6,"h":6}, "spriteSourceSize": {"x":0,"y":0,"w":6,"h":6},
@ -530,7 +530,7 @@
}, },
"sprites/debug/ejector_slot.png": "sprites/debug/ejector_slot.png":
{ {
"frame": {"x":142,"y":68,"w":6,"h":6}, "frame": {"x":92,"y":72,"w":6,"h":6},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":6,"h":6}, "spriteSourceSize": {"x":0,"y":0,"w":6,"h":6},
@ -538,7 +538,7 @@
}, },
"sprites/map_overview/belt_forward.png": "sprites/map_overview/belt_forward.png":
{ {
"frame": {"x":152,"y":68,"w":3,"h":3}, "frame": {"x":102,"y":72,"w":3,"h":3},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3},
@ -546,7 +546,7 @@
}, },
"sprites/map_overview/belt_left.png": "sprites/map_overview/belt_left.png":
{ {
"frame": {"x":152,"y":75,"w":3,"h":3}, "frame": {"x":109,"y":72,"w":3,"h":3},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3},
@ -554,7 +554,7 @@
}, },
"sprites/map_overview/belt_right.png": "sprites/map_overview/belt_right.png":
{ {
"frame": {"x":159,"y":68,"w":3,"h":3}, "frame": {"x":116,"y":72,"w":3,"h":3},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":3,"h":3}, "spriteSourceSize": {"x":0,"y":0,"w":3,"h":3},
@ -562,7 +562,7 @@
}, },
"sprites/misc/deletion_marker.png": "sprites/misc/deletion_marker.png":
{ {
"frame": {"x":82,"y":68,"w":10,"h":10}, "frame": {"x":187,"y":114,"w":10,"h":10},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":10,"h":10}, "spriteSourceSize": {"x":0,"y":0,"w":10,"h":10},
@ -570,7 +570,7 @@
}, },
"sprites/misc/slot_bad_arrow.png": "sprites/misc/slot_bad_arrow.png":
{ {
"frame": {"x":82,"y":68,"w":10,"h":10}, "frame": {"x":187,"y":114,"w":10,"h":10},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":10,"h":10}, "spriteSourceSize": {"x":0,"y":0,"w":10,"h":10},
@ -578,7 +578,7 @@
}, },
"sprites/misc/slot_good_arrow.png": "sprites/misc/slot_good_arrow.png":
{ {
"frame": {"x":96,"y":68,"w":10,"h":10}, "frame": {"x":201,"y":114,"w":10,"h":10},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":10,"h":10}, "spriteSourceSize": {"x":0,"y":0,"w":10,"h":10},
@ -586,19 +586,27 @@
}, },
"sprites/misc/storage_overlay.png": "sprites/misc/storage_overlay.png":
{ {
"frame": {"x":110,"y":68,"w":18,"h":9}, "frame": {"x":165,"y":114,"w":18,"h":9},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":18,"h":9}, "spriteSourceSize": {"x":0,"y":0,"w":18,"h":9},
"sourceSize": {"w":18,"h":9} "sourceSize": {"w":18,"h":9}
},
"sprites/misc/waypoint.png":
{
"frame": {"x":123,"y":72,"w":3,"h":3},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":3,"h":3},
"sourceSize": {"w":3,"h":3}
}}, }},
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "1.0", "version": "1.0",
"image": "atlas0_10.png", "image": "atlas0_10.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": {"w":409,"h":128}, "size": {"w":407,"h":128},
"scale": "0.1", "scale": "0.1",
"smartupdate": "$TexturePacker:SmartUpdate:c2a63b817240ea11b013f390be5c690a:0c1b9b304a864f030526d8b9e8ae3352:f159918d23e5952766c6d23ab52278c6$" "smartupdate": "$TexturePacker:SmartUpdate:feeaacb789d7182e6aef553861c19982:774c2c10210542582abaa8efc495510d:f159918d23e5952766c6d23ab52278c6$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 51 KiB

View File

@ -538,7 +538,7 @@
}, },
"sprites/map_overview/belt_forward.png": "sprites/map_overview/belt_forward.png":
{ {
"frame": {"x":354,"y":1702,"w":24,"h":32}, "frame": {"x":353,"y":1702,"w":24,"h":32},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":24,"h":32}, "spriteSourceSize": {"x":4,"y":0,"w":24,"h":32},
@ -546,7 +546,7 @@
}, },
"sprites/map_overview/belt_left.png": "sprites/map_overview/belt_left.png":
{ {
"frame": {"x":1844,"y":524,"w":28,"h":28}, "frame": {"x":1433,"y":915,"w":28,"h":28},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":28,"h":28}, "spriteSourceSize": {"x":0,"y":4,"w":28,"h":28},
@ -554,7 +554,7 @@
}, },
"sprites/map_overview/belt_right.png": "sprites/map_overview/belt_right.png":
{ {
"frame": {"x":1433,"y":915,"w":28,"h":28}, "frame": {"x":1433,"y":947,"w":28,"h":28},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":28,"h":28}, "spriteSourceSize": {"x":4,"y":4,"w":28,"h":28},
@ -562,7 +562,7 @@
}, },
"sprites/misc/deletion_marker.png": "sprites/misc/deletion_marker.png":
{ {
"frame": {"x":268,"y":1702,"w":82,"h":82}, "frame": {"x":267,"y":1702,"w":82,"h":82},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":7,"y":7,"w":82,"h":82}, "spriteSourceSize": {"x":7,"y":7,"w":82,"h":82},
@ -570,7 +570,7 @@
}, },
"sprites/misc/slot_bad_arrow.png": "sprites/misc/slot_bad_arrow.png":
{ {
"frame": {"x":268,"y":1702,"w":82,"h":82}, "frame": {"x":267,"y":1702,"w":82,"h":82},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":7,"y":7,"w":82,"h":82}, "spriteSourceSize": {"x":7,"y":7,"w":82,"h":82},
@ -578,7 +578,7 @@
}, },
"sprites/misc/slot_good_arrow.png": "sprites/misc/slot_good_arrow.png":
{ {
"frame": {"x":184,"y":1702,"w":80,"h":96}, "frame": {"x":183,"y":1702,"w":80,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":8,"y":0,"w":80,"h":96}, "spriteSourceSize": {"x":8,"y":0,"w":80,"h":96},
@ -586,11 +586,19 @@
}, },
"sprites/misc/storage_overlay.png": "sprites/misc/storage_overlay.png":
{ {
"frame": {"x":3,"y":1702,"w":177,"h":86}, "frame": {"x":3,"y":1702,"w":176,"h":86},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":177,"h":86}, "spriteSourceSize": {"x":3,"y":4,"w":176,"h":86},
"sourceSize": {"w":177,"h":86} "sourceSize": {"w":180,"h":90}
},
"sprites/misc/waypoint.png":
{
"frame": {"x":1844,"y":524,"w":24,"h":32},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":24,"h":32},
"sourceSize": {"w":32,"h":32}
}}, }},
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
@ -599,6 +607,6 @@
"format": "RGBA8888", "format": "RGBA8888",
"size": {"w":1997,"h":1801}, "size": {"w":1997,"h":1801},
"scale": "1", "scale": "1",
"smartupdate": "$TexturePacker:SmartUpdate:c2a63b817240ea11b013f390be5c690a:0c1b9b304a864f030526d8b9e8ae3352:f159918d23e5952766c6d23ab52278c6$" "smartupdate": "$TexturePacker:SmartUpdate:feeaacb789d7182e6aef553861c19982:774c2c10210542582abaa8efc495510d:f159918d23e5952766c6d23ab52278c6$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 752 KiB

After

Width:  |  Height:  |  Size: 752 KiB

View File

@ -2,7 +2,7 @@
"sprites/belt/forward_0.png": "sprites/belt/forward_0.png":
{ {
"frame": {"x":493,"y":55,"w":28,"h":32}, "frame": {"x":479,"y":103,"w":28,"h":32},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -10,7 +10,7 @@
}, },
"sprites/belt/forward_1.png": "sprites/belt/forward_1.png":
{ {
"frame": {"x":525,"y":55,"w":28,"h":32}, "frame": {"x":479,"y":139,"w":28,"h":32},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -18,7 +18,7 @@
}, },
"sprites/belt/forward_2.png": "sprites/belt/forward_2.png":
{ {
"frame": {"x":557,"y":55,"w":28,"h":32}, "frame": {"x":479,"y":175,"w":28,"h":32},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -26,7 +26,7 @@
}, },
"sprites/belt/forward_3.png": "sprites/belt/forward_3.png":
{ {
"frame": {"x":589,"y":55,"w":28,"h":32}, "frame": {"x":262,"y":331,"w":28,"h":32},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -34,7 +34,7 @@
}, },
"sprites/belt/forward_4.png": "sprites/belt/forward_4.png":
{ {
"frame": {"x":621,"y":55,"w":28,"h":32}, "frame": {"x":285,"y":383,"w":28,"h":32},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -42,7 +42,7 @@
}, },
"sprites/belt/forward_5.png": "sprites/belt/forward_5.png":
{ {
"frame": {"x":653,"y":55,"w":28,"h":32}, "frame": {"x":317,"y":383,"w":28,"h":32},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -50,7 +50,7 @@
}, },
"sprites/belt/left_0.png": "sprites/belt/left_0.png":
{ {
"frame": {"x":717,"y":55,"w":30,"h":30}, "frame": {"x":343,"y":159,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -58,7 +58,7 @@
}, },
"sprites/belt/left_1.png": "sprites/belt/left_1.png":
{ {
"frame": {"x":751,"y":55,"w":30,"h":30}, "frame": {"x":343,"y":193,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -66,7 +66,7 @@
}, },
"sprites/belt/left_2.png": "sprites/belt/left_2.png":
{ {
"frame": {"x":785,"y":55,"w":30,"h":30}, "frame": {"x":477,"y":211,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -74,7 +74,7 @@
}, },
"sprites/belt/left_3.png": "sprites/belt/left_3.png":
{ {
"frame": {"x":819,"y":55,"w":30,"h":30}, "frame": {"x":477,"y":245,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -82,7 +82,7 @@
}, },
"sprites/belt/left_4.png": "sprites/belt/left_4.png":
{ {
"frame": {"x":853,"y":55,"w":30,"h":30}, "frame": {"x":469,"y":279,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -90,7 +90,7 @@
}, },
"sprites/belt/left_5.png": "sprites/belt/left_5.png":
{ {
"frame": {"x":887,"y":55,"w":30,"h":30}, "frame": {"x":3,"y":331,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -98,7 +98,7 @@
}, },
"sprites/belt/right_0.png": "sprites/belt/right_0.png":
{ {
"frame": {"x":921,"y":55,"w":30,"h":30}, "frame": {"x":37,"y":331,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -106,7 +106,7 @@
}, },
"sprites/belt/right_1.png": "sprites/belt/right_1.png":
{ {
"frame": {"x":955,"y":55,"w":30,"h":30}, "frame": {"x":71,"y":331,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -114,7 +114,7 @@
}, },
"sprites/belt/right_2.png": "sprites/belt/right_2.png":
{ {
"frame": {"x":989,"y":54,"w":30,"h":30}, "frame": {"x":3,"y":296,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -122,7 +122,7 @@
}, },
"sprites/belt/right_3.png": "sprites/belt/right_3.png":
{ {
"frame": {"x":989,"y":88,"w":30,"h":30}, "frame": {"x":37,"y":296,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -130,7 +130,7 @@
}, },
"sprites/belt/right_4.png": "sprites/belt/right_4.png":
{ {
"frame": {"x":986,"y":122,"w":30,"h":30}, "frame": {"x":71,"y":296,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -138,7 +138,7 @@
}, },
"sprites/belt/right_5.png": "sprites/belt/right_5.png":
{ {
"frame": {"x":976,"y":182,"w":30,"h":30}, "frame": {"x":105,"y":331,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -146,7 +146,7 @@
}, },
"sprites/blueprints/belt_left.png": "sprites/blueprints/belt_left.png":
{ {
"frame": {"x":929,"y":216,"w":30,"h":30}, "frame": {"x":139,"y":331,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -154,7 +154,7 @@
}, },
"sprites/blueprints/belt_right.png": "sprites/blueprints/belt_right.png":
{ {
"frame": {"x":963,"y":216,"w":30,"h":30}, "frame": {"x":173,"y":331,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -162,7 +162,7 @@
}, },
"sprites/blueprints/belt_top.png": "sprites/blueprints/belt_top.png":
{ {
"frame": {"x":685,"y":55,"w":28,"h":32}, "frame": {"x":467,"y":416,"w":28,"h":32},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -170,7 +170,7 @@
}, },
"sprites/blueprints/cutter-quad.png": "sprites/blueprints/cutter-quad.png":
{ {
"frame": {"x":373,"y":155,"w":184,"h":48}, "frame": {"x":191,"y":55,"w":184,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":184,"h":48}, "spriteSourceSize": {"x":5,"y":0,"w":184,"h":48},
@ -178,7 +178,7 @@
}, },
"sprites/blueprints/cutter.png": "sprites/blueprints/cutter.png":
{ {
"frame": {"x":661,"y":143,"w":87,"h":48}, "frame": {"x":95,"y":244,"w":87,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":87,"h":48}, "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48},
@ -186,7 +186,7 @@
}, },
"sprites/blueprints/miner-chainable.png": "sprites/blueprints/miner-chainable.png":
{ {
"frame": {"x":856,"y":141,"w":47,"h":48}, "frame": {"x":262,"y":419,"w":47,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -194,7 +194,7 @@
}, },
"sprites/blueprints/miner.png": "sprites/blueprints/miner.png":
{ {
"frame": {"x":858,"y":89,"w":47,"h":48}, "frame": {"x":313,"y":419,"w":47,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -202,7 +202,7 @@
}, },
"sprites/blueprints/mixer.png": "sprites/blueprints/mixer.png":
{ {
"frame": {"x":491,"y":3,"w":89,"h":48}, "frame": {"x":191,"y":211,"w":89,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":89,"h":48}, "spriteSourceSize": {"x":3,"y":0,"w":89,"h":48},
@ -210,7 +210,7 @@
}, },
"sprites/blueprints/painter-double.png": "sprites/blueprints/painter-double.png":
{ {
"frame": {"x":191,"y":3,"w":96,"h":96}, "frame": {"x":387,"y":3,"w":96,"h":96},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -218,7 +218,7 @@
}, },
"sprites/blueprints/painter-quad.png": "sprites/blueprints/painter-quad.png":
{ {
"frame": {"x":3,"y":192,"w":188,"h":48}, "frame": {"x":3,"y":3,"w":188,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":188,"h":48}, "spriteSourceSize": {"x":1,"y":0,"w":188,"h":48},
@ -226,7 +226,7 @@
}, },
"sprites/blueprints/painter.png": "sprites/blueprints/painter.png":
{ {
"frame": {"x":561,"y":155,"w":96,"h":48}, "frame": {"x":191,"y":159,"w":96,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48},
@ -234,7 +234,7 @@
}, },
"sprites/blueprints/rotater-ccw.png": "sprites/blueprints/rotater-ccw.png":
{ {
"frame": {"x":752,"y":143,"w":48,"h":48}, "frame": {"x":291,"y":159,"w":48,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -242,7 +242,7 @@
}, },
"sprites/blueprints/rotater.png": "sprites/blueprints/rotater.png":
{ {
"frame": {"x":754,"y":89,"w":48,"h":48}, "frame": {"x":459,"y":313,"w":48,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -250,7 +250,7 @@
}, },
"sprites/blueprints/splitter-compact-inverse.png": "sprites/blueprints/splitter-compact-inverse.png":
{ {
"frame": {"x":774,"y":195,"w":48,"h":48}, "frame": {"x":210,"y":315,"w":48,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -258,7 +258,7 @@
}, },
"sprites/blueprints/splitter-compact.png": "sprites/blueprints/splitter-compact.png":
{ {
"frame": {"x":907,"y":141,"w":47,"h":47}, "frame": {"x":415,"y":416,"w":47,"h":47},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":47}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
@ -266,7 +266,7 @@
}, },
"sprites/blueprints/splitter.png": "sprites/blueprints/splitter.png":
{ {
"frame": {"x":663,"y":91,"w":87,"h":48}, "frame": {"x":186,"y":263,"w":87,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":87,"h":48}, "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48},
@ -274,7 +274,7 @@
}, },
"sprites/blueprints/stacker.png": "sprites/blueprints/stacker.png":
{ {
"frame": {"x":584,"y":3,"w":89,"h":48}, "frame": {"x":284,"y":227,"w":89,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":89,"h":48}, "spriteSourceSize": {"x":3,"y":0,"w":89,"h":48},
@ -282,7 +282,7 @@
}, },
"sprites/blueprints/trash-storage.png": "sprites/blueprints/trash-storage.png":
{ {
"frame": {"x":195,"y":155,"w":85,"h":96}, "frame": {"x":3,"y":365,"w":85,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":85,"h":96}, "spriteSourceSize": {"x":6,"y":0,"w":85,"h":96},
@ -290,7 +290,7 @@
}, },
"sprites/blueprints/trash.png": "sprites/blueprints/trash.png":
{ {
"frame": {"x":804,"y":141,"w":48,"h":48}, "frame": {"x":181,"y":391,"w":48,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -298,7 +298,7 @@
}, },
"sprites/blueprints/underground_belt_entry-tier2.png": "sprites/blueprints/underground_belt_entry-tier2.png":
{ {
"frame": {"x":373,"y":207,"w":48,"h":43}, "frame": {"x":3,"y":465,"w":48,"h":43},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":5,"w":48,"h":43}, "spriteSourceSize": {"x":0,"y":5,"w":48,"h":43},
@ -306,7 +306,7 @@
}, },
"sprites/blueprints/underground_belt_entry.png": "sprites/blueprints/underground_belt_entry.png":
{ {
"frame": {"x":476,"y":207,"w":48,"h":38}, "frame": {"x":106,"y":465,"w":48,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":10,"w":48,"h":38}, "spriteSourceSize": {"x":0,"y":10,"w":48,"h":38},
@ -314,7 +314,7 @@
}, },
"sprites/blueprints/underground_belt_exit-tier2.png": "sprites/blueprints/underground_belt_exit-tier2.png":
{ {
"frame": {"x":528,"y":207,"w":48,"h":38}, "frame": {"x":158,"y":465,"w":48,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":38}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":38},
@ -322,7 +322,7 @@
}, },
"sprites/blueprints/underground_belt_exit.png": "sprites/blueprints/underground_belt_exit.png":
{ {
"frame": {"x":580,"y":207,"w":48,"h":38}, "frame": {"x":262,"y":471,"w":48,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":38}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":38},
@ -330,7 +330,7 @@
}, },
"sprites/buildings/belt_left.png": "sprites/buildings/belt_left.png":
{ {
"frame": {"x":717,"y":55,"w":30,"h":30}, "frame": {"x":343,"y":159,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -338,7 +338,7 @@
}, },
"sprites/buildings/belt_right.png": "sprites/buildings/belt_right.png":
{ {
"frame": {"x":921,"y":55,"w":30,"h":30}, "frame": {"x":37,"y":331,"w":30,"h":30},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30}, "spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -346,7 +346,7 @@
}, },
"sprites/buildings/belt_top.png": "sprites/buildings/belt_top.png":
{ {
"frame": {"x":493,"y":55,"w":28,"h":32}, "frame": {"x":479,"y":103,"w":28,"h":32},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32}, "spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -354,7 +354,7 @@
}, },
"sprites/buildings/cutter-quad.png": "sprites/buildings/cutter-quad.png":
{ {
"frame": {"x":383,"y":103,"w":184,"h":48}, "frame": {"x":191,"y":107,"w":184,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":184,"h":48}, "spriteSourceSize": {"x":5,"y":0,"w":184,"h":48},
@ -362,7 +362,7 @@
}, },
"sprites/buildings/cutter.png": "sprites/buildings/cutter.png":
{ {
"frame": {"x":769,"y":3,"w":87,"h":48}, "frame": {"x":277,"y":279,"w":87,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":87,"h":48}, "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48},
@ -370,7 +370,7 @@
}, },
"sprites/buildings/hub.png": "sprites/buildings/hub.png":
{ {
"frame": {"x":3,"y":3,"w":184,"h":185}, "frame": {"x":3,"y":55,"w":184,"h":185},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":184,"h":185}, "spriteSourceSize": {"x":4,"y":4,"w":184,"h":185},
@ -378,7 +378,7 @@
}, },
"sprites/buildings/miner-chainable.png": "sprites/buildings/miner-chainable.png":
{ {
"frame": {"x":912,"y":3,"w":47,"h":48}, "frame": {"x":349,"y":365,"w":47,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -386,7 +386,7 @@
}, },
"sprites/buildings/miner.png": "sprites/buildings/miner.png":
{ {
"frame": {"x":878,"y":193,"w":47,"h":48}, "frame": {"x":364,"y":417,"w":47,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -394,7 +394,7 @@
}, },
"sprites/buildings/mixer.png": "sprites/buildings/mixer.png":
{ {
"frame": {"x":571,"y":91,"w":88,"h":48}, "frame": {"x":377,"y":255,"w":88,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":88,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":88,"h":48},
@ -402,7 +402,7 @@
}, },
"sprites/buildings/painter-double.png": "sprites/buildings/painter-double.png":
{ {
"frame": {"x":291,"y":3,"w":96,"h":96}, "frame": {"x":379,"y":103,"w":96,"h":96},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -410,7 +410,7 @@
}, },
"sprites/buildings/painter-quad.png": "sprites/buildings/painter-quad.png":
{ {
"frame": {"x":191,"y":103,"w":188,"h":48}, "frame": {"x":195,"y":3,"w":188,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":188,"h":48}, "spriteSourceSize": {"x":1,"y":0,"w":188,"h":48},
@ -418,7 +418,7 @@
}, },
"sprites/buildings/painter.png": "sprites/buildings/painter.png":
{ {
"frame": {"x":391,"y":3,"w":96,"h":48}, "frame": {"x":377,"y":203,"w":96,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":48},
@ -426,7 +426,7 @@
}, },
"sprites/buildings/rotater-ccw.png": "sprites/buildings/rotater-ccw.png":
{ {
"frame": {"x":806,"y":89,"w":48,"h":48}, "frame": {"x":210,"y":443,"w":48,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -434,7 +434,7 @@
}, },
"sprites/buildings/rotater.png": "sprites/buildings/rotater.png":
{ {
"frame": {"x":860,"y":3,"w":48,"h":48}, "frame": {"x":233,"y":367,"w":48,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -442,7 +442,7 @@
}, },
"sprites/buildings/splitter-compact-inverse.png": "sprites/buildings/splitter-compact-inverse.png":
{ {
"frame": {"x":963,"y":3,"w":48,"h":47}, "frame": {"x":400,"y":365,"w":48,"h":47},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":47}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":47},
@ -450,7 +450,7 @@
}, },
"sprites/buildings/splitter-compact.png": "sprites/buildings/splitter-compact.png":
{ {
"frame": {"x":909,"y":89,"w":47,"h":47}, "frame": {"x":452,"y":365,"w":47,"h":47},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":47}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
@ -458,7 +458,7 @@
}, },
"sprites/buildings/splitter.png": "sprites/buildings/splitter.png":
{ {
"frame": {"x":683,"y":195,"w":87,"h":48}, "frame": {"x":368,"y":307,"w":87,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":87,"h":48}, "spriteSourceSize": {"x":5,"y":0,"w":87,"h":48},
@ -466,7 +466,7 @@
}, },
"sprites/buildings/stacker.png": "sprites/buildings/stacker.png":
{ {
"frame": {"x":677,"y":3,"w":88,"h":48}, "frame": {"x":3,"y":244,"w":88,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":88,"h":48}, "spriteSourceSize": {"x":4,"y":0,"w":88,"h":48},
@ -474,7 +474,7 @@
}, },
"sprites/buildings/trash-storage.png": "sprites/buildings/trash-storage.png":
{ {
"frame": {"x":284,"y":155,"w":85,"h":96}, "frame": {"x":92,"y":365,"w":85,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":85,"h":96}, "spriteSourceSize": {"x":6,"y":0,"w":85,"h":96},
@ -482,7 +482,7 @@
}, },
"sprites/buildings/trash.png": "sprites/buildings/trash.png":
{ {
"frame": {"x":826,"y":193,"w":48,"h":48}, "frame": {"x":294,"y":331,"w":48,"h":48},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48}, "spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -490,7 +490,7 @@
}, },
"sprites/buildings/underground_belt_entry-tier2.png": "sprites/buildings/underground_belt_entry-tier2.png":
{ {
"frame": {"x":425,"y":207,"w":47,"h":42}, "frame": {"x":55,"y":465,"w":47,"h":42},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":6,"w":47,"h":42}, "spriteSourceSize": {"x":1,"y":6,"w":47,"h":42},
@ -498,7 +498,7 @@
}, },
"sprites/buildings/underground_belt_entry.png": "sprites/buildings/underground_belt_entry.png":
{ {
"frame": {"x":632,"y":207,"w":47,"h":38}, "frame": {"x":314,"y":471,"w":47,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":10,"w":47,"h":38}, "spriteSourceSize": {"x":1,"y":10,"w":47,"h":38},
@ -506,7 +506,7 @@
}, },
"sprites/buildings/underground_belt_exit-tier2.png": "sprites/buildings/underground_belt_exit-tier2.png":
{ {
"frame": {"x":391,"y":55,"w":47,"h":38}, "frame": {"x":365,"y":469,"w":47,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":38}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":38},
@ -514,7 +514,7 @@
}, },
"sprites/buildings/underground_belt_exit.png": "sprites/buildings/underground_belt_exit.png":
{ {
"frame": {"x":442,"y":55,"w":47,"h":38}, "frame": {"x":416,"y":467,"w":47,"h":38},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":38}, "spriteSourceSize": {"x":1,"y":0,"w":47,"h":38},
@ -522,7 +522,7 @@
}, },
"sprites/debug/acceptor_slot.png": "sprites/debug/acceptor_slot.png":
{ {
"frame": {"x":958,"y":143,"w":14,"h":16}, "frame": {"x":487,"y":3,"w":14,"h":16},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":14,"h":16}, "spriteSourceSize": {"x":1,"y":0,"w":14,"h":16},
@ -530,7 +530,7 @@
}, },
"sprites/debug/ejector_slot.png": "sprites/debug/ejector_slot.png":
{ {
"frame": {"x":958,"y":163,"w":14,"h":16}, "frame": {"x":487,"y":23,"w":14,"h":16},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":14,"h":16}, "spriteSourceSize": {"x":1,"y":0,"w":14,"h":16},
@ -538,7 +538,7 @@
}, },
"sprites/map_overview/belt_forward.png": "sprites/map_overview/belt_forward.png":
{ {
"frame": {"x":493,"y":91,"w":8,"h":8}, "frame": {"x":487,"y":43,"w":8,"h":8},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":8,"h":8}, "spriteSourceSize": {"x":0,"y":0,"w":8,"h":8},
@ -546,7 +546,7 @@
}, },
"sprites/map_overview/belt_left.png": "sprites/map_overview/belt_left.png":
{ {
"frame": {"x":505,"y":91,"w":8,"h":8}, "frame": {"x":499,"y":43,"w":8,"h":8},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":8,"h":8}, "spriteSourceSize": {"x":0,"y":0,"w":8,"h":8},
@ -554,7 +554,7 @@
}, },
"sprites/map_overview/belt_right.png": "sprites/map_overview/belt_right.png":
{ {
"frame": {"x":517,"y":91,"w":8,"h":8}, "frame": {"x":487,"y":55,"w":8,"h":8},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":8,"h":8}, "spriteSourceSize": {"x":0,"y":0,"w":8,"h":8},
@ -562,7 +562,7 @@
}, },
"sprites/misc/deletion_marker.png": "sprites/misc/deletion_marker.png":
{ {
"frame": {"x":960,"y":117,"w":22,"h":22}, "frame": {"x":181,"y":365,"w":22,"h":22},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":22,"h":22}, "spriteSourceSize": {"x":1,"y":1,"w":22,"h":22},
@ -570,7 +570,7 @@
}, },
"sprites/misc/slot_bad_arrow.png": "sprites/misc/slot_bad_arrow.png":
{ {
"frame": {"x":960,"y":117,"w":22,"h":22}, "frame": {"x":181,"y":365,"w":22,"h":22},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":22,"h":22}, "spriteSourceSize": {"x":1,"y":1,"w":22,"h":22},
@ -578,7 +578,7 @@
}, },
"sprites/misc/slot_good_arrow.png": "sprites/misc/slot_good_arrow.png":
{ {
"frame": {"x":960,"y":89,"w":22,"h":24}, "frame": {"x":105,"y":296,"w":22,"h":24},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":22,"h":24}, "spriteSourceSize": {"x":1,"y":0,"w":22,"h":24},
@ -586,19 +586,27 @@
}, },
"sprites/misc/storage_overlay.png": "sprites/misc/storage_overlay.png":
{ {
"frame": {"x":976,"y":156,"w":44,"h":22}, "frame": {"x":131,"y":296,"w":45,"h":23},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":44,"h":22}, "spriteSourceSize": {"x":0,"y":0,"w":45,"h":23},
"sourceSize": {"w":44,"h":22} "sourceSize": {"w":45,"h":23}
},
"sprites/misc/waypoint.png":
{
"frame": {"x":499,"y":55,"w":8,"h":8},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":8,"h":8},
"sourceSize": {"w":8,"h":8}
}}, }},
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "1.0", "version": "1.0",
"image": "atlas0_25.png", "image": "atlas0_25.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": {"w":1023,"h":254}, "size": {"w":510,"h":512},
"scale": "0.25", "scale": "0.25",
"smartupdate": "$TexturePacker:SmartUpdate:c2a63b817240ea11b013f390be5c690a:0c1b9b304a864f030526d8b9e8ae3352:f159918d23e5952766c6d23ab52278c6$" "smartupdate": "$TexturePacker:SmartUpdate:feeaacb789d7182e6aef553861c19982:774c2c10210542582abaa8efc495510d:f159918d23e5952766c6d23ab52278c6$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 163 KiB

View File

@ -2,7 +2,7 @@
"sprites/belt/forward_0.png": "sprites/belt/forward_0.png":
{ {
"frame": {"x":1854,"y":231,"w":51,"h":63}, "frame": {"x":49,"y":1765,"w":51,"h":63},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -10,7 +10,7 @@
}, },
"sprites/belt/forward_1.png": "sprites/belt/forward_1.png":
{ {
"frame": {"x":1909,"y":231,"w":51,"h":63}, "frame": {"x":3,"y":1902,"w":51,"h":63},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -18,7 +18,7 @@
}, },
"sprites/belt/forward_2.png": "sprites/belt/forward_2.png":
{ {
"frame": {"x":1842,"y":300,"w":51,"h":63}, "frame": {"x":58,"y":1902,"w":51,"h":63},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -26,7 +26,7 @@
}, },
"sprites/belt/forward_3.png": "sprites/belt/forward_3.png":
{ {
"frame": {"x":1897,"y":298,"w":51,"h":63}, "frame": {"x":113,"y":1887,"w":51,"h":63},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -34,7 +34,7 @@
}, },
"sprites/belt/forward_4.png": "sprites/belt/forward_4.png":
{ {
"frame": {"x":1902,"y":365,"w":51,"h":63}, "frame": {"x":168,"y":1830,"w":51,"h":63},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -42,7 +42,7 @@
}, },
"sprites/belt/forward_5.png": "sprites/belt/forward_5.png":
{ {
"frame": {"x":1648,"y":391,"w":51,"h":63}, "frame": {"x":168,"y":1897,"w":51,"h":63},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -50,7 +50,7 @@
}, },
"sprites/belt/left_0.png": "sprites/belt/left_0.png":
{ {
"frame": {"x":953,"y":399,"w":57,"h":57}, "frame": {"x":104,"y":1765,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -58,7 +58,7 @@
}, },
"sprites/belt/left_1.png": "sprites/belt/left_1.png":
{ {
"frame": {"x":1014,"y":399,"w":57,"h":57}, "frame": {"x":165,"y":1769,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -66,7 +66,7 @@
}, },
"sprites/belt/left_2.png": "sprites/belt/left_2.png":
{ {
"frame": {"x":1874,"y":170,"w":57,"h":57}, "frame": {"x":104,"y":1826,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -74,7 +74,7 @@
}, },
"sprites/belt/left_3.png": "sprites/belt/left_3.png":
{ {
"frame": {"x":1780,"y":362,"w":57,"h":57}, "frame": {"x":226,"y":1782,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -82,7 +82,7 @@
}, },
"sprites/belt/left_4.png": "sprites/belt/left_4.png":
{ {
"frame": {"x":1265,"y":403,"w":57,"h":57}, "frame": {"x":287,"y":1782,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -90,7 +90,7 @@
}, },
"sprites/belt/left_5.png": "sprites/belt/left_5.png":
{ {
"frame": {"x":1326,"y":403,"w":57,"h":57}, "frame": {"x":348,"y":1835,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -98,7 +98,7 @@
}, },
"sprites/belt/right_0.png": "sprites/belt/right_0.png":
{ {
"frame": {"x":1841,"y":367,"w":57,"h":57}, "frame": {"x":409,"y":1835,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -106,7 +106,7 @@
}, },
"sprites/belt/right_1.png": "sprites/belt/right_1.png":
{ {
"frame": {"x":1587,"y":391,"w":57,"h":57}, "frame": {"x":223,"y":1896,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -114,7 +114,7 @@
}, },
"sprites/belt/right_2.png": "sprites/belt/right_2.png":
{ {
"frame": {"x":1703,"y":387,"w":57,"h":57}, "frame": {"x":284,"y":1843,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -122,7 +122,7 @@
}, },
"sprites/belt/right_3.png": "sprites/belt/right_3.png":
{ {
"frame": {"x":1387,"y":403,"w":57,"h":57}, "frame": {"x":284,"y":1904,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -130,7 +130,7 @@
}, },
"sprites/belt/right_4.png": "sprites/belt/right_4.png":
{ {
"frame": {"x":1448,"y":402,"w":57,"h":57}, "frame": {"x":345,"y":1896,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -138,7 +138,7 @@
}, },
"sprites/belt/right_5.png": "sprites/belt/right_5.png":
{ {
"frame": {"x":1509,"y":402,"w":57,"h":57}, "frame": {"x":406,"y":1896,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -146,7 +146,7 @@
}, },
"sprites/blueprints/belt_left.png": "sprites/blueprints/belt_left.png":
{ {
"frame": {"x":1203,"y":398,"w":58,"h":58}, "frame": {"x":178,"y":1707,"w":58,"h":58},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":5,"w":58,"h":58}, "spriteSourceSize": {"x":0,"y":5,"w":58,"h":58},
@ -154,7 +154,7 @@
}, },
"sprites/blueprints/belt_right.png": "sprites/blueprints/belt_right.png":
{ {
"frame": {"x":1780,"y":300,"w":58,"h":58}, "frame": {"x":370,"y":1773,"w":58,"h":58},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":5,"w":58,"h":58}, "spriteSourceSize": {"x":5,"y":5,"w":58,"h":58},
@ -162,7 +162,7 @@
}, },
"sprites/blueprints/belt_top.png": "sprites/blueprints/belt_top.png":
{ {
"frame": {"x":1874,"y":103,"w":53,"h":63}, "frame": {"x":3,"y":1835,"w":53,"h":63},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":53,"h":63}, "spriteSourceSize": {"x":5,"y":0,"w":53,"h":63},
@ -170,7 +170,7 @@
}, },
"sprites/blueprints/cutter-quad.png": "sprites/blueprints/cutter-quad.png":
{ {
"frame": {"x":3,"y":374,"w":366,"h":96}, "frame": {"x":3,"y":574,"w":366,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":11,"y":0,"w":366,"h":96}, "spriteSourceSize": {"x":11,"y":0,"w":366,"h":96},
@ -178,7 +178,7 @@
}, },
"sprites/blueprints/cutter.png": "sprites/blueprints/cutter.png":
{ {
"frame": {"x":1496,"y":3,"w":172,"h":96}, "frame": {"x":3,"y":1465,"w":172,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":11,"y":0,"w":172,"h":96}, "spriteSourceSize": {"x":11,"y":0,"w":172,"h":96},
@ -186,7 +186,7 @@
}, },
"sprites/blueprints/miner-chainable.png": "sprites/blueprints/miner-chainable.png":
{ {
"frame": {"x":1778,"y":103,"w":92,"h":96}, "frame": {"x":179,"y":1507,"w":92,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":96}, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":96},
@ -194,7 +194,7 @@
}, },
"sprites/blueprints/miner.png": "sprites/blueprints/miner.png":
{ {
"frame": {"x":1301,"y":303,"w":92,"h":96}, "frame": {"x":178,"y":1607,"w":92,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":96}, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":96},
@ -202,7 +202,7 @@
}, },
"sprites/blueprints/mixer.png": "sprites/blueprints/mixer.png":
{ {
"frame": {"x":947,"y":103,"w":175,"h":96}, "frame": {"x":296,"y":1217,"w":175,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":8,"y":0,"w":175,"h":96}, "spriteSourceSize": {"x":8,"y":0,"w":175,"h":96},
@ -210,7 +210,7 @@
}, },
"sprites/blueprints/painter-double.png": "sprites/blueprints/painter-double.png":
{ {
"frame": {"x":373,"y":203,"w":192,"h":192}, "frame": {"x":3,"y":774,"w":192,"h":192},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":192,"h":192}, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":192},
@ -218,7 +218,7 @@
}, },
"sprites/blueprints/painter-quad.png": "sprites/blueprints/painter-quad.png":
{ {
"frame": {"x":373,"y":3,"w":374,"h":96}, "frame": {"x":3,"y":3,"w":374,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":374,"h":96}, "spriteSourceSize": {"x":3,"y":0,"w":374,"h":96},
@ -226,7 +226,7 @@
}, },
"sprites/blueprints/painter.png": "sprites/blueprints/painter.png":
{ {
"frame": {"x":751,"y":103,"w":192,"h":96}, "frame": {"x":3,"y":1165,"w":192,"h":96},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":192,"h":96}, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96},
@ -234,7 +234,7 @@
}, },
"sprites/blueprints/rotater-ccw.png": "sprites/blueprints/rotater-ccw.png":
{ {
"frame": {"x":1479,"y":103,"w":96,"h":96}, "frame": {"x":373,"y":249,"w":96,"h":96},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -242,7 +242,7 @@
}, },
"sprites/blueprints/rotater.png": "sprites/blueprints/rotater.png":
{ {
"frame": {"x":1459,"y":203,"w":96,"h":96}, "frame": {"x":373,"y":349,"w":96,"h":96},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -250,7 +250,7 @@
}, },
"sprites/blueprints/splitter-compact-inverse.png": "sprites/blueprints/splitter-compact-inverse.png":
{ {
"frame": {"x":1658,"y":203,"w":95,"h":93}, "frame": {"x":370,"y":849,"w":95,"h":93},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":1,"w":95,"h":93}, "spriteSourceSize": {"x":0,"y":1,"w":95,"h":93},
@ -258,7 +258,7 @@
}, },
"sprites/blueprints/splitter-compact.png": "sprites/blueprints/splitter-compact.png":
{ {
"frame": {"x":1757,"y":203,"w":93,"h":93}, "frame": {"x":369,"y":1120,"w":93,"h":93},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":1,"w":93,"h":93}, "spriteSourceSize": {"x":3,"y":1,"w":93,"h":93},
@ -266,7 +266,7 @@
}, },
"sprites/blueprints/splitter.png": "sprites/blueprints/splitter.png":
{ {
"frame": {"x":1304,"y":103,"w":171,"h":96}, "frame": {"x":3,"y":1565,"w":171,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":11,"y":0,"w":171,"h":96}, "spriteSourceSize": {"x":11,"y":0,"w":171,"h":96},
@ -274,7 +274,7 @@
}, },
"sprites/blueprints/stacker.png": "sprites/blueprints/stacker.png":
{ {
"frame": {"x":1317,"y":3,"w":175,"h":96}, "frame": {"x":296,"y":1317,"w":175,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":8,"y":0,"w":175,"h":96}, "spriteSourceSize": {"x":8,"y":0,"w":175,"h":96},
@ -282,7 +282,7 @@
}, },
"sprites/blueprints/trash-storage.png": "sprites/blueprints/trash-storage.png":
{ {
"frame": {"x":765,"y":203,"w":167,"h":192}, "frame": {"x":199,"y":774,"w":167,"h":192},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":167,"h":192}, "spriteSourceSize": {"x":14,"y":0,"w":167,"h":192},
@ -290,7 +290,7 @@
}, },
"sprites/blueprints/trash.png": "sprites/blueprints/trash.png":
{ {
"frame": {"x":1847,"y":3,"w":96,"h":96}, "frame": {"x":373,"y":449,"w":96,"h":96},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -298,7 +298,7 @@
}, },
"sprites/blueprints/underground_belt_entry-tier2.png": "sprites/blueprints/underground_belt_entry-tier2.png":
{ {
"frame": {"x":1587,"y":303,"w":93,"h":84}, "frame": {"x":199,"y":1261,"w":93,"h":84},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":12,"w":93,"h":84}, "spriteSourceSize": {"x":2,"y":12,"w":93,"h":84},
@ -306,7 +306,7 @@
}, },
"sprites/blueprints/underground_belt_entry.png": "sprites/blueprints/underground_belt_entry.png":
{ {
"frame": {"x":667,"y":398,"w":93,"h":75}, "frame": {"x":199,"y":1349,"w":93,"h":75},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":21,"w":93,"h":75}, "spriteSourceSize": {"x":2,"y":21,"w":93,"h":75},
@ -314,7 +314,7 @@
}, },
"sprites/blueprints/underground_belt_exit-tier2.png": "sprites/blueprints/underground_belt_exit-tier2.png":
{ {
"frame": {"x":569,"y":398,"w":94,"h":75}, "frame": {"x":369,"y":1041,"w":94,"h":75},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":94,"h":75}, "spriteSourceSize": {"x":2,"y":0,"w":94,"h":75},
@ -322,7 +322,7 @@
}, },
"sprites/blueprints/underground_belt_exit.png": "sprites/blueprints/underground_belt_exit.png":
{ {
"frame": {"x":1106,"y":398,"w":93,"h":75}, "frame": {"x":181,"y":1428,"w":93,"h":75},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":93,"h":75}, "spriteSourceSize": {"x":2,"y":0,"w":93,"h":75},
@ -330,7 +330,7 @@
}, },
"sprites/buildings/belt_left.png": "sprites/buildings/belt_left.png":
{ {
"frame": {"x":953,"y":399,"w":57,"h":57}, "frame": {"x":104,"y":1765,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -338,7 +338,7 @@
}, },
"sprites/buildings/belt_right.png": "sprites/buildings/belt_right.png":
{ {
"frame": {"x":1841,"y":367,"w":57,"h":57}, "frame": {"x":409,"y":1835,"w":57,"h":57},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57}, "spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -346,7 +346,7 @@
}, },
"sprites/buildings/belt_top.png": "sprites/buildings/belt_top.png":
{ {
"frame": {"x":1854,"y":231,"w":51,"h":63}, "frame": {"x":49,"y":1765,"w":51,"h":63},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63}, "spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -354,7 +354,7 @@
}, },
"sprites/buildings/cutter-quad.png": "sprites/buildings/cutter-quad.png":
{ {
"frame": {"x":751,"y":3,"w":366,"h":96}, "frame": {"x":3,"y":674,"w":366,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":11,"y":0,"w":366,"h":96}, "spriteSourceSize": {"x":11,"y":0,"w":366,"h":96},
@ -362,7 +362,7 @@
}, },
"sprites/buildings/cutter.png": "sprites/buildings/cutter.png":
{ {
"frame": {"x":1284,"y":203,"w":171,"h":96}, "frame": {"x":275,"y":1517,"w":171,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":11,"y":0,"w":171,"h":96}, "spriteSourceSize": {"x":11,"y":0,"w":171,"h":96},
@ -370,7 +370,7 @@
}, },
"sprites/buildings/hub.png": "sprites/buildings/hub.png":
{ {
"frame": {"x":3,"y":3,"w":366,"h":367}, "frame": {"x":3,"y":203,"w":366,"h":367},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":10,"w":366,"h":367}, "spriteSourceSize": {"x":9,"y":10,"w":366,"h":367},
@ -378,7 +378,7 @@
}, },
"sprites/buildings/miner-chainable.png": "sprites/buildings/miner-chainable.png":
{ {
"frame": {"x":1397,"y":303,"w":91,"h":95}, "frame": {"x":381,"y":3,"w":91,"h":95},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":91,"h":95}, "spriteSourceSize": {"x":3,"y":0,"w":91,"h":95},
@ -386,7 +386,7 @@
}, },
"sprites/buildings/miner.png": "sprites/buildings/miner.png":
{ {
"frame": {"x":1492,"y":303,"w":91,"h":95}, "frame": {"x":381,"y":102,"w":91,"h":95},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":91,"h":95}, "spriteSourceSize": {"x":3,"y":0,"w":91,"h":95},
@ -394,7 +394,7 @@
}, },
"sprites/buildings/mixer.png": "sprites/buildings/mixer.png":
{ {
"frame": {"x":1126,"y":103,"w":174,"h":96}, "frame": {"x":296,"y":1417,"w":174,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":174,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":174,"h":96},
@ -402,7 +402,7 @@
}, },
"sprites/buildings/painter-double.png": "sprites/buildings/painter-double.png":
{ {
"frame": {"x":569,"y":203,"w":192,"h":191}, "frame": {"x":3,"y":970,"w":192,"h":191},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":192,"h":191}, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":191},
@ -410,7 +410,7 @@
}, },
"sprites/buildings/painter-quad.png": "sprites/buildings/painter-quad.png":
{ {
"frame": {"x":373,"y":103,"w":374,"h":96}, "frame": {"x":3,"y":103,"w":374,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":374,"h":96}, "spriteSourceSize": {"x":3,"y":0,"w":374,"h":96},
@ -418,7 +418,7 @@
}, },
"sprites/buildings/painter.png": "sprites/buildings/painter.png":
{ {
"frame": {"x":1121,"y":3,"w":192,"h":96}, "frame": {"x":3,"y":1265,"w":192,"h":96},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":192,"h":96}, "spriteSourceSize": {"x":0,"y":0,"w":192,"h":96},
@ -426,7 +426,7 @@
}, },
"sprites/buildings/rotater-ccw.png": "sprites/buildings/rotater-ccw.png":
{ {
"frame": {"x":1559,"y":203,"w":95,"h":96}, "frame": {"x":373,"y":649,"w":95,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
@ -434,7 +434,7 @@
}, },
"sprites/buildings/rotater.png": "sprites/buildings/rotater.png":
{ {
"frame": {"x":1679,"y":103,"w":95,"h":96}, "frame": {"x":373,"y":749,"w":95,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":95,"h":96}, "spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
@ -442,7 +442,7 @@
}, },
"sprites/buildings/splitter-compact-inverse.png": "sprites/buildings/splitter-compact-inverse.png":
{ {
"frame": {"x":1106,"y":303,"w":94,"h":91}, "frame": {"x":370,"y":946,"w":94,"h":91},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":94,"h":91}, "spriteSourceSize": {"x":0,"y":2,"w":94,"h":91},
@ -450,7 +450,7 @@
}, },
"sprites/buildings/splitter-compact.png": "sprites/buildings/splitter-compact.png":
{ {
"frame": {"x":1204,"y":303,"w":93,"h":91}, "frame": {"x":199,"y":1166,"w":93,"h":91},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":2,"w":93,"h":91}, "spriteSourceSize": {"x":3,"y":2,"w":93,"h":91},
@ -458,7 +458,7 @@
}, },
"sprites/buildings/splitter.png": "sprites/buildings/splitter.png":
{ {
"frame": {"x":1672,"y":3,"w":171,"h":96}, "frame": {"x":3,"y":1665,"w":171,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":11,"y":0,"w":171,"h":96}, "spriteSourceSize": {"x":11,"y":0,"w":171,"h":96},
@ -466,7 +466,7 @@
}, },
"sprites/buildings/stacker.png": "sprites/buildings/stacker.png":
{ {
"frame": {"x":1106,"y":203,"w":174,"h":96}, "frame": {"x":3,"y":1365,"w":174,"h":96},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":174,"h":96}, "spriteSourceSize": {"x":9,"y":0,"w":174,"h":96},
@ -474,7 +474,7 @@
}, },
"sprites/buildings/trash-storage.png": "sprites/buildings/trash-storage.png":
{ {
"frame": {"x":936,"y":203,"w":166,"h":192}, "frame": {"x":199,"y":970,"w":166,"h":192},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":166,"h":192}, "spriteSourceSize": {"x":14,"y":0,"w":166,"h":192},
@ -482,7 +482,7 @@
}, },
"sprites/buildings/trash.png": "sprites/buildings/trash.png":
{ {
"frame": {"x":1579,"y":103,"w":96,"h":96}, "frame": {"x":373,"y":549,"w":96,"h":96},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96}, "spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -490,7 +490,7 @@
}, },
"sprites/buildings/underground_belt_entry-tier2.png": "sprites/buildings/underground_belt_entry-tier2.png":
{ {
"frame": {"x":1684,"y":300,"w":92,"h":83}, "frame": {"x":274,"y":1617,"w":92,"h":83},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":13,"w":92,"h":83}, "spriteSourceSize": {"x":3,"y":13,"w":92,"h":83},
@ -498,7 +498,7 @@
}, },
"sprites/buildings/underground_belt_entry.png": "sprites/buildings/underground_belt_entry.png":
{ {
"frame": {"x":373,"y":399,"w":92,"h":74}, "frame": {"x":370,"y":1617,"w":92,"h":74},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":22,"w":92,"h":74}, "spriteSourceSize": {"x":3,"y":22,"w":92,"h":74},
@ -506,7 +506,7 @@
}, },
"sprites/buildings/underground_belt_exit-tier2.png": "sprites/buildings/underground_belt_exit-tier2.png":
{ {
"frame": {"x":469,"y":399,"w":92,"h":74}, "frame": {"x":370,"y":1695,"w":92,"h":74},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":74}, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":74},
@ -514,7 +514,7 @@
}, },
"sprites/buildings/underground_belt_exit.png": "sprites/buildings/underground_belt_exit.png":
{ {
"frame": {"x":764,"y":399,"w":92,"h":74}, "frame": {"x":274,"y":1704,"w":92,"h":74},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":74}, "spriteSourceSize": {"x":3,"y":0,"w":92,"h":74},
@ -522,7 +522,7 @@
}, },
"sprites/debug/acceptor_slot.png": "sprites/debug/acceptor_slot.png":
{ {
"frame": {"x":1075,"y":399,"w":26,"h":32}, "frame": {"x":240,"y":1707,"w":26,"h":32},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":26,"h":32}, "spriteSourceSize": {"x":3,"y":0,"w":26,"h":32},
@ -530,7 +530,7 @@
}, },
"sprites/debug/ejector_slot.png": "sprites/debug/ejector_slot.png":
{ {
"frame": {"x":1810,"y":423,"w":26,"h":32}, "frame": {"x":240,"y":1743,"w":26,"h":32},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":26,"h":32}, "spriteSourceSize": {"x":3,"y":0,"w":26,"h":32},
@ -538,7 +538,7 @@
}, },
"sprites/map_overview/belt_forward.png": "sprites/map_overview/belt_forward.png":
{ {
"frame": {"x":1854,"y":203,"w":14,"h":16}, "frame": {"x":181,"y":1365,"w":14,"h":16},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":14,"h":16}, "spriteSourceSize": {"x":1,"y":0,"w":14,"h":16},
@ -546,7 +546,7 @@
}, },
"sprites/map_overview/belt_left.png": "sprites/map_overview/belt_left.png":
{ {
"frame": {"x":860,"y":446,"w":15,"h":15}, "frame": {"x":342,"y":1166,"w":15,"h":15},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":0,"y":1,"w":15,"h":15}, "spriteSourceSize": {"x":0,"y":1,"w":15,"h":15},
@ -554,7 +554,7 @@
}, },
"sprites/map_overview/belt_right.png": "sprites/map_overview/belt_right.png":
{ {
"frame": {"x":1075,"y":435,"w":15,"h":15}, "frame": {"x":342,"y":1185,"w":15,"h":15},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":15,"h":15}, "spriteSourceSize": {"x":1,"y":1,"w":15,"h":15},
@ -562,7 +562,7 @@
}, },
"sprites/misc/deletion_marker.png": "sprites/misc/deletion_marker.png":
{ {
"frame": {"x":1840,"y":428,"w":42,"h":42}, "frame": {"x":296,"y":1166,"w":42,"h":42},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":3,"w":42,"h":42}, "spriteSourceSize": {"x":3,"y":3,"w":42,"h":42},
@ -570,7 +570,7 @@
}, },
"sprites/misc/slot_bad_arrow.png": "sprites/misc/slot_bad_arrow.png":
{ {
"frame": {"x":1840,"y":428,"w":42,"h":42}, "frame": {"x":296,"y":1166,"w":42,"h":42},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":3,"w":42,"h":42}, "spriteSourceSize": {"x":3,"y":3,"w":42,"h":42},
@ -578,7 +578,7 @@
}, },
"sprites/misc/slot_good_arrow.png": "sprites/misc/slot_good_arrow.png":
{ {
"frame": {"x":1764,"y":423,"w":42,"h":48}, "frame": {"x":3,"y":1782,"w":42,"h":48},
"rotated": false, "rotated": false,
"trimmed": true, "trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":42,"h":48}, "spriteSourceSize": {"x":3,"y":0,"w":42,"h":48},
@ -586,19 +586,27 @@
}, },
"sprites/misc/storage_overlay.png": "sprites/misc/storage_overlay.png":
{ {
"frame": {"x":860,"y":399,"w":89,"h":43}, "frame": {"x":381,"y":201,"w":89,"h":44},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":89,"h":43}, "spriteSourceSize": {"x":1,"y":1,"w":89,"h":44},
"sourceSize": {"w":89,"h":43} "sourceSize": {"w":90,"h":45}
},
"sprites/misc/waypoint.png":
{
"frame": {"x":181,"y":1385,"w":14,"h":16},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":14,"h":16},
"sourceSize": {"w":16,"h":16}
}}, }},
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
"version": "1.0", "version": "1.0",
"image": "atlas0_50.png", "image": "atlas0_50.png",
"format": "RGBA8888", "format": "RGBA8888",
"size": {"w":1963,"h":476}, "size": {"w":475,"h":1968},
"scale": "0.5", "scale": "0.5",
"smartupdate": "$TexturePacker:SmartUpdate:c2a63b817240ea11b013f390be5c690a:0c1b9b304a864f030526d8b9e8ae3352:f159918d23e5952766c6d23ab52278c6$" "smartupdate": "$TexturePacker:SmartUpdate:feeaacb789d7182e6aef553861c19982:774c2c10210542582abaa8efc495510d:f159918d23e5952766c6d23ab52278c6$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 381 KiB

After

Width:  |  Height:  |  Size: 380 KiB

View File

@ -586,11 +586,19 @@
}, },
"sprites/misc/storage_overlay.png": "sprites/misc/storage_overlay.png":
{ {
"frame": {"x":1403,"y":939,"w":133,"h":65}, "frame": {"x":1403,"y":939,"w":133,"h":66},
"rotated": false, "rotated": false,
"trimmed": false, "trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":133,"h":65}, "spriteSourceSize": {"x":2,"y":2,"w":133,"h":66},
"sourceSize": {"w":133,"h":65} "sourceSize": {"w":135,"h":68}
},
"sprites/misc/waypoint.png":
{
"frame": {"x":1649,"y":997,"w":20,"h":24},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":20,"h":24},
"sourceSize": {"w":24,"h":24}
}}, }},
"meta": { "meta": {
"app": "https://www.codeandweb.com/texturepacker", "app": "https://www.codeandweb.com/texturepacker",
@ -599,6 +607,6 @@
"format": "RGBA8888", "format": "RGBA8888",
"size": {"w":2016,"h":1024}, "size": {"w":2016,"h":1024},
"scale": "0.75", "scale": "0.75",
"smartupdate": "$TexturePacker:SmartUpdate:c2a63b817240ea11b013f390be5c690a:0c1b9b304a864f030526d8b9e8ae3352:f159918d23e5952766c6d23ab52278c6$" "smartupdate": "$TexturePacker:SmartUpdate:feeaacb789d7182e6aef553861c19982:774c2c10210542582abaa8efc495510d:f159918d23e5952766c6d23ab52278c6$"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 746 KiB

After

Width:  |  Height:  |  Size: 746 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 B

View File

@ -250,7 +250,7 @@ input[type="email"] {
opacity: 0.4; opacity: 0.4;
} }
transition: background-color 0.4s ease-in-out !important; transition: background-color 0.1s ease-in-out !important;
@include TextShadow3D(#fff); @include TextShadow3D(#fff);
@include BoxShadow3D(lighten($mainBgColor, 30)); @include BoxShadow3D(lighten($mainBgColor, 30));

View File

@ -0,0 +1,39 @@
#ingame_HUD_BlueprintPlacer {
position: absolute;
@include S(top, 50px);
left: 50%;
transform: translateX(-50%);
color: #333;
z-index: 9999;
background: rgba(0, 10, 20, 0.5);
@include S(padding, 5px);
display: flex;
flex-direction: column;
color: #fff;
@include S(width, 120px);
align-items: center;
justify-content: center;
.label {
@include PlainText;
text-transform: uppercase;
}
.costContainer {
display: flex;
align-items: center;
@include Heading;
> canvas {
@include S(margin-left, 5px);
@include S(width, 30px);
@include S(height, 30px);
}
}
&:not(.canAfford) {
background: rgba(98, 27, 41, 0.8);
// .costContainer {
color: rgb(255, 97, 128);
// }
}
}

View File

@ -94,6 +94,7 @@
.keybinding { .keybinding {
position: relative; position: relative;
} }
font-weight: bold !important;
@include DarkThemeOverride { @include DarkThemeOverride {
color: rgba(#fff, 0.5); color: rgba(#fff, 0.5);

View File

@ -11,7 +11,7 @@
border-bottom-width: 0; border-bottom-width: 0;
transition: transform 0.12s ease-in-out; transition: transform 0.12s ease-in-out;
background: rgba(mix(#ddd, $colorBlueBright, 80%), 0.89); background: rgba(mix(#ddd, $colorBlueBright, 80%), 0.69);
&:not(.visible) { &:not(.visible) {
transform: translateX(-50%) translateY(#{D(100px)}); transform: translateX(-50%) translateY(#{D(100px)});

View File

@ -121,6 +121,24 @@
> strong { > strong {
font-weight: bold; font-weight: bold;
} }
.keybinding {
position: relative;
background: #eee;
@include PlainText;
height: unset;
margin: 1px 0;
}
input {
background: #eee;
color: #333438;
width: 100%;
&.errored {
background-color: rgb(250, 206, 206);
}
}
} }
> .buttons { > .buttons {

View File

@ -6,6 +6,8 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
color: #fff;
text-shadow: #{D(1px)} #{D(1px)} 0 rgba(0, 10, 20, 0.1);
> .binding { > .binding {
display: inline-grid; display: inline-grid;
@ -20,7 +22,7 @@
@include S(height, 10px); @include S(height, 10px);
width: 1px; width: 1px;
@include S(margin, 0, 3px); @include S(margin, 0, 3px);
background-color: #888; background-color: #fff;
transform: rotate(10deg); transform: rotate(10deg);
// @include S(margin, 0, 3px); // @include S(margin, 0, 3px);
} }
@ -43,9 +45,7 @@
color: $accentColorDark; color: $accentColorDark;
@include SuperSmallText; @include SuperSmallText;
text-transform: uppercase; text-transform: uppercase;
// font-weight: bold;
color: #fff; color: #fff;
text-shadow: #{D(1px)} #{D(1px)} 0 rgba(0, 10, 20, 0.1);
@include S(margin-left, 5px); @include S(margin-left, 5px);
} }

View File

@ -12,7 +12,7 @@
.keybinding { .keybinding {
vertical-align: middle; vertical-align: middle;
@include S(margin, 0, 4px); @include S(margin, 0, 1px);
position: relative; position: relative;
top: unset; top: unset;
left: unset; left: unset;

View File

@ -0,0 +1,67 @@
#ingame_HUD_Waypoints_Hint {
position: absolute;
@include S(right, 10px);
@include S(bottom, 100px);
display: flex;
flex-direction: column;
@include PlainText;
@include S(width, 150px);
background: rgba(0, 10, 20, 0.5);
@include S(padding, 5px);
color: #eee;
.desc {
@include SuperSmallText;
color: #babcbf;
.keybinding {
position: relative;
}
strong {
color: #fff;
}
}
}
#ingame_HUD_Waypoints {
position: absolute;
@include S(right, 10px);
@include S(top, 60px);
display: flex;
flex-direction: column;
@include DarkThemeInvert();
.waypoint {
@include SuperSmallText;
pointer-events: all;
cursor: pointer;
color: #000;
@include S(padding-left, 11px);
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
background: uiResource("icons/waypoint.png") left 50% / #{D(8px)} no-repeat;
opacity: 0.5;
@include S(margin-bottom, 1px);
font-weight: bold;
&:hover {
opacity: 1;
}
.deleteButton {
@include S(width, 10px);
@include S(height, 10px);
@include S(margin-left, 4px);
background: uiResource("icons/close.png") center center / 60% no-repeat;
pointer-events: all;
cursor: pointer;
&:hover {
transform: scale(1.5);
}
}
}
}

View File

@ -47,6 +47,8 @@
@import "ingame_hud/entity_debugger"; @import "ingame_hud/entity_debugger";
@import "ingame_hud/tutorial_hints"; @import "ingame_hud/tutorial_hints";
@import "ingame_hud/watermark"; @import "ingame_hud/watermark";
@import "ingame_hud/blueprint_placer";
@import "ingame_hud/waypoints";
// prettier-ignore // prettier-ignore
$elements: $elements:
@ -55,6 +57,7 @@ ingame_Canvas,
ingame_VignetteOverlay, ingame_VignetteOverlay,
// Ingame overlays // Ingame overlays
ingame_HUD_Waypoints,
ingame_HUD_PlacementHints, ingame_HUD_PlacementHints,
ingame_HUD_PlacerVariants, ingame_HUD_PlacerVariants,
@ -68,6 +71,8 @@ ingame_HUD_DebugInfo,
ingame_HUD_EntityDebugger, ingame_HUD_EntityDebugger,
ingame_HUD_TutorialHints, ingame_HUD_TutorialHints,
ingame_HUD_buildings_toolbar, ingame_HUD_buildings_toolbar,
ingame_HUD_BlueprintPlacer,
ingame_HUD_Waypoints_Hint,
ingame_HUD_Watermark, ingame_HUD_Watermark,
// Overlays // Overlays

View File

@ -235,7 +235,7 @@
opacity: 0.5; opacity: 0.5;
} }
.updateTime { .level {
grid-column: 1 / 2; grid-column: 1 / 2;
grid-row: 1 / 2; grid-row: 1 / 2;
@include PlainText; @include PlainText;

View File

@ -1,14 +1,26 @@
export const CHANGELOG = [ export const CHANGELOG = [
{
version: "1.1.1",
date: "28.05.2020",
entries: ["Fix crash when 'Show Hints' setting was turned off"],
},
{ {
version: "1.1.0", version: "1.1.0",
date: "unreleased", date: "28.05.2020",
entries: [ entries: [
"BLUEPRINTS!", "BLUEPRINTS! They are unlocked at level 12 and cost a special shape to build.",
"MAP MARKERS! Press 'M' to create a waypoint and be able to jump to it",
"Savegame levels are now shown in the main menu. For existing games, save them again to make the level show up.",
"Allow holding SHIFT to rotate counter clockwise", "Allow holding SHIFT to rotate counter clockwise",
"Allow changing all keybindings, including CTRL, ALT and SHIFT (by Dimava)",
"Added confirmation when deleting more than 500 buildings at a time", "Added confirmation when deleting more than 500 buildings at a time",
"Added background to toolbar to increase contrast", "Added background to toolbar to increase contrast",
"Further decerase requirements of first levels",
"Pinned shapes now are saved",
"Allow placing extractors anywhere again, but they don't work at all if not placed on a resource", "Allow placing extractors anywhere again, but they don't work at all if not placed on a resource",
"Show dialog explaining some keybindings after completing level 4",
"Fix keys being stuck when opening a dialog",
"Swapped shape order for painting upgrades",
"Allow changing all keybindings, including CTRL, ALT and SHIFT (by Dimava)",
"Fix cycling through keybindings selecting locked buildings as well (by Dimava)", "Fix cycling through keybindings selecting locked buildings as well (by Dimava)",
"There is now a github action, checking all pull requests with eslint. (by mrHedgehog)", "There is now a github action, checking all pull requests with eslint. (by mrHedgehog)",
], ],

View File

@ -23,6 +23,11 @@ export class InputDistributor {
/** @type {Array<function(any) : boolean>} */ /** @type {Array<function(any) : boolean>} */
this.filters = []; this.filters = [];
/**
* All keys which are currently down
*/
this.keysDown = new Set();
this.bindToEvents(); this.bindToEvents();
} }
@ -173,6 +178,7 @@ export class InputDistributor {
*/ */
handleBlur() { handleBlur() {
this.forwardToReceiver("pageBlur", {}); this.forwardToReceiver("pageBlur", {});
this.keysDown.clear();
} }
/** /**
@ -180,19 +186,24 @@ export class InputDistributor {
*/ */
handleKeydown(event) { handleKeydown(event) {
if ( if (
// TAB event.keyCode === 9 || // TAB
event.keyCode === 9 || event.keyCode === 16 || // SHIFT
// F1 - F10 event.keyCode === 17 || // CTRL
(event.keyCode >= 112 && event.keyCode < 122) event.keyCode === 18 || // ALT
(event.keyCode >= 112 && event.keyCode < 122) // F1 - F10
) { ) {
event.preventDefault(); event.preventDefault();
} }
const isInitial = !this.keysDown.has(event.keyCode);
this.keysDown.add(event.keyCode);
if ( if (
this.forwardToReceiver("keydown", { this.forwardToReceiver("keydown", {
keyCode: event.keyCode, keyCode: event.keyCode,
shift: event.shiftKey, shift: event.shiftKey,
alt: event.altKey, alt: event.altKey,
initial: isInitial,
event, event,
}) === STOP_PROPAGATION }) === STOP_PROPAGATION
) { ) {
@ -212,6 +223,8 @@ export class InputDistributor {
* @param {KeyboardEvent} event * @param {KeyboardEvent} event
*/ */
handleKeyup(event) { handleKeyup(event) {
this.keysDown.delete(event.keyCode);
this.forwardToReceiver("keyup", { this.forwardToReceiver("keyup", {
keyCode: event.keyCode, keyCode: event.keyCode,
shift: event.shiftKey, shift: event.shiftKey,

View File

@ -385,6 +385,8 @@ export class DialogWithForm extends Dialog {
}); });
this.confirmButtonId = confirmButton.split(":")[0]; this.confirmButtonId = confirmButton.split(":")[0];
this.formElements = formElements; this.formElements = formElements;
this.enterHandler = "ok";
} }
internalButtonHandler(id, ...payload) { internalButtonHandler(id, ...payload) {

View File

@ -49,17 +49,35 @@ function stringPolyfills() {
} }
function objectPolyfills() { function objectPolyfills() {
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries // https://github.com/tc39/proposal-object-values-entries/blob/master/polyfill.js
// @ts-ignore
if (!Object.entries) {
// @ts-ignore
Object.entries = function (obj) {
var ownProps = Object.keys(obj),
i = ownProps.length,
resArray = new Array(i); // preallocate the Array
while (i--) resArray[i] = [ownProps[i], obj[ownProps[i]]];
return resArray; // @ts-ignore
const reduce = Function.bind.call(Function.call, Array.prototype.reduce);
// @ts-ignore
const isEnumerable = Function.bind.call(Function.call, Object.prototype.propertyIsEnumerable);
// @ts-ignore
const concat = Function.bind.call(Function.call, Array.prototype.concat);
const keys = Reflect.ownKeys;
// @ts-ignore
if (!Object.values) {
// @ts-ignore
Object.values = function values(O) {
return reduce(
keys(O),
(v, k) => concat(v, typeof k === "string" && isEnumerable(O, k) ? [O[k]] : []),
[]
);
};
}
if (!Object.entries) {
Object.entries = function entries(O) {
return reduce(
keys(O),
(e, k) => concat(e, typeof k === "string" && isEnumerable(O, k) ? [[k, O[k]]] : []),
[]
);
}; };
} }
} }

View File

@ -86,7 +86,6 @@ export class AtlasSprite extends BaseSprite {
if (G_IS_DEV) { if (G_IS_DEV) {
assert(context instanceof CanvasRenderingContext2D, "Not a valid context"); assert(context instanceof CanvasRenderingContext2D, "Not a valid context");
} }
console.warn("drawing sprite regulary");
const link = this.linksByResolution[ORIGINAL_SCALE]; const link = this.linksByResolution[ORIGINAL_SCALE];

View File

@ -100,7 +100,7 @@ export class Camera extends BasicSerializableObject {
this.bindKeys(); this.bindKeys();
if (G_IS_DEV) { if (G_IS_DEV) {
window.addEventListener("keydown", ev => { window.addEventListener("keydown", ev => {
if (ev.key === "l") { if (ev.key === "i") {
this.zoomLevel = 3; this.zoomLevel = 3;
} }
}); });
@ -147,6 +147,14 @@ export class Camera extends BasicSerializableObject {
this.currentlyMoving = false; this.currentlyMoving = false;
} }
/**
* Sets a desired zoom level
* @param {number} zoom
*/
setDesiredZoom(zoom) {
this.desiredZoom = zoom;
}
/** /**
* Returns if this camera is currently moving by a non-user interaction * Returns if this camera is currently moving by a non-user interaction
*/ */
@ -337,15 +345,15 @@ export class Camera extends BasicSerializableObject {
*/ */
bindKeys() { bindKeys() {
const mapper = this.root.keyMapper; const mapper = this.root.keyMapper;
mapper.getBinding(KEYMAPPINGS.ingame.mapMoveUp).add(() => (this.keyboardForce.y = -1)); mapper
.getBinding(KEYMAPPINGS.ingame.mapMoveUp)
.add(() => console.log("move up") || (this.keyboardForce.y = -1));
mapper.getBinding(KEYMAPPINGS.ingame.mapMoveDown).add(() => (this.keyboardForce.y = 1)); mapper.getBinding(KEYMAPPINGS.ingame.mapMoveDown).add(() => (this.keyboardForce.y = 1));
mapper.getBinding(KEYMAPPINGS.ingame.mapMoveRight).add(() => (this.keyboardForce.x = 1)); mapper.getBinding(KEYMAPPINGS.ingame.mapMoveRight).add(() => (this.keyboardForce.x = 1));
mapper.getBinding(KEYMAPPINGS.ingame.mapMoveLeft).add(() => (this.keyboardForce.x = -1)); mapper.getBinding(KEYMAPPINGS.ingame.mapMoveLeft).add(() => (this.keyboardForce.x = -1));
mapper.getBinding(KEYMAPPINGS.ingame.mapZoomIn).add(() => (this.desiredZoom = this.zoomLevel * 1.2)); mapper.getBinding(KEYMAPPINGS.ingame.mapZoomIn).add(() => (this.desiredZoom = this.zoomLevel * 1.2));
mapper.getBinding(KEYMAPPINGS.ingame.mapZoomOut).add(() => (this.desiredZoom = this.zoomLevel * 0.8)); mapper.getBinding(KEYMAPPINGS.ingame.mapZoomOut).add(() => (this.desiredZoom = this.zoomLevel * 0.8));
mapper.getBinding(KEYMAPPINGS.ingame.centerMap).add(() => this.centerOnMap());
} }
centerOnMap() { centerOnMap() {
@ -873,19 +881,19 @@ export class Camera extends BasicSerializableObject {
let forceY = 0; let forceY = 0;
const actionMapper = this.root.keyMapper; const actionMapper = this.root.keyMapper;
if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveUp).currentlyDown) { if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveUp).isCurrentlyPressed()) {
forceY -= 1; forceY -= 1;
} }
if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveDown).currentlyDown) { if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveDown).isCurrentlyPressed()) {
forceY += 1; forceY += 1;
} }
if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveLeft).currentlyDown) { if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveLeft).isCurrentlyPressed()) {
forceX -= 1; forceX -= 1;
} }
if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveRight).currentlyDown) { if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveRight).isCurrentlyPressed()) {
forceX += 1; forceX += 1;
} }

View File

@ -61,6 +61,7 @@ export class ItemAcceptorComponent extends Component {
slotsCopy.push({ slotsCopy.push({
pos: slot.pos.copy(), pos: slot.pos.copy(),
directions: slot.directions.slice(), directions: slot.directions.slice(),
filter: slot.filter,
}); });
} }

View File

@ -8,7 +8,7 @@ import { enumItemProcessorTypes } from "./components/item_processor";
import { GameRoot } from "./root"; import { GameRoot } from "./root";
import { enumSubShape, ShapeDefinition } from "./shape_definition"; import { enumSubShape, ShapeDefinition } from "./shape_definition";
import { enumHubGoalRewards, tutorialGoals } from "./tutorial_goals"; import { enumHubGoalRewards, tutorialGoals } from "./tutorial_goals";
import { UPGRADES } from "./upgrades"; import { UPGRADES, blueprintShape } from "./upgrades";
export class HubGoals extends BasicSerializableObject { export class HubGoals extends BasicSerializableObject {
static getId() { static getId() {
@ -53,6 +53,10 @@ export class HubGoals extends BasicSerializableObject {
} }
this.upgradeImprovements[upgradeId] = totalImprovement; this.upgradeImprovements[upgradeId] = totalImprovement;
} }
if (G_IS_DEV) {
this.storedShapes[blueprintShape] = 1000;
}
} }
/** /**
@ -77,6 +81,10 @@ export class HubGoals extends BasicSerializableObject {
*/ */
this.storedShapes = {}; this.storedShapes = {};
if (G_IS_DEV) {
this.storedShapes[blueprintShape] = 1000;
}
/** /**
* Stores the levels for all upgrades * Stores the levels for all upgrades
* @type {Object<string, number>} * @type {Object<string, number>}
@ -113,6 +121,19 @@ export class HubGoals extends BasicSerializableObject {
getShapesStored(definition) { getShapesStored(definition) {
return this.storedShapes[definition.getHash()] || 0; return this.storedShapes[definition.getHash()] || 0;
} }
/**
* @param {string} key
* @param {number} amount
*/
takeShapeByKey(key, amount) {
assert(this.getShapesStoredByKey(key) >= amount, "Can not afford: " + key + " x " + amount);
assert(amount > 0, "Amount <= 0 for " + key);
assert(Number.isInteger(amount), "Invalid amount: " + amount);
this.storedShapes[key] -= amount;
return;
}
/** /**
* Returns how much of the current shape is stored * Returns how much of the current shape is stored
* @param {string} key * @param {string} key

View File

@ -72,9 +72,16 @@ export class BaseHUDPart {
} }
/** /**
* Cleans up the hud element, if overridden make sure to call super.cleanups * Cleans up the hud element, if overridden make sure to call super.cleanup
*/ */
cleanup() { cleanup() {
this.cleanupClickDetectors();
}
/**
* Cleans up all click detectors
*/
cleanupClickDetectors() {
if (this.clickDetectors) { if (this.clickDetectors) {
for (let i = 0; i < this.clickDetectors.length; ++i) { for (let i = 0; i < this.clickDetectors.length; ++i) {
this.clickDetectors[i].cleanup(); this.clickDetectors[i].cleanup();

View File

@ -7,7 +7,6 @@ import { DrawParameters } from "../../core/draw_parameters";
import { HUDProcessingOverlay } from "./parts/processing_overlay"; import { HUDProcessingOverlay } from "./parts/processing_overlay";
import { HUDBuildingsToolbar } from "./parts/buildings_toolbar"; import { HUDBuildingsToolbar } from "./parts/buildings_toolbar";
import { HUDBuildingPlacer } from "./parts/building_placer"; import { HUDBuildingPlacer } from "./parts/building_placer";
import { HUDBetaOverlay } from "./parts/beta_overlay";
import { HUDBlueprintPlacer } from "./parts/blueprint_placer"; import { HUDBlueprintPlacer } from "./parts/blueprint_placer";
import { HUDKeybindingOverlay } from "./parts/keybinding_overlay"; import { HUDKeybindingOverlay } from "./parts/keybinding_overlay";
import { HUDUnlockNotification } from "./parts/unlock_notification"; import { HUDUnlockNotification } from "./parts/unlock_notification";
@ -28,6 +27,7 @@ import { KEYMAPPINGS } from "../key_action_mapper";
import { HUDWatermark } from "./parts/watermark"; import { HUDWatermark } from "./parts/watermark";
import { HUDModalDialogs } from "./parts/modal_dialogs"; import { HUDModalDialogs } from "./parts/modal_dialogs";
import { HUDPartTutorialHints } from "./parts/tutorial_hints"; import { HUDPartTutorialHints } from "./parts/tutorial_hints";
import { HUDWaypoints } from "./parts/waypoints";
export class GameHUD { export class GameHUD {
/** /**
@ -43,30 +43,23 @@ export class GameHUD {
initialize() { initialize() {
this.parts = { this.parts = {
processingOverlay: new HUDProcessingOverlay(this.root), processingOverlay: new HUDProcessingOverlay(this.root),
buildingsToolbar: new HUDBuildingsToolbar(this.root), buildingsToolbar: new HUDBuildingsToolbar(this.root),
buildingPlacer: new HUDBuildingPlacer(this.root), buildingPlacer: new HUDBuildingPlacer(this.root),
blueprintPlacer: new HUDBlueprintPlacer(this.root), blueprintPlacer: new HUDBlueprintPlacer(this.root),
unlockNotification: new HUDUnlockNotification(this.root), unlockNotification: new HUDUnlockNotification(this.root),
gameMenu: new HUDGameMenu(this.root), gameMenu: new HUDGameMenu(this.root),
massSelector: new HUDMassSelector(this.root), massSelector: new HUDMassSelector(this.root),
shop: new HUDShop(this.root), shop: new HUDShop(this.root),
statistics: new HUDStatistics(this.root), statistics: new HUDStatistics(this.root),
waypoints: new HUDWaypoints(this.root),
vignetteOverlay: new HUDVignetteOverlay(this.root), vignetteOverlay: new HUDVignetteOverlay(this.root),
// Must always exist
pinnedShapes: new HUDPinnedShapes(this.root), pinnedShapes: new HUDPinnedShapes(this.root),
notifications: new HUDNotifications(this.root), notifications: new HUDNotifications(this.root),
settingsMenu: new HUDSettingsMenu(this.root), settingsMenu: new HUDSettingsMenu(this.root),
// betaOverlay: new HUDBetaOverlay(this.root), // betaOverlay: new HUDBetaOverlay(this.root),
debugInfo: new HUDDebugInfo(this.root), debugInfo: new HUDDebugInfo(this.root),
dialogs: new HUDModalDialogs(this.root), dialogs: new HUDModalDialogs(this.root),
}; };
@ -188,7 +181,7 @@ export class GameHUD {
* @param {DrawParameters} parameters * @param {DrawParameters} parameters
*/ */
draw(parameters) { draw(parameters) {
const partsOrder = ["massSelector", "buildingPlacer", "blueprintPlacer"]; const partsOrder = ["waypoints", "massSelector", "buildingPlacer", "blueprintPlacer"];
for (let i = 0; i < partsOrder.length; ++i) { for (let i = 0; i < partsOrder.length; ++i) {
if (this.parts[partsOrder[i]]) { if (this.parts[partsOrder[i]]) {

View File

@ -4,6 +4,9 @@ import { createLogger } from "../../../core/logging";
import { Vector } from "../../../core/vector"; import { Vector } from "../../../core/vector";
import { Entity } from "../../entity"; import { Entity } from "../../entity";
import { GameRoot } from "../../root"; import { GameRoot } from "../../root";
import { findNiceIntegerValue } from "../../../core/utils";
import { Math_pow } from "../../../core/builtins";
import { blueprintShape } from "../../upgrades";
const logger = createLogger("blueprint"); const logger = createLogger("blueprint");
@ -47,6 +50,13 @@ export class Blueprint {
return new Blueprint(newEntities); return new Blueprint(newEntities);
} }
/**
* Returns the cost of this blueprint in shapes
*/
getCost() {
return findNiceIntegerValue(4 * Math_pow(this.entities.length, 1.1));
}
/** /**
* Draws the blueprint at the given origin * Draws the blueprint at the given origin
* @param {DrawParameters} parameters * @param {DrawParameters} parameters
@ -147,6 +157,13 @@ export class Blueprint {
return anyPlaceable; return anyPlaceable;
} }
/**
* @param {GameRoot} root
*/
canAfford(root) {
return root.hubGoals.getShapesStoredByKey(blueprintShape) >= this.getCost();
}
/** /**
* Attempts to place the blueprint at the given tile * Attempts to place the blueprint at the given tile
* @param {GameRoot} root * @param {GameRoot} root

View File

@ -6,9 +6,23 @@ import { enumMouseButton } from "../../camera";
import { KEYMAPPINGS } from "../../key_action_mapper"; import { KEYMAPPINGS } from "../../key_action_mapper";
import { BaseHUDPart } from "../base_hud_part"; import { BaseHUDPart } from "../base_hud_part";
import { Blueprint } from "./blueprint"; import { Blueprint } from "./blueprint";
import { makeDiv } from "../../../core/utils";
import { DynamicDomAttach } from "../dynamic_dom_attach";
import { blueprintShape } from "../../upgrades";
import { T } from "../../../translations";
export class HUDBlueprintPlacer extends BaseHUDPart { export class HUDBlueprintPlacer extends BaseHUDPart {
createElements(parent) {} createElements(parent) {
const blueprintCostShape = this.root.shapeDefinitionMgr.getShapeFromShortKey(blueprintShape);
const blueprintCostShapeCanvas = blueprintCostShape.generateAsCanvas(80);
this.costDisplayParent = makeDiv(parent, "ingame_HUD_BlueprintPlacer", [], ``);
makeDiv(this.costDisplayParent, null, ["label"], T.ingame.blueprintPlacer.cost);
const costContainer = makeDiv(this.costDisplayParent, null, ["costContainer"], "");
this.costDisplayText = makeDiv(costContainer, null, ["costText"], "");
costContainer.appendChild(blueprintCostShapeCanvas);
}
initialize() { initialize() {
this.root.hud.signals.buildingsSelectedForCopy.add(this.onBuildingsSelected, this); this.root.hud.signals.buildingsSelectedForCopy.add(this.onBuildingsSelected, this);
@ -27,6 +41,9 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
this.root.camera.movePreHandler.add(this.onMouseMove, this); this.root.camera.movePreHandler.add(this.onMouseMove, this);
this.root.hud.signals.selectedPlacementBuildingChanged.add(this.abortPlacement, this); this.root.hud.signals.selectedPlacementBuildingChanged.add(this.abortPlacement, this);
this.domAttach = new DynamicDomAttach(this.root, this.costDisplayParent);
this.trackedCanAfford = new TrackedState(this.onCanAffordChanged, this);
} }
abortPlacement() { abortPlacement() {
@ -37,7 +54,25 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
} }
} }
onBlueprintChanged(blueprint) {} onCanAffordChanged(canAfford) {
this.costDisplayParent.classList.toggle("canAfford", canAfford);
}
update() {
this.domAttach.update(this.currentBlueprint.get());
this.trackedCanAfford.set(
this.currentBlueprint.get() && this.currentBlueprint.get().canAfford(this.root)
);
}
/**
* @param {Blueprint} blueprint
*/
onBlueprintChanged(blueprint) {
if (blueprint) {
this.costDisplayText.innerText = "" + blueprint.getCost();
}
}
/** /**
* mouse down pre handler * mouse down pre handler
@ -46,8 +81,10 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
*/ */
onMouseDown(pos, button) { onMouseDown(pos, button) {
if (button === enumMouseButton.right) { if (button === enumMouseButton.right) {
this.abortPlacement(); if (this.currentBlueprint.get()) {
return STOP_PROPAGATION; this.abortPlacement();
return STOP_PROPAGATION;
}
} }
const blueprint = this.currentBlueprint.get(); const blueprint = this.currentBlueprint.get();
@ -55,11 +92,19 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
return; return;
} }
if (!blueprint.canAfford(this.root)) {
this.root.soundProxy.playUiError();
return;
}
const worldPos = this.root.camera.screenToWorld(pos); const worldPos = this.root.camera.screenToWorld(pos);
const tile = worldPos.toTileSpace(); const tile = worldPos.toTileSpace();
if (blueprint.tryPlace(this.root, tile)) { if (blueprint.tryPlace(this.root, tile)) {
const cost = blueprint.getCost();
this.root.hubGoals.takeShapeByKey(blueprintShape, cost);
// This actually feels weird // This actually feels weird
// if (!this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.placeMultiple).currentlyDown) { // if (!this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.placeMultiple).isCurrentlyPressed()) {
// this.currentBlueprint.set(null); // this.currentBlueprint.set(null);
// } // }
} }
@ -84,7 +129,11 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
rotateBlueprint() { rotateBlueprint() {
if (this.currentBlueprint.get()) { if (this.currentBlueprint.get()) {
if (this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateInverseModifier).currentlyDown) { if (
this.root.keyMapper
.getBinding(KEYMAPPINGS.placement.rotateInverseModifier)
.isCurrentlyPressed()
) {
this.currentBlueprint.get().rotateCcw(); this.currentBlueprint.get().rotateCcw();
} else { } else {
this.currentBlueprint.get().rotateCw(); this.currentBlueprint.get().rotateCw();

View File

@ -161,9 +161,9 @@ export class HUDBuildingPlacer extends BaseHUDPart {
if ( if (
metaBuilding && metaBuilding &&
metaBuilding.getRotateAutomaticallyWhilePlacing(this.currentVariant.get()) && metaBuilding.getRotateAutomaticallyWhilePlacing(this.currentVariant.get()) &&
!this.root.keyMapper.getBinding( !this.root.keyMapper
KEYMAPPINGS.placementModifiers.placementDisableAutoOrientation .getBinding(KEYMAPPINGS.placementModifiers.placementDisableAutoOrientation)
).currentlyDown .isCurrentlyPressed()
) { ) {
const delta = newPos.sub(oldPos); const delta = newPos.sub(oldPos);
const angleDeg = Math_degrees(delta.angle()); const angleDeg = Math_degrees(delta.angle());
@ -171,8 +171,9 @@ export class HUDBuildingPlacer extends BaseHUDPart {
// Holding alt inverts the placement // Holding alt inverts the placement
if ( if (
this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.placeInverse) this.root.keyMapper
.currentlyDown .getBinding(KEYMAPPINGS.placementModifiers.placeInverse)
.isCurrentlyPressed()
) { ) {
this.currentBaseRotation = (180 + this.currentBaseRotation) % 360; this.currentBaseRotation = (180 + this.currentBaseRotation) % 360;
} }
@ -394,7 +395,11 @@ export class HUDBuildingPlacer extends BaseHUDPart {
tryRotate() { tryRotate() {
const selectedBuilding = this.currentMetaBuilding.get(); const selectedBuilding = this.currentMetaBuilding.get();
if (selectedBuilding) { if (selectedBuilding) {
if (this.root.keyMapper.getBinding(KEYMAPPINGS.placement.rotateInverseModifier).currentlyDown) { if (
this.root.keyMapper
.getBinding(KEYMAPPINGS.placement.rotateInverseModifier)
.isCurrentlyPressed()
) {
this.currentBaseRotation = (this.currentBaseRotation + 270) % 360; this.currentBaseRotation = (this.currentBaseRotation + 270) % 360;
} else { } else {
this.currentBaseRotation = (this.currentBaseRotation + 90) % 360; this.currentBaseRotation = (this.currentBaseRotation + 90) % 360;
@ -479,16 +484,18 @@ export class HUDBuildingPlacer extends BaseHUDPart {
if ( if (
metaBuilding.getFlipOrientationAfterPlacement() && metaBuilding.getFlipOrientationAfterPlacement() &&
!this.root.keyMapper.getBinding( !this.root.keyMapper
KEYMAPPINGS.placementModifiers.placementDisableAutoOrientation .getBinding(KEYMAPPINGS.placementModifiers.placementDisableAutoOrientation)
).currentlyDown .isCurrentlyPressed()
) { ) {
this.currentBaseRotation = (180 + this.currentBaseRotation) % 360; this.currentBaseRotation = (180 + this.currentBaseRotation) % 360;
} }
if ( if (
!metaBuilding.getStayInPlacementMode() && !metaBuilding.getStayInPlacementMode() &&
!this.root.keyMapper.getBinding(KEYMAPPINGS.placementModifiers.placeMultiple).currentlyDown && !this.root.keyMapper
.getBinding(KEYMAPPINGS.placementModifiers.placeMultiple)
.isCurrentlyPressed() &&
!this.root.app.settings.getAllSettings().alwaysMultiplace !this.root.app.settings.getAllSettings().alwaysMultiplace
) { ) {
// Stop placement // Stop placement

View File

@ -26,6 +26,9 @@ export class HUDEntityDebugger extends BaseHUDPart {
update() { update() {
const mousePos = this.root.app.mousePosition; const mousePos = this.root.app.mousePosition;
if (!mousePos) {
return;
}
const worldPos = this.root.camera.screenToWorld(mousePos); const worldPos = this.root.camera.screenToWorld(mousePos);
const worldTile = worldPos.toTileSpace(); const worldTile = worldPos.toTileSpace();

View File

@ -24,8 +24,8 @@ export class HUDKeybindingOverlay extends BaseHUDPart {
[], [],
` `
<div class="binding"> <div class="binding">
<code class="keybinding">${getKeycode(KEYMAPPINGS.ingame.centerMap)}</code> <code class="keybinding">${getKeycode(KEYMAPPINGS.ingame.createMarker)}</code>
<label>${T.ingame.keybindingsOverlay.centerMap}</label> <label>${T.ingame.keybindingsOverlay.createMarker}</label>
</div> </div>
<div class="binding"> <div class="binding">

View File

@ -12,6 +12,7 @@ import { enumMouseButton } from "../../camera";
import { T } from "../../../translations"; import { T } from "../../../translations";
import { KEYMAPPINGS } from "../../key_action_mapper"; import { KEYMAPPINGS } from "../../key_action_mapper";
import { THEME } from "../../theme"; import { THEME } from "../../theme";
import { enumHubGoalRewards } from "../../tutorial_goals";
const logger = createLogger("hud/mass_selector"); const logger = createLogger("hud/mass_selector");
@ -30,9 +31,9 @@ export class HUDMassSelector extends BaseHUDPart {
"ingame_HUD_MassSelector", "ingame_HUD_MassSelector",
[], [],
T.ingame.massSelect.infoText T.ingame.massSelect.infoText
.replace("<keyDelete>", removalKeybinding) .replace("<keyDelete>", `<code class='keybinding'>${removalKeybinding}</code>`)
.replace("<keyCopy>", copyKeybinding) .replace("<keyCopy>", `<code class='keybinding'>${copyKeybinding}</code>`)
.replace("<keyCancel>", abortKeybinding) .replace("<keyCancel>", `<code class='keybinding'>${abortKeybinding}</code>`)
); );
} }
@ -107,6 +108,13 @@ export class HUDMassSelector extends BaseHUDPart {
startCopy() { startCopy() {
if (this.selectedUids.size > 0) { if (this.selectedUids.size > 0) {
if (!this.root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_blueprints)) {
this.root.hud.parts.dialogs.showInfo(
T.dialogs.blueprintsNotUnlocked.title,
T.dialogs.blueprintsNotUnlocked.desc
);
return;
}
this.root.hud.signals.buildingsSelectedForCopy.dispatch(Array.from(this.selectedUids)); this.root.hud.signals.buildingsSelectedForCopy.dispatch(Array.from(this.selectedUids));
this.selectedUids = new Set(); this.selectedUids = new Set();
this.root.soundProxy.playUiClick(); this.root.soundProxy.playUiClick();
@ -121,7 +129,7 @@ export class HUDMassSelector extends BaseHUDPart {
* @param {enumMouseButton} mouseButton * @param {enumMouseButton} mouseButton
*/ */
onMouseDown(pos, mouseButton) { onMouseDown(pos, mouseButton) {
if (!this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectStart).currentlyDown) { if (!this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectStart).isCurrentlyPressed()) {
return; return;
} }
@ -129,7 +137,11 @@ export class HUDMassSelector extends BaseHUDPart {
return; return;
} }
if (!this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectSelectMultiple).currentlyDown) { if (
!this.root.keyMapper
.getBinding(KEYMAPPINGS.massSelect.massSelectSelectMultiple)
.isCurrentlyPressed()
) {
// Start new selection // Start new selection
this.selectedUids = new Set(); this.selectedUids = new Set();
} }

View File

@ -3,12 +3,27 @@ import { ClickDetector } from "../../../core/click_detector";
import { formatBigNumber, makeDiv } from "../../../core/utils"; import { formatBigNumber, makeDiv } from "../../../core/utils";
import { ShapeDefinition } from "../../shape_definition"; import { ShapeDefinition } from "../../shape_definition";
import { BaseHUDPart } from "../base_hud_part"; import { BaseHUDPart } from "../base_hud_part";
import { blueprintShape } from "../../upgrades";
import { enumHubGoalRewards } from "../../tutorial_goals";
export class HUDPinnedShapes extends BaseHUDPart { export class HUDPinnedShapes extends BaseHUDPart {
createElements(parent) { createElements(parent) {
this.element = makeDiv(parent, "ingame_HUD_PinnedShapes", []); this.element = makeDiv(parent, "ingame_HUD_PinnedShapes", []);
} }
serialize() {
return {
shapes: this.pinnedShapes,
};
}
deserialize(data) {
if (!data || !data.shapes || !Array.isArray(data.shapes)) {
return "Invalid pinned shapes data";
}
this.pinnedShapes = data.shapes;
}
initialize() { initialize() {
/** @type {Array<{ key: string, goal: number }>} */ /** @type {Array<{ key: string, goal: number }>} */
this.pinnedShapes = []; this.pinnedShapes = [];
@ -33,6 +48,10 @@ export class HUDPinnedShapes extends BaseHUDPart {
if (key === this.root.hubGoals.currentGoal.definition.getHash()) { if (key === this.root.hubGoals.currentGoal.definition.getHash()) {
return true; return true;
} }
if (key === blueprintShape) {
return true;
}
for (let i = 0; i < this.pinnedShapes.length; ++i) { for (let i = 0; i < this.pinnedShapes.length; ++i) {
if (this.pinnedShapes[i].key === key) { if (this.pinnedShapes[i].key === key) {
return true; return true;
@ -57,6 +76,10 @@ export class HUDPinnedShapes extends BaseHUDPart {
this.internalPinShape(currentKey, currentGoal.required, false); this.internalPinShape(currentKey, currentGoal.required, false);
if (this.root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_blueprints)) {
this.internalPinShape(blueprintShape, null, false);
}
for (let i = 0; i < this.pinnedShapes.length; ++i) { for (let i = 0; i < this.pinnedShapes.length; ++i) {
const key = this.pinnedShapes[i].key; const key = this.pinnedShapes[i].key;
if (key !== currentKey) { if (key !== currentKey) {
@ -91,7 +114,10 @@ export class HUDPinnedShapes extends BaseHUDPart {
} }
const amountLabel = makeDiv(element, null, ["amountLabel"], ""); const amountLabel = makeDiv(element, null, ["amountLabel"], "");
const goalLabel = makeDiv(element, null, ["goalLabel"], "/" + formatBigNumber(goal));
if (goal) {
makeDiv(element, null, ["goalLabel"], "/" + formatBigNumber(goal));
}
this.handles.push({ this.handles.push({
key, key,
@ -137,6 +163,11 @@ export class HUDPinnedShapes extends BaseHUDPart {
// Can not pin current goal // Can not pin current goal
return; return;
} }
if (key === blueprintShape) {
return;
}
for (let i = 0; i < this.pinnedShapes.length; ++i) { for (let i = 0; i < this.pinnedShapes.length; ++i) {
if (this.pinnedShapes[i].key === key) { if (this.pinnedShapes[i].key === key) {
// Already pinned // Already pinned

View File

@ -89,9 +89,10 @@ export class HUDUnlockNotification extends BaseHUDPart {
clearTimeout(this.buttonShowTimeout); clearTimeout(this.buttonShowTimeout);
} }
this.element.querySelector("button.close").classList.remove("unlocked");
this.buttonShowTimeout = setTimeout( this.buttonShowTimeout = setTimeout(
() => this.element.querySelector("button.close").classList.add("unlocked"), () => this.element.querySelector("button.close").classList.add("unlocked"),
G_IS_DEV ? 1000 : 10000 G_IS_DEV ? 100 : 10000
); );
} }
@ -106,6 +107,11 @@ export class HUDUnlockNotification extends BaseHUDPart {
requestClose() { requestClose() {
this.root.app.adProvider.showVideoAd().then(() => { this.root.app.adProvider.showVideoAd().then(() => {
this.close(); this.close();
if (!this.root.app.settings.getAllSettings().offerHints) {
return;
}
if (this.root.hubGoals.level === 3) { if (this.root.hubGoals.level === 3) {
const { showUpgrades } = this.root.hud.parts.dialogs.showInfo( const { showUpgrades } = this.root.hud.parts.dialogs.showInfo(
T.dialogs.upgradesIntroduction.title, T.dialogs.upgradesIntroduction.title,
@ -114,6 +120,15 @@ export class HUDUnlockNotification extends BaseHUDPart {
); );
showUpgrades.add(() => this.root.hud.parts.shop.show()); showUpgrades.add(() => this.root.hud.parts.shop.show());
} }
if (this.root.hubGoals.level === 5) {
const { showKeybindings } = this.root.hud.parts.dialogs.showInfo(
T.dialogs.keybindingsIntroduction.title,
T.dialogs.keybindingsIntroduction.desc,
["showKeybindings:misc", "ok:good:timeout"]
);
showKeybindings.add(() => this.root.gameState.goToKeybindings());
}
}); });
} }

View File

@ -0,0 +1,290 @@
import { makeOffscreenBuffer } from "../../../core/buffer_utils";
import { Math_max } from "../../../core/builtins";
import { globalConfig, IS_DEMO } from "../../../core/config";
import { DrawParameters } from "../../../core/draw_parameters";
import { Loader } from "../../../core/loader";
import { DialogWithForm } from "../../../core/modal_dialog_elements";
import { FormElementInput } from "../../../core/modal_dialog_forms";
import { Rectangle } from "../../../core/rectangle";
import { STOP_PROPAGATION } from "../../../core/signal";
import { arrayDeleteValue, lerp, makeDiv, removeAllChildren } from "../../../core/utils";
import { Vector } from "../../../core/vector";
import { T } from "../../../translations";
import { enumMouseButton } from "../../camera";
import { KEYMAPPINGS } from "../../key_action_mapper";
import { BaseHUDPart } from "../base_hud_part";
import { DynamicDomAttach } from "../dynamic_dom_attach";
import { enumNotificationType } from "./notifications";
/** @typedef {{
* label: string,
* center: { x: number, y: number },
* zoomLevel: number,
* deletable: boolean
* }} Waypoint */
export class HUDWaypoints extends BaseHUDPart {
createElements(parent) {
if (this.root.app.settings.getAllSettings().offerHints) {
this.hintElement = makeDiv(
parent,
"ingame_HUD_Waypoints_Hint",
[],
`
<strong class='title'>${T.ingame.waypoints.waypoints}</strong>
<span class='desc'>${T.ingame.waypoints.description.replace(
"<keybinding>",
`<code class='keybinding'>${this.root.keyMapper
.getBinding(KEYMAPPINGS.ingame.createMarker)
.getKeyCodeString()}</code>`
)}</span>
`
);
}
this.waypointSprite = Loader.getSprite("sprites/misc/waypoint.png");
this.waypointsListElement = makeDiv(parent, "ingame_HUD_Waypoints", [], "Waypoints");
}
serialize() {
return {
waypoints: this.waypoints,
};
}
deserialize(data) {
if (!data || !data.waypoints || !Array.isArray(data.waypoints)) {
return "Invalid waypoints data";
}
this.waypoints = data.waypoints;
this.rerenderWaypointList();
}
rerenderWaypointList() {
removeAllChildren(this.waypointsListElement);
this.cleanupClickDetectors();
for (let i = 0; i < this.waypoints.length; ++i) {
const waypoint = this.waypoints[i];
const element = makeDiv(this.waypointsListElement, null, ["waypoint"]);
element.innerText = waypoint.label;
if (waypoint.deletable) {
const deleteButton = makeDiv(element, null, ["deleteButton"]);
this.trackClicks(deleteButton, () => this.deleteWaypoint(waypoint));
}
this.trackClicks(element, () => this.moveToWaypoint(waypoint), {
targetOnly: true,
});
}
}
/**
* @param {Waypoint} waypoint
*/
moveToWaypoint(waypoint) {
this.root.camera.setDesiredCenter(new Vector(waypoint.center.x, waypoint.center.y));
this.root.camera.setDesiredZoom(waypoint.zoomLevel);
}
/**
* @param {Waypoint} waypoint
*/
deleteWaypoint(waypoint) {
arrayDeleteValue(this.waypoints, waypoint);
this.rerenderWaypointList();
}
initialize() {
/** @type {Array<Waypoint>}
*/
this.waypoints = [
{
label: T.ingame.waypoints.hub,
center: { x: 0, y: 0 },
zoomLevel: 3,
deletable: false,
},
];
this.dummyBuffer = makeOffscreenBuffer(1, 1, {
reusable: false,
label: "waypoints-measure-canvas",
})[1];
this.root.camera.downPreHandler.add(this.onMouseDown, this);
if (this.hintElement) {
this.domAttach = new DynamicDomAttach(this.root, this.hintElement);
}
this.root.keyMapper.getBinding(KEYMAPPINGS.ingame.createMarker).add(this.requestCreateMarker, this);
this.currentMarkerOpacity = 1;
this.rerenderWaypointList();
}
/**
* @param {Vector=} worldPos Override the world pos, otherwise it is the camera position
*/
requestCreateMarker(worldPos = null) {
if (IS_DEMO) {
this.root.hud.parts.dialogs.showFeatureRestrictionInfo(T.demo.features.creatingMarkers);
return;
}
const markerNameInput = new FormElementInput({
id: "markerName",
label: null,
placeholder: "",
validator: val => val.length > 0 && val.length < 15,
});
const dialog = new DialogWithForm({
app: this.root.app,
title: T.dialogs.createMarker.title,
desc: T.dialogs.createMarker.desc,
formElements: [markerNameInput],
});
this.root.hud.parts.dialogs.internalShowDialog(dialog);
const center = worldPos || this.root.camera.center;
dialog.buttonSignals.ok.add(() => {
this.waypoints.push({
label: markerNameInput.getValue(),
center: { x: center.x, y: center.y },
zoomLevel: Math_max(this.root.camera.zoomLevel, globalConfig.mapChunkOverviewMinZoom + 0.05),
deletable: true,
});
this.waypoints.sort((a, b) => a.label.padStart(20, "0").localeCompare(b.label.padStart(20, "0")));
this.root.hud.signals.notification.dispatch(
T.ingame.waypoints.creationSuccessNotification,
enumNotificationType.success
);
this.rerenderWaypointList();
});
}
update() {
if (this.domAttach) {
this.domAttach.update(this.root.camera.getIsMapOverlayActive());
}
}
findCurrentIntersectedWaypoint() {
const mousePos = this.root.app.mousePosition;
if (!mousePos) {
return;
}
if (!this.root.camera.getIsMapOverlayActive()) {
return;
}
const scale = this.root.app.getEffectiveUiScale();
this.dummyBuffer.font = "bold " + 12 * scale + "px GameFont";
for (let i = 0; i < this.waypoints.length; ++i) {
const waypoint = this.waypoints[i];
const screenPos = this.root.camera.worldToScreen(
new Vector(waypoint.center.x, waypoint.center.y)
);
const intersectionRect = new Rectangle(
screenPos.x - 7 * scale,
screenPos.y - 12 * scale,
15 * scale + this.dummyBuffer.measureText(waypoint.label).width,
15 * scale
);
if (intersectionRect.containsPoint(mousePos.x, mousePos.y)) {
return waypoint;
}
}
}
/**
*
* @param {Vector} pos
* @param {enumMouseButton} button
*/
onMouseDown(pos, button) {
const waypoint = this.findCurrentIntersectedWaypoint();
if (waypoint) {
if (button === enumMouseButton.left) {
this.root.soundProxy.playUiClick();
this.moveToWaypoint(waypoint);
} else if (button === enumMouseButton.right) {
if (waypoint.deletable) {
this.root.soundProxy.playUiClick();
this.deleteWaypoint(waypoint);
} else {
this.root.soundProxy.playUiError();
}
}
return STOP_PROPAGATION;
} else {
// Allow right click to create a marker
if (button === enumMouseButton.right) {
if (this.root.camera.getIsMapOverlayActive()) {
const worldPos = this.root.camera.screenToWorld(pos);
this.requestCreateMarker(worldPos);
return STOP_PROPAGATION;
}
}
}
}
/**
*
* @param {DrawParameters} parameters
*/
draw(parameters) {
const desiredOpacity = this.root.camera.getIsMapOverlayActive() ? 1 : 0;
this.currentMarkerOpacity = lerp(this.currentMarkerOpacity, desiredOpacity, 0.08);
if (this.currentMarkerOpacity < 0.01) {
return;
}
const selected = this.findCurrentIntersectedWaypoint();
const scale = (1 / this.root.camera.zoomLevel) * this.root.app.getEffectiveUiScale();
for (let i = 0; i < this.waypoints.length; ++i) {
const waypoint = this.waypoints[i];
const pos = waypoint.center;
parameters.context.globalAlpha = this.currentMarkerOpacity * (selected === waypoint ? 1 : 0.7);
const yOffset = -5 * scale;
parameters.context.font = "bold " + 12 * scale + "px GameFont";
parameters.context.fillStyle = "rgba(255, 255, 255, 0.7)";
parameters.context.fillRect(
pos.x - 7 * scale,
pos.y - 12 * scale,
15 * scale + this.dummyBuffer.measureText(waypoint.label).width / this.root.camera.zoomLevel,
15 * scale
);
parameters.context.fillStyle = "#000";
parameters.context.textAlign = "left";
parameters.context.textBaseline = "middle";
parameters.context.fillText(waypoint.label, pos.x + 6 * scale, pos.y + 0.5 * scale + yOffset);
parameters.context.textBaseline = "alphabetic";
parameters.context.textAlign = "left";
this.waypointSprite.drawCentered(parameters.context, pos.x, pos.y + yOffset, 10 * scale);
}
parameters.context.globalAlpha = 1;
}
}

View File

@ -25,8 +25,6 @@ export const KEYMAPPINGS = {
mapMoveDown: { keyCode: key("S") }, mapMoveDown: { keyCode: key("S") },
mapMoveLeft: { keyCode: key("A") }, mapMoveLeft: { keyCode: key("A") },
centerMap: { keyCode: 32 },
menuOpenShop: { keyCode: key("F") }, menuOpenShop: { keyCode: key("F") },
menuOpenStats: { keyCode: key("G") }, menuOpenStats: { keyCode: key("G") },
@ -35,6 +33,8 @@ export const KEYMAPPINGS = {
mapZoomIn: { keyCode: 187, repeated: true }, // "+" mapZoomIn: { keyCode: 187, repeated: true }, // "+"
mapZoomOut: { keyCode: 189, repeated: true }, // "-" mapZoomOut: { keyCode: 189, repeated: true }, // "-"
createMarker: { keyCode: key("M") },
}, },
buildings: { buildings: {
@ -223,25 +223,37 @@ export function getStringForKeyCode(code) {
export class Keybinding { export class Keybinding {
/** /**
* *
* @param {KeyActionMapper} keyMapper
* @param {Application} app * @param {Application} app
* @param {object} param0 * @param {object} param0
* @param {number} param0.keyCode * @param {number} param0.keyCode
* @param {boolean=} param0.builtin * @param {boolean=} param0.builtin
* @param {boolean=} param0.repeated * @param {boolean=} param0.repeated
*/ */
constructor(app, { keyCode, builtin = false, repeated = false }) { constructor(keyMapper, app, { keyCode, builtin = false, repeated = false }) {
assert(keyCode && Number.isInteger(keyCode), "Invalid key code: " + keyCode); assert(keyCode && Number.isInteger(keyCode), "Invalid key code: " + keyCode);
this.keyMapper = keyMapper;
this.app = app; this.app = app;
this.keyCode = keyCode; this.keyCode = keyCode;
this.builtin = builtin; this.builtin = builtin;
this.repeated = repeated; this.repeated = repeated;
this.currentlyDown = false;
this.signal = new Signal(); this.signal = new Signal();
this.toggled = new Signal(); this.toggled = new Signal();
} }
/**
* Returns whether this binding is currently pressed
*/
isCurrentlyPressed() {
// Check if the key is down
if (this.app.inputMgr.keysDown.has(this.keyCode)) {
// Check if it is the top reciever
const reciever = this.keyMapper.inputReceiver;
return this.app.inputMgr.getTopReciever() === reciever;
}
}
/** /**
* Adds an event listener * Adds an event listener
* @param {function() : void} receiver * @param {function() : void} receiver
@ -289,6 +301,8 @@ export class KeyActionMapper {
*/ */
constructor(root, inputReciever) { constructor(root, inputReciever) {
this.root = root; this.root = root;
this.inputReceiver = inputReciever;
inputReciever.keydown.add(this.handleKeydown, this); inputReciever.keydown.add(this.handleKeydown, this);
inputReciever.keyup.add(this.handleKeyup, this); inputReciever.keyup.add(this.handleKeyup, this);
@ -304,7 +318,7 @@ export class KeyActionMapper {
payload.keyCode = overrides[key]; payload.keyCode = overrides[key];
} }
this.keybindings[key] = new Keybinding(this.root.app, payload); this.keybindings[key] = new Keybinding(this, this.root.app, payload);
} }
} }
@ -351,7 +365,6 @@ export class KeyActionMapper {
for (const key in this.keybindings) { for (const key in this.keybindings) {
/** @type {Keybinding} */ /** @type {Keybinding} */
const binding = this.keybindings[key]; const binding = this.keybindings[key];
binding.currentlyDown = false;
} }
} }
@ -361,17 +374,16 @@ export class KeyActionMapper {
* @param {number} param0.keyCode * @param {number} param0.keyCode
* @param {boolean} param0.shift * @param {boolean} param0.shift
* @param {boolean} param0.alt * @param {boolean} param0.alt
* @param {boolean=} param0.initial
*/ */
handleKeydown({ keyCode, shift, alt }) { handleKeydown({ keyCode, shift, alt, initial }) {
let stop = false; let stop = false;
// Find mapping // Find mapping
for (const key in this.keybindings) { for (const key in this.keybindings) {
/** @type {Keybinding} */ /** @type {Keybinding} */
const binding = this.keybindings[key]; const binding = this.keybindings[key];
if (binding.keyCode === keyCode && (!binding.currentlyDown || binding.repeated)) { if (binding.keyCode === keyCode && (initial || binding.repeated)) {
binding.currentlyDown = true;
/** @type {Signal} */ /** @type {Signal} */
const signal = this.keybindings[key].signal; const signal = this.keybindings[key].signal;
if (signal.dispatch() === STOP_PROPAGATION) { if (signal.dispatch() === STOP_PROPAGATION) {
@ -393,13 +405,7 @@ export class KeyActionMapper {
* @param {boolean} param0.alt * @param {boolean} param0.alt
*/ */
handleKeyup({ keyCode, shift, alt }) { handleKeyup({ keyCode, shift, alt }) {
for (const key in this.keybindings) { // Empty
/** @type {Keybinding} */
const binding = this.keybindings[key];
if (binding.keyCode === keyCode) {
binding.currentlyDown = false;
}
}
} }
/** /**

View File

@ -4,7 +4,11 @@
"background": "#2e2f37", "background": "#2e2f37",
"grid": "rgba(255, 255, 255, 0.02)", "grid": "rgba(255, 255, 255, 0.02)",
"gridLineWidth": 0.5, "gridLineWidth": 0.5,
"selectionColor": "rgba(127, 127, 255, 0.5)",
"selectionOverlay": "rgba(74, 163, 223, 0.7)",
"selectionOutline": "rgba(74, 163, 223, 0.5)",
"selectionBackground": "rgba(74, 163, 223, 0.2)",
"resources": { "resources": {
"shape": "#3d3f4a", "shape": "#3d3f4a",
"red": "#4a3d3f", "red": "#4a3d3f",

View File

@ -37,14 +37,6 @@ export class GameTime extends BasicSerializableObject {
// Store how much time we have in bucket // Store how much time we have in bucket
this.logicTimeBudget = 0; this.logicTimeBudget = 0;
if (G_IS_DEV) {
window.addEventListener("keydown", ev => {
if (ev.key === "p") {
this.requestSpeedToggle();
}
});
}
} }
static getId() { static getId() {
@ -199,23 +191,6 @@ export class GameTime extends BasicSerializableObject {
return this.speed.getId() === PausedGameSpeed.getId(); return this.speed.getId() === PausedGameSpeed.getId();
} }
requestSpeedToggle() {
logger.warn("Request speed toggle");
switch (this.speed.getId()) {
case PausedGameSpeed.getId():
this.setSpeed(new RegularGameSpeed(this.root));
break;
case RegularGameSpeed.getId():
this.setSpeed(new PausedGameSpeed(this.root));
break;
case FastForwardGameSpeed.getId():
this.setSpeed(new RegularGameSpeed(this.root));
break;
}
}
getSpeed() { getSpeed() {
return this.speed; return this.speed;
} }

View File

@ -24,6 +24,7 @@ export const enumHubGoalRewards = {
reward_sorter: "reward_sorter", reward_sorter: "reward_sorter",
reward_painter_quad: "reward_painter_quad", reward_painter_quad: "reward_painter_quad",
reward_blueprints: "reward_blueprints",
reward_freeplay: "reward_freeplay", reward_freeplay: "reward_freeplay",
no_reward: "no_reward", no_reward: "no_reward",
@ -35,7 +36,7 @@ export const tutorialGoals = [
// Circle // Circle
{ {
shape: "CuCuCuCu", // belts t1 shape: "CuCuCuCu", // belts t1
required: 35, required: 20,
reward: enumHubGoalRewards.reward_cutter_and_trash, reward: enumHubGoalRewards.reward_cutter_and_trash,
}, },
@ -43,7 +44,7 @@ export const tutorialGoals = [
// Cutter // Cutter
{ {
shape: "----CuCu", // shape: "----CuCu", //
required: 50, required: 40,
reward: enumHubGoalRewards.no_reward, reward: enumHubGoalRewards.no_reward,
}, },
@ -58,7 +59,7 @@ export const tutorialGoals = [
// 4 // 4
{ {
shape: "RuRu----", // processors t2 shape: "RuRu----", // processors t2
required: 150, required: 120,
reward: enumHubGoalRewards.reward_rotater, reward: enumHubGoalRewards.reward_rotater,
}, },
@ -66,14 +67,14 @@ export const tutorialGoals = [
// Rotater // Rotater
{ {
shape: "Cu----Cu", // belts t2 shape: "Cu----Cu", // belts t2
required: 300, required: 200,
reward: enumHubGoalRewards.reward_tunnel, reward: enumHubGoalRewards.reward_tunnel,
}, },
// 6 // 6
{ {
shape: "Cu------", // miners t2 shape: "Cu------", // miners t2
required: 700, required: 400,
reward: enumHubGoalRewards.reward_painter, reward: enumHubGoalRewards.reward_painter,
}, },
@ -81,14 +82,14 @@ export const tutorialGoals = [
// Painter // Painter
{ {
shape: "CrCrCrCr", // unused shape: "CrCrCrCr", // unused
required: 1300, required: 800,
reward: enumHubGoalRewards.reward_rotater_ccw, reward: enumHubGoalRewards.reward_rotater_ccw,
}, },
// 8 // 8
{ {
shape: "RbRb----", // painter t2 shape: "RbRb----", // painter t2
required: 2500, required: 1250,
reward: enumHubGoalRewards.reward_mixer, reward: enumHubGoalRewards.reward_mixer,
}, },
@ -96,7 +97,7 @@ export const tutorialGoals = [
// Mixing (purple) // Mixing (purple)
{ {
shape: "CpCpCpCp", // belts t3 shape: "CpCpCpCp", // belts t3
required: 4000, required: 1750,
reward: enumHubGoalRewards.reward_splitter_compact, reward: enumHubGoalRewards.reward_splitter_compact,
}, },
@ -104,7 +105,7 @@ export const tutorialGoals = [
// Star shape + cyan // Star shape + cyan
{ {
shape: "ScScScSc", // miners t3 shape: "ScScScSc", // miners t3
required: 5000, required: 2250,
reward: enumHubGoalRewards.reward_stacker, reward: enumHubGoalRewards.reward_stacker,
}, },
@ -112,49 +113,57 @@ export const tutorialGoals = [
// Stacker // Stacker
{ {
shape: "CgScScCg", // processors t3 shape: "CgScScCg", // processors t3
required: 6000, required: 3000,
reward: enumHubGoalRewards.reward_miner_chainable, reward: enumHubGoalRewards.reward_miner_chainable,
}, },
// 12 // 12
// Blueprints
{ {
shape: "RpRpRpRp:CwCwCwCw", // painting t3 shape: "CbCbCbRb:CwCwCwCw",
required: 7000, required: 4000,
reward: enumHubGoalRewards.reward_underground_belt_tier_2, reward: enumHubGoalRewards.reward_blueprints,
}, },
// 13 // 13
{ {
shape: "SrSrSrSr:CyCyCyCy", // unused shape: "RpRpRpRp:CwCwCwCw", // painting t3
required: 7850, required: 12000,
reward: enumHubGoalRewards.reward_storage, reward: enumHubGoalRewards.reward_underground_belt_tier_2,
}, },
// 14 // 14
{ {
shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", // belts t4 (two variants) shape: "SrSrSrSr:CyCyCyCy", // unused
required: 8000, required: 16000,
reward: enumHubGoalRewards.reward_cutter_quad, reward: enumHubGoalRewards.reward_storage,
}, },
// 15 // 15
{ {
shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", // miner t4 (two variants) shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", // belts t4 (two variants)
required: 9000, required: 25000,
reward: enumHubGoalRewards.reward_painter_double, reward: enumHubGoalRewards.reward_cutter_quad,
}, },
// 16 // 16
{ {
shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", // processors t4 (two varinats) shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", // miner t4 (two variants)
required: 10000, required: 50000,
reward: enumHubGoalRewards.reward_painter_quad, reward: enumHubGoalRewards.reward_painter_double,
}, },
// 17 // 17
{
shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", // processors t4 (two varinats)
required: 100000,
reward: enumHubGoalRewards.reward_painter_quad,
},
// 18
{ {
shape: finalGameShape, shape: finalGameShape,
required: 50000, required: 250000,
reward: enumHubGoalRewards.reward_freeplay, reward: enumHubGoalRewards.reward_freeplay,
}, },
]; ];

View File

@ -2,6 +2,7 @@ import { findNiceIntegerValue } from "../core/utils";
import { ShapeDefinition } from "./shape_definition"; import { ShapeDefinition } from "./shape_definition";
export const finalGameShape = "RuCw--Cw:----Ru--"; export const finalGameShape = "RuCw--Cw:----Ru--";
export const blueprintShape = "CbCbCbRb:CwCwCwCw";
export const UPGRADES = { export const UPGRADES = {
belt: { belt: {
@ -97,12 +98,12 @@ export const UPGRADES = {
painting: { painting: {
tiers: [ tiers: [
{ {
required: [{ shape: "WrWrWrWr", amount: 500 }], required: [{ shape: "RbRb----", amount: 1500 }],
improvement: 1, improvement: 2,
}, },
{ {
required: [{ shape: "RbRb----", amount: 4000 }], required: [{ shape: "WrWrWrWr", amount: 5000 }],
improvement: 2, improvement: 1,
}, },
{ {
required: [{ shape: "RpRpRpRp:CwCwCwCw", amount: 30000 }], required: [{ shape: "RpRpRpRp:CwCwCwCw", amount: 30000 }],

1
src/js/globals.d.ts vendored
View File

@ -7,7 +7,6 @@ declare function assertAlways(condition: boolean | object | string, ...errorMess
declare const abstract: void; declare const abstract: void;
declare const G_API_ENDPOINT: string;
declare const G_APP_ENVIRONMENT: string; declare const G_APP_ENVIRONMENT: string;
declare const G_HAVE_ASSERT: boolean; declare const G_HAVE_ASSERT: boolean;
declare const G_BUILD_TIME: number; declare const G_BUILD_TIME: number;

View File

@ -66,7 +66,7 @@ export class PlatformWrapperInterface {
* @returns {number} * @returns {number}
*/ */
getMinimumZoom() { getMinimumZoom() {
return 0.1 * this.getScreenScale(); return 0.2 * this.getScreenScale();
} }
/** /**

View File

@ -63,9 +63,7 @@ export class Savegame extends ReadWriteProxy {
return { return {
version: this.getCurrentVersion(), version: this.getCurrentVersion(),
dump: null, dump: null,
stats: { stats: {},
buildingsPlaced: 0,
},
lastUpdate: Date.now(), lastUpdate: Date.now(),
}; };
} }
@ -79,7 +77,6 @@ export class Savegame extends ReadWriteProxy {
return ExplainedResult.bad("Can not migrate savegame, too old"); return ExplainedResult.bad("Can not migrate savegame, too old");
} }
console.log("TODO: Migrate from", data.version);
if (data.version === 1000) { if (data.version === 1000) {
SavegameInterface_V1001.migrate1000to1001(data); SavegameInterface_V1001.migrate1000to1001(data);
data.version = 1001; data.version = 1001;
@ -222,6 +219,12 @@ export class Savegame extends ReadWriteProxy {
saveMetadata() { saveMetadata() {
this.metaDataRef.lastUpdate = new Date().getTime(); this.metaDataRef.lastUpdate = new Date().getTime();
this.metaDataRef.version = this.getCurrentVersion(); this.metaDataRef.version = this.getCurrentVersion();
if (!this.hasGameDump()) {
this.metaDataRef.level = 0;
} else {
this.metaDataRef.level = this.currentData.dump.hubGoals.level;
}
return this.app.savegameMgr.writeAsync(); return this.app.savegameMgr.writeAsync();
} }

View File

@ -19,7 +19,8 @@ export const enumLocalSavegameStatus = {
* @typedef {{ * @typedef {{
* lastUpdate: number, * lastUpdate: number,
* version: number, * version: number,
* internalId: string * internalId: string,
* level: number
* }} SavegameMetadata * }} SavegameMetadata
* *
* @typedef {{ * @typedef {{
@ -48,7 +49,7 @@ export class SavegameManager extends ReadWriteProxy {
} }
getCurrentVersion() { getCurrentVersion() {
return 1000; return 1001;
} }
/** /**
@ -68,6 +69,13 @@ export class SavegameManager extends ReadWriteProxy {
* @param {SavegamesData} data * @param {SavegamesData} data
*/ */
migrate(data) { migrate(data) {
if (data.version < 1001) {
data.savegames.forEach(savegame => {
savegame.level = 0;
});
data.version = 1001;
}
return ExplainedResult.good(); return ExplainedResult.good();
} }

View File

@ -38,6 +38,8 @@ export class SavegameSerializer {
map: root.map.serialize(), map: root.map.serialize(),
entityMgr: root.entityMgr.serialize(), entityMgr: root.entityMgr.serialize(),
hubGoals: root.hubGoals.serialize(), hubGoals: root.hubGoals.serialize(),
pinnedShapes: root.hud.parts.pinnedShapes.serialize(),
waypoints: root.hud.parts.waypoints.serialize(),
}; };
data.entities = this.internal.serializeEntityArray(root.entityMgr.entities); data.entities = this.internal.serializeEntityArray(root.entityMgr.entities);
@ -118,7 +120,7 @@ export class SavegameSerializer {
/** /**
* Tries to load the savegame from a given dump * Tries to load the savegame from a given dump
* @param {SerializedGame} savegame * @param {import("./savegame_typedefs").SerializedGame} savegame
* @param {GameRoot} root * @param {GameRoot} root
* @returns {ExplainedResult} * @returns {ExplainedResult}
*/ */
@ -135,6 +137,8 @@ export class SavegameSerializer {
errorReason = errorReason || root.camera.deserialize(savegame.camera); errorReason = errorReason || root.camera.deserialize(savegame.camera);
errorReason = errorReason || root.map.deserialize(savegame.map); errorReason = errorReason || root.map.deserialize(savegame.map);
errorReason = errorReason || root.hubGoals.deserialize(savegame.hubGoals); errorReason = errorReason || root.hubGoals.deserialize(savegame.hubGoals);
errorReason = errorReason || root.hud.parts.pinnedShapes.deserialize(savegame.pinnedShapes);
errorReason = errorReason || root.hud.parts.waypoints.deserialize(savegame.waypoints);
errorReason = errorReason || this.internal.deserializeEntityArray(root, savegame.entities); errorReason = errorReason || this.internal.deserializeEntityArray(root, savegame.entities);
// Check for errors // Check for errors
@ -144,47 +148,4 @@ export class SavegameSerializer {
return ExplainedResult.good(); return ExplainedResult.good();
} }
/////////// MIGRATION HELPERS ///////////
/**
* Performs a function on each component (useful to add / remove / alter properties for migration)
* @param {SerializedGame} savegame
* @param {typeof Component} componentHandle
* @param {function} modifier
*/
migration_migrateComponent(savegame, componentHandle, modifier) {
const targetId = componentHandle.getId();
for (const entityListId in savegame.entities) {
for (let i = 0; i < savegame.entities[entityListId].length; ++i) {
const list = savegame.entities[entityListId][i];
for (let k = 0; k < list.length; ++k) {
const entity = list[k];
const components = entity.components;
if (components[targetId]) {
modifier(components[targetId]);
}
}
}
}
}
/**
* Performs an operation on each object which is a PooledObject (usually Projectiles). Useful to
* perform migrations
* @param {Array<any>} pools
* @param {string} targetClassKey
* @param {function} modifier
*/
migration_migrateGenericObjectPool(pools, targetClassKey, modifier) {
for (let i = 0; i < pools.length; ++i) {
const pool = pools[i];
if (pool.key === targetClassKey) {
const entries = pool.data.entries;
for (const uid in entries) {
modifier(entries[uid]);
}
}
}
}
} }

View File

@ -1,11 +1,10 @@
import { Entity } from "../game/entity";
/** /**
* @typedef {{ * @typedef {{
* buildingsPlaced: number
* }} SavegameStats * }} SavegameStats
*/ */
import { Entity } from "../game/entity";
/** /**
* @typedef {{ * @typedef {{
* camera: any, * camera: any,
@ -13,6 +12,8 @@ import { Entity } from "../game/entity";
* entityMgr: any, * entityMgr: any,
* map: any, * map: any,
* hubGoals: any, * hubGoals: any,
* pinnedShapes: any,
* waypoints: any,
* entities: Array<Entity> * entities: Array<Entity>
* }} SerializedGame * }} SerializedGame
*/ */
@ -22,6 +23,6 @@ import { Entity } from "../game/entity";
* version: number, * version: number,
* dump: SerializedGame, * dump: SerializedGame,
* stats: SavegameStats, * stats: SavegameStats,
* lastUpdate: number * lastUpdate: number,
* }} SavegameData * }} SavegameData
*/ */

View File

@ -1,5 +1,6 @@
import { SavegameInterface_V1000 } from "./1000.js"; import { SavegameInterface_V1000 } from "./1000.js";
import { createLogger } from "../../core/logging.js"; import { createLogger } from "../../core/logging.js";
import { T } from "../../translations.js";
const schema = require("./1001.json"); const schema = require("./1001.json");
@ -24,6 +25,20 @@ export class SavegameInterface_V1001 extends SavegameInterface_V1000 {
return true; return true;
} }
dump.pinnedShapes = {
shapes: [],
};
dump.waypoints = {
waypoints: [
{
label: T.ingame.waypoints.hub,
center: { x: 0, y: 0 },
zoomLevel: 3,
deletable: false,
},
],
};
const entities = dump.entities; const entities = dump.entities;
for (let i = 0; i < entities.length; ++i) { for (let i = 0; i < entities.length; ++i) {
const entity = entities[i]; const entity = entities[i];

View File

@ -154,6 +154,16 @@ export class InGameState extends GameState {
}); });
} }
/**
* Goes back to the settings state
*/
goToKeybindings() {
this.saveThenGoToState("KeybindingsState", {
backToStateId: this.key,
backToStatePayload: this.creationPayload,
});
}
/** /**
* Moves to a state outside of the game * Moves to a state outside of the game
* @param {string} stateId * @param {string} stateId

View File

@ -283,8 +283,10 @@ export class MainMenuState extends GameState {
makeDiv( makeDiv(
elem, elem,
null, null,
["updateTime"], ["level"],
formatSecondsToTimeAgo((new Date().getTime() - games[i].lastUpdate) / 1000.0) games[i].level
? T.mainMenu.savegameLevel.replace("<x>", "" + games[i].level)
: T.mainMenu.savegameLevelUnknown
); );
const deleteButton = document.createElement("button"); const deleteButton = document.createElement("button");

View File

@ -61,8 +61,8 @@ demoBanners:
intro: >- intro: >-
If you enjoy this game, please consider buying the full version! If you enjoy this game, please consider buying the full version!
advantages: advantages:
- No advertisements
- Unlimited savegames - Unlimited savegames
- Waypoints
- Dark mode & more - Dark mode & more
- >- - >-
Allow me to further develop shapez.io ❤️ Allow me to further develop shapez.io ❤️
@ -78,6 +78,9 @@ mainMenu:
browserWarning: >- browserWarning: >-
Sorry, but the game is known to run slow on your browser! Get the standalone version or download chrome for the full experience. Sorry, but the game is known to run slow on your browser! Get the standalone version or download chrome for the full experience.
savegameLevel: Level <x>
savegameLevelUnknown: Unknown Level
dialogs: dialogs:
buttons: buttons:
ok: OK ok: OK
@ -90,6 +93,7 @@ dialogs:
deleteGame: I know what I do deleteGame: I know what I do
viewUpdate: View Update viewUpdate: View Update
showUpgrades: Show Upgrades showUpgrades: Show Upgrades
showKeybindings: Show Keybindings
importSavegameError: importSavegameError:
title: Import Error title: Import Error
@ -177,11 +181,28 @@ dialogs:
desc: >- desc: >-
You are deleting a lot of buildings (<count> to be exact)! Are you sure you want to do this? You are deleting a lot of buildings (<count> to be exact)! Are you sure you want to do this?
blueprintsNotUnlocked:
title: Not unlocked yet
desc: >-
Blueprints have not been unlocked yet! Complete more levels to unlock them.
keybindingsIntroduction:
title: Useful keybindings
desc: >-
This game has a lot of keybindings which make it easier to build big factories.
Here are a few, but be sure to <strong>check out the keybindings</strong>!<br><br>
<code class='keybinding'>CTRL</code> + Drag: Select area to copy / delete.<br>
<code class='keybinding'>SHIFT</code>: Hold to place multiple of one building.<br>
<code class='keybinding'>ALT</code>: Invert orientation of placed belts.<br>
createMarker:
title: New Marker
desc: Give it a meaningful name
ingame: ingame:
# This is shown in the top left corner and displays useful keybindings in # This is shown in the top left corner and displays useful keybindings in
# every situation # every situation
keybindingsOverlay: keybindingsOverlay:
centerMap: Center
moveMap: Move moveMap: Move
removeBuildings: Delete removeBuildings: Delete
stopPlacement: Stop placement stopPlacement: Stop placement
@ -191,6 +212,7 @@ ingame:
disableAutoOrientation: Disable auto orientation disableAutoOrientation: Disable auto orientation
toggleHud: Toggle HUD toggleHud: Toggle HUD
placeBuilding: Place building placeBuilding: Place building
createMarker: Create Marker
# Everything related to placing buildings (I.e. as soon as you selected a building # Everything related to placing buildings (I.e. as soon as you selected a building
# from the toolbar) # from the toolbar)
@ -280,6 +302,16 @@ ingame:
showHint: Show hint showHint: Show hint
hideHint: Close hideHint: Close
# When placing a blueprint
blueprintPlacer:
cost: Cost
waypoints:
waypoints: Markers
hub: HUB
description: Left-click a marker to jump to it, right-click to delete it.<br><br>Press <keybinding> to create a marker from the current view, or <strong>right-click</strong> to create a marker at the selected location.
creationSuccessNotification: Marker has been created.
# All shop upgrades # All shop upgrades
shopUpgrades: shopUpgrades:
belt: belt:
@ -452,6 +484,10 @@ storyRewards:
title: Freeplay title: Freeplay
desc: You did it! You unlocked the <strong>free-play mode</strong>! This means that shapes are now randomly generated! (No worries, more content is planned for the standalone!) desc: You did it! You unlocked the <strong>free-play mode</strong>! This means that shapes are now randomly generated! (No worries, more content is planned for the standalone!)
reward_blueprints:
title: Blueprints
desc: You can now <strong>copy and paste</strong> parts of your factory! Select an area (Hold CTRL, then drag with your mouse), and press 'C' to copy it.<br><br>Pasting it is <strong>not free</strong>, you need to produce <strong>blueprint shapes</strong> to afford it! (Those you just delivered).
# Special reward, which is shown when there is no reward actually # Special reward, which is shown when there is no reward actually
no_reward: no_reward:
title: Next level title: Next level
@ -512,9 +548,9 @@ settings:
If enabled, all buildings will stay selected after placement until you cancel it. This is equivalent to holding SHIFT permanently. If enabled, all buildings will stay selected after placement until you cancel it. This is equivalent to holding SHIFT permanently.
offerHints: offerHints:
title: Hints title: Hints & Tutorials
description: >- description: >-
Whether to show the 'Show hints' button in the lower left. Whether to offer hints and tutorials while playing.
keybindings: keybindings:
title: Keybindings title: Keybindings
@ -539,8 +575,6 @@ keybindings:
mapMoveDown: Move Down mapMoveDown: Move Down
mapMoveLeft: Move Left mapMoveLeft: Move Left
centerMap: Center Map
mapZoomIn: Zoom in mapZoomIn: Zoom in
mapZoomOut: Zoom out mapZoomOut: Zoom out
@ -574,7 +608,7 @@ keybindings:
placementDisableAutoOrientation: Disable automatic orientation placementDisableAutoOrientation: Disable automatic orientation
placeMultiple: Stay in placement mode placeMultiple: Stay in placement mode
placeInverse: Invert automatic orientation placeInverse: Invert automatic belt orientation
about: about:
title: About this Game title: About this Game
@ -588,5 +622,6 @@ demo:
importingGames: Importing savegames importingGames: Importing savegames
oneGameLimit: Limited to one savegame oneGameLimit: Limited to one savegame
customizeKeybindings: Customizing Keybindings customizeKeybindings: Customizing Keybindings
creatingMarkers: Create custom markers
settingNotAvailable: Not available in the demo. settingNotAvailable: Not available in the demo.

View File

@ -176,7 +176,6 @@ ingame:
# This is shown in the top left corner and displays useful keybindings in # This is shown in the top left corner and displays useful keybindings in
# every situation # every situation
keybindingsOverlay: keybindingsOverlay:
centerMap: Centrer
moveMap: Déplacer moveMap: Déplacer
removeBuildings: Effacer removeBuildings: Effacer
stopPlacement: Arrêter le placement stopPlacement: Arrêter le placement
@ -534,8 +533,6 @@ keybindings:
mapMoveDown: Aller en bas mapMoveDown: Aller en bas
mapMoveLeft: Aller à gauche mapMoveLeft: Aller à gauche
centerMap: Centrer la carte
mapZoomIn: Zoom avant mapZoomIn: Zoom avant
mapZoomOut: Zoom arrière mapZoomOut: Zoom arrière
@ -582,6 +579,5 @@ demo:
customizeKeybindings: Personalisation des contrôles customizeKeybindings: Personalisation des contrôles
settingNotAvailable: Indisponible dans la démo. settingNotAvailable: Indisponible dans la démo.
# #
# French translation version v0.1 based on english v1.0.4 by Didier WEERTS 'The Corsaire' # French translation version v0.1 based on english v1.0.4 by Didier WEERTS 'The Corsaire'

View File

@ -1 +1 @@
1.1.0 1.1.1