1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2025-12-11 09:11:50 +00:00

Remove the restriction manager

Restriction manager is completely removed as it's only useful for demo
version. Lots of other demo-related things are left, such as ad support
or extended telemetry. This should be cleaned up later.
This commit is contained in:
Danyil Hryhoriev 2024-04-13 01:43:32 +03:00 committed by Даниїл Григор'єв
parent a2d1e434bb
commit b55001dd1a
18 changed files with 13 additions and 923 deletions

View File

@ -1,293 +0,0 @@
#ingame_HUD_StandaloneAdvantages {
.content {
@include S(width, 500px);
@include S(min-height, 300px);
}
p {
@include PlainText;
}
.points {
display: grid;
grid-template-columns: 1fr 1fr;
@include S(grid-column-gap, 5px);
@include S(grid-row-gap, 5px);
@include S(margin, 10px, 0, 10px);
align-items: center;
}
.title {
@include Heading;
text-transform: none;
text-align: center;
color: $colorRedBright;
}
.subTitle {
@include PlainText;
text-transform: none;
text-align: center;
}
.lowerBar {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
> button {
transition: opacity 0.12s ease-in-out;
&:hover {
opacity: 0.85;
}
}
.otherCloseButton {
@include SuperSmallText;
@include S(margin-right, 30px);
color: #aaa;
@include S(margin, 0);
@include IncreasedClickArea(0px);
@include S(margin-top, 15px);
&[data-btn-variant="prod"] {
@include InlineAnimation(11s ease-in-out) {
0% {
opacity: 0.05;
}
80% {
opacity: 0.05;
}
100% {
opacity: 1;
}
}
}
&[data-btn-variant="steam-demo"] {
@include InlineAnimation(5s ease-in-out) {
0% {
opacity: 0.05;
}
50% {
opacity: 0.05;
}
100% {
opacity: 1;
}
}
}
}
.playtimeDisclaimer {
@include S(margin-bottom, 15px);
@include PlainText;
}
.playtimeDisclaimerDownload {
@include SuperSmallText;
box-sizing: border-box;
text-align: center;
@include S(border-radius, $globalBorderRadius);
@include S(padding, 8px, 10px, 8px, 20px);
@include S(margin-bottom, 15px);
pointer-events: all;
transition: background-color 0.12s ease-in-out;
color: rgba(#000, 0.5);
width: 100%;
background: rgba($colorGreenBright, 0.2);
cursor: pointer;
display: grid;
grid-template-columns: auto 1fr;
@include S(grid-gap, 5px);
&::before {
content: "";
display: inline-flex;
@include S(width, 15px);
@include S(height, 15px);
& {
/* load-async */
background: uiResource("icons/savegame_correct.png") center center / contain no-repeat;
}
}
strong {
color: #000;
}
}
.steamLinkButton {
@include IncreasedClickArea(5px);
@include S(margin, 0);
@include S(width, 180px);
@include S(height, 40px);
background: #171a23 center center / contain no-repeat;
box-shadow: 0 D(3px) D(10px) rgba(96, 163, 136, 0.5);
overflow: visible;
@include S(border-radius, $globalBorderRadius);
@include InlineAnimation(1s ease-in-out infinite) {
50% {
transform: scale(1.02, 1.03);
}
}
&:hover {
opacity: 0.94 !important;
}
> .discount {
position: absolute;
@include S(top, -12px);
@include S(right, -15px);
background: #4c6b22;
color: #c5ea3f;
@include S(border-radius, $globalBorderRadius);
@include S(padding, 1px, 3px, 1px, 4px);
@include PlainText;
text-transform: uppercase;
transform: rotate(3deg);
}
}
.specialOffer {
color: #000000;
@include PlainText;
align-self: center;
text-align: center;
@include S(margin-top, 5px);
}
}
.point {
display: grid;
grid-template-columns: #{D(50px)} auto;
grid-template-rows: D(20px) D(20px);
background: #eff2f4 #{D(12px)} center / #{D(30px)} no-repeat;
@include S(border-radius, $globalBorderRadius);
align-items: center;
@include S(padding, 10px, 4px, 4px);
@include S(height, 40px);
> strong {
grid-column: 2 / 3;
grid-row: 1 / 2;
@include PlainText;
text-transform: uppercase;
font-weight: bold;
}
> p {
grid-column: 2 / 3;
grid-row: 2 / 3;
@include SuperSmallText;
line-height: 1em;
opacity: 0.8;
}
&.levels {
& {
/* @load-async */
background-image: uiResource("res/ui/icons/advantage_new_levels.png");
}
> strong {
color: #f13555;
}
}
&.upgrades {
& {
/* @load-async */
background-image: uiResource("res/ui/icons/advantage_upgrades.png");
}
> strong {
color: #8a00ff;
}
}
&.buildings {
& {
/* @load-async */
background-image: uiResource("res/ui/icons/advantage_buildings.png");
}
> strong {
color: #3fce8b;
}
}
&.wires {
& {
/* @load-async */
background-image: uiResource("res/ui/icons/advantage_wires.png");
}
> strong {
color: #ef2fdb;
}
}
&.markers {
& {
/* @load-async */
background-image: uiResource("res/ui/icons/advantage_markers.png");
}
> strong {
color: #4294ff;
}
}
&.mods {
& {
/* @load-async */
background-image: uiResource("res/ui/icons/advantage_mods.png");
}
> strong {
color: #8a00ff;
}
}
&.savegames {
& {
/* @load-async */
background-image: uiResource("res/ui/icons/advantage_savegames.png");
}
> strong {
color: #ff9500;
}
}
&.darkmode {
& {
/* @load-async */
background-image: uiResource("res/ui/icons/advantage_dark_mode.png");
}
> strong {
color: #292c32;
}
}
&.support {
& {
/* @load-async */
background-image: uiResource("res/ui/icons/advantage_support.png");
}
> strong {
color: #e72d2d;
}
}
&.achievements {
& {
/* @load-async */
background-image: uiResource("res/ui/icons/advantage_achievements.png");
}
> strong {
color: #ffac0f;
}
}
}
}

