mirror of
https://github.com/tobspr/shapez.io.git
synced 2025-06-13 13:04:03 +00:00
* Puzzle mode (#1135) * Add mode button to main menu * [WIP] Add mode menu. Add factory-based gameMode creation * Add savefile migration, serialize, deserialize * Add hidden HUD elements, zone, and zoom, boundary constraints * Clean up lint issues * Add building, HUD exclusion, building exclusion, and refactor - [WIP] Add ConstantProducer building that combines ConstantSignal and ItemProducer functionality. Currently using temp assets. - Add pre-placement check to the zone - Use Rectangles for zone and boundary - Simplify zone drawing - Account for exclusion in savegame data - [WIP] Add puzzle play and edit buttons in puzzle mode menu * [WIP] Add building, component, and systems for producing and accepting user-specified items and checking goal criteria * Add ingame puzzle mode UI elements - Add minimal menus in puzzle mode for back, next navigation - Add lower menu for changing zone dimenensions Co-authored-by: Greg Considine <gconsidine@users.noreply.github.com> * Performance optimizations (#1154) * 1.3.1 preparations * Minor fixes, update translations * Fix achievements not working * Lots of belt optimizations, ~15% performance boost * Puzzle mode, part 1 * Puzzle mode, part 2 * Fix missing import * Puzzle mode, part 3 * Fix typo * Puzzle mode, part 4 * Puzzle Mode fixes: Correct zone restrictions and more (#1155) * Hide Puzzle Editor Controls in regular game mode, fix typo * Disallow shrinking zone if there are buildings * Fix multi-tile buildings for shrinking * Puzzle mode, Refactor hud * Puzzle mode * Fixed typo in latest puzzle commit (#1156) * Allow completing puzzles * Puzzle mode, almost done * Bump version to 1.4.0 * Fixes * [puzzle] Prevent pipette cheats (miners, emitters) (#1158) * Puzzle mode, almost done * Allow clearing belts with 'B' * Multiple users for the puzzle dlc * Bump api key * Minor adjustments * Update * Minor fixes * Fix throughput * Fix belts * Minor puzzle adjustments * New difficulty * Minor puzzle improvements * Fix belt path * Update translations * Added a button to return to the menu after a puzzle is completed (#1170) * added another button to return to the menu * improved menu return * fixed continue button to not go back to menu * [Puzzle] Added ability to lock buildings in the puzzle editor! (#1164) * initial test * tried to get it to work * added icon * added test exclusion * reverted css * completed flow for building locking * added lock option * finalized look and changed locked building to same sprite * removed unused art * added clearing every goal acceptor on lock to prevent creating impossible puzzles * heavily improved validation and prevented autocompletion * validation only checks every 100 ticks to improve performance * validation only checks every 100 ticks to improve performance * removed clearing goal acceptors as it isn't needed because of validation * Add soundtrack, puzzle dlc fixes Co-authored-by: Greg Considine <gconsidine@users.noreply.github.com> Co-authored-by: dengr1065 <dengr1065@gmail.com> Co-authored-by: Sense101 <67970865+Sense101@users.noreply.github.com>
130 lines
4.3 KiB
JavaScript
130 lines
4.3 KiB
JavaScript
import { BaseHUDPart } from "../base_hud_part";
|
|
import { makeDiv, formatBigNumberFull } from "../../../core/utils";
|
|
import { DynamicDomAttach } from "../dynamic_dom_attach";
|
|
import { InputReceiver } from "../../../core/input_receiver";
|
|
import { KeyActionMapper, KEYMAPPINGS } from "../../key_action_mapper";
|
|
import { T } from "../../../translations";
|
|
import { StaticMapEntityComponent } from "../../components/static_map_entity";
|
|
import { BeltComponent } from "../../components/belt";
|
|
|
|
export class HUDSettingsMenu extends BaseHUDPart {
|
|
createElements(parent) {
|
|
this.background = makeDiv(parent, "ingame_HUD_SettingsMenu", ["ingameDialog"]);
|
|
|
|
this.menuElement = makeDiv(this.background, null, ["menuElement"]);
|
|
|
|
if (this.root.gameMode.hasHub()) {
|
|
this.statsElement = makeDiv(
|
|
this.background,
|
|
null,
|
|
["statsElement"],
|
|
`
|
|
<strong>${T.ingame.settingsMenu.beltsPlaced}</strong><span class="beltsPlaced"></span>
|
|
<strong>${T.ingame.settingsMenu.buildingsPlaced}</strong><span class="buildingsPlaced"></span>
|
|
<strong>${T.ingame.settingsMenu.playtime}</strong><span class="playtime"></span>
|
|
|
|
`
|
|
);
|
|
}
|
|
|
|
this.buttonContainer = makeDiv(this.menuElement, null, ["buttons"]);
|
|
|
|
const buttons = [
|
|
{
|
|
id: "continue",
|
|
action: () => this.close(),
|
|
},
|
|
{
|
|
id: "settings",
|
|
action: () => this.goToSettings(),
|
|
},
|
|
{
|
|
id: "menu",
|
|
action: () => this.returnToMenu(),
|
|
},
|
|
];
|
|
|
|
for (let i = 0; i < buttons.length; ++i) {
|
|
const { action, id } = buttons[i];
|
|
|
|
const element = document.createElement("button");
|
|
element.classList.add("styledButton");
|
|
element.classList.add(id);
|
|
this.buttonContainer.appendChild(element);
|
|
|
|
this.trackClicks(element, action);
|
|
}
|
|
}
|
|
|
|
isBlockingOverlay() {
|
|
return this.visible;
|
|
}
|
|
|
|
returnToMenu() {
|
|
this.root.gameState.goBackToMenu();
|
|
}
|
|
|
|
goToSettings() {
|
|
this.root.gameState.goToSettings();
|
|
}
|
|
|
|
shouldPauseGame() {
|
|
return this.visible;
|
|
}
|
|
|
|
shouldPauseRendering() {
|
|
return this.visible;
|
|
}
|
|
|
|
initialize() {
|
|
this.root.keyMapper.getBinding(KEYMAPPINGS.general.back).add(this.show, this);
|
|
|
|
this.domAttach = new DynamicDomAttach(this.root, this.background, {
|
|
attachClass: "visible",
|
|
});
|
|
|
|
this.inputReciever = new InputReceiver("settingsmenu");
|
|
this.keyActionMapper = new KeyActionMapper(this.root, this.inputReciever);
|
|
this.keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.close, this);
|
|
|
|
this.close();
|
|
}
|
|
|
|
show() {
|
|
this.visible = true;
|
|
this.root.app.inputMgr.makeSureAttachedAndOnTop(this.inputReciever);
|
|
|
|
const totalMinutesPlayed = Math.ceil(this.root.time.now() / 60);
|
|
|
|
if (this.root.gameMode.hasHub()) {
|
|
/** @type {HTMLElement} */
|
|
const playtimeElement = this.statsElement.querySelector(".playtime");
|
|
/** @type {HTMLElement} */
|
|
const buildingsPlacedElement = this.statsElement.querySelector(".buildingsPlaced");
|
|
/** @type {HTMLElement} */
|
|
const beltsPlacedElement = this.statsElement.querySelector(".beltsPlaced");
|
|
|
|
playtimeElement.innerText = T.global.time.xMinutes.replace("<x>", `${totalMinutesPlayed}`);
|
|
|
|
buildingsPlacedElement.innerText = formatBigNumberFull(
|
|
this.root.entityMgr.getAllWithComponent(StaticMapEntityComponent).length -
|
|
this.root.entityMgr.getAllWithComponent(BeltComponent).length
|
|
);
|
|
|
|
beltsPlacedElement.innerText = formatBigNumberFull(
|
|
this.root.entityMgr.getAllWithComponent(BeltComponent).length
|
|
);
|
|
}
|
|
}
|
|
|
|
close() {
|
|
this.visible = false;
|
|
this.root.app.inputMgr.makeSureDetached(this.inputReciever);
|
|
this.update();
|
|
}
|
|
|
|
update() {
|
|
this.domAttach.update(this.visible);
|
|
}
|
|
}
|