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

View File

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

View File

@ -19,6 +19,7 @@ export class MetaCutterBuilding extends MetaBuilding {
getSilhouetteColor() {
return "#7dcda2";
}
getDimensions(variant) {
switch (variant) {
case defaultBuildingVariant:
@ -30,8 +31,14 @@ export class MetaCutterBuilding extends MetaBuilding {
}
}
/**
* @param {GameRoot} 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 { MetaBuilding, defaultBuildingVariant } from "../meta_building";
import { GameRoot } from "../root";
import { enumHubGoalRewards } from "../tutorial_goals";
/** @enum {string} */
export const enumMinerVariants = { chainable: "chainable" };
@ -17,8 +18,15 @@ export class MetaMinerBuilding extends MetaBuilding {
return "#b37dcd";
}
/**
*
* @param {GameRoot} 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";
}
/**
* @param {GameRoot} 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";
}
/**
*
* @param {GameRoot} 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";
}
/**
* @param {GameRoot} 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;
}
/**
* @param {GameRoot} 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) {

View File

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

View File

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

View File

@ -159,11 +159,11 @@ export class MapChunk {
weights = {
[enumSubShape.rect]: 100,
[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)),
};
if (distanceToOriginInChunks < 5) {
if (distanceToOriginInChunks < 4) {
// Initial chunks can not spawn the good stuff
weights[enumSubShape.star] = 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);
this.internalGeneratePatch(rng, shapePatchSize, new ShapeItem(definition));
}

View File

@ -12,142 +12,122 @@ export const enumHubGoalRewards = {
reward_splitter: "reward_splitter",
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",
};
export const tutorialGoals = [
// Circle
{
shape: "CuCuCuCu",
required: 40,
shape: "CuCuCuCu", // belts t1
required: 60,
reward: enumHubGoalRewards.reward_cutter_and_trash,
},
// Cutter
{
shape: "CuCu----",
required: 150,
reward: enumHubGoalRewards.no_reward,
},
{
shape: "----CuCu",
required: 200,
reward: enumHubGoalRewards.reward_splitter,
},
// Rectangle
{
shape: "RuRuRuRu",
shape: "----CuCu", //
required: 80,
reward: enumHubGoalRewards.no_reward,
},
// Rectangle
{
shape: "RuRu----",
required: 250,
shape: "RuRuRuRu", // miners t1
required: 100,
reward: enumHubGoalRewards.reward_splitter,
},
{
shape: "RuRu----", // processors t2
required: 350,
reward: enumHubGoalRewards.reward_rotater,
},
// Rotater
{
shape: "--CuCu--",
shape: "--CuCu--", // belts t2
required: 300,
reward: enumHubGoalRewards.no_reward,
},
{
shape: "Ru----Ru",
required: 400,
reward: enumHubGoalRewards.reward_tunnel,
},
{
shape: "Cu------",
required: 800,
reward: enumHubGoalRewards.no_reward,
},
{
shape: "------Ru",
shape: "Cu------", // miners t2
required: 1000,
reward: enumHubGoalRewards.reward_painter,
},
// Painter
{
shape: "CrCrCrCr",
shape: "CrCrCrCr", // unused
required: 1500,
reward: enumHubGoalRewards.no_reward,
reward: enumHubGoalRewards.reward_rotater_ccw,
},
{
shape: "RbRb----",
shape: "RbRb----", // painter t2
required: 2500,
reward: enumHubGoalRewards.reward_mixer,
},
// Mixing (purple)
{
shape: "CpCpCpCp",
shape: "CpCpCpCp", // belts t3
required: 4000,
reward: enumHubGoalRewards.no_reward,
reward: enumHubGoalRewards.reward_splitter_compact,
},
// Star shape + cyan
{
shape: "ScScScSc",
required: 500,
shape: "ScScScSc", // miners t3
required: 5000,
reward: enumHubGoalRewards.reward_stacker,
},
// Stacker
{
shape: "CgScScCg",
required: 3000,
reward: enumHubGoalRewards.no_reward,
},
{
shape: "RpRpRpRp:CcCcCcCc",
required: 4000,
reward: enumHubGoalRewards.no_reward,
},
{
shape: "RgCwRgCw:CpCpCpCp",
shape: "CgScScCg", // processors t3
required: 6000,
reward: enumHubGoalRewards.no_reward,
reward: enumHubGoalRewards.reward_miner_chainable,
},
{
shape: "CwSwCwSw:CpCrCpCr",
required: 6000,
reward: enumHubGoalRewards.no_reward,
shape: "RpRpRpRp:CwCwCwCw", // painting t3
required: 7000,
reward: enumHubGoalRewards.reward_underground_belt_tier_2,
},
{
shape: "WyWyWyWy",
required: 2000,
reward: enumHubGoalRewards.no_reward,
shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", // belts t4 (two variants)
required: 8000,
reward: enumHubGoalRewards.reward_cutter_quad,
},
{
shape: "WyWgWyWg:CbCpCbCp",
required: 4000,
reward: enumHubGoalRewards.no_reward,
},
{
shape: "WyRgWyRg:CbCpCbCp:CpCgCpCg",
shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", // miner t4 (two variants)
required: 9000,
reward: enumHubGoalRewards.no_reward,
reward: enumHubGoalRewards.reward_painter_double,
},
{
shape: "CwRrCbRy:ScSrSpSb:CwCwCwCw:RgRgRgRg",
required: 15000,
reward: enumHubGoalRewards.no_reward,
shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", // processors t4 (two varinats)
required: 10000,
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 { ShapeDefinition } from "./shape_definition";
const finalShape = "RuCw--Cw:----Ru--";
export const UPGRADES = {
belt: {
tiers: [
{
required: [{ shape: "CuCuCuCu", amount: 80 }],
required: [{ shape: "CuCuCuCu", amount: 150 }],
improvement: 1,
},
{
required: [{ shape: "Ru----Ru", amount: 4000 }],
required: [{ shape: "--CuCu--", amount: 1500 }],
improvement: 2,
},
{
required: [{ shape: "CwSwCwSw", amount: 30000 }],
required: [{ shape: "CpCpCpCp", amount: 15000 }],
improvement: 4,
},
{
required: [{ shape: "RgRgSpSp:CwSwCwSw:Cr--Sw--", amount: 80000 }],
required: [{ shape: "SrSrSrSr:CyCyCyCy", amount: 40000 }],
improvement: 4,
},
{
required: [{ shape: "SrSrSrSr:CyCyCyCy:SwSwSwSw", amount: 40000 }],
improvement: 4,
},
{
required: [{ shape: finalShape, amount: 150000 }],
improvement: 4,
excludePrevious: true,
},
],
},
miner: {
tiers: [
{
required: [{ shape: "RuRuRuRu", amount: 200 }],
required: [{ shape: "RuRuRuRu", amount: 400 }],
improvement: 1,
},
{
required: [{ shape: "Cu------", amount: 4000 }],
required: [{ shape: "Cu------", amount: 5500 }],
improvement: 2,
},
{
required: [{ shape: "WyWgWyWg:CbCpCbCp", amount: 30000 }],
required: [{ shape: "ScScScSc", amount: 20000 }],
improvement: 4,
},
{
required: [{ shape: "WyWgWyWg:CbCpCbCp:Rp----Rp", amount: 90000 }],
required: [{ shape: "CwCwCwCw:WbWbWbWb", amount: 40000 }],
improvement: 4,
},
{
required: [{ shape: "CbRbRbCb:CwCwCwCw:WbWbWbWb", amount: 40000 }],
improvement: 4,
},
{
required: [{ shape: finalShape, amount: 150000 }],
improvement: 4,
excludePrevious: true,
},
],
},
processors: {
tiers: [
{
required: [{ shape: "SuSuSuSu", amount: 200 }],
required: [{ shape: "SuSuSuSu", amount: 1000 }],
improvement: 1,
},
{
required: [{ shape: "Cu------", amount: 4000 }],
required: [{ shape: "RuRu----", amount: 2000 }],
improvement: 2,
},
{
required: [{ shape: "WyWgWyWg:CbCpCbCp", amount: 30000 }],
required: [{ shape: "CgScScCg", amount: 25000 }],
improvement: 4,
},
{
required: [{ shape: "WyWgWyWg:CbCpCbCp:Rp----Rp", amount: 90000 }],
required: [{ shape: "CwCrCwCr:SgSgSgSg", amount: 40000 }],
improvement: 4,
},
{
required: [{ shape: "WrRgWrRg:CwCrCwCr:SgSgSgSg", amount: 40000 }],
improvement: 4,
},
{
required: [{ shape: finalShape, amount: 150000 }],
improvement: 4,
excludePrevious: true,
},
],
},
painting: {
tiers: [
{
required: [{ shape: "WuWuWuWu", amount: 200 }],
required: [{ shape: "WrWrWrWr", amount: 2000 }],
improvement: 1,
},
{
required: [{ shape: "Cu------", amount: 4000 }],
required: [{ shape: "RbRb----", amount: 4000 }],
improvement: 2,
},
{
required: [{ shape: "WyWgWyWg:CbCpCbCp", amount: 30000 }],
required: [{ shape: "RpRpRpRp:CwCwCwCw", amount: 30000 }],
improvement: 4,
},
{
required: [{ shape: "WyWgWyWg:CbCpCbCp:Rp----Rp", amount: 90000 }],
required: [{ shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp", amount: 40000 }],
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
const tierGrowth = 2;
const tierGrowth = 2.5;
// Automatically generate tier levels
for (const upgradeId in UPGRADES) {
@ -101,10 +139,12 @@ for (const upgradeId in UPGRADES) {
for (let k = currentTierRequirements.length - 1; k >= 0; --k) {
const oldTierRequirement = currentTierRequirements[k];
tierHandle.required.unshift({
shape: oldTierRequirement.shape,
amount: oldTierRequirement.amount,
});
if (!tierHandle.excludePrevious) {
tierHandle.required.unshift({
shape: oldTierRequirement.shape,
amount: oldTierRequirement.amount,
});
}
}
currentTierRequirements.push(
...originalRequired.map(req => ({

View File

@ -266,6 +266,16 @@ storyRewards:
reward_splitter: Splitter/Merger
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
no_reward: Next level