1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2025-12-13 10:11:50 +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:
browser: true
es6: true
browser: true
es6: true
extends:
- 'eslint:recommended'
- 'plugin:@typescript-eslint/eslint-recommended'
- 'prettier'
- "eslint:recommended"
- "plugin:@typescript-eslint/eslint-recommended"
- "prettier"
globals:
Atomics: readonly
SharedArrayBuffer: readonly
parser: '@typescript-eslint/parser'
Atomics: readonly
SharedArrayBuffer: readonly
parser: "@typescript-eslint/parser"
parserOptions:
ecmaVersion: 6
sourceType: 'module'
ecmaFeatures:
- modules: true
ecmaVersion: 6
sourceType: "module"
ecmaFeatures:
- modules: true
plugins:
- '@typescript-eslint'
- 'prettier'
rules:
prettier/prettier: error
no-undef: off
no-unused-vars: off
no-prototype-builtins: off
- "@typescript-eslint"
- "prettier"
rules:
prettier/prettier: error
no-undef: off
no-unused-vars: off
no-prototype-builtins: off
linebreak-style: off

View File

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

2
.gitignore vendored
View File

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

View File

@ -8,4 +8,4 @@ useTabs: false
quoteProps: "consistent"
bracketSpacing: true
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", () => {
return buildHtml("https://api.shapez.io", {
return buildHtml("https://analytics.shapez.io", {
analytics: true,
});
});
@ -315,7 +315,7 @@ function gulptasksHTML($, gulp, buildFolder, browserSync) {
});
gulp.task("html.standalone-prod", () => {
return buildHtml("https://api.shapez.io", {
return buildHtml("https://analytics.shapez.io", {
analytics: false,
standalone: true,
enableCachebust: false,

View File

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

View File

@ -21,8 +21,11 @@ function gulptasksStandalone($, gulp, buildFolder) {
path.join(electronBaseDir, "lib", "**", "*.node"),
path.join(electronBaseDir, "node_modules", "**", "*.*"),
path.join(electronBaseDir, "node_modules", "**", ".*"),
path.join(electronBaseDir, "node_modules", "**", "*"),
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));
});

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)));",
G_HAVE_ASSERT: "true",
G_APP_ENVIRONMENT: JSON.stringify("dev"),
G_API_ENDPOINT: JSON.stringify(
lzString.compressToEncodedURIComponent("http://localhost:5005/v1")
),
G_TRACKING_ENDPOINT: JSON.stringify(
lzString.compressToEncodedURIComponent("http://localhost:10005/v1")
),

View File

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

View File

