@ -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
|
||||
|
||||
69
.github/workflows/ci.yml
vendored
@ -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
@ -110,3 +110,5 @@ build
|
||||
tmp_standalone_files
|
||||
|
||||
|
||||
# Github Actions files
|
||||
.github/workflows
|
||||
|
||||
@ -8,4 +8,4 @@ useTabs: false
|
||||
quoteProps: "consistent"
|
||||
bracketSpacing: true
|
||||
arrowParens: avoid
|
||||
endOfLine: "lf"
|
||||
endOfLine: auto
|
||||
|
||||
167
.travis.yml
Normal 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 ..
|
||||
BIN
artwork/itch.io/screenshots/9.png
Normal file
|
After Width: | Height: | Size: 399 KiB |
BIN
artwork/itch.io/screenshots/waypoints.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
electron/favicon.icns
Normal 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,
|
||||
|
||||
@ -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,
|
||||
})
|
||||
|
||||
@ -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));
|
||||
});
|
||||
|
||||
@ -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")
|
||||
),
|
||||
|
||||
@ -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")
|
||||
),
|
||||
|
||||
@ -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
|
After Width: | Height: | Size: 691 B |
@ -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$"
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 51 KiB |
@ -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$"
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 752 KiB After Width: | Height: | Size: 752 KiB |
@ -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$"
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 163 KiB |
@ -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$"
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 381 KiB After Width: | Height: | Size: 380 KiB |
@ -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$"
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 746 KiB After Width: | Height: | Size: 746 KiB |
BIN
res_raw/sprites/misc/waypoint.png
Normal file
|
After Width: | Height: | Size: 691 B |
@ -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));
|
||||
|
||||
|
||||
39
src/css/ingame_hud/blueprint_placer.scss
Normal 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);
|
||||
// }
|
||||
}
|
||||
}
|
||||
@ -94,6 +94,7 @@
|
||||
.keybinding {
|
||||
position: relative;
|
||||
}
|
||||
font-weight: bold !important;
|
||||
|
||||
@include DarkThemeOverride {
|
||||
color: rgba(#fff, 0.5);
|
||||
|
||||
@ -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)});
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
.keybinding {
|
||||
vertical-align: middle;
|
||||
@include S(margin, 0, 4px);
|
||||
@include S(margin, 0, 1px);
|
||||
position: relative;
|
||||
top: unset;
|
||||
left: unset;
|
||||
|
||||
67
src/css/ingame_hud/waypoints.scss
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -235,7 +235,7 @@
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.updateTime {
|
||||
.level {
|
||||
grid-column: 1 / 2;
|
||||
grid-row: 1 / 2;
|
||||
@include PlainText;
|
||||
|
||||
@ -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)",
|
||||
],
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -385,6 +385,8 @@ export class DialogWithForm extends Dialog {
|
||||
});
|
||||
this.confirmButtonId = confirmButton.split(":")[0];
|
||||
this.formElements = formElements;
|
||||
|
||||
this.enterHandler = "ok";
|
||||
}
|
||||
|
||||
internalButtonHandler(id, ...payload) {
|
||||
|
||||
@ -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]]] : []),
|
||||
[]
|
||||
);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@ -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];
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -61,6 +61,7 @@ export class ItemAcceptorComponent extends Component {
|
||||
slotsCopy.push({
|
||||
pos: slot.pos.copy(),
|
||||
directions: slot.directions.slice(),
|
||||
filter: slot.filter,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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]]) {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
290
src/js/game/hud/parts/waypoints.js
Normal 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;
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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,
|
||||
},
|
||||
];
|
||||
|
||||
@ -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
@ -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;
|
||||
|
||||
@ -66,7 +66,7 @@ export class PlatformWrapperInterface {
|
||||
* @returns {number}
|
||||
*/
|
||||
getMinimumZoom() {
|
||||
return 0.1 * this.getScreenScale();
|
||||
return 0.2 * this.getScreenScale();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
*/
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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'
|
||||
|
||||