mirror of
https://github.com/tobspr/shapez.io.git
synced 2025-06-13 13:04:03 +00:00
Add soundtrack, puzzle dlc fixes
This commit is contained in:
parent
0f93e13a63
commit
10e42864a1
BIN
res/puzzle_dlc_logo.png
Normal file
BIN
res/puzzle_dlc_logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
BIN
res_raw/sounds/music/puzzle-full.mp3
Normal file
BIN
res_raw/sounds/music/puzzle-full.mp3
Normal file
Binary file not shown.
@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
.building {
|
.building {
|
||||||
@include S(width, 30px);
|
@include S(width, 30px);
|
||||||
@include S(height, 22px);
|
@include S(height, 30px);
|
||||||
background-size: 45%;
|
background-size: 45%;
|
||||||
|
|
||||||
&:not(.unlocked) {
|
&:not(.unlocked) {
|
||||||
@ -49,6 +49,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.building {
|
.building {
|
||||||
|
display: flex;
|
||||||
|
@include S(width, 40px);
|
||||||
|
position: relative;
|
||||||
|
@include S(height, 40px);
|
||||||
.icon {
|
.icon {
|
||||||
color: $accentColorDark;
|
color: $accentColorDark;
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -56,18 +60,18 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@include S(padding, 5px);
|
width: 100%;
|
||||||
@include S(padding-bottom, 1px);
|
height: 100%;
|
||||||
@include S(width, 35px);
|
padding: 0;
|
||||||
@include S(height, 37px);
|
margin: 0;
|
||||||
@include S(border-radius, $globalBorderRadius);
|
@include S(border-radius, $globalBorderRadius);
|
||||||
|
|
||||||
background: center center / 70% no-repeat;
|
background: center center / 70% no-repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:not(.unlocked) {
|
&:not(.unlocked) {
|
||||||
|
@include S(width, 25px);
|
||||||
.icon {
|
.icon {
|
||||||
@include S(width, 20px);
|
|
||||||
opacity: 0.15;
|
opacity: 0.15;
|
||||||
}
|
}
|
||||||
&.editor {
|
&.editor {
|
||||||
@ -91,8 +95,8 @@
|
|||||||
pointer-events: all;
|
pointer-events: all;
|
||||||
transition: all 50ms ease-in-out;
|
transition: all 50ms ease-in-out;
|
||||||
transition-property: background-color, transform;
|
transition-property: background-color, transform;
|
||||||
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: rgba(30, 40, 90, 0.1);
|
background-color: rgba(30, 40, 90, 0.1);
|
||||||
}
|
}
|
||||||
@ -120,12 +124,11 @@
|
|||||||
|
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-auto-flow: column;
|
grid-auto-flow: column;
|
||||||
@include S(margin-top, 2px);
|
|
||||||
@include S(margin-left, 16px);
|
|
||||||
@include S(margin-bottom, 29px);
|
|
||||||
|
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 20px;
|
top: -30px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%) !important;
|
||||||
transition: all 0.12s ease-in-out;
|
transition: all 0.12s ease-in-out;
|
||||||
transition-property: opacity, transform;
|
transition-property: opacity, transform;
|
||||||
|
|
||||||
|
@ -96,12 +96,13 @@
|
|||||||
@include S(height, 60px);
|
@include S(height, 60px);
|
||||||
@include S(margin, 0, 10px);
|
@include S(margin, 0, 10px);
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
@include S(border-radius, $globalBorderRadius);
|
border-radius: 50%;
|
||||||
transition: opacity 0.12s ease-in-out, background-color 0.12s ease-in-out;
|
transition: opacity 0.12s ease-in-out, background-color 0.12s ease-in-out;
|
||||||
|
@include IncreasedClickArea(0px);
|
||||||
|
|
||||||
&.liked-yes {
|
&.liked-yes {
|
||||||
/* @load-async */
|
/* @load-async */
|
||||||
background: uiResource("icons/puzzle_action_liked_yes.png") center center / 70%
|
background: uiResource("icons/puzzle_action_liked_yes.png") center 55% / 60%
|
||||||
no-repeat;
|
no-repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,7 +111,18 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
background-color: #151118 !important;
|
background-color: $colorRedBright !important;
|
||||||
|
@include InlineAnimation(0.3s ease-in-out) {
|
||||||
|
0% {
|
||||||
|
transform: scale(0);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
transform: scale(1.2);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
&:not(.active) {
|
&:not(.active) {
|
||||||
opacity: 0.4;
|
opacity: 0.4;
|
||||||
@ -119,6 +131,26 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> .buttonBar {
|
||||||
|
display: flex;
|
||||||
|
@include S(margin-top, 20px);
|
||||||
|
|
||||||
|
button.continue {
|
||||||
|
background: #555;
|
||||||
|
@include S(margin-right, 10px);
|
||||||
|
}
|
||||||
|
|
||||||
|
button.menu {
|
||||||
|
background-color: $colorGreenBright;
|
||||||
|
}
|
||||||
|
|
||||||
|
> button {
|
||||||
|
@include S(min-width, 100px);
|
||||||
|
@include S(padding, 10px, 20px);
|
||||||
|
@include IncreasedClickArea(0px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
> .actions {
|
> .actions {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@include S(bottom, 40px);
|
@include S(bottom, 40px);
|
||||||
@ -135,14 +167,5 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
button.close {
|
|
||||||
border: 0;
|
|
||||||
position: relative;
|
|
||||||
@include S(margin-top, 15px);
|
|
||||||
background: $colorGreenBright;
|
|
||||||
@include Heading;
|
|
||||||
@include S(padding, 14px, 40px);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,11 +88,7 @@
|
|||||||
|
|
||||||
@include S(grid-column-gap, 10px);
|
@include S(grid-column-gap, 10px);
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: 1fr 1fr;
|
||||||
|
|
||||||
&.demo {
|
|
||||||
grid-template-columns: 1fr 1fr;
|
|
||||||
}
|
|
||||||
|
|
||||||
.standaloneBanner {
|
.standaloneBanner {
|
||||||
background: rgb(255, 75, 84);
|
background: rgb(255, 75, 84);
|
||||||
@ -223,9 +219,33 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.puzzleContainer {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
background: #4cc98a;
|
||||||
|
grid-row: 1 / 2;
|
||||||
|
grid-column: 2 / 3;
|
||||||
|
@include S(padding, 20px);
|
||||||
|
@include S(border-radius, $globalBorderRadius);
|
||||||
|
> .dlcLogo {
|
||||||
|
@include S(width, 200px);
|
||||||
|
}
|
||||||
|
|
||||||
|
> button {
|
||||||
|
@include S(margin-top, 20px);
|
||||||
|
@include Heading;
|
||||||
|
@include S(padding, 10px, 30px);
|
||||||
|
background-color: #333;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.mainContainer {
|
.mainContainer {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
grid-row: 1 / 2;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
background: #fafafa;
|
background: #fafafa;
|
||||||
|
@ -90,9 +90,9 @@ export class StateManager {
|
|||||||
dialogParent.classList.add("modalDialogParent");
|
dialogParent.classList.add("modalDialogParent");
|
||||||
document.body.appendChild(dialogParent);
|
document.body.appendChild(dialogParent);
|
||||||
|
|
||||||
|
this.currentState.internalEnterCallback(payload);
|
||||||
this.app.sound.playThemeMusic(this.currentState.getThemeMusic());
|
this.app.sound.playThemeMusic(this.currentState.getThemeMusic());
|
||||||
|
|
||||||
this.currentState.internalEnterCallback(payload);
|
|
||||||
this.currentState.onResized(this.app.screenWidth, this.app.screenHeight);
|
this.currentState.onResized(this.app.screenWidth, this.app.screenHeight);
|
||||||
|
|
||||||
this.app.analytics.trackStateEnter(key);
|
this.app.analytics.trackStateEnter(key);
|
||||||
|
@ -40,7 +40,6 @@ export class HUDBaseToolbar extends BaseHUDPart {
|
|||||||
* element: HTMLElement,
|
* element: HTMLElement,
|
||||||
* index: number
|
* index: number
|
||||||
* puzzleLocked: boolean;
|
* puzzleLocked: boolean;
|
||||||
* class: typeof MetaBuilding,
|
|
||||||
* }>} */
|
* }>} */
|
||||||
this.buildingHandles = {};
|
this.buildingHandles = {};
|
||||||
}
|
}
|
||||||
@ -136,7 +135,6 @@ export class HUDBaseToolbar extends BaseHUDPart {
|
|||||||
selected: false,
|
selected: false,
|
||||||
index: i,
|
index: i,
|
||||||
puzzleLocked: false,
|
puzzleLocked: false,
|
||||||
class: allBuildings[i],
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,19 +52,23 @@ export class HUDPuzzleCompleteNotification extends BaseHUDPart {
|
|||||||
this.updateState();
|
this.updateState();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const buttonBar = document.createElement("div");
|
||||||
|
buttonBar.classList.add("buttonBar");
|
||||||
|
this.elemContents.appendChild(buttonBar);
|
||||||
|
|
||||||
this.continueBtn = document.createElement("button");
|
this.continueBtn = document.createElement("button");
|
||||||
this.continueBtn.classList.add("close", "styledButton");
|
this.continueBtn.classList.add("continue", "styledButton");
|
||||||
this.continueBtn.innerText = T.ingame.puzzleCompletion.continueBtn;
|
this.continueBtn.innerText = T.ingame.puzzleCompletion.continueBtn;
|
||||||
dialog.appendChild(this.continueBtn);
|
buttonBar.appendChild(this.continueBtn);
|
||||||
|
|
||||||
this.menuBtn = document.createElement("button");
|
|
||||||
this.menuBtn.classList.add("close", "styledButton");
|
|
||||||
this.menuBtn.innerText = T.ingame.puzzleCompletion.menuBtn;
|
|
||||||
dialog.appendChild(this.menuBtn);
|
|
||||||
|
|
||||||
this.trackClicks(this.continueBtn, () => {
|
this.trackClicks(this.continueBtn, () => {
|
||||||
this.close(false);
|
this.close(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.menuBtn = document.createElement("button");
|
||||||
|
this.menuBtn.classList.add("menu", "styledButton");
|
||||||
|
this.menuBtn.innerText = T.ingame.puzzleCompletion.menuBtn;
|
||||||
|
buttonBar.appendChild(this.menuBtn);
|
||||||
|
|
||||||
this.trackClicks(this.menuBtn, () => {
|
this.trackClicks(this.menuBtn, () => {
|
||||||
this.close(true);
|
this.close(true);
|
||||||
});
|
});
|
||||||
|
@ -163,7 +163,9 @@ export class HUDPuzzleEditorReview extends BaseHUDPart {
|
|||||||
const serialized = new PuzzleSerializer().generateDumpFromGameRoot(this.root);
|
const serialized = new PuzzleSerializer().generateDumpFromGameRoot(this.root);
|
||||||
|
|
||||||
logger.log("Submitting puzzle, title=", title, "shortKey=", shortKey);
|
logger.log("Submitting puzzle, title=", title, "shortKey=", shortKey);
|
||||||
logger.log("Serialized data:", serialized);
|
if (G_IS_DEV) {
|
||||||
|
logger.log("Serialized data:", serialized);
|
||||||
|
}
|
||||||
|
|
||||||
const closeLoading = this.root.hud.parts.dialogs.showLoadingDialog(T.puzzleMenu.submittingPuzzle);
|
const closeLoading = this.root.hud.parts.dialogs.showLoadingDialog(T.puzzleMenu.submittingPuzzle);
|
||||||
|
|
||||||
|
@ -152,9 +152,6 @@ export class HUDSandboxController extends BaseHUDPart {
|
|||||||
}
|
}
|
||||||
|
|
||||||
toggle() {
|
toggle() {
|
||||||
if (!this.visible) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.visible = !this.visible;
|
this.visible = !this.visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,9 +7,6 @@ import { types } from "../../savegame/serialization";
|
|||||||
import { enumGameModeTypes, GameMode } from "../game_mode";
|
import { enumGameModeTypes, GameMode } from "../game_mode";
|
||||||
import { HUDPuzzleBackToMenu } from "../hud/parts/puzzle_back_to_menu";
|
import { HUDPuzzleBackToMenu } from "../hud/parts/puzzle_back_to_menu";
|
||||||
import { HUDPuzzleDLCLogo } from "../hud/parts/puzzle_dlc_logo";
|
import { HUDPuzzleDLCLogo } from "../hud/parts/puzzle_dlc_logo";
|
||||||
import { gMetaBuildingRegistry } from "../../core/global_registries";
|
|
||||||
import { MetaBalancerBuilding } from "../buildings/balancer";
|
|
||||||
import { MetaUndergroundBeltBuilding } from "../buildings/underground_belt";
|
|
||||||
|
|
||||||
export class PuzzleGameMode extends GameMode {
|
export class PuzzleGameMode extends GameMode {
|
||||||
static getType() {
|
static getType() {
|
||||||
|
@ -29,6 +29,7 @@ import { HUDPuzzleCompleteNotification } from "../hud/parts/puzzle_complete_noti
|
|||||||
import { HUDPuzzlePlaySettings } from "../hud/parts/puzzle_play_settings";
|
import { HUDPuzzlePlaySettings } from "../hud/parts/puzzle_play_settings";
|
||||||
import { MetaBlockBuilding } from "../buildings/block";
|
import { MetaBlockBuilding } from "../buildings/block";
|
||||||
import { MetaBuilding } from "../meta_building";
|
import { MetaBuilding } from "../meta_building";
|
||||||
|
import { gMetaBuildingRegistry } from "../../core/global_registries";
|
||||||
|
|
||||||
const logger = createLogger("puzzle-play");
|
const logger = createLogger("puzzle-play");
|
||||||
const copy = require("clipboard-copy");
|
const copy = require("clipboard-copy");
|
||||||
@ -47,7 +48,7 @@ export class PuzzlePlayGameMode extends PuzzleGameMode {
|
|||||||
super(root);
|
super(root);
|
||||||
|
|
||||||
/** @type {Array<typeof MetaBuilding>} */
|
/** @type {Array<typeof MetaBuilding>} */
|
||||||
const excludedBuildings = [
|
let excludedBuildings = [
|
||||||
MetaConstantProducerBuilding,
|
MetaConstantProducerBuilding,
|
||||||
MetaGoalAcceptorBuilding,
|
MetaGoalAcceptorBuilding,
|
||||||
MetaBlockBuilding,
|
MetaBlockBuilding,
|
||||||
@ -70,7 +71,22 @@ export class PuzzlePlayGameMode extends PuzzleGameMode {
|
|||||||
MetaTransistorBuilding,
|
MetaTransistorBuilding,
|
||||||
];
|
];
|
||||||
|
|
||||||
this.hiddenBuildings = excludedBuildings.concat(puzzle.game.excludedBuildings);
|
if (puzzle.game.excludedBuildings) {
|
||||||
|
/**
|
||||||
|
* @type {any}
|
||||||
|
*/
|
||||||
|
const puzzleHidden = puzzle.game.excludedBuildings
|
||||||
|
.map(id => {
|
||||||
|
if (!gMetaBuildingRegistry.hasId(id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return gMetaBuildingRegistry.findById(id).constructor;
|
||||||
|
})
|
||||||
|
.filter(x => !!x);
|
||||||
|
excludedBuildings = excludedBuildings.concat(puzzleHidden);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.hiddenBuildings = excludedBuildings;
|
||||||
|
|
||||||
this.additionalHudParts.puzzlePlayMetadata = HUDPuzzlePlayMetadata;
|
this.additionalHudParts.puzzlePlayMetadata = HUDPuzzlePlayMetadata;
|
||||||
this.additionalHudParts.puzzlePlaySettings = HUDPuzzlePlaySettings;
|
this.additionalHudParts.puzzlePlaySettings = HUDPuzzlePlaySettings;
|
||||||
|
@ -35,6 +35,10 @@ export const MUSIC = {
|
|||||||
menu: "menu",
|
menu: "menu",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (G_IS_STANDALONE || G_IS_DEV) {
|
||||||
|
MUSIC.puzzle = "puzzle-full";
|
||||||
|
}
|
||||||
|
|
||||||
export class SoundInstanceInterface {
|
export class SoundInstanceInterface {
|
||||||
constructor(key, url) {
|
constructor(key, url) {
|
||||||
this.key = key;
|
this.key = key;
|
||||||
|
@ -85,12 +85,13 @@ export class PuzzleSerializer {
|
|||||||
const handles = root.hud.parts.buildingsToolbar.buildingHandles;
|
const handles = root.hud.parts.buildingsToolbar.buildingHandles;
|
||||||
const ids = gMetaBuildingRegistry.getAllIds();
|
const ids = gMetaBuildingRegistry.getAllIds();
|
||||||
|
|
||||||
/** @type {Array<typeof MetaBuilding>} */
|
/** @type {Array<string>} */
|
||||||
let excludedBuildings = [];
|
let excludedBuildings = [];
|
||||||
for (let i = 0; i < ids.length; ++i) {
|
for (let i = 0; i < ids.length; ++i) {
|
||||||
const handle = handles[ids[i]];
|
const handle = handles[ids[i]];
|
||||||
if (handle && handle.puzzleLocked) {
|
if (handle && handle.puzzleLocked) {
|
||||||
excludedBuildings.push(handle.class);
|
// @ts-ignore
|
||||||
|
excludedBuildings.push(handle.metaBuilding.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ import { MetaBuilding } from "../game/meta_building";
|
|||||||
* version: number;
|
* version: number;
|
||||||
* bounds: { w: number; h: number; },
|
* bounds: { w: number; h: number; },
|
||||||
* buildings: (PuzzleGameBuildingGoal | PuzzleGameBuildingConstantProducer | PuzzleGameBuildingBlock)[],
|
* buildings: (PuzzleGameBuildingGoal | PuzzleGameBuildingConstantProducer | PuzzleGameBuildingBlock)[],
|
||||||
* excludedBuildings: Array<typeof MetaBuilding>,
|
* excludedBuildings: Array<string>,
|
||||||
* }} PuzzleGameData
|
* }} PuzzleGameData
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -104,6 +104,9 @@ export class InGameState extends GameState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getThemeMusic() {
|
getThemeMusic() {
|
||||||
|
if (this.creationPayload.gameModeId && this.creationPayload.gameModeId.includes("puzzle")) {
|
||||||
|
return MUSIC.puzzle;
|
||||||
|
}
|
||||||
return MUSIC.theme;
|
return MUSIC.theme;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,6 @@ import {
|
|||||||
startFileChoose,
|
startFileChoose,
|
||||||
waitNextFrame,
|
waitNextFrame,
|
||||||
} from "../core/utils";
|
} from "../core/utils";
|
||||||
import { enumGameModeIds } from "../game/game_mode";
|
|
||||||
import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs";
|
import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs";
|
||||||
import { getApplicationSettingById } from "../profile/application_settings";
|
import { getApplicationSettingById } from "../profile/application_settings";
|
||||||
import { T } from "../translations";
|
import { T } from "../translations";
|
||||||
@ -83,9 +82,19 @@ export class MainMenuState extends GameState {
|
|||||||
}
|
}
|
||||||
<div class="buttons"></div>
|
<div class="buttons"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="bottomContainer">
|
|
||||||
<div class="buttons"></div>
|
${
|
||||||
</div>
|
// @TODO: Only display if DLC is owned, otherwise show ad for store page
|
||||||
|
showDemoBadges
|
||||||
|
? ""
|
||||||
|
: `
|
||||||
|
<div class="puzzleContainer">
|
||||||
|
<img class="dlcLogo" src="${cachebust(
|
||||||
|
"res/puzzle_dlc_logo.png"
|
||||||
|
)}" alt="shapez.io Logo">
|
||||||
|
<button class="styledButton puzzleDlcPlayButton">Play</button>
|
||||||
|
</div>`
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="footer ${G_CHINA_VERSION ? "china" : ""}">
|
<div class="footer ${G_CHINA_VERSION ? "china" : ""}">
|
||||||
@ -314,13 +323,10 @@ export class MainMenuState extends GameState {
|
|||||||
buttonContainer.appendChild(importButtonElement);
|
buttonContainer.appendChild(importButtonElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
const bottomButtonContainer = this.htmlElement.querySelector(".bottomContainer .buttons");
|
const puzzleModeButton = this.htmlElement.querySelector(".puzzleDlcPlayButton");
|
||||||
removeAllChildren(bottomButtonContainer);
|
if (puzzleModeButton) {
|
||||||
|
this.trackClicks(puzzleModeButton, () => this.onPuzzleModeButtonClicked());
|
||||||
const puzzleModeButton = makeButton(bottomButtonContainer, ["styledButton"], T.mainMenu.puzzleMode);
|
}
|
||||||
|
|
||||||
bottomButtonContainer.appendChild(puzzleModeButton);
|
|
||||||
this.trackClicks(puzzleModeButton, () => this.onPuzzleModeButtonClicked());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onPuzzleModeButtonClicked(force = false) {
|
onPuzzleModeButtonClicked(force = false) {
|
||||||
|
@ -186,7 +186,10 @@ export class PuzzleMenuState extends TextualGameState {
|
|||||||
const difficulty = document.createElement("div");
|
const difficulty = document.createElement("div");
|
||||||
difficulty.classList.add("difficulty");
|
difficulty.classList.add("difficulty");
|
||||||
|
|
||||||
const completionPercentage = Math.round((puzzle.completions / puzzle.downloads) * 100.0);
|
const completionPercentage = Math.max(
|
||||||
|
0,
|
||||||
|
Math.min(100, Math.round((puzzle.completions / puzzle.downloads) * 100.0))
|
||||||
|
);
|
||||||
difficulty.innerText = completionPercentage + "%";
|
difficulty.innerText = completionPercentage + "%";
|
||||||
stats.appendChild(difficulty);
|
stats.appendChild(difficulty);
|
||||||
|
|
||||||
@ -201,10 +204,13 @@ export class PuzzleMenuState extends TextualGameState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const downloads = document.createElement("div");
|
if (this.activeCategory === "mine") {
|
||||||
downloads.classList.add("downloads");
|
const downloads = document.createElement("div");
|
||||||
downloads.innerText = String(puzzle.downloads);
|
downloads.classList.add("downloads");
|
||||||
stats.appendChild(downloads);
|
downloads.innerText = String(puzzle.downloads);
|
||||||
|
stats.appendChild(downloads);
|
||||||
|
stats.classList.add("withDownloads");
|
||||||
|
}
|
||||||
|
|
||||||
const likes = document.createElement("div");
|
const likes = document.createElement("div");
|
||||||
likes.classList.add("likes");
|
likes.classList.add("likes");
|
||||||
|
@ -628,7 +628,7 @@ ingame:
|
|||||||
titleRating: How difficult did you find the puzzle?
|
titleRating: How difficult did you find the puzzle?
|
||||||
titleRatingDesc: Your rating will help me to make you better suggestions in the future
|
titleRatingDesc: Your rating will help me to make you better suggestions in the future
|
||||||
|
|
||||||
continueBtn: Continue
|
continueBtn: Keep Playing
|
||||||
menuBtn: Menu
|
menuBtn: Menu
|
||||||
|
|
||||||
puzzleMetadata:
|
puzzleMetadata:
|
||||||
|
@ -7,13 +7,13 @@ steamPage:
|
|||||||
|
|
||||||
intro: >-
|
intro: >-
|
||||||
אתה אוהב משחקי אוטומציה? אתה במקום הנכון!
|
אתה אוהב משחקי אוטומציה? אתה במקום הנכון!
|
||||||
|
|
||||||
shapez.io הוא משחק שלווה שבו אתה בונה מפעל בשביל ליצור צורות גאומטריות אוטומטית. ככל שמתקדמים השלבים, הצורות נהיות יותר ויותר מסובכות, ואתה צריך להפתח על המפה האין סופית.
|
shapez.io הוא משחק שלווה שבו אתה בונה מפעל בשביל ליצור צורות גאומטריות אוטומטית. ככל שמתקדמים השלבים, הצורות נהיות יותר ויותר מסובכות, ואתה צריך להפתח על המפה האין סופית.
|
||||||
|
|
||||||
ואם זה לא היה מספיק, אתה צריך ליצור יותר ויותר צורות בשביל לספק את הדרישה - הדבר היחיד שיכול לעזור זה להגדיל את המפעל! בזמן שבהתחלה אתה רק צריך לערוך צורות, בהמשך אתה צריך לצבוע אותם בעזרת צבעים שאתה מערבב.
|
ואם זה לא היה מספיק, אתה צריך ליצור יותר ויותר צורות בשביל לספק את הדרישה - הדבר היחיד שיכול לעזור זה להגדיל את המפעל! בזמן שבהתחלה אתה רק צריך לערוך צורות, בהמשך אתה צריך לצבוע אותם בעזרת צבעים שאתה מערבב.
|
||||||
|
|
||||||
קניית המשחק בsteam תתן לך גישה למשחק המלא, אבל אתה יכול לשחק משחק דמו בhttps://shapez.io/ ולהחליט אחר כך.
|
קניית המשחק בsteam תתן לך גישה למשחק המלא, אבל אתה יכול לשחק משחק דמו בhttps://shapez.io/ ולהחליט אחר כך.
|
||||||
|
|
||||||
what_others_say: What people say about shapez.io
|
what_others_say: What people say about shapez.io
|
||||||
|
|
||||||
nothernlion_comment: >-
|
nothernlion_comment: >-
|
||||||
@ -417,41 +417,51 @@ ingame:
|
|||||||
get_on_steam: Steamהשג ב
|
get_on_steam: Steamהשג ב
|
||||||
|
|
||||||
standaloneAdvantages:
|
standaloneAdvantages:
|
||||||
title: !השג את הגרסה המלאה
|
title: >-
|
||||||
no_thanks: !לא, תודה
|
!השג את הגרסה המלאה
|
||||||
|
no_thanks: >-
|
||||||
|
!לא, תודה
|
||||||
|
|
||||||
points:
|
points:
|
||||||
levels:
|
levels:
|
||||||
title: 12 שלבים חדשים
|
title: 12 שלבים חדשים
|
||||||
desc: !סה"כ 26 שלבים
|
desc: >-
|
||||||
|
!סה"כ 26 שלבים
|
||||||
|
|
||||||
buildings:
|
buildings:
|
||||||
title: 18 מבנים חדשים
|
title: 18 מבנים חדשים
|
||||||
desc: !אפשרות להפוך את המפעל לאוטומטי לגמרי
|
desc: >-
|
||||||
|
!אפשרות להפוך את המפעל לאוטומטי לגמרי
|
||||||
|
|
||||||
achievements:
|
achievements:
|
||||||
title: הישגים
|
title: הישגים
|
||||||
desc: !השג את כולם
|
desc: >-
|
||||||
|
!השג את כולם
|
||||||
|
|
||||||
upgrades:
|
upgrades:
|
||||||
title: רמות לשדרוגים ∞
|
title: רמות לשדרוגים ∞
|
||||||
desc: !לגרסת הדמו הזאת יש רק 5
|
desc: >-
|
||||||
|
!לגרסת הדמו הזאת יש רק 5
|
||||||
|
|
||||||
markers:
|
markers:
|
||||||
title: סימונים ∞
|
title: סימונים ∞
|
||||||
desc: !אף פעם לא תלך לאיבוד במפעל שלך
|
desc: >-
|
||||||
|
!אף פעם לא תלך לאיבוד במפעל שלך
|
||||||
|
|
||||||
wires:
|
wires:
|
||||||
title: כבלים
|
title: כבלים
|
||||||
desc: !מימד חדש לגמרי
|
desc: >-
|
||||||
|
!מימד חדש לגמרי
|
||||||
|
|
||||||
darkmode:
|
darkmode:
|
||||||
title: תצוגה כהה
|
title: תצוגה כהה
|
||||||
desc: !תפסיק להכאיב לעיניים שלך
|
desc: >-
|
||||||
|
!תפסיק להכאיב לעיניים שלך
|
||||||
|
|
||||||
support:
|
support:
|
||||||
title: תמוך בי
|
title: תמוך בי
|
||||||
desc: !אני יצרתי רת המשחק הזה בזמני החופשי
|
desc: >-
|
||||||
|
!אני יצרתי רת המשחק הזה בזמני החופשי
|
||||||
|
|
||||||
# All shop upgrades
|
# All shop upgrades
|
||||||
shopUpgrades:
|
shopUpgrades:
|
||||||
@ -1150,39 +1160,50 @@ demo:
|
|||||||
settingNotAvailable: .הגדרה לא זמינה בדמו
|
settingNotAvailable: .הגדרה לא זמינה בדמו
|
||||||
|
|
||||||
tips:
|
tips:
|
||||||
- !ההאב יקבל כל צורה, לא רק את הצורה הנדרשת עכשיו
|
- >-
|
||||||
- !וודא שהמפעלים שלך מחולקים - זה יהיה לך יותר קל
|
!ההאב יקבל כל צורה, לא רק את הצורה הנדרשת עכשיו
|
||||||
- !אל תבנה יותר מדיי קרוב להאב, זה יהפוך לבלגן
|
- >-
|
||||||
|
!וודא שהמפעלים שלך מחולקים - זה יהיה לך יותר קל
|
||||||
|
- >-
|
||||||
|
!אל תבנה יותר מדיי קרוב להאב, זה יהפוך לבלגן
|
||||||
- .אם החיבור לא עובד, תנסה להחליף את מה נכנס לאיזה צד
|
- .אם החיבור לא עובד, תנסה להחליף את מה נכנס לאיזה צד
|
||||||
- .<b>R</b> אתה יכול לשנות את הכיוון של בניית המסועים המהירה ע"י ללחוץ על
|
- .<b>R</b> אתה יכול לשנות את הכיוון של בניית המסועים המהירה ע"י ללחוץ על
|
||||||
- .תאפשר לבנות הרבה מסילות באותו כיוון <b>CTRL</b> החזקת
|
- .תאפשר לבנות הרבה מסילות באותו כיוון <b>CTRL</b> החזקת
|
||||||
- .היחס של המהירויות של המבנים ישאר זהה אם השדרוגים הם באותו רמה
|
- .היחס של המהירויות של המבנים ישאר זהה אם השדרוגים הם באותו רמה
|
||||||
- .לשים חפצים במסוע אחת מאשר כמה יהיה יותר יעיל במקום
|
- .לשים חפצים במסוע אחת מאשר כמה יהיה יותר יעיל במקום
|
||||||
- !אתה תשיג עוד צורות של מבנים בהמשך המשחק
|
- >-
|
||||||
|
!אתה תשיג עוד צורות של מבנים בהמשך המשחק
|
||||||
- .בשביל להחליף בין צורות שונות של מבנים <b>T</b>אתה יכול להשתמש ב
|
- .בשביל להחליף בין צורות שונות של מבנים <b>T</b>אתה יכול להשתמש ב
|
||||||
- !סימטריה זה המפתח
|
- >-
|
||||||
|
!סימטריה זה המפתח
|
||||||
- .אתה יכול לשים סוגים שונים של מנהרות על אותו קו לסרוגין
|
- .אתה יכול לשים סוגים שונים של מנהרות על אותו קו לסרוגין
|
||||||
- !נסה לבנות מפעלים קומפקטים, זה ישתלם
|
- >-
|
||||||
|
!נסה לבנות מפעלים קומפקטים, זה ישתלם
|
||||||
- <b>T</b> לצובע יש סוג הפוך שאתה יכול לבחור ע"י
|
- <b>T</b> לצובע יש סוג הפוך שאתה יכול לבחור ע"י
|
||||||
- .אם יש לך את היחס הנכון בין כמות המבנים, יהיה לך את האיכות המיטבית
|
- .אם יש לך את היחס הנכון בין כמות המבנים, יהיה לך את האיכות המיטבית
|
||||||
- .ברמה המקסימלית, 5 חוצבים ימלאו מסוע אחד
|
- .ברמה המקסימלית, 5 חוצבים ימלאו מסוע אחד
|
||||||
- !אל תשכח בקשר למנהרות
|
- >-
|
||||||
|
!אל תשכח בקשר למנהרות
|
||||||
- .אתה לא צריך לחלק חפצים באופן שווה בשביל יעילות המיטבית
|
- .אתה לא צריך לחלק חפצים באופן שווה בשביל יעילות המיטבית
|
||||||
- .תפעיל את מצב בנייה מהירה של מסועים, שתתן לך לשים מסועים ארוכים בקלות <b>SHIFT</b> החזקת
|
- .תפעיל את מצב בנייה מהירה של מסועים, שתתן לך לשים מסועים ארוכים בקלות <b>SHIFT</b> החזקת
|
||||||
- .חותכים תמיד חותכים לגובה, לא משנה מה הכיוון שלהם
|
- .חותכים תמיד חותכים לגובה, לא משנה מה הכיוון שלהם
|
||||||
- .ערבב את כל שלושת הצבעים הבסיסיים בשביל להשיג את הצבע לבן
|
- .ערבב את כל שלושת הצבעים הבסיסיים בשביל להשיג את הצבע לבן
|
||||||
- .לאכסון יש העדפה להוציא רק מהצד השמאלי
|
- .לאכסון יש העדפה להוציא רק מהצד השמאלי
|
||||||
- !הכן לך עיצוב של מבנה שתוכל להשתמש בו כשתצטרך - זה שווה את זה
|
- >-
|
||||||
|
!הכן לך עיצוב של מבנה שתוכל להשתמש בו כשתצטרך - זה שווה את זה
|
||||||
- .תתן לך לבנות כמה מבנים באותו זמן <b>SHIFT</b> החזקת
|
- .תתן לך לבנות כמה מבנים באותו זמן <b>SHIFT</b> החזקת
|
||||||
- .בשביל להפוך את הכיוון של המסועים שאתה שם <b>ALT</b> אתה יכול להחזיק
|
- .בשביל להפוך את הכיוון של המסועים שאתה שם <b>ALT</b> אתה יכול להחזיק
|
||||||
- !יעילות זה המפתח
|
- >-
|
||||||
|
!יעילות זה המפתח
|
||||||
- .מאגרי צורות שיותר רחוקות מההאב הן יותר מסובכות
|
- .מאגרי צורות שיותר רחוקות מההאב הן יותר מסובכות
|
||||||
- .למכונות יש מהירות מוגבלת, חלק את החומרים בשביל היעילות המיטבית
|
- .למכונות יש מהירות מוגבלת, חלק את החומרים בשביל היעילות המיטבית
|
||||||
- .התשמש במאזנים בשביל למקסם את היעילות
|
- .התשמש במאזנים בשביל למקסם את היעילות
|
||||||
- .כיוון זה לא חשוב. נסה לא לחצות מסועים יותא מידי
|
- .כיוון זה לא חשוב. נסה לא לחצות מסועים יותא מידי
|
||||||
- !תכנן מראש, אחרת יהיה לך בלאגן
|
- >-
|
||||||
|
!תכנן מראש, אחרת יהיה לך בלאגן
|
||||||
- .אל תמחק את המפעלים הישנים שלך! אתה תצתרך אותם בשביל לפתוח שדרוגים
|
- .אל תמחק את המפעלים הישנים שלך! אתה תצתרך אותם בשביל לפתוח שדרוגים
|
||||||
- !נסה לפתור את השלבים 20 ו26 בעצמך לפני שאתה מחפש פתרונות
|
- >-
|
||||||
|
!נסה לפתור את השלבים 20 ו26 בעצמך לפני שאתה מחפש פתרונות
|
||||||
- .אל תסבך דברים, נסה להשאר פשוט ותגיע רחוק
|
- .אל תסבך דברים, נסה להשאר פשוט ותגיע רחוק
|
||||||
- .אתה כנראה תצטרך להשתמש במפעלים שלך שוב בהמשך המשחק. תבנה את המפעלים שלך בצורה שתוכל להשתמש בהם שוב בהמשך
|
- .אתה כנראה תצטרך להשתמש במפעלים שלך שוב בהמשך המשחק. תבנה את המפעלים שלך בצורה שתוכל להשתמש בהם שוב בהמשך
|
||||||
- .לפעמים אתה יכול למצוא צורה שאתה צריך במפה בלי להתחיל לבנות אותה עם חותכים ומחברים
|
- .לפעמים אתה יכול למצוא צורה שאתה צריך במפה בלי להתחיל לבנות אותה עם חותכים ומחברים
|
||||||
@ -1195,14 +1216,18 @@ tips:
|
|||||||
- .בנייה קרובה מידי להאב יכולה להפריע בדרך של פרוייקטים מאוחרים יותר
|
- .בנייה קרובה מידי להאב יכולה להפריע בדרך של פרוייקטים מאוחרים יותר
|
||||||
- .סימן הסיכה ליד כל צורה בשדרוגים תצמיד אותה לצד שמאל של המסך
|
- .סימן הסיכה ליד כל צורה בשדרוגים תצמיד אותה לצד שמאל של המסך
|
||||||
- .ערבב את כל שלושת הצבעים הבסיסיים בשביל להשיג את הצבע לבן
|
- .ערבב את כל שלושת הצבעים הבסיסיים בשביל להשיג את הצבע לבן
|
||||||
- !יש לך מפה אין סופית. אל תשים את המפעל שלך רק צמוד להאב, תרחיב אותו
|
- >-
|
||||||
|
!יש לך מפה אין סופית. אל תשים את המפעל שלך רק צמוד להאב, תרחיב אותו
|
||||||
- .זה המשחק האהוב עליי !Factorio נסה גם את את
|
- .זה המשחק האהוב עליי !Factorio נסה גם את את
|
||||||
- .החותך המרובע חותך עם כיוון השעון, מתחיל מלמעלה ימין.
|
- .החותך המרובע חותך עם כיוון השעון, מתחיל מלמעלה ימין.
|
||||||
- !אתה יכול להוריד את השמירות שלך בתפריט הראשי!
|
- >-
|
||||||
|
!אתה יכול להוריד את השמירות שלך בתפריט הראשי!
|
||||||
- .למשחק הזה יש הרבה מקשים שימושיים! חפש אותם בהגדרות.
|
- .למשחק הזה יש הרבה מקשים שימושיים! חפש אותם בהגדרות.
|
||||||
- !למשחק הזה יש הרבה הגדרות, חפש אותם
|
- >-
|
||||||
- !לסימון של ההאב שלך יש חץ שמסמן באיזה כיוון הוא
|
!למשחק הזה יש הרבה הגדרות, חפש אותם
|
||||||
|
- >-
|
||||||
|
!לסימון של ההאב שלך יש חץ שמסמן באיזה כיוון הוא
|
||||||
- .בשביל לנקות מסוע, חתוך את האיזור ואז תדביק באותו מקום
|
- .בשביל לנקות מסוע, חתוך את האיזור ואז תדביק באותו מקום
|
||||||
- .לחץ F4 בשביל להציג את הFPS ואת הTickRate
|
- .לחץ F4 בשביל להציג את הFPS ואת הTickRate
|
||||||
- .לחץ F4 פעמיים בשביל להציג את המשבצת שהעכבר והמצלמה בהם
|
- .לחץ F4 פעמיים בשביל להציג את המשבצת שהעכבר והמצלמה בהם
|
||||||
- .אתה יכול ללחוץ על צורה מוצמדת בצד שמאל בשביל לבטל את ההצמדה
|
- .אתה יכול ללחוץ על צורה מוצמדת בצד שמאל בשביל לבטל את ההצמדה
|
||||||
|
Loading…
Reference in New Issue
Block a user