|
|
|
@ -1,4 +1,3 @@
|
|
|
|
|
import { IS_DEMO } from "../../core/config";
|
|
|
|
|
import { findNiceIntegerValue } from "../../core/utils";
|
|
|
|
|
import { GameMode } from "../game_mode";
|
|
|
|
|
import { ShapeDefinition } from "../shape_definition";
|
|
|
|
@ -9,12 +8,17 @@ const finalGameShape = "RuCw--Cw:----Ru--";
|
|
|
|
|
const preparementShape = "CpRpCp--:SwSwSwSw";
|
|
|
|
|
const blueprintShape = "CbCbCbRb:CwCwCwCw";
|
|
|
|
|
|
|
|
|
|
const fixedImprovements = [0.5, 0.5, 1, 1, 2, 1, 1];
|
|
|
|
|
// Tiers need % of the previous tier as requirement too
|
|
|
|
|
const tierGrowth = 2.5;
|
|
|
|
|
|
|
|
|
|
// @FIXME @TODO
|
|
|
|
|
const numEndgameUpgrades = !IS_DEMO ? 20 - fixedImprovements.length - 1 : 0;
|
|
|
|
|
/**
|
|
|
|
|
* Generates all upgrades
|
|
|
|
|
* @returns {Object<string, import("../game_mode").UpgradeTiers>} */
|
|
|
|
|
function generateUpgrades(limitedVersion = false) {
|
|
|
|
|
const fixedImprovements = [0.5, 0.5, 1, 1, 2, 1, 1];
|
|
|
|
|
const numEndgameUpgrades = limitedVersion ? 0 : 1000 - fixedImprovements.length - 1;
|
|
|
|
|
|
|
|
|
|
function generateEndgameUpgrades() {
|
|
|
|
|
function generateInfiniteUnlocks() {
|
|
|
|
|
return new Array(numEndgameUpgrades).fill(null).map((_, i) => ({
|
|
|
|
|
required: [
|
|
|
|
|
{ shape: preparementShape, amount: 30000 + i * 10000 },
|
|
|
|
@ -23,14 +27,14 @@ function generateEndgameUpgrades() {
|
|
|
|
|
],
|
|
|
|
|
excludePrevious: true,
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < numEndgameUpgrades; ++i) {
|
|
|
|
|
// Fill in endgame upgrades
|
|
|
|
|
for (let i = 0; i < numEndgameUpgrades; ++i) {
|
|
|
|
|
fixedImprovements.push(0.1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @type {Object<string, import("../game_mode").UpgradeTiers>} */
|
|
|
|
|
const cachedUpgrades = {
|
|
|
|
|
const upgrades = {
|
|
|
|
|
belt: [
|
|
|
|
|
{
|
|
|
|
|
required: [{ shape: "CuCuCuCu", amount: 60 }],
|
|
|
|
@ -58,7 +62,7 @@ const cachedUpgrades = {
|
|
|
|
|
],
|
|
|
|
|
excludePrevious: true,
|
|
|
|
|
},
|
|
|
|
|
...generateEndgameUpgrades(),
|
|
|
|
|
...generateInfiniteUnlocks(),
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
miner: [
|
|
|
|
@ -88,7 +92,7 @@ const cachedUpgrades = {
|
|
|
|
|
],
|
|
|
|
|
excludePrevious: true,
|
|
|
|
|
},
|
|
|
|
|
...generateEndgameUpgrades(),
|
|
|
|
|
...generateInfiniteUnlocks(),
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
processors: [
|
|
|
|
@ -118,7 +122,7 @@ const cachedUpgrades = {
|
|
|
|
|
],
|
|
|
|
|
excludePrevious: true,
|
|
|
|
|
},
|
|
|
|
|
...generateEndgameUpgrades(),
|
|
|
|
|
...generateInfiniteUnlocks(),
|
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
painting: [
|
|
|
|
@ -148,16 +152,13 @@ const cachedUpgrades = {
|
|
|
|
|
],
|
|
|
|
|
excludePrevious: true,
|
|
|
|
|
},
|
|
|
|
|
...generateEndgameUpgrades(),
|
|
|
|
|
...generateInfiniteUnlocks(),
|
|
|
|
|
],
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Tiers need % of the previous tier as requirement too
|
|
|
|
|
const tierGrowth = 2.5;
|
|
|
|
|
|
|
|
|
|
// Automatically generate tier levels
|
|
|
|
|
for (const upgradeId in cachedUpgrades) {
|
|
|
|
|
const upgradeTiers = cachedUpgrades[upgradeId];
|
|
|
|
|
// Automatically generate tier levels
|
|
|
|
|
for (const upgradeId in upgrades) {
|
|
|
|
|
const upgradeTiers = upgrades[upgradeId];
|
|
|
|
|
|
|
|
|
|
let currentTierRequirements = [];
|
|
|
|
|
for (let i = 0; i < upgradeTiers.length; ++i) {
|
|
|
|
@ -184,12 +185,12 @@ for (const upgradeId in cachedUpgrades) {
|
|
|
|
|
tier.amount = findNiceIntegerValue(tier.amount * tierGrowth);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// VALIDATE
|
|
|
|
|
if (G_IS_DEV) {
|
|
|
|
|
for (const upgradeId in cachedUpgrades) {
|
|
|
|
|
cachedUpgrades[upgradeId].forEach(tier => {
|
|
|
|
|
// VALIDATE
|
|
|
|
|
if (G_IS_DEV) {
|
|
|
|
|
for (const upgradeId in upgrades) {
|
|
|
|
|
upgrades[upgradeId].forEach(tier => {
|
|
|
|
|
tier.required.forEach(({ shape }) => {
|
|
|
|
|
try {
|
|
|
|
|
ShapeDefinition.fromShortKey(shape);
|
|
|
|
@ -199,9 +200,17 @@ if (G_IS_DEV) {
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return upgrades;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const levelDefinitions = [
|
|
|
|
|
/**
|
|
|
|
|
* Generates the level definitions
|
|
|
|
|
* @param {boolean} limitedVersion
|
|
|
|
|
*/
|
|
|
|
|
export function generateLevelDefinitions(limitedVersion = false) {
|
|
|
|
|
const levelDefinitions = [
|
|
|
|
|
// 1
|
|
|
|
|
// Circle
|
|
|
|
|
{
|
|
|
|
@ -304,7 +313,7 @@ const levelDefinitions = [
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// DEMO STOPS HERE
|
|
|
|
|
...(IS_DEMO
|
|
|
|
|
...(limitedVersion
|
|
|
|
|
? [
|
|
|
|
|
{
|
|
|
|
|
shape: "RpRpRpRp:CwCwCwCw",
|
|
|
|
@ -415,9 +424,9 @@ const levelDefinitions = [
|
|
|
|
|
reward: enumHubGoalRewards.reward_freeplay,
|
|
|
|
|
},
|
|
|
|
|
]),
|
|
|
|
|
];
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
if (G_IS_DEV) {
|
|
|
|
|
if (G_IS_DEV) {
|
|
|
|
|
levelDefinitions.forEach(({ shape }) => {
|
|
|
|
|
try {
|
|
|
|
|
ShapeDefinition.fromShortKey(shape);
|
|
|
|
@ -425,15 +434,30 @@ if (G_IS_DEV) {
|
|
|
|
|
throw new Error("Invalid tutorial goal: '" + ex + "' for shape" + shape);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return levelDefinitions;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const fullVersionUpgrades = generateUpgrades(false);
|
|
|
|
|
const demoVersionUpgrades = generateUpgrades(true);
|
|
|
|
|
|
|
|
|
|
const fullVersionLevels = generateLevelDefinitions(false);
|
|
|
|
|
const demoVersionLevels = generateLevelDefinitions(true);
|
|
|
|
|
|
|
|
|
|
export class RegularGameMode extends GameMode {
|
|
|
|
|
constructor(root) {
|
|
|
|
|
super(root);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getUpgrades() {
|
|
|
|
|
return cachedUpgrades;
|
|
|
|
|
return this.root.app.restrictionMgr.getHasExtendedUpgrades()
|
|
|
|
|
? fullVersionUpgrades
|
|
|
|
|
: demoVersionUpgrades;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getIsFreeplayAvailable() {
|
|
|
|
|
return this.root.app.restrictionMgr.getHasExtendedLevelsAndFreeplay();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getBlueprintShapeKey() {
|
|
|
|
@ -441,6 +465,8 @@ export class RegularGameMode extends GameMode {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getLevelDefinitions() {
|
|
|
|
|
return levelDefinitions;
|
|
|
|
|
return this.root.app.restrictionMgr.getHasExtendedLevelsAndFreeplay()
|
|
|
|
|
? fullVersionLevels
|
|
|
|
|
: demoVersionLevels;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|