View File

@ -1,107 +0,0 @@
#ingame_HUD_Watermark {
position: absolute;
@include S(border-radius, $globalBorderRadius);
@include S(top, 70px);
pointer-events: all;
cursor: pointer;
left: 50%;
text-align: center;
background: rgba(207, 65, 65, 0.8);
color: #fff;
transform: translateX(-50%);
@include PlainText;
@include S(padding, 10px);
&:hover {
transform: translateX(-50%) scale(1.02) !important;
}
> strong {
@include PlainText;
text-transform: uppercase;
}
> p {
@include SuperSmallText;
opacity: 0.7;
}
opacity: 0;
&.visible {
@include InlineAnimation(0.5s ease-in-out) {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
opacity: 1;
}
&:not(.visible) {
@include InlineAnimation(0.5s ease-in-out) {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
}
}
#ingame_HUD_WatermarkClicker {
@include S(top, 55px);
position: absolute;
left: 50%;
transform: translateX(-50%) !important;
@include SuperSmallText;
color: $colorBlueBright;
text-transform: uppercase;
pointer-events: all;
cursor: pointer;
display: flex;
align-items: center;
&:hover {
opacity: 0.9;
}
&::after {
@include S(margin-left, 4px);
content: "";
@include S(width, 10px);
@include S(height, 10px);
display: inline-flex;
background: center center / contain no-repeat;
& {
/* @load-async */
background-image: uiResource("res/ui/icons/demo_steam_link_indicator.png");
}
}
&.withDiscount {
color: #4c6b22;
}
> .discount {
// position: absolute;
@include S(margin, 0, 5px);
background: rgba(#4c6b22, 1);
color: #c5ea3f;
@include S(border-radius, $globalBorderRadius);
@include S(padding, 0px, 2px, 0px, 3px);
@include SuperSmallText;
text-transform: uppercase;
transform: rotate(0deg);
@include InlineAnimation(1.3s ease-in-out infinite) {
50% {
transform: rotate(0.5deg) scale(1.05);
}
}
}
}

View File

@ -48,14 +48,12 @@
@import "ingame_hud/debug_info";
@import "ingame_hud/entity_debugger";
@import "ingame_hud/tutorial_hints";
@import "ingame_hud/watermark";
@import "ingame_hud/blueprint_placer";
@import "ingame_hud/waypoints";
@import "ingame_hud/interactive_tutorial";
@import "ingame_hud/color_blind_helper";
@import "ingame_hud/shape_viewer";
@import "ingame_hud/sandbox_controller";
@import "ingame_hud/standalone_advantages";
@import "ingame_hud/puzzle_back_to_menu";
@import "ingame_hud/puzzle_editor_review";
@import "ingame_hud/puzzle_dlc_logo";
@ -101,7 +99,6 @@ ingame_HUD_wires_toolbar,
ingame_HUD_BlueprintPlacer,
ingame_HUD_Waypoints_Hint,
ingame_HUD_WatermarkClicker,
ingame_HUD_Watermark,
ingame_HUD_ColorBlindBelowTileHelper,
ingame_HUD_SandboxController,
@ -112,7 +109,6 @@ ingame_HUD_BetaOverlay,
ingame_HUD_Shop,
ingame_HUD_Statistics,
ingame_HUD_ShapeViewer,
ingame_HUD_StandaloneAdvantages,
ingame_HUD_UnlockNotification,
ingame_HUD_PuzzleCompleteNotification,
ingame_HUD_SettingsMenu,
@ -129,7 +125,9 @@ $zindex: 100;
}
body.uiHidden {
> div:not(.ingameDialog):not(#ingame_HUD_SettingsMenu):not(#ingame_HUD_ModalDialogs):not(#ingame_HUD_UnlockNotification):not(#ingame_HUD_PuzzleCompleteNotification) {
> div:not(.ingameDialog):not(#ingame_HUD_SettingsMenu):not(#ingame_HUD_ModalDialogs):not(
#ingame_HUD_UnlockNotification
):not(#ingame_HUD_PuzzleCompleteNotification) {
display: none !important;
}
}

View File

@ -30,7 +30,6 @@ import { MobileWarningState } from "./states/mobile_warning";
import { PreloadState } from "./states/preload";
import { SettingsState } from "./states/settings";
import { ShapezGameAnalytics } from "./platform/browser/game_analytics";
import { RestrictionManager } from "./core/restriction_manager";
import { PuzzleMenuState } from "./states/puzzle_menu";
import { ClientAPI } from "./platform/api";
import { LoginState } from "./states/login";
@ -94,9 +93,6 @@ export class Application {
this.backgroundResourceLoader = new BackgroundResourcesLoader(this);
this.clientApi = new ClientAPI(this);
// Restrictions (Like demo etc)
this.restrictionMgr = new RestrictionManager(this);
// Platform dependent stuff
/** @type {StorageInterface} */

View File

@ -1,130 +0,0 @@
/* typehints:start */
import { Application } from "../application";
/* typehints:end */
import { ExplainedResult } from "./explained_result";
import { ReadWriteProxy } from "./read_write_proxy";
import { WEB_STEAM_SSO_AUTHENTICATED } from "./steam_sso";
export class RestrictionManager extends ReadWriteProxy {
/**
* @param {Application} app
*/
constructor(app) {
super(app, "restriction-flags.bin");
this.currentData = this.getDefaultData();
}
// -- RW Proxy Impl
/**
* @param {any} data
*/
verify(data) {
return ExplainedResult.good();
}
/**
*/
getDefaultData() {
return {
version: this.getCurrentVersion(),
};
}
/**
*/
getCurrentVersion() {
return 1;
}
/**
* @param {any} data
*/
migrate(data) {
return ExplainedResult.good();
}
initialize() {
return this.readAsync();
}
// -- End RW Proxy Impl
/**
* Returns if the app is currently running as the limited version
* @returns {boolean}
*/
isLimitedVersion() {
if (G_IS_STANDALONE) {
// Standalone is never limited
return false;
}
if (WEB_STEAM_SSO_AUTHENTICATED) {
return false;
}
if (G_IS_DEV) {
return typeof window !== "undefined" && window.location.search.indexOf("demo") >= 0;
}
return true;
}
/**
* Returns if the app markets the standalone version on steam
* @returns {boolean}
*/
getIsStandaloneMarketingActive() {
return this.isLimitedVersion();
}
/**
* Returns if exporting the base as a screenshot is possible
* @returns {boolean}
*/
getIsExportingScreenshotsPossible() {
return !this.isLimitedVersion();
}
/**
* Returns the maximum number of supported waypoints
* @returns {number}
*/
getMaximumWaypoints() {
return this.isLimitedVersion() ? 2 : 1e20;
}
/**
* Returns if the user has unlimited savegames
* @returns {boolean}
*/
getHasUnlimitedSavegames() {
return !this.isLimitedVersion();
}
/**
* Returns if the app has all settings available
* @returns {boolean}
*/
getHasExtendedSettings() {
return !this.isLimitedVersion();
}
/**
* Returns if all upgrades are available
* @returns {boolean}
*/
getHasExtendedUpgrades() {
return !this.isLimitedVersion();
}
/**
* Returns if all levels & freeplay is available
* @returns {boolean}
*/
getHasExtendedLevelsAndFreeplay() {
return !this.isLimitedVersion();
}
}

View File

@ -197,12 +197,6 @@ export class HubGoals extends BasicSerializableObject {
if (G_IS_DEV && globalConfig.debug.allBuildingsUnlocked) {
return true;
}
if (
reward === enumHubGoalRewards.reward_blueprints &&
this.root.app.restrictionMgr.isLimitedVersion()
) {
return false;
}
if (this.root.gameMode.getLevelDefinitions().length < 1) {
// no story, so always unlocked

View File

@ -31,13 +31,11 @@ import type { HUDSettingsMenu } from "./parts/settings_menu.js";
import type { HUDShapeTooltip } from "./parts/shape_tooltip.js";
import type { HUDShapeViewer } from "./parts/shape_viewer.js";
import type { HUDShop } from "./parts/shop.js";
import type { HUDStandaloneAdvantages } from "./parts/standalone_advantages.js";
import type { HUDStatistics } from "./parts/statistics.js";
import type { HUDPartTutorialHints } from "./parts/tutorial_hints.js";
import type { HUDTutorialVideoOffer } from "./parts/tutorial_video_offer.js";
import type { HUDUnlockNotification } from "./parts/unlock_notification.js";
import type { HUDVignetteOverlay } from "./parts/vignette_overlay.js";
import type { HUDWatermark } from "./parts/watermark.js";
import type { HUDWaypoints } from "./parts/waypoints.js";
import type { HUDWiresOverlay } from "./parts/wires_overlay.js";
import type { HUDWiresToolbar } from "./parts/wires_toolbar.js";
@ -87,8 +85,6 @@ export interface HudParts {
tutorialVideoOffer?: HUDTutorialVideoOffer;
gameMenu?: HUDGameMenu;
keybindingOverlay?: HUDKeybindingOverlay;
watermark?: HUDWatermark;
standaloneAdvantages?: HUDStandaloneAdvantages;
tutorialHints?: HUDPartTutorialHints;
interactiveTutorial?: HUDInteractiveTutorial;

View File

@ -99,31 +99,6 @@ export class HUDModalDialogs extends BaseHUDPart {
return dialog.buttonSignals;
}
/**
* @param {string} feature
* @param {string} textPrefab
*/
showFeatureRestrictionInfo(feature, textPrefab = T.dialogs.featureRestriction.desc) {
const dialog = new Dialog({
app: this.app,
title: T.dialogs.featureRestriction.title,
contentHTML: textPrefab.replace("<feature>", feature),
buttons: ["cancel:bad", "getStandalone:good"],
type: "warning",
});
this.internalShowDialog(dialog);
if (this.app) {
this.app.sound.playUiSound(SOUNDS.dialogOk);
}
dialog.buttonSignals.getStandalone.add(() => {
openStandaloneLink(this.app, "shapez_demo_dialog");
});
return dialog.buttonSignals;
}
showOptionChooser(title, options) {
const dialog = new DialogOptionChooser({
app: this.app,

View File

@ -19,11 +19,6 @@ export class HUDScreenshotExporter extends BaseHUDPart {
}
startExport() {
if (!this.root.app.restrictionMgr.getIsExportingScreenshotsPossible()) {
this.root.hud.parts.dialogs.showFeatureRestrictionInfo(T.demo.features.exportingBase);
return;
}
const { ok } = this.root.hud.parts.dialogs.showInfo(
T.dialogs.exportScreenshotWarning.title,
T.dialogs.exportScreenshotWarning.desc,

View File

@ -1,154 +0,0 @@
import { globalConfig, openStandaloneLink } from "../../../core/config";
import { InputReceiver } from "../../../core/input_receiver";
import { ReadWriteProxy } from "../../../core/read_write_proxy";
import { generateFileDownload, makeDiv } from "../../../core/utils";
import { T } from "../../../translations";
import { BaseHUDPart } from "../base_hud_part";
import { DynamicDomAttach } from "../dynamic_dom_attach";
export class HUDStandaloneAdvantages extends BaseHUDPart {
createElements(parent) {
this.background = makeDiv(parent, "ingame_HUD_StandaloneAdvantages", ["ingameDialog"]);
// DIALOG Inner / Wrapper
this.dialogInner = makeDiv(this.background, null, ["dialogInner"]);
this.title = makeDiv(this.dialogInner, null, ["title"], "");
this.subTitle = makeDiv(this.dialogInner, null, ["subTitle"], T.ingame.standaloneAdvantages.titleV2);
this.contentDiv = makeDiv(
this.dialogInner,
null,
["content"],
`
<div class="points">
${Object.entries(T.ingame.standaloneAdvantages.points)
.map(
([key, trans]) => `
<div class="point ${key}">
<strong>${trans.title}</strong>
<p>${trans.desc}</p>
</div>`
)
.join("")}
</div>
<div class="lowerBar">
<div class="playtimeDisclaimerDownload"><span class="inner">${
T.demoBanners.playtimeDisclaimerDownload
}</span></div>
<button class="steamLinkButton steam_dlbtn_0">
${
globalConfig.currentDiscount > 0
? `<span class='discount'>${T.global.discount.replace(
"<percentage>",
String(globalConfig.currentDiscount)
)}</span>`
: ""
}
</button>
<button class="otherCloseButton" data-btn-variant="prod">${
T.ingame.standaloneAdvantages.no_thanks
}</button>
</div>
`
);
this.trackClicks(this.contentDiv.querySelector("button.steamLinkButton"), () => {
openStandaloneLink(this.root.app, "shapez_std_advg");
this.close();
});
this.trackClicks(this.contentDiv.querySelector("button.otherCloseButton"), () => {
this.close();
});
this.trackClicks(this.contentDiv.querySelector(".playtimeDisclaimerDownload"), () => {
this.root.gameState.savegame.updateData(this.root);
const data = ReadWriteProxy.serializeObject(this.root.gameState.savegame.currentData);
const filename = "shapez-demo-savegame.bin";
generateFileDownload(filename, data);
});
}
get showIntervalSeconds() {
if (G_IS_STANDALONE) {
return 20 * 60;
}
return 15 * 60;
}
shouldPauseGame() {
return this.visible;
}
shouldPauseRendering() {
return this.visible;
}
hasBlockingOverlayOpen() {
return this.visible;
}
initialize() {
this.domAttach = new DynamicDomAttach(this.root, this.background, {
attachClass: "visible",
});
this.inputReciever = new InputReceiver("standalone-advantages");
this.close();
// On standalone, show popup instant
// wait for next interval
this.lastShown = 0;
this.root.signals.gameRestored.add(() => {
if (
this.root.hubGoals.level >= this.root.gameMode.getLevelDefinitions().length - 1 &&
this.root.app.restrictionMgr.getIsStandaloneMarketingActive()
) {
this.show(true);
}
});
}
show(final = false) {
if (!this.visible) {
this.root.app.gameAnalytics.noteMinor("game.std_advg.show");
this.root.app.gameAnalytics.noteMinor("game.std_advg.show-" + (final ? "final" : "nonfinal"));
}
this.lastShown = this.root.time.now();
this.visible = true;
this.final = final;
this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
if (this.final) {
this.title.innerText = T.ingame.standaloneAdvantages.titleExpiredV2;
} else if (this.root.time.now() < 120) {
this.title.innerText = "";
} else {
this.title.innerText = T.ingame.standaloneAdvantages.titleEnjoyingDemo;
}
}
close() {
if (this.final) {
this.root.gameState.goBackToMenu();
} else {
this.visible = false;
this.root.app.inputMgr.makeSureDetached(this.inputReciever);
this.update();
}
}
update() {
if (!this.visible && this.root.time.now() - this.lastShown > this.showIntervalSeconds) {
this.show();
}
this.domAttach.update(this.visible);
}
}

View File

@ -139,13 +139,6 @@ export class HUDUnlockNotification extends BaseHUDPart {
this.root.hud.signals.unlockNotificationFinished.dispatch();
if (
this.root.hubGoals.level > this.root.gameMode.getLevelDefinitions().length - 1 &&
this.root.app.restrictionMgr.getIsStandaloneMarketingActive()
) {
this.root.hud.parts.standaloneAdvantages.show(true);
}
if (!this.root.app.settings.getAllSettings().offerHints) {
return;
}

View File

@ -1,49 +0,0 @@
import { globalConfig, openStandaloneLink } from "../../../core/config";
import { makeDiv } from "../../../core/utils";
import { T } from "../../../translations";
import { BaseHUDPart } from "../base_hud_part";
export class HUDWatermark extends BaseHUDPart {
createElements(parent) {
let linkText = T.ingame.watermark.get_on_steam;
this.linkElement = makeDiv(
parent,
"ingame_HUD_WatermarkClicker",
globalConfig.currentDiscount > 0 ? ["withDiscount"] : [],
linkText +
(globalConfig.currentDiscount > 0
? `<span class='discount'>${T.global.discount.replace(
"<percentage>",
String(globalConfig.currentDiscount)
)}</span>`
: "")
);
this.trackClicks(this.linkElement, () => {
openStandaloneLink(this.root.app, "shapez_watermark");
});
}
initialize() {}
update() {}
/**
*
* @param {import("../../../core/draw_utils").DrawParameters} parameters
*/
drawOverlays(parameters) {
const w = this.root.gameWidth;
parameters.context.fillStyle = "rgba(20, 30, 40, 0.25)";
parameters.context.font = "bold " + this.root.app.getEffectiveUiScale() * 40 + "px GameFont";
parameters.context.textAlign = "center";
parameters.context.fillText(
T.demoBanners.title.toUpperCase(),
w / 2,
this.root.app.getEffectiveUiScale() * 50
);
parameters.context.textAlign = "left";
}
}

View File

@ -311,17 +311,6 @@ export class HUDWaypoints extends BaseHUDPart {
const center = worldPos || this.root.camera.center;
dialog.buttonSignals.ok.add(() => {
// Show info that you can have only N markers in the demo,
// actually show this *after* entering the name so you want the
// standalone even more (I'm evil :P)
if (this.waypoints.length > this.root.app.restrictionMgr.getMaximumWaypoints()) {
this.root.hud.parts.dialogs.showFeatureRestrictionInfo(
"",
T.dialogs.markerDemoLimit.desc
);
return;
}
// Actually create the waypoint
this.addWaypoint(markerNameInput.getValue(), center);
});

View File

@ -29,8 +29,6 @@ import { HUDGameMenu } from "../hud/parts/game_menu";
import { HUDConstantSignalEdit } from "../hud/parts/constant_signal_edit";
import { IS_MOBILE } from "../../core/config";
import { HUDKeybindingOverlay } from "../hud/parts/keybinding_overlay";
import { HUDWatermark } from "../hud/parts/watermark";
import { HUDStandaloneAdvantages } from "../hud/parts/standalone_advantages";
import { HUDPartTutorialHints } from "../hud/parts/tutorial_hints";
import { HUDInteractiveTutorial } from "../hud/parts/interactive_tutorial";
import { MetaBlockBuilding } from "../buildings/block";
@ -69,14 +67,16 @@ const upgradesCache = {};
/**
* Generates all upgrades
* @returns {Object<string, UpgradeTiers>} */
* @returns {Object<string, UpgradeTiers>}
*/
function generateUpgrades(limitedVersion = false, difficulty = 1) {
// TODO: Remove the limitedVersion parameter
if (upgradesCache[limitedVersion]) {
return upgradesCache[limitedVersion];
}
const fixedImprovements = [0.5, 0.5, 1, 1, 2, 1, 1];
const numEndgameUpgrades = limitedVersion ? 0 : 1000 - fixedImprovements.length - 1;
const numEndgameUpgrades = 1000 - fixedImprovements.length - 1;
function generateInfiniteUnlocks() {
return new Array(numEndgameUpgrades).fill(null).map((_, i) => ({
@ -352,11 +352,6 @@ export class RegularGameMode extends GameMode {
this.additionalHudParts.keybindingOverlay = HUDKeybindingOverlay;
}
if (this.root.app.restrictionMgr.getIsStandaloneMarketingActive()) {
this.additionalHudParts.watermark = HUDWatermark;
this.additionalHudParts.standaloneAdvantages = HUDStandaloneAdvantages;
}
if (this.root.app.settings.getAllSettings().offerHints) {
this.additionalHudParts.tutorialHints = HUDPartTutorialHints;
this.additionalHudParts.interactiveTutorial = HUDInteractiveTutorial;
@ -383,10 +378,7 @@ export class RegularGameMode extends GameMode {
* @returns {Object<string, UpgradeTiers>}
*/
getUpgrades() {
return generateUpgrades(
!this.root.app.restrictionMgr.getHasExtendedUpgrades(),
this.difficultyMultiplicator
);
return generateUpgrades(false, this.difficultyMultiplicator);
}
/**
@ -403,7 +395,7 @@ export class RegularGameMode extends GameMode {
* @returns {boolean}
*/
getIsFreeplayAvailable() {
return this.root.app.restrictionMgr.getHasExtendedLevelsAndFreeplay();
return true;
}
/** @returns {boolean} */

View File

@ -79,27 +79,7 @@ export class ShapezGameAnalytics extends GameAnalyticsInterface {
}
note(action) {
if (this.app.restrictionMgr.isLimitedVersion()) {
fetch(
"https://analytics.shapez.io/campaign/" +
"action_" +
this.environment +
"_" +
action +
"_" +
CURRENT_ABT +
"_" +
this.abtVariant +
"?lpurl=nocontent",
{
method: "GET",
mode: "no-cors",
cache: "no-cache",
referrer: "no-referrer",
credentials: "omit",
}
).catch(err => {});
}
// TODO: Remove game analytics altogether
}
noteMinor(action, payload = "") {}
@ -114,25 +94,6 @@ export class ShapezGameAnalytics extends GameAnalyticsInterface {
return this.fetchABVariant().then(() => {
setInterval(() => this.sendTimePoints(), 60 * 1000);
if (this.app.restrictionMgr.isLimitedVersion() && !G_IS_DEV) {
fetch(
"https://analytics.shapez.io/campaign/" +
this.environment +
"_" +
CURRENT_ABT +
"_" +
this.abtVariant +
"?lpurl=nocontent",
{
method: "GET",
mode: "no-cors",
cache: "no-cache",
referrer: "no-referrer",
credentials: "omit",
}
).catch(err => {});
}
return this.app.storage.readFileAsync(analyticsLocalFile).then(
syncKey => {
this.syncKey = syncKey;

View File

@ -217,9 +217,6 @@ function initializeSettings() {
applyGameTheme(id);
document.documentElement.setAttribute("data-theme", id);
},
enabledCb: /**
* @param {Application} app
*/ app => app.restrictionMgr.getHasExtendedSettings(),
}),
new EnumSetting("autosaveInterval", {
@ -278,9 +275,6 @@ function initializeSettings() {
category: enumCategories.performance,
restartRequired: false,
changeCb: (app, id) => {},
enabledCb: /**
* @param {Application} app
*/ app => app.restrictionMgr.getHasExtendedSettings(),
}),
new BoolSetting("lowQualityMapResources", enumCategories.performance, (app, value) => {}),
@ -513,7 +507,7 @@ export class ApplicationSettings extends ReadWriteProxy {
}
// MODS
if (!THEMES[data.settings.theme] || !this.app.restrictionMgr.getHasExtendedSettings()) {
if (!THEMES[data.settings.theme]) {
console.log("Resetting theme because its no longer available: " + data.settings.theme);
data.settings.theme = "light";
}
@ -705,7 +699,7 @@ export class ApplicationSettings extends ReadWriteProxy {
}
// MODS
if (!THEMES[data.settings.theme] || !this.app.restrictionMgr.getHasExtendedSettings()) {
if (!THEMES[data.settings.theme]) {
console.log("Resetting theme because its no longer available: " + data.settings.theme);
data.settings.theme = "light";
}

View File

@ -50,9 +50,6 @@ export class MainMenuState extends GameState {
}
}
const showDemoAdvertisement =
showExternalLinks && this.app.restrictionMgr.getIsStandaloneMarketingActive();
const ownsPuzzleDLC =
WEB_STEAM_SSO_AUTHENTICATED ||
(G_IS_STANDALONE &&
@ -60,39 +57,6 @@ export class MainMenuState extends GameState {
const showShapez2 = showExternalLinks && MODS.mods.length === 0;
const bannerHtml = `
<h3>${T.demoBanners.titleV2}</h3>
<div class="points">
${Array.from(Object.entries(T.ingame.standaloneAdvantages.points))
.slice(0, 6)
.map(
([key, trans]) => `
<div class="point ${key}">
<strong>${trans.title}</strong>
<p>${trans.desc}</p>
</div>`
)
.join("")}
</div>
<a href="#" class="steamLink steam_dlbtn_0" target="_blank">
${
globalConfig.currentDiscount > 0
? `<span class='discount'>${T.global.discount.replace(
"<percentage>",
String(globalConfig.currentDiscount)
)}</span>`
: ""
}
Play shapez on Steam
</a>
<div class="onlinePlayerCount"></div>
`;
return `
<div class="topButtons">
<button aria-label="Choose Language" class="languageChoose" data-languageicon="${this.app.settings.getLanguage()}"></button>
@ -114,7 +78,7 @@ export class MainMenuState extends GameState {
${/*showUpdateLabel ? `<span class="updateLabel">MODS UPDATE!</span>` : ""*/ ""}
</div>
<div class="mainWrapper" data-columns="${showDemoAdvertisement || showPuzzleDLC ? 2 : 1}">
<div class="mainWrapper" data-columns="${showPuzzleDLC ? 2 : 1}">
<div class="mainContainer">
<div class="buttons"></div>
<div class="savegamesMount"></div>
@ -149,8 +113,6 @@ export class MainMenuState extends GameState {
</div>
<div class="sideContainer">
${showDemoAdvertisement ? `<div class="standaloneBanner">${bannerHtml}</div>` : ""}
${
showShapez2
? `<div class="mainNews shapez2">
@ -312,14 +274,6 @@ export class MainMenuState extends GameState {
* Asks the user to import a savegame
*/
requestImportSavegame() {
if (
this.app.savegameMgr.getSavegamesMetaData().length > 0 &&
!this.app.restrictionMgr.getHasUnlimitedSavegames()
) {
this.showSavegameSlotLimit();
return;
}
this.app.gameAnalytics.note("startimport");
// Create a 'fake' file-input to accept savegames
@ -870,15 +824,6 @@ export class MainMenuState extends GameState {
}
onPlayButtonClicked() {
if (
this.app.savegameMgr.getSavegamesMetaData().length > 0 &&
!this.app.restrictionMgr.getHasUnlimitedSavegames()
) {
this.app.gameAnalytics.noteMinor("menu.slotlimit");
this.showSavegameSlotLimit();
return;
}
this.app.adProvider.showVideoAd().then(() => {
this.app.gameAnalytics.noteMinor("menu.play");
const savegame = this.app.savegameMgr.createNewSavegame();

View File

@ -180,11 +180,6 @@ export class PreloadState extends GameState {
return this.app.sound.initialize();
})
.then(() => this.setStatus("Initializing restrictions", 34))
.then(() => {
return this.app.restrictionMgr.initialize();
})
.then(() => this.setStatus("Initializing savegames", 38))
.then(() => {
return this.app.savegameMgr.initialize().catch(err => {