mirror of
https://github.com/tobspr/shapez.io.git
synced 2026-03-02 03:39:21 +00:00
Add final shapes and upgrades until tier 20
This commit is contained in:
@@ -44,6 +44,7 @@ import { HUDWireInfo } from "./parts/wire_info";
|
||||
import { HUDLeverToggle } from "./parts/lever_toggle";
|
||||
import { HUDLayerPreview } from "./parts/layer_preview";
|
||||
import { HUDMinerHighlight } from "./parts/miner_highlight";
|
||||
import { HUDBetaOverlay } from "./parts/beta_overlay";
|
||||
|
||||
export class GameHUD {
|
||||
/**
|
||||
@@ -75,7 +76,6 @@ export class GameHUD {
|
||||
pinnedShapes: new HUDPinnedShapes(this.root),
|
||||
notifications: new HUDNotifications(this.root),
|
||||
settingsMenu: new HUDSettingsMenu(this.root),
|
||||
// betaOverlay: new HUDBetaOverlay(this.root),
|
||||
debugInfo: new HUDDebugInfo(this.root),
|
||||
dialogs: new HUDModalDialogs(this.root),
|
||||
screenshotExporter: new HUDScreenshotExporter(this.root),
|
||||
@@ -137,6 +137,10 @@ export class GameHUD {
|
||||
this.parts.sandboxController = new HUDSandboxController(this.root);
|
||||
}
|
||||
|
||||
if (!G_IS_RELEASE) {
|
||||
this.parts.betaOverlay = new HUDBetaOverlay(this.root);
|
||||
}
|
||||
|
||||
const frag = document.createDocumentFragment();
|
||||
for (const key in this.parts) {
|
||||
this.parts[key].createElements(frag);
|
||||
|
||||
@@ -3,7 +3,7 @@ import { makeDiv } from "../../../core/utils";
|
||||
|
||||
export class HUDBetaOverlay extends BaseHUDPart {
|
||||
createElements(parent) {
|
||||
this.element = makeDiv(parent, "ingame_HUD_BetaOverlay", [], "CLOSED BETA");
|
||||
this.element = makeDiv(parent, "ingame_HUD_BetaOverlay", [], "BETA VERSION");
|
||||
}
|
||||
|
||||
initialize() {}
|
||||
|
||||
@@ -4,6 +4,8 @@ import { ShapeDefinition } from "../../shape_definition";
|
||||
import { BaseHUDPart } from "../base_hud_part";
|
||||
import { blueprintShape, UPGRADES } from "../../upgrades";
|
||||
import { enumHubGoalRewards } from "../../tutorial_goals";
|
||||
import { enumAnalyticsDataSource } from "../../production_analytics";
|
||||
import { T } from "../../../translations";
|
||||
|
||||
/**
|
||||
* Manages the pinned shapes on the left side of the screen
|
||||
@@ -22,11 +24,13 @@ export class HUDPinnedShapes extends BaseHUDPart {
|
||||
* convenient. Also allows for cleaning up handles.
|
||||
* @type {Array<{
|
||||
* key: string,
|
||||
* definition: ShapeDefinition,
|
||||
* amountLabel: HTMLElement,
|
||||
* lastRenderedValue: string,
|
||||
* element: HTMLElement,
|
||||
* detector?: ClickDetector,
|
||||
* infoDetector?: ClickDetector
|
||||
* infoDetector?: ClickDetector,
|
||||
* throughputOnly?: boolean
|
||||
* }>}
|
||||
*/
|
||||
this.handles = [];
|
||||
@@ -163,29 +167,40 @@ export class HUDPinnedShapes extends BaseHUDPart {
|
||||
this.handles = [];
|
||||
|
||||
// Pin story goal
|
||||
this.internalPinShape(currentKey, false, "goal");
|
||||
this.internalPinShape({
|
||||
key: currentKey,
|
||||
canUnpin: false,
|
||||
className: "goal",
|
||||
throughputOnly: currentGoal.throughputOnly,
|
||||
});
|
||||
|
||||
// Pin blueprint shape as well
|
||||
if (this.root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_blueprints)) {
|
||||
this.internalPinShape(blueprintShape, false, "blueprint");
|
||||
this.internalPinShape({
|
||||
key: blueprintShape,
|
||||
canUnpin: false,
|
||||
className: "blueprint",
|
||||
});
|
||||
}
|
||||
|
||||
// Pin manually pinned shapes
|
||||
for (let i = 0; i < this.pinnedShapes.length; ++i) {
|
||||
const key = this.pinnedShapes[i];
|
||||
if (key !== currentKey) {
|
||||
this.internalPinShape(key);
|
||||
this.internalPinShape({ key });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Pins a new shape
|
||||
* @param {string} key
|
||||
* @param {boolean} canUnpin
|
||||
* @param {string=} className
|
||||
* @param {object} param0
|
||||
* @param {string} param0.key
|
||||
* @param {boolean=} param0.canUnpin
|
||||
* @param {string=} param0.className
|
||||
* @param {boolean=} param0.throughputOnly
|
||||
*/
|
||||
internalPinShape(key, canUnpin = true, className = null) {
|
||||
internalPinShape({ key, canUnpin = true, className = null, throughputOnly = false }) {
|
||||
const definition = this.root.shapeDefinitionMgr.getShapeFromShortKey(key);
|
||||
|
||||
const element = makeDiv(this.element, null, ["shape"]);
|
||||
@@ -229,11 +244,13 @@ export class HUDPinnedShapes extends BaseHUDPart {
|
||||
|
||||
this.handles.push({
|
||||
key,
|
||||
definition,
|
||||
element,
|
||||
amountLabel,
|
||||
lastRenderedValue: "",
|
||||
detector,
|
||||
infoDetector,
|
||||
throughputOnly,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -244,8 +261,20 @@ export class HUDPinnedShapes extends BaseHUDPart {
|
||||
for (let i = 0; i < this.handles.length; ++i) {
|
||||
const handle = this.handles[i];
|
||||
|
||||
const currentValue = this.root.hubGoals.getShapesStoredByKey(handle.key);
|
||||
const currentValueFormatted = formatBigNumber(currentValue);
|
||||
let currentValue = this.root.hubGoals.getShapesStoredByKey(handle.key);
|
||||
let currentValueFormatted = formatBigNumber(currentValue);
|
||||
|
||||
if (handle.throughputOnly) {
|
||||
currentValue = this.root.productionAnalytics.getCurrentShapeRate(
|
||||
enumAnalyticsDataSource.delivered,
|
||||
handle.definition
|
||||
);
|
||||
currentValueFormatted = T.ingame.statistics.shapesDisplayUnits.second.replace(
|
||||
"<shapes>",
|
||||
String(currentValue)
|
||||
);
|
||||
}
|
||||
|
||||
if (currentValueFormatted !== handle.lastRenderedValue) {
|
||||
handle.lastRenderedValue = currentValueFormatted;
|
||||
handle.amountLabel.innerText = currentValueFormatted;
|
||||
|
||||
@@ -113,7 +113,7 @@ export class HUDSandboxController extends BaseHUDPart {
|
||||
modifyLevel(amount) {
|
||||
const hubGoals = this.root.hubGoals;
|
||||
hubGoals.level = Math.max(1, hubGoals.level + amount);
|
||||
hubGoals.createNextGoal();
|
||||
hubGoals.computeNextGoal();
|
||||
|
||||
// Clear all shapes of this level
|
||||
hubGoals.storedShapes[hubGoals.currentGoal.definition.getHash()] = 0;
|
||||
|
||||
@@ -90,17 +90,15 @@ export class HUDShop extends BaseHUDPart {
|
||||
// Max level
|
||||
handle.elemDescription.innerText = T.ingame.shop.maximumLevel.replace(
|
||||
"<currentMult>",
|
||||
currentTierMultiplier.toString()
|
||||
formatBigNumber(currentTierMultiplier)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Set description
|
||||
handle.elemDescription.innerText = T.shopUpgrades[upgradeId].description
|
||||
.replace("<currentMult>", currentTierMultiplier.toString())
|
||||
.replace("<newMult>", (currentTierMultiplier + tierHandle.improvement).toString())
|
||||
// Backwards compatibility
|
||||
.replace("<gain>", (tierHandle.improvement * 100.0).toString());
|
||||
.replace("<currentMult>", formatBigNumber(currentTierMultiplier))
|
||||
.replace("<newMult>", formatBigNumber(currentTierMultiplier + tierHandle.improvement));
|
||||
|
||||
tierHandle.required.forEach(({ shape, amount }) => {
|
||||
const container = makeDiv(handle.elemRequirements, null, ["requirement"]);
|
||||
|
||||
@@ -4,11 +4,12 @@ import { makeDiv } from "../../../core/utils";
|
||||
import { SOUNDS } from "../../../platform/sound";
|
||||
import { T } from "../../../translations";
|
||||
import { defaultBuildingVariant } from "../../meta_building";
|
||||
import { enumHubGoalRewards } from "../../tutorial_goals";
|
||||
import { enumHubGoalRewards, tutorialGoals } from "../../tutorial_goals";
|
||||
import { BaseHUDPart } from "../base_hud_part";
|
||||
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
||||
import { enumHubGoalRewardsToContentUnlocked } from "../../tutorial_goals_mappings";
|
||||
import { InputReceiver } from "../../../core/input_receiver";
|
||||
import { enumNotificationType } from "./notifications";
|
||||
|
||||
export class HUDUnlockNotification extends BaseHUDPart {
|
||||
initialize() {
|
||||
@@ -50,6 +51,14 @@ export class HUDUnlockNotification extends BaseHUDPart {
|
||||
* @param {enumHubGoalRewards} reward
|
||||
*/
|
||||
showForLevel(level, reward) {
|
||||
if (level > tutorialGoals.length) {
|
||||
this.root.hud.signals.notification.dispatch(
|
||||
T.ingame.notifications.freeplayLevelComplete.replace("<level>", String(level)),
|
||||
enumNotificationType.success
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
|
||||
this.elemTitle.innerText = T.ingame.levelCompleteNotification.levelTitle.replace(
|
||||
"<level>",
|
||||
|
||||
Reference in New Issue
Block a user