From 260041702bdecfb4fa5d7d86c004f3b391611bac Mon Sep 17 00:00:00 2001 From: Sense101 <67970865+Sense101@users.noreply.github.com> Date: Wed, 28 Jul 2021 08:20:08 +0100 Subject: [PATCH 01/12] Hotfix to prevent pasting locked buildings (#1272) * fix to prevent pasting locked buildings * only check when in editor --- src/js/game/logic.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/js/game/logic.js b/src/js/game/logic.js index 20caca31..79104958 100644 --- a/src/js/game/logic.js +++ b/src/js/game/logic.js @@ -80,6 +80,15 @@ export class GameLogic { } // Perform additional placement checks + if (this.root.gameMode.getIsEditor()) { + const toolbar = this.root.hud.parts.buildingsToolbar; + const id = entity.components.StaticMapEntity.getMetaBuilding().getId(); + + if (toolbar.buildingHandles[id].puzzleLocked) { + return false; + } + } + if (this.root.signals.prePlacementCheck.dispatch(entity, offset) === STOP_PROPAGATION) { return false; } From c99992aedd89c02cdba6ef13cdf3595ef24ff9a1 Mon Sep 17 00:00:00 2001 From: Allie <13716824+ChildishGiant@users.noreply.github.com> Date: Wed, 4 Aug 2021 11:13:26 +0100 Subject: [PATCH 02/12] docs: fix gitpod link (#1277) The from-referrer goes to gitpod.io/#https://github.com so I changed it to be the actual repo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 84be6af7..4a042cd9 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ You can use [Gitpod](https://www.gitpod.io/) (an Online Open Source VS Code-like - install all of the dependencies. - start `gulp` in `gulp/` directory. -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/from-referrer/) +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/tobspr/shapez.io) ## Helping translate From c11f571dd28676af6b742602338b0dca54ec4a49 Mon Sep 17 00:00:00 2001 From: Alexis <85386572+LeGnocchi@users.noreply.github.com> Date: Wed, 4 Aug 2021 12:14:33 +0200 Subject: [PATCH 03/12] Update base-fr.yaml (#1191) * Update base-fr.yaml I added some translations for the puzzle mode and fixed some spelling and grammar errors made on previous traductions. * Update base-fr.yaml Many other translations (including puzzle mode) and some corrections * Update base-fr.yaml Many other translations (including puzzle mode) and some corrections * Update base-fr.yaml Some corrections * Update base-fr.yaml Some translations made on untranslated texts --- translations/base-fr.yaml | 216 +++++++++++++++++++------------------- 1 file changed, 106 insertions(+), 110 deletions(-) diff --git a/translations/base-fr.yaml b/translations/base-fr.yaml index c90b41bf..644b7f88 100644 --- a/translations/base-fr.yaml +++ b/translations/base-fr.yaml @@ -11,14 +11,14 @@ steamPage: Et en plus, vous devrez aussi produire de plus en plus pour satisfaire la demande. La seule solution est de construire en plus grand ! Au début vous ne ferez que découper les formes, mais plus tard vous devrez les peindre — et pour ça vous devrez extraire et mélanger des couleurs ! En achetant le jeu sur Steam, vous aurez accès à la version complète, mais vous pouvez aussi jouer à une démo sur shapez.io et vous décider ensuite ! - what_others_say: Ce que les gens pensent de shapez.io - nothernlion_comment: This game is great - I'm having a wonderful time playing, - and time has flown by. - notch_comment: Mince ! Je devrais vraiment me coucher, mais je crois que j'ai - trouvé comment faire un ordinateur dans shapez.io - steam_review_comment: This game has stolen my life and I don't want it back. - Very chill factory game that won't let me stop making my lines more - efficient. + what_others_say: Ce que les gens pensent de Shapez.io + nothernlion_comment: Ce jeu est génial - Je passe un merveilleux moment à jouer, + et le temps s'est envolé. + notch_comment: Mince ! Je devrais vraiment me coucher, mais je crois que j'ai trouvé + comment faire un ordinateur dans Shapez.io + steam_review_comment: Ce jeu a volé ma vie et je ne veux pas la récupérer. + Jeu d'usine très cool qui ne me laissera pas arrêter de rendre mes lignes plus + efficaces. global: loading: Chargement error: Erreur @@ -71,11 +71,11 @@ mainMenu: savegameLevel: Niveau  savegameLevelUnknown: Niveau inconnu savegameUnnamed: Sans titre - puzzleMode: Puzzle Mode - back: Back - puzzleDlcText: Vous aimez compacter et optimiser vos usines ? Achetez le DLC sur - Steam dés maintenant pour encore plus d'amusement ! - puzzleDlcWishlist: Wishlist now! + puzzleMode: Mode Puzzle + back: Retour + puzzleDlcText: Vous aimez compacter et optimiser vos usines ? Achetez le DLC + sur Steam dès maintenant pour encore plus d'amusement! + puzzleDlcWishlist: Ajoute à ta liste de souhaits maintenant ! puzzleDlcViewNow: View Dlc dialogs: buttons: @@ -90,7 +90,7 @@ dialogs: viewUpdate: Voir les mises à jour showUpgrades: Montrer les améliorations showKeybindings: Montrer les raccourcis - retry: Réesayer + retry: Réessayer continue: Continuer playOffline: Jouer Hors-ligne importSavegameError: @@ -200,63 +200,61 @@ dialogs: desc: "Malheuresement, le puzzle n'a pas pu être chargé :" submitPuzzle: title: Envoyer le Puzzle - descName: "Donnez un nom à votre puzzle :" - descIcon: "Please enter a unique short key, which will be shown as the icon of - your puzzle (You can generate them here, or choose one - of the randomly suggested shapes below):" - placeholderName: Puzzle Title + descName: "Donnez un nom à votre puzzle:" + descIcon: "Veuillez entrer un raccourci de forme unique, qui sera affichée comme icône de + votre puzzle (Vous pouvez générer le raccourci d'une forme ici, ou en choisir une + parmi les formes suggérées alétoirement ci-dessous):" + placeholderName: Titre du Puzzle puzzleResizeBadBuildings: - title: Resize not possible - desc: You can't make the zone any smaller, because then some buildings would be - outside the zone. + title: Impossible de redimensionner + desc: Vous ne pouvez pas rétrécir la zone, car certains bâtiments seraient en dehors de la zone puzzleLoadError: title: Mauvais Puzzle - desc: "Le chargement du puzzle a échoué :" + desc: "Le chargement du puzzle a échoué:" offlineMode: title: Mode hors-ligne - desc: We couldn't reach the servers, so the game has to run in offline mode. - Please make sure you have an active internet connection. + desc: Nous n'avons pas pu atteindre les serveurs, donc le jeu doit être mis en mode hors ligne. + Veuillez vous assurez que vous disposez d'une connexion Internet active. puzzleDownloadError: title: Erreur de téléchargment - desc: "Le téléchargement à échoué :" + desc: "Le téléchargement a échoué:" puzzleSubmitError: title: Erreur d'envoi - desc: "L'envoi à échoué :" + desc: "L'envoi a échoué:" puzzleSubmitOk: title: Puzzle envoyé - desc: Félicitation ! Votre puzzle à été envoyé et peut maintenant être joué. + desc: Félicitations ! Votre puzzle a été envoyé et peut maintenant être joué. Vous pouvez maintenant le retrouver dans la section "Mes Puzzles". puzzleCreateOffline: title: Mode Hors-ligne - desc: Since you are offline, you will not be able to save and/or publish your - puzzle. Would you still like to continue? + desc: Puisque vous êtes hors ligne, vous ne pourrez pas enregistrer et/ou publier votre puzzle. Souhaitez-vous toujours continuer ? puzzlePlayRegularRecommendation: - title: Recommendation - desc: I strongly recommend playing the normal game to level 12 - before attempting the puzzle DLC, otherwise you may encounter - mechanics not yet introduced. Do you still want to continue? + title: Recommandation + desc: Je recommande fortement de jouer au jeu normal jusqu'au niveau 12 + avant d'essayer le Puzzle DLC, sinon vous risqez de rencontrer + des méchanismes pas encore introduits. Voulez-vous toujours continuer ? puzzleShare: - title: Short Key Copied - desc: The short key of the puzzle () has been copied to your clipboard! It - can be entered in the puzzle menu to access the puzzle. + title: Code copié + desc: Le code du puzzle () a été copié dans ton presse-papiers ! Il + peut être entré dans le menu des puzzles pour accéder au puzzle. puzzleReport: - title: Report Puzzle + title: Signaler le Puzzle options: profane: Profane - unsolvable: Not solvable - trolling: Trolling + unsolvable: Irrésolvable + trolling: Troll puzzleReportComplete: - title: Merci pour votre retour ! + title: Merci pour votre retour! desc: Le puzzle a été marqué. puzzleReportError: - title: Failed to report - desc: "Your report could not get processed:" + title: Échec du signalement + desc: "Votre signalement n'a pas pu être effectué:" puzzleLoadShortKey: - title: Enter short key - desc: Enter the short key of the puzzle to load it. + title: Entrer un code + desc: Entrer le code du puzzle pour le charger. puzzleDelete: - title: Delete Puzzle? - desc: Are you sure you want to delete ''? This can not be undone! + title: Supprimer le puzzle ? + desc: Êtes-vous sûr de vouloir supprimer '<title>' ? Cela sera irréversible ! ingame: keybindingsOverlay: moveMap: Déplacer @@ -430,28 +428,26 @@ ingame: title: Me soutenir desc: Je le développe pendant mon temps libre ! achievements: - title: Achievements - desc: Hunt them all! + title: Succès + desc: Débloquez-les tous ! puzzleEditorSettings: zoneTitle: Zone - zoneWidth: Width - zoneHeight: Height - trimZone: Trim - clearItems: Clear Items - share: Share - report: Report - clearBuildings: Clear Buildings - resetPuzzle: Reset Puzzle + zoneWidth: Largeur + zoneHeight: Hauteur + trimZone: Optimiser la taille + clearItems: Supprimer les objets + share: Partager + report: Signaler puzzleEditorControls: - title: Puzzle Creator + title: Créateur de Puzzles instructions: - - 1. Place <strong>Constant Producers</strong> to provide shapes and - colors to the player - - 2. Build one or more shapes you want the player to build later and - deliver it to one or more <strong>Goal Acceptors</strong> - - 3. Once a Goal Acceptor receives a shape for a certain amount of - time, it <strong>saves it as a goal</strong> that the player must - produce later (Indicated by the <strong>green badge</strong>). + - 1. Placez des <strong>Producteurs Constants</strong> pour fournir des formes et + des couleurs au joueur + - 2. Fabriquez une ou plusieurs formes que vous voulez que le joueur fabrique plus tard et + délivrez-la/les à un ou plusieurs <strong>Récepteurs d'Objectif</strong> + - 3. Une fois qu'un Récépteur d'Objectif a reçu une forme pendant un certain + temps, il <strong>l'enregistre zn tant qu'objectif</strong> que le joueur devra + produire plus tard (Indiqué par le <strong>badge vert</strong>). - 4. Click the <strong>lock button</strong> on a building to disable it. - 5. Once you click review, your puzzle will be validated and you @@ -460,18 +456,18 @@ ingame: except for the Producers and Goal Acceptors - That's the part that the player is supposed to figure out for themselves, after all :) puzzleCompletion: - title: Puzzle Completed! - titleLike: "Click the heart if you liked the puzzle:" - titleRating: How difficult did you find the puzzle? - titleRatingDesc: Your rating will help me to make you better suggestions in the future - continueBtn: Keep Playing + title: Puzzle Résolu ! + titleLike: "Cliquez sur le cœur si vous avez aimé le Puzzle:" + titleRating: À quel point avez-vous trouvé le puzzle diffcile ? + titleRatingDesc: Votre note m'aidera à vous faire de meilleures suggestions à l'avenir + continueBtn: Continuer à jouer menuBtn: Menu puzzleMetadata: - author: Author + author: Auteur shortKey: Short Key - rating: Difficulty score - averageDuration: Avg. Duration - completionRate: Completion rate + rating: Niveau de difficulté + averageDuration: Durée moyenne + completionRate: Taux de réussite shopUpgrades: belt: name: Convoyeurs, distributeurs et tunnels @@ -691,25 +687,25 @@ buildings: calque de câblage sur le calque normal. constant_producer: default: - name: Constant Producer - description: Constantly outputs a specified shape or color. + name: Producteur Constabnt + description: Sort constamment une forme ou une couleur spécifiée. goal_acceptor: default: - name: Goal Acceptor - description: Deliver shapes to the goal acceptor to set them as a goal. + name: Récepteur d'Objetcif + description: Délivrez des formes au récepteur d'objectif pour les définir comme objectif. block: default: - name: Block - description: Allows you to block a tile. + name: Bloc + description: Permet de bloquer une case. storyRewards: reward_cutter_and_trash: title: Découpage de formes - desc: You just unlocked the <strong>cutter</strong>, which cuts shapes in half - from top to bottom <strong>regardless of its - orientation</strong>!<br><br>Be sure to get rid of the waste, or - otherwise <strong>it will clog and stall</strong> - For this purpose - I have given you the <strong>trash</strong>, which destroys - everything you put into it! + desc: Vous venez de déverrouiller le <strong>découpeur</strong>, qui coupe les formes en deux + de haut en bas <strong>indépendamment de son + orientation</strong>!<br><br>Assurez-vous de vous débarrasser des déchets, ou + sinon <strong>il se bouchera et se bloquera</strong> - À cet effet, + Je vous ai donné la <strong>poubelle</strong>, qui détruit + tout ce que vous mettez dedans ! reward_rotater: title: Rotation desc: Le <strong>pivoteur</strong> a été débloqué ! Il pivote les formes de 90 @@ -735,9 +731,9 @@ storyRewards: <strong>placée au-dessus</strong> de la forme de gauche. reward_balancer: title: Répartiteur - desc: The multifunctional <strong>balancer</strong> has been unlocked - It can - be used to build bigger factories by <strong>splitting and merging - items</strong> onto multiple belts! + desc: Le <strong>répartiteur</strong> multifonctionnel a été débloqué - Il peut + être utilisé pour construire de plus grandes usines en <strong>divisant et en rassemblant + des objets</strong> sur plusieurs convoyeurs ! reward_tunnel: title: Tunnel desc: Le <strong>tunnel</strong> a été débloqué. Vous pouvez maintenant faire @@ -843,14 +839,14 @@ storyRewards: gâteau : je vous donne aussi le <strong>transistor</strong> !" reward_virtual_processing: title: Traitement virtuel - desc: I just gave a whole bunch of new buildings which allow you to - <strong>simulate the processing of shapes</strong>!<br><br> You can - now simulate a cutter, rotator, stacker and more on the wires layer! - With this you now have three options to continue the game:<br><br> - - Build an <strong>automated machine</strong> to create any possible - shape requested by the HUB (I recommend to try it!).<br><br> - Build - something cool with wires.<br><br> - Continue to play - normally.<br><br> Whatever you choose, remember to have fun! + desc: Je viens de vous donner tout un tas de nouveaux bâtiments qui vous permettent de + <strong>simuler le traitement des formes</strong>!<br><br> Vous pouvez + maintenant simuler un découpeur, un pivoteur, un assembleur et plus encore sur la couche des fils ! + Avec cela vous avez maintenant trois options pour continuer le jeu:<br><br> - + Construire une <strong>machine automatique</strong> pour créer toute forme + possible demandée par le HUB (Je recommande d'essayer de le faire !).<br><br> - Construire + quelque chose de cool avec les fils.<br><br> - Continuer à jouer + normalement.<br><br> Quoi que vous choisissiez, n'oubliez pas de vous amuser ! no_reward: title: Niveau suivant desc: "Ce niveau n’a pas de récompense mais le prochain, si !<br><br> PS : Ne @@ -1127,10 +1123,10 @@ keybindings: rotateToDown: "Rotate: Point Down" rotateToRight: "Rotate: Point Right" rotateToLeft: "Rotate: Point Left" - constant_producer: Constant Producer - goal_acceptor: Goal Acceptor - block: Block - massSelectClear: Clear belts + constant_producer: Producteur Constant + goal_acceptor: Récepteur d'Objectif + block: Bloc + massSelectClear: Vider les convoyeurs about: title: À propos de ce jeu body: >- @@ -1156,7 +1152,7 @@ demo: exportingBase: Exporter une image de toute la base settingNotAvailable: Indisponible dans la démo. tips: - - Le centre n’importe quelle forme, pas seulement la forme actuelle ! + - Le centre accepte n’importe quelle forme, pas seulement la forme actuelle ! - Assurez-vous que vos usines soient modulaires, cela paiera ! - Ne construisez pas trop près du centre, ou ce sera un énorme chaos ! - Si l’empilement ne fonctionne pas, essayez d’échanger les entrées. @@ -1237,7 +1233,7 @@ puzzleMenu: edit: Éditer title: Mode Puzzle createPuzzle: Créer un Puzzle - loadPuzzle: charger + loadPuzzle: Charger reviewPuzzle: Revoir & Publier validatingPuzzle: Validation du Puzzle submittingPuzzle: Publication du Puzzle @@ -1245,19 +1241,19 @@ puzzleMenu: categories: levels: Niveaux new: Nouveau - top-rated: Les-mieux notés + top-rated: Les mieux notés mine: Mes puzzles easy: Facile hard: Difficile completed: Complété medium: Medium - official: Official + official: Officiel trending: Trending today trending-weekly: Trending weekly - categories: Categories - difficulties: By Difficulty - account: My Puzzles - search: Search + categories: Catégories + difficulties: Par Difficulté + account: Mes Puzzles + search: Rechercher validation: title: Puzzle invalide noProducers: Veuillez placer un producteur constant ! @@ -1302,6 +1298,6 @@ backendErrors: bad-payload: La demande contient des données invalides. bad-building-placement: Votre puzzle contient des bâtiments placés non valides. timeout: La demande a expiré. - too-many-likes-already: The puzzle alreay got too many likes. If you still want + too-many-likes-already: The puzzle already got too many likes. If you still want to remove it, please contact support@shapez.io! no-permission: You do not have the permission to perform this action. From 0a15958af9cc1ca602169ab9d55194d0ab9db041 Mon Sep 17 00:00:00 2001 From: Emerald Block <69981203+EmeraldBlock@users.noreply.github.com> Date: Wed, 4 Aug 2021 05:19:58 -0500 Subject: [PATCH 04/12] Highlight focused text inputs, Show old signal (#1255) * provide previous key when editing signal * highlight text in focused text input --- src/js/core/modal_dialog_forms.js | 1 + src/js/game/systems/constant_signal.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/js/core/modal_dialog_forms.js b/src/js/core/modal_dialog_forms.js index aac81d82..355fad09 100644 --- a/src/js/core/modal_dialog_forms.js +++ b/src/js/core/modal_dialog_forms.js @@ -124,6 +124,7 @@ export class FormElementInput extends FormElement { focus() { this.element.focus(); + this.element.select(); } } diff --git a/src/js/game/systems/constant_signal.js b/src/js/game/systems/constant_signal.js index 5fabb80e..29079825 100644 --- a/src/js/game/systems/constant_signal.js +++ b/src/js/game/systems/constant_signal.js @@ -49,11 +49,12 @@ export class ConstantSignalSystem extends GameSystemWithFilter { // Ok, query, but also save the uid because it could get stale const uid = entity.uid; + const signal = entity.components.ConstantSignal.signal; const signalValueInput = new FormElementInput({ id: "signalValue", label: fillInLinkIntoTranslation(T.dialogs.editSignal.descShortKey, THIRDPARTY_URLS.shapeViewer), placeholder: "", - defaultValue: "", + defaultValue: signal ? signal.getAsCopyableKey() : "", validator: val => this.parseSignalCode(entity, val), }); From e4f02abeb372f5e0b80fbdf7da63605d853e0f43 Mon Sep 17 00:00:00 2001 From: PFedak <pzfedak@gmail.com> Date: Wed, 4 Aug 2021 04:34:15 -0600 Subject: [PATCH 05/12] Simplify item processor slot logic. (#1257) Track input slot assignment by array index rather than including extra data in a new object. This greatly reduces the amount of garbage generated by tryTakeItem and other item process operations. --- src/js/game/components/item_processor.js | 21 ++++--- src/js/game/systems/item_processor.js | 74 ++++++++++-------------- 2 files changed, 44 insertions(+), 51 deletions(-) diff --git a/src/js/game/components/item_processor.js b/src/js/game/components/item_processor.js index 4c0e1835..a3991d1f 100644 --- a/src/js/game/components/item_processor.js +++ b/src/js/game/components/item_processor.js @@ -84,10 +84,16 @@ export class ItemProcessorComponent extends Component { /** * Our current inputs - * @type {Array<{ item: BaseItem, sourceSlot: number }>} + * @type {Array<BaseItem?>} */ this.inputSlots = []; + /** + * Current input count + * @type {number} + */ + this.inputCount = 0; + /** * What we are currently processing, empty if we don't produce anything rn * requiredSlot: Item *must* be ejected on this slot @@ -115,19 +121,16 @@ export class ItemProcessorComponent extends Component { this.type === enumItemProcessorTypes.goal ) { // Hub has special logic .. not really nice but efficient. - this.inputSlots.push({ item, sourceSlot }); + this.inputSlots.push(item); + this.inputCount++; return true; } // Check that we only take one item per slot - for (let i = 0; i < this.inputSlots.length; ++i) { - const slot = this.inputSlots[i]; - if (slot.sourceSlot === sourceSlot) { - return false; - } - } + if (this.inputSlots[sourceSlot]) return false; - this.inputSlots.push({ item, sourceSlot }); + this.inputSlots[sourceSlot] = item; + this.inputCount++; return true; } } diff --git a/src/js/game/systems/item_processor.js b/src/js/game/systems/item_processor.js index 3794473f..cc654968 100644 --- a/src/js/game/systems/item_processor.js +++ b/src/js/game/systems/item_processor.js @@ -32,8 +32,7 @@ const MAX_QUEUED_CHARGES = 2; * Type of a processor implementation * @typedef {{ * entity: Entity, - * items: Array<{ item: BaseItem, sourceSlot: number }>, - * itemsBySlot: Object<number, BaseItem>, + * items: Array<BaseItem?>, * outItems: Array<ProducedItem> * }} ProcessorImplementationPayload */ @@ -189,7 +188,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { // DEFAULT // By default, we can start processing once all inputs are there case null: { - return processorComp.inputSlots.length >= processorComp.inputsPerCharge; + return processorComp.inputCount >= processorComp.inputsPerCharge; } // QUAD PAINTER @@ -197,18 +196,12 @@ export class ItemProcessorSystem extends GameSystemWithFilter { case enumItemProcessorRequirements.painterQuad: { const pinsComp = entity.components.WiredPins; - /** @type {Object.<number, { item: BaseItem, sourceSlot: number }>} */ - const itemsBySlot = {}; - for (let i = 0; i < processorComp.inputSlots.length; ++i) { - itemsBySlot[processorComp.inputSlots[i].sourceSlot] = processorComp.inputSlots[i]; - } - // First slot is the shape, so if it's not there we can't do anything - if (!itemsBySlot[0]) { + if (!processorComp.inputSlots[0]) { return false; } - const shapeItem = /** @type {ShapeItem} */ (itemsBySlot[0].item); + const shapeItem = /** @type {ShapeItem} */ (processorComp.inputSlots[0]); const slotStatus = []; // Check which slots are enabled @@ -233,7 +226,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { // Check if all colors of the enabled slots are there for (let i = 0; i < slotStatus.length; ++i) { - if (slotStatus[i] && !itemsBySlot[1 + i]) { + if (slotStatus[i] && !processorComp.inputSlots[1 + i]) { // A slot which is enabled wasn't enabled. Make sure if there is anything on the quadrant, // it is not possible to paint, but if there is nothing we can ignore it for (let j = 0; j < 4; ++j) { @@ -262,13 +255,6 @@ export class ItemProcessorSystem extends GameSystemWithFilter { // First, take items const items = processorComp.inputSlots; - processorComp.inputSlots = []; - - /** @type {Object<string, BaseItem>} */ - const itemsBySlot = {}; - for (let i = 0; i < items.length; ++i) { - itemsBySlot[items[i].sourceSlot] = items[i].item; - } /** @type {Array<ProducedItem>} */ const outItems = []; @@ -281,7 +267,6 @@ export class ItemProcessorSystem extends GameSystemWithFilter { handler({ entity, items, - itemsBySlot, outItems, }); @@ -304,6 +289,9 @@ export class ItemProcessorSystem extends GameSystemWithFilter { items: outItems, remainingTime: timeToProcess, }); + + processorComp.inputSlots.length = 0; + processorComp.inputCount = 0; } /** @@ -320,8 +308,9 @@ export class ItemProcessorSystem extends GameSystemWithFilter { const nextSlot = processorComp.nextOutputSlot++ % availableSlots; for (let i = 0; i < payload.items.length; ++i) { + if (!payload.items[i]) continue; payload.outItems.push({ - item: payload.items[i].item, + item: payload.items[i], preferredSlot: (nextSlot + i) % availableSlots, doNotTrack: true, }); @@ -333,7 +322,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_CUTTER(payload) { - const inputItem = /** @type {ShapeItem} */ (payload.items[0].item); + const inputItem = /** @type {ShapeItem} */ (payload.items[0]); assert(inputItem instanceof ShapeItem, "Input for cut is not a shape"); const inputDefinition = inputItem.definition; @@ -354,7 +343,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_CUTTER_QUAD(payload) { - const inputItem = /** @type {ShapeItem} */ (payload.items[0].item); + const inputItem = /** @type {ShapeItem} */ (payload.items[0]); assert(inputItem instanceof ShapeItem, "Input for cut is not a shape"); const inputDefinition = inputItem.definition; @@ -375,7 +364,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_ROTATER(payload) { - const inputItem = /** @type {ShapeItem} */ (payload.items[0].item); + const inputItem = /** @type {ShapeItem} */ (payload.items[0]); assert(inputItem instanceof ShapeItem, "Input for rotation is not a shape"); const inputDefinition = inputItem.definition; @@ -389,7 +378,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_ROTATER_CCW(payload) { - const inputItem = /** @type {ShapeItem} */ (payload.items[0].item); + const inputItem = /** @type {ShapeItem} */ (payload.items[0]); assert(inputItem instanceof ShapeItem, "Input for rotation is not a shape"); const inputDefinition = inputItem.definition; @@ -403,7 +392,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_ROTATER_180(payload) { - const inputItem = /** @type {ShapeItem} */ (payload.items[0].item); + const inputItem = /** @type {ShapeItem} */ (payload.items[0]); assert(inputItem instanceof ShapeItem, "Input for rotation is not a shape"); const inputDefinition = inputItem.definition; @@ -417,8 +406,8 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_STACKER(payload) { - const lowerItem = /** @type {ShapeItem} */ (payload.itemsBySlot[0]); - const upperItem = /** @type {ShapeItem} */ (payload.itemsBySlot[1]); + const lowerItem = /** @type {ShapeItem} */ (payload.items[0]); + const upperItem = /** @type {ShapeItem} */ (payload.items[1]); assert(lowerItem instanceof ShapeItem, "Input for lower stack is not a shape"); assert(upperItem instanceof ShapeItem, "Input for upper stack is not a shape"); @@ -444,8 +433,8 @@ export class ItemProcessorSystem extends GameSystemWithFilter { */ process_MIXER(payload) { // Find both colors and combine them - const item1 = /** @type {ColorItem} */ (payload.items[0].item); - const item2 = /** @type {ColorItem} */ (payload.items[1].item); + const item1 = /** @type {ColorItem} */ (payload.items[0]); + const item2 = /** @type {ColorItem} */ (payload.items[1]); assert(item1 instanceof ColorItem, "Input for color mixer is not a color"); assert(item2 instanceof ColorItem, "Input for color mixer is not a color"); @@ -467,8 +456,8 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_PAINTER(payload) { - const shapeItem = /** @type {ShapeItem} */ (payload.itemsBySlot[0]); - const colorItem = /** @type {ColorItem} */ (payload.itemsBySlot[1]); + const shapeItem = /** @type {ShapeItem} */ (payload.items[0]); + const colorItem = /** @type {ColorItem} */ (payload.items[1]); const colorizedDefinition = this.root.shapeDefinitionMgr.shapeActionPaintWith( shapeItem.definition, @@ -484,9 +473,9 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_PAINTER_DOUBLE(payload) { - const shapeItem1 = /** @type {ShapeItem} */ (payload.itemsBySlot[0]); - const shapeItem2 = /** @type {ShapeItem} */ (payload.itemsBySlot[1]); - const colorItem = /** @type {ColorItem} */ (payload.itemsBySlot[2]); + const shapeItem1 = /** @type {ShapeItem} */ (payload.items[0]); + const shapeItem2 = /** @type {ShapeItem} */ (payload.items[1]); + const colorItem = /** @type {ColorItem} */ (payload.items[2]); assert(shapeItem1 instanceof ShapeItem, "Input for painter is not a shape"); assert(shapeItem2 instanceof ShapeItem, "Input for painter is not a shape"); @@ -514,14 +503,14 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_PAINTER_QUAD(payload) { - const shapeItem = /** @type {ShapeItem} */ (payload.itemsBySlot[0]); + const shapeItem = /** @type {ShapeItem} */ (payload.items[0]); assert(shapeItem instanceof ShapeItem, "Input for painter is not a shape"); /** @type {Array<enumColors>} */ const colors = [null, null, null, null]; for (let i = 0; i < 4; ++i) { - if (payload.itemsBySlot[i + 1]) { - colors[i] = /** @type {ColorItem} */ (payload.itemsBySlot[i + 1]).color; + if (payload.items[i + 1]) { + colors[i] = /** @type {ColorItem} */ (payload.items[i + 1]).color; } } @@ -540,7 +529,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { */ process_READER(payload) { // Pass through the item - const item = payload.itemsBySlot[0]; + const item = payload.items[0]; payload.outItems.push({ item, doNotTrack: true, @@ -560,7 +549,8 @@ export class ItemProcessorSystem extends GameSystemWithFilter { assert(hubComponent, "Hub item processor has no hub component"); for (let i = 0; i < payload.items.length; ++i) { - const item = /** @type {ShapeItem} */ (payload.items[i].item); + if (!payload.items[i]) continue; + const item = /** @type {ShapeItem} */ (payload.items[i]); this.root.hubGoals.handleDefinitionDelivered(item.definition); } } @@ -570,7 +560,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { */ process_GOAL(payload) { const goalComp = payload.entity.components.GoalAcceptor; - const item = payload.items[0].item; + const item = payload.items[0]; const now = this.root.time.now(); if (goalComp.item && !item.equals(goalComp.item)) { @@ -584,7 +574,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { if (this.root.gameMode.getIsEditor()) { // while playing in editor, assign the item - goalComp.item = payload.items[0].item; + goalComp.item = payload.items[0]; } goalComp.lastDelivery = { From d8b34ca43816e418ac362a3c8c7480123ceb6afd Mon Sep 17 00:00:00 2001 From: tobspr <tobias.springer1@gmail.com> Date: Wed, 4 Aug 2021 12:49:01 +0200 Subject: [PATCH 06/12] Minor PR adjustments --- src/js/game/components/item_processor.js | 21 ++++--- src/js/game/systems/item_processor.js | 72 ++++++++++++++---------- 2 files changed, 53 insertions(+), 40 deletions(-) diff --git a/src/js/game/components/item_processor.js b/src/js/game/components/item_processor.js index a3991d1f..f7dddec1 100644 --- a/src/js/game/components/item_processor.js +++ b/src/js/game/components/item_processor.js @@ -73,6 +73,12 @@ export class ItemProcessorComponent extends Component { // Type of processing requirement this.processingRequirement = processingRequirement; + /** + * Our current inputs + * @type {Map<number, BaseItem>} + */ + this.inputSlots = new Map(); + this.clear(); } @@ -82,11 +88,7 @@ export class ItemProcessorComponent extends Component { // sure the outputs always match this.nextOutputSlot = 0; - /** - * Our current inputs - * @type {Array<BaseItem?>} - */ - this.inputSlots = []; + this.inputSlots.clear(); /** * Current input count @@ -121,15 +123,16 @@ export class ItemProcessorComponent extends Component { this.type === enumItemProcessorTypes.goal ) { // Hub has special logic .. not really nice but efficient. - this.inputSlots.push(item); + this.inputSlots.set(this.inputCount, item); this.inputCount++; return true; } // Check that we only take one item per slot - if (this.inputSlots[sourceSlot]) return false; - - this.inputSlots[sourceSlot] = item; + if (this.inputSlots.has(sourceSlot)) { + return false; + } + this.inputSlots.set(sourceSlot, item); this.inputCount++; return true; } diff --git a/src/js/game/systems/item_processor.js b/src/js/game/systems/item_processor.js index cc654968..b57d735c 100644 --- a/src/js/game/systems/item_processor.js +++ b/src/js/game/systems/item_processor.js @@ -32,7 +32,8 @@ const MAX_QUEUED_CHARGES = 2; * Type of a processor implementation * @typedef {{ * entity: Entity, - * items: Array<BaseItem?>, + * items: Map<number, BaseItem>, + * inputCount: number, * outItems: Array<ProducedItem> * }} ProcessorImplementationPayload */ @@ -197,11 +198,11 @@ export class ItemProcessorSystem extends GameSystemWithFilter { const pinsComp = entity.components.WiredPins; // First slot is the shape, so if it's not there we can't do anything - if (!processorComp.inputSlots[0]) { + const shapeItem = /** @type {ShapeItem} */ (processorComp.inputSlots.get(0)); + if (!shapeItem) { return false; } - const shapeItem = /** @type {ShapeItem} */ (processorComp.inputSlots[0]); const slotStatus = []; // Check which slots are enabled @@ -226,7 +227,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { // Check if all colors of the enabled slots are there for (let i = 0; i < slotStatus.length; ++i) { - if (slotStatus[i] && !processorComp.inputSlots[1 + i]) { + if (slotStatus[i] && !processorComp.inputSlots.get(1 + i)) { // A slot which is enabled wasn't enabled. Make sure if there is anything on the quadrant, // it is not possible to paint, but if there is nothing we can ignore it for (let j = 0; j < 4; ++j) { @@ -268,6 +269,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { entity, items, outItems, + inputCount: processorComp.inputCount, }); // Track produced items @@ -290,7 +292,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { remainingTime: timeToProcess, }); - processorComp.inputSlots.length = 0; + processorComp.inputSlots.clear(); processorComp.inputCount = 0; } @@ -307,10 +309,14 @@ export class ItemProcessorSystem extends GameSystemWithFilter { const nextSlot = processorComp.nextOutputSlot++ % availableSlots; - for (let i = 0; i < payload.items.length; ++i) { - if (!payload.items[i]) continue; + // Hardcoded to 2, to avoid accessing the length + for (let i = 0; i < 2; ++i) { + const item = payload.items.get(i); + if (!item) { + continue; + } payload.outItems.push({ - item: payload.items[i], + item, preferredSlot: (nextSlot + i) % availableSlots, doNotTrack: true, }); @@ -322,7 +328,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_CUTTER(payload) { - const inputItem = /** @type {ShapeItem} */ (payload.items[0]); + const inputItem = /** @type {ShapeItem} */ (payload.items.get(0)); assert(inputItem instanceof ShapeItem, "Input for cut is not a shape"); const inputDefinition = inputItem.definition; @@ -343,7 +349,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_CUTTER_QUAD(payload) { - const inputItem = /** @type {ShapeItem} */ (payload.items[0]); + const inputItem = /** @type {ShapeItem} */ (payload.items.get(0)); assert(inputItem instanceof ShapeItem, "Input for cut is not a shape"); const inputDefinition = inputItem.definition; @@ -364,7 +370,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_ROTATER(payload) { - const inputItem = /** @type {ShapeItem} */ (payload.items[0]); + const inputItem = /** @type {ShapeItem} */ (payload.items.get(0)); assert(inputItem instanceof ShapeItem, "Input for rotation is not a shape"); const inputDefinition = inputItem.definition; @@ -378,7 +384,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_ROTATER_CCW(payload) { - const inputItem = /** @type {ShapeItem} */ (payload.items[0]); + const inputItem = /** @type {ShapeItem} */ (payload.items.get(0)); assert(inputItem instanceof ShapeItem, "Input for rotation is not a shape"); const inputDefinition = inputItem.definition; @@ -392,7 +398,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_ROTATER_180(payload) { - const inputItem = /** @type {ShapeItem} */ (payload.items[0]); + const inputItem = /** @type {ShapeItem} */ (payload.items.get(0)); assert(inputItem instanceof ShapeItem, "Input for rotation is not a shape"); const inputDefinition = inputItem.definition; @@ -406,8 +412,8 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_STACKER(payload) { - const lowerItem = /** @type {ShapeItem} */ (payload.items[0]); - const upperItem = /** @type {ShapeItem} */ (payload.items[1]); + const lowerItem = /** @type {ShapeItem} */ (payload.items.get(0)); + const upperItem = /** @type {ShapeItem} */ (payload.items.get(1)); assert(lowerItem instanceof ShapeItem, "Input for lower stack is not a shape"); assert(upperItem instanceof ShapeItem, "Input for upper stack is not a shape"); @@ -433,8 +439,8 @@ export class ItemProcessorSystem extends GameSystemWithFilter { */ process_MIXER(payload) { // Find both colors and combine them - const item1 = /** @type {ColorItem} */ (payload.items[0]); - const item2 = /** @type {ColorItem} */ (payload.items[1]); + const item1 = /** @type {ColorItem} */ (payload.items.get(0)); + const item2 = /** @type {ColorItem} */ (payload.items.get(1)); assert(item1 instanceof ColorItem, "Input for color mixer is not a color"); assert(item2 instanceof ColorItem, "Input for color mixer is not a color"); @@ -456,8 +462,8 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_PAINTER(payload) { - const shapeItem = /** @type {ShapeItem} */ (payload.items[0]); - const colorItem = /** @type {ColorItem} */ (payload.items[1]); + const shapeItem = /** @type {ShapeItem} */ (payload.items.get(0)); + const colorItem = /** @type {ColorItem} */ (payload.items.get(1)); const colorizedDefinition = this.root.shapeDefinitionMgr.shapeActionPaintWith( shapeItem.definition, @@ -473,9 +479,9 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_PAINTER_DOUBLE(payload) { - const shapeItem1 = /** @type {ShapeItem} */ (payload.items[0]); - const shapeItem2 = /** @type {ShapeItem} */ (payload.items[1]); - const colorItem = /** @type {ColorItem} */ (payload.items[2]); + const shapeItem1 = /** @type {ShapeItem} */ (payload.items.get(0)); + const shapeItem2 = /** @type {ShapeItem} */ (payload.items.get(1)); + const colorItem = /** @type {ColorItem} */ (payload.items.get(2)); assert(shapeItem1 instanceof ShapeItem, "Input for painter is not a shape"); assert(shapeItem2 instanceof ShapeItem, "Input for painter is not a shape"); @@ -503,14 +509,15 @@ export class ItemProcessorSystem extends GameSystemWithFilter { * @param {ProcessorImplementationPayload} payload */ process_PAINTER_QUAD(payload) { - const shapeItem = /** @type {ShapeItem} */ (payload.items[0]); + const shapeItem = /** @type {ShapeItem} */ (payload.items.get(0)); assert(shapeItem instanceof ShapeItem, "Input for painter is not a shape"); /** @type {Array<enumColors>} */ const colors = [null, null, null, null]; for (let i = 0; i < 4; ++i) { - if (payload.items[i + 1]) { - colors[i] = /** @type {ColorItem} */ (payload.items[i + 1]).color; + const colorItem = /** @type {ColorItem} */ (payload.items.get(i + 1)); + if (colorItem) { + colors[i] = colorItem.color; } } @@ -529,7 +536,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { */ process_READER(payload) { // Pass through the item - const item = payload.items[0]; + const item = payload.items.get(0); payload.outItems.push({ item, doNotTrack: true, @@ -548,9 +555,12 @@ export class ItemProcessorSystem extends GameSystemWithFilter { const hubComponent = payload.entity.components.Hub; assert(hubComponent, "Hub item processor has no hub component"); - for (let i = 0; i < payload.items.length; ++i) { - if (!payload.items[i]) continue; - const item = /** @type {ShapeItem} */ (payload.items[i]); + // Hardcoded + for (let i = 0; i < payload.inputCount; ++i) { + const item = /** @type {ShapeItem} */ (payload.items.get(i)); + if (!item) { + continue; + } this.root.hubGoals.handleDefinitionDelivered(item.definition); } } @@ -560,7 +570,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { */ process_GOAL(payload) { const goalComp = payload.entity.components.GoalAcceptor; - const item = payload.items[0]; + const item = payload.items.get(0); const now = this.root.time.now(); if (goalComp.item && !item.equals(goalComp.item)) { @@ -574,7 +584,7 @@ export class ItemProcessorSystem extends GameSystemWithFilter { if (this.root.gameMode.getIsEditor()) { // while playing in editor, assign the item - goalComp.item = payload.items[0]; + goalComp.item = item; } goalComp.lastDelivery = { From 599cc7cf9f59042aa0ad605b73786e002f50c7e4 Mon Sep 17 00:00:00 2001 From: Sense101 <67970865+Sense101@users.noreply.github.com> Date: Wed, 4 Aug 2021 11:50:31 +0100 Subject: [PATCH 07/12] fixed allowing puzzles which autocomplete (#1262) --- src/js/game/hud/parts/puzzle_editor_review.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/game/hud/parts/puzzle_editor_review.js b/src/js/game/hud/parts/puzzle_editor_review.js index 727006d6..4a044ba5 100644 --- a/src/js/game/hud/parts/puzzle_editor_review.js +++ b/src/js/game/hud/parts/puzzle_editor_review.js @@ -81,7 +81,7 @@ export class HUDPuzzleEditorReview extends BaseHUDPart { closeLoading(); //if it took so little ticks that it must have autocompeted - if (simulatedTicks <= 300) { + if (simulatedTicks <= 500) { this.root.hud.parts.dialogs.showWarning( T.puzzleMenu.validation.title, T.puzzleMenu.validation.autoComplete From 9c5658c66817c8334641c0ba0883bf5ec0fa830c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=B6ller?= <m2@email.dk> Date: Wed, 4 Aug 2021 12:51:07 +0200 Subject: [PATCH 08/12] Mere dansk (#1264) * Update base-da.yaml * En hel del mere dansk * Tweaked some translations * Commit conflicts resolved * Typos --- translations/base-da.yaml | 687 +++++++++++++++++++------------------- 1 file changed, 339 insertions(+), 348 deletions(-) diff --git a/translations/base-da.yaml b/translations/base-da.yaml index 1e6b329f..3ad0e9e5 100644 --- a/translations/base-da.yaml +++ b/translations/base-da.yaml @@ -1,3 +1,4 @@ +#commit:1.1 steamPage: shortText: Shapez.io handler om at bygge fabrikker på en grænseløs spilleflade for automatisk at skabe og kombinere figurer, der i stigende grad bliver @@ -7,14 +8,12 @@ steamPage: Shapez.io er et afslappet spil hvor du skal bygge fabrikker for at automatisere productionen af geometriske figurer. - Jo længer du når, jo mere kompliseret bliver figurene, og du bliver nød til at spræde dig ud på den grænseløse spilleflade. + Jo længere du når, jo mere kompliceret bliver figurerne, og du bliver nød til at sprede dig ud på den grænseløse spilleflade. - og hvis det ikke var nok, så skal du også producere eksponentielt flere figurer for at møde behovene spillet giver dig - det eneste der virker er skalering! + Og, hvis det ikke var nok, så skal du også producere eksponentielt flere figurer for at møde behovene spillet giver dig - det eneste der virker er skalering! Mens du i starten kun laver former, skal du senere farvelægge dem - for at gøre dette skal du udvinde og blande farver! - Mens du i starten kun laver former, skal du senere farvelægge dem - for at gøre dette skal du udvinde og blande farver! - - At købe spllet på Steam, giver dig adgang til det fulde spil, men du kan også spille en demo version på shapez.io og vælge senere! - what_others_say: What people say about shapez.io + Køb spillet på Steam, det giver dig adgang til det fulde spil, men du kan også spille en demo version på shapez.io og vælge senere! + what_others_say: Hvad andre siger om shapez.io nothernlion_comment: This game is great - I'm having a wonderful time playing, and time has flown by. notch_comment: Oh crap. I really should sleep, but I think I just figured out @@ -61,7 +60,7 @@ mainMenu: play: Spil continue: Fortsæt newGame: Nyt Spil - changelog: Changelog + changelog: Ændringsliste subreddit: Reddit importSavegame: Importér openSourceHint: Dette spil er open source! @@ -72,13 +71,12 @@ mainMenu: browser! Køb spillet eller download chrome for den fulde oplevelse. savegameLevel: Niveau <x> savegameLevelUnknown: Ukendt Niveau - savegameUnnamed: Unnamed - puzzleMode: Puzzle Mode - back: Back - puzzleDlcText: Do you enjoy compacting and optimizing factories? Get the Puzzle - DLC now on Steam for even more fun! - puzzleDlcWishlist: Wishlist now! - puzzleDlcViewNow: View Dlc + savegameUnnamed: Uden Navn + puzzleMode: Puzzle Tilstand + back: Tilbage + puzzleDlcText: Synes du det er det sjovt at gøre maskinerne mindre og mere optimal? Få fat i DLC på Steam nu for mere sjov! + puzzleDlcWishlist: Wishlist den nu! + puzzleDlcViewNow: Se DLC dialogs: buttons: ok: OK @@ -91,10 +89,10 @@ dialogs: deleteGame: Jeg ved hvad jeg laver viewUpdate: Se Opdatering showUpgrades: Vis Opgraderinger - showKeybindings: Vis Keybindings - retry: Retry - continue: Continue - playOffline: Play Offline + showKeybindings: Vis tastefunktioner + retry: Genprøv + continue: Fortsæt + playOffline: Spil Offline importSavegameError: title: Import Fejl text: "Importering af gemt spil fejlede:" @@ -106,9 +104,8 @@ dialogs: text: "Det lykkedes ikke at åbne dit gemte spil:" confirmSavegameDelete: title: Bekræft sletning - text: Are you sure you want to delete the following game?<br><br> - '<savegameName>' at level <savegameLevel><br><br> This can not be - undone! + text: Er du sikker på du vil slette dette spil?<br><br> + '<savegameName>' på niveau <savegameLevel><br><br> Dette kan ikke fortrydes! savegameDeletionError: title: Sletning fejlede text: "Det lykkedes ikke at slette dit gemte spil:" @@ -119,12 +116,12 @@ dialogs: title: Ændr Keybinding desc: Tryk på knappen du vil bruge, eller escape for at fortryde. resetKeybindingsConfirmation: - title: Nulstil keybindings - desc: Dette vil nulstille alle keybindings til deres standarder. Bekræft + title: Nulstil tastefunktioner + desc: Dette vil nulstille alle tastefunktioner til deres standarder. Bekræft venligst. keybindingsResetOk: - title: Keybindings nulstillet - desc: Keybindings er nulstillet til deres standarder! + title: Tastefunktioner nulstillet + desc: Tastefunktioner er nulstillet til deres standarder! featureRestriction: title: Demoversion desc: Du prøvede at bruge en funktion (<feature>) der ikke er tilgængelig i @@ -137,10 +134,9 @@ dialogs: title: Ny opdatering! desc: "Dette har ændret sig siden sidst du spillede:" upgradesIntroduction: - title: Få Opgraderinger - desc: Alle figurer du producerer kan blive brugt til at få opgraderinger - - <strong>Ødelæg ikke dine gamle fabrikker!</strong> - Opgraderingeringsvinduet kan findes i det øverste højre hjørne af + title: Få Forbedringer + desc: Alle figurer du producerer kan blive brugt til at få forbedringer - <strong>Ødelæg ikke dine gamle fabrikker!</strong> + Forbedringsvinduet kan findes i det øverste højre hjørne af skærmen. massDeleteConfirm: title: Bekræft sletning @@ -152,7 +148,7 @@ dialogs: på at det er det du vil gøre? blueprintsNotUnlocked: title: Ikke tilgængeligt endnu - desc: Gennemfør Niveau 12 for at bruge arbejdstegninger! + desc: Gennemfør Niveau 12 for at bruge skabeloner! keybindingsIntroduction: title: Brugbare keybindings desc: "Dette spil har mange keybindings, som gør det lettere at bygge store @@ -164,11 +160,11 @@ dialogs: transportbånd.<br>" createMarker: title: Ny Markør - desc: Give it a meaningful name, you can also include a <strong>short - key</strong> of a shape (Which you can generate <link>here</link>) titleEdit: Rediger Markør + + desc: "Giv det et meningsfyldt navn. Du kan også inkludere en <strong> kort nøgle</strong> af en figur (som du kan lave <link>her</link>)" markerDemoLimit: - desc: Du kan kun lave to markører i demoen. Køb spillet for uendelige markører! + desc: Du kan kun lave to markører i demoen. Køb spillet for uendeligt mange markører! exportScreenshotWarning: title: Eksporter skærmbillede desc: Du bad om at eksportere din fabrik som et skærmbillede. Bemærk at dette @@ -180,90 +176,97 @@ dialogs: vil klippe det? editSignal: title: Set Signal - descItems: "Choose a pre-defined item:" - descShortKey: ... or enter the <strong>short key</strong> of a shape (Which you - can generate <link>here</link>) + descItems: "Vælg en standard figur:" + descShortKey: ... eller indtast <strong>kort nøgle</strong> af en figur (som du kan lave <link>her</link>) renameSavegame: - title: Rename Savegame - desc: You can rename your savegame here. + title: Omdøb gemt spil + desc: Du kan omdøbe dine gemte spil her. tutorialVideoAvailable: - title: Tutorial Available - desc: There is a tutorial video available for this level! Would you like to - watch it? + title: Vejledning tilgængelig + desc: Der findes en vejldning som video for dette niveau, vil du se den? tutorialVideoAvailableForeignLanguage: title: Tutorial Available desc: There is a tutorial video available for this level, but it is only available in English. Would you like to watch it? editConstantProducer: - title: Set Item + title: Set Figur + puzzleLoadFailed: - title: Puzzles failed to load - desc: "Unfortunately the puzzles could not be loaded:" + title: Puslerne kunne ikke indlæses + desc: >- + Desværre kunne puslerne ikke indlæses: + submitPuzzle: - title: Submit Puzzle - descName: "Give your puzzle a name:" - descIcon: "Please enter a unique short key, which will be shown as the icon of - your puzzle (You can generate them <link>here</link>, or choose one - of the randomly suggested shapes below):" - placeholderName: Puzzle Title + title: Indsend pusle + descName: Giv dit pusle et navn + descIcon: >- + Venligst angiv en kort nøgle, som bliver vist som ikon af + dit pusle (Du kan lave nøgler <link>her</link>, eller vælge en af + de tilfældige forneden): + + placeholderName: Pusle Overskift puzzleResizeBadBuildings: - title: Resize not possible - desc: You can't make the zone any smaller, because then some buildings would be - outside the zone. + title: Kan ikke ændre størrelse + desc: Du kan ikke lave området mindre fordi så vil nogle bygninger falde udenfor området. puzzleLoadError: - title: Bad Puzzle - desc: "The puzzle failed to load:" + title: Dårlig Pusle + desc: >- + Puslet kunne ikke indlæses: + offlineMode: - title: Offline Mode - desc: We couldn't reach the servers, so the game has to run in offline mode. - Please make sure you have an active internet connection. + title: Offline tilstand + desc: >- + Vi kan ikke forbinde til serverne og spillet kører i offline tilstand. + Venligst kontroler at du har en fungerende internet forbindelse. puzzleDownloadError: - title: Download Error - desc: "Failed to download the puzzle:" + title: Download Fejl + desc: >- + Kunne ikke hente puslet: puzzleSubmitError: - title: Submission Error - desc: "Failed to submit your puzzle:" + title: Indsendelse fejl + desc: >- + Kunne ikke indsende dit pusle: puzzleSubmitOk: - title: Puzzle Published - desc: Congratulations! Your puzzle has been published and can now be played by - others. You can now find it in the "My puzzles" section. + title: Pusle offentliggjort + desc: Tilykke! Dit Pusle er nu offentliggjort and kan spilles af andre. Du kan nu finde det under 'Mine Pusler'. puzzleCreateOffline: - title: Offline Mode - desc: Since you are offline, you will not be able to save and/or publish your - puzzle. Would you still like to continue? + title: Offline tilstand + desc: Da du er offline kan du ikke gemme eller offentliggøre dit pusle. + Vil du fortsætte alligevel? puzzlePlayRegularRecommendation: - title: Recommendation - desc: I <strong>strongly</strong> recommend playing the normal game to level 12 - before attempting the puzzle DLC, otherwise you may encounter - mechanics not yet introduced. Do you still want to continue? + title: Anbefaling + desc: Det <strong>anbefales stærkt</strong> at spille mindst til niveau 12 + før du forsøger Pusle DLC'en da du vil møde spil mekanik som du ikke + er introduceret til endnu. Vil du alligevel fortsætte? puzzleShare: - title: Short Key Copied - desc: The short key of the puzzle (<key>) has been copied to your clipboard! It - can be entered in the puzzle menu to access the puzzle. + title: Kort Nøgle Kopieret + desc: Den korte nøgle af Pusle (<key>)er kopieret til din udklipsholder! + Den kan sættes ind i Pusle menuen som adgangspunkt puzzleReport: - title: Report Puzzle + title: Anmeld Pusle options: - profane: Profane - unsolvable: Not solvable + profane: Ukvemsord + unsolvable: Kan ikke løses trolling: Trolling puzzleReportComplete: - title: Thank you for your feedback! - desc: The puzzle has been flagged. + title: Tak for din tilbagemeldning! + desc: Puslet er øremærket. puzzleReportError: - title: Failed to report - desc: "Your report could not get processed:" + title: Tilbagemeldning fejlede + desc: >- + Din tilbagemeldning kunne ikke behandles: puzzleLoadShortKey: - title: Enter short key - desc: Enter the short key of the puzzle to load it. + title: Indtast kort nøgle + desc: Indtast den korte nøgle af puslet for at indlæse det. puzzleDelete: - title: Delete Puzzle? - desc: Are you sure you want to delete '<title>'? This can not be undone! + title: Slet Pusle? + desc: Er du helt sikker på du vil slette '<title>'? Dette kan ikke fortrydes! ingame: keybindingsOverlay: moveMap: Bevæg dig selectBuildings: Marker område stopPlacement: Stop placering - rotateBuilding: Roter bygning + rotateBuilding: Drej bygning placeMultiple: Placer flere reverseOrientation: Omvend retning disableAutoOrientation: Slå automatisk retning fra @@ -271,15 +274,15 @@ ingame: placeBuilding: Placer bygning createMarker: Lav Markør delete: Slet - pasteLastBlueprint: Sæt sidste arbejdstegning ind - lockBeltDirection: Aktiver bælteplanlægger + pasteLastBlueprint: Sæt sidste skabelon ind + lockBeltDirection: Aktiver båndplanlægger plannerSwitchSide: Vend planlægsningsside cutSelection: Klip copySelection: Kopier clearSelection: Ryd Selektion pipette: Pipette switchLayers: Skift Lag - clearBelts: Clear belts + clearBelts: Ryd bånd colors: red: Rød green: Grøn @@ -288,46 +291,47 @@ ingame: purple: Lilla cyan: Cyan white: Hvid - uncolored: Ingen farve + uncolored: Farveløs black: Sort buildingPlacement: cycleBuildingVariants: Tryk <key> for at vælge type. - hotkeyLabel: "Hotkey: <key>" + hotkeyLabel: >- + Hotkey: <key> infoTexts: speed: Fart range: Rækkevidde storage: Opbevaring - oneItemPerSecond: 1 genstand / sekund - itemsPerSecond: <x> genstande / s + oneItemPerSecond: 1 figur / sekund + itemsPerSecond: <x> figurer / s itemsPerSecondDouble: (x2) - tiles: <x> flader + tiles: <x> fliser levelCompleteNotification: levelTitle: Niveau <level> completed: Klaret unlockText: <reward> er nu tilgængelig! buttonNextLevel: Næste Niveau notifications: - newUpgrade: En ny opgradering er tilgængelig! + newUpgrade: En ny forbedring er tilgængelig! gameSaved: Dit spil er gemt. - freeplayLevelComplete: Level <level> er blevet fuldført! + freeplayLevelComplete: Niveau <level> er blevet fuldført! shop: title: Opgraderinger - buttonUnlock: Opgrader + buttonUnlock: Forbedre tier: Trin <x> - maximumLevel: HØJESTE NIVEAU (Speed x<currentMult>) + maximumLevel: HØJESTE NIVEAU (Fart x<currentMult>) statistics: title: Statistikker dataSources: stored: title: Opbevaret - description: Viser mængden af opbevarede figurer i din centrale bygning. + description: Viser mængden af opbevarede figurer i dit centrale NAV. produced: title: Produceret description: Viser alle de figurer hele din fabrik producerer, inklusiv produkter brugt til videre produktion. delivered: title: Afleveret - description: Viser figurer som er afleveret til din centrale bygning. + description: Viser figurer som bliver afleveret til din centrale NAV. noShapesProduced: Ingen figurer er blevet produceret indtil videre. shapesDisplayUnits: second: <shapes> / s @@ -336,7 +340,7 @@ ingame: settingsMenu: playtime: Spilletid buildingsPlaced: Bygninger - beltsPlaced: Bælter + beltsPlaced: Bånd tutorialHints: title: Har du brug for hjælp? showHint: Vis hint @@ -345,12 +349,12 @@ ingame: cost: Pris waypoints: waypoints: Markører - hub: HUB - description: Venstreklik en markør for at hoppe til den, højreklik for at slette - den.<br><br>Tryk <keybinding> for at lave en markør på det nuværende - sted, eller <strong>højreklik</strong> for at lave en markør på det + hub: NAV + description: Venstreklik på Markøren for at hoppe til det, højreklik for at slette + den.<br><br>Tryk <keybinding> for at lave en Markør på det nuværende + sted, eller <strong>højreklik</strong> for at lave en Markør på det valgte sted. - creationSuccessNotification: Markør er sat. + creationSuccessNotification: Markøren er sat. shapeViewer: title: Lag empty: Tom @@ -358,29 +362,32 @@ ingame: interactiveTutorial: title: Tutorial hints: - 1_1_extractor: Sæt en <strong>udvinder</strong> på toppen af - en<strong>cirkelfigur</strong> for at begynde produktion af den! - 1_2_conveyor: "Forbind udvinderen til din hub med et - <strong>transportbælte</strong>!<br><br>Tip: <strong>Tryk og - træk</strong> bæltet med din mus!" - 1_3_expand: "Dette er <strong>IKKE</strong> et idle game! Byg flere udvindere og - bælter for at færdiggøre målet hurtigere.<br><br>Tip: Hold + 1_1_extractor: >- + Sæt en <strong>udvinder</strong> på toppen af + en <strong>cirkelfigur</strong> for at begynde produktion af den! + 1_2_conveyor: >- + Forbind udvinderen til dit NAV med et + <strong>transportbånd</strong>!<br><br>Tip: <strong>Tryk og + træk</strong> båndet med din mus! + 1_3_expand: >- + Dette er <strong>IKKE</strong> et tomgangs spil! Byg flere udvindere og + transportbånd for at færdiggøre målet hurtigere.<br><br>Tip: Hold <strong>SKIFT</strong> for at sætte flere udvindere, og tryk - <strong>R</strong> for at rotere dem." - 2_1_place_cutter: "Now place a <strong>Cutter</strong> to cut the circles in two - halves!<br><br> PS: The cutter always cuts from <strong>top to - bottom</strong> regardless of its orientation." - 2_2_place_trash: The cutter can <strong>clog and stall</strong>!<br><br> Use a - <strong>trash</strong> to get rid of the currently (!) not - needed waste. - 2_3_more_cutters: "Good job! Now place <strong>2 more cutters</strong> to speed - up this slow process!<br><br> PS: Use the <strong>0-9 - hotkeys</strong> to access buildings faster!" - 3_1_rectangles: "Now let's extract some rectangles! <strong>Build 4 - extractors</strong> and connect them to the hub.<br><br> PS: - Hold <strong>SHIFT</strong> while dragging a belt to activate - the belt planner!" - 21_1_place_quad_painter: Place the <strong>quad painter</strong> and get some + <strong>R</strong> for at rotere dem. + 2_1_place_cutter: >- + Placer en <strong>klipper</strong> for at klippe cirklen i to halvdele!<br><br> + Bemærk: Klippet er altid lodret fra <strong>top til bund</strong> uanset klipperens placering. + 2_2_place_trash: >- + Klipperen kan <strong>stoppe til</strong>!<br><br> Brug + <strong>skraldespanden</strong> for at smide de (for tiden) uønskede rester væk. + 2_3_more_cutters: >- + Godt gjort! Sæt yderelige <strong>2 klippere</strong> for at sætte fart på den langsome process!<br><br> Bemærk: Brug <strong>0-9 + tasterne</strong> for hurtigere indvælge bygningerne! + 3_1_rectangles: >- + Nu skal vi have fat i firkanter! <strong>Byg 4 + udvindere</strong> og forbind dem til dit NAV.<br><br> + Bemærk: Hold <strong>SKIFT</strong> mens du trækker bånd - det aktiverer båndplanlæggeren! + 21_1_place_quad_painter: Placer <strong>quad painter</strong> and get some <strong>circles</strong>, <strong>white</strong> and <strong>red</strong> color! 21_2_switch_to_wires: Switch to the wires layer by pressing @@ -388,9 +395,10 @@ ingame: inputs</strong> of the painter with cables! 21_3_place_button: Awesome! Now place a <strong>Switch</strong> and connect it with wires! - 21_4_press_button: "Press the switch to make it <strong>emit a truthy + 21_4_press_button: >- + Press the switch to make it <strong>emit a truthy signal</strong> and thus activate the painter.<br><br> PS: You - don't have to connect all inputs! Try wiring only two." + don't have to connect all inputs! Try wiring only two. connectedMiners: one_miner: 1 Miner n_miners: <amount> Miners @@ -455,21 +463,22 @@ ingame: except for the Producers and Goal Acceptors - That's the part that the player is supposed to figure out for themselves, after all :) puzzleCompletion: - title: Puzzle Completed! - titleLike: "Click the heart if you liked the puzzle:" - titleRating: How difficult did you find the puzzle? - titleRatingDesc: Your rating will help me to make you better suggestions in the future - continueBtn: Keep Playing + title: Pusle løst! + titleLike: >- + Klik på hjertet hvis du kunne lide puslet: + titleRating: Hvor svært var pusket for dig? + titleRatingDesc: Din vurdering vil hjælpe mig i bedre anbefalinger i fremtiden + continueBtn: Fortsæt spillet menuBtn: Menu puzzleMetadata: - author: Author - shortKey: Short Key - rating: Difficulty score - averageDuration: Avg. Duration - completionRate: Completion rate + author: Forfatter + shortKey: Kort nøgle + rating: Sværhedsgrad + averageDuration: Gnms. varighed + completionRate: Løsnings grad shopUpgrades: belt: - name: Bælter, Fordelere & Tuneller + name: Bånd, Fordelere & Tuneller description: Fart x<currentMult> → x<newMult> miner: name: Udvinding @@ -484,12 +493,13 @@ buildings: hub: deliver: Aflever toUnlock: for at få adgang til - levelShortcut: NIV - endOfDemo: End of Demo +# Denne er også hvad vises i øverste højre hjørne i NAV bygningen + levelShortcut: niveau + endOfDemo: Demo er slut belt: default: - name: Transportbælte - description: Transporterer figurer, hold og træk for at sætte flere. + name: Transportbånd + description: Transporterer figurer. Hold og træk for at placere flere. miner: default: name: Udvinder @@ -500,10 +510,10 @@ buildings: underground_belt: default: name: Tunnel - description: Laver tunneller under bygninger og bælter. + description: Laver tunneller under bygninger og bånd. tier2: name: Tunnel Trin II - description: Laver tunneller under bygninger og bælter. + description: Laver tunneller under bygninger og bånd. cutter: default: name: Klipper @@ -517,7 +527,7 @@ buildings: stå!</strong> rotater: default: - name: Drejer + name: &rotater Drejer description: Drejer figurer 90 grader med uret. ccw: name: Drejer (mod uret) @@ -527,16 +537,15 @@ buildings: description: Drejer figurer 180 grader med uret. stacker: default: - name: Stabler - description: Stabler begge figurer. Hvis de ikke kan sammensmeltes, så sættes - den højre figur oven på den venstre. + name: &stacker Stabler + description: Samler begge figurer. Hvis de ikke kan sammensmeltes, så stables den højre figur oven på den venstre. mixer: default: - name: Farveblander + name: &mixer Farveblander description: Blander to farver med additiv blanding. painter: default: - name: Maler + name: &painter Maler description: Farver hele figuren fra venstre side med farven fra toppen. mirrored: name: Maler @@ -545,23 +554,28 @@ buildings: name: Maler (Dobbelt) description: Farver figurerne fra venstre side med farven fra toppen. quad: - name: Maler (Quad) - description: Allows you to color each quadrant of the shape individually. Only - slots with a <strong>truthy signal</strong> on the wires layer - will be painted! + name: Maler (Firdobblet) + description: Farver særskilt hver firkant af figuren. Kun + indgange med et <strong>Sandt signal</strong> på signal laget + bliver farvelagt! trash: default: - name: Skraldespand + name: &trash Skraldespand description: Tillader input fra alle sider og ødelægger dem. For evigt. wire: default: - name: Energiledning - description: Lader dig transportere energi. + name: &wire Ledning + description: Overfører signaler, som kan være figurer, farver eller Sand/Falsk (1/0). Forskelligt farvede ledinger kan ikke forbindes. + second: - name: Ledning - description: Overfør signaler, som kan være elementer, farver eller boolsk - variabler (1 / 0). Forskellig farvet ledninger kan ikke - forbindes. + name: *wire + description: wire_description_missing + + wire_tunnel: + default: + name: &wire_tunnel Lednings overgang + description: Muliggør to ledninger krydser uden at forbinde til hinanden. + balancer: default: name: Balancer @@ -580,40 +594,29 @@ buildings: description: Splitter et transportbånd til to. storage: default: - name: Storage - description: Stores excess items, up to a given capacity. Prioritizes the left - output and can be used as an overflow gate. - wire_tunnel: - default: - name: Wire Crossing - description: Allows to cross two wires without connecting them. + name: &storage Opbevaringsbuffer + description: Opbevarer overskudende figurer, op til dens kapacitet. Den venstre udgang bruges fortinsvis. Kan bruges til overskuds regulering. constant_signal: default: - name: Constant Signal - description: Emits a constant signal, which can be either a shape, color or - boolean (1 / 0). + name: Konstant Signal + description: Sender et konstant signal, som kan være en figure, farve eller Sand/Falsk (1/0). lever: default: - name: Switch - description: Can be toggled to emit a boolean signal (1 / 0) on the wires layer, - which can then be used to control for example an item filter. + name: Kontakt + description: Sender et Sand/Falsk signal (1 / 0) i ledningslaget, som kan bruges til at kontrolere en bygning, f.eks. en Maler. logic_gate: default: name: AND Gate - description: Emits a boolean "1" if both inputs are truthy. (Truthy means shape, - color or boolean "1") + description: Emits a boolean "1" if both inputs are truthy. (Truthy means shape, color or boolean "1") not: name: NOT Gate - description: Emits a boolean "1" if the input is not truthy. (Truthy means - shape, color or boolean "1") + description: Sender "1", hvis indgangen er Falsk. ("Falsk" her er "0", ingen Figur eller Farve) xor: name: XOR Gate - description: Emits a boolean "1" if one of the inputs is truthy, but not both. - (Truthy means shape, color or boolean "1") + description: Sender "1", hvis en, men ikke begge, indgange er Sand. ("Sand" her er "1", en Figur eller Farve) or: name: OR Gate - description: Emits a boolean "1" if one of the inputs is truthy. (Truthy means - shape, color or boolean "1") + description: Sender "1", hvis mindst en indgang er Sand. ("Sand" her er "1", en Figur eller Farve) transistor: default: name: Transistor @@ -621,14 +624,11 @@ buildings: color or "1"). mirrored: name: Transistor - description: Forwards the bottom input if the side input is truthy (a shape, - color or "1"). + description: Fremsender den nedre indgang, hvis side indgangen er Sand. ("Sand" her er "1", en Figur eller Farve). filter: default: name: Filter - description: Connect a signal to route all matching items to the top and the - remaining to the right. Can be controlled with boolean signals - too. + description: Forbind med et Signal for at matchende elementer føres til toppen og resten til højre Signalet kan også være Sand/Falsk. display: default: name: Display @@ -687,27 +687,27 @@ buildings: storyRewards: reward_cutter_and_trash: title: Klippe Figurer - desc: You just unlocked the <strong>cutter</strong>, which cuts shapes in half - from top to bottom <strong>regardless of its - orientation</strong>!<br><br>Be sure to get rid of the waste, or - otherwise <strong>it will clog and stall</strong> - For this purpose - I have given you the <strong>trash</strong>, which destroys - everything you put into it! + desc: Du har lige fået tilgang til <strong>Klipper</strong>, som skærer figurene + over i midten, fra top til bund, <strong>uanset hvordan klipperen ligger</strong>! + <br><br>Husk at fjerne uønskede rester fra den anden side, ellers vil den <strong>tilstoppe + og gå i stå</strong> - Derfor har du nu også fået <strong>skraldespanden</strong>, som fjerner + alt der kommer i den. reward_rotater: - title: Rotation + title: Drejning desc: <strong>Drejeren</strong> er nu tilgængelig! Den drejer figurer 90 grader med uret. reward_painter: title: Maling - desc: "<strong>Maleren</strong> er nu tilgængelig - Få noget farve med - udvinderen (som du også gør med figurer) og kombiner det med en - farve i maleren for at farve dem!<br><br>PS: Hvis du er farveblind, + desc: >- + <strong>Maleren</strong> er nu tilgængelig - Få noget Farve med + udvinderen (lige som du gør med figurer) og kombiner det med en + farve i maleren for at farvelægge dem!<br><br>Bemærk: Hvis du er farveblind, så er der en <strong>farveblindstilstand</strong> i - indstillingerne!" + indstillingerne! reward_mixer: title: Farveblanding - desc: The <strong>mixer</strong> has been unlocked - It mixes two colors using - <strong>additive blending</strong>! + desc: <strong>Farveblanderen</strong> er nu tilgængeg - Den blander to Farver + på en <strong>additiv</strong> måde! reward_stacker: title: Stabler desc: Du kan du stable figurer med <strong>stableren</strong>! Begge inputs @@ -722,7 +722,7 @@ storyRewards: reward_tunnel: title: Tunnel desc: <strong>Tunnellen</strong> er nu tilgængelig - Du kan nu lave tuneller - under bælter og bygninger! + under bånd og bygninger! reward_rotater_ccw: title: Rotation mod uret desc: Du har fået adgang til en variant af <strong>drejeren</strong> - Den lader @@ -730,10 +730,10 @@ storyRewards: <strong>trykke 'T'</strong>! reward_miner_chainable: title: Kædeudvinder - desc: "You have unlocked the <strong>chained extractor</strong>! It can - <strong>forward its resources</strong> to other extractors so you - can more efficiently extract resources!<br><br> PS: The old - extractor has been replaced in your toolbar now!" + desc: >- + Du har nu adgang til <strong>kædeudvinderen</strong>! Den + <strong>videregiver sin produktion</strong> til tilstødende udvindere + så du nemmere kan udvinde alt!<br><br> Bemærk: Den gamle udvinder er blevet erstattet af den i din værktøjsbjælke! reward_underground_belt_tier_2: title: Tunnel Trin II desc: Du har fået adgang til en variant af <strong>tunnellen</strong> - Den har @@ -751,59 +751,57 @@ storyRewards: og bruger kun en farve i stedet for to. reward_storage: title: Opbevaringsbuffer - desc: You have unlocked the <strong>storage</strong> building - It allows you to - store items up to a given capacity!<br><br> It priorities the left - output, so you can also use it as an <strong>overflow gate</strong>! + desc: <strong>Opbevaringsbuffer</strong> er nu tilgænglig - Den kan opbevare figurer op til dens kapacitet!<br><br> + Den venstre udgang bruges fortinsvis. Kan bruges til <strong>overskuds regulering</strong>.! reward_freeplay: title: Frit spil - desc: You did it! You unlocked the <strong>free-play mode</strong>! This means - that shapes are now <strong>randomly</strong> generated!<br><br> - Since the hub will require a <strong>throughput</strong> from now - on, I highly recommend to build a machine which automatically - delivers the requested shape!<br><br> The HUB outputs the requested - shape on the wires layer, so all you have to do is to analyze it and - automatically configure your factory based on that. + desc: Du gjorde det! Du har nu mulighed for <strong>Frit Spil Tilstand</strong>! + Det betyder at figuren er lavet <strong>tilfældigt</strong>!<br><br> + Da Navet kræver en stor <strong>gennemstrømning</strong> fra nu ad, + anbefaler jeg at du bygger en maskine som automatisk + laver den krævede figur!<br><br> + Navet sender den ønskede figur på Ledningslaget, så du skal "bare" analysere + den og dermed styre din maskine at levere det følgende reward_blueprints: - title: Arbejdstegninger + title: Skabeloner desc: Du kan nu <strong>kopiere og indsætte</strong> dele af din fabrik! Vælg et område (Hold CTRL, og træk med musen), og tryk 'C' for at kopiere det.<br><br>At sætte det ind er <strong>ikke gratis</strong>. Du - skal producere <strong>arbejdstegning figurer</strong> for at have + skal producere <strong>skabelon-figurer</strong> for at have råd til det! (Dem du lige har leveret). no_reward: title: Næste niveau - desc: "Dette niveau gav dig ingen belønninger, men det vil det næste! <br><br> - PS: Du må hellere lade være med at ødelægge din fabrik - Du får brug + desc: >- + Dette niveau gav dig ingen belønninger, men det vil det næste! <br><br> + Bemærk: Du må hellere lade være med at ødelægge din fabrik - Du får brug for <strong>alle</strong> de figurer senere igen for at <strong>få - opgraderinger</strong>!" + opgraderinger</strong>! no_reward_freeplay: title: Næste niveau - desc: Tillykke! Forresten er mere indhold planlagt for den betalte version! + desc: Tillykke! reward_balancer: title: Balancer - desc: The multifunctional <strong>balancer</strong> has been unlocked - It can - be used to build bigger factories by <strong>splitting and merging - items</strong> onto multiple belts! + desc: Denne multifunktionelle <strong>Balancer</strong> er nu tilgænglig - Du kan bygge større fabrikker fordi den kan både <strong> + fordele og samle</strong> figurer mellem flere transportbånd! + reward_merger: - title: Compact Merger - desc: You have unlocked a <strong>merger</strong> variant of the - <strong>balancer</strong> - It accepts two inputs and merges them - into one belt! + title: Samler(kompakt) + desc: Du har nu fået tilgang til <strong>kompakt samler</strong> variationen + af <strong>Balancer</strong>. Den tager figurene fra to bånd og samler på et! + reward_belt_reader: - title: Belt reader - desc: You have now unlocked the <strong>belt reader</strong>! It allows you to - measure the throughput of a belt.<br><br>And wait until you unlock - wires - then it gets really useful! + title: Båndlæser + desc: Du har nu åbnet op for <strong>Båndlæseren</strong>. Den måler gennemstrømning på et bånd. <br><br>Bare vent til du har Ledninger - så bliver den meget nyttig! reward_rotater_180: title: Rotater (180 degrees) - desc: You just unlocked the 180 degrees <strong>rotater</strong>! - It allows - you to rotate a shape by 180 degrees (Surprise! :D) + desc: Du har nu åbnet op for <strong>Drejeren med 180°</strong>! - Nu kan du dreje dine figurer med 180 grader (Overraskelse! :D) reward_display: title: Display - desc: "You have unlocked the <strong>Display</strong> - Connect a signal on the + desc: >- + You have unlocked the <strong>Display</strong> - Connect a signal on the wires layer to visualize it!<br><br> PS: Did you notice the belt reader and storage output their last read item? Try showing it on a - display!" + display! reward_constant_signal: title: Constant Signal desc: You unlocked the <strong>constant signal</strong> building on the wires @@ -829,7 +827,8 @@ storyRewards: regulary.<br><br> Whatever you choose, remember to have fun! reward_wires_painter_and_levers: title: Wires & Quad Painter - desc: "You just unlocked the <strong>Wires Layer</strong>: It is a separate + desc: >- + You just unlocked the <strong>Wires Layer</strong>: It is a separate layer on top of the regular layer and introduces a lot of new mechanics!<br><br> For the beginning I unlocked you the <strong>Quad Painter</strong> - Connect the slots you would like to paint with on @@ -844,7 +843,7 @@ storyRewards: boolean signal (1 / 0) to entirely activate or disable it. reward_demo_end: title: End of Demo - desc: You have reached the end of the demo version! + desc: Det her er slutningen af Demo versionen! settings: title: Indstillinger categories: @@ -943,7 +942,7 @@ settings: enableTunnelSmartplace: title: Smarte Tunneller description: Aktiver for at placering af tunneller automatisk fjerner unødige - bælter. Dette gør igså at du kan trække tunneller så + båndfliser. Dette gør også at du kan trække tunneller så overskydende tunneller fjernes. vignette: title: Vignette @@ -951,73 +950,67 @@ settings: teksten nemmere at læse. rotationByBuilding: title: Rotation baseret på bygningstype - description: Hver bygningstype husker den rotation du sidst satte den til. Dette - kan være komfortabelt hvis du ofte skifter mellem at placere - forskellige bygninger. + description: Hver bygningstype husker den rotation du sidst satte den til. + Dette kan være komfortabelt hvis du ofte skifter mellem at placere forskellige bygninger. compactBuildingInfo: title: Kompakt Bygningsinfo description: Forkorter infobokse til bygninger ved kun at vise deres forhold. - Ellers er en beskrivelse og et billede også vist. + Ellers vises også en beskrivelse og et billede. disableCutDeleteWarnings: title: Slå klip/slet advarsler fra description: Slå advarselsboksene, der dukker op når mere end 100 ting slettes, fra. soundVolume: - title: Sound Volume - description: Set the volume for sound effects + title: Lydstyrke + description: Lydstyrken af lydeffekter musicVolume: - title: Music Volume - description: Set the volume for music + title: Musikstyrke + description: Lydstyrken af musiken. lowQualityMapResources: - title: Low Quality Map Resources - description: Simplifies the rendering of resources on the map when zoomed in to - improve performance. It even looks cleaner, so be sure to try it - out! + title: Lav kvalitets kort ressource + description: Forenkler fremtoningen af figurer på kortet når zommet tæt for at øge spillets ydelse. Det ser også renere ud, så prøv det! + disableTileGrid: - title: Disable Grid - description: Disabling the tile grid can help with the performance. This also - makes the game look cleaner! + title: Slå net fra + description: Slå flise stregerne fra kan øge spillets ydelse. Det gør fremtoningen renere! + clearCursorOnDeleteWhilePlacing: - title: Clear Cursor on Right Click - description: Enabled by default, clears the cursor whenever you right click - while you have a building selected for placement. If disabled, - you can delete buildings by right-clicking while placing a - building. + title: Ryd Cursor med højre klik + description: Normalt slået til. Rydder cursorens indhold hvis du har en bygning parat til placering. Hvis slået fra, så sletter den bygning med højreclick også hvis noget er i cursoren. + lowQualityTextures: - title: Low quality textures (Ugly) - description: Uses low quality textures to save performance. This will make the - game look very ugly! + title: Lav kvalitets texturer (Gremt) + description: Bruger lav kvalitet for at forbedre spillets ydelse. Det får spillet at se gremt ud! + displayChunkBorders: - title: Display Chunk Borders - description: The game is divided into chunks of 16x16 tiles, if this setting is - enabled the borders of each chunk are displayed. + title: Vis klynge grænser + description: Spillet er inddelt i klynger á 16x16 fliser. Dette viser grænsen af hver klynge. + pickMinerOnPatch: - title: Pick miner on resource patch - description: Enabled by default, selects the miner if you use the pipette when - hovering a resource patch. + title: Væg Udvinder på resursefelt + description: Normalt slået til. Hvis du bruger pipette mens du er på en resurseområde, vælges en Udvinder. + simplifiedBelts: - title: Simplified Belts (Ugly) - description: Does not render belt items except when hovering the belt to save - performance. I do not recommend to play with this setting if you - do not absolutely need the performance. + title: Forenklede bånd (Gremt) + description: Skjuler enheder på bånd, med mindre du holder musen over dem, for at øge spillets ydelse. Jeg anbefaler at ikke bruge dette, med mindre din maskines ydelse kræver det. + enableMousePan: - title: Enable Mouse Pan - description: Allows to move the map by moving the cursor to the edges of the - screen. The speed depends on the Movement Speed setting. + title: Tilvælg mus panorering + description: Muliggør at flytte kortet ved føre musen til skærmens kanter. Hastigheden afhænger af anden indstilling. + zoomToCursor: - title: Zoom towards Cursor - description: If activated the zoom will happen in the direction of your mouse - position, otherwise in the middle of the screen. + title: Zoom mod cursor + description: Hvis slået til så vil en zoom være mod musens placering, ellers er det mod skærmens midt. + mapResourcesScale: - title: Map Resources Size - description: Controls the size of the shapes on the map overview (when zooming - out). + title: Kort ressourcer størrelse + description: Styrer størrelsen af figurer på oversigtskortet (når man zoomer ud). rangeSliderPercentage: <amount> % keybindings: - title: Keybindings + title: Tastaturfunktioner hint: "Tip: Husk at bruge CTRL, SKIFT og ALT! De byder på forskellige placeringsmuligheder." - resetKeybindings: Nulstil Keybindings + resetKeybindings: Nulstil tastaturfunktioner categoryLabels: general: Applikation ingame: Spil @@ -1044,7 +1037,7 @@ keybindings: toggleFPSInfo: Slå FPS og Debug Info til/fra switchLayers: Skift lag exportScreenshot: Eksporter hele basen som et billede - belt: Transportbælte + belt: Transportbånd underground_belt: Tunnel miner: Udvinder cutter: Klipper @@ -1058,9 +1051,9 @@ keybindings: rotateInverseModifier: "Modifier: Roter mod uret i stedet" cycleBuildingVariants: Gennemgå Varianter confirmMassDelete: Slet område - pasteLastBlueprint: Sæt sidste arbejdstegning ind + pasteLastBlueprint: Sæt sidste skabelon ind cycleBuildings: Gennemgå bygninger - lockBeltDirection: Slå bælteplanlægger til + lockBeltDirection: Slå båndplanlægger til switchDirectionLockSide: "Planner: Skift side" massSelectStart: Hold og træk for at starte massSelectSelectMultiple: Vælg flere områder @@ -1068,11 +1061,11 @@ keybindings: massSelectCut: Klip område placementDisableAutoOrientation: Slå automatisk rotation fra placeMultiple: Bliv i placeringstilstand - placeInverse: Spejlvend automatisk bælteorientering + placeInverse: Spejlvend automatisk båndorientering menuClose: Luk Menu wire: Energiledning balancer: Balancer - storage: Storage + storage: Opbevaring constant_signal: Constant Signal logic_gate: Logic Gate lever: Switch (regular) @@ -1086,14 +1079,14 @@ keybindings: comparator: Compare item_producer: Item Producer (Sandbox) copyWireValue: "Wires: Copy value below cursor" - rotateToUp: "Rotate: Point Up" - rotateToDown: "Rotate: Point Down" - rotateToRight: "Rotate: Point Right" - rotateToLeft: "Rotate: Point Left" - constant_producer: Constant Producer - goal_acceptor: Goal Acceptor - block: Block - massSelectClear: Clear belts + rotateToUp: "Drejning: Peg Op" + rotateToDown: "Drejning: Peg Ned" + rotateToRight: "Drejning: Peg Højre" + rotateToLeft: "Drejning: Peg Venster" + constant_producer: Konstant udgiver + goal_acceptor: Mål kontrollant + block: Blok + massSelectClear: Ryd bånd about: title: Om dette spil body: >- @@ -1101,7 +1094,7 @@ about: href="https://github.com/tobspr" target="_blank">Tobias Springer</a> (det er mig).<br><br> - Hvis du vil kontribuere, tjek <a href="<githublink>" target="_blank">shapez.io på github</a>.<br><br> + Hvis du vil bidrage, tjek <a href="<githublink>" target="_blank">shapez.io på github</a>.<br><br> Dette spil ville ikke have været muligt uden det fremragende Discord-fælleskab omkring mine spil - Du burde virkelig deltage på <a href="<discordlink>" target="_blank">Discordserveren</a>!<br><br> @@ -1112,58 +1105,56 @@ changelog: title: Changelog demo: features: - restoringGames: Genopretter gem - importingGames: Importerer gem + restoringGames: Genopretter gemte spil + importingGames: Importerer gemte spil oneGameLimit: Afgrænset til et gem - customizeKeybindings: Tilpasser Keybindings + customizeKeybindings: Tilpasse Tastaturfunktioner exportingBase: Eksportere hele basen som et billede settingNotAvailable: Ikke tilgængelig i demoen. tips: - - The hub accepts input of any kind, not just the current shape! - - Make sure your factories are modular - it will pay out! - - Don't build too close to the hub, or it will be a huge chaos! - - If stacking does not work, try switching the inputs. - - You can toggle the belt planner direction by pressing <b>R</b>. - - Holding <b>CTRL</b> allows dragging of belts without auto-orientation. - - Ratios stay the same, as long as all upgrades are on the same Tier. - - Serial execution is more efficient than parallel. - - You will unlock more variants of buildings later in the game! - - You can use <b>T</b> to switch between different variants. - - Symmetry is key! - - You can weave different tiers of tunnels. - - Try to build compact factories - it will pay out! - - The painter has a mirrored variant which you can select with <b>T</b> - - Having the right building ratios will maximize efficiency. - - At maximum level, 5 extractors will fill a single belt. - - Don't forget about tunnels! - - You don't need to divide up items evenly for full efficiency. - - Holding <b>SHIFT</b> will activate the belt planner, letting you place - long lines of belts easily. - - Cutters always cut vertically, regardless of their orientation. - - To get white mix all three colors. - - The storage buffer priorities the first output. - - Invest time to build repeatable designs - it's worth it! - - Holding <b>CTRL</b> allows to place multiple buildings. - - You can hold <b>ALT</b> to invert the direction of placed belts. - - Efficiency is key! - - Shape patches that are further away from the hub are more complex. - - Machines have a limited speed, divide them up for maximum efficiency. - - Use balancers to maximize your efficiency. - - Organization is important. Try not to cross conveyors too much. - - Plan in advance, or it will be a huge chaos! - - Don't remove your old factories! You'll need them to unlock upgrades. - - Try beating level 20 on your own before seeking for help! - - Don't complicate things, try to stay simple and you'll go far. - - You may need to re-use factories later in the game. Plan your factories to - be re-usable. - - Sometimes, you can find a needed shape in the map without creating it with - stackers. - - Full windmills / pinwheels can never spawn naturally. - - Color your shapes before cutting for maximum efficiency. + - Det central NAV modtager alle figurer, ikke kun den aktuelle figur! + - Anstreng dig at fabrikker er modulære - det betaler sig! + - Undgå at bygge for tæt på navet - det bliver hurtigt rodet! + - Hvis stablingen ikke virker, så prøv at bytte de to indgange. + - Du kan vende båndplanlæggerens retning ved at trykke <b>R</b>. + - At holde <b>CTRL</b> muliggør trækning af bånd uden auto retningsændring. + - Forhold forbiver uændred hvis alle foredringer er nået samme niveau. + - Serial udførelse er mere effektive end parallel. + - Der vil låses op for endnu flere varianter af bygninger senere i spillet! + - Du kan bruge <b>T</b> for at skifte mellem varianter af en bygning. + - Symmetri er nøglen! + - Du kan væve mellem de forskellige tuneller. + - Prøv at lave dine fabrikker kompakte - det lønner sig i længden! + - Male værktøjet har en spejlversion - skift mellem dem med <b>T</b> + - Maksimum affektivitet opnås produktions forhold er afstemt. + - Ved højeste niveau vil 5 udvindere lige fylde et transportbånd. + - Glem ikke tuneller! + - Der er ikke behov for en lige fordeling for maksimum effektivitet. + - Hvis <b>SHIFT</b> holdes nede, aktiveres båndplanlæggeren, som gør det + meget nemmere at placere lange bånd. + - Klipperen skærer altid lodret, uanset placering. + - For at lave hvis skal alle tre farver blandes sammen. + - Opbevaringsbufferen fortrækker venstre udgang. + - Invester lidt tid i genbrugbare designs - det lønner sig! + - Ved at holde <b>CTRL</b> kan du placere placere flere bygninger. + - Med <b>ALT</b> holdt nede, vendes retning af båndet ved placering. + - Effektivitet er nøglen! + - Figure-felterne bliver mere komplex længere væk fra Centralen. + - Maskinerne har begrænset fart - del arbejdet op for effektivitet. + - Brug Fordeleren for at øge effektiviteten. + - Organisation er vigtig. Undgå for mange bånd der krydser hinanden. + - Plan i forvejen, eller det bliver en gang rod! + - undlad at slette dine gamle maskiner! Du behover dem for figurer til Forbedringer. + - Prøv at komme til niveau 20 inden du søger om hjælp! + - Undgå at gøre det kompliceret - enkelhed kan komme langt. + - Det kan være at at du skal genbruge en maskine senere. Lav maskinerne så de er nemme at genbruge. + - Nogle gange kan du finde en ønsket figur på kortet, uden at behove lave den med stackere. + - En fuld vindmølle-figur findes ikke på kortet. + - Fervelæg figurere inden du skærer dem op for bedre effektivitet. - With modules, space is merely a perception; a concern for mortal men. - - Make a separate blueprint factory. They're important for modules. - - Have a closer look on the color mixer, and your questions will be answered. - - Use <b>CTRL</b> + Click to select an area. + - Lav en seperat maskine for skabelon-figuren. De er vigtige for moduler. + - Kig tæt på Farveblander ikonet. Det svarer på farve spørgsmål. + - Husk <b>CTRL</b> + museklick for at indvælge et område. - Building too close to the hub can get in the way of later projects. - The pin icon next to each shape in the upgrade list pins it to the screen. - Mix all primary colors together to make white! From 1b34346c0b4ab39325230dc656cbc4092557bb7b Mon Sep 17 00:00:00 2001 From: tobspr <tobias.springer1@gmail.com> Date: Wed, 4 Aug 2021 12:52:45 +0200 Subject: [PATCH 09/12] Closes 1266 --- src/js/game/modes/regular.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/js/game/modes/regular.js b/src/js/game/modes/regular.js index 87bb764f..7fcfbf60 100644 --- a/src/js/game/modes/regular.js +++ b/src/js/game/modes/regular.js @@ -585,12 +585,12 @@ export class RegularGameMode extends GameMode { } /** @type {(typeof MetaBuilding)[]} */ - this.hiddenBuildings = [ - MetaConstantProducerBuilding, - MetaGoalAcceptorBuilding, - MetaBlockBuilding, - MetaItemProducerBuilding, - ]; + this.hiddenBuildings = [MetaConstantProducerBuilding, MetaGoalAcceptorBuilding, MetaBlockBuilding]; + + // @ts-expect-error + if (!(G_IS_DEV || window.sandboxMode || queryParamOptions.sandboxMode)) { + this.hiddenBuildings.push(MetaItemProducerBuilding); + } } /** From b1b1f8378257cf335215d1aa15dcec3c162542f7 Mon Sep 17 00:00:00 2001 From: Stormweb <66695935+stormweb-dev@users.noreply.github.com> Date: Wed, 4 Aug 2021 12:55:19 +0200 Subject: [PATCH 10/12] Update base-nl.yaml (#1274) * Update base-nl.yaml New translation added * Update base-nl.yaml Fix #1194 --- translations/base-nl.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/translations/base-nl.yaml b/translations/base-nl.yaml index 314ceee8..71ccac92 100644 --- a/translations/base-nl.yaml +++ b/translations/base-nl.yaml @@ -14,7 +14,7 @@ steamPage: Ondanks het feit dat je in het begin alleen vormen maakt, komt er een punt waarop je ze gaat kleuren. Deze kleuren kun je vinden en mengen! Door het spel op Steam te kopen kun je de volledige versie spelen. Je kunt echter ook een demo versie spelen op shapez.io en later beslissen om over te schakelen zonder voortgang te verliezen. - what_others_say: What people say about shapez.io + what_others_say: Wat anderen vinden van shapez.io nothernlion_comment: This game is great - I'm having a wonderful time playing, and time has flown by. notch_comment: Oh crap. I really should sleep, but I think I just figured out @@ -1166,7 +1166,6 @@ tips: wordt de planner geactiveerd, zodat je gemakkelijk lange rijen kunt plaatsen. - Knippers knippen altijd verticaal, ongeacht hun oriëntatie. - - Meng alle drie de kleuren om wit te krijgen. - De opslagbuffer geeft prioriteit aan de eerste uitvoer. - Investeer tijd om herhaalbare ontwerpen te maken - het is het waard! - Door <b>SHIFT</b> ingedrukt te houden, kunnen meerdere gebouwen worden From 354bb63b0a5780207945955dd341822145ccf2d0 Mon Sep 17 00:00:00 2001 From: Stamen <68441372+xTeamStanly@users.noreply.github.com> Date: Wed, 4 Aug 2021 12:55:45 +0200 Subject: [PATCH 11/12] Updated base-sr.yaml (#1275) * Updated base-sr.yaml Added all translations for Serbian language. This translation is, to my knowledge, 100% complete. * Update base-sr.yaml Fixed yamllint errors. --- translations/base-sr.yaml | 1038 +++++++++++++++++++------------------ 1 file changed, 533 insertions(+), 505 deletions(-) diff --git a/translations/base-sr.yaml b/translations/base-sr.yaml index 4cac7750..7adc7926 100644 --- a/translations/base-sr.yaml +++ b/translations/base-sr.yaml @@ -1,26 +1,26 @@ steamPage: shortText: shapez.io je igra o pravljenju fabrika za automatizaciju stvaranja i spajanja sve složenijih oblika na beskonačno velikoj mapi. - discordLinkShort: Official Discord + discordLinkShort: Oficijalni Diskord intro: >- - Shapez.io is a relaxed game in which you have to build factories for the - automated production of geometric shapes. + Shapez.io je opuštena igra u kojoj gradite fabrike za automatizaciju + proizvodnje geometrijskih oblika. - As the level increases, the shapes become more and more complex, and you have to spread out on the infinite map. + Kako se nivo povećava, oblici postaju sve složeniji, tako da morate da proširite fabriku na beskonačno velikoj mapi. - And as if that wasn't enough, you also have to produce exponentially more to satisfy the demands - the only thing that helps is scaling! + I ako sve to nije dovoljno, moraćete da proizvodite sve više i više oblika kako bi zadovoljili zahteve proizvodnje - jedina stvar koja pomaže je skaliranje! - While you only process shapes at the beginning, you have to color them later - for this you have to extract and mix colors! + Na početku je dovoljno samo da prerađujete oblike, ali kasnije morate da ih farbate - za ovaj posao morate da vadite i mešate boje! - Buying the game on Steam gives you access to the full version, but you can also play a demo on shapez.io first and decide later! - what_others_say: What people say about shapez.io - nothernlion_comment: This game is great - I'm having a wonderful time playing, - and time has flown by. - notch_comment: Oh crap. I really should sleep, but I think I just figured out - how to make a computer in shapez.io - steam_review_comment: This game has stolen my life and I don't want it back. - Very chill factory game that won't let me stop making my lines more - efficient. + Kupovinom ove igre na Steam-u dobijate pristup punoj verziji igre, ali prvo možete da odigrate probnu verziju na shapez.io pa onda da se odlučite kasnije! + what_others_say: Šta pričaju ljudi o shapez.io + nothernlion_comment: Igra je sjajna - vreme je proletelo, + divno sam se proveo igrajući. + notch_comment: Dođavola. Stvarno bi trebao da spavam, ali mislim da sam upravo shvatio + kako da napravim računar u shapez.io + steam_review_comment: Ova igra mi je ukrala život i više ga ne želim nazad. + Veoma opuštena igra o građenju fabrika, koja me stalno tera da prerađujem + fabrike kako bi bile efikasnije. global: loading: Učitavanje error: Greška @@ -52,9 +52,9 @@ global: escape: ESC shift: SHIFT space: SPACE - loggingIn: Logging in + loggingIn: Prijavljivanje demoBanners: - title: Demo Verzija + title: Probna Verzija intro: Nabavite punu igru kako biste otključali sve funkcije! mainMenu: play: Igraj @@ -72,13 +72,13 @@ mainMenu: chrome. savegameLevel: Nivo <x> savegameLevelUnknown: Nepoznat Nivo - savegameUnnamed: Unnamed - puzzleMode: Puzzle Mode - back: Back - puzzleDlcText: Do you enjoy compacting and optimizing factories? Get the Puzzle - DLC now on Steam for even more fun! - puzzleDlcWishlist: Wishlist now! - puzzleDlcViewNow: View Dlc + savegameUnnamed: Neimenovano + puzzleMode: Slagalice + back: Nazad + puzzleDlcText: Uživate u optimizovanju i minimizovanju fabrika? Nabavite ekspanziju sa Slagalicama + na Steam-u, za još više zabave! + puzzleDlcWishlist: Dodaj na listu želja! + puzzleDlcViewNow: Pogledaj ekspanziju dialogs: buttons: ok: OK @@ -92,9 +92,9 @@ dialogs: viewUpdate: Pogledajte ažuriranje showUpgrades: Prikaži Nadogradnje showKeybindings: Prikaži podešavanje tastera - retry: Retry - continue: Continue - playOffline: Play Offline + retry: Pokušaj ponovo + continue: Nastavi + playOffline: Igraj Oflajn importSavegameError: title: Greška prilikom uvoza text: "Neuspešan uvoz sačuvane igre:" @@ -106,9 +106,9 @@ dialogs: text: "Neuspešno učitavanje sačuvane igre:" confirmSavegameDelete: title: Potrvrdi brisanje - text: Are you sure you want to delete the following game?<br><br> - '<savegameName>' at level <savegameLevel><br><br> This can not be - undone! + text: Da li sigurno želite da obrišeš ovu sačuvanu igru?<br><br> + '<savegameName>' nivo <savegameLevel><br><br> Ne možete je vratiti + kasnije! savegameDeletionError: title: Greška prilikom brisanja text: "Neuspešno brisanje sačuvane igre:" @@ -127,16 +127,16 @@ dialogs: title: Podešavanja tastera su resetovana desc: Podešavanja tastera su resetovana na njihove početne vrednosti! featureRestriction: - title: Demo Verzija + title: Probna Verzija desc: Pokušali ste da pristupite funkciji (<feature>) koja nije dostupna u demo verziji. Za puno iskustvo, nabavite samostalnu igru! oneSavegameLimit: title: Ograničen broj sačuvanih igara - desc: Možete imati samo jednu sačuvanu igru u demo verziji. Izbrišite postojeću + desc: Možete imati samo jednu sačuvanu igru u probnoj verziji. Izbrišite postojeću ili nabavite samostalnu igru! updateSummary: title: Novo ažuriranje! - desc: "OVo su promene od zadnjeg igranja:" + desc: "Ovo su promene od zadnjeg igranja:" upgradesIntroduction: title: Oktključaj Nadogradnje desc: Svi oblici koje napravite mogu se iskoristiti za oktljučavanje nadogradnji @@ -167,95 +167,95 @@ dialogs: createMarker: title: Novi Putokaz titleEdit: Uredi Putokaz - desc: Give it a meaningful name, you can also include a <strong>short - key</strong> of a shape (Which you can generate <link>here</link>) + desc: Dajte mu neko smisleno ime, možete koristiti i <strong>kratak kod</strong> + oblika (Koji možete da generišete <link>ovde</link>) markerDemoLimit: - desc: U demo verziji možete imati samo dva putokaza istovremeno. Nabavite + desc: U probnoj verziji možete imati samo dva putokaza istovremeno. Nabavite samostalnu igru za beskonačno mnogo putokaza! exportScreenshotWarning: title: Izvezi sliku ekrana desc: Hoćete da izvezete sliku cele fabrike kao snimak ekrana. Ovaj proces može biti prilično spor za velike fabrike, može se desiti i pucanje igre! editSignal: - title: Set Signal - descItems: "Choose a pre-defined item:" - descShortKey: ... or enter the <strong>short key</strong> of a shape (Which you - can generate <link>here</link>) + title: Postavi Signal + descItems: "Odaberite unapred definisan predmet:" + descShortKey: ... ili unesite <strong>kratak kod</strong> oblika + (Koji možete da generišete <link>ovde</link>) renameSavegame: - title: Rename Savegame - desc: You can rename your savegame here. + title: Preimenujte Sačuvanu igru + desc: Ovde možete preimenovati sačuvanu igru. tutorialVideoAvailable: - title: Tutorial Available - desc: There is a tutorial video available for this level! Would you like to - watch it? + title: Tutorijal je dostpan + desc: Za ovaj nivo je dostupan video tutorijal! Da li želite da ga pogledate? tutorialVideoAvailableForeignLanguage: - title: Tutorial Available - desc: There is a tutorial video available for this level, but it is only - available in English. Would you like to watch it? + title: Tutoijal je dostupan + desc: Za ovaj nivo je dostupan video tutorijal, ali je na engleskom. + Da li želite da ga pogledate? editConstantProducer: - title: Set Item + title: Postavi Predmet puzzleLoadFailed: - title: Puzzles failed to load - desc: "Unfortunately the puzzles could not be loaded:" + title: Učitavanje Slagalice nije uspelo + desc: "Nažalost slagalica nije mogla da se učita:" submitPuzzle: - title: Submit Puzzle - descName: "Give your puzzle a name:" - descIcon: "Please enter a unique short key, which will be shown as the icon of - your puzzle (You can generate them <link>here</link>, or choose one - of the randomly suggested shapes below):" - placeholderName: Puzzle Title + title: Podnesite Slagalicu + descName: "Dajte ime slagalici:" + descIcon: "Molimo da unesete kratak kod, koji će biti ikonica slagalice + (Možete generisati kod <link>ovde</link>, ili možete i da odaberete + jedan od nasumičnih preloženih oblika ispod):" + placeholderName: Naslov Slagalice puzzleResizeBadBuildings: - title: Resize not possible - desc: You can't make the zone any smaller, because then some buildings would be - outside the zone. + title: Promena veličine nije moguća + desc: Ne možete da učinite zonu manjom, zato što će onda neke građevine + biti van zone. puzzleLoadError: - title: Bad Puzzle - desc: "The puzzle failed to load:" + title: Loša Slagalica + desc: "Učitavanje Slagalice nije uspelo:" offlineMode: - title: Offline Mode - desc: We couldn't reach the servers, so the game has to run in offline mode. - Please make sure you have an active internet connection. + title: Oflajn Režim + desc: Ne možemo da pristupimo serverima, zbog toga je igra u oflajn režimu. + Uverite se da imate aktivnu internet vezu. puzzleDownloadError: - title: Download Error - desc: "Failed to download the puzzle:" + title: Greška prilikom preuzimanja + desc: "Preuzimanje slagalica nije uspelo:" puzzleSubmitError: - title: Submission Error - desc: "Failed to submit your puzzle:" + title: Greška prilikom podnošenja + desc: "Greška prilikom podnoženja slagalice:" puzzleSubmitOk: - title: Puzzle Published - desc: Congratulations! Your puzzle has been published and can now be played by - others. You can now find it in the "My puzzles" section. + title: Slagalica objavljena + desc: Čestitamo! Slagalica je objavljena i drugi igrači mogu da je igraju. + Možete je pronaći u delu "Moje slagalice". puzzleCreateOffline: - title: Offline Mode - desc: Since you are offline, you will not be able to save and/or publish your - puzzle. Would you still like to continue? + title: Oflajn Režim + desc: Pošto ste u oflajn režimu, nećete moći da sačuvate i/ili objavljujete + slagalice. Da li ipak želite da nastavite? puzzlePlayRegularRecommendation: - title: Recommendation - desc: I <strong>strongly</strong> recommend playing the normal game to level 12 - before attempting the puzzle DLC, otherwise you may encounter - mechanics not yet introduced. Do you still want to continue? + title: Preporuka + desc: <strong>Strogo</strong> preporučujemo da prvo odigrate normalnu igru do nivoa 12 + pre nego što krenete ekspanziju sa slagalicama, u protivnom + srešćete se nekim delovima igre koje niste videli do sad. + Da li ipak želite da nastavite? puzzleShare: - title: Short Key Copied - desc: The short key of the puzzle (<key>) has been copied to your clipboard! It - can be entered in the puzzle menu to access the puzzle. + title: Kratak kod je iskopiran + desc: Kratak kod ove slagalice (<key>) je iskopiran! + Možete ga uneti u meni slagalica da bi pristupili slagalici. puzzleReport: - title: Report Puzzle + title: Prijavi Slagalicu options: - profane: Profane - unsolvable: Not solvable - trolling: Trolling + profane: Ružne reči ili ponašanje + unsolvable: Nemoguće da se reši + trolling: Neozbiljna slagalica puzzleReportComplete: - title: Thank you for your feedback! - desc: The puzzle has been flagged. + title: Hvala na povratnoj informaciji! + desc: Ova slagalica je označena. puzzleReportError: - title: Failed to report - desc: "Your report could not get processed:" + title: Neuspešno prijavljivanje slagalice + desc: "Zahtev za prijavljivanje slagalice nije mogao biti obrađen:" puzzleLoadShortKey: - title: Enter short key - desc: Enter the short key of the puzzle to load it. + title: Unesite kratak kod + desc: Unesite kratak kod slagalice kako bi je učitali. puzzleDelete: - title: Delete Puzzle? - desc: Are you sure you want to delete '<title>'? This can not be undone! + title: Izbrišite Slagalicu? + desc: Da li sigurno želite da obrišete '<title>'? Ne možete da je vratite kasnije! ingame: keybindingsOverlay: moveMap: Kretanje @@ -271,13 +271,13 @@ ingame: delete: Brisanje pasteLastBlueprint: Nalepi zadnji nacrt lockBeltDirection: Omogući planiranje traka - plannerSwitchSide: Okreni stranu planera + plannerSwitchSide: Okreni smer planera cutSelection: Izreži copySelection: Kopiraj clearSelection: Očisti odabir pipette: Pipeta switchLayers: Promeni sloj - clearBelts: Clear belts + clearBelts: Očisti trake colors: red: Crvena green: Zelena @@ -307,7 +307,7 @@ ingame: notifications: newUpgrade: Nova nadogradnja je dostupna! gameSaved: Igra je sačuvana. - freeplayLevelComplete: Level <level> has been completed! + freeplayLevelComplete: Završen Nivo <level>! shop: title: Nadogradnje buttonUnlock: Nadogradi @@ -365,106 +365,102 @@ ingame: pokretnih traka će ubrzati napredak do cilja.<br><br>Savet: Drži <strong>SHIFT</strong> za postavljanje više rudara istovremeno, a pritisni <strong>R</strong> za okretanje." - 2_1_place_cutter: "Now place a <strong>Cutter</strong> to cut the circles in two - halves!<br><br> PS: The cutter always cuts from <strong>top to - bottom</strong> regardless of its orientation." - 2_2_place_trash: The cutter can <strong>clog and stall</strong>!<br><br> Use a - <strong>trash</strong> to get rid of the currently (!) not - needed waste. - 2_3_more_cutters: "Good job! Now place <strong>2 more cutters</strong> to speed - up this slow process!<br><br> PS: Use the <strong>0-9 - hotkeys</strong> to access buildings faster!" - 3_1_rectangles: "Now let's extract some rectangles! <strong>Build 4 - extractors</strong> and connect them to the hub.<br><br> PS: - Hold <strong>SHIFT</strong> while dragging a belt to activate - the belt planner!" - 21_1_place_quad_painter: Place the <strong>quad painter</strong> and get some - <strong>circles</strong>, <strong>white</strong> and - <strong>red</strong> color! - 21_2_switch_to_wires: Switch to the wires layer by pressing - <strong>E</strong>!<br><br> Then <strong>connect all four - inputs</strong> of the painter with cables! - 21_3_place_button: Awesome! Now place a <strong>Switch</strong> and connect it - with wires! - 21_4_press_button: "Press the switch to make it <strong>emit a truthy - signal</strong> and thus activate the painter.<br><br> PS: You - don't have to connect all inputs! Try wiring only two." + 2_1_place_cutter: "Postavi <strong>Rezača</strong> kako bi presekao krug na dve + polovine!<br><br> PS: Rezač uvek reže od <strong>vrha ka dnu</strong> + bez obzira na njegovu orijentaciju." + 2_2_place_trash: Rezač može da se <strong>začepi i stane sa radom</strong>!<br><br> Koristite + <strong>smeće</strong> kako bi se rešili trenutno (!) neželjenog otpada. + 2_3_more_cutters: "Super! Postavi još <strong>2 rezača</strong> kako bi + ubrzali ovaj ovaj spor proces!<br><br> PS: Koristite <strong>prečice 0-9</strong> + koje brže pristupaju građevinama!" + 3_1_rectangles: "Hajdemo sada da iskopamo pravougaonike! <strong>Postavi 4 + rudara</strong> i poveži ih na središte.<br><br> PS: + Zadrži <strong>SHIFT</strong> dok prevlačiš pokretne trake kako bi aktivirao + planiranje traka!" + 21_1_place_quad_painter: Postavi <strong>četvorostrukog farbača</strong> i oboji + <strong>krugove</strong> u <strong>belu</strong> and + <strong>crvenu</strong> boju! + 21_2_switch_to_wires: Pritisni strong>E</strong> kako bi promenio sloj + na sloj žica!<br><br> Zicama <strong>poveži sva četiri + ulaza</strong> farbača! + 21_3_place_button: Fenomenalno! Sada postavi <strong>Prekidač</strong> i poveži + ga žicama! + 21_4_press_button: "Kako bi aktivirao farbača, pritisni prekidač i on + <strong>će emitovati tačan signal</strong> + i tim signalom će pokrenuti farbanje.<br><br> PS: Ne + morate da povežete sve ulaze! Za sada probajte samo dva." connectedMiners: - one_miner: 1 Miner - n_miners: <amount> Miners - limited_items: Limited to <max_throughput> + one_miner: 1 Rudar + n_miners: <amount> Rudara + limited_items: Ograničeno na <max_throughput> watermark: - title: Demo version - desc: Click here to see the Steam version advantages! - get_on_steam: Get on steam + title: Probna Verzija + desc: Kliknite ovde da pogledate prednosti Steam verzije! + get_on_steam: Nabavite na Steam-u standaloneAdvantages: - title: Get the full version! - no_thanks: No, thanks! + title: Nabavite punu verziju! + no_thanks: Neka, hvala! points: levels: - title: 12 New Levels - desc: For a total of 26 levels! + title: 12 Novih Nivoa + desc: Ukupno 26 nivoa! buildings: - title: 18 New Buildings - desc: Fully automate your factory! + title: 18 Novih Građevina + desc: U potpunosti automatizujte fabriku! upgrades: - title: ∞ Upgrade Tiers - desc: This demo version has only 5! + title: ∞ Redova Nadogradnje + desc: Probna verzija ima samo 5! markers: - title: ∞ Markers - desc: Never get lost in your factory! + title: ∞ Putokaza + desc: Nikada se nećete izgubiti u fabrici! wires: - title: Wires - desc: An entirely new dimension! + title: Žice + desc: Potpuno nova dimenzija! darkmode: - title: Dark Mode - desc: Stop hurting your eyes! + title: Tamna Tema + desc: Recite stop bolu u očima! support: - title: Support me - desc: I develop it in my spare time! + title: Podržite me + desc: Razvijam igru u slobodno vreme! achievements: - title: Achievements - desc: Hunt them all! + title: Dostignuća + desc: Osvojite ih sve! puzzleEditorSettings: zoneTitle: Zone - zoneWidth: Width - zoneHeight: Height - trimZone: Trim - clearItems: Clear Items - share: Share - report: Report - clearBuildings: Clear Buildings - resetPuzzle: Reset Puzzle + zoneWidth: Širina + zoneHeight: Visina + trimZone: Skrati + clearItems: Očisti Predmete + share: Podeli + report: Prijavi + clearBuildings: Očisti Građevine + resetPuzzle: Restartuj Slagalicu puzzleEditorControls: - title: Puzzle Creator + title: Kreator Slagalica instructions: - - 1. Place <strong>Constant Producers</strong> to provide shapes and - colors to the player - - 2. Build one or more shapes you want the player to build later and - deliver it to one or more <strong>Goal Acceptors</strong> - - 3. Once a Goal Acceptor receives a shape for a certain amount of - time, it <strong>saves it as a goal</strong> that the player must - produce later (Indicated by the <strong>green badge</strong>). - - 4. Click the <strong>lock button</strong> on a building to disable - it. - - 5. Once you click review, your puzzle will be validated and you - can publish it. - - 6. Upon release, <strong>all buildings will be removed</strong> - except for the Producers and Goal Acceptors - That's the part that - the player is supposed to figure out for themselves, after all :) + - 1. Postavite <strong>Stalni Proizvođač</strong> kako bi kasnije pružili oblike i boje igraču + - 2. Napravite jedan ili više oblika koje želite da igrač napravi i dostavite ga jednom + ili više <strong>Ciljnih Blokova</strong> + - 3. Nakon što Ciljni Blok primi određeni oblik na određeno vreme, + on taj oblik <strong>sačuva kao njegov cilj</strong> + koji igrač mora da proizvede kasnije (Naznačeno <strong>zelenom značkom</strong>). + - 4. Klikom na <strong>dugme za zaključavanje</strong> na građevini je onemogućujete. + - 5. Kada kliknete na oceni, slagalica će biti proverena i onda je možete objaviti. + - 6. Nakon objavljivanja, <strong>sve građevine će biti obrisane</strong> + osim Stalnih Proizvođača i Ciljnih Blokova - To je deo koji igrač treba samostalno da reši :) puzzleCompletion: - title: Puzzle Completed! - titleLike: "Click the heart if you liked the puzzle:" - titleRating: How difficult did you find the puzzle? - titleRatingDesc: Your rating will help me to make you better suggestions in the future - continueBtn: Keep Playing - menuBtn: Menu + title: Završena Slagalica! + titleLike: "Klikni na srce ako ti se svidela slagalica:" + titleRating: Koliko ti je bila teška ova slagalica? + titleRatingDesc: Vaša ocena nam pomaže u boljem preporučivanju slagalica + continueBtn: Nastavi da igraš + menuBtn: Meni puzzleMetadata: - author: Author - shortKey: Short Key - rating: Difficulty score - averageDuration: Avg. Duration - completionRate: Completion rate + author: Autor + shortKey: Kratak kod + rating: Težina + averageDuration: Prosečno trajanje + completionRate: Stopa završavanja shopUpgrades: belt: name: Trake, Delioci i Tuneli @@ -482,28 +478,28 @@ buildings: hub: deliver: Dostavite toUnlock: kako bi otključali - levelShortcut: LVL - endOfDemo: End of Demo + levelShortcut: Nivo + endOfDemo: Kraj probne verzije belt: default: name: Pokretna traka - description: Prenosi predmete, drži i prevuci za postavku više njih. + description: Prenosi predmete, drži i prevuci za postavljanje više njih. wire: default: name: Žica description: Omogućava prenos energije. second: - name: Wire - description: Transfers signals, which can be items, colors or booleans (1 / 0). - Different colored wires do not connect. + name: Žica + description: Prenosi signale, koji mogu biti boje ili da/ne vrednosti (1 / 0). + Žice različitih boja se ne mogu povezati. miner: default: name: Rudar description: Postavite ga na oblik koji želite da iskopate. chainable: name: Rudar (Lančani) - description: Postavite ga na oblik koji želite da iskopate. Mogu se ređati jedan - u drugi. + description: Postavite ga na oblik koji želite da iskopate. Mogu se lančano povezati + jedan za drugim. underground_belt: default: name: Tunel @@ -515,12 +511,12 @@ buildings: default: name: Rezač description: Reže oblike od vrha prema dnu i na izlaze daje obe polovine. - <strong>Ako se koristi samo jedan deo, drugi se mora uništiti da - bi se sprečio zastoj!</strong> + <strong>Ako se koristi samo jedan deo, drugi se mora uništiti kako + bi sprečili zastoj!</strong> quad: name: Rezač (četvorostruki) description: Reže oblike na četiri dela. <strong>Ako se koristi samo jedan deo, - ostali se moraju uništiti da bi se sprečio zastoj!</strong> + ostali se moraju uništiti kako bi sprečili zastoj!</strong> rotater: default: name: Obrtač (↻) @@ -529,8 +525,8 @@ buildings: name: Obrtač (↺) description: Okreće oblike za 90 stepeni u smeru suprotnom od kazaljke na satu. rotate180: - name: Rotate (180) - description: Rotates shapes by 180 degrees. + name: Obrtač (180) + description: Okreće oblike za 180 stepeni. stacker: default: name: Slagač @@ -538,7 +534,7 @@ buildings: oblik se postavlja na vrh levog. mixer: default: - name: Mešalica boja + name: Mešalica za boje description: Spaja dve boje koristeći aditivno mešanje boja. painter: default: @@ -552,144 +548,142 @@ buildings: description: Farba ceo oblik na levom ulazu bojom sa gornjeg ulaza. quad: name: Farbač (četvorostruki) - description: Allows you to color each quadrant of the shape individually. Only - slots with a <strong>truthy signal</strong> on the wires layer - will be painted! + description: Omoćugava da ofarbate svaku četvrtinu oblika zasebno. Samo + delovi sa <strong>tačnim signalom</strong> na sloju žica + će biti ofarbati! trash: default: name: Smeće - description: Prima stvar sa svih strana i zauvek ih uništava. + description: Prima stvari sa svih strana i zauvek ih uništava. balancer: default: - name: Balancer - description: Multifunctional - Evenly distributes all inputs onto all outputs. + name: Balanser + description: Ravnomerno raspoređuje sve ulaze na sve izlaze. merger: - name: Merger (compact) - description: Merges two conveyor belts into one. + name: Spajač (kompaktni) + description: Spaja dve pokretne trake u jednu. merger-inverse: - name: Merger (compact) - description: Merges two conveyor belts into one. + name: Spajač (kompaktni) + description: Spaja dve pokretne trake u jednu. splitter: - name: Splitter (compact) - description: Splits one conveyor belt into two. + name: Delilac (kompaktni) + description: Deli jednu pokretnu traku na dve. splitter-inverse: - name: Splitter (compact) - description: Splits one conveyor belt into two. + name: Delilac (kompaktni) + description: Deli jednu pokretnu traku na dve. storage: default: - name: Storage - description: Stores excess items, up to a given capacity. Prioritizes the left - output and can be used as an overflow gate. + name: Skladište + description: Skladišti višak predmeta dok ne dostigne maksimalni kapacitet. Prioritet daje levom izlazu + i može se koristiti kao kapija za prelivanje. wire_tunnel: default: - name: Wire Crossing - description: Allows to cross two wires without connecting them. + name: Žičani Preklopnik + description: Omogućava dvema različitim žicama da se ukrste, bez povezivanja. constant_signal: default: - name: Constant Signal - description: Emits a constant signal, which can be either a shape, color or - boolean (1 / 0). + name: Konstantan Signal + description: Emituje konstantan signal, koji može bili ili oblik ili boja ili da/ne vrednost (1 / 0). lever: default: - name: Switch - description: Can be toggled to emit a boolean signal (1 / 0) on the wires layer, - which can then be used to control for example an item filter. + name: Prekidač + description: Može biti podešen da emituje da/ne vrednost (1 / 0) na sloju žica, + koja posle može biti korišćena za npr. filter predmeta. logic_gate: default: - name: AND Gate - description: Emits a boolean "1" if both inputs are truthy. (Truthy means shape, - color or boolean "1") + name: I Kapija + description: Emituje da/ne vrednost "1" ako su oba ulaza tačna. (Tačno znači oblik, + boja or da/ne vrednost "1") not: - name: NOT Gate - description: Emits a boolean "1" if the input is not truthy. (Truthy means - shape, color or boolean "1") + name: NE Kapija + description: Emituje da/ne vrednost "1" ako ulaz nije tačan. (Tačan znači + oblik, boja ili da/ne vrednost "1") xor: - name: XOR Gate - description: Emits a boolean "1" if one of the inputs is truthy, but not both. - (Truthy means shape, color or boolean "1") + name: EKSILI Kapija + description: Emituje da/ne vrednost "1" ako je jedan od ulaza tačan, ali ne oba. + (Tačan znači oblik, boja ili da/ne vrednost "1") or: - name: OR Gate - description: Emits a boolean "1" if one of the inputs is truthy. (Truthy means - shape, color or boolean "1") + name: ILI Kapija + description: Emituje da/ne vrednost "1" ako je jedan od ulaza tačan. (Tačan znači + oblik, boja ili da/ne vrednost "1") transistor: default: - name: Transistor - description: Forwards the bottom input if the side input is truthy (a shape, - color or "1"). + name: Tranzistor + description: Prosleđuje donji ulaz ako je ulaz sa strane tačan (oblik, + boja ili "1"). mirrored: - name: Transistor - description: Forwards the bottom input if the side input is truthy (a shape, - color or "1"). + name: Tranzistor + description: Prosleđuje donji ulaz ako je ulaz sa strane tačan (oblik, + boja ili "1"). filter: default: name: Filter - description: Connect a signal to route all matching items to the top and the - remaining to the right. Can be controlled with boolean signals - too. + description: Povežite signal kako bi usmerili sve predmete koji se poklapaju na gornji izlaz, + a ostatak odlazi na desni izlaz. Može biti kontrolisano preko da/ne signala. display: default: - name: Display - description: Connect a signal to show it on the display - It can be a shape, - color or boolean. + name: Displej + description: Povežite signal na displej i on će biti prikazan na njemu - Signal može biti + oblik, boja ili da/ne vrednost. reader: default: - name: Belt Reader - description: Allows to measure the average belt throughput. Outputs the last - read item on the wires layer (once unlocked). + name: Čitač Trake + description: Meri propusnost pokretne trake. Na žičanom sloju, na izlaz šalje + poslednje pročitani predmet (tek kada se otključa). analyzer: default: - name: Shape Analyzer - description: Analyzes the top right quadrant of the lowest layer of the shape - and returns its shape and color. + name: Analizator Oblika + description: Analizira gornju desnu četvrtinu najnižeg sloja oblika + i vraća njegov oblik i boju. comparator: default: - name: Compare - description: Returns boolean "1" if both signals are exactly equal. Can compare - shapes, items and booleans. + name: Upoređivač + description: Vraća da/ne vrednost "1" ako su oba ulazna signala jednaka. Mogu se + porediti oblici, predmeti i da/ne vrednosti. virtual_processor: default: - name: Virtual Cutter - description: Virtually cuts the shape into two halves. + name: Virtuelni Rezač + description: Virtuelno reže oblik na dve polovine. rotater: - name: Virtual Rotater - description: Virtually rotates the shape, both clockwise and counter-clockwise. + name: Virtuelni Obrtač + description: Virtuelno okreće oblike, i u smeru kazaljke na satu i suprotno od smera kazaljke na satu. unstacker: - name: Virtual Unstacker - description: Virtually extracts the topmost layer to the right output and the - remaining ones to the left. + name: Virtuelni Razlagač + description: Virtuelno razlaže najviši sloj oblika i šalje ga desni izlaz, a ostatak + šalje na levi izlaz. stacker: - name: Virtual Stacker - description: Virtually stacks the right shape onto the left. + name: Virtualni Slagač + description: Virtuelno slaže oblik sa desnog ulaza na oblik sa levog ulaza. painter: - name: Virtual Painter - description: Virtually paints the shape from the bottom input with the shape on - the right input. + name: Virtual Farbač + description: Virtuelno farba oblik sa donjeg ulaza sa oblikom + sa desnog ulaza. item_producer: default: - name: Item Producer - description: Available in sandbox mode only, outputs the given signal from the - wires layer on the regular layer. + name: Proizvođač predmeta + description: Dostupan samo u Sandbox režimu, na izlaz šalje ulazni signal + sa žičanog sloja na običan sloj. constant_producer: default: - name: Constant Producer - description: Constantly outputs a specified shape or color. + name: Stalni Proizvođač + description: Konstantno na izlaz šalje odabrani oblik ili boju. goal_acceptor: default: - name: Goal Acceptor - description: Deliver shapes to the goal acceptor to set them as a goal. + name: Ciljni Blok + description: Dostavite oblike u ciljni blok kako bi ih postavili kao cilj. block: default: - name: Block - description: Allows you to block a tile. + name: Blok + description: Može da blokira polje. storyRewards: reward_cutter_and_trash: title: Rezanje Oblika - desc: You just unlocked the <strong>cutter</strong>, which cuts shapes in half - from top to bottom <strong>regardless of its - orientation</strong>!<br><br>Be sure to get rid of the waste, or - otherwise <strong>it will clog and stall</strong> - For this purpose - I have given you the <strong>trash</strong>, which destroys - everything you put into it! + desc: <strong>Rezač</strong> je otključan, on reže oblike na dva dela + od vrha prema dnu <strong>bez obzira na njegovu + orijentaciju</strong>!<br><br>Obavezno se rešite ostatka, ili će + u suprotnom će se<strong>začepiti i stati sa radom</strong> - Baš zbog toga + imate <strong>Smeće</strong>, koje uništava + sve što uđe u njega! reward_rotater: title: Obrtanje desc: <strong>Obrtač</strong> je otključan! On okreće oblike za 90 stepeni u @@ -698,7 +692,7 @@ storyRewards: title: Farbanje desc: "<strong>Farbač</strong> je otključan - Boja se (kao i oblici) može rudariti i spojiti s oblikom u farbaču!<br><br>PS: Postoji - <strong>opcija za daltonizam</strong> u podešavanjima!" + <strong>opcija za daltoniste</strong> u podešavanjima!" reward_mixer: title: Mešalica boja desc: <strong>Mešalica boja</strong> je otključana - Ona spaja dve boje @@ -745,9 +739,9 @@ storyRewards: odjednom</strong> po ceni jedne boje umesto dve! reward_storage: title: Skladište - desc: You have unlocked the <strong>storage</strong> building - It allows you to - store items up to a given capacity!<br><br> It priorities the left - output, so you can also use it as an <strong>overflow gate</strong>! + desc: <strong>Skladište</strong> je otključano - Omogućava skadištenje + predmeta dok ne dostigne maksimalni kapacitet!<br><br> Prioritet daje + levom izlazu, može se koristiti kao <strong>kapija za prelivanje</strong>! reward_freeplay: title: Slobodna Igra desc: You did it! You unlocked the <strong>free-play mode</strong>! This means @@ -775,30 +769,29 @@ storyRewards: title: Sledeći Nivo desc: Svaka čast! Više sadržaja je u planu za samostalnu igru! reward_balancer: - title: Balancer - desc: The multifunctional <strong>balancer</strong> has been unlocked - It can - be used to build bigger factories by <strong>splitting and merging - items</strong> onto multiple belts! + title: Balanser + desc: <strong>Balanser</strong> je otključan - Može da + se koristi pri izgradnji većih fabrika tako što + <strong>deli i spaja predmete</strong> na više traka! reward_merger: - title: Compact Merger - desc: You have unlocked a <strong>merger</strong> variant of the - <strong>balancer</strong> - It accepts two inputs and merges them - into one belt! + title: Kompaktni Spajač + desc: Varijacija <strong>balansera</strong>, odnosno <strong>spajač</strong> + je otključan! On prima dva ulaza i spaja ih u jednu traku! reward_belt_reader: - title: Belt reader - desc: You have now unlocked the <strong>belt reader</strong>! It allows you to - measure the throughput of a belt.<br><br>And wait until you unlock - wires - then it gets really useful! + title: Čitač Trake + desc: <strong>Čitač Trake</strong> je otključan! On meri propusnost + pokretne trake.<br><br>Biće vam od velike pomoći, samo se stripite + dok ne otključate žice! reward_rotater_180: - title: Rotater (180 degrees) - desc: You just unlocked the 180 degrees <strong>rotater</strong>! - It allows - you to rotate a shape by 180 degrees (Surprise! :D) + title: Obrtač (180 stepeni) + desc: Otključali ste <strong>obrtač</strong> od 180 stepeni! - On može + da okreće oblike za 180 stepeni (Iznenađenje! :D) reward_display: - title: Display - desc: "You have unlocked the <strong>Display</strong> - Connect a signal on the - wires layer to visualize it!<br><br> PS: Did you notice the belt - reader and storage output their last read item? Try showing it on a - display!" + title: Displej + desc: "<strong>Displej</strong> je otključan - Povežite signal na žičanom + sloju kako bi ga displej prikazao!<br><br> PS: Da li ste primetili da čitač trake + i skladište na izlaz šalju poslednje prošitani predmet? Probajte da ih prikažete + na displeju!" reward_constant_signal: title: Constant Signal desc: You unlocked the <strong>constant signal</strong> building on the wires @@ -807,11 +800,11 @@ storyRewards: <strong>shape</strong>, <strong>color</strong> or <strong>boolean</strong> (1 / 0). reward_logic_gates: - title: Logic Gates - desc: You unlocked <strong>logic gates</strong>! You don't have to be excited - about this, but it's actually super cool!<br><br> With those gates - you can now compute AND, OR, XOR and NOT operations.<br><br> As a - bonus on top I also just gave you a <strong>transistor</strong>! + title: Logičke Kapije + desc: <strong>Logičke Kapije</strong> su otključane! You don't have to be excited + about this, but it's actually super cool!<br><br> Pomoću ovih kapija + možete da radite I, ILI, NE i EKSILI operacije.<br><br> Kao šlag + na tortu, dobijate i <strong>Tranzistor</strong>! reward_virtual_processing: title: Virtual Processing desc: I just gave a whole bunch of new buildings which allow you to @@ -838,15 +831,15 @@ storyRewards: signal from the wires layer or not.<br><br> You can also pass in a boolean signal (1 / 0) to entirely activate or disable it. reward_demo_end: - title: End of Demo - desc: You have reached the end of the demo version! + title: Kraj probne verzije + desc: Došli ste do kraja probne verzije! settings: title: Podešavanja categories: - general: General - userInterface: User Interface - advanced: Advanced - performance: Performance + general: Opšta + userInterface: Korisnički Interfejs + advanced: Napredna + performance: Performanse versionBadges: dev: Razvoj staging: Skela @@ -920,9 +913,12 @@ settings: dark: Tamna light: Svetla refreshRate: - title: Simulacija na 144 Hz - description: Opcija za monitore visoke frekvencije osvežavanja. Ovo može - smanjiti FPS ako je vaš računar prespor. + #Simulacija na 144 Hz + title: Brzina Otkucaja + #Opcija za monitore visoke frekvencije osvežavanja. Ovo može + # smanjiti FPS ako je vaš računar prespor. + description: Podešava koliko se otkucaja u igri dešavaju u jednoj sekundi. Uglavnom, veći broj otkucaja znači veća preciznost ali gori performans. Kod manjeg broja otkucaja + propusnost ne mora biti tačna. alwaysMultiplace: title: Višestruko Postavljanje description: Ako je omogućeno, sve građevine će ostati odabrane nakon što su @@ -944,7 +940,7 @@ settings: čitljiviji. rotationByBuilding: title: Okretanje prema vrsti građevine - description: Svaka građevina pamti smer na koji je bila okrenuta. Ova opcija je + description: Svaka građevina pamti smer na koji je bila okrenuta. Ova opcija se preporučuje ako često menjate vrste građevina koje postavljate. compactBuildingInfo: title: Skraćene Informacije o Građevinama @@ -955,55 +951,53 @@ settings: description: Onemogućuje upozorenje koje se javlja kada režete/brišete više od 100 stvari. soundVolume: - title: Sound Volume - description: Set the volume for sound effects + title: Jačina Zvuka + description: Podesite jačinu zvučnih efekata. musicVolume: - title: Music Volume - description: Set the volume for music + title: Jačina Muzike + description: Podesite jačinu muzike. lowQualityMapResources: - title: Low Quality Map Resources - description: Simplifies the rendering of resources on the map when zoomed in to - improve performance. It even looks cleaner, so be sure to try it - out! + title: Mapa Manjeg Kvaliteta + description: Ova opcija pojednostavljuje simbole na mapi kada su zumirani kako bi + poboljšala performanse. Nekima izgledaju lepše, tako da slobodno možete + da probate! disableTileGrid: - title: Disable Grid - description: Disabling the tile grid can help with the performance. This also - makes the game look cleaner! + title: Onemogući Mrežu + description: Ova opcija onemogućuje mrežu sa poljima i može poboljšati performans. Nekima + ovo izgleda lepše! clearCursorOnDeleteWhilePlacing: - title: Clear Cursor on Right Click - description: Enabled by default, clears the cursor whenever you right click - while you have a building selected for placement. If disabled, - you can delete buildings by right-clicking while placing a - building. + title: Očistite kursor/strelicu desnim klikom + description: Uobičajeno je omogućena ova opcija, briše sa kursora/strelice trenutno odabranu građevinu. + Ako je ova opcija onemogućena, možete očistiti kursor/strelicu desnim klikom dok postavljate građevinu. lowQualityTextures: - title: Low quality textures (Ugly) - description: Uses low quality textures to save performance. This will make the - game look very ugly! + title: Teksture niskog kvaliteta (Ružno) + description: Da bi poboljšala performanse igra će koristiti teksture niskog kvaliteta. + Zbog ovoga će igra izgledati baš ružno! displayChunkBorders: - title: Display Chunk Borders - description: The game is divided into chunks of 16x16 tiles, if this setting is - enabled the borders of each chunk are displayed. + title: Prikazati Ivice Regija + description: Igra je podeljena u regije od 16x16 polja, ako uključite ovu opciju + ivice ovih regija postaće vidljive. pickMinerOnPatch: - title: Pick miner on resource patch - description: Enabled by default, selects the miner if you use the pipette when - hovering a resource patch. + title: Odaberi rudara na rudama + description: Uobičajeno je omogućena ova opcija, kada pipetom odaberete neku rudu, rudar će automatski + biti odabran. simplifiedBelts: - title: Simplified Belts (Ugly) - description: Does not render belt items except when hovering the belt to save - performance. I do not recommend to play with this setting if you - do not absolutely need the performance. + title: Pojednostavljene Pokretne Trake (Ružno) + description: Ne prikazuje predmete na pokretnoj traci. Predmete možete videti ako pređete mišem preko trake. + Ova opcija povećava persormans, ali nije preporučljivo da igrate igru sa ovom opcijom omogućenom, + osim ako vam je performans prejako potreban. enableMousePan: - title: Enable Mouse Pan - description: Allows to move the map by moving the cursor to the edges of the - screen. The speed depends on the Movement Speed setting. + title: Omogučite kretanje po mapi mišem + description: Omogućava kreatanje po mapi pomeranjem kursora/strelice ivicama ekrana. + Brzina kretanja zavisi od opcije Brzina kretanja. zoomToCursor: - title: Zoom towards Cursor - description: If activated the zoom will happen in the direction of your mouse - position, otherwise in the middle of the screen. + title: Zumiraj prema kursoru/strelici + description: Ako je ova opcija odabrana, zumiranje će se vršiti u smeru kursora/strelice, + u suprotnom vrši se prema centru ekrana. mapResourcesScale: - title: Map Resources Size - description: Controls the size of the shapes on the map overview (when zooming - out). + title: Veličina simbola na mapi + description: Kontroliše veličinu simbola na mapi + (kada se vrši odzumiranje mape). rangeSliderPercentage: <amount> % keybindings: title: Tasteri @@ -1027,16 +1021,51 @@ keybindings: mapMoveLeft: Idi Levo mapMoveFaster: Brže kretanje centerMap: Centar mape + mapZoomIn: Zumiraj mapZoomOut: Odzumiraj createMarker: Napravi Putokaz + menuOpenShop: Nadogradnje menuOpenStats: Statistika menuClose: Zatvori Meni + toggleHud: Uključi/Isključi Interfejs toggleFPSInfo: Uključi/Isključi FPS i infomacije o traženju grešaka u kodu switchLayers: Promeni Sloj exportScreenshot: Izvoz slike cele fabrike kao snimak ekrana + + #this version didn't have references or pointers + #so this won't work + # + #belt: *belt + #balancer: *balancer + #underground_belt: *underground_belt + #miner: *miner + #cutter: *cutter + #rotater: *rotater + #stacker: *stacker + #mixer: *mixer + #painter: *painter + #trash: *trash + #storage: *storage + #wire: *wire + #constant_signal: *constant_signal + #logic_gate: Logic Gate + #lever: *lever + #filter: *filter + #wire_tunnel: *wire_tunnel + #display: *display + #reader: *reader + #virtual_processor: *virtual_processor + #transistor: *transistor + #analyzer: *analyzer + #comparator: *comparator + #item_producer: Item Producer (Sandbox) + #constant_producer: *constant_producer + #goal_acceptor: *goal_acceptor + #block: *block + belt: Pokretna traka underground_belt: Tunel miner: Rudar @@ -1047,6 +1076,24 @@ keybindings: painter: Farbač trash: Smeće wire: Žica + balancer: Balanser + storage: Skladište + constant_signal: Konstantan Signal + logic_gate: Logička Kapija + lever: Prekidač (regularan) + filter: Filter + wire_tunnel: Žičani Preklopnik + display: Displej + reader: Čitač Trake + virtual_processor: Virtuelni Rezač + transistor: Transistor + analyzer: Analizator Oblika + comparator: Upoređivač + item_producer: Proizvođač predmeta (Sandbox režim) + constant_producer: Stalni Proizvođač + goal_acceptor: Ciljni Blok + block: Blok + pipette: Pipeta rotateWhilePlacing: Okreni građevinu rotateInverseModifier: "Modifikator: Rotiraj u smeru suprotnom od kazaljke na satu" @@ -1056,36 +1103,19 @@ keybindings: cycleBuildings: Promena Građevine lockBeltDirection: Omogući planer pokretnih traka switchDirectionLockSide: "Planer: Okreni stranu" - massSelectStart: Pritisni i zadrži za za početak + massSelectStart: Pritisni i zadrži za početak massSelectSelectMultiple: Odabir više oblasti massSelectCopy: Kopiranje oblasti massSelectCut: Izrezivanje oblasti placementDisableAutoOrientation: Onemogućite automatsku orijentaciju placeMultiple: Ostanite u modu za postavljanje placeInverse: Automatski okreni orijentaciju pokretnih traka - balancer: Balancer - storage: Storage - constant_signal: Constant Signal - logic_gate: Logic Gate - lever: Switch (regular) - filter: Filter - wire_tunnel: Wire Crossing - display: Display - reader: Belt Reader - virtual_processor: Virtual Cutter - transistor: Transistor - analyzer: Shape Analyzer - comparator: Compare - item_producer: Item Producer (Sandbox) - copyWireValue: "Wires: Copy value below cursor" - rotateToUp: "Rotate: Point Up" - rotateToDown: "Rotate: Point Down" - rotateToRight: "Rotate: Point Right" - rotateToLeft: "Rotate: Point Left" - constant_producer: Constant Producer - goal_acceptor: Goal Acceptor - block: Block - massSelectClear: Clear belts + copyWireValue: "Žice: Kopiraj vrednost ispod kursora/strelice" + rotateToUp: "Obrtač: Gleda Gore" + rotateToDown: "Obrtač: Gleda Dole" + rotateToRight: "Obrtač: Gleda Desno" + rotateToLeft: "Obrtač: Gleda Levo" + massSelectClear: Očisti trake about: title: O Igri body: >- @@ -1097,7 +1127,7 @@ about: Bez odlične Discord zajednice ova igra, kao ni druge, ne bi postojala - Pridružite se <a href="<discordlink>" target="_blank">Discord serveru</a>!<br><br> - <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> je komponovao muziku za igru - On je super.<br><br> + <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> je komponovao muziku za igru - super lik.<br><br> Na kraju svega, veliko hvala mom najboljem prijatelju <a href="https://github.com/niklas-dahl" target="_blank">Niklas-u</a> - Bez naših factorio sesija, ova igra nikad ne bi postojala. changelog: @@ -1111,133 +1141,131 @@ demo: exportingBase: Izvoz slike cele fabrike kao snimak ekrana settingNotAvailable: Nije dostupno u demo verziji. tips: - - The hub accepts input of any kind, not just the current shape! - - Make sure your factories are modular - it will pay out! - - Don't build too close to the hub, or it will be a huge chaos! - - If stacking does not work, try switching the inputs. - - You can toggle the belt planner direction by pressing <b>R</b>. - - Holding <b>CTRL</b> allows dragging of belts without auto-orientation. - - Ratios stay the same, as long as all upgrades are on the same Tier. - - Serial execution is more efficient than parallel. - - You will unlock more variants of buildings later in the game! - - You can use <b>T</b> to switch between different variants. - - Symmetry is key! - - You can weave different tiers of tunnels. - - Try to build compact factories - it will pay out! - - The painter has a mirrored variant which you can select with <b>T</b> - - Having the right building ratios will maximize efficiency. - - At maximum level, 5 extractors will fill a single belt. - - Don't forget about tunnels! - - You don't need to divide up items evenly for full efficiency. - - Holding <b>SHIFT</b> will activate the belt planner, letting you place - long lines of belts easily. - - Cutters always cut vertically, regardless of their orientation. - - To get white mix all three colors. - - The storage buffer priorities the first output. - - Invest time to build repeatable designs - it's worth it! - - Holding <b>CTRL</b> allows to place multiple buildings. - - You can hold <b>ALT</b> to invert the direction of placed belts. - - Efficiency is key! - - Shape patches that are further away from the hub are more complex. - - Machines have a limited speed, divide them up for maximum efficiency. - - Use balancers to maximize your efficiency. - - Organization is important. Try not to cross conveyors too much. - - Plan in advance, or it will be a huge chaos! - - Don't remove your old factories! You'll need them to unlock upgrades. - - Try beating level 20 on your own before seeking for help! - - Don't complicate things, try to stay simple and you'll go far. - - You may need to re-use factories later in the game. Plan your factories to - be re-usable. - - Sometimes, you can find a needed shape in the map without creating it with - stackers. - - Full windmills / pinwheels can never spawn naturally. - - Color your shapes before cutting for maximum efficiency. - - With modules, space is merely a perception; a concern for mortal men. - - Make a separate blueprint factory. They're important for modules. - - Have a closer look on the color mixer, and your questions will be answered. - - Use <b>CTRL</b> + Click to select an area. - - Building too close to the hub can get in the way of later projects. - - The pin icon next to each shape in the upgrade list pins it to the screen. - - Mix all primary colors together to make white! - - You have an infinite map, don't cramp your factory, expand! - - Also try Factorio! It's my favorite game. - - The quad cutter cuts clockwise starting from the top right! - - You can download your savegames in the main menu! - - This game has a lot of useful keybindings! Be sure to check out the - settings page. - - This game has a lot of settings, be sure to check them out! - - The marker to your hub has a small compass to indicate its direction! - - To clear belts, cut the area and then paste it at the same location. - - Press F4 to show your FPS and Tick Rate. - - Press F4 twice to show the tile of your mouse and camera. - - You can click a pinned shape on the left side to unpin it. + - Središte prihvata oblike bilo koje vrste, ne samo trenutni oblik! + - Pravite modularne fabrike koje se mogu lako proširiti - isplatiće se kasnije! + - Izbegavajte gradnju fabrike u blizini središta ili će biti vrlo gusto! + - Ako slaganje oblika ne radi funkcioniše, probajte da zamenite ulaze. + - Možete da promenite smer planera pritiskom na <b>R</b>. + - Držanjem tastera <b>CTRL</b> omogućava prevlačenje trakama bez automatske orijentacije. + - Odnosi ostaju isti, sve dok su sve nadogradnje na istom nivou. + - Serijsko izvršavanje je efikasnije od paralelnog. + - Kasnije u igri ćete otključati još varijanti građevina! + - Možete koristiti <b>T</b> za menjanje izmežu različitih varijanti građevina. + - Simetrija je ključna! + - Možete izmešati tunele različitih redova u jednu liniju. + - Pokušajte da gradite kompaktne fabrike - isplatiće se kasnije! + - Farbač ima drugu varijantu koju možete odabrati pritiskom na <b>T</b> + - Pravilni odnosi povećavaju efikasnost. + - Na maksimalnom nivou, 5 rudara su dovoljna da napune jednu traku. + - Ne zaboravite tunele! + - Ne morate ravnomerno da delite predmete za potpunu efikasnost. + - Držanjem tastera <b>SHIFT</b> aktiviraćete planer traka, koji omogućava postavljanje + dugačkih linija traka sa lakoćom. + - Rezači uvek seku vertikalno, bez obzira na njihovu orijentaciju. + - Bela boja je mešavina svih boja. + - Bafer skladišta daje prioritet prvom izlazu. + - Uložite vreme u izgradnju dizajna koji se ponavljaju - vredeće! + - Držanjem tastera <b>CTRL</b> možete postavljati veći broj građevina odjednom. + - Držanjem tastera <b>ALT</b> možete promeniti smer postavljenih traka. + - Efikasnost je ključna! + - Rude koje dalje od središta su komplikovanije. + - Mašine imaju ograničenu brzinu, podelite ih zarad maksimalne efikasnosti. + - Koristite balansere kako bi povećali efikasnost. + - Organizacija je bitna. Pokušajte da smanjite ukrštanje pokretnih traka. + - Planirajte unapred ili će sve postati gusto! + - Ne uklanjajte stare fabrike! Biće vam potrebne za otključavanje nadogradnji. + - Pokušajte da samostalno završite 20-ti nivo, pre nego što zatražite pomoć! + - Ne komplikujte stvari, pokušajte da pravite što jednostavnije fabrike. + - Možda ćete kasnije morati ponovo da koristite fabrike. Isplanirajte ih tako da budu + ponovo upotrebljive. + - Ponekad možete da nađete potreban oblik na mapi, bez da ga pravite slagačima. + - Kompletne vetrenjače se ne mogu naći na mapi. + - Obojite oblike pre rezanja za maksimalnu efikasnost. + - Koristite module! + - Napravite posebnu fabriku za nacrte, bitna je za module. + - Pažljivo pogledajte sličicu na mešalici boja, ako imate problema sa bojama. + - Držite taster <b>CTRL</b> i prevucite klikom miša kako bi izabrali oblast. + - Izgradnja blizu središta može smetati kasnijim fabrikama. + - Špenadla pored svakog oblika u listi nadogradnji će taj oblik zakačiti na ekran. + - Pomešajte sve osnovne boje kako bi dobili belu boju! + - Mapa je beskonačno velika, izbegavajte pravljenje skučenih fabrika, proširite se! + - Takođe probajte Factorio! To mi je omiljena igra. + - Četvorostruki rezač reže u smeru kazaljke na satu počevši od gornje deve četvrtine! + - Možete da preuzmete sačuvane igre u glavnom meniju! + - Ova igra ima dosta korisnih prečica! Obavezno pogledajte podešavanja. + - Ova igra ima dosta podešavanja, obavezno bacite pogled na njih! + - Putokaz čvorišta ima mali kompas koji pokazuje smer čvorišta! + - Da bi očistili trake, izrežite oblast i onda je nalepite na isto mesto. + - Pritisnite F4 kako bi prikazali FPS i Brzinu Otkucaja. + - Pritisnite dvaput F4 kako bi prikazali lokaciju polja miša i kamere. + - Možete kliknuti na zakačen oblik na levi krstić kako bi ga otkačili. puzzleMenu: - play: Play - edit: Edit - title: Puzzle Mode - createPuzzle: Create Puzzle - loadPuzzle: Load - reviewPuzzle: Review & Publish - validatingPuzzle: Validating Puzzle - submittingPuzzle: Submitting Puzzle - noPuzzles: There are currently no puzzles in this section. + play: Igraj + edit: Uredi + title: Slagalice + createPuzzle: Kreiraj Slagalicu + loadPuzzle: Učitaj + reviewPuzzle: Oceni & Objavi + validatingPuzzle: Proveravanje Slagalice + submittingPuzzle: Podnošenje Slagalice + noPuzzles: Trenutno nemate slagalica ovde. categories: - levels: Levels - new: New - top-rated: Top Rated - mine: My Puzzles - easy: Easy - hard: Hard - completed: Completed - medium: Medium - official: Official - trending: Trending today - trending-weekly: Trending weekly - categories: Categories - difficulties: By Difficulty - account: My Puzzles - search: Search + levels: Nivoi + new: Novo + top-rated: Najbolje ocenjene + mine: Moje Slagalice + easy: Lako + hard: Teško + completed: Završeno + medium: Srednje + official: Oficijalno + trending: Popularno danas + trending-weekly: Popularno nedeljno + categories: Kategorije + difficulties: Po težini + account: Moje Slagalice + search: Pretraga validation: - title: Invalid Puzzle - noProducers: Please place a Constant Producer! - noGoalAcceptors: Please place a Goal Acceptor! - goalAcceptorNoItem: One or more Goal Acceptors have not yet assigned an item. - Deliver a shape to them to set a goal. - goalAcceptorRateNotMet: One or more Goal Acceptors are not getting enough items. - Make sure that the indicators are green for all acceptors. - buildingOutOfBounds: One or more buildings are outside of the buildable area. - Either increase the area or remove them. - autoComplete: Your puzzle autocompletes itself! Please make sure your constant - producers are not directly delivering to your goal acceptors. + title: Slagalica nije validna! + noProducers: Postavite Stalnog Proizvođača! + noGoalAcceptors: Postavite Ciljni Blok! + goalAcceptorNoItem: Jedan ili više Ciljnih Blokova još uvek nemaju dodeljen predmet. + Dostavite oblik kako bi ga postavili kao cilj. + goalAcceptorRateNotMet: Jedan ili više Ciljnih Blokova ne dobijaju dovoljno predmeta. + Budite sigurni da su indikatori zeleni za sve ove blokove. + buildingOutOfBounds: Jedna ili više građevina su van zone izgradnje. + Ili povećajte zonu ili uklonite te građevine. + autoComplete: Vaša slagalica se završava automatski! Uverite se da stalni + proizvođači ne isporučuju direktno ciljnim blokovima. difficulties: - easy: Easy - medium: Medium - hard: Hard - dlcHint: Purchased the DLC already? Make sure it is activated by right clicking - shapez.io in your library, selecting Properties > DLCs. + easy: Lako + medium: Srednje + hard: Teško + dlcHint: Već imate kupljenu ekspanziju? Desnim klikom na shapez.io u vašoj biblioteci, + nakon toga na Properties > DLCs, proverite da li je aktivirana. backendErrors: - ratelimit: You are performing your actions too frequent. Please wait a bit. - invalid-api-key: Failed to communicate with the backend, please try to - update/restart the game (Invalid Api Key). - unauthorized: Failed to communicate with the backend, please try to - update/restart the game (Unauthorized). - bad-token: Failed to communicate with the backend, please try to update/restart - the game (Bad Token). - bad-id: Invalid puzzle identifier. - not-found: The given puzzle could not be found. - bad-category: The given category could not be found. - bad-short-key: The given short key is invalid. - profane-title: Your puzzle title contains profane words. - bad-title-too-many-spaces: Your puzzle title is too short. - bad-shape-key-in-emitter: A constant producer has an invalid item. - bad-shape-key-in-goal: A goal acceptor has an invalid item. - no-emitters: Your puzzle does not contain any constant producers. - no-goals: Your puzzle does not contain any goal acceptors. - short-key-already-taken: This short key is already taken, please use another one. - can-not-report-your-own-puzzle: You can not report your own puzzle. - bad-payload: The request contains invalid data. - bad-building-placement: Your puzzle contains invalid placed buildings. - timeout: The request timed out. - too-many-likes-already: The puzzle alreay got too many likes. If you still want - to remove it, please contact support@shapez.io! - no-permission: You do not have the permission to perform this action. + ratelimit: Previše često pokušavate nešto. Sačekajte malo. + invalid-api-key: Komunikacija sa pozadinskim serverom nije uspela, pokušajte da + ažurirate/restartujete igru (Nevažeći Api Ključ). + unauthorized: Komunikacija sa pozadinskim serverom nije uspela, pokušajte da + ažurirate/restartujete igru (Neovlašćeno). + bad-token: Komunikacija sa pozadinskim serverom nije uspela, pokušajte da + ažurirate/restartujete igru (Loš Token). + bad-id: Nevažeći identifikator slagalice. + not-found: Nije moguće pronaći datu slagalicu. + bad-category: Nije moguće pronaći datu kategoriju. + bad-short-key: Navedeni kratki ključ nije važeći. + profane-title: Vaša slagalica sadrži ružne reči. + bad-title-too-many-spaces: Naslov slagalice je previše kratak. + bad-shape-key-in-emitter: Nevalidan predmet u stalnom proizvođaču. + bad-shape-key-in-goal: Nevalidan predmet u ciljnom bloku. + no-emitters: Slagalica ne sadrži nijedan stalni proizvođač. + no-goals: Slagalica ne sadrži nijedan ciljni blok. + short-key-already-taken: Ovaj kratak kod je već zauzet, molimo da odaberete drugi. + can-not-report-your-own-puzzle: Ne možete prijaviti lične slagalice. + bad-payload: Zahtev sadrži nevažeće podatke. + bad-building-placement: Slagalica sadrži nevažeće postavljene građevine. + timeout: Vreme za izvršenje zahteva je isteklo. + too-many-likes-already: Slagalica ima dosta lajkova. Ako i dalje želite + da je uklonite, molimo da kontaktirate support@shapez.io! + no-permission: Nemate dozvolu za izvršenje ove radnje. From eb628526c9ec77ca10edef096cae6625f4637a55 Mon Sep 17 00:00:00 2001 From: tobspr <tobias.springer1@gmail.com> Date: Wed, 4 Aug 2021 13:44:02 +0200 Subject: [PATCH 12/12] Wegame adjustments --- electron_wegame/wegame.js | 10 +++++- res/logo_wegame.png | Bin 40555 -> 37766 bytes res/ui/wegame_isbn_rating.jpg | Bin 0 -> 5907 bytes src/css/main.scss | 1 + src/css/states/main_menu.scss | 34 +++++++++++++++++++ src/css/states/wegame_splash.scss | 38 ++++++++++++++++++++++ src/js/application.js | 8 ++++- src/js/changelog.js | 11 +++++++ src/js/core/modal_dialog_forms.js | 14 ++++++++ src/js/platform/browser/game_analytics.js | 4 +++ src/js/states/main_menu.js | 33 ++++++++++++++++++- src/js/states/wegame_splash.js | 27 +++++++++++++++ 12 files changed, 177 insertions(+), 3 deletions(-) create mode 100644 res/ui/wegame_isbn_rating.jpg create mode 100644 src/css/states/wegame_splash.scss create mode 100644 src/js/states/wegame_splash.js diff --git a/electron_wegame/wegame.js b/electron_wegame/wegame.js index 43085be8..17072aa3 100644 --- a/electron_wegame/wegame.js +++ b/electron_wegame/wegame.js @@ -1,5 +1,5 @@ const railsdk = require("./wegame_sdk/railsdk.js"); -const { dialog, remote } = require("electron"); +const { dialog, remote, ipcMain } = require("electron"); function init(isDev) { console.log("Step 1: wegame: init"); @@ -47,6 +47,14 @@ function init(isDev) { function listen() { console.log("wegame: listen"); + ipcMain.handle("profanity-check", async (event, data) => { + const result = railsdk.RailUtils.DirtyWordsFilter(data, true); + if (result.check_result.dirty_type !== 0 /** kRailDirtyWordsTypeNormalAllowWords */) { + return result.check_result; + } + + return data; + }); } module.exports = { init, listen }; diff --git a/res/logo_wegame.png b/res/logo_wegame.png index eb7d35fe569a43e9a0ed427cc7dbcfc8e10ef269..ac9092b3f03b0dc9a0f5da98ab2bf5cec32270d0 100644 GIT binary patch literal 37766 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�?r0jGcS^B7QyBXt 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 E2hpVSUjP6A literal 40555 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 E03k4*{Qv*} diff --git a/res/ui/wegame_isbn_rating.jpg b/res/ui/wegame_isbn_rating.jpg new file mode 100644 index 0000000000000000000000000000000000000000..581dd7441669693c323b2dca8674bb7041144c62 GIT binary patch literal 5907 zcmb_gcT`i`(mxP7NTe%L6jZt>T_6NSszN9NQUny?(h-D!v>=Eeh!IePT&Yq-I?}5k zO;G8@pwfE_2uUbOzJu4>-g@_2-}lx#Yn}7YnLRVVncv<svnivL3E;4vmaY~+1wK(! zkpMs$12g~zIy!nfS_XQ0dPYVDCKk>^EX>R-N7*@`ocz3k0{pyue8*3o5jid-Da^+w zswgIT_MDuYoS?{gn39a@8Cf}*10__9jEpSIEJqF<IwEs|?}W_%`=PuA*cgCD;3<Sk z2%u)8g0N9hS^+@-prSqSmWm4a`A|_qXlUu^85o(EL4k_H05uf^LQMmqrKO<(rGvr$ z01X>0`-yWG=s1jS&<lBS%G`^~U=Y4o+RSC#hdU{I(>sijiJRxhQQlLhMMTBK<>VC< zmCh?`T+-Ci*3s27xoT==e$B$t{+5H|FHX)bcYJ)2e*Sj@!tX~sh>Us|9iQ;@S>p4g zWK8DEtn8fJS9!0?-jr8VR#n&3w!CX?YwzfM-_<`bI5a#m`WZVpH9a#sH@~pBw6Xbp zYa34>?(81mq5>el!TJN)zu;m6aZ%IIKxpU>a8XhFfiHxOhW5lcI`#`j^f$aXgk<h9 za9)hdC~amGmNmw4-SqBb;yx)id1~VT+7D#^H(+7^5wbsk{fP?;ut2E5<U!Z~I6!#K z2+5<yth{>k;dc71v<o(heg*!|rw~y^<qdR;1#*Grn{(Ct*9g?FCjxn}$LR%pP=wK} zy(@y>vGBbW^T&#Bx$P6Cn8O11JNCtLC+JC6cmxT36oAPb@;PLHejkq}?{Ws`KzCLJ zNm~-_O_S=V!DcTC5G;s$N#^`h{0w~=={G67=z;cc2ijwyp@Q3Itx@CJ`(miStjwGU z6v5h2fYc2NFn$wV-b?{t(-few&3}Af6uO&q2EGm|N411ffV{A2@-BQ*^DQ3nr<kB~ zI61HbbRv4AiD>w{2~i3VK}7*fXgf$-sFs*}D`|g-sewocX!0J{GzymvU$UzPjiHG~ zAWR53hZ()M050W$eEwbR2jF!<5?-R60{q4AEI4q!2T$slY6rD1N_wWm3)}b3rP+um zwv4kAwMLiJ_(o>qogNeJq1mB&Yh(f92md<VJIXue_>Nl}sp-3Yw^alhM6-JeIp4N! z1fikfzRAKjiz>aJTv$M2rqrnSzcFDh(h*)Hs^y9lB2(okK%9sb1t=CnZE;xJzJ>3w z*^=u7mv!$gA%rs5yt%ZEUBZ{KZU&}n)14H+$y{n0W?)upC7LB3>VUgjbSV^3JUH?! z>I2{DN!rpjbMEOg*Io`aO$zl>fcZ7}-hwfzMKc@KGh<8WEf&YZXwQt_u%-Z5Ulr-r z?&UWt=&Kaqe#~VGkk;9>o}s;e($aRHbP#u@&BB+xM&$ua@bV?3ZB#HaIBuy47w3%n zP5@~FCgOgK-oYvgu%2OK3d$*<FKFXa47xX<MLlIOb27V>1Q{g+W+6iGk7W{F_&p|l zP%kOhq-<Z~z`p6<G#xl#zE9Tt-2vlOfiU!{a>|n*_S1eUniC(Y%y7L+&h$aqxppGM z5Y*X~wW*(cQW-7uQd3Gz`TETX@g>6w=0gH+_uI!cY$R~$aT`|cUXZAkJmyjUq2=A+ z@iCv#dBN5f=m3zR5%5j3eP{9#1z0d$Y0i^)*=w-0fG>iHW@i>SLSx}Gy2BJ;xyzPB zGs1&|k}sK4fTE7w5$9>d4!dvD?&fm}a6!Ip9|9(m3luCRmnX3kU!)Or&PWJ1xDsEI zwV0zj*KMVu$dU~R_TqNZ#c0u0OlxT7lNsar7lQqvOro8uI_J}AGowX;gEz~wHson} zECJCU3R8TSwkiFNyjUzrG@$^eT-(#uipdc+d6PXmJd+f_XXM$w7zK#0m_`slzb+Q% zy#q<F7KP6XV!*%Aq>KL2+q{vx|4@0HbQjEXI%bLtZlTU-3a~v&0W4Qlohg8jK@|nC zF$UqEu5JoNZ3;D!knrIIYFkcJXS3IK!Q<`XDfG^fGinua-x|%DHXN4xpM@wcad{dH z<PNR{CGn(9dFti3_68lhRkC<-+H?KX`JM_J?#Rl#F1&bzw6hBAfrbB>PokyXA0<fs z`OpcHWQM7hap24loShgStTtn5F&!fFA<*np(<6D&Y&tUw;T~bG1-%^B7d3naH3%qu zSMREQ%bUdo$IzXU$1kgkf_y#(49ax8TAWf>(>2K`J~QY}?#@Fn9AWxmuAq2`3Hd_7 zQ7QUdL^gl2WwdDXiVQ42be2hUp8+ptNToCGLlSd7ww9KC9H#PnbS3^Jx=sH+y03pk zH?rdLgmwi+RL*Sf!GFq+16H65Z}}CXenvTDd$WQ9#7LX8=5I6^x%LH#cqcf;WmbI@ zr12|O{^(1F_OCr_#5$a7`O335)c3qguQKM2n}kbFlwWi?bMjiqm{X&p_J@XL>M`}f zqMWPT{l{UKsexjB%+xX8ud31EUj~hq%w(!{*6bZ&_lkC_d1YSBd@b%>O67f#9XNXV znpR3q)|D@pUSPf-GMHYqe7YGPS4Z6-Yg!(^+oF^CB%iIBf4SR3D!V*oBI)pwfw%JT z(FA8Lh2Cx+pQpyXF-ptV5n&S#rtY?uzMMcE{&*GlL4mzTWUPx865C#PUFMLu2&#lr zG6X+hF;PNz>Y~uV@Xn~tq^6BnD>^aM(!ra#%10IbmVc)hG3dVK>~SZ^{=51@>j?jp zzZ@|qa)nk$I3*`hnq_L%NPa<l%k4|iBXO<0+{McW`IPu{9$|nR-;cpjfLhlsGA9Li zZ@H1XmrnsQ%wPL^k~N8_uky1fCe%!!{{U%-0`%rDl~8~dbjGSNk!{s6`Vd!5M)*JO z=nAa=0QpjiC%HZwT&nMd0w}<YCTe#DRd|}F5j+p$!lsw6%@?})gL!2nSD?Q&TK=(7 zB<+1(<z~n)CmLmOvz@eO%6nUUQloSTjl*omD$J=ADj&7CyISZsi>$9p@t68MZ*#mU zaqsH0TX$wNu=$G?dQ2%@dU3sTwFveF#k1q@y;!t#vQ!$4`b#FuYO9}|G~1L#)mh6= z8kxFSeVNTWdZ%tJ02)#JZBNJcZ2U$_)(C9c$_{higjKQ7=bPZbuU7`l&O_IaCE|-T z+D5|W%|>Hu3~x55nz%A@!9I0i4fU*&XsDG#v}&6moK`W9DjE4ddN+vmeUy}{72}m% z%H^6h%v)I!Tep9lVxXIMtWjokxAXY?4F91!6Rer3o4OJnaotsU=jE`bE`fTFkzY)n z%e@GTYh2tl?pOQ@*ZUAYP_GCcI{WZ7%x2TU*<1hf>|ILb0|OZ#NYKA)+mf~;VFQ*& zU(}ZP?h80>dLi&?BTb-1X1Jz@lO6G&lJUQlROx8=j9vBau-f@TG`QzNrk5?aHbEx* z+;WEa!W52HStpP{4&xpOgQ?P2Q<*8cp!e64&n3jv!i2`!lucVvs?AW}fHG`5niYyY zVNIZ}FAsHk3nvAvS)^#z8;xwg-_}{(_B`@7PSs4kv(+BuGL@YCrEYV@TVD|{9yt|s zX<4OnKF`dQe}>aY^QI&C0XSm``clHd16%1(1Kj*SkeK*8iEaNz;@cG9-G7zDbCs%K z-y}@iF<d4w>q-H*ZE_!)Plsd*geI62W_RaoS9wRqby)V{=F<4r(k+dWrjA9uCSbA$ zt5(I|ml`!{8nuh!oi7+5ZX1^0%`$Sh<z5hB)%(b(BI*<CxaFH*BsQX}laB9|F|dA} z1!;)Ld~X*+j(^w$qX0c}i+%Wb7wH@AX|l-kPE&WS+*~XgXmwAe45}wfWkW~<#*3N* zSF0f5bu?y`HF;kxU02K0jl4Fwj>u^p#(Q{s2GZQ%VSbaU>3l?7OlsiBTvj}G?nLe7 zyQaZN%z|(JrPu;r3ExeuwI?LU)ncaFJ>XP=^PA1G$*1-WZY8zVRYM^#eJ*~t&n?Iv z7X}C5nG%due0%?#^|G;sE4gqS!Vi3OTSE5QINd7@Atf^r`CX6ndC!e_wth5eQjGgx zd_ZtZ4X|*RI{uRT?~k1!)ql_aZ6(yCcJF_+Zr|z1cJ<GAz85krNo&7uQx`dJD`874 z+g8<UI<_tE1Jm^xTkVH_Rl*LP8jh5>^8LacW~-(TM@l*i+`9rw+K#>5(Xb1ETyiP0 z(aldcv92%E`jqUziG46*XG|4u5y}$$y6r)+FR5CV@3^eH+ikDyqCkH`^`PKG0(M7L z!0y7Uu-oIheD#ol)wP8+pJw`p_D(kN6ED;>SjDiPl17xfKMk}z5h$$YupUo-6oQ*y z)=sK!P7v<J<l1n%KG#~W{;E^HrOa<)czG{hMM5Jfqg_{t4$YyO?<epcooGVylEqw^ zU;C>av^4t+)Vyb~Kk>wSIfC6%Wm<A+=2*Rveo&@@XqM0$R(+dZUq%mU$EuVQhp#Xs zRLOtX2@U?NKsqFFb2@VO`z48LtLM2>qC>M4wcMVo`YAI{;tSGoSLgBt!A8uJf0Sbx z<0`WXS6W=Yrkk^Mq9Pb-_)o<qkLWi4u6H7Q6SLX#*Td~+dY%9CwoDlQqb-B<<@CFG zoRYch@pwK@=(Tq4g7<Y;nKr~Al>3n{SBZg4pn0-uBF1z7wAV84>0&<Rg7a1}hF?C> z<46Hy--K+swSJL!*yHv<6zf>0ebSil<F?lkjV~vb8+4q93Ec75e-W^Z*Y`(1N<6wE zf9!LRRG_Pm?&;a=BlIvYs}Po9EB%sz**7>9ShJzpaDmMJ_Of<a<So9ql|ZSl4<c?x ztl2*}OJ!fzYwU~<;LdfaGV{`qlu9XTU{xv>BfcyszznC=GT%FC_F;fl>x3WGqJ<jM z2JCsHk9G}j_7>rnyOD^^u^TrH;E}t1D;b~ZPX-Efdo&8v44odZ*Rfm^uu+@J9+L8b z3A9{Z9u<1bK>p6wU$3oMJ?Qh*7{MVopqroUXKN{wDx`W_qMVpp=rYnszo(UOE5W(y z+!{t#=@v}@J8S`OxDv54Il5frsVd=+^X}DkSiQmk%gZXQf|(6OsDOIRD+>=1NCKH_ zHeejTmOY`*3p4vDH5ohDCKS|K1U*UZ5*a1eP1on;5b&I1UB9%jE^kRCE*ka}{tOxq zLuU&0``mROo;)7a+Fh;ac2&?3hxhu`c5lH9j!*nGD@gf`ax0pvZcNg{^zzxR@BQ^{ znM6eVx?h0od#PiOD8O`ipg5{49Mt5vrx+RRj#|$!Gr82CrT*Uim>3`1w|dwO;+5O) z{rtVY2&a(}8&J)bYcctYLj3IJ@yv!C^A~fs1qOerh$T)u#(wEwk5Fd?ih2Il=3*(p z(%6D)YvW(rC9{WCmyCWiMCw24Z0tePGf$>=jV3a7+#5&lxS<LIxNB~Z^3%shA>m$- zj<i>8cO#oqEXTCLQI^@JBn;2^sV#)L2qFAE>n&dLmyP0+8_0+p=O(s&n4hy-oVB&J ztll)S#&Y|P5C>u8d$IDM8lP_Qa#g_N;sUh`;1siIC4gx12r!1+cXAIhnbHp#YYh>> zbcyCN^4BE2R-PV^m%4x3->)6Zl^8MQyv=NJE%Ls>^}}}fkDg!rIoixR94gkHBWoyt zl^5^2TJnyIyKIZi*~-Rf$LhXJCM`>)5v0oWY&uKNLrh<PP(WRBs+i<;8koj88>Iq% zYI29=i2GDIs#H#)a4y+|WaYs(RkzL?biQUot;XT?ySz4*;RSjn)kk+8nF=xo$qveS z@~Gv#a#0vD>^^F42#Dm`i9*nI1HM)Wc4va6U$oHRx-_3K!vMUl2bHup;<|BNRU3LA zgKd^-Pc5bL-iHj7>@RIczRT_n@|I6I?L_-D{o(PrGLz!3g`R@WyiHMZ2|0@imK`kP zl7+(F^i`ZxGnmACzRr`YwCnrY$R4CAyXcqKnNNaA`7+GR%-3)3wom}WkyB^8%M`0v z-|_h#AIa9h_0OAB-;*CBV!wSloY=y>SJ(k-ScdE4v}09O?)cOqGjgrlWY?fxVdLm7 zCrE8&j9$Mg^RcC))uj)l&;Ht+sQL?yz;?^EHd50B^svhaR`ZeBjN)kJ*y|E?uNNaX z$vm|if{~e}8}ds>xz#^NjWNAN!o<^}x8Q6&H%PJRm+iR|aXVLvMul@L0PkU>dv1_; zzkIN)UP<z#;mAcRUq_!FB|@=2F5+9<s|CX)Ud{T$n#y6_>=Dgttm1;q3&J`$-^zz~ zC5@lnZ=Dffy+f8)d=R9VOEm7fd|B*a#Ef*suNkliz@ss!vL~aMgJ}9=Tu%CJu3xUL zd~+jfap3wlYi&NGy!TQzrZ{B36?m(IZf)jOv6^E%EL_BJJ|`3}tSLRnv6Y#`xE5f} zHnsi$WBYKPr}WL|C1!$$kP<u=xy2+&|FEi=0vz>dA@;hjZdRNi!lx0t{Ljfm7d%$9 zL_ioE!2{dVwp64^xIt7)>P9Y!wVMJ2$p?lwedLC;!Y2{nI1%XpUXSoTCvy_O9lwCI z-J8rGd!vhyq>lpUl0Vl-AI$f>sNR((!aMWI{<#>cDM4IrJvg^(l!3Qvhrp@+4`V~C zpR*1OpbiXF#U42H)0Sz+UaZYHMpiR)Ly&0l4eYElKBLwjWF6do9Qba2;QLA+_<I=| zMyTS**bs?wXo@%@(<Yz}w~pR+hZ|J%uS}PhN8EgHF2a<{BO0K>XFi6Brb8*8{|Cn7 B*opuE literal 0 HcmV?d00001 diff --git a/src/css/main.scss b/src/css/main.scss index 1bd82828..7419a5df 100644 --- a/src/css/main.scss +++ b/src/css/main.scss @@ -21,6 +21,7 @@ @import "adinplay"; @import "changelog_skins"; +@import "states/wegame_splash"; @import "states/preload"; @import "states/main_menu"; @import "states/ingame"; diff --git a/src/css/states/main_menu.scss b/src/css/states/main_menu.scss index 2b44b56e..9a04baf4 100644 --- a/src/css/states/main_menu.scss +++ b/src/css/states/main_menu.scss @@ -565,6 +565,40 @@ grid-template-columns: auto 1fr; } + &.wegameDisclaimer { + @include SuperSmallText; + display: grid; + justify-content: center; + grid-template-columns: 1fr auto 1fr; + + > .disclaimer { + grid-column: 2 / 3; + + @include DarkThemeOverride { + color: #fff; + } + } + + > .rating { + grid-column: 3 / 4; + justify-self: end; + align-self: end; + + @include S(width, 32px); + @include S(height, 40px); + background: green; + cursor: pointer !important; + pointer-events: all; + @include S(border-radius, 4px); + overflow: hidden; + + & { + /* @load-async */ + background: #fff uiResource("wegame_isbn_rating.jpg") center center / contain no-repeat; + } + } + } + .author { flex-grow: 1; text-align: right; diff --git a/src/css/states/wegame_splash.scss b/src/css/states/wegame_splash.scss new file mode 100644 index 00000000..961cfa67 --- /dev/null +++ b/src/css/states/wegame_splash.scss @@ -0,0 +1,38 @@ +#state_WegameSplashState { + background: #000 !important; + display: flex; + align-items: center; + justify-content: center; + + .wrapper { + opacity: 0; + @include InlineAnimation(5.9s ease-in-out) { + 0% { + opacity: 0; + } + 20% { + opacity: 1; + } + 90% { + opacity: 1; + } + 100% { + opacity: 0; + } + } + + text-align: center; + color: #fff; + @include Heading; + + strong { + display: block; + @include SuperHeading; + @include S(margin-bottom, 20px); + } + + div { + @include S(margin-bottom, 10px); + } + } +} diff --git a/src/js/application.js b/src/js/application.js index 4e74b014..c49b7027 100644 --- a/src/js/application.js +++ b/src/js/application.js @@ -34,6 +34,7 @@ import { RestrictionManager } from "./core/restriction_manager"; import { PuzzleMenuState } from "./states/puzzle_menu"; import { ClientAPI } from "./platform/api"; import { LoginState } from "./states/login"; +import { WegameSplashState } from "./states/wegame_splash"; /** * @typedef {import("./platform/achievement_provider").AchievementProviderInterface} AchievementProviderInterface @@ -155,6 +156,7 @@ export class Application { registerStates() { /** @type {Array<typeof GameState>} */ const states = [ + WegameSplashState, PreloadState, MobileWarningState, MainMenuState, @@ -330,8 +332,12 @@ export class Application { Loader.linkAppAfterBoot(this); + if (G_WEGAME_VERSION) { + this.stateMgr.moveToState("WegameSplashState"); + } + // Check for mobile - if (IS_MOBILE) { + else if (IS_MOBILE) { this.stateMgr.moveToState("MobileWarningState"); } else { this.stateMgr.moveToState("PreloadState"); diff --git a/src/js/changelog.js b/src/js/changelog.js index 9b497ff8..1ea3c2a7 100644 --- a/src/js/changelog.js +++ b/src/js/changelog.js @@ -1,4 +1,15 @@ export const CHANGELOG = [ + { + version: "1.4.3", + date: "unreleased", + entries: [ + "Edit signal dialog now has the previous signal filled (Thanks to EmeraldBlock)", + "Further performance improvements (Thanks to PFedak)", + "Improved puzzle validation (Thanks to Sense101)", + "Input fields in dialogs should now automatically focus", + "Updated translations", + ], + }, { version: "1.4.2", date: "24.06.2021", diff --git a/src/js/core/modal_dialog_forms.js b/src/js/core/modal_dialog_forms.js index 355fad09..ccf9bfb2 100644 --- a/src/js/core/modal_dialog_forms.js +++ b/src/js/core/modal_dialog_forms.js @@ -1,6 +1,7 @@ import { BaseItem } from "../game/base_item"; import { ClickDetector } from "./click_detector"; import { Signal } from "./signal"; +import { getIPCRenderer } from "./utils"; /* * *************************************************** @@ -107,6 +108,19 @@ export class FormElementInput extends FormElement { updateErrorState() { this.element.classList.toggle("errored", !this.isValid()); + + // profanity filter + if (G_WEGAME_VERSION) { + const value = String(this.element.value); + + getIPCRenderer() + .invoke("profanity-check", value) + .then(newValue => { + if (value !== newValue && this.element) { + this.element.value = newValue; + } + }); + } } isValid() { diff --git a/src/js/platform/browser/game_analytics.js b/src/js/platform/browser/game_analytics.js index 80e19c7a..9411b258 100644 --- a/src/js/platform/browser/game_analytics.js +++ b/src/js/platform/browser/game_analytics.js @@ -111,6 +111,10 @@ export class ShapezGameAnalytics extends GameAnalyticsInterface { * @returns {Promise<any>} */ sendToApi(endpoint, data) { + if (G_WEGAME_VERSION) { + return Promise.resolve(); + } + return new Promise((resolve, reject) => { const timeout = setTimeout(() => reject("Request to " + endpoint + " timed out"), 20000); diff --git a/src/js/states/main_menu.js b/src/js/states/main_menu.js index 5885b2ce..279699d2 100644 --- a/src/js/states/main_menu.js +++ b/src/js/states/main_menu.js @@ -130,7 +130,17 @@ export class MainMenuState extends GameState { ${ G_WEGAME_VERSION - ? "<div class='footer wegame'></div>" + ? `<div class='footer wegameDisclaimer'> + <div class="disclaimer"> + 健康游戏忠告 + <br> + 抵制不良游戏,拒绝盗版游戏。注意自我保护,谨防受骗上当。<br> + 适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。 + </div> + + <div class="rating"></div> + </div> + ` : ` <div class="footer ${G_CHINA_VERSION ? "china" : ""} "> @@ -341,6 +351,11 @@ export class MainMenuState extends GameState { if (puzzleWishlistButton) { this.trackClicks(puzzleWishlistButton, () => this.onPuzzleWishlistButtonClicked()); } + + const wegameRating = qs(".wegameDisclaimer > .rating"); + if (wegameRating) { + this.trackClicks(wegameRating, () => this.onWegameRatingClicked()); + } } renderMainMenu() { @@ -675,6 +690,22 @@ export class MainMenuState extends GameState { }); } + onWegameRatingClicked() { + this.dialogs.showInfo( + "", + ` + 1)本游戏是一款休闲建造类单机游戏,适用于年满8周岁及以上的用户。<br> + 2)本游戏模拟简单的生产流水线,剧情简单且积极向上,没有基于真实 + 历史和现实事件的改编内容。游戏玩法为摆放简单的部件,完成生产目标。 + 游戏为单机作品,没有基于文字和语音的陌生人社交系统。<br> + 3)游戏中有用户实名认证系统,认证为未成年人的用户将接受以下管理: + 游戏为买断制,不存在后续充值付费内容。未成年人用户每日22点到次日 + 8点不得使用,法定节假日每天不得使用超过3小时,其它时间每天使用游 + 戏不得超过1.5小时。 + ` + ); + } + onContinueButtonClicked() { let latestLastUpdate = 0; let latestInternalId; diff --git a/src/js/states/wegame_splash.js b/src/js/states/wegame_splash.js new file mode 100644 index 00000000..77657b22 --- /dev/null +++ b/src/js/states/wegame_splash.js @@ -0,0 +1,27 @@ +import { GameState } from "../core/game_state"; + +export class WegameSplashState extends GameState { + constructor() { + super("WegameSplashState"); + } + + getInnerHTML() { + return ` + <div class="wrapper"> + <strong>健康游戏忠告</strong> + <div>抵制不良游戏,拒绝盗版游戏。</div> + <div>注意自我保护,谨防受骗上当。</div> + <div>适度游戏益脑,沉迷游戏伤身。</div> + <div>适度游戏益脑,沉迷游戏伤身。</div> + </div> +`; + } + onEnter() { + setTimeout( + () => { + this.app.stateMgr.moveToState("PreloadState"); + }, + G_IS_DEV ? 1 : 6000 + ); + } +}