Rebalance whole game

This commit is contained in:
tobspr 2020-05-17 14:46:33 +02:00
parent 6a61d03489
commit 97f52f509b
15 changed files with 204 additions and 111 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 806 B

View File

@ -42,7 +42,7 @@
color: #fff; color: #fff;
text-align: center; text-align: center;
font-weight: bold; font-weight: bold;
@include S(width, 45px); @include S(width, 50px);
@include S(padding, 0px, 5px); @include S(padding, 0px, 5px);
&[data-tier="0"] { &[data-tier="0"] {
@ -61,10 +61,10 @@
background-color: rgb(243, 77, 48); background-color: rgb(243, 77, 48);
} }
&[data-tier="5"] { &[data-tier="5"] {
background-color: rgb(219, 184, 29); background-color: rgb(255, 209, 6);
} }
&[data-tier="6"] { &[data-tier="6"] {
background-color: rgb(190, 73, 73); background-color: rgb(44, 41, 46);
} }
} }
} }
@ -105,15 +105,16 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
@include S(width, 75px); @include S(width, 70px);
overflow: hidden;
button.pin { button.pin {
@include S(width, 12px); @include S(width, 12px);
@include S(height, 12px); @include S(height, 12px);
background: uiResource("icons/pin.png") center center / 95% no-repeat; background: uiResource("icons/pin.png") center center / 95% no-repeat;
position: absolute; position: absolute;
@include S(top, -2px); @include S(top, 2px);
@include S(right, -2px); @include S(right, 2px);
opacity: 0.6; opacity: 0.6;
cursor: pointer; cursor: pointer;
pointer-events: all; pointer-events: all;

View File

@ -38,7 +38,7 @@ export const globalConfig = {
// Belt speeds // Belt speeds
// NOTICE: Update webpack.production.config too! // NOTICE: Update webpack.production.config too!
beltSpeedItemsPerSecond: 1, beltSpeedItemsPerSecond: 5,
itemSpacingOnBelts: 0.63, itemSpacingOnBelts: 0.63,
minerSpeedItemsPerSecond: 0, // COMPUTED minerSpeedItemsPerSecond: 0, // COMPUTED
@ -76,8 +76,8 @@ export const globalConfig = {
debug: { debug: {
/* dev:start */ /* dev:start */
// fastGameEnter: true, fastGameEnter: true,
// noArtificialDelays: true, noArtificialDelays: true,
// disableSavegameWrite: true, // disableSavegameWrite: true,
showEntityBounds: false, showEntityBounds: false,
showAcceptorEjectors: false, showAcceptorEjectors: false,
@ -87,9 +87,9 @@ export const globalConfig = {
disableZoomLimits: false, disableZoomLimits: false,
showChunkBorders: false, showChunkBorders: false,
rewardsInstant: false, rewardsInstant: false,
allBuildingsUnlocked: true, // allBuildingsUnlocked: true,
upgradesNoCost: true, upgradesNoCost: true,
disableUnlockDialog: false, disableUnlockDialog: true,
// testTranslations: true, // testTranslations: true,
/* dev:end */ /* dev:end */
}, },

View File

@ -19,6 +19,7 @@ export class MetaCutterBuilding extends MetaBuilding {
getSilhouetteColor() { getSilhouetteColor() {
return "#7dcda2"; return "#7dcda2";
} }
getDimensions(variant) { getDimensions(variant) {
switch (variant) { switch (variant) {
case defaultBuildingVariant: case defaultBuildingVariant:
@ -30,8 +31,14 @@ export class MetaCutterBuilding extends MetaBuilding {
} }
} }
/**
* @param {GameRoot} root
*/
getAvailableVariants(root) { getAvailableVariants(root) {
return [defaultBuildingVariant, enumCutterVariants.quad]; if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_cutter_quad)) {
return [defaultBuildingVariant, enumCutterVariants.quad];
}
return super.getAvailableVariants(root);
} }
/** /**

View File

@ -4,6 +4,7 @@ import { MinerComponent } from "../components/miner";
import { Entity } from "../entity"; import { Entity } from "../entity";
import { MetaBuilding, defaultBuildingVariant } from "../meta_building"; import { MetaBuilding, defaultBuildingVariant } from "../meta_building";
import { GameRoot } from "../root"; import { GameRoot } from "../root";
import { enumHubGoalRewards } from "../tutorial_goals";
/** @enum {string} */ /** @enum {string} */
export const enumMinerVariants = { chainable: "chainable" }; export const enumMinerVariants = { chainable: "chainable" };
@ -17,8 +18,15 @@ export class MetaMinerBuilding extends MetaBuilding {
return "#b37dcd"; return "#b37dcd";
} }
/**
*
* @param {GameRoot} root
*/
getAvailableVariants(root) { getAvailableVariants(root) {
return [defaultBuildingVariant, enumMinerVariants.chainable]; if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_miner_chainable)) {
return [defaultBuildingVariant, enumMinerVariants.chainable];
}
return super.getAvailableVariants(root);
} }
/** /**

View File

@ -33,8 +33,18 @@ export class MetaPainterBuilding extends MetaBuilding {
return "#cd9b7d"; return "#cd9b7d";
} }
/**
* @param {GameRoot} root
*/
getAvailableVariants(root) { getAvailableVariants(root) {
return [defaultBuildingVariant, enumPainterVariants.double, enumPainterVariants.quad]; let variants = [defaultBuildingVariant];
if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_painter_double)) {
variants.push(enumPainterVariants.double);
}
if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_painter_quad)) {
variants.push(enumPainterVariants.quad);
}
return variants;
} }
/** /**

View File

@ -20,8 +20,15 @@ export class MetaRotaterBuilding extends MetaBuilding {
return "#7dc6cd"; return "#7dc6cd";
} }
/**
*
* @param {GameRoot} root
*/
getAvailableVariants(root) { getAvailableVariants(root) {
return [defaultBuildingVariant, enumRotaterVariants.ccw]; if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_rotater_ccw)) {
return [defaultBuildingVariant, enumRotaterVariants.ccw];
}
return super.getAvailableVariants(root);
} }
/** /**

View File

@ -32,8 +32,18 @@ export class MetaSplitterBuilding extends MetaBuilding {
return "#444"; return "#444";
} }
/**
* @param {GameRoot} root
*/
getAvailableVariants(root) { getAvailableVariants(root) {
return [defaultBuildingVariant, enumSplitterVariants.compact, enumSplitterVariants.compactInverse]; if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_splitter_compact)) {
return [
defaultBuildingVariant,
enumSplitterVariants.compact,
enumSplitterVariants.compactInverse,
];
}
return super.getAvailableVariants(root);
} }
/** /**

View File

@ -40,8 +40,14 @@ export class MetaUndergroundBeltBuilding extends MetaBuilding {
return true; return true;
} }
/**
* @param {GameRoot} root
*/
getAvailableVariants(root) { getAvailableVariants(root) {
return [defaultBuildingVariant, enumUndergroundBeltVariants.tier2]; if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_underground_belt_tier_2)) {
return [defaultBuildingVariant, enumUndergroundBeltVariants.tier2];
}
return super.getAvailableVariants(root);
} }
getPreviewSprite(rotationVariant, variant) { getPreviewSprite(rotationVariant, variant) {

View File

@ -53,7 +53,7 @@ export class Camera extends BasicSerializableObject {
this.clampZoomLevel(); this.clampZoomLevel();
/** @type {Vector} */ /** @type {Vector} */
this.center = new Vector(2 * globalConfig.tileSize, 2 * globalConfig.tileSize); this.center = new Vector(0, 0);
// Input handling // Input handling
this.currentlyMoving = false; this.currentlyMoving = false;

View File

@ -69,6 +69,8 @@ export class HUDBuildingPlacer extends BaseHUDPart {
* @type {Vector} * @type {Vector}
*/ */
this.initialDragTile = null; this.initialDragTile = null;
this.root.signals.storyGoalCompleted.add(this.rerenderVariants, this);
} }
createElements(parent) { createElements(parent) {

View File

@ -159,11 +159,11 @@ export class MapChunk {
weights = { weights = {
[enumSubShape.rect]: 100, [enumSubShape.rect]: 100,
[enumSubShape.circle]: Math_round(50 + clamp(distanceToOriginInChunks * 2, 0, 50)), [enumSubShape.circle]: Math_round(50 + clamp(distanceToOriginInChunks * 2, 0, 50)),
[enumSubShape.star]: Math_round(9 + clamp(distanceToOriginInChunks, 0, 30)), [enumSubShape.star]: Math_round(20 + clamp(distanceToOriginInChunks, 0, 30)),
[enumSubShape.windmill]: Math_round(6 + clamp(distanceToOriginInChunks / 2, 0, 20)), [enumSubShape.windmill]: Math_round(6 + clamp(distanceToOriginInChunks / 2, 0, 20)),
}; };
if (distanceToOriginInChunks < 5) { if (distanceToOriginInChunks < 4) {
// Initial chunks can not spawn the good stuff // Initial chunks can not spawn the good stuff
weights[enumSubShape.star] = 0; weights[enumSubShape.star] = 0;
weights[enumSubShape.windmill] = 0; weights[enumSubShape.windmill] = 0;
@ -188,6 +188,18 @@ export class MapChunk {
]; ];
} }
// Makes sure windmills never spawn as whole
let windmillCount = 0;
for (let i = 0; i < subShapes.length; ++i) {
if (subShapes[i] === enumSubShape.windmill) {
++windmillCount;
}
}
if (windmillCount > 1) {
subShapes[0] = enumSubShape.rect;
subShapes[1] = enumSubShape.rect;
}
const definition = this.root.shapeDefinitionMgr.getDefinitionFromSimpleShapes(subShapes); const definition = this.root.shapeDefinitionMgr.getDefinitionFromSimpleShapes(subShapes);
this.internalGeneratePatch(rng, shapePatchSize, new ShapeItem(definition)); this.internalGeneratePatch(rng, shapePatchSize, new ShapeItem(definition));
} }

View File

@ -12,142 +12,122 @@ export const enumHubGoalRewards = {
reward_splitter: "reward_splitter", reward_splitter: "reward_splitter",
reward_tunnel: "reward_tunnel", reward_tunnel: "reward_tunnel",
reward_rotater_ccw: "reward_rotater_ccw",
reward_miner_chainable: "reward_miner_chainable",
reward_underground_belt_tier_2: "reward_underground_belt_tier_2",
reward_splitter_compact: "reward_splitter_compact",
reward_cutter_quad: "reward_cutter_quad",
reward_painter_double: "reward_painter_double",
reward_painter_quad: "reward_painter_quad",
reward_freeplay: "reward_freeplay",
no_reward: "no_reward", no_reward: "no_reward",
}; };
export const tutorialGoals = [ export const tutorialGoals = [
// Circle // Circle
{ {
shape: "CuCuCuCu", shape: "CuCuCuCu", // belts t1
required: 40, required: 60,
reward: enumHubGoalRewards.reward_cutter_and_trash, reward: enumHubGoalRewards.reward_cutter_and_trash,
}, },
// Cutter // Cutter
{ {
shape: "CuCu----", shape: "----CuCu", //
required: 150,
reward: enumHubGoalRewards.no_reward,
},
{
shape: "----CuCu",
required: 200,
reward: enumHubGoalRewards.reward_splitter,
},
// Rectangle
{
shape: "RuRuRuRu",
required: 80, required: 80,
reward: enumHubGoalRewards.no_reward, reward: enumHubGoalRewards.no_reward,
}, },
// Rectangle
{ {
shape: "RuRu----", shape: "RuRuRuRu", // miners t1
required: 250, required: 100,
reward: enumHubGoalRewards.reward_splitter,
},
{
shape: "RuRu----", // processors t2
required: 350,
reward: enumHubGoalRewards.reward_rotater, reward: enumHubGoalRewards.reward_rotater,
}, },
// Rotater // Rotater
{ {
shape: "--CuCu--", shape: "--CuCu--", // belts t2
required: 300, required: 300,
reward: enumHubGoalRewards.no_reward,
},
{
shape: "Ru----Ru",
required: 400,
reward: enumHubGoalRewards.reward_tunnel, reward: enumHubGoalRewards.reward_tunnel,
}, },
{ {
shape: "Cu------", shape: "Cu------", // miners t2
required: 800,
reward: enumHubGoalRewards.no_reward,
},
{
shape: "------Ru",
required: 1000, required: 1000,
reward: enumHubGoalRewards.reward_painter, reward: enumHubGoalRewards.reward_painter,
}, },
// Painter // Painter
{ {
shape: "CrCrCrCr", shape: "CrCrCrCr", // unused
required: 1500, required: 1500,
reward: enumHubGoalRewards.no_reward, reward: enumHubGoalRewards.reward_rotater_ccw,
}, },
{ {
shape: "RbRb----", shape: "RbRb----", // painter t2
required: 2500, required: 2500,
reward: enumHubGoalRewards.reward_mixer, reward: enumHubGoalRewards.reward_mixer,
}, },
// Mixing (purple) // Mixing (purple)
{ {
shape: "CpCpCpCp", shape: "CpCpCpCp", // belts t3
required: 4000, required: 4000,
reward: enumHubGoalRewards.no_reward, reward: enumHubGoalRewards.reward_splitter_compact,
}, },
// Star shape + cyan // Star shape + cyan
{ {
shape: "ScScScSc", shape: "ScScScSc", // miners t3
required: 500, required: 5000,
reward: enumHubGoalRewards.reward_stacker, reward: enumHubGoalRewards.reward_stacker,
}, },
// Stacker // Stacker
{ {
shape: "CgScScCg", shape: "CgScScCg", // processors t3
required: 3000,
reward: enumHubGoalRewards.no_reward,
},
{
shape: "RpRpRpRp:CcCcCcCc",
required: 4000,
reward: enumHubGoalRewards.no_reward,
},
{
shape: "RgCwRgCw:CpCpCpCp",
required: 6000, required: 6000,
reward: enumHubGoalRewards.no_reward, reward: enumHubGoalRewards.reward_miner_chainable,
}, },
{ {
shape: "CwSwCwSw:CpCrCpCr", shape: "RpRpRpRp:CwCwCwCw", // painting t3
required: 6000, required: 7000,
reward: enumHubGoalRewards.no_reward, reward: enumHubGoalRewards.reward_underground_belt_tier_2,
}, },
{ {
shape: "WyWyWyWy", shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", // belts t4 (two variants)
required: 2000, required: 8000,
reward: enumHubGoalRewards.no_reward, reward: enumHubGoalRewards.reward_cutter_quad,
}, },
{ {
shape: "WyWgWyWg:CbCpCbCp", shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", // miner t4 (two variants)
required: 4000,
reward: enumHubGoalRewards.no_reward,
},
{
shape: "WyRgWyRg:CbCpCbCp:CpCgCpCg",
required: 9000, required: 9000,
reward: enumHubGoalRewards.no_reward, reward: enumHubGoalRewards.reward_painter_double,
}, },
{ {
shape: "CwRrCbRy:ScSrSpSb:CwCwCwCw:RgRgRgRg", shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", // processors t4 (two varinats)
required: 15000, required: 10000,
reward: enumHubGoalRewards.no_reward, reward: enumHubGoalRewards.reward_painter_quad,
},
{
shape: "RuCw--Cw:----Ru--",
required: 50000,
reward: enumHubGoalRewards.reward_freeplay,
}, },
]; ];

View File

@ -1,94 +1,132 @@
import { findNiceIntegerValue } from "../core/utils"; import { findNiceIntegerValue } from "../core/utils";
import { ShapeDefinition } from "./shape_definition"; import { ShapeDefinition } from "./shape_definition";
const finalShape = "RuCw--Cw:----Ru--";
export const UPGRADES = { export const UPGRADES = {
belt: { belt: {
tiers: [ tiers: [
{ {
required: [{ shape: "CuCuCuCu", amount: 80 }], required: [{ shape: "CuCuCuCu", amount: 150 }],
improvement: 1, improvement: 1,
}, },
{ {
required: [{ shape: "Ru----Ru", amount: 4000 }], required: [{ shape: "--CuCu--", amount: 1500 }],
improvement: 2, improvement: 2,
}, },
{ {
required: [{ shape: "CwSwCwSw", amount: 30000 }], required: [{ shape: "CpCpCpCp", amount: 15000 }],
improvement: 4, improvement: 4,
}, },
{ {
required: [{ shape: "RgRgSpSp:CwSwCwSw:Cr--Sw--", amount: 80000 }], required: [{ shape: "SrSrSrSr:CyCyCyCy", amount: 40000 }],
improvement: 4, improvement: 4,
}, },
{
required: [{ shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", amount: 40000 }],
improvement: 4,
},
{
required: [{ shape: finalShape, amount: 150000 }],
improvement: 4,
excludePrevious: true,
},
], ],
}, },
miner: { miner: {
tiers: [ tiers: [
{ {
required: [{ shape: "RuRuRuRu", amount: 200 }], required: [{ shape: "RuRuRuRu", amount: 400 }],
improvement: 1, improvement: 1,
}, },
{ {
required: [{ shape: "Cu------", amount: 4000 }], required: [{ shape: "Cu------", amount: 5500 }],
improvement: 2, improvement: 2,
}, },
{ {
required: [{ shape: "WyWgWyWg:CbCpCbCp", amount: 30000 }], required: [{ shape: "ScScScSc", amount: 20000 }],
improvement: 4, improvement: 4,
}, },
{ {
required: [{ shape: "WyWgWyWg:CbCpCbCp:Rp----Rp", amount: 90000 }], required: [{ shape: "CwCwCwCw:WbWbWbWb", amount: 40000 }],
improvement: 4, improvement: 4,
}, },
{
required: [{ shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", amount: 40000 }],
improvement: 4,
},
{
required: [{ shape: finalShape, amount: 150000 }],
improvement: 4,
excludePrevious: true,
},
], ],
}, },
processors: { processors: {
tiers: [ tiers: [
{ {
required: [{ shape: "SuSuSuSu", amount: 200 }], required: [{ shape: "SuSuSuSu", amount: 1000 }],
improvement: 1, improvement: 1,
}, },
{ {
required: [{ shape: "Cu------", amount: 4000 }], required: [{ shape: "RuRu----", amount: 2000 }],
improvement: 2, improvement: 2,
}, },
{ {
required: [{ shape: "WyWgWyWg:CbCpCbCp", amount: 30000 }], required: [{ shape: "CgScScCg", amount: 25000 }],
improvement: 4, improvement: 4,
}, },
{ {
required: [{ shape: "WyWgWyWg:CbCpCbCp:Rp----Rp", amount: 90000 }], required: [{ shape: "CwCrCwCr:SgSgSgSg", amount: 40000 }],
improvement: 4, improvement: 4,
}, },
{
required: [{ shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", amount: 40000 }],
improvement: 4,
},
{
required: [{ shape: finalShape, amount: 150000 }],
improvement: 4,
excludePrevious: true,
},
], ],
}, },
painting: { painting: {
tiers: [ tiers: [
{ {
required: [{ shape: "WuWuWuWu", amount: 200 }], required: [{ shape: "WrWrWrWr", amount: 2000 }],
improvement: 1, improvement: 1,
}, },
{ {
required: [{ shape: "Cu------", amount: 4000 }], required: [{ shape: "RbRb----", amount: 4000 }],
improvement: 2, improvement: 2,
}, },
{ {
required: [{ shape: "WyWgWyWg:CbCpCbCp", amount: 30000 }], required: [{ shape: "RpRpRpRp:CwCwCwCw", amount: 30000 }],
improvement: 4, improvement: 4,
}, },
{ {
required: [{ shape: "WyWgWyWg:CbCpCbCp:Rp----Rp", amount: 90000 }], required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp", amount: 40000 }],
improvement: 4, improvement: 4,
}, },
{
required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp:CwCwCwCw", amount: 40000 }],
improvement: 4,
},
{
required: [{ shape: finalShape, amount: 150000 }],
improvement: 4,
excludePrevious: true,
},
], ],
}, },
}; };
// Tiers need % of the previous tier as requirement too // Tiers need % of the previous tier as requirement too
const tierGrowth = 2; const tierGrowth = 2.5;
// Automatically generate tier levels // Automatically generate tier levels
for (const upgradeId in UPGRADES) { for (const upgradeId in UPGRADES) {
@ -101,10 +139,12 @@ for (const upgradeId in UPGRADES) {
for (let k = currentTierRequirements.length - 1; k >= 0; --k) { for (let k = currentTierRequirements.length - 1; k >= 0; --k) {
const oldTierRequirement = currentTierRequirements[k]; const oldTierRequirement = currentTierRequirements[k];
tierHandle.required.unshift({ if (!tierHandle.excludePrevious) {
shape: oldTierRequirement.shape, tierHandle.required.unshift({
amount: oldTierRequirement.amount, shape: oldTierRequirement.shape,
}); amount: oldTierRequirement.amount,
});
}
} }
currentTierRequirements.push( currentTierRequirements.push(
...originalRequired.map(req => ({ ...originalRequired.map(req => ({

View File

@ -266,6 +266,16 @@ storyRewards:
reward_splitter: Splitter/Merger reward_splitter: Splitter/Merger
reward_tunnel: Tunnel reward_tunnel: Tunnel
reward_rotater_ccw: CCW Rotating
reward_miner_chainable: Chaining Extractor
reward_underground_belt_tier_2: Tunnel Tier II
reward_splitter_compact: Compact Balancer
reward_cutter_quad: Quad Cutting
reward_painter_double: Double Painting
reward_painter_quad: Quad Painting
reward_freeplay: Freeplay
# Special reward, which is shown when there is no reward actually # Special reward, which is shown when there is no reward actually
no_reward: Next level no_reward: Next level