From 97f52f509b7e8c192641fd25e52f74a333287a0e Mon Sep 17 00:00:00 2001 From: tobspr Date: Sun, 17 May 2020 14:46:33 +0200 Subject: [PATCH] Rebalance whole game --- res/ui/icons/pin.png | Bin 1664 -> 806 bytes src/css/ingame_hud/shop.scss | 13 +-- src/js/core/config.js | 10 +- src/js/game/buildings/cutter.js | 9 +- src/js/game/buildings/miner.js | 10 +- src/js/game/buildings/painter.js | 12 ++- src/js/game/buildings/rotater.js | 9 +- src/js/game/buildings/splitter.js | 12 ++- src/js/game/buildings/underground_belt.js | 8 +- src/js/game/camera.js | 2 +- src/js/game/hud/parts/building_placer.js | 2 + src/js/game/map_chunk.js | 16 ++- src/js/game/tutorial_goals.js | 120 +++++++++------------- src/js/game/upgrades.js | 82 +++++++++++---- translations/base-en.yaml | 10 ++ 15 files changed, 204 insertions(+), 111 deletions(-) diff --git a/res/ui/icons/pin.png b/res/ui/icons/pin.png index 768599f39aa9b5781f06aadd50751d498c2974d8..004d1e7262e0aa1ae018e12f04cc5db918b8e670 100644 GIT binary patch delta 624 zcmZqRUB;%^8Q|y6%O%Cdz`(%k>ERLtq!mDzgBeJ=Ea^HnQPHlRVS9j2h$~P42uw^Y zjZ7?zA;{F+*x1lkTO#%W1yg^C6EM~X=DUsSTfXuY&8c;gH#w=83EZ~oyNwNKoJuY3vF!& zpnV_(U=g5`Kq`Tzm{<#gH4wy*6v_Pz^tuVnQ4@lAflf>*jPJbC7GJ?j2y^VWG8%h%+|(#*Q`f;>9< zzxF-W1seL=)5S5w;`H1}*M*u41YE<9Hi>TR-peXlUHc#aCWM=}DA1pJr7)?78{C zKHVcb0(&xcUv~XcReNryA;-@Gk-u96>Rp@X9!;*Xafnr0lYHu$k#lXt@j0eCI(r>n z?ER5o)=^M3*D>jLAg@wxfLV&3v=)2Bx_vdWEBFmNB&A#P%d0P1{4jD~a_nRF4zA_j zg*Yb93+a2#@}aN0vG{S;qx{3Gr7JV;ymM+i^U_b=zmTc*vOB{jf#*SWAH_RwC-m}d v*J9i@`7Nughd(LP7*+2Gq&Ueo5{LcG(fA4v}@A(dTdN^yS z>8k+%G(;|r-f$J7XQ?WjOX@RU!(~Z?gS!I&SB}s>NvLqYHpIo-9e^}b0A$$!%)^vy z0)Sl@0FyxgSe*huH@>*h%LV|-XHPdDCkVhWA&1~|xO|+;!_h1tXBhBtf}F_!0=QfO zkH_P1V1VL90Ec427we=#NZD|QJFeV*&Pl=QV&8x02*9AgTa8U$t|=8Wnd%HOym_TTuj0|bQ=l7$x~QD z@S*we6bgW+XppZAZQ;Fe+2d<6!V|wM@1L}WjC#OFi9g~d{PpRukiZ_?$wU)WgfdN{XKn{co)AU05s+3p&Vyuu7*ikvdGB&fcg-|<(MO6sB5+X01&w6UE=Hw~Yp`TydpkuM?PBoKS+29}F zt|4v9=*VcYS8z9ME_-EK=+Rx@Rj9NpvBv9{$uiXpa-0;#r$Z$Lq-trNvuKk{ zT%k>58odL~BdhS8Oq;z~;s8}{sBQF-s|zE>#XU6l@=RArnez=qI*7K?}qAYpAjKPkULkHzSvY}pO3%!cDGc)z^rePDy z1ihMmYZu>7XvvrZeDh{()eb^R8ok_f}}B@Mq}T93OTzzpyDAGP|#_Pv5BAMiDSy zA-0J~mrtw`h~8k5!mGD;gh~r_8r4}J18c-?y-T`2H8lZ*z)s>2v+J;P+~h z?6fsGRFWKK6_OYR7r?|)PlxfX2p$8&tT3!K*I4qOf|$6_$nf3&U(nrK xJOm5$P=_sX;mJ}-Vi=H0rOe3KsH6}{d>At>G2--;jXneck&}mG&Bmate*i 1) { + subShapes[0] = enumSubShape.rect; + subShapes[1] = enumSubShape.rect; + } + const definition = this.root.shapeDefinitionMgr.getDefinitionFromSimpleShapes(subShapes); this.internalGeneratePatch(rng, shapePatchSize, new ShapeItem(definition)); } diff --git a/src/js/game/tutorial_goals.js b/src/js/game/tutorial_goals.js index 42cc2e83..47f9a325 100644 --- a/src/js/game/tutorial_goals.js +++ b/src/js/game/tutorial_goals.js @@ -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, }, ]; diff --git a/src/js/game/upgrades.js b/src/js/game/upgrades.js index 958c917e..1a7b9416 100644 --- a/src/js/game/upgrades.js +++ b/src/js/game/upgrades.js @@ -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 => ({ diff --git a/translations/base-en.yaml b/translations/base-en.yaml index 9d3bac7c..82e3fb72 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -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