@ -9,6 +9,7 @@
"scripts": {
"dev": "./gulp/gulp main.serveDev",
"tslint": "cd src/js && tsc",
"lint": "npx eslint src/js",
"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"
},

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":
{
"frame": {"x":160,"y":26,"w":13,"h":13},
"frame": {"x":204,"y":26,"w":13,"h":13},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -10,7 +10,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -18,7 +18,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -26,7 +26,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -34,7 +34,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -42,7 +42,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -50,7 +50,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -58,7 +58,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -66,7 +66,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -74,7 +74,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -82,7 +82,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -90,7 +90,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -98,7 +98,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -106,7 +106,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -114,7 +114,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -122,7 +122,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -130,7 +130,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -138,7 +138,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -146,7 +146,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -154,7 +154,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -162,7 +162,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -170,7 +170,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":76,"h":19},
@ -178,7 +178,7 @@
},
"sprites/blueprints/cutter.png":
{
"frame": {"x":209,"y":66,"w":36,"h":19},
"frame": {"x":207,"y":43,"w":36,"h":19},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":36,"h":19},
@ -186,7 +186,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -194,7 +194,7 @@
},
"sprites/blueprints/miner.png":
{
"frame": {"x":249,"y":89,"w":19,"h":19},
"frame": {"x":245,"y":89,"w":19,"h":19},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -202,7 +202,7 @@
},
"sprites/blueprints/mixer.png":
{
"frame": {"x":205,"y":43,"w":37,"h":19},
"frame": {"x":166,"y":45,"w":37,"h":19},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":37,"h":19},
@ -210,7 +210,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":38,"h":38},
@ -218,7 +218,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":77,"h":19},
@ -226,7 +226,7 @@
},
"sprites/blueprints/painter.png":
{
"frame": {"x":163,"y":43,"w":38,"h":19},
"frame": {"x":82,"y":49,"w":38,"h":19},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":38,"h":19},
@ -234,7 +234,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -242,7 +242,7 @@
},
"sprites/blueprints/rotater.png":
{
"frame": {"x":289,"y":66,"w":19,"h":19},
"frame": {"x":285,"y":66,"w":19,"h":19},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -250,7 +250,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -258,7 +258,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -266,7 +266,7 @@
},
"sprites/blueprints/splitter.png":
{
"frame": {"x":246,"y":43,"w":36,"h":19},
"frame": {"x":245,"y":3,"w":36,"h":19},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":36,"h":19},
@ -274,7 +274,7 @@
},
"sprites/blueprints/stacker.png":
{
"frame": {"x":241,"y":3,"w":37,"h":19},
"frame": {"x":204,"y":3,"w":37,"h":19},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":37,"h":19},
@ -282,7 +282,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":35,"h":38},
@ -290,7 +290,7 @@
},
"sprites/blueprints/trash.png":
{
"frame": {"x":345,"y":3,"w":19,"h":19},
"frame": {"x":308,"y":66,"w":19,"h":19},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -298,7 +298,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":1,"w":19,"h":18},
@ -306,7 +306,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":3,"w":19,"h":16},
@ -314,7 +314,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":16},
@ -322,7 +322,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":16},
@ -330,7 +330,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -338,7 +338,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -346,7 +346,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":13,"h":13},
@ -354,7 +354,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":76,"h":19},
@ -362,7 +362,7 @@
},
"sprites/buildings/cutter.png":
{
"frame": {"x":282,"y":3,"w":36,"h":19},
"frame": {"x":245,"y":66,"w":36,"h":19},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":36,"h":19},
@ -378,7 +378,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -386,7 +386,7 @@
},
"sprites/buildings/miner.png":
{
"frame": {"x":312,"y":66,"w":19,"h":19},
"frame": {"x":310,"y":43,"w":19,"h":19},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -394,7 +394,7 @@
},
"sprites/buildings/mixer.png":
{
"frame": {"x":167,"y":89,"w":37,"h":19},
"frame": {"x":204,"y":68,"w":37,"h":19},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":37,"h":19},
@ -402,7 +402,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":38,"h":38},
@ -410,7 +410,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":77,"h":19},
@ -418,7 +418,7 @@
},
"sprites/buildings/painter.png":
{
"frame": {"x":167,"y":66,"w":38,"h":19},
"frame": {"x":124,"y":49,"w":38,"h":19},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":38,"h":19},
@ -426,7 +426,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -434,7 +434,7 @@
},
"sprites/buildings/rotater.png":
{
"frame": {"x":318,"y":89,"w":19,"h":19},
"frame": {"x":337,"y":89,"w":19,"h":19},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -442,7 +442,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -450,7 +450,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -458,7 +458,7 @@
},
"sprites/buildings/splitter.png":
{
"frame": {"x":249,"y":66,"w":36,"h":19},
"frame": {"x":247,"y":43,"w":36,"h":19},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":36,"h":19},
@ -466,7 +466,7 @@
},
"sprites/buildings/stacker.png":
{
"frame": {"x":208,"y":89,"w":37,"h":19},
"frame": {"x":204,"y":91,"w":37,"h":19},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":37,"h":19},
@ -474,7 +474,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":35,"h":38},
@ -482,7 +482,7 @@
},
"sprites/buildings/trash.png":
{
"frame": {"x":378,"y":3,"w":19,"h":19},
"frame": {"x":354,"y":66,"w":19,"h":19},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":19},
@ -490,7 +490,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":1,"w":19,"h":18},
@ -498,7 +498,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":3,"w":19,"h":16},
@ -506,7 +506,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":16},
@ -514,7 +514,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":16},
@ -522,7 +522,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":6,"h":6},
@ -530,7 +530,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":6,"h":6},
@ -538,7 +538,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":3,"h":3},
@ -546,7 +546,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":3,"h":3},
@ -554,7 +554,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":3,"h":3},
@ -562,7 +562,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":10,"h":10},
@ -570,7 +570,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":10,"h":10},
@ -578,7 +578,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":10,"h":10},
@ -586,19 +586,27 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"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": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "1.0",
"image": "atlas0_10.png",
"format": "RGBA8888",
"size": {"w":409,"h":128},
"size": {"w":407,"h":128},
"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":
{
"frame": {"x":354,"y":1702,"w":24,"h":32},
"frame": {"x":353,"y":1702,"w":24,"h":32},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":24,"h":32},
@ -546,7 +546,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":4,"w":28,"h":28},
@ -554,7 +554,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":28,"h":28},
@ -562,7 +562,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":7,"y":7,"w":82,"h":82},
@ -570,7 +570,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":7,"y":7,"w":82,"h":82},
@ -578,7 +578,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":8,"y":0,"w":80,"h":96},
@ -586,11 +586,19 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":177,"h":86},
"sourceSize": {"w":177,"h":86}
"trimmed": true,
"spriteSourceSize": {"x":3,"y":4,"w":176,"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": {
"app": "https://www.codeandweb.com/texturepacker",
@ -599,6 +607,6 @@
"format": "RGBA8888",
"size": {"w":1997,"h":1801},
"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":
{
"frame": {"x":493,"y":55,"w":28,"h":32},
"frame": {"x":479,"y":103,"w":28,"h":32},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -10,7 +10,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -18,7 +18,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -26,7 +26,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -34,7 +34,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -42,7 +42,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -50,7 +50,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -58,7 +58,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -66,7 +66,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -74,7 +74,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -82,7 +82,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -90,7 +90,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -98,7 +98,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -106,7 +106,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -114,7 +114,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -122,7 +122,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -130,7 +130,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -138,7 +138,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -146,7 +146,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -154,7 +154,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -162,7 +162,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -170,7 +170,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":184,"h":48},
@ -178,7 +178,7 @@
},
"sprites/blueprints/cutter.png":
{
"frame": {"x":661,"y":143,"w":87,"h":48},
"frame": {"x":95,"y":244,"w":87,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":87,"h":48},
@ -186,7 +186,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -194,7 +194,7 @@
},
"sprites/blueprints/miner.png":
{
"frame": {"x":858,"y":89,"w":47,"h":48},
"frame": {"x":313,"y":419,"w":47,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -202,7 +202,7 @@
},
"sprites/blueprints/mixer.png":
{
"frame": {"x":491,"y":3,"w":89,"h":48},
"frame": {"x":191,"y":211,"w":89,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":89,"h":48},
@ -210,7 +210,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -218,7 +218,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":188,"h":48},
@ -226,7 +226,7 @@
},
"sprites/blueprints/painter.png":
{
"frame": {"x":561,"y":155,"w":96,"h":48},
"frame": {"x":191,"y":159,"w":96,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":48},
@ -234,7 +234,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -242,7 +242,7 @@
},
"sprites/blueprints/rotater.png":
{
"frame": {"x":754,"y":89,"w":48,"h":48},
"frame": {"x":459,"y":313,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -250,7 +250,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -258,7 +258,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
@ -266,7 +266,7 @@
},
"sprites/blueprints/splitter.png":
{
"frame": {"x":663,"y":91,"w":87,"h":48},
"frame": {"x":186,"y":263,"w":87,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":87,"h":48},
@ -274,7 +274,7 @@
},
"sprites/blueprints/stacker.png":
{
"frame": {"x":584,"y":3,"w":89,"h":48},
"frame": {"x":284,"y":227,"w":89,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":89,"h":48},
@ -282,7 +282,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":85,"h":96},
@ -290,7 +290,7 @@
},
"sprites/blueprints/trash.png":
{
"frame": {"x":804,"y":141,"w":48,"h":48},
"frame": {"x":181,"y":391,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -298,7 +298,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":5,"w":48,"h":43},
@ -306,7 +306,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":10,"w":48,"h":38},
@ -314,7 +314,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":38},
@ -322,7 +322,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":38},
@ -330,7 +330,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":30,"h":30},
@ -338,7 +338,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":30,"h":30},
@ -346,7 +346,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":28,"h":32},
@ -354,7 +354,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":184,"h":48},
@ -362,7 +362,7 @@
},
"sprites/buildings/cutter.png":
{
"frame": {"x":769,"y":3,"w":87,"h":48},
"frame": {"x":277,"y":279,"w":87,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":87,"h":48},
@ -370,7 +370,7 @@
},
"sprites/buildings/hub.png":
{
"frame": {"x":3,"y":3,"w":184,"h":185},
"frame": {"x":3,"y":55,"w":184,"h":185},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":4,"w":184,"h":185},
@ -378,7 +378,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -386,7 +386,7 @@
},
"sprites/buildings/miner.png":
{
"frame": {"x":878,"y":193,"w":47,"h":48},
"frame": {"x":364,"y":417,"w":47,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":48},
@ -394,7 +394,7 @@
},
"sprites/buildings/mixer.png":
{
"frame": {"x":571,"y":91,"w":88,"h":48},
"frame": {"x":377,"y":255,"w":88,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":88,"h":48},
@ -402,7 +402,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -410,7 +410,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":188,"h":48},
@ -418,7 +418,7 @@
},
"sprites/buildings/painter.png":
{
"frame": {"x":391,"y":3,"w":96,"h":48},
"frame": {"x":377,"y":203,"w":96,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":48},
@ -426,7 +426,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -434,7 +434,7 @@
},
"sprites/buildings/rotater.png":
{
"frame": {"x":860,"y":3,"w":48,"h":48},
"frame": {"x":233,"y":367,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -442,7 +442,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":47},
@ -450,7 +450,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":47},
@ -458,7 +458,7 @@
},
"sprites/buildings/splitter.png":
{
"frame": {"x":683,"y":195,"w":87,"h":48},
"frame": {"x":368,"y":307,"w":87,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":87,"h":48},
@ -466,7 +466,7 @@
},
"sprites/buildings/stacker.png":
{
"frame": {"x":677,"y":3,"w":88,"h":48},
"frame": {"x":3,"y":244,"w":88,"h":48},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":4,"y":0,"w":88,"h":48},
@ -474,7 +474,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":85,"h":96},
@ -482,7 +482,7 @@
},
"sprites/buildings/trash.png":
{
"frame": {"x":826,"y":193,"w":48,"h":48},
"frame": {"x":294,"y":331,"w":48,"h":48},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":48},
@ -490,7 +490,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":6,"w":47,"h":42},
@ -498,7 +498,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":10,"w":47,"h":38},
@ -506,7 +506,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":38},
@ -514,7 +514,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":47,"h":38},
@ -522,7 +522,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":14,"h":16},
@ -530,7 +530,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":14,"h":16},
@ -538,7 +538,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":8,"h":8},
@ -546,7 +546,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":8,"h":8},
@ -554,7 +554,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":8,"h":8},
@ -562,7 +562,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":22,"h":22},
@ -570,7 +570,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":22,"h":22},
@ -578,7 +578,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":22,"h":24},
@ -586,19 +586,27 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":44,"h":22},
"sourceSize": {"w":44,"h":22}
"spriteSourceSize": {"x":0,"y":0,"w":45,"h":23},
"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": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "1.0",
"image": "atlas0_25.png",
"format": "RGBA8888",
"size": {"w":1023,"h":254},
"size": {"w":510,"h":512},
"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":
{
"frame": {"x":1854,"y":231,"w":51,"h":63},
"frame": {"x":49,"y":1765,"w":51,"h":63},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -10,7 +10,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -18,7 +18,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -26,7 +26,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -34,7 +34,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -42,7 +42,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -50,7 +50,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -58,7 +58,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -66,7 +66,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -74,7 +74,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -82,7 +82,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -90,7 +90,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -98,7 +98,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -106,7 +106,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -114,7 +114,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -122,7 +122,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -130,7 +130,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -138,7 +138,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -146,7 +146,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":5,"w":58,"h":58},
@ -154,7 +154,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":5,"w":58,"h":58},
@ -162,7 +162,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":5,"y":0,"w":53,"h":63},
@ -170,7 +170,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":11,"y":0,"w":366,"h":96},
@ -178,7 +178,7 @@
},
"sprites/blueprints/cutter.png":
{
"frame": {"x":1496,"y":3,"w":172,"h":96},
"frame": {"x":3,"y":1465,"w":172,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":11,"y":0,"w":172,"h":96},
@ -186,7 +186,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":96},
@ -194,7 +194,7 @@
},
"sprites/blueprints/miner.png":
{
"frame": {"x":1301,"y":303,"w":92,"h":96},
"frame": {"x":178,"y":1607,"w":92,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":96},
@ -202,7 +202,7 @@
},
"sprites/blueprints/mixer.png":
{
"frame": {"x":947,"y":103,"w":175,"h":96},
"frame": {"x":296,"y":1217,"w":175,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":8,"y":0,"w":175,"h":96},
@ -210,7 +210,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":192,"h":192},
@ -218,7 +218,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":374,"h":96},
@ -226,7 +226,7 @@
},
"sprites/blueprints/painter.png":
{
"frame": {"x":751,"y":103,"w":192,"h":96},
"frame": {"x":3,"y":1165,"w":192,"h":96},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":192,"h":96},
@ -234,7 +234,7 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -242,7 +242,7 @@
},
"sprites/blueprints/rotater.png":
{
"frame": {"x":1459,"y":203,"w":96,"h":96},
"frame": {"x":373,"y":349,"w":96,"h":96},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -250,7 +250,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":1,"w":95,"h":93},
@ -258,7 +258,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":1,"w":93,"h":93},
@ -266,7 +266,7 @@
},
"sprites/blueprints/splitter.png":
{
"frame": {"x":1304,"y":103,"w":171,"h":96},
"frame": {"x":3,"y":1565,"w":171,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":11,"y":0,"w":171,"h":96},
@ -274,7 +274,7 @@
},
"sprites/blueprints/stacker.png":
{
"frame": {"x":1317,"y":3,"w":175,"h":96},
"frame": {"x":296,"y":1317,"w":175,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":8,"y":0,"w":175,"h":96},
@ -282,7 +282,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":167,"h":192},
@ -290,7 +290,7 @@
},
"sprites/blueprints/trash.png":
{
"frame": {"x":1847,"y":3,"w":96,"h":96},
"frame": {"x":373,"y":449,"w":96,"h":96},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -298,7 +298,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":12,"w":93,"h":84},
@ -306,7 +306,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":21,"w":93,"h":75},
@ -314,7 +314,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":94,"h":75},
@ -322,7 +322,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":2,"y":0,"w":93,"h":75},
@ -330,7 +330,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":6,"w":57,"h":57},
@ -338,7 +338,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":6,"w":57,"h":57},
@ -346,7 +346,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":6,"y":0,"w":51,"h":63},
@ -354,7 +354,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":11,"y":0,"w":366,"h":96},
@ -362,7 +362,7 @@
},
"sprites/buildings/cutter.png":
{
"frame": {"x":1284,"y":203,"w":171,"h":96},
"frame": {"x":275,"y":1517,"w":171,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":11,"y":0,"w":171,"h":96},
@ -370,7 +370,7 @@
},
"sprites/buildings/hub.png":
{
"frame": {"x":3,"y":3,"w":366,"h":367},
"frame": {"x":3,"y":203,"w":366,"h":367},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":10,"w":366,"h":367},
@ -378,7 +378,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":91,"h":95},
@ -386,7 +386,7 @@
},
"sprites/buildings/miner.png":
{
"frame": {"x":1492,"y":303,"w":91,"h":95},
"frame": {"x":381,"y":102,"w":91,"h":95},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":91,"h":95},
@ -394,7 +394,7 @@
},
"sprites/buildings/mixer.png":
{
"frame": {"x":1126,"y":103,"w":174,"h":96},
"frame": {"x":296,"y":1417,"w":174,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":174,"h":96},
@ -402,7 +402,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":0,"w":192,"h":191},
@ -410,7 +410,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":374,"h":96},
@ -418,7 +418,7 @@
},
"sprites/buildings/painter.png":
{
"frame": {"x":1121,"y":3,"w":192,"h":96},
"frame": {"x":3,"y":1265,"w":192,"h":96},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":192,"h":96},
@ -426,7 +426,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
@ -434,7 +434,7 @@
},
"sprites/buildings/rotater.png":
{
"frame": {"x":1679,"y":103,"w":95,"h":96},
"frame": {"x":373,"y":749,"w":95,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":95,"h":96},
@ -442,7 +442,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":2,"w":94,"h":91},
@ -450,7 +450,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":2,"w":93,"h":91},
@ -458,7 +458,7 @@
},
"sprites/buildings/splitter.png":
{
"frame": {"x":1672,"y":3,"w":171,"h":96},
"frame": {"x":3,"y":1665,"w":171,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":11,"y":0,"w":171,"h":96},
@ -466,7 +466,7 @@
},
"sprites/buildings/stacker.png":
{
"frame": {"x":1106,"y":203,"w":174,"h":96},
"frame": {"x":3,"y":1365,"w":174,"h":96},
"rotated": false,
"trimmed": true,
"spriteSourceSize": {"x":9,"y":0,"w":174,"h":96},
@ -474,7 +474,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":14,"y":0,"w":166,"h":192},
@ -482,7 +482,7 @@
},
"sprites/buildings/trash.png":
{
"frame": {"x":1579,"y":103,"w":96,"h":96},
"frame": {"x":373,"y":549,"w":96,"h":96},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":96,"h":96},
@ -490,7 +490,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":13,"w":92,"h":83},
@ -498,7 +498,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":22,"w":92,"h":74},
@ -506,7 +506,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":74},
@ -514,7 +514,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":92,"h":74},
@ -522,7 +522,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":26,"h":32},
@ -530,7 +530,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":26,"h":32},
@ -538,7 +538,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":0,"w":14,"h":16},
@ -546,7 +546,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":0,"y":1,"w":15,"h":15},
@ -554,7 +554,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":15,"h":15},
@ -562,7 +562,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":3,"w":42,"h":42},
@ -570,7 +570,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":3,"w":42,"h":42},
@ -578,7 +578,7 @@
},
"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,
"trimmed": true,
"spriteSourceSize": {"x":3,"y":0,"w":42,"h":48},
@ -586,19 +586,27 @@
},
"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,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":89,"h":43},
"sourceSize": {"w":89,"h":43}
"trimmed": true,
"spriteSourceSize": {"x":1,"y":1,"w":89,"h":44},
"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": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "1.0",
"image": "atlas0_50.png",
"format": "RGBA8888",
"size": {"w":1963,"h":476},
"size": {"w":475,"h":1968},
"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":
{
"frame": {"x":1403,"y":939,"w":133,"h":65},
"frame": {"x":1403,"y":939,"w":133,"h":66},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":133,"h":65},
"sourceSize": {"w":133,"h":65}
"trimmed": true,
"spriteSourceSize": {"x":2,"y":2,"w":133,"h":66},
"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": {
"app": "https://www.codeandweb.com/texturepacker",
@ -599,6 +607,6 @@
"format": "RGBA8888",
"size": {"w":2016,"h":1024},
"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;
}
transition: background-color 0.4s ease-in-out !important;
transition: background-color 0.1s ease-in-out !important;
@include TextShadow3D(#fff);
@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 {
position: relative;
}
font-weight: bold !important;
@include DarkThemeOverride {
color: rgba(#fff, 0.5);

View File

@ -11,7 +11,7 @@
border-bottom-width: 0;
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) {
transform: translateX(-50%) translateY(#{D(100px)});

View File

@ -121,6 +121,24 @@
> strong {
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 {

View File

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

View File

@ -12,7 +12,7 @@
.keybinding {
vertical-align: middle;
@include S(margin, 0, 4px);
@include S(margin, 0, 1px);
position: relative;
top: 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/tutorial_hints";
@import "ingame_hud/watermark";
@import "ingame_hud/blueprint_placer";
@import "ingame_hud/waypoints";
// prettier-ignore
$elements:
@ -55,6 +57,7 @@ ingame_Canvas,
ingame_VignetteOverlay,
// Ingame overlays
ingame_HUD_Waypoints,
ingame_HUD_PlacementHints,
ingame_HUD_PlacerVariants,
@ -68,6 +71,8 @@ ingame_HUD_DebugInfo,
ingame_HUD_EntityDebugger,
ingame_HUD_TutorialHints,
ingame_HUD_buildings_toolbar,
ingame_HUD_BlueprintPlacer,
ingame_HUD_Waypoints_Hint,
ingame_HUD_Watermark,
// Overlays

View File

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

View File

@ -1,14 +1,26 @@
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",
date: "unreleased",
date: "28.05.2020",
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 changing all keybindings, including CTRL, ALT and SHIFT (by Dimava)",
"Added confirmation when deleting more than 500 buildings at a time",
"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",
"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)",
"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>} */
this.filters = [];
/**
* All keys which are currently down
*/
this.keysDown = new Set();
this.bindToEvents();
}
@ -173,6 +178,7 @@ export class InputDistributor {
*/
handleBlur() {
this.forwardToReceiver("pageBlur", {});
this.keysDown.clear();
}
/**
@ -180,19 +186,24 @@ export class InputDistributor {
*/
handleKeydown(event) {
if (
// TAB
event.keyCode === 9 ||
// F1 - F10
(event.keyCode >= 112 && event.keyCode < 122)
event.keyCode === 9 || // TAB
event.keyCode === 16 || // SHIFT
event.keyCode === 17 || // CTRL
event.keyCode === 18 || // ALT
(event.keyCode >= 112 && event.keyCode < 122) // F1 - F10
) {
event.preventDefault();
}
const isInitial = !this.keysDown.has(event.keyCode);
this.keysDown.add(event.keyCode);
if (
this.forwardToReceiver("keydown", {
keyCode: event.keyCode,
shift: event.shiftKey,
alt: event.altKey,
initial: isInitial,
event,
}) === STOP_PROPAGATION
) {
@ -212,6 +223,8 @@ export class InputDistributor {
* @param {KeyboardEvent} event
*/
handleKeyup(event) {
this.keysDown.delete(event.keyCode);
this.forwardToReceiver("keyup", {
keyCode: event.keyCode,
shift: event.shiftKey,

View File

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

View File

@ -49,17 +49,35 @@ function stringPolyfills() {
}
function objectPolyfills() {
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries
// @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]]];
// https://github.com/tc39/proposal-object-values-entries/blob/master/polyfill.js
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) {
assert(context instanceof CanvasRenderingContext2D, "Not a valid context");
}
console.warn("drawing sprite regulary");
const link = this.linksByResolution[ORIGINAL_SCALE];

View File

@ -100,7 +100,7 @@ export class Camera extends BasicSerializableObject {
this.bindKeys();
if (G_IS_DEV) {
window.addEventListener("keydown", ev => {
if (ev.key === "l") {
if (ev.key === "i") {
this.zoomLevel = 3;
}
});
@ -147,6 +147,14 @@ export class Camera extends BasicSerializableObject {
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
*/
@ -337,15 +345,15 @@ export class Camera extends BasicSerializableObject {
*/
bindKeys() {
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.mapMoveRight).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.mapZoomOut).add(() => (this.desiredZoom = this.zoomLevel * 0.8));
mapper.getBinding(KEYMAPPINGS.ingame.centerMap).add(() => this.centerOnMap());
}
centerOnMap() {
@ -873,19 +881,19 @@ export class Camera extends BasicSerializableObject {
let forceY = 0;
const actionMapper = this.root.keyMapper;
if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveUp).currentlyDown) {
if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveUp).isCurrentlyPressed()) {
forceY -= 1;
}
if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveDown).currentlyDown) {
if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveDown).isCurrentlyPressed()) {
forceY += 1;
}
if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveLeft).currentlyDown) {
if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveLeft).isCurrentlyPressed()) {
forceX -= 1;
}
if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveRight).currentlyDown) {
if (actionMapper.getBinding(KEYMAPPINGS.ingame.mapMoveRight).isCurrentlyPressed()) {
forceX += 1;
}

View File

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

View File

@ -8,7 +8,7 @@ import { enumItemProcessorTypes } from "./components/item_processor";
import { GameRoot } from "./root";
import { enumSubShape, ShapeDefinition } from "./shape_definition";
import { enumHubGoalRewards, tutorialGoals } from "./tutorial_goals";
import { UPGRADES } from "./upgrades";
import { UPGRADES, blueprintShape } from "./upgrades";
export class HubGoals extends BasicSerializableObject {
static getId() {
@ -53,6 +53,10 @@ export class HubGoals extends BasicSerializableObject {
}
this.upgradeImprovements[upgradeId] = totalImprovement;
}
if (G_IS_DEV) {
this.storedShapes[blueprintShape] = 1000;
}
}
/**
@ -77,6 +81,10 @@ export class HubGoals extends BasicSerializableObject {
*/
this.storedShapes = {};
if (G_IS_DEV) {
this.storedShapes[blueprintShape] = 1000;
}
/**
* Stores the levels for all upgrades
* @type {Object<string, number>}
@ -113,6 +121,19 @@ export class HubGoals extends BasicSerializableObject {
getShapesStored(definition) {
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
* @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() {
this.cleanupClickDetectors();
}
/**
* Cleans up all click detectors
*/
cleanupClickDetectors() {
if (this.clickDetectors) {
for (let i = 0; i < this.clickDetectors.length; ++i) {
this.clickDetectors[i].cleanup();

View File

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

View File

@ -4,6 +4,9 @@ import { createLogger } from "../../../core/logging";
import { Vector } from "../../../core/vector";
import { Entity } from "../../entity";
import { GameRoot } from "../../root";
import { findNiceIntegerValue } from "../../../core/utils";
import { Math_pow } from "../../../core/builtins";
import { blueprintShape } from "../../upgrades";
const logger = createLogger("blueprint");
@ -47,6 +50,13 @@ export class Blueprint {
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
* @param {DrawParameters} parameters
@ -147,6 +157,13 @@ export class Blueprint {
return anyPlaceable;
}
/**
* @param {GameRoot} root
*/
canAfford(root) {
return root.hubGoals.getShapesStoredByKey(blueprintShape) >= this.getCost();
}
/**
* Attempts to place the blueprint at the given tile
* @param {GameRoot} root

View File

@ -6,9 +6,23 @@ import { enumMouseButton } from "../../camera";
import { KEYMAPPINGS } from "../../key_action_mapper";
import { BaseHUDPart } from "../base_hud_part";
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 {
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() {
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.hud.signals.selectedPlacementBuildingChanged.add(this.abortPlacement, this);
this.domAttach = new DynamicDomAttach(this.root, this.costDisplayParent);
this.trackedCanAfford = new TrackedState(this.onCanAffordChanged, this);
}
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
@ -46,8 +81,10 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
*/
onMouseDown(pos, button) {
if (button === enumMouseButton.right) {
this.abortPlacement();
return STOP_PROPAGATION;
if (this.currentBlueprint.get()) {
this.abortPlacement();
return STOP_PROPAGATION;
}
}
const blueprint = this.currentBlueprint.get();
@ -55,11 +92,19 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
return;
}
if (!blueprint.canAfford(this.root)) {
this.root.soundProxy.playUiError();
return;
}
const worldPos = this.root.camera.screenToWorld(pos);
const tile = worldPos.toTileSpace();
if (blueprint.tryPlace(this.root, tile)) {
const cost = blueprint.getCost();
this.root.hubGoals.takeShapeByKey(blueprintShape, cost);
// 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);
// }
}
@ -84,7 +129,11 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
rotateBlueprint() {
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();
} else {
this.currentBlueprint.get().rotateCw();

View File

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

View File

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

View File

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

View File

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

View File

@ -3,12 +3,27 @@ import { ClickDetector } from "../../../core/click_detector";
import { formatBigNumber, makeDiv } from "../../../core/utils";
import { ShapeDefinition } from "../../shape_definition";
import { BaseHUDPart } from "../base_hud_part";
import { blueprintShape } from "../../upgrades";
import { enumHubGoalRewards } from "../../tutorial_goals";
export class HUDPinnedShapes extends BaseHUDPart {
createElements(parent) {
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() {
/** @type {Array<{ key: string, goal: number }>} */
this.pinnedShapes = [];
@ -33,6 +48,10 @@ export class HUDPinnedShapes extends BaseHUDPart {
if (key === this.root.hubGoals.currentGoal.definition.getHash()) {
return true;
}
if (key === blueprintShape) {
return true;
}
for (let i = 0; i < this.pinnedShapes.length; ++i) {
if (this.pinnedShapes[i].key === key) {
return true;
@ -57,6 +76,10 @@ export class HUDPinnedShapes extends BaseHUDPart {
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) {
const key = this.pinnedShapes[i].key;
if (key !== currentKey) {
@ -91,7 +114,10 @@ export class HUDPinnedShapes extends BaseHUDPart {
}
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({
key,
@ -137,6 +163,11 @@ export class HUDPinnedShapes extends BaseHUDPart {
// Can not pin current goal
return;
}
if (key === blueprintShape) {
return;
}
for (let i = 0; i < this.pinnedShapes.length; ++i) {
if (this.pinnedShapes[i].key === key) {
// Already pinned

View File

@ -89,9 +89,10 @@ export class HUDUnlockNotification extends BaseHUDPart {
clearTimeout(this.buttonShowTimeout);
}
this.element.querySelector("button.close").classList.remove("unlocked");
this.buttonShowTimeout = setTimeout(
() => 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() {
this.root.app.adProvider.showVideoAd().then(() => {
this.close();
if (!this.root.app.settings.getAllSettings().offerHints) {
return;
}
if (this.root.hubGoals.level === 3) {
const { showUpgrades } = this.root.hud.parts.dialogs.showInfo(
T.dialogs.upgradesIntroduction.title,
@ -114,6 +120,15 @@ export class HUDUnlockNotification extends BaseHUDPart {
);
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") },
mapMoveLeft: { keyCode: key("A") },
centerMap: { keyCode: 32 },
menuOpenShop: { keyCode: key("F") },
menuOpenStats: { keyCode: key("G") },
@ -35,6 +33,8 @@ export const KEYMAPPINGS = {
mapZoomIn: { keyCode: 187, repeated: true }, // "+"
mapZoomOut: { keyCode: 189, repeated: true }, // "-"
createMarker: { keyCode: key("M") },
},
buildings: {
@ -223,25 +223,37 @@ export function getStringForKeyCode(code) {
export class Keybinding {
/**
*
* @param {KeyActionMapper} keyMapper
* @param {Application} app
* @param {object} param0
* @param {number} param0.keyCode
* @param {boolean=} param0.builtin
* @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);
this.keyMapper = keyMapper;
this.app = app;
this.keyCode = keyCode;
this.builtin = builtin;
this.repeated = repeated;
this.currentlyDown = false;
this.signal = 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
* @param {function() : void} receiver
@ -289,6 +301,8 @@ export class KeyActionMapper {
*/
constructor(root, inputReciever) {
this.root = root;
this.inputReceiver = inputReciever;
inputReciever.keydown.add(this.handleKeydown, this);
inputReciever.keyup.add(this.handleKeyup, this);
@ -304,7 +318,7 @@ export class KeyActionMapper {
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) {
/** @type {Keybinding} */
const binding = this.keybindings[key];
binding.currentlyDown = false;
}
}
@ -361,17 +374,16 @@ export class KeyActionMapper {
* @param {number} param0.keyCode
* @param {boolean} param0.shift
* @param {boolean} param0.alt
* @param {boolean=} param0.initial
*/
handleKeydown({ keyCode, shift, alt }) {
handleKeydown({ keyCode, shift, alt, initial }) {
let stop = false;
// Find mapping
for (const key in this.keybindings) {
/** @type {Keybinding} */
const binding = this.keybindings[key];
if (binding.keyCode === keyCode && (!binding.currentlyDown || binding.repeated)) {
binding.currentlyDown = true;
if (binding.keyCode === keyCode && (initial || binding.repeated)) {
/** @type {Signal} */
const signal = this.keybindings[key].signal;
if (signal.dispatch() === STOP_PROPAGATION) {
@ -393,13 +405,7 @@ export class KeyActionMapper {
* @param {boolean} param0.alt
*/
handleKeyup({ keyCode, shift, alt }) {
for (const key in this.keybindings) {
/** @type {Keybinding} */
const binding = this.keybindings[key];
if (binding.keyCode === keyCode) {
binding.currentlyDown = false;
}
}
// Empty
}
/**

View File

@ -4,7 +4,11 @@
"background": "#2e2f37",
"grid": "rgba(255, 255, 255, 0.02)",
"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": {
"shape": "#3d3f4a",
"red": "#4a3d3f",

View File

@ -37,14 +37,6 @@ export class GameTime extends BasicSerializableObject {
// Store how much time we have in bucket
this.logicTimeBudget = 0;
if (G_IS_DEV) {
window.addEventListener("keydown", ev => {
if (ev.key === "p") {
this.requestSpeedToggle();
}
});
}
}
static getId() {
@ -199,23 +191,6 @@ export class GameTime extends BasicSerializableObject {
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() {
return this.speed;
}

View File

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

View File

@ -2,6 +2,7 @@ import { findNiceIntegerValue } from "../core/utils";
import { ShapeDefinition } from "./shape_definition";
export const finalGameShape = "RuCw--Cw:----Ru--";
export const blueprintShape = "CbCbCbRb:CwCwCwCw";
export const UPGRADES = {
belt: {
@ -97,12 +98,12 @@ export const UPGRADES = {
painting: {
tiers: [
{
required: [{ shape: "WrWrWrWr", amount: 500 }],
improvement: 1,
required: [{ shape: "RbRb----", amount: 1500 }],
improvement: 2,
},
{
required: [{ shape: "RbRb----", amount: 4000 }],
improvement: 2,
required: [{ shape: "WrWrWrWr", amount: 5000 }],
improvement: 1,
},
{
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 G_API_ENDPOINT: string;
declare const G_APP_ENVIRONMENT: string;
declare const G_HAVE_ASSERT: boolean;
declare const G_BUILD_TIME: number;

View File

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

View File

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

View File

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

View File

@ -38,6 +38,8 @@ export class SavegameSerializer {
map: root.map.serialize(),
entityMgr: root.entityMgr.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);
@ -118,7 +120,7 @@ export class SavegameSerializer {
/**
* Tries to load the savegame from a given dump
* @param {SerializedGame} savegame
* @param {import("./savegame_typedefs").SerializedGame} savegame
* @param {GameRoot} root
* @returns {ExplainedResult}
*/
@ -135,6 +137,8 @@ export class SavegameSerializer {
errorReason = errorReason || root.camera.deserialize(savegame.camera);
errorReason = errorReason || root.map.deserialize(savegame.map);
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);
// Check for errors
@ -144,47 +148,4 @@ export class SavegameSerializer {
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 {{
* buildingsPlaced: number
* }} SavegameStats
*/
import { Entity } from "../game/entity";
/**
* @typedef {{
* camera: any,
@ -13,6 +12,8 @@ import { Entity } from "../game/entity";
* entityMgr: any,
* map: any,
* hubGoals: any,
* pinnedShapes: any,
* waypoints: any,
* entities: Array<Entity>
* }} SerializedGame
*/
@ -22,6 +23,6 @@ import { Entity } from "../game/entity";
* version: number,
* dump: SerializedGame,
* stats: SavegameStats,
* lastUpdate: number
* lastUpdate: number,
* }} SavegameData
*/

View File

@ -1,5 +1,6 @@
import { SavegameInterface_V1000 } from "./1000.js";
import { createLogger } from "../../core/logging.js";
import { T } from "../../translations.js";
const schema = require("./1001.json");
@ -24,6 +25,20 @@ export class SavegameInterface_V1001 extends SavegameInterface_V1000 {
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;
for (let i = 0; i < entities.length; ++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
* @param {string} stateId

View File

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

View File

@ -61,8 +61,8 @@ demoBanners:
intro: >-
If you enjoy this game, please consider buying the full version!
advantages:
- No advertisements
- Unlimited savegames
- Waypoints
- Dark mode & more
- >-
Allow me to further develop shapez.io ❤️
@ -78,6 +78,9 @@ mainMenu:
browserWarning: >-
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:
buttons:
ok: OK
@ -90,6 +93,7 @@ dialogs:
deleteGame: I know what I do
viewUpdate: View Update
showUpgrades: Show Upgrades
showKeybindings: Show Keybindings
importSavegameError:
title: Import Error
@ -177,11 +181,28 @@ dialogs:
desc: >-
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:
# This is shown in the top left corner and displays useful keybindings in
# every situation
keybindingsOverlay:
centerMap: Center
moveMap: Move
removeBuildings: Delete
stopPlacement: Stop placement
@ -191,6 +212,7 @@ ingame:
disableAutoOrientation: Disable auto orientation
toggleHud: Toggle HUD
placeBuilding: Place building
createMarker: Create Marker
# Everything related to placing buildings (I.e. as soon as you selected a building
# from the toolbar)
@ -280,6 +302,16 @@ ingame:
showHint: Show hint
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
shopUpgrades:
belt:
@ -452,6 +484,10 @@ storyRewards:
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!)
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
no_reward:
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.
offerHints:
title: Hints
title: Hints & Tutorials
description: >-
Whether to show the 'Show hints' button in the lower left.
Whether to offer hints and tutorials while playing.
keybindings:
title: Keybindings
@ -539,8 +575,6 @@ keybindings:
mapMoveDown: Move Down
mapMoveLeft: Move Left
centerMap: Center Map
mapZoomIn: Zoom in
mapZoomOut: Zoom out
@ -574,7 +608,7 @@ keybindings:
placementDisableAutoOrientation: Disable automatic orientation
placeMultiple: Stay in placement mode
placeInverse: Invert automatic orientation
placeInverse: Invert automatic belt orientation
about:
title: About this Game
@ -588,5 +622,6 @@ demo:
importingGames: Importing savegames
oneGameLimit: Limited to one savegame
customizeKeybindings: Customizing Keybindings
creatingMarkers: Create custom markers
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
# every situation
keybindingsOverlay:
centerMap: Centrer
moveMap: Déplacer
removeBuildings: Effacer
stopPlacement: Arrêter le placement
@ -442,7 +441,7 @@ storyRewards:
reward_storage:
title: Tampon de stockage
desc: Vous avez débloqué une variante de <strong>la poubelle</strong> - Elle permet de stocker des formes jusqu'à une certaine limite!
reward_freeplay:
title: Mode libre
desc: Vous l'avez fait! Vous avez débloqué le <strong>mode libre</strong>! Cela veut dire que dorénavant, les formes sont générées aléatoirement! (Ne vous en faites pas, plus de contenu est prévu pour la version complète!)
@ -534,8 +533,6 @@ keybindings:
mapMoveDown: Aller en bas
mapMoveLeft: Aller à gauche
centerMap: Centrer la carte
mapZoomIn: Zoom avant
mapZoomOut: Zoom arrière
@ -582,6 +579,5 @@ demo:
customizeKeybindings: Personalisation des contrôles
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