mirror of
https://github.com/tobspr/shapez.io.git
synced 2024-10-27 20:34:29 +00:00
Re-balance
This commit is contained in:
parent
091ffd1031
commit
05847add71
@ -31,6 +31,7 @@ export const CHANGELOG = [
|
|||||||
"Show mouse and camera tile on debug overlay (F4) (by dengr)",
|
"Show mouse and camera tile on debug overlay (F4) (by dengr)",
|
||||||
"Fix belt planner placing the belt when a dialog opens in the meantime",
|
"Fix belt planner placing the belt when a dialog opens in the meantime",
|
||||||
"Added confirmation when deleting a savegame",
|
"Added confirmation when deleting a savegame",
|
||||||
|
"Make chained mainer the default and only option after unlocking it",
|
||||||
"Fixed tunnels entrances connecting to exits sometimes when they shouldn't",
|
"Fixed tunnels entrances connecting to exits sometimes when they shouldn't",
|
||||||
"You can now pan the map with your mouse by moving the cursor to the edges of the screen!",
|
"You can now pan the map with your mouse by moving the cursor to the edges of the screen!",
|
||||||
"Added setting to auto select the extractor when pipetting a resource patch (by Exund)",
|
"Added setting to auto select the extractor when pipetting a resource patch (by Exund)",
|
||||||
|
@ -65,13 +65,13 @@ export const globalConfig = {
|
|||||||
|
|
||||||
buildingSpeeds: {
|
buildingSpeeds: {
|
||||||
cutter: 1 / 4,
|
cutter: 1 / 4,
|
||||||
cutterQuad: 1 / 4,
|
cutterQuad: 1 / 3,
|
||||||
rotater: 1 / 1,
|
rotater: 1 / 1,
|
||||||
rotaterCCW: 1 / 1,
|
rotaterCCW: 1 / 1,
|
||||||
rotater180: 1 / 1,
|
rotater180: 1 / 1,
|
||||||
painter: 1 / 6,
|
painter: 1 / 6,
|
||||||
painterDouble: 1 / 8,
|
painterDouble: 1 / 8,
|
||||||
painterQuad: 1 / 8,
|
painterQuad: 1 / 2,
|
||||||
mixer: 1 / 5,
|
mixer: 1 / 5,
|
||||||
stacker: 1 / 6,
|
stacker: 1 / 6,
|
||||||
},
|
},
|
||||||
|
@ -212,7 +212,7 @@ export class HubGoals extends BasicSerializableObject {
|
|||||||
this.currentGoal = {
|
this.currentGoal = {
|
||||||
/** @type {ShapeDefinition} */
|
/** @type {ShapeDefinition} */
|
||||||
definition: this.createRandomShape(),
|
definition: this.createRandomShape(),
|
||||||
required: findNiceIntegerValue(5000 + Math.pow(this.level * 2000, 0.75)),
|
required: findNiceIntegerValue(1000 + Math.pow(this.level * 2000, 0.8)),
|
||||||
reward: enumHubGoalRewards.no_reward_freeplay,
|
reward: enumHubGoalRewards.no_reward_freeplay,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -18,12 +18,19 @@ export const enumHubGoalRewards = {
|
|||||||
reward_rotater_180: "reward_rotater_180",
|
reward_rotater_180: "reward_rotater_180",
|
||||||
reward_miner_chainable: "reward_miner_chainable",
|
reward_miner_chainable: "reward_miner_chainable",
|
||||||
reward_underground_belt_tier_2: "reward_underground_belt_tier_2",
|
reward_underground_belt_tier_2: "reward_underground_belt_tier_2",
|
||||||
|
reward_belt_reader: "reward_belt_reader",
|
||||||
reward_splitter: "reward_splitter",
|
reward_splitter: "reward_splitter",
|
||||||
reward_cutter_quad: "reward_cutter_quad",
|
reward_cutter_quad: "reward_cutter_quad",
|
||||||
reward_painter_double: "reward_painter_double",
|
reward_painter_double: "reward_painter_double",
|
||||||
reward_painter_quad: "reward_painter_quad",
|
reward_painter_quad: "reward_painter_quad",
|
||||||
reward_storage: "reward_storage",
|
reward_storage: "reward_storage",
|
||||||
reward_merger: "reward_merger",
|
reward_merger: "reward_merger",
|
||||||
|
reward_wires_filters_and_levers: "reward_wires_filters_and_levers",
|
||||||
|
reward_display: "reward_display",
|
||||||
|
reward_constant_signal: "reward_constant_signal",
|
||||||
|
reward_logic_gates: "reward_logic_gates",
|
||||||
|
reward_virtual_processing: "reward_virtual_processing",
|
||||||
|
reward_second_wire: "reward_second_wire",
|
||||||
|
|
||||||
reward_blueprints: "reward_blueprints",
|
reward_blueprints: "reward_blueprints",
|
||||||
reward_freeplay: "reward_freeplay",
|
reward_freeplay: "reward_freeplay",
|
||||||
@ -99,11 +106,11 @@ export const tutorialGoals = [
|
|||||||
{
|
{
|
||||||
shape: "CpCpCpCp", // belts t3
|
shape: "CpCpCpCp", // belts t3
|
||||||
required: 800,
|
required: 800,
|
||||||
reward: enumHubGoalRewards.reward_splitter,
|
reward: enumHubGoalRewards.reward_merger,
|
||||||
},
|
},
|
||||||
|
|
||||||
// 10
|
// 10
|
||||||
// Star shape + cyan
|
// STACKER: Star shape + cyan
|
||||||
{
|
{
|
||||||
shape: "ScScScSc", // miners t3
|
shape: "ScScScSc", // miners t3
|
||||||
required: 900,
|
required: 900,
|
||||||
@ -111,7 +118,7 @@ export const tutorialGoals = [
|
|||||||
},
|
},
|
||||||
|
|
||||||
// 11
|
// 11
|
||||||
// Stacker
|
// Chainable miner
|
||||||
{
|
{
|
||||||
shape: "CgScScCg", // processors t3
|
shape: "CgScScCg", // processors t3
|
||||||
required: 1000,
|
required: 1000,
|
||||||
@ -127,6 +134,7 @@ export const tutorialGoals = [
|
|||||||
},
|
},
|
||||||
|
|
||||||
// 13
|
// 13
|
||||||
|
// Tunnel Tier 2
|
||||||
{
|
{
|
||||||
shape: "RpRpRpRp:CwCwCwCw", // painting t3
|
shape: "RpRpRpRp:CwCwCwCw", // painting t3
|
||||||
required: 5000,
|
required: 5000,
|
||||||
@ -134,44 +142,121 @@ export const tutorialGoals = [
|
|||||||
},
|
},
|
||||||
|
|
||||||
// 14
|
// 14
|
||||||
|
// Belt reader
|
||||||
|
{
|
||||||
|
// @todo
|
||||||
|
shape: "CuCuCuCu",
|
||||||
|
required: 7000,
|
||||||
|
reward: enumHubGoalRewards.reward_belt_reader,
|
||||||
|
},
|
||||||
|
|
||||||
|
// 15
|
||||||
|
// Storage
|
||||||
{
|
{
|
||||||
shape: "SrSrSrSr:CyCyCyCy", // unused
|
shape: "SrSrSrSr:CyCyCyCy", // unused
|
||||||
required: 7500,
|
required: 7500,
|
||||||
reward: enumHubGoalRewards.reward_storage,
|
reward: enumHubGoalRewards.reward_storage,
|
||||||
},
|
},
|
||||||
|
|
||||||
// 15
|
// 16
|
||||||
|
// Quad Cutter
|
||||||
{
|
{
|
||||||
shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", // belts t4 (two variants)
|
shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", // belts t4 (two variants)
|
||||||
required: 15000,
|
required: 12500,
|
||||||
reward: enumHubGoalRewards.reward_cutter_quad,
|
reward: enumHubGoalRewards.reward_cutter_quad,
|
||||||
},
|
},
|
||||||
|
|
||||||
// 16
|
// 17
|
||||||
|
// Double painter
|
||||||
{
|
{
|
||||||
shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", // miner t4 (two variants)
|
shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", // miner t4 (two variants)
|
||||||
required: 20000,
|
required: 15000,
|
||||||
reward: enumHubGoalRewards.reward_painter_double,
|
reward: enumHubGoalRewards.reward_painter_double,
|
||||||
},
|
},
|
||||||
|
|
||||||
// 17
|
// 18
|
||||||
|
// Rotater (180deg)
|
||||||
{
|
{
|
||||||
shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", // rotater 180
|
// @TODO
|
||||||
required: 25000,
|
shape: "CuCuCuCu",
|
||||||
|
required: 20000,
|
||||||
reward: enumHubGoalRewards.reward_rotater_180,
|
reward: enumHubGoalRewards.reward_rotater_180,
|
||||||
},
|
},
|
||||||
|
|
||||||
// 18
|
// 19
|
||||||
|
// Compact splitter
|
||||||
{
|
{
|
||||||
shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", // processors t4 (two variants)
|
// @TODO
|
||||||
required: 30000,
|
shape: "CuCuCuCu",
|
||||||
reward: enumHubGoalRewards.reward_painter_quad,
|
required: 25000,
|
||||||
|
reward: enumHubGoalRewards.reward_splitter,
|
||||||
},
|
},
|
||||||
|
|
||||||
// 19
|
// 20
|
||||||
|
// WIRES
|
||||||
{
|
{
|
||||||
shape: finalGameShape,
|
shape: finalGameShape,
|
||||||
required: 50000,
|
required: 50000,
|
||||||
|
reward: enumHubGoalRewards.reward_wires_filters_and_levers,
|
||||||
|
},
|
||||||
|
|
||||||
|
// 21
|
||||||
|
// Display
|
||||||
|
{
|
||||||
|
// @TODO
|
||||||
|
shape: "CuCuCuCu",
|
||||||
|
required: 25000,
|
||||||
|
reward: enumHubGoalRewards.reward_display,
|
||||||
|
},
|
||||||
|
|
||||||
|
// 22
|
||||||
|
// Constant signal
|
||||||
|
{
|
||||||
|
// @TODO
|
||||||
|
shape: "CuCuCuCu",
|
||||||
|
required: 30000,
|
||||||
|
reward: enumHubGoalRewards.reward_constant_signal,
|
||||||
|
},
|
||||||
|
|
||||||
|
// 23
|
||||||
|
// Quad Painter
|
||||||
|
{
|
||||||
|
// @TODO
|
||||||
|
shape: "CuCuCuCu",
|
||||||
|
// shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", // processors t4 (two variants)
|
||||||
|
required: 35000,
|
||||||
|
reward: enumHubGoalRewards.reward_painter_quad,
|
||||||
|
},
|
||||||
|
|
||||||
|
// 24 Logic gates
|
||||||
|
{
|
||||||
|
// @TODO
|
||||||
|
shape: "CuCuCuCu",
|
||||||
|
required: 40000,
|
||||||
|
reward: enumHubGoalRewards.reward_logic_gates,
|
||||||
|
},
|
||||||
|
|
||||||
|
// 25 Virtual Processing
|
||||||
|
{
|
||||||
|
// @TODO
|
||||||
|
shape: "CuCuCuCu",
|
||||||
|
required: 45000,
|
||||||
|
reward: enumHubGoalRewards.reward_virtual_processing,
|
||||||
|
},
|
||||||
|
|
||||||
|
// 26 Secondary type of wire
|
||||||
|
{
|
||||||
|
// @TODO
|
||||||
|
shape: "CuCuCuCu",
|
||||||
|
required: 50000,
|
||||||
|
reward: enumHubGoalRewards.reward_second_wire,
|
||||||
|
},
|
||||||
|
|
||||||
|
// 27 Freeplay
|
||||||
|
{
|
||||||
|
// @TODO
|
||||||
|
shape: "CuCuCuCu",
|
||||||
|
required: 100000,
|
||||||
reward: enumHubGoalRewards.reward_freeplay,
|
reward: enumHubGoalRewards.reward_freeplay,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
@ -12,6 +12,9 @@ import { MetaTrashBuilding, enumTrashVariants } from "./buildings/trash";
|
|||||||
/** @typedef {Array<[typeof MetaBuilding, string]>} TutorialGoalReward */
|
/** @typedef {Array<[typeof MetaBuilding, string]>} TutorialGoalReward */
|
||||||
|
|
||||||
import { enumHubGoalRewards } from "./tutorial_goals";
|
import { enumHubGoalRewards } from "./tutorial_goals";
|
||||||
|
import { MetaReaderBuilding } from "./buildings/reader";
|
||||||
|
import { MetaDisplayBuilding } from "./buildings/display";
|
||||||
|
import { MetaConstantSignalBuilding } from "./buildings/constant_signal";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method for proper types
|
* Helper method for proper types
|
||||||
@ -45,6 +48,14 @@ export const enumHubGoalRewardsToContentUnlocked = {
|
|||||||
[enumHubGoalRewards.reward_painter_quad]: typed([[MetaPainterBuilding, enumPainterVariants.quad]]),
|
[enumHubGoalRewards.reward_painter_quad]: typed([[MetaPainterBuilding, enumPainterVariants.quad]]),
|
||||||
[enumHubGoalRewards.reward_storage]: typed([[MetaTrashBuilding, enumTrashVariants.storage]]),
|
[enumHubGoalRewards.reward_storage]: typed([[MetaTrashBuilding, enumTrashVariants.storage]]),
|
||||||
|
|
||||||
|
[enumHubGoalRewards.reward_belt_reader]: typed([[MetaReaderBuilding, defaultBuildingVariant]]),
|
||||||
|
[enumHubGoalRewards.reward_display]: typed([[MetaDisplayBuilding, defaultBuildingVariant]]),
|
||||||
|
[enumHubGoalRewards.reward_constant_signal]: typed([
|
||||||
|
[MetaConstantSignalBuilding, defaultBuildingVariant],
|
||||||
|
]),
|
||||||
|
[enumHubGoalRewards.reward_second_wire]: null, // @TODO!
|
||||||
|
|
||||||
|
[enumHubGoalRewards.reward_wires_filters_and_levers]: null,
|
||||||
[enumHubGoalRewards.reward_freeplay]: null,
|
[enumHubGoalRewards.reward_freeplay]: null,
|
||||||
[enumHubGoalRewards.no_reward]: null,
|
[enumHubGoalRewards.no_reward]: null,
|
||||||
[enumHubGoalRewards.no_reward_freeplay]: null,
|
[enumHubGoalRewards.no_reward_freeplay]: null,
|
||||||
|
@ -38,7 +38,7 @@ export const UPGRADES = {
|
|||||||
required: [{ shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", amount: 20000 }],
|
required: [{ shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", amount: 20000 }],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: finalGameShape, amount: 75000 }],
|
required: [{ shape: finalGameShape, amount: 50000 }],
|
||||||
excludePrevious: true,
|
excludePrevious: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -60,7 +60,7 @@ export const UPGRADES = {
|
|||||||
required: [{ shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", amount: 30000 }],
|
required: [{ shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", amount: 30000 }],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: finalGameShape, amount: 85000 }],
|
required: [{ shape: finalGameShape, amount: 65000 }],
|
||||||
excludePrevious: true,
|
excludePrevious: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -82,7 +82,7 @@ export const UPGRADES = {
|
|||||||
required: [{ shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", amount: 30000 }],
|
required: [{ shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", amount: 30000 }],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: finalGameShape, amount: 100000 }],
|
required: [{ shape: finalGameShape, amount: 75000 }],
|
||||||
excludePrevious: true,
|
excludePrevious: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -104,7 +104,7 @@ export const UPGRADES = {
|
|||||||
required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp:CwCwCwCw", amount: 30000 }],
|
required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp:CwCwCwCw", amount: 30000 }],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
required: [{ shape: finalGameShape, amount: 125000 }],
|
required: [{ shape: finalGameShape, amount: 100000 }],
|
||||||
excludePrevious: true,
|
excludePrevious: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
@ -687,7 +687,9 @@ storyRewards:
|
|||||||
|
|
||||||
reward_miner_chainable:
|
reward_miner_chainable:
|
||||||
title: Chaining Extractor
|
title: Chaining Extractor
|
||||||
desc: You have unlocked the <strong>chaining extractor</strong>! It can <strong>forward its resources</strong> to other extractors so you can more efficiently extract resources!
|
desc: >-
|
||||||
|
You have unlocked the <strong>chained extractor</strong>! It can <strong>forward its resources</strong> to other extractors so you can more efficiently extract resources!<br><br>
|
||||||
|
PS: The old extractor has been replaced in your toolbar now!
|
||||||
|
|
||||||
reward_underground_belt_tier_2:
|
reward_underground_belt_tier_2:
|
||||||
title: Tunnel Tier II
|
title: Tunnel Tier II
|
||||||
@ -703,6 +705,11 @@ storyRewards:
|
|||||||
desc: >-
|
desc: >-
|
||||||
You have unlocked a merger variant of the <strong>balancer</strong> - It accepts one input and splits them into two!
|
You have unlocked a merger variant of the <strong>balancer</strong> - It accepts one input and splits them into two!
|
||||||
|
|
||||||
|
reward_belt_reader:
|
||||||
|
title: Belt reader
|
||||||
|
desc: >-
|
||||||
|
You have now unlocked the <strong>belt reader</strong>! It allows you to measure the throughput of a belt.<br><br>And wait until you unlock wires - then it gets really useful!
|
||||||
|
|
||||||
reward_cutter_quad:
|
reward_cutter_quad:
|
||||||
title: Quad Cutting
|
title: Quad Cutting
|
||||||
desc: You have unlocked a variant of the <strong>cutter</strong> - It allows you to cut shapes in <strong>four parts</strong> instead of just two!
|
desc: You have unlocked a variant of the <strong>cutter</strong> - It allows you to cut shapes in <strong>four parts</strong> instead of just two!
|
||||||
@ -713,16 +720,14 @@ storyRewards:
|
|||||||
|
|
||||||
reward_painter_quad:
|
reward_painter_quad:
|
||||||
title: Quad Painting
|
title: Quad Painting
|
||||||
desc: You have unlocked a variant of the <strong>painter</strong> - It allows you to paint each part of the shape individually!
|
desc: >-
|
||||||
|
You have unlocked a variant of the <strong>painter</strong> - It allows you to paint each part of the shape individually!<br><br>
|
||||||
|
To use it, connect each slot which should be painted on the wires layer!
|
||||||
|
|
||||||
reward_storage:
|
reward_storage:
|
||||||
title: Storage Buffer
|
title: Storage Buffer
|
||||||
desc: You have unlocked a variant of the <strong>trash</strong> - It allows you to store items up to a given capacity!
|
desc: You have unlocked a variant of the <strong>trash</strong> - It allows you to store items up to a given capacity!
|
||||||
|
|
||||||
reward_freeplay:
|
|
||||||
title: Freeplay
|
|
||||||
desc: You did it! You unlocked the <strong>free-play mode</strong>! This means that shapes are now randomly generated! (No worries, more content is planned for the standalone!)
|
|
||||||
|
|
||||||
reward_blueprints:
|
reward_blueprints:
|
||||||
title: 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).
|
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).
|
||||||
@ -731,6 +736,45 @@ storyRewards:
|
|||||||
title: Rotater (180 degrees)
|
title: Rotater (180 degrees)
|
||||||
desc: You just unlocked the 180 degress <strong>rotater</strong>! - It allows you to rotate a shape by 180 degress (Surprise! :D)
|
desc: You just unlocked the 180 degress <strong>rotater</strong>! - It allows you to rotate a shape by 180 degress (Surprise! :D)
|
||||||
|
|
||||||
|
reward_wires_filters_and_levers:
|
||||||
|
title: >-
|
||||||
|
Wires: Filters & Levers
|
||||||
|
desc: >-
|
||||||
|
You just unlocked the <strong>wires layer</strong>! It is a separate layer on top of the regular layer and introduces a lot of new mechanics!<br><br>
|
||||||
|
Since it can be overwhelming a bit, I added a small tutorial - Be sure to have <strong>tutorials enabled</strong> in the settings!
|
||||||
|
|
||||||
|
reward_display:
|
||||||
|
title: Display
|
||||||
|
desc: >-
|
||||||
|
You have unlocked the <strong>Display</strong>! Connect a wires signal to it to present a color, shape or boolean!
|
||||||
|
|
||||||
|
reward_constant_signal:
|
||||||
|
title: Constant Signal
|
||||||
|
desc: >-
|
||||||
|
You can now emit a <strong>constant signal</strong> on the wires layer! This is useful to connect it to <strong>item filters</strong> for example!
|
||||||
|
|
||||||
|
reward_logic_gates:
|
||||||
|
title: Logic Gates
|
||||||
|
desc: >-
|
||||||
|
You unlocked <strong>logic gates</strong>! You don't have to be excited about this, but it's actually super cool!<br><br>
|
||||||
|
With those gates you can now perform AND, OR, XOR and NOT boolean operations!
|
||||||
|
|
||||||
|
reward_virtual_processing:
|
||||||
|
title: Virtual Processing
|
||||||
|
desc: >-
|
||||||
|
I just gave a whole bunch of new buildings which allow you to <strong>simulate the processing of shapes</strong>!<br><br>
|
||||||
|
You can now simulate a cutter, rotater, stacker and more on the wires layer!<br><br>
|
||||||
|
With this you now have three options to continue the game:<br><br>
|
||||||
|
- Build an <strong>automated machine</strong> to create any possible shape requested by the hub (This is cool, I swear!).<br><br>
|
||||||
|
- Build something cool with wires.<br><br>
|
||||||
|
- Continue to play regulary.
|
||||||
|
|
||||||
|
reward_second_wire:
|
||||||
|
title: Second Wire Type
|
||||||
|
desc: >-
|
||||||
|
Annoyed by wires automatically connecting? I just gave you another <strong>type of wire</strong>!<br><br>
|
||||||
|
Different types of wires do not connect to each other, so you can now build much compacter circuits.
|
||||||
|
|
||||||
# Special reward, which is shown when there is no reward actually
|
# Special reward, which is shown when there is no reward actually
|
||||||
no_reward:
|
no_reward:
|
||||||
title: Next level
|
title: Next level
|
||||||
@ -742,6 +786,12 @@ storyRewards:
|
|||||||
desc: >-
|
desc: >-
|
||||||
Congratulations! By the way, more content is planned for the standalone!
|
Congratulations! By the way, more content is planned for the standalone!
|
||||||
|
|
||||||
|
reward_freeplay:
|
||||||
|
title: Freeplay
|
||||||
|
desc: >-
|
||||||
|
You did it! You unlocked the <strong>free-play mode</strong>! This means that shapes are now <strong>randomly</strong> generated!<br><br>
|
||||||
|
Since the hub will only require low quantities, I highly recommend to build a machine which automatically delivers the requested shape!
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
title: Settings
|
title: Settings
|
||||||
categories:
|
categories:
|
||||||
|
Loading…
Reference in New Issue
Block